1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 from gettext import gettext
21 import logging
22 import optparse
23 import sys
24 import textwrap
25 import VMBuilder
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('--rootsize', metavar='SIZE', type='int', default=4096, help='Size (in MB) of the root filesystem [default: %default]')
46 vm.register_setting('--optsize', metavar='SIZE', type='int', default=0, help='Size (in MB) of the /opt filesystem. If not set, no /opt filesystem will be added.')
47 vm.register_setting('--swapsize', metavar='SIZE', type='int', default=1024, help='Size (in MB) of the swap partition [default: %default]')
48 vm.register_setting('--raw', metavar='PATH', type='string', help="Specify a file (or block device) to as first disk image.")
49 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")
50 self.set_usage(vm)
51
52 vm.optparser.disable_interspersed_args()
53 (foo, args) = vm.optparser.parse_args()
54 self.handle_args(vm, args)
55 vm.optparser.enable_interspersed_args()
56
57 for opt in vm.optparser.option_list + sum([grp.option_list for grp in vm.optparser.option_groups], []):
58 if len(opt._long_opts) > 1 or (opt.action == 'store' and opt._long_opts[0][2:] != opt.dest):
59 opt.help += " Config option: %s" % opt.dest
60
61 (settings, args) = vm.optparser.parse_args(values=optparse.Values())
62 for (k,v) in settings.__dict__.iteritems():
63 setattr(vm, k, v)
64
65 self.set_disk_layout(vm)
66
67 vm.create()
68 except VMBuilder.VMBuilderUserError, e:
69 print >> sys.stderr, e
70
74
76 if len(args) < 2:
77 vm.optparser.error("You need to specify at least the hypervisor type and the distro")
78 vm.set_hypervisor(args[0])
79 vm.set_distro(args[1])
80
82 if not vm.part:
83 if vm.hypervisor.preferred_storage == VMBuilder.hypervisor.STORAGE_FS_IMAGE:
84 vm.add_filesystem(size='%dM' % vm.rootsize, type='ext3', mntpnt='/')
85 vm.add_filesystem(size='%dM' % vm.swapsize, type='swap', mntpnt=None)
86 if vm.optsize > 0:
87 vm.add_filesystem(size='%dM' % optsize, type='ext3', mntpnt='/opt')
88 else:
89 if vm.raw:
90 disk = vm.add_disk(filename=vm.raw, preallocated=True)
91 else:
92 size = vm.rootsize + vm.swapsize + vm.optsize
93 disk = vm.add_disk(size='%dM' % size)
94 offset = 0
95 disk.add_part(offset, vm.rootsize, 'ext3', '/')
96 offset += vm.rootsize
97 disk.add_part(offset, vm.swapsize, 'swap', 'swap')
98 offset += vm.swapsize
99 if vm.optsize > 0:
100 disk.add_part(offset, vm.optsize, 'ext3', '/opt')
101 else:
102
103 if vm.hypervisor.preferred_storage == VMBuilder.hypervisor.STORAGE_FS_IMAGE:
104 try:
105 for line in file(vm.part):
106 pair = line.strip().split(' ',1)
107 if pair[0] == 'root':
108 vm.add_filesystem(pair[1], type='ext3', mntpnt='/')
109 elif pair[0] == 'swap':
110 vm.add_filesystem(pair[1], type='swap', mntpnt=None)
111 elif pair[0] == '---':
112
113 pass
114 else:
115 vm.add_filesystem(pair[1], type='ext3', mntpnt=pair[0])
116
117 except IOError, (errno, strerror):
118 vm.optparser.error("%s parsing --part option: %s" % (errno, strerror))
119 else:
120 try:
121 curdisk = list()
122 size = 0
123 for line in file(vm.part):
124 pair = line.strip().split(' ',1)
125 if pair[0] == '---':
126 self.do_disk(vm, curdisk, size)
127 curdisk = list()
128 size = 0
129 elif pair[0] != '':
130 logging.debug("part: %s, size: %d" % (pair[0], int(pair[1])))
131 curdisk.append((pair[0], pair[1]))
132 size += int(pair[1])
133
134 self.do_disk(vm, curdisk, size)
135
136 except IOError, (errno, strerror):
137 vm.optparser.error("%s parsing --part option: %s" % (errno, strerror))
138
139 - def do_disk(self, vm, curdisk, size):
140 disk = vm.add_disk(size+1)
141 logging.debug("do_disk - size: %d" % size)
142 offset = 0
143 for pair in curdisk:
144 logging.debug("do_disk - part: %s, size: %s, offset: %d" % (pair[0], pair[1], offset))
145 if pair[0] == 'root':
146 disk.add_part(offset, int(pair[1]), 'ext3', '/')
147 elif pair[0] == 'swap':
148 disk.add_part(offset, int(pair[1]), pair[0], pair[0])
149 else:
150 disk.add_part(offset, int(pair[1]), 'ext3', pair[0])
151 offset += int(pair[1])
152
154 arg = 'ubuntu-vm-builder'
155
159
162
164 if len(args) < 2:
165 vm.optparser.error("You need to specify at least the hypervisor type and the suite")
166 vm.set_hypervisor(args[0])
167 vm.set_distro('ubuntu')
168 vm.suite = args[1]
169
170 VMBuilder.register_frontend(CLI)
171 VMBuilder.register_frontend(UVB)
172