def infocalypse_pull(ui_, repo, **opts): """ Pull from an Infocalypse repository in Freenet. """ params, stored_cfg = get_config_info(ui_, opts) request_uri = '' if opts['hash']: # Use FMS to lookup the uri from the repo hash. if opts['uri']: ui_.warn("Ignoring --uri because --hash is set!\n") if len(opts['hash']) != 1: raise util.Abort("Only one --hash value is allowed.") params['FMSREAD_HASH'] = opts['hash'][0] params['FMSREAD_ONLYTRUSTED'] = bool(opts['onlytrusted']) request_uri = get_uri_from_hash(ui_, repo, params, stored_cfg) elif opts['wot']: import wot truster = get_truster(ui_, repo, opts['truster'], fcpport=opts["fcpport"], fcphost=opts["fcphost"]) request_uri = wot.resolve_pull_uri(ui_, opts['wot'], truster, repo, fcphost=opts['fcphost'], fcpport=opts['fcpport']) elif opts['uri']: request_uri = parse_repo_path(opts['uri']) if not request_uri: request_uri = stored_cfg.get_request_uri(repo.root) if not request_uri: ui_.warn("There is no stored request URI for this repo.\n" "Please set one with the --uri option.\n") return params['REQUEST_URI'] = request_uri # Hmmmm... can't really implement rev. execute_pull(ui_, repo, params, stored_cfg)
def infocalypse_push(ui_, repo, **opts): """ Push to an Infocalypse repository in Freenet. """ params, stored_cfg = get_config_info(ui_, opts) if not opts['uri']: insert_uri = stored_cfg.get_dir_insert_uri(repo.root) if not insert_uri: ui_.warn("There is no stored insert URI for this repo.\n" "Please set one with the --uri option.\n") return else: insert_uri = parse_repo_path(opts['uri']) set_target_version(ui_, repo, opts, params, "Only pushing to version(s): %s\n") params['INSERT_URI'] = insert_uri #if opts['requesturi'] != '': # # DOESN'T search the insert uri index. # ui_.status(("Copying from:\n%s\nTo:\n%s\n\nThis is an " # + "advanced feature. " # + "I hope you know what you're doing.\n") % # (opts['requesturi'], insert_uri)) # params['REQUEST_URI'] = opts['requesturi'] inserted_to = execute_push(ui_, repo, params, stored_cfg) request_uri = stored_cfg.get_request_uri(repo.root) associated_wot_id = stored_cfg.get_wot_identity(request_uri) if inserted_to and associated_wot_id: import wot from wot_id import Local_WoT_ID local_id = Local_WoT_ID('@' + associated_wot_id) wot.update_repo_listing(ui_, local_id, fcphost=opts["fcphost"], fcpport=opts["fcpport"])
def infocalypse_reinsert(ui_, repo, **opts): """ Reinsert the current version of an Infocalypse repository. """ params, stored_cfg = get_config_info(ui_, opts) if not opts['uri']: request_uri = stored_cfg.get_request_uri(repo.root) if not request_uri: ui_.warn("There is no stored request URI for this repo.\n" "Do a fn-pull from a repository USK and try again.\n") return else: request_uri = parse_repo_path(opts['uri']) level = opts['level'] if level < 1 or level > 5: ui_.warn("level must be 1,2,3,4 or 5.\n") return insert_uri = stored_cfg.get_dir_insert_uri(repo.root) if not insert_uri: if level == 1 or level == 4: ui_.warn(("You can't re-insert at level %i without the " + "insert URI.\n") % level) return ui_.status("No insert URI. Will skip re-insert of top key.\n") insert_uri = None params['INSERT_URI'] = insert_uri params['REQUEST_URI'] = request_uri params['REINSERT_LEVEL'] = level execute_reinsert(ui_, repo, params, stored_cfg)
def infocalypse_copy(ui_, repo, **opts): """ Copy an Infocalypse repository to a new URI. """ params, stored_cfg = get_config_info(ui_, opts) if not opts['inserturi']: # REDFLAG: fix parameter definition so that it is required? ui_.warn("Please set the insert URI with --inserturi.\n") return else: insert_uri = parse_repo_path(opts['inserturi']) if not opts['requesturi']: request_uri = stored_cfg.get_request_uri(repo.root) if not request_uri: ui_.warn("There is no stored request URI for this repo.\n" "Please set one with the --requesturi option.\n") return else: request_uri = parse_repo_path(opts['requesturi']) params['INSERT_URI'] = insert_uri params['REQUEST_URI'] = request_uri execute_copy(ui_, repo, params, stored_cfg)
def infocalypse_create(ui_, repo, local_identity=None, **opts): """ Create a new Infocalypse repository in Freenet. :type local_identity: Local_WoT_ID :param local_identity: If specified the new repository is associated with that identity. """ params, stored_cfg = get_config_info(ui_, opts) if opts['uri'] and opts['wot']: ui_.warn("Please specify only one of --uri or --wot.\n") return elif opts['uri']: insert_uri = parse_repo_path(opts['uri']) elif opts['wot']: opts['wot'] = parse_repo_path(opts['wot']) nick_prefix, repo_name, repo_edition = opts['wot'].split('/', 2) if not repo_name.endswith('.R1') and not repo_name.endswith('.R0'): ui_.warn("Warning: Creating repository without redundancy. (R0 or" " R1)\n") from wot_id import Local_WoT_ID local_identity = Local_WoT_ID(nick_prefix) insert_uri = local_identity.insert_uri.clone() insert_uri.name = repo_name insert_uri.edition = repo_edition # Before passing along into execute_create(). insert_uri = str(insert_uri) else: ui_.warn("Please set the insert key with either --uri or --wot.\n") return # This is a WoT repository. if local_identity: # Prompt whether to replace in the case of conflicting names. from wot import build_repo_list request_usks = build_repo_list(ui_, local_identity) names = map(lambda x: USK(x).get_repo_name(), request_usks) new_name = USK(insert_uri).get_repo_name() if new_name in names: replace = ui_.prompt("A repository with the name '{0}' is already" " published by {1}. Replace it? [y/N]" .format(new_name, local_identity), default='n') if replace.lower() != 'y': raise util.Abort("A repository with this name already exists.") # Remove the existing repository from each configuration section. existing_usk = request_usks[names.index(new_name)] existing_dir = None for directory, request_usk in stored_cfg.request_usks.iteritems(): if request_usk == existing_usk: if existing_dir: raise util.Abort("Configuration lists the same " "request USK multiple times.") existing_dir = directory assert existing_dir existing_hash = normalize(existing_usk) # Config file changes will not be written until a successful insert # below. del stored_cfg.version_table[existing_hash] del stored_cfg.request_usks[existing_dir] del stored_cfg.insert_usks[existing_hash] del stored_cfg.wot_identities[existing_hash] # Add "vcs" context. No-op if the identity already has it. msg_params = {'Message': 'AddContext', 'Identity': local_identity.identity_id, 'Context': 'vcs'} import fcp import wot node = fcp.FCPNode(**wot.get_fcpopts(fcphost=opts["fcphost"], fcpport=opts["fcpport"])) atexit.register(node.shutdown) vcs_response =\ node.fcpPluginMessage(plugin_name="plugins.WebOfTrust.WebOfTrust", plugin_params=msg_params)[0] if vcs_response['header'] != 'FCPPluginReply' or\ 'Replies.Message' not in vcs_response or\ vcs_response['Replies.Message'] != 'ContextAdded': raise util.Abort("Failed to add context. Got {0}\n.".format( vcs_response)) set_target_version(ui_, repo, opts, params, "Only inserting to version(s): %s\n") params['INSERT_URI'] = insert_uri inserted_to = execute_create(ui_, repo, params, stored_cfg) if inserted_to and local_identity: # creation returns a list of request URIs; use the first. stored_cfg.set_wot_identity(inserted_to[0], local_identity) Config.to_file(stored_cfg) import wot wot.update_repo_listing(ui_, local_identity, fcphost=opts["fcphost"], fcpport=opts["fcpport"])
def infocalypse_create(ui_, repo, local_identity=None, **opts): """ Create a new Infocalypse repository in Freenet. :type local_identity: Local_WoT_ID :param local_identity: If specified the new repository is associated with that identity. """ params, stored_cfg = get_config_info(ui_, opts) if opts['uri'] and opts['wot']: ui_.warn("Please specify only one of --uri or --wot.\n") return elif opts['uri']: insert_uri = parse_repo_path(opts['uri']) elif opts['wot']: opts['wot'] = parse_repo_path(opts['wot']) nick_prefix, repo_name, repo_edition = opts['wot'].split('/', 2) if not repo_name.endswith('.R1') and not repo_name.endswith('.R0'): ui_.warn("Warning: Creating repository without redundancy. (R0 or" " R1)\n") from wot_id import Local_WoT_ID local_identity = Local_WoT_ID(nick_prefix) insert_uri = local_identity.insert_uri.clone() insert_uri.name = repo_name insert_uri.edition = repo_edition # Before passing along into execute_create(). insert_uri = str(insert_uri) else: ui_.warn("Please set the insert key with either --uri or --wot.\n") return # This is a WoT repository. if local_identity: # Prompt whether to replace in the case of conflicting names. from wot import build_repo_list request_usks = build_repo_list(ui_, local_identity) names = map(lambda x: USK(x).get_repo_name(), request_usks) new_name = USK(insert_uri).get_repo_name() if new_name in names: replace = ui_.prompt("A repository with the name '{0}' is already" " published by {1}. Replace it? [y/N]".format( new_name, local_identity), default='n') if replace.lower() != 'y': raise util.Abort("A repository with this name already exists.") # Remove the existing repository from each configuration section. existing_usk = request_usks[names.index(new_name)] existing_dir = None for directory, request_usk in stored_cfg.request_usks.iteritems(): if request_usk == existing_usk: if existing_dir: raise util.Abort("Configuration lists the same " "request USK multiple times.") existing_dir = directory assert existing_dir existing_hash = normalize(existing_usk) # Config file changes will not be written until a successful insert # below. del stored_cfg.version_table[existing_hash] del stored_cfg.request_usks[existing_dir] del stored_cfg.insert_usks[existing_hash] del stored_cfg.wot_identities[existing_hash] # Add "vcs" context. No-op if the identity already has it. msg_params = { 'Message': 'AddContext', 'Identity': local_identity.identity_id, 'Context': 'vcs' } import fcp import wot node = fcp.FCPNode(**wot.get_fcpopts(fcphost=opts["fcphost"], fcpport=opts["fcpport"])) atexit.register(node.shutdown) vcs_response =\ node.fcpPluginMessage(plugin_name="plugins.WebOfTrust.WebOfTrust", plugin_params=msg_params)[0] if vcs_response['header'] != 'FCPPluginReply' or\ 'Replies.Message' not in vcs_response or\ vcs_response['Replies.Message'] != 'ContextAdded': raise util.Abort( "Failed to add context. Got {0}\n.".format(vcs_response)) set_target_version(ui_, repo, opts, params, "Only inserting to version(s): %s\n") params['INSERT_URI'] = insert_uri inserted_to = execute_create(ui_, repo, params, stored_cfg) if inserted_to and local_identity: # creation returns a list of request URIs; use the first. stored_cfg.set_wot_identity(inserted_to[0], local_identity) Config.to_file(stored_cfg) import wot wot.update_repo_listing(ui_, local_identity, fcphost=opts["fcphost"], fcpport=opts["fcpport"])