def main(args=None, app=None): '''Main function of qvm-check tool''' args = parser.parse_args(args, app=app) domains = args.domains if args.running: running = [vm for vm in domains if vm.is_running()] if args.verbose: print_msg(running, "is running", "are running") return 0 if running else 1 elif args.paused: paused = [vm for vm in domains if vm.is_paused()] if args.verbose: print_msg(paused, "is paused", "are paused") return 0 if paused else 1 elif args.template: template = [ vm for vm in domains if isinstance(vm, qubesadmin.vm.TemplateVM) ] if args.verbose: print_msg(template, "is a template", "are templates") return 0 if template else 1 else: if args.verbose: print_msg(domains, "exists", "exist") return 0 if domains else 1
def main(args=None): ''' Main function of qvm-start-gui tool''' args = parser.parse_args(args) if args.watch and not args.all_domains: parser.error('--watch option must be used with --all') if args.watch and args.notify_monitor_layout: parser.error('--watch cannot be used with --notify-monitor-layout') launcher = GUILauncher(args.app) if args.watch: if not have_events: parser.error('--watch option require Python >= 3.5') with daemon.pidfile.TimeoutPIDLockFile(args.pidfile): loop = asyncio.get_event_loop() # pylint: disable=no-member events = qubesadmin.events.EventsDispatcher(args.app) # pylint: enable=no-member launcher.register_events(events) events_listener = asyncio.ensure_future(events.listen_for_events()) for signame in ('SIGINT', 'SIGTERM'): loop.add_signal_handler(getattr(signal, signame), events_listener.cancel) # pylint: disable=no-member loop.add_signal_handler(signal.SIGHUP, launcher.send_monitor_layout_all) conn = xcffib.connect() x_fd = conn.get_file_descriptor() loop.add_reader(x_fd, x_reader, conn, events_listener.cancel) try: loop.run_until_complete(events_listener) except asyncio.CancelledError: pass loop.remove_reader(x_fd) loop.stop() loop.run_forever() loop.close() elif args.notify_monitor_layout: try: with open(pidfile_path, 'r') as pidfile: pid = int(pidfile.read().strip()) os.kill(pid, signal.SIGHUP) except (FileNotFoundError, ValueError) as e: parser.error('Cannot open pidfile {}: {}'.format(pidfile_path, str(e))) else: loop = asyncio.get_event_loop() tasks = [] for vm in args.domains: if vm.is_running(): tasks.append(asyncio.ensure_future(launcher.start_gui( vm, force_stubdom=args.force_stubdomain))) if tasks: loop.run_until_complete(asyncio.wait(tasks)) loop.stop() loop.run_forever() loop.close()
def on_connection_established(self, _subject, _event, **_kwargs): '''Handler of 'connection-established' event, used to launch GUI daemon for domains started before this tool. ''' monitor_layout = get_monitor_layout() for vm in self.app.domains: if isinstance(vm, qubesadmin.vm.AdminVM): continue if vm.is_running(): asyncio.ensure_future( self.start_gui(vm, monitor_layout=monitor_layout))
def send_monitor_layout_all(self): '''Send monitor layout to all (running) VMs''' monitor_layout = get_monitor_layout() for vm in self.app.domains: if isinstance(vm, qubesadmin.vm.AdminVM): continue if vm.is_running(): if not vm.features.check_with_template('gui', True): continue asyncio.ensure_future( self.send_monitor_layout(vm, monitor_layout))
def send_monitor_layout_all(self): """Send monitor layout to all (running) VMs""" monitor_layout = get_monitor_layout() for vm in self.app.domains: if getattr(vm, 'guivm', None) != vm.app.local_name: continue if vm.klass == 'AdminVM': continue if vm.is_running(): if not vm.features.check_with_template('gui', True): continue asyncio.ensure_future( self.send_monitor_layout(vm, monitor_layout))
async def send_monitor_layout(self, vm, layout=None, startup=False): """Send monitor layout to a given VM This function is a coroutine. :param vm: VM to which send monitor layout :param layout: monitor layout to send; if None, fetch it from local X server. :param startup: :return: None """ # pylint: disable=no-self-use if vm.features.check_with_template('no-monitor-layout', False) \ or not vm.is_running(): return if layout is None: layout = get_monitor_layout() if not layout: return vm.log.info('Sending monitor layout') if not startup: with open(self.guid_pidfile(vm.xid), encoding='ascii') as pidfile: pid = int(pidfile.read()) os.kill(pid, signal.SIGHUP) try: with open(self.guid_pidfile(vm.stubdom_xid), encoding='ascii') as pidfile: pid = int(pidfile.read()) os.kill(pid, signal.SIGHUP) except FileNotFoundError: pass try: await asyncio.get_event_loop(). \ run_in_executor(None, functools.partial( vm.run_service_for_stdio, 'qubes.SetMonitorLayout', input=''.join(layout).encode(), autostart=False)) except subprocess.CalledProcessError as e: vm.log.warning('Failed to send monitor layout: %s', e.stderr)
def send_monitor_layout(self, vm, layout=None, startup=False): '''Send monitor layout to a given VM This function is a coroutine. :param vm: VM to which send monitor layout :param layout: monitor layout to send; if None, fetch it from local X server. :param startup: :return: None ''' # pylint: disable=no-self-use if vm.features.check_with_template('no-monitor-layout', False) \ or not vm.is_running(): return if layout is None: layout = get_monitor_layout() if not layout: return vm.log.info('Sending monitor layout') if not startup: with open(self.guid_pidfile(vm.xid)) as pidfile: pid = int(pidfile.read()) os.kill(pid, signal.SIGHUP) try: with open(self.guid_pidfile(vm.stubdom_xid)) as pidfile: pid = int(pidfile.read()) os.kill(pid, signal.SIGHUP) except FileNotFoundError: pass yield from asyncio.get_event_loop().run_in_executor( None, vm.run_service_for_stdio, 'qubes.SetMonitorLayout', ''.join(layout).encode())
def parse_qubes_app(self, parser, namespace): super(RunningVmNameAction, self).parse_qubes_app(parser, namespace) for vm in namespace.domains: if not vm.is_running(): parser.error_runtime("domain {!r} is not running".format( vm.name))
def main(args=None): """ Main function of qvm-start-daemon tool""" only_if_service_enabled = ['guivm-gui-agent', 'audiovm-audio-agent'] enabled_services = [ service for service in only_if_service_enabled if os.path.exists('/var/run/qubes-service/%s' % service) ] if not enabled_services and '--force' not in sys.argv and \ not os.path.exists('/etc/qubes-release'): print(parser.format_help()) return args = parser.parse_args(args) if args.watch and not args.all_domains: parser.error('--watch option must be used with --all') if args.watch and args.notify_monitor_layout: parser.error('--watch cannot be used with --notify-monitor-layout') if args.watch and 'guivm-gui-agent' in enabled_services: args.set_keyboard_layout = True if args.set_keyboard_layout or os.path.exists('/etc/qubes-release'): guivm = args.app.domains[args.app.local_name] set_keyboard_layout(guivm) launcher = DAEMONLauncher(args.app) if args.watch: if not have_events: parser.error('--watch option require Python >= 3.5') with daemon.pidfile.TimeoutPIDLockFile(args.pidfile): loop = asyncio.get_event_loop() # pylint: disable=no-member events = qubesadmin.events.EventsDispatcher(args.app) # pylint: enable=no-member launcher.register_events(events) events_listener = asyncio.ensure_future(events.listen_for_events()) for signame in ('SIGINT', 'SIGTERM'): loop.add_signal_handler(getattr(signal, signame), events_listener.cancel) # pylint: disable=no-member loop.add_signal_handler(signal.SIGHUP, launcher.send_monitor_layout_all) conn = xcffib.connect() x_fd = conn.get_file_descriptor() loop.add_reader(x_fd, x_reader, conn, events_listener.cancel) try: loop.run_until_complete(events_listener) except asyncio.CancelledError: pass loop.remove_reader(x_fd) loop.stop() loop.run_forever() loop.close() elif args.notify_monitor_layout: try: with open(pidfile_path, 'r') as pidfile: pid = int(pidfile.read().strip()) os.kill(pid, signal.SIGHUP) except (FileNotFoundError, ValueError) as e: parser.error('Cannot open pidfile {}: {}'.format( pidfile_path, str(e))) else: loop = asyncio.get_event_loop() tasks = [] for vm in args.domains: if vm.is_running(): tasks.append( asyncio.ensure_future( launcher.start_gui( vm, force_stubdom=args.force_stubdomain))) tasks.append(asyncio.ensure_future(launcher.start_audio(vm))) if tasks: loop.run_until_complete(asyncio.wait(tasks)) loop.stop() loop.run_forever() loop.close()
usage = calc_usage(vm, volume_name) return usage * 100 // size # todo maxmem Column('STATE', attr=(lambda vm: vm.get_power_state()), doc='Current power state.') Column('CLASS', attr=(lambda vm: type(vm).__name__), doc='Class of the qube.') Column('GATEWAY', attr='netvm.gateway', doc='Network gateway.') Column('MEMORY', attr=(lambda vm: vm.get_mem() / 1024 if vm.is_running() else None), doc='Memory currently used by VM') Column('DISK', attr=(lambda vm: vm.get_disk_utilization() // 1024 // 1024), doc='Total disk utilisation.') Column('PRIV-CURR', attr=(lambda vm: calc_usage(vm, 'private')), doc='Disk utilisation by private image (/home, /usr/local).') Column('PRIV-MAX', attr=(lambda vm: calc_size(vm, 'private')), doc='Maximum available space for private image.') Column(
def main(args=None): """ Main function of qvm-start-daemon tool""" only_if_service_enabled = ['guivm', 'audiovm'] enabled_services = [ service for service in only_if_service_enabled if os.path.exists('/var/run/qubes-service/%s' % service) ] if not enabled_services and '--force' not in sys.argv and \ not os.path.exists('/etc/qubes-release'): print(parser.format_help()) return args = parser.parse_args(args) if args.watch and args.notify_monitor_layout: parser.error('--watch cannot be used with --notify-monitor-layout') if args.all_domains: vm_names = None else: vm_names = [vm.name for vm in args.domains] launcher = DAEMONLauncher(args.app, vm_names=vm_names, kde=args.kde) if args.watch: fd = os.open(args.pidfile, os.O_RDWR | os.O_CREAT | os.O_CLOEXEC, 0o600) with os.fdopen(fd, 'r+') as lock_f: try: fcntl.flock(fd, fcntl.LOCK_EX | fcntl.LOCK_NB) except BlockingIOError: try: pid = int(lock_f.read().strip()) except ValueError: pid = 'unknown' print('Another GUI daemon process (with PID {}) is already ' 'running'.format(pid), file=sys.stderr) sys.exit(1) print(os.getpid(), file=lock_f) lock_f.flush() lock_f.truncate() loop = asyncio.get_event_loop() # pylint: disable=no-member events = qubesadmin.events.EventsDispatcher(args.app) # pylint: enable=no-member launcher.register_events(events) events_listener = asyncio.ensure_future(events.listen_for_events()) for signame in ('SIGINT', 'SIGTERM'): loop.add_signal_handler(getattr(signal, signame), events_listener.cancel) # pylint: disable=no-member loop.add_signal_handler(signal.SIGHUP, launcher.send_monitor_layout_all) conn = xcffib.connect() x_watcher = XWatcher(conn, args.app) x_fd = conn.get_file_descriptor() loop.add_reader(x_fd, x_watcher.event_reader, events_listener.cancel) x_watcher.update_keyboard_layout() try: loop.run_until_complete(events_listener) except asyncio.CancelledError: pass loop.remove_reader(x_fd) loop.stop() loop.run_forever() loop.close() elif args.notify_monitor_layout: try: with open(pidfile_path, 'r', encoding='ascii') as pidfile: pid = int(pidfile.read().strip()) os.kill(pid, signal.SIGHUP) except (FileNotFoundError, ValueError) as e: parser.error('Cannot open pidfile {}: {}'.format( pidfile_path, str(e))) else: loop = asyncio.get_event_loop() tasks = [] for vm in args.domains: if vm.is_running(): tasks.append( asyncio.ensure_future( launcher.start_gui( vm, force_stubdom=args.force_stubdomain))) tasks.append(asyncio.ensure_future(launcher.start_audio(vm))) if tasks: loop.run_until_complete(asyncio.wait(tasks)) loop.stop() loop.run_forever() loop.close()