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

Source Code for Package VMBuilder.plugins.cli

  1  #    Uncomplicated VM Builder 
  2  #    Copyright (C) 2007-2009 Canonical Ltd. 
  3  #     
  4  #    See AUTHORS for list of contributors 
  5  # 
  6  #    This program is free software: you can redistribute it and/or modify 
  7  #    it under the terms of the GNU General Public License version 3, as 
  8  #    published by the Free Software Foundation. 
  9  # 
 10  #    This program is distributed in the hope that it will be useful, 
 11  #    but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 13  #    GNU General Public License for more details. 
 14  # 
 15  #    You should have received a copy of the GNU General Public License 
 16  #    along with this program.  If not, see <http://www.gnu.org/licenses/>. 
 17  # 
 18  #    CLI plugin 
 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
33 - def run(self):
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):
73 print '%(major)d.%(minor)d.%(micro).r%(revno)d' % vm.get_version_info() 74 sys.exit(0)
75
76 - def set_usage(self, vm):
77 vm.optparser.set_usage('%prog hypervisor distro [options]') 78 vm.optparser.arg_help = (('hypervisor', vm.hypervisor_help), ('distro', vm.distro_help))
79
80 - def handle_args(self, vm, args):
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
86 - def set_disk_layout(self, vm):
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 # We need to parse the file specified 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 # We just ignore the user's attempt to specify multiple disks 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
163 -class UVB(CLI):
164 arg = 'ubuntu-vm-builder' 165
166 - def set_usage(self, vm):
167 vm.optparser.set_usage('%prog hypervisor suite [options]') 168 vm.optparser.arg_help = (('hypervisor', vm.hypervisor_help), ('suite', self.suite_help))
169
170 - def suite_help(self):
171 return 'Suite. Valid options: %s' % " ".join(VMBuilder.plugins.ubuntu.distro.Ubuntu.suites)
172
173 - def handle_args(self, vm, args):
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