1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 from gettext import gettext
20 import logging
21 import optparse
22 import sys
23 import textwrap
24 import VMBuilder
25 from VMBuilder.disk import parse_size
26 import VMBuilder.hypervisor
27 _ = gettext
28
29
30 -class CLI(VMBuilder.Frontend):
31 arg = 'cli'
32
34 try:
35 next = False
36 conf = None
37 for val in sys.argv:
38 if (val == '-c') | (val == '--config'):
39 next = True
40 elif next:
41 conf = val
42 break
43
44 vm = VMBuilder.VM(conf)
45 vm.register_setting('--version', action='callback', callback=self.versioninfo, callback_kwargs={ 'vm' : vm }, help='Show version information')
46 vm.register_setting('--rootsize', metavar='SIZE', default=4096, help='Size (in MB) of the root filesystem [default: %default]')
47 vm.register_setting('--optsize', metavar='SIZE', default=0, help='Size (in MB) of the /opt filesystem. If not set, no /opt filesystem will be added.')
48 vm.register_setting('--swapsize', metavar='SIZE', default=1024, help='Size (in MB) of the swap partition [default: %default]')
49 vm.register_setting('--raw', metavar='PATH', type='string', help="Specify a file (or block device) to as first disk image.")
50 vm.register_setting('--part', metavar='PATH', type='string', help="Allows to specify a partition table in PATH each line of partfile should specify (root first): \n mountpoint size \none per line, separated by space, where size is in megabytes. You can have up to 4 virtual disks, a new disk starts on a line containing only '---'. ie: \n root 2000 \n /boot 512 \n swap 1000 \n --- \n /var 8000 \n /var/log 2000")
51 self.set_usage(vm)
52
53 vm.optparser.disable_interspersed_args()
54 (foo, args) = vm.optparser.parse_args()
55 self.handle_args(vm, args)
56 vm.optparser.enable_interspersed_args()
57
58 for opt in vm.optparser.option_list + sum([grp.option_list for grp in vm.optparser.option_groups], []):
59 if len(opt._long_opts) > 1 or (opt.action == 'store' and opt._long_opts[0][2:] != opt.dest):
60 opt.help += " Config option: %s" % opt.dest
61
62 (settings, args) = vm.optparser.parse_args(values=optparse.Values())
63 for (k,v) in settings.__dict__.iteritems():
64 setattr(vm, k, v)
65
66 self.set_disk_layout(vm)
67
68 vm.create()
69 except VMBuilder.VMBuilderUserError, e:
70 print >> sys.stderr, e
71
72 - def versioninfo(self, option, opt, value, parser, vm=None):
75
79
81 if len(args) < 2:
82 vm.optparser.error("You need to specify at least the hypervisor type and the distro")
83 vm.set_hypervisor(args[0])
84 vm.set_distro(args[1])
85
87 if not vm.part:
88 vm.rootsize = parse_size(vm.rootsize)
89 vm.swapsize = parse_size(vm.swapsize)
90 vm.optsize = parse_size(vm.optsize)
91 if vm.hypervisor.preferred_storage == VMBuilder.hypervisor.STORAGE_FS_IMAGE:
92 vm.add_filesystem(size='%dM' % vm.rootsize, type='ext3', mntpnt='/')
93 vm.add_filesystem(size='%dM' % vm.swapsize, type='swap', mntpnt=None)
94 if vm.optsize > 0:
95 vm.add_filesystem(size='%dM' % optsize, type='ext3', mntpnt='/opt')
96 else:
97 if vm.raw:
98 disk = vm.add_disk(filename=vm.raw, preallocated=True)
99 else:
100 size = vm.rootsize + vm.swapsize + vm.optsize
101 disk = vm.add_disk(size='%dM' % size)
102 offset = 0
103 disk.add_part(offset, vm.rootsize, 'ext3', '/')
104 offset += vm.rootsize
105 disk.add_part(offset, vm.swapsize, 'swap', 'swap')
106 offset += vm.swapsize
107 if vm.optsize > 0:
108 disk.add_part(offset, vm.optsize, 'ext3', '/opt')
109 else:
110
111 if vm.hypervisor.preferred_storage == VMBuilder.hypervisor.STORAGE_FS_IMAGE:
112 try:
113 for line in file(vm.part):
114 elements = line.strip().split(' ')
115 if elements[0] == 'root':
116 vm.add_filesystem(elements[1], type='ext3', mntpnt='/')
117 elif elements[0] == 'swap':
118 vm.add_filesystem(elements[1], type='swap', mntpnt=None)
119 elif elements[0] == '---':
120
121 pass
122 elif len(elements) == 3:
123 vm.add_filesystem(elements[1], type='ext3', mntpnt=elements[0], devletter='', device=elements[2], dummy=(int(elements[1]) == 0))
124 else:
125 vm.add_filesystem(elements[1], type='ext3', mntpnt=elements[0])
126
127 except IOError, (errno, strerror):
128 vm.optparser.error("%s parsing --part option: %s" % (errno, strerror))
129 else:
130 try:
131 curdisk = list()
132 size = 0
133 for line in file(vm.part):
134 pair = line.strip().split(' ',1)
135 if pair[0] == '---':
136 self.do_disk(vm, curdisk, size)
137 curdisk = list()
138 size = 0
139 elif pair[0] != '':
140 logging.debug("part: %s, size: %d" % (pair[0], int(pair[1])))
141 curdisk.append((pair[0], pair[1]))
142 size += int(pair[1])
143
144 self.do_disk(vm, curdisk, size)
145
146 except IOError, (errno, strerror):
147 vm.optparser.error("%s parsing --part option: %s" % (errno, strerror))
148
149 - def do_disk(self, vm, curdisk, size):
150 disk = vm.add_disk(size+1)
151 logging.debug("do_disk - size: %d" % size)
152 offset = 0
153 for pair in curdisk:
154 logging.debug("do_disk - part: %s, size: %s, offset: %d" % (pair[0], pair[1], offset))
155 if pair[0] == 'root':
156 disk.add_part(offset, int(pair[1]), 'ext3', '/')
157 elif pair[0] == 'swap':
158 disk.add_part(offset, int(pair[1]), pair[0], pair[0])
159 else:
160 disk.add_part(offset, int(pair[1]), 'ext3', pair[0])
161 offset += int(pair[1])
162
164 arg = 'ubuntu-vm-builder'
165
169
172
174 if len(args) < 2:
175 vm.optparser.error("You need to specify at least the hypervisor type and the suite")
176 vm.set_hypervisor(args[0])
177 vm.set_distro('ubuntu')
178 vm.suite = args[1]
179
180 VMBuilder.register_frontend(CLI)
181 VMBuilder.register_frontend(UVB)
182