예제 #1
0
 def run_action(self, mode, web_static_dir):
     """Call this method to execute the desired action (--patch-tahoe or
     --undo-patch-tahoe). It will run the necessary methods."""
     if self.is_compatible_version:
         if mode == 'patch':
             if is_root():
                 print('WARN: Not installing NEWS.html placeholder (running'
                     ' as root).')
             else:
                 install_news_stub(web_static_dir)
             for uifile in list(self.filepaths.keys()):
                 patch_version = self.read_patch_version(
                                         self.filepaths [uifile][1])
                 if patch_version:
                     # file is patched
                     if not patch_version == self.latest_patch_version:
                         if self.verbosity > 1:
                             print('INFO: A newer patch is available. '
                                                         'Installing.')
                         # Try to run function and abort if it fails. This
                         # will prevent g-u from trying the remaining files
                         # in the for loop.
                         # I'm not sure if this is the best way or a good
                         # idea at all.
                         if not self.install_file(uifile):
                             sys.exit(1)
                     else:
                         if self.verbosity > 0:
                             print('Patch is up-to-date.')
                 else:
                     # Only try to install the patched uifile if the backup
                     # succeeded.
                     if self.backup_file(uifile):
                         self.install_file(uifile)
                     else:
                         sys.exit(1)
         if mode == 'undo':
             for uifile in list(self.filepaths.keys()):
                 # Try to run function and abort if it fails. This
                 # will prevent g-u from trying the remaining files
                 # in the for loop.
                 # I'm not sure if this is the best way or a good
                 # idea at all.
                 if not self.restore_file(uifile):
                     sys.exit(1)
예제 #2
0
 def run_action(self, mode, web_static_dir):
     """Call this method to execute the desired action (--patch-tahoe or
     --undo-patch-tahoe). It will run the necessary methods."""
     if self.is_compatible_version:
         if mode == 'patch':
             if is_root():
                 print('WARN: Not installing NEWS.html placeholder (running'
                       ' as root).')
             else:
                 install_news_stub(web_static_dir)
             for uifile in list(self.filepaths.keys()):
                 patch_version = self.read_patch_version(
                     self.filepaths[uifile][1])
                 if patch_version:
                     # file is patched
                     if not patch_version == self.latest_patch_version:
                         if self.verbosity > 1:
                             print('INFO: A newer patch is available. '
                                   'Installing.')
                         # Try to run function and abort if it fails. This
                         # will prevent g-u from trying the remaining files
                         # in the for loop.
                         # I'm not sure if this is the best way or a good
                         # idea at all.
                         if not self.install_file(uifile):
                             sys.exit(1)
                     else:
                         if self.verbosity > 0:
                             print('Patch is up-to-date.')
                 else:
                     # Only try to install the patched uifile if the backup
                     # succeeded.
                     if self.backup_file(uifile):
                         self.install_file(uifile)
                     else:
                         sys.exit(1)
         if mode == 'undo':
             for uifile in list(self.filepaths.keys()):
                 # Try to run function and abort if it fails. This
                 # will prevent g-u from trying the remaining files
                 # in the for loop.
                 # I'm not sure if this is the best way or a good
                 # idea at all.
                 if not self.restore_file(uifile):
                     sys.exit(1)
예제 #3
0
def main():
    """Main function: run selected actions."""

    proxy_support = ProxyHandler({})
    opener = build_opener(proxy_support)
    install_opener(opener)

    # Parse config files and command line arguments
    opts = parse_args(sys.argv)

    # ACTION PARSING AND EXECUTION
    # ============================

    if opts.version:
        print('grid-updates version: %s.' % __version__)
        sys.exit(0)

    # Run actions allowed to root, then exit
    if is_root() and not os.access(opts.tahoe_node_dir, os.W_OK):
        print("WARN: You're running grid-updates as root. Only certain actions "
                "will be available.")
        if opts.patch_ui or opts.undo_patch_ui:
            if not opts.tahoe_node_url:
                print("WARN: --node-url not specified. Defaulting to http://127.0.0.1:3456")
                tahoe_node_url = 'http://127.0.0.1:3456'
            else:
                tahoe_node_url = opts.tahoe_node_url
            webui = PatchWebUI(__patch_version__, tahoe_node_url, opts.verbosity)
            if opts.patch_ui:
                webui.run_action('patch', 'None')
            elif opts.undo_patch_ui:
                webui.run_action('undo', 'None')
        else:
            print("ERROR: Only --patch-tahoe & --undo-patch-tahoe are legal actions for the root account.",
                                                                                              file=sys.stderr)
            sys.exit(1)
        sys.exit(0)

    # Check for at least 1 mandatory option
    if (not opts.merge
    and not opts.sync
    and not opts.news
    and not opts.repair
    and not opts.check_version
    and not opts.download_update
    and not opts.patch_ui
    and not opts.undo_patch_ui
    and not opts.news_source_file):
        print('ERROR: You need to specify an action. Please see %s --help.' %
                sys.argv[0], file=sys.stderr)
        sys.exit(2)

    # conflicting options
    if opts.merge and opts.sync:
        print('ERROR: --merge-introducers & --sync-introducers are '
            'mutually exclusive actions.', file=sys.stderr)
        sys.exit(2)

    # Check Tahoe node dir validity
    if os.access(opts.tahoe_node_dir, os.W_OK):
        web_static_dir = find_web_static_dir(opts.tahoe_node_dir)
        if not web_static_dir:
            sys.exit(1)
    else:
        print("ERROR: Need write access to", opts.tahoe_node_dir,
                file=sys.stderr)
        sys.exit(1)

    tahoe_node_url = set_tahoe_node_url(opts.tahoe_node_url,
                                        opts.tahoe_node_dir)
    if not tahoe_node_url.startswith('http://'):
        tahoe_node_url = 'http://' + tahoe_node_url
    if opts.verbosity > 2:
        print('DEBUG: tahoe_node_url is: %s.' % tahoe_node_url)

    if proxy_configured():
        print("WARNING: Found (and unset) the 'http_proxy' variable.")

    # generate URI dictionary
    uri_dict = {'list': (opts.list_uri,
                                    gen_full_tahoe_uri(
                                            tahoe_node_url,
                                            opts.list_uri)),
                'news': (opts.news_uri,
                                    gen_full_tahoe_uri(
                                            tahoe_node_url,
                                            opts.news_uri)),
                'script': (opts.script_uri,
                                    gen_full_tahoe_uri(
                                            tahoe_node_url,
                                            opts.script_uri)),
                'repairlist': (opts.repairlist_uri,
                                    gen_full_tahoe_uri(
                                            tahoe_node_url,
                                            opts.repairlist_uri))
                }
    # Check URI validity
    for uri in list(uri_dict.values()):
        if not re.match('^URI:', uri[0]):
            print( "'%s' is not a valid Tahoe URI. Aborting." % uri[0])
            sys.exit(1)

    if opts.verbosity > 2:
        print("DEBUG: Tahoe node dir is:", opts.tahoe_node_dir)

    # Run actions
    # -----------
    if opts.merge or opts.sync:
        intlist = Introducers(opts.tahoe_node_dir,
                        uri_dict['list'][1],
                        opts.verbosity)
        if opts.sync:
            intlist.run_action('sync')
        elif opts.merge:
            intlist.run_action('merge')
    if opts.news:
        news = News(opts.tahoe_node_dir,
                    web_static_dir,
                    tahoe_node_url,
                    uri_dict['news'][1],
                    opts.verbosity)
        news.run_action()
    if opts.check_version or opts.download_update:
        update = Update(__version__,
                                opts.output_dir,
                                uri_dict['script'][1],
                                opts.verbosity)
        if opts.check_version:
            update.run_action('check')
        elif opts.download_update:
            update.run_action('download', opts.update_format)
        webui_patch = PatchWebUI(__patch_version__, tahoe_node_url, opts.verbosity)
        webui_patch.patch_update_available()
    if opts.patch_ui or opts.undo_patch_ui:
        webui = PatchWebUI(__patch_version__, tahoe_node_url, opts.verbosity)
        if opts.patch_ui:
            webui.run_action('patch', web_static_dir)
        elif opts.undo_patch_ui:
            webui.run_action('undo', web_static_dir)
    if opts.news_source_file:
        mknews = MakeNews(opts.verbosity)
        mknews.run_action(opts.news_source_file, opts.output_dir)
    if opts.repair:
        repairlist = repairs.RepairList(tahoe_node_url,
                                        uri_dict['repairlist'][1],
                                        opts.verbosity)
        repairlist.run_action()