1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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:
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