#!/usr/bin/python2 # -*- encoding: utf8 -*- # # The Qubes OS Project, http://www.qubes-os.org # # Copyright (C) 2010 Joanna Rutkowska # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # from qubes.qubes import QubesVmCollection from qubes.qubes import QubesVmLabels from qubes.qubes import QubesHost from qubes.qubes import system_path from optparse import OptionParser import subprocess import os import sys import re from qubes.qubes import vmm def do_list(vm): label_width = 19 fmt="{{0:<{0}}}: {{1}}".format(label_width) print fmt.format ("name", vm.name) if hasattr(vm, 'static_ip'): print fmt.format("static_ip", str(vm.static_ip) if vm.static_ip else "unset") def do_get(vms, vm, prop): if not hasattr(vm, prop): print >>sys.stderr, "VM '{}' has no attribute '{}'".format(vm.name, prop) return if getattr(vm, prop, None) is None: # not set or set to None return else: print str(getattr(vm, prop)) def set_static_ip(vms, vm, args): if len (args) != 1: print >> sys.stderr, "Missing value ('static_ip')!" return False arg = args[0] if not arg or arg == "none" or arg == "None" or arg == "unset": arg = None # TODO(ruddo): validate the argument! setattr(vm, "static_ip", arg) return True properties = { "static_ip": set_static_ip, } def do_set(vms, vm, property, args): if property not in properties.keys(): print >> sys.stderr, "ERROR: Wrong property name: '{0}'".format(property) return False if not hasattr(vm, property): print >> sys.stderr, "ERROR: Property '{0}' not available for this VM".format(property) return False try: return properties[property](vms, vm, args) except Exception as err: print >> sys.stderr, "ERROR: %s" % str(err) return False def main(): usage = "usage: %prog -l [options] \n"\ "usage: %prog -g [options] \n"\ "usage: %prog -s [options] [...]\n"\ "List/set networking-related per-VM properties." parser = OptionParser (usage) parser.add_option("-l", "--list", action="store_true", dest="do_list", default=False) parser.add_option("-s", "--set", action="store_true", dest="do_set", default=False) parser.add_option ("-g", "--get", action="store_true", dest="do_get", default=False) parser.add_option("--force-root", action="store_true", dest="force_root", default=False, help="Force to run, even with root privileges") parser.add_option ("--offline-mode", dest="offline_mode", action="store_true", default=False, help="Offline mode") (options, args) = parser.parse_args () if (len (args) < 1): parser.error ("You must provide at least the vmname!") vmname = args[0] if hasattr(os, "geteuid") and os.geteuid() == 0: if not options.force_root: print >> sys.stderr, "*** Running this tool as root is strongly discouraged, this will lead you in permissions problems." print >> sys.stderr, "Retry as unprivileged user." print >> sys.stderr, "... or use --force-root to continue anyway." exit(1) if options.do_list + options.do_set + options.do_get > 1: print >> sys.stderr, "You can provide at most one of -l, -g and -s at " \ "the same time!" exit(1) if options.offline_mode: vmm.offline_mode = True if options.do_set: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_writing() qvm_collection.load() else: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_reading() qvm_collection.load() qvm_collection.unlock_db() vm = qvm_collection.get_vm_by_name(vmname) if vm is None or vm.qid not in qvm_collection: print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname) exit(1) if options.do_set: if len (args) < 2: print >> sys.stderr, "You must specify the property you wish to set..." print >> sys.stderr, "Available properties:" for p in properties.keys(): if hasattr(vm, p): print >> sys.stderr, "--> '{0}'".format(p) exit (1) property = args[1] if do_set(qvm_collection, vm, property, args[2:]): qvm_collection.save() qvm_collection.unlock_db() else: qvm_collection.unlock_db() exit(1) elif options.do_get or len(args) == 2: do_get(qvm_collection, vm, args[1]) else: # do_list do_list(vm) main()