From 15713cbf46b065b5cfead79af3382ae9a3f2ee6a Mon Sep 17 00:00:00 2001 From: Wojtek Porczyk Date: Mon, 5 Oct 2015 18:06:02 +0200 Subject: [PATCH] qubes/tools: rewrite qvm-kill Also new function, `error_runtime` for common parser. fixes QubesOS/qubes-issues#1222 --- doc/manpages/qvm-kill.rst | 28 ++++++++++++++------ qubes/tools/__init__.py | 11 +++++++- qubes/tools/qvm_kill.py | 53 ++++++++++++++++++++++++++++++++++++ qubes/tools/qvm_start.py | 5 ++-- qvm-tools/qvm-kill | 56 --------------------------------------- rpm_spec/core-dom0.spec | 1 + 6 files changed, 87 insertions(+), 67 deletions(-) create mode 100644 qubes/tools/qvm_kill.py delete mode 100755 qvm-tools/qvm-kill diff --git a/doc/manpages/qvm-kill.rst b/doc/manpages/qvm-kill.rst index 6462c208..a3c4792f 100644 --- a/doc/manpages/qvm-kill.rst +++ b/doc/manpages/qvm-kill.rst @@ -1,23 +1,35 @@ .. program:: qvm-kill -============================================ -:program:`qvm-kill` -- Kill the specified VM -============================================ +:program:`qvm-kill` -- forceful shutdown of a domain +==================================================== Synopsis -======== -:command:`qvm-kill` [*options*] <*vm-name*> +-------- +:command:`qvm-kill` skel-manpage.py [-h] [--verbose] [--quiet] *VMNAME* Options -======= +------- .. option:: --help, -h - Show this help message and exit + show this help message and exit + +.. option:: --verbose, -v + + increase verbosity + +.. option:: --quiet, -q + + decrease verbosity + Authors -======= +------- + | Joanna Rutkowska | Rafal Wojtczuk | Marek Marczykowski +| Wojtek Porczyk + +.. vim: ts=3 sw=3 et tw=80 diff --git a/qubes/tools/__init__.py b/qubes/tools/__init__.py index dd2e09a7..5c0a48f6 100644 --- a/qubes/tools/__init__.py +++ b/qubes/tools/__init__.py @@ -161,6 +161,14 @@ class QubesArgumentParser(argparse.ArgumentParser): return namespace + def error_runtime(self, message): + '''Runtime error, without showing usage. + + :param str message: message to show + ''' + self.exit(1, '{}: error: {}\n'.format(self.prog, message)) + + def dont_run_as_root(self, namespace): '''Prevent running as root. @@ -173,7 +181,8 @@ class QubesArgumentParser(argparse.ArgumentParser): return if euid == 0 and not namespace.force_root: - self.error('refusing to run as root; add --force-root to override') + self.error_runtime( + 'refusing to run as root; add --force-root to override') @staticmethod diff --git a/qubes/tools/qvm_kill.py b/qubes/tools/qvm_kill.py new file mode 100644 index 00000000..aafb027c --- /dev/null +++ b/qubes/tools/qvm_kill.py @@ -0,0 +1,53 @@ +#!/usr/bin/python2 -O +# vim: fileencoding=utf-8 + +# +# The Qubes OS Project, https://www.qubes-os.org/ +# +# Copyright (C) 2015 Joanna Rutkowska +# Copyright (C) 2015 Wojtek Porczyk +# +# 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. +# + +'''qvm-kill - forceful shutdown''' + + +import qubes.tools + +parser = qubes.tools.QubesArgumentParser( + description='forceful shutdown of a domain', + want_vm=True) + + +def main(args=None): + '''Main routine of :program:`qvm-kill`. + + :param list args: Optional arguments to override those delivered from \ + command line. + ''' + + args = parser.parse_args(args) + + try: + args.vm.force_shutdown() + except (IOError, OSError, QubesException) as e: + parser.error_runtime(str(e)) + + return True + + +if __name__ == '__main__': + sys.exit(not main()) diff --git a/qubes/tools/qvm_start.py b/qubes/tools/qvm_start.py index 41951895..b3afe71d 100644 --- a/qubes/tools/qvm_start.py +++ b/qubes/tools/qvm_start.py @@ -132,9 +132,10 @@ def main(args=None): # notify_function= except MemoryError: # TODO tray - parser.error('not enough memory to start domain {!r}'.format(vm.name)) + parser.error_runtime( + 'not enough memory to start domain {!r}'.format(vm.name)) except qubes.QubesException as e: - parser.error('Qubes error: {!r}'.format(e)) + parser.error_runtime('Qubes error: {!r}'.format(e)) return True diff --git a/qvm-tools/qvm-kill b/qvm-tools/qvm-kill deleted file mode 100755 index d3a08871..00000000 --- a/qvm-tools/qvm-kill +++ /dev/null @@ -1,56 +0,0 @@ -#!/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,QubesException -from optparse import OptionParser -import subprocess -import sys - -qubes_guid_path = "/usr/bin/qubes_guid" - -def main(): - usage = "usage: %prog [options] " - parser = OptionParser (usage) - (options, args) = parser.parse_args () - if (len (args) != 1): - parser.error ("You must specify VM name!") - vmname = args[0] - - 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: - print >> sys.stderr, "A VM with the name '{0}' does not exist in the system.".format(vmname) - exit(1) - - try: - vm.force_shutdown() - except (IOError, OSError, QubesException) as err: - print >> sys.stderr, "ERROR: {0}".format(err) - exit (1) - - -main() diff --git a/rpm_spec/core-dom0.spec b/rpm_spec/core-dom0.spec index 1227cb46..483c1787 100644 --- a/rpm_spec/core-dom0.spec +++ b/rpm_spec/core-dom0.spec @@ -225,6 +225,7 @@ fi %{python_sitelib}/qubes/tools/qmemmand.py* %{python_sitelib}/qubes/tools/qubes_create.py* %{python_sitelib}/qubes/tools/qvm_create.py* +%{python_sitelib}/qubes/tools/qvm_kill.py* %{python_sitelib}/qubes/tools/qvm_ls.py* %{python_sitelib}/qubes/tools/qvm_prefs.py* %{python_sitelib}/qubes/tools/qvm_start.py*