mirror of
https://github.com/Rudd-O/qubes-network-server.git
synced 2025-06-06 18:08:33 +02:00
171 lines
5.5 KiB
Python
171 lines
5.5 KiB
Python
#!/usr/bin/python2
|
|
# -*- encoding: utf8 -*-
|
|
#
|
|
# The Qubes OS Project, http://www.qubes-os.org
|
|
#
|
|
# Copyright (C) 2010 Joanna Rutkowska <joanna@invisiblethingslab.com>
|
|
#
|
|
# 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] <vm-name>\n"\
|
|
"usage: %prog -g [options] <vm-name> <property>\n"\
|
|
"usage: %prog -s [options] <vm-name> <property> [...]\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()
|