Overview
Comment: | make some commands work. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
fa99d9b0d061c513480a915bc0d337c6 |
User & Date: | vitus on 2015-11-09 15:34:38 |
Other Links: | manifest | tags |
Context
2015-11-09
| ||
18:29 | Fixed running without config file check-in: d4f4a7b3f1 user: vitus tags: trunk | |
15:34 | make some commands work. check-in: fa99d9b0d0 user: vitus tags: trunk | |
2015-07-20
| ||
18:33 | Added example of usb-redirection (1 port) to VM template) check-in: 9cb375894f user: vitus tags: trunk | |
Changes
Added mkvm version [71a7632144].
> > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/usr/bin/python import os options={'qemubinary':'qemu-system-x86_64', "accel":"-enable-kvm", "memory":"1024M", "drive":"-drive media=disk,index=0,if=virtio,file=drive0.qcow2", "cdrom":"-drive media=cdrom,index=2,if=ide", "sound":"-sound hda", "net":"-net nic,macaddr=%s -net bridge,br=lxc0", "usb":"-usb"} with open("start.template","r") as f: template=f.read() vmdir = "~/VWs/%s" % name os.mkdir(vmdir) with open(vmdir +"/start",w) as f: f.write(template.format(options) os.chmod(0755,vmdir + "/start") os.system("qemu-img create -f qcow2 "+vmdir+"/drive0.qcow2") |
Modified start.template from [c7b07ec5e9] to [8a854bae9d].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/bin/sh # Get machine name from current directory name NAME=$(basename $(pwd)) # if remote access is enabled, then there should be # SPICE_PASSWORD=password QEMU_AUDIO_DRV=spice export QEMU_AUDIO_DRV if [ -n "$SPICE_PASSWORD" ]; then SPICE_AUTH="password=$SPICE_PASSWORD" else SPICE_AUTH="disable-ticketing,addr=127.0.0.1" fi SPICE_PORT=$(find_free_port 5900) {qemubinary} -name $NAME {accel} \ {drive} \ | > > > > > > | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #!/bin/sh # Get machine name from current directory name NAME=$(basename $(pwd)) # if remote access is enabled, then there should be # SPICE_PASSWORD=password QEMU_AUDIO_DRV=spice export QEMU_AUDIO_DRV if [ -n "$SPICE_PASSWORD" ]; then SPICE_AUTH="password=$SPICE_PASSWORD" else SPICE_AUTH="disable-ticketing,addr=127.0.0.1" fi SPICE_PORT=$(find_free_port 5900) if [ "$1" = '-cdrom' ]; then shift CDROM="file=$1" shift fi {qemubinary} -name $NAME {accel} \ -m {memory} {drive} \ {cdrom}$CDROM \ {net} \ {usb} \ {sound} \ -chardev socket,server,nowait,path=/home/vitus/asta.monitor,id=monitor \ -mon chardev=monitor,mode=readline \ -vga qxl \ -spice port=$SPICE_PORT,$SPICE_AUTH \ |
︙ | ︙ |
Modified vws from [0fd7f10ab5] to [90a91c6680].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/usr/bin/python from ConfigParser import ConfigParser from argparse import ArgumentParser import socket import errno import os,sys config=ConfigParser({"SharedVMs":"/var/cache/vws/shared","AutostartVMs":"/var/cache/vws/auto"}) def find_vm(name): search_path=[os.environ['HOME']+"/VWs", config.get("directories","SharedVMs"), config.get("directories","AutostartVMs")] for dirname in search_path: if name in os.listdir(dirname): return dirname+"/"+name raise ValueError("Machine "+name+" not found.") def connect_vm(vm_dir): sock=socket.socket(socket.AF_UNIX) sock.connect(vm_dir+"/monitor") | > > > | | | | | | > > > > > > > > > > > > > > > > | | | > > > > > > > > > > > > > < > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #!/usr/bin/python from ConfigParser import ConfigParser from argparse import ArgumentParser import fcntl import socket import errno import re import os,sys config=ConfigParser({"SharedVMs":"/var/cache/vws/shared","AutostartVMs":"/var/cache/vws/auto"}) def find_vm(name): search_path=[os.environ['HOME']+"/VWs", config.get("directories","SharedVMs"), config.get("directories","AutostartVMs")] for dirname in search_path: if name in os.listdir(dirname): return dirname+"/"+name raise ValueError("Machine "+name+" not found.") def connect_vm(vm_dir): sock=socket.socket(socket.AF_UNIX) sock.connect(vm_dir+"/monitor") greeting=sock.recv(1024) return sock def send_command(sock,command): fcntl.flock(sock,fcntl.LOCK_EX) try: sock.send(command+"\n") answer="" while not answer.endswith("(qemu) "): chunk=sock.recv(1024) #print "Got chunk = ",repr(chunk) if chunk == '': raise IOError("Unexpected EOF From monitor") answer+=chunk finally: fcntl.flock(sock,fcntl.LOCK_UN) return answer def spiceurl(options): output=send_command(options.sock,"info spice") url=None for line in output.split("\n"): if url is not None: continue n=line.find("address:") if n != -1: url=line[n+9:] if url.startswith('*:'): url="localhost"+url[1:] return "spice://"+url # # command implementation # def cmd_spiceuri(options): print spiceurl(options) def cmd_start(options): if options.stopped: arg="" if options.cdrom: arg=" -cdrom "+options.cdrom cmd=options.dir+"/start"+arg os.system(cmd) if options.gui: uri = spiceurl(options) os.system("remore-viewer $uri &") elif not options.stopped: print >>sys.stderr,"VM already running" def cmd_stop(options): print send_command(options.sock,'system_powerdown') def cmd_reset(options): print send_command(options.sock,'system_reset') def cmd_cdrom(options): if options.id is None: # Search for devices which could be interpreted as CDROM devlist=send_command(options.sock,"info block") for dev in re.findall("([-\\w]+): [^\n]+\n Removable device:",devlist): if re.search("cd",dev): options.id=dev break if options.id is None: print >>sys.stderr, "No CDROM device found among:\n"+devlist; sys.exit(1) if options.file == "": print >>sys.stderr, "Please specify either --eject or iso image" sys.exit(1) if options.file is None: answer=send_command(options.sock,"eject "+options.id) else: answer=send_command(options.sock, "change %s %s" % (options.id, options.file)) print answer def cmd_usb_insert(options): raise NotImplementedError def cmd_usb_list(options): os.system(lspci) def cmd_usb_remove(options): raise NotImplementedError def cmd_usb_attached(options): answer=send_command(options.sock,"info usb") print answer def cmd_list(options): search_path=[os.environ['HOME']+"/VWs", config.get("directories","SharedVMs"), config.get("directories","AutostartVMs")] for dirname in search_path: if not os.access(dirname+"/.",os.X_OK): continue for vmname in os.listdir(dirname): if os.access(dirname+"/"+vmname+"/start",os.X_OK): print vmname # # Utility functions for arg parsing # def new_command(cmds,name,**kwargs): """ Adds a subparser and adds a machine name argument to it """ |
︙ | ︙ | |||
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | config=ConfigParser({'SharedVMs':'/var/cache/vws/shared', 'AuthoStartVMs':'/var/cache/vws/autostart'}) config.read(['/etc/vws.conf',os.environ['HOME']+'/.vwsrc']) args=ArgumentParser() cmds=args.add_subparsers(dest='command',help="sub-command help") # Power management p=new_command(cmds,'start',help='Start VM and connect to console') p.add_argument('--no-gui',dest='gui',action='store_const',const=False, default=True,help='do not open console window') p.add_argument('--cdrom',dest='cdrom',nargs=1, help='connect specified iso image to VMs cdrom on start') # Following commands don't need extra args new_command(cmds,'stop',help='Shut down virtual machine') new_command(cmds,'save',help='Save VM state and stop emulation') new_command(cmds,'reset',help='Reboot a guest OS') # Removable devices management p=new_command(cmds,'cdrom',help='manage CDROM Drive') | > > > > > > | | | 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | config=ConfigParser({'SharedVMs':'/var/cache/vws/shared', 'AuthoStartVMs':'/var/cache/vws/autostart'}) config.read(['/etc/vws.conf',os.environ['HOME']+'/.vwsrc']) args=ArgumentParser() cmds=args.add_subparsers(dest='command',help="sub-command help") p=cmds.add_parser("list",help="List existing VWs") p.add_argument("--state",action='store_const',const=True,default=False, dest='state',help='Show state of the machine') p.add_argument("--addr",action='store_const',const=True,default=False, dest='addr',help='Show mac address and spice port') # Power management p=new_command(cmds,'start',help='Start VM and connect to console') p.add_argument('--no-gui',dest='gui',action='store_const',const=False, default=True,help='do not open console window') p.add_argument('--cdrom',dest='cdrom',nargs=1, help='connect specified iso image to VMs cdrom on start') # Following commands don't need extra args new_command(cmds,'stop',help='Shut down virtual machine') new_command(cmds,'save',help='Save VM state and stop emulation') new_command(cmds,'reset',help='Reboot a guest OS') # Removable devices management p=new_command(cmds,'cdrom',help='manage CDROM Drive') p.add_argument('--id',type=str,default=None, help='Identifier of CDROM drive if VM has more than one') p.add_argument('file',nargs="?",default='',help='ISO image or special file to connect to drive') p.add_argument('--eject',dest='file',action='store_const',const=None) usb=cmds.add_parser('usb').add_subparsers(dest='subcommand',help='manage USB devices') p=new_command(usb,'insert',help='attach device to the virtual machine') p.add_argument('pattern',help='Pattern of device name to look up in lsusb') p.add_argument('--address',nargs=1,help='exact address bus:device') p=new_command(usb,'remove',help='detach connected usb device') p.add_argument('pattern',help='Pattern of device name to look up in lsusb') |
︙ | ︙ | |||
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | p.add_argument('filename',help='wav file to record autdio to') new_command(cmds,'stoprecord',help='stop recording audio') # Miscellenia p=new_command(cmds,'monitor',help='connect stdin/stdout to monitor of VM') p=new_command(cmds,'spiceuri',help='Output spice URI of machine') parsed_args=args.parse_args(sys.argv[1:]) stopped_vm_commands = ['start','snapshot','revert','commit','snapshots'] if hasattr(parsed_args,'machine'): parsed_args.dir=find_vm(parsed_args.machine) try: parsed_args.sock=connect_vm(parsed_args.dir) except IOError as e: if e.errno == errno.ECONNREFUSED: # virtal machine is not running if not parsed_args.command in stopped_vm_commands: print >>sys.stderr, "Virtual machine %s is not running."%parsed_args.machine sys.exit(1) | > | > > < > | | 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 | p.add_argument('filename',help='wav file to record autdio to') new_command(cmds,'stoprecord',help='stop recording audio') # Miscellenia p=new_command(cmds,'monitor',help='connect stdin/stdout to monitor of VM') p=new_command(cmds,'spiceuri',help='Output spice URI of machine') parsed_args=args.parse_args(sys.argv[1:]) parsed_args.stopped = False stopped_vm_commands = ['start','snapshot','revert','commit','snapshots'] if hasattr(parsed_args,'machine'): parsed_args.dir=find_vm(parsed_args.machine) try: parsed_args.sock=connect_vm(parsed_args.dir) except IOError as e: if e.errno == errno.ECONNREFUSED: # virtal machine is not running if not parsed_args.command in stopped_vm_commands: print >>sys.stderr, "Virtual machine %s is not running."%parsed_args.machine sys.exit(1) else: parsed_args.stopped = True else: raise e funcname="cmd_"+parsed_args.command if hasattr(parsed_args,"subcommand"): funcname+="_"+parsed_args.subcommand try: func=globals()[funcname] except KeyError: print >>sys.stderr,"Operation %s is not implemented"%funcname sys.exit(3) func(parsed_args) |