Example #1
0
 def test_schedule_file_option(self):
     args = ArgHandler.get_args(['-f', filename, '-S', filename])
     self.assertTrue(args.schedule_file)
     args = ArgHandler.get_args([
         '--file', filename,
         '--schedule-file', filename,
     ])
     self.assertTrue(args.schedule_file)
Example #2
0
    def test_file_option_and_filename_both_required(self):
        """should cause argparse error if file opt specified w/o file"""
        expected = 'error: argument -f/--file: expected one argument'
        try:
            ArgHandler.get_args(['--file'])
        except SystemExit:
            pass

        self.redirecterr.seek(0)
        actual = self.redirecterr.read()
        self.assertTrue(expected in actual)
Example #3
0
    def test_schedule_filename_required_with_schedule_option(self):
        """argparse error if sched file opt specified w/o file"""
        expected = (
            'error: argument -S/--schedule-file: expected one argument'
        )
        try:
            ArgHandler.get_args(['--file', filename, '--schedule-file'])
        except SystemExit:
            pass

        self.redirecterr.seek(0)
        actual = self.redirecterr.read()
        self.assertTrue(expected in actual)
Example #4
0
def main(argv=None):

    if argv is None:
        argv = sys.argv[1:]  # pragma: no cover

    args = ArgHandler.get_args(argv)
    ledgerbil = Ledgerbil(args)

    return ledgerbil.process_file()
Example #5
0
def startcli(errors, argparser):
    """
    Starts a cli session of GRAMPS. 
    errors    : errors already encountered 
    argparser : ArgParser instance
    """
    if errors:
        #already errors encountered. Show first one on terminal and exit
        # Convert error message to file system encoding before print
        errmsg = _('Error encountered: %s') % errors[0][0]
        errmsg = errmsg.encode(sys.getfilesystemencoding())
        print errmsg
        errmsg = _('  Details: %s') % errors[0][1]
        errmsg = errmsg.encode(sys.getfilesystemencoding())
        print errmsg
        sys.exit(1)
    
    if argparser.errors: 
        # Convert error message to file system encoding before print
        errmsg = _('Error encountered in argument parsing: %s') \
                                                    % argparser.errors[0][0]
        errmsg = errmsg.encode(sys.getfilesystemencoding())
        print errmsg
        errmsg = _('  Details: %s') % argparser.errors[0][1]
        errmsg = errmsg.encode(sys.getfilesystemencoding())
        print errmsg
        sys.exit(1)
    
    #we need to keep track of the db state
    dbstate = DbState.DbState()
    #we need a manager for the CLI session
    climanager = CLIManager(dbstate, True)
    #load the plugins
    climanager.do_reg_plugins()
    # handle the arguments
    from arghandler import ArgHandler
    handler = ArgHandler(dbstate, argparser, climanager)
    # create a manager to manage the database
    
    handler.handle_args_cli()
    
    sys.exit(0)
Example #6
0
 def __init__(self, argDict):
     self.args = ArgHandler(argDict)
     pass
Example #7
0
class PyMurder:
    def __init__(self, argDict):
        self.args = ArgHandler(argDict)
        pass

    def create_torrent(self, tag, files_path):
        trackers = self.args.getHosts('tracker')

        tracker_host = trackers[0]
        tracker_port = self.args.trackerPort()

        filename = "/tmp/%s.tgz" % tag
        seeder_files_path = files_path

        self.exec_all([
            ('run', "tar -c -z -C %s/ -f %s --exclude \".git*\" ." %
                (seeder_files_path, filename)),
            ('run', "python %s/murder_make_torrent.py '%s' %s:%i '%s.torrent'" %
                (self.args.remoteMurderPath(),filename,tracker_host,tracker_port,filename))],
                ['seeder'])

        self.download_torrent(tag)

    def download_torrent(self, tag):
        filename = "/tmp/%s.tgz" % tag

        self.exec_all([
            ('get', "%s.torrent" % filename, "%s.torrent" % filename)],
            ['seeder'])

    def start_seeding(self, tag):
        filename = "/tmp/%s.tgz" % tag

        self.exec_all([
            ('run', 
            "SCREENRC=/dev/null SYSSCREENRC=/dev/null screen -dms"
            " 'seeder-%s' python %s/murder_client.py seeder '%s.torrent' '%s'"
            " `LC_ALL=C host ${PYMURDER_HOST} | awk '/has address/ {print $$4}'"
            "| head -n 1` && sleep 0.2" % (tag, self.args.remoteMurderPath(), filename, filename))],
            ['seeder'], use_shell=True)

    def stop_seeding(self, tag):
        self.pkill_roles("SCREEN.*seeder-%s" % (tag), ['seeder'])

    def stop_peering(self, tag):
        filename = "/tmp/%s.tgz" % tag
        self.pkill_roles("pkill -f \"murder_client.py peer.*%s\"" % (filename), ['peer'])

    def clean_temp_files(self, tag):
        filename = "/tmp/%s.tgz" % tag
        self.exec_all([(run, "rm -rf %s %s.torrent || exit 0" % (filename, filename))], ['peer'])

    def start_peering(self, tag, destination_path):
        filename = "/tmp/%s.tgz" % tag

        hosts = self.args.getHosts('peer')

        args = dict(self.args.args)

        for host in hosts:
            env.host_string = host

            with fapi.settings(**args):
                fapi.run("mkdir -p %s/" % (destination_path))
                fapi.run("find '%s/'* >/dev/null 2>&1 && echo \"destination_path"
                         " %s on $HOSTNAME is not empty\" && exit 1 || exit 0" % (destination_path,
                            destination_path))
                fapi.put("%s.torrent" % (filename), "%s.torrent" % (filename))
                fapi.run("python %s/murder_client.py peer"
                         " '%s.torrent' '%s' `LC_ALL=C host"
                         " %s | awk '/has address/ {print $4}' | head -n 1`" % 
                         (self.args.remoteMurderPath(), filename, filename, host))
                fapi.run("tar xf %s -C %s" % (filename, destination_path))

    def distribute_files(self):
        hosts = self.args.getHosts('tracker', 'seeder', 'peer')

        fapi.local("tar -c -z -C %s -f\
                /tmp/murder_dist_to_upload.tgz ." % (self.args.distPath()))

        args = dict(self.args.args)

        for host in hosts:
            env.host_string = host

            with fapi.settings(**args):
                fapi.run("mkdir -p %s/" % self.args.remoteMurderPath())
                fapi.run("[ $(find '%s/'* | wc -l ) -lt 1000 ] && rm -rf '%s/'* || "
                        "(echo 'Cowardly refusing to remove files! Check the "
                        "remote_murder_path.' ; exit 1 )" %\
                        (self.args.remoteMurderPath(),\
                            self.args.remoteMurderPath()))
                fapi.put("/tmp/murder_dist_to_upload.tgz", "/tmp/murder_dist.tgz")
                fapi.run("tar xf /tmp/murder_dist.tgz -C %s" %\
                        (self.args.remoteMurderPath()))
                fapi.run("rm /tmp/murder_dist.tgz")

        fapi.local("rm /tmp/murder_dist_to_upload.tgz")

    def start_tracker(self):
        self.exec_all([('run', "SCREENRC=/dev/null SYSSCREENRC=/dev/null screen -dms"
                               " murder_tracker python %s/murder_tracker.py && sleep 0.2" %
                (self.args.remoteMurderPath()))], ['tracker'], use_shell=True)

    def stop_tracker(self):
        self.pkill_roles('SCREEN.*murder_tracker.py', ['tracker'])

    def stop_all_seeding(self):
        self.pkill_roles('SCREEN.*seeder-*', ['seeder'])

    def stop_all_peering(self):
        self.pkill_roles('murder_client.py.peer*', ['peer'])

    def exec_all(self, commands, roles, **kwargs):
        hosts = self.args.getHosts(*roles)

        args = dict(self.args.args)
        args.update(kwargs)

        for host in hosts:
            env.host_string = host

            with fapi.settings(**args):
                for command in commands:
                    type = command[0]

                    if 'run' == type:
                        tpl = string.Template(command[1])
                        cmd = tpl.substitute(PYMURDER_HOST=host)
                        fapi.run(cmd)
                    elif 'get' == type:
                        fapi.get(command[1], command[2])

    def pkill_roles(self, name, roles):
        hosts = self.args.getHosts(*roles)

        args = dict(self.args.args)

        for host in hosts:
            env.host_string = host

            with fapi.settings(**args):
                self.pkill(name)

    def pkill(self, name):
        fapi.run("ps -ef | grep %s | grep -v grep | awk '{print $2}' |"
                 " xargs kill || echo 'no process with name %s found'" % (name,name))
Example #8
0
 def test_no_sorting_option(self):
     """should not set parse args 'sort' var"""
     args = ArgHandler.get_args(['--file', filename])
     self.assertFalse(args.sort)
Example #9
0
 def test_sort_option(self):
     args = ArgHandler.get_args(['-f', filename, '-s'])
     self.assertTrue(args.sort)
     args = ArgHandler.get_args(['--file', filename, '--sort'])
     self.assertTrue(args.sort)
Example #10
0
 def test_file_option(self):
     args = ArgHandler.get_args(['-f', filename])
     self.assertTrue(args.file)
     args = ArgHandler.get_args(['--file', filename])
     self.assertTrue(args.file)