Beispiel #1
0
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
Beispiel #2
0
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))
Beispiel #5
0
 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))
Beispiel #9
0
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()