Skip to content

Commit

Permalink
Merge branch 'devel-6'
Browse files Browse the repository at this point in the history
* devel-6:
  qvm-ls: fix total VM size reporting
  doc: update manpage of qvm-service
  tools: qvm-service tool
  tests: too much copy&paste
  features: serialize True as '1'
  tools/qvm-start-gui: add --force-stubdomain options
  tools/qvm-shutdown: fix help message
  tools/qvm-shutdown: drop --force option, it isn't supported anymore
  • Loading branch information
marmarek committed Jul 29, 2017
2 parents f25321b + 7db2ed8 commit f48321d
Show file tree
Hide file tree
Showing 14 changed files with 380 additions and 200 deletions.
37 changes: 16 additions & 21 deletions doc/manpages/qvm-service.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ Synopsis
========
| :command:`qvm-service` [-l] <*vmname*>
| :command:`qvm-service` [-e|-d|-D] <*vmname*> <*service*>
| :command:`qvm-service` <*vmname*> <*service*> [on|off]
Options
=======
Expand All @@ -27,11 +28,19 @@ Options

Disable service

.. option:: --default, -D
.. option:: --default, -D, --delete, --unset

Reset service to its default state (remove from the list). Default state
means "lets VM choose" and can depend on VM type (NetVM, AppVM etc).

.. option:: --verbose, -v

increase verbosity

.. option:: --quiet, -q

decrease verbosity

Supported services
==================

Expand All @@ -50,11 +59,6 @@ meminfo-writer
remove it (reset to default state), will be recreated with the rule: enabled
if VM have no PCI devices assigned, otherwise disabled.

qubes-dvm
Default: disabled

Used internally when creating DispVM savefile.

qubes-firewall
Default: enabled only in ProxyVM

Expand All @@ -72,14 +76,6 @@ qubes-network
Expose network for other VMs. This includes enabling network forwarding,
MASQUERADE, DNS redirection and basic firewall.

qubes-netwatcher
Default: enabled only in ProxyVM

Monitor IP change notification from NetVM. When received, reload
qubes-firewall service (to force DNS resolution).

This service makes sense only with qubes-firewall enabled.

qubes-update-check
Default: enabled

Expand All @@ -103,12 +99,12 @@ network-manager
Enable NetworkManager. Only VM with direct access to network device needs
this service, but can be useful in ProxyVM to ease VPN setup.

ntpd
clocksync
Default: disabled

Enable NTPD service. By default Qubes calls ntpdate every 6 minutes in
selected VM (aka ClockVM), then propagate the result using qrexec calls.
Enabling ntpd *do not* disable this behaviour.
Enable NTPD (or equivalent) service. If disabled, VM will sync clock with
selected VM (aka ClockVM) instead. ClockVM for particular VM can be set in
policy of qubes.GetDate service, using target= parameter.

qubes-yum-proxy
Deprecated name for qubes-updates-proxy.
Expand All @@ -130,9 +126,8 @@ updates-proxy-setup

.. note::

this service is automatically enabled when you allow VM to access yum
proxy (in firewall settings) and disabled when you deny access to yum
proxy.
this service is automatically enabled when you allow VM to access updates
proxy and disabled when you deny access to updates proxy.

disable-default-route
Default: disabled
Expand Down
7 changes: 1 addition & 6 deletions doc/manpages/qvm-shutdown.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
Synopsis
--------

:command:`qvm-shutdown` [-h] [--verbose] [--quiet] [--all] [--exclude *EXCLUDE*] [--force] [--wait] [--timeout *TIMEOUT*] [*VMNAME*]
:command:`qvm-shutdown` [-h] [--verbose] [--quiet] [--all] [--exclude *EXCLUDE*] [--wait] [--timeout *TIMEOUT*] [*VMNAME*]

Options
-------
Expand All @@ -40,11 +40,6 @@ Options

exclude the qube from :option:`--all`

.. option:: --force

force operation, even if may damage other VMs (eg. shutdown of network
provider)

.. option:: --wait

wait for the VMs to shut down
Expand Down
6 changes: 5 additions & 1 deletion doc/manpages/qvm-start-gui.rst
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
Synopsis
--------

:command:`qvm-start-gui` [-h] [--verbose] [--quiet] [--all] [--exclude *EXCLUDE*] [--watch] [--pidfile *PIDFILE*] [--notify-monitory-layout] [*VMNAME* [*VMNAME* ...]]
:command:`qvm-start-gui` [-h] [--verbose] [--quiet] [--all] [--exclude *EXCLUDE*] [--watch] [--force-stubdomain] [--pidfile *PIDFILE*] [--notify-monitory-layout] [*VMNAME* [*VMNAME* ...]]

Options
-------
Expand Down Expand Up @@ -44,6 +44,10 @@ Options

Keep watching for further domains startups, must be used with --all

.. option:: --force-stubdomain

Start GUI to stubdomain-emulated VGA, even if gui-agent is running in the VM

.. option:: --pidfile

Pidfile path to create in --watch mode
Expand Down
5 changes: 3 additions & 2 deletions qubesadmin/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ def __delitem__(self, key):
self.vm.qubesd_call(self.vm.name, 'admin.vm.feature.Remove', key)

def __setitem__(self, key, value):
if value is False:
if isinstance(value, bool):
# False value needs to be serialized as empty string
self.vm.qubesd_call(self.vm.name, 'admin.vm.feature.Set', key, b'')
self.vm.qubesd_call(self.vm.name, 'admin.vm.feature.Set', key,
b'1' if value else b'')
else:
self.vm.qubesd_call(self.vm.name, 'admin.vm.feature.Set', key,
str(value).encode())
Expand Down
2 changes: 2 additions & 0 deletions qubesadmin/tests/backup/backupcompatibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -1350,6 +1350,8 @@ def setup_expected_calls(self, parsed_qubes_xml, templates_map=None):
for feature, value in vm['features'].items():
if value is False:
value = ''
elif value is True:
value = '1'
self.app.expected_calls[
(name, 'admin.vm.feature.Set', feature,
str(value).encode())] = b'0\0'
Expand Down
2 changes: 1 addition & 1 deletion qubesadmin/tests/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def test_020_set(self):

def test_021_set_bool(self):
self.app.expected_calls[
('test-vm', 'admin.vm.feature.Set', 'feature1', b'True')] = \
('test-vm', 'admin.vm.feature.Set', 'feature1', b'1')] = \
b'0\0'
self.vm.features['feature1'] = True
self.assertAllCalled()
Expand Down
159 changes: 0 additions & 159 deletions qubesadmin/tests/tools/qvm_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,162 +91,3 @@ def test_003_del(self):
self.assertEqual(stdout.getvalue(),
'')
self.assertAllCalled()

def test_004_running_verbose(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Running\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--running',
'some-vm'], app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VM some-vm is running\n')
self.assertAllCalled()

def test_005_running_multi_verbose(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Running\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n'
self.app.expected_calls[
('some-vm2', 'admin.vm.List', None, None)] = \
b'0\x00some-vm2 class=AppVM state=Running\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--running',
'some-vm', 'some-vm2'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VMs some-vm, some-vm2 are running\n')
self.assertAllCalled()

def test_006_running_multi_verbose2(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Running\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n'
self.app.expected_calls[
('some-vm2', 'admin.vm.List', None, None)] = \
b'0\x00some-vm2 class=AppVM state=Running\n'
self.app.expected_calls[
('some-vm3', 'admin.vm.List', None, None)] = \
b'0\x00some-vm3 class=AppVM state=Halted\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--running',
'--all'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VMs some-vm, some-vm2 are running\n')
self.assertAllCalled()

def test_007_not_running_verbose(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Running\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm3', 'admin.vm.List', None, None)] = \
b'0\x00some-vm3 class=AppVM state=Halted\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--running',
'some-vm3'],
app=self.app),
1)
self.assertEqual(stdout.getvalue(),
'None of given VM is running\n')
self.assertAllCalled()

def test_008_paused(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Paused\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm2', 'admin.vm.List', None, None)] = \
b'0\x00some-vm2 class=AppVM state=Paused\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--paused',
'some-vm2'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VM some-vm2 is paused\n')
self.assertAllCalled()

def test_009_paused_multi(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Paused\n' \
b'some-vm3 class=AppVM state=Halted\n'
self.app.expected_calls[
('some-vm2', 'admin.vm.List', None, None)] = \
b'0\x00some-vm2 class=AppVM state=Paused\n'
self.app.expected_calls[
('some-vm', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--paused',
'some-vm2', 'some-vm'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VM some-vm2 is paused\n')
self.assertAllCalled()


def test_010_template(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Paused\n' \
b'some-vm3 class=TemplateVM state=Halted\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--template',
'some-vm3'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VM some-vm3 is a template\n')
self.assertAllCalled()

def test_011_template_multi(self):
self.app.expected_calls[
('dom0', 'admin.vm.List', None, None)] = \
b'0\x00some-vm class=AppVM state=Running\n' \
b'some-vm2 class=AppVM state=Paused\n' \
b'some-vm3 class=TemplateVM state=Halted\n'
with qubesadmin.tests.tools.StdoutBuffer() as stdout:
self.assertEqual(
qubesadmin.tools.qvm_check.main(['--template',
'some-vm2', 'some-vm3'],
app=self.app),
0)
self.assertEqual(stdout.getvalue(),
'VM some-vm3 is a template\n')
self.assertAllCalled()

Loading

0 comments on commit f48321d

Please sign in to comment.