Package VMBuilder :: Package plugins :: Package postinst
[frames] | no frames]

Source Code for Package VMBuilder.plugins.postinst

 1  # 
 2  #    Uncomplicated VM Builder 
 3  #    Copyright (C) 2007-2009 Canonical Ltd. 
 4  #     
 5  #    See AUTHORS for list of contributors 
 6  # 
 7  #    This program is free software: you can redistribute it and/or modify 
 8  #    it under the terms of the GNU General Public License version 3, as 
 9  #    published by the Free Software Foundation. 
10  # 
11  #    This program is distributed in the hope that it will be useful, 
12  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
13  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
14  #    GNU General Public License for more details. 
15  # 
16  #    You should have received a copy of the GNU General Public License 
17  #    along with this program.  If not, see <http://www.gnu.org/licenses/>. 
18  # 
19  from VMBuilder import register_plugin, Plugin, VMBuilderUserError 
20  from VMBuilder.util import run_cmd 
21   
22  import logging 
23  import os 
24  import shutil 
25  import VMBuilder 
26  import VMBuilder.util as util 
27   
28 -class postinst(Plugin):
29 """ 30 Plugin to provide --exec and --copy post install capabilities 31 """ 32 name ='Post install plugin' 33
34 - def register_options(self):
35 group = self.vm.setting_group('Post install actions') 36 group.add_option('--copy', metavar='FILE', help="Read 'source dest' lines from FILE, copying source files from host to dest in the guest's file system.") 37 group.add_option('--execscript', '--exec', metavar='SCRIPT', help="Run SCRIPT after distro installation finishes. Script will be called with the guest's chroot as first argument, so you can use 'chroot $1 <cmd>' to run code in the virtual machine.") 38 self.vm.register_setting_group(group)
39
40 - def preflight_check(self):
41 if self.vm.copy: 42 logging.debug("Checking if --copy PATH exists: %s" % self.vm.copy) 43 if not(os.path.isfile(self.vm.copy)): 44 raise VMBuilderUserError('The path to the --copy directives is invalid: %s. Make sure you are providing a full path.' % self.vm.copy) 45 46 if self.vm.execscript: 47 logging.debug("Checking if --exec PATH exists: %s" % self.vm.execscript) 48 if not(os.path.isfile(self.vm.execscript)): 49 raise VMBuilderUserError('The path to the --execscript file is invalid: %s. Make sure you are providing a full path.' % self.vm.execscript) 50 51 logging.debug("Checking permissions of --exec PATH: %s" % self.vm.execscript) 52 if not os.access(self.vm.execscript, os.X_OK|os.R_OK): 53 raise VMBuilderUserError('The path to the --execscript file has invalid permissions: %s. Make sure the path is readable and executable.' % self.vm.execscript)
54
55 - def post_install(self):
56 if self.vm.copy: 57 logging.info("Copying files specified by --copy in: %s" % self.vm.copy) 58 try: 59 for line in file(self.vm.copy): 60 pair = line.strip().split(' ') 61 if len(pair) < 2: # skip blank and incomplete lines 62 continue 63 util.run_cmd('cp', '-LpR', pair[0], '%s%s' % (self.vm.installdir, pair[1])) 64 65 except IOError, (errno, strerror): 66 raise VMBuilderUserError("%s executing --copy directives: %s" % (errno, strerror)) 67 68 if self.vm.execscript: 69 logging.info("Executing script: %s" % self.vm.execscript) 70 util.run_cmd(self.vm.execscript, self.vm.installdir) 71 72 return True
73 74 register_plugin(postinst) 75