From 35ecfc82efafe759b93add923dc800fb9289f800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Tue, 30 Jul 2013 12:03:50 +0200 Subject: [PATCH] wni: QubesWniVmStorage and update settings file --- core/settings-wni-Windows_NT.py | 8 +++- core/storage/wni.py | 84 +++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 core/storage/wni.py diff --git a/core/settings-wni-Windows_NT.py b/core/settings-wni-Windows_NT.py index a2739b98..8bd1559e 100644 --- a/core/settings-wni-Windows_NT.py +++ b/core/settings-wni-Windows_NT.py @@ -1,4 +1,10 @@ #!/usr/bin/python2 +from __future__ import absolute_import + +from qubes.storage.wni import QubesWniVmStorage + def apply(system_path, vm_files, defaults): - system_path['qubes_base_dir'] = 'c:/qubes' + system_path['qubes_base_dir'] = 'c:\\qubes' + defaults['libvirt_uri'] = 'test:///default' + defaults['storage_class'] = QubesWniVmStorage diff --git a/core/storage/wni.py b/core/storage/wni.py new file mode 100644 index 00000000..6331b146 --- /dev/null +++ b/core/storage/wni.py @@ -0,0 +1,84 @@ +#!/usr/bin/python2 +# +# The Qubes OS Project, http://www.qubes-os.org +# +# Copyright (C) 2013 Marek Marczykowski +# +# 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 __future__ import absolute_import + +import sys +import os +import os.path +import win32api +import win32net +import pywintypes + +from qubes.storage import QubesVmStorage +from qubes.qubes import QubesException + +class QubesWniVmStorage(QubesVmStorage): + """ + Class for VM storage of WNI VMs. + """ + + def __init__(self, vm, **kwargs): + super(QubesWniVmStorage, self).__init__(vm, **kwargs) + # Use the user profile as "private.img" + self.private_img = os.path.join("c:\\Users", self.vm.name) + + def get_config_params(self): + return {} + + def create_on_disk_private_img(self, verbose, source_template = None): + win32api.ShellExecute(None, "runas", + "net", "user %s %s /ADD" % (self.vm.name, "testpass"), + None, 0) + + def create_on_disk_root_img(self, verbose, source_template = None): + pass + + def remove_from_disk(self): + win32api.ShellExecute(None, "runas", + "net", "user %s /DELETE" % (self.vm.name), + None, 0) + super(QubesWniVmStorage, self).remove_from_disk() + + def verify_files(self): + if not os.path.exists (self.vmdir): + raise QubesException ( + "VM directory doesn't exist: {0}".\ + format(self.vmdir)) + + try: + # TemplateVm in WNI is quite virtual, so do not require the user + if not self.vm.is_template(): + win32net.NetUserGetInfo(None, self.vm.name, 0) + except pywintypes.error, details: + if details[0] == 2221: + # "The user name cannot be found." + raise QubesException("User %s doesn't exist" % self.vm.name) + else: + raise + + def reset_volatile_storage(self, verbose = False, source_template = None): + pass + + def prepare_for_vm_startup(self): + if self.vm.is_template(): + raise QubesException("Starting TemplateVM is not supported")