Example #1
0
def main():
    script = Script()
    script.add_argument('--config', default=DEFAULT_CONFIG_PATH, help='Virtual machine directory')

    c = script.add_subcommand(ListCommand('list', 'List VMs'))

    c = script.add_subcommand(StartCommand('start', 'Start VM'))
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    c = script.add_subcommand(StopCommand('stop', 'Stop VM'))
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    c = script.add_subcommand(AutoResumeCommand('resume', 'Autoresume headless VMs'))
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    c = script.add_subcommand(SuspendCommand('suspend', 'Suspend VM'))
    c.add_argument('--autoresume', action='store_true', help='Set autoresume flag')
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    c = script.add_subcommand(StatusCommand('status', 'Show status of VMs'))
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    c = script.add_subcommand(DetailsCommand('details', 'Show VM details'))
    c.add_argument('patterns', nargs='*', help='VM name patterns')

    script.parse_args()
Example #2
0
def main():
    script = Script('pytunes-playlists',
                    'Import and export music player playlists')

    c = script.add_subcommand(ListCommand('list', 'List playlists'))
    c.add_argument('-s',
                   '--smart-playlists',
                   action='store_true',
                   help='Include smart playlists')
    c.add_argument('-y',
                   '--yearly',
                   action='store_true',
                   help='Order listed tracks by year')
    c.add_argument('-f', '--format', help='List formatting string')
    c.add_argument('playlists', nargs='*', help='Playlists to process')

    c = script.add_subcommand(
        ExportFilesCommand('export-files', 'Export playlists as files'))
    c.add_argument('-s',
                   '--smart-playlists',
                   action='store_true',
                   help='Include smart playlists')
    c.add_argument('-y',
                   '--yearly',
                   action='store_true',
                   help='Order exported tracks by year')
    c.add_argument('-f', '--format', help='Filename formatting string')
    c.add_argument('playlists', nargs='*', help='Playlists to process')

    c = script.add_subcommand(ExportCommand('export', 'Export m3u playlists'))
    script.add_argument('-D',
                        '--directory',
                        default=DEFAULT_DIRECTORY,
                        help='Playlist directory for m3u files')
    c.add_argument('-s',
                   '--smart-playlists',
                   action='store_true',
                   help='Include smart playlists')
    c.add_argument('-E',
                   '--ignore-empty',
                   action='store_true',
                   help='Ignore empty playlists')
    c.add_argument('playlists', nargs='*', help='Playlists to process')

    c = script.add_subcommand(ImportCommand('import', 'Import playlists'))
    c.add_argument('-s',
                   '--smart-playlists',
                   action='store_true',
                   help='Include smart playlists')
    c.add_argument('playlists', nargs='*', help='Playlists to process')

    c = script.add_subcommand(CreateCommand('create', 'Create playlists'))
    c.add_argument('names', nargs='*', help='Names of playlists to create')

    c = script.add_subcommand(RemoveCommand('remove', 'Remove playlists'))
    c.add_argument('names', nargs='*', help='Names of playlists to create')

    script.run()
Example #3
0
def main():
    script = Script()
    script.add_argument('--config',
                        default=DEFAULT_CONFIG_PATH,
                        help='Virtual machine directory')

    script.add_subcommand(ListCommand())
    script.add_subcommand(StatusCommand())
    script.add_subcommand(StartCommand())
    script.add_subcommand(StopCommand())
    script.add_subcommand(ResumeCommand())
    script.add_subcommand(SuspendCommand())
    script.add_subcommand(DetailsCommand())

    script.parse_args()
Example #4
0
def main():

    script = Script()
    script.add_argument('-f',
                        '--log-file',
                        default=DEFAULT_LOGFILE,
                        help='Log file')
    script.add_argument('-c',
                        '--configuration-file',
                        default=DEFAULT_CONFIGURATION_PATH,
                        help='Log file')
    script.add_argument('-h', '--redis-host', help='Redis host')
    script.add_argument('-r', '--redis-auth', help='Redis auth')
    args = script.parse_args()

    try:
        configuration = DaemonConfiguration(
            args.configuration_file,
            args.log_file,
            args.redis_host,
            args.redis_auth,
        )
    except Exception as e:
        script.exit(1, e)

    try:
        Daemon(**configuration).run()
    except MusicPlayerError as e:
        script.exit(1, e)
Example #5
0
class NagiosPlugin(object):
    """Nagios plugin base class

    Implementation of nagios plugin in python

    See examples directory in source code for usage
    """
    def __init__(self, description=None):
        object.__setattr__(self, 'state_code', NAGIOS_INITIAL_STATE)
        self.message = 'UNINITIALIZED'
        self.parser = Script(description=description)

    def __repr__(self):
        return '{0} {1}'.format(self.state_message, self.message)

    def __setattr__(self, attr, value):
        if attr == 'state':
            self.set_state(value)
        object.__setattr__(self, attr, value)

    @property
    def state_message(self):
        return NAGIOS_STATES[self.state_code]

    def set_state(self, value):
        """Set nagios plugin state

        Sets internal state to provided value, which can be integer from 0 to 3
        or one of strings 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN'

        Silently refuses to lower plugin state to less critical error. UNKNOWN
        state can always be overwritten.
        """
        try:
            value = int(value)
            if value not in NAGIOS_STATES.keys():
                raise ValueError
        except ValueError:
            pass

        if value in NAGIOS_STATES.keys():
            state_code = int(value)
        else:
            for k,v in NAGIOS_STATES.items():
                if value == v:
                    state_code = k
                    break

        if state_code not in NAGIOS_STATES.keys():
            raise AttributeError('Attempt to set invalid plugin state {0}'.format(value))

        # Silently ignore lowering of error state for a plugin
        if self.state_code != NAGIOS_INITIAL_STATE and self.state_code > state_code:
            self.parser.log.debug('Refuse lowering state from {0} to {1}'.format(self.state_code, state_code))
            return

        object.__setattr__(self, 'state_code', state_code)

    def add_argument(self, *args, **kwargs):
        """Add CLI argument

        Add CLI argument. Uses argparse.ArgumentParser.add_argument syntax

        """
        self.parser.add_argument(*args, **kwargs)

    def parse_args(self, *args, **kwargs):
        """Parse arguments

        Parse self.parser arguments. Called automatically from self.run()

        """
        self.args = self.parser.parse_args(*args, **kwargs)
        return self.args

    def error(self, message, code=2):
        """Exit with error

        Exit with error code (must be valid nagios state code)

        Writes error message to stdout

        """
        try:
            code = int(code)
            if code not in NAGIOS_STATES.keys():
                raise ValueError
        except ValueError:
            raise AttributeError('Invalid error code {0}'.format(code))

        sys.stdout.write('Error running plugin: {0}\n'.format(message))
        sys.exit(code)

    def exit(self):
        """Return nagios message and exit

        Print self.state_message + self.message to stdout for nagios and
        exit with self.state_code code

        """
        sys.stdout.write('{0} {1}\n'.format(self.state_message, self.message))
        sys.exit(self.state_code)

    def run(self):
        """Run the plugin

        Run the plugin:
          - Parse arguments
          - Set message to empty
          - run self.check_plugin_status() callback
          - run self.exit()

        If check_plugin_status raises NagiosPluginError, state is set to
        critical and error message is appended to message before exit
        """
        args = self.parse_args()
        self.message = ''

        try:
            self.check_plugin_status()
        except NagiosPluginError, emsg:
            self.state = 'CRITICAL'
            self.message += '{0}'.format(emsg)

        self.exit()
Example #6
0
def main():

    script = Script(description='Update music player library metadata')
    script.add_argument('-c', '--codec', help='Music library default codec')
    script.add_argument('-l', '--music-path', help='Music library path')
    script.add_argument('-p',
                        '--position',
                        type=int,
                        help='Start from given position in library')
    script.add_argument('-m',
                        '--metadata',
                        action='store_true',
                        help='Update metadata')
    args = script.parse_args()

    client = Client()

    script.log.info('Loading music player library playlist')

    if args.position:
        try:
            client.library.jump(args.position)
        except ValueError:
            script.exit(
                1, 'Invalid position: {0} ({1:d} entries)'.format(
                    (args.position, len(client.library))))

    try:
        tree = MusicTree(tree_path=args.music_path)
        tree.load()
        tree_paths = tree.realpaths
    except Exception as e:
        script.exit(1, e)

    processed = 0
    progress_interval = PROGRESS_INTERVAL
    progress_start = time.time()
    start = time.time()
    app_files = {}

    script.log.info('Checking library files against music player database')

    for entry in client.library:
        processed += 1
        if processed % progress_interval == 0:
            progress_time = float(time.time() - progress_start)
            progress_rate = int(progress_interval / progress_time)
            script.log.info('Index {0:d} ({1:d} entries per second)'.format(
                processed, progress_rate))
            progress_start = time.time()

        try:
            if entry.path is None:
                try:
                    client.library.delete(entry)
                except MusicPlayerError as e:
                    print(e)
                continue
        except TypeError as e:
            print('Error processing entry {0}: {1}'.format(entry, e))
            continue

        try:
            path = normalized(os.path.realpath(entry.path))
        except AttributeError:
            script.log.info('Removing invalid entry (no path defined)')
            try:
                client.library.delete(entry)
            except MusicPlayerError as e:
                print(e)
            continue

        if path not in tree_paths:
            if not os.path.isfile(path):
                script.log.info('Removing non-existing: "}0}"'.format(path))
                try:
                    client.library.delete(entry)
                except MusicPlayerError as e:
                    print(e)
            else:
                script.log.info('File outside tree: {0}'.format(path))

        elif path not in app_files:
            app_files[path] = entry
            if args.metadata:
                mtime = os.stat(path).st_mtime
                if int(entry.modification_date.strftime('%s')) >= mtime:
                    continue

                song = Track(entry.path)
                if entry.syncTags(song):
                    client.library.__next = entry.index

        else:
            script.log.info('Removing duplicate: {0}'.format(entry.path))
            try:
                client.library.delete(entry)
            except MusicPlayerError as e:
                print(e)

    loadtime = float(time.time() - start)
    script.log.info('Checked {0:d} files in {1:4.2f} seconds'.format(
        processed, loadtime))

    start = time.time()
    processed = 0

    script.log.info('Checking music player database against tree files')

    if args.position is None:

        for path in sorted(tree_paths.keys()):

            if path not in app_files:
                script.log.info('Adding: {0}'.format(path))
                try:
                    client.library.add(path)
                except ValueError as e:
                    print(e)

            processed += 1
            if processed % 1000 == 0:
                script.log.debug('Processed: {0:d} entries'.format(processed))

    loadtime = float(time.time() - start)
    script.log.info('Checked {0:d} files in {1:2.2f} seconds'.format(
        processed, loadtime))
Example #7
0
class NagiosPlugin(object):
    """Nagios plugin base class

    Implementation of nagios plugin in python

    See examples directory in source code for usage
    """
    def __init__(self, description=None):
        object.__setattr__(self, 'state_code', NAGIOS_INITIAL_STATE)
        self.message = 'UNINITIALIZED'
        self.parser = Script(description=description)

    def __repr__(self):
        return '{0} {1}'.format(self.state_message, self.message)

    def __setattr__(self, attr, value):
        if attr == 'state':
            self.set_state(value)
        object.__setattr__(self, attr, value)

    @property
    def state_message(self):
        return NAGIOS_STATES[self.state_code]

    def set_state(self, value):
        """Set nagios plugin state

        Sets internal state to provided value, which can be integer from 0 to 3
        or one of strings 'OK', 'WARNING', 'CRITICAL', 'UNKNOWN'

        Silently refuses to lower plugin state to less critical error. UNKNOWN
        state can always be overwritten.
        """
        try:
            value = int(value)
            if value not in NAGIOS_STATES.keys():
                raise ValueError
        except ValueError:
            pass

        if value in NAGIOS_STATES.keys():
            state_code = int(value)
        else:
            for k, v in NAGIOS_STATES.items():
                if value == v:
                    state_code = k
                    break

        if state_code not in NAGIOS_STATES.keys():
            raise AttributeError(
                'Attempt to set invalid plugin state {0}'.format(value))

        # Silently ignore lowering of error state for a plugin
        if self.state_code != NAGIOS_INITIAL_STATE and self.state_code > state_code:
            self.parser.log.debug(
                'Refuse lowering state from {0} to {1}'.format(
                    self.state_code, state_code))
            return

        object.__setattr__(self, 'state_code', state_code)

    def add_argument(self, *args, **kwargs):
        """Add CLI argument

        Add CLI argument. Uses argparse.ArgumentParser.add_argument syntax

        """
        self.parser.add_argument(*args, **kwargs)

    def parse_args(self, *args, **kwargs):
        """Parse arguments

        Parse self.parser arguments. Called automatically from self.run()

        """
        self.args = self.parser.parse_args(*args, **kwargs)
        return self.args

    def error(self, message, code=2):
        """Exit with error

        Exit with error code (must be valid nagios state code)

        Writes error message to stdout

        """
        try:
            code = int(code)
            if code not in NAGIOS_STATES.keys():
                raise ValueError
        except ValueError:
            raise AttributeError('Invalid error code {0}'.format(code))

        sys.stdout.write('Error running plugin: {0}\n'.format(message))
        sys.exit(code)

    def exit(self):
        """Return nagios message and exit

        Print self.state_message + self.message to stdout for nagios and
        exit with self.state_code code

        """
        sys.stdout.write('{0} {1}\n'.format(self.state_message, self.message))
        sys.exit(self.state_code)

    def run(self):
        """Run the plugin

        Run the plugin:
          - Parse arguments
          - Set message to empty
          - run self.check_plugin_status() callback
          - run self.exit()

        If check_plugin_status raises NagiosPluginError, state is set to
        critical and error message is appended to message before exit
        """
        args = self.parse_args()
        self.message = ''

        try:
            self.check_plugin_status()
        except NagiosPluginError, emsg:
            self.state = 'CRITICAL'
            self.message += '{0}'.format(emsg)

        self.exit()