def single_files(filename): '''check/update a single file''' '''returns (True, path_in_synctree) if file is different''' if not filename: stderr('missing filename') return (False, None) (obj, err) = synctool_overlay.find_terse(synctool_overlay.OV_OVERLAY, filename) if err == synctool_overlay.OV_FOUND_MULTIPLE: # multiple source possible # possibilities have already been printed sys.exit(1) if err == synctool_overlay.OV_NOT_FOUND: stderr('%s is not in the overlay tree' % filename) return (False, None) verbose('checking against %s' % obj.print_src()) changed = obj.compare_files() if not changed: stdout('%s is up to date' % filename) terse(synctool_lib.TERSE_OK, filename) unix_out('# %s is up to date\n' % obj.print_dest()) return (changed, obj.src_path)
def reference(filename): '''show which source file in the repository synctool chooses to use''' if not filename: stderr('missing filename') return (obj, err) = synctool_overlay.find_terse(synctool_overlay.OV_OVERLAY, filename) if err == synctool_overlay.OV_FOUND_MULTIPLE: # multiple source possible # possibilities have already been printed sys.exit(1) if err == synctool_overlay.OV_NOT_FOUND: stderr('%s is not in the overlay tree' % filename) return print obj.print_src()
def single_task(filename): '''run a single task''' if not filename: stderr('missing task filename') return task_script = filename if task_script[0] != '/': # trick to make find() work for tasks, too task_script = '/' + task_script (obj, err) = synctool_overlay.find_terse(synctool_overlay.OV_TASKS, task_script) if err == synctool_overlay.OV_FOUND_MULTIPLE: # multiple source possible # possibilities have already been printed sys.exit(1) if err == synctool_overlay.OV_NOT_FOUND: stderr("no such task '%s'" % filename) return run_command(obj.src_path) unix_out('')
def diff_files(filename): '''display a diff of the file''' if not synctool_param.DIFF_CMD: stderr('error: diff_cmd is undefined in %s' % synctool_param.CONF_FILE) return synctool_lib.DRY_RUN = True # be sure that it doesn't do any updates (obj, err) = synctool_overlay.find_terse(synctool_overlay.OV_OVERLAY, filename) if err == synctool_overlay.OV_FOUND_MULTIPLE: # multiple source possible # possibilities have already been printed sys.exit(1) if err == synctool_overlay.OV_NOT_FOUND: return if synctool_lib.UNIX_CMD: unix_out('%s %s %s' % (synctool_param.DIFF_CMD, obj.dest_path, obj.src_path)) else: verbose('%s %s %s' % (synctool_param.DIFF_CMD, obj.dest_path, obj.print_src())) sys.stdout.flush() sys.stderr.flush() if use_subprocess: cmd_arr = shlex.split(synctool_param.DIFF_CMD) cmd_arr.append(obj.dest_path) cmd_arr.append(obj.src_path) subprocess.Popen(cmd_arr, shell=False) else: os.system('%s %s %s' % (synctool_param.DIFF_CMD, obj.dest_path, obj.src_path)) sys.stdout.flush() sys.stderr.flush()
def upload(interface, upload_filename, upload_suffix=None): '''copy a file from a node into the overlay/ tree''' if not synctool_param.SCP_CMD: stderr('%s: error: scp_cmd has not been defined in %s' % (os.path.basename(sys.argv[0]), synctool_param.CONF_FILE)) sys.exit(-1) if upload_filename[0] != '/': stderr('error: the filename to upload must be an absolute path') sys.exit(-1) trimmed_upload_fn = upload_filename[1:] # remove leading slash import synctool_overlay # make the known groups lists synctool_config.remove_ignored_groups() synctool_param.MY_GROUPS = synctool_config.get_my_groups() synctool_param.ALL_GROUPS = synctool_config.make_all_groups() if upload_suffix and not upload_suffix in synctool_param.ALL_GROUPS: stderr("no such group '%s'" % upload_suffix) sys.exit(-1) # shadow DRY_RUN because that var can not be used correctly here if '-f' in PASS_ARGS or '--fix' in PASS_ARGS: dry_run = False else: dry_run = True if not synctool_lib.QUIET: stdout('DRY RUN, not uploading any files') terse(synctool_lib.TERSE_DRYRUN, 'not uploading any files') node = NODESET.get_nodename_from_interface(interface) # pretend that the current node is now the given node; # this is needed for find() to find the most optimal reference for the file orig_NODENAME = synctool_param.NODENAME synctool_param.NODENAME = node synctool_config.insert_group(node, node) orig_MY_GROUPS = synctool_param.MY_GROUPS[:] synctool_param.MY_GROUPS = synctool_config.get_my_groups() # see if file is already in the repository (obj, err) = synctool_overlay.find_terse(synctool_overlay.OV_OVERLAY, upload_filename) if err == synctool_overlay.OV_FOUND_MULTIPLE: # multiple source possible # possibilities have already been printed sys.exit(1) if err == synctool_overlay.OV_NOT_FOUND: # no source path found if string.find(upload_filename, '...') >= 0: stderr("%s is not in the repository, don't know what to map this path to\n" "Please give the full path instead of a terse path, or touch the source file\n" "in the repository first and try again" % os.path.basename(upload_filename)) sys.exit(1) # it wasn't a terse path, throw a source path together # This picks the first overlay dir as default source, which may not be correct # but it is a good guess repos_filename = os.path.join(synctool_param.OVERLAY_DIRS[0], trimmed_upload_fn) if upload_suffix: repos_filename = repos_filename + '._' + upload_suffix else: repos_filename = repos_filename + '._' + node # use _nodename as default suffix else: if upload_suffix: # remove the current group suffix an add the specified suffix to the filename arr = string.split(obj.src_path, '.') if len(arr) > 1 and arr[-1][0] == '_': repos_filename = string.join(arr[:-1], '.') repos_filename = repos_filename + '._' + upload_suffix else: repos_filename = obj.src_path synctool_param.NODENAME = orig_NODENAME synctool_param.MY_GROUPS = orig_MY_GROUPS verbose('%s:%s uploaded as %s' % (node, upload_filename, repos_filename)) terse(synctool_lib.TERSE_UPLOAD, repos_filename) unix_out('%s %s:%s %s' % (synctool_param.SCP_CMD, interface, upload_filename, repos_filename)) if dry_run: stdout('would be uploaded as %s' % synctool_lib.prettypath(repos_filename)) else: # first check if the directory in the repository exists repos_dir = os.path.dirname(repos_filename) stat = synctool_stat.SyncStat(repos_dir) if not stat.exists(): verbose('making directory %s' % synctool_lib.prettypath(repos_dir)) unix_out('mkdir -p %s' % repos_dir) synctool_lib.mkdir_p(repos_dir) # make scp command array scp_cmd_arr = shlex.split(synctool_param.SCP_CMD) scp_cmd_arr.append('%s:%s' % (interface, upload_filename)) scp_cmd_arr.append(repos_filename) synctool_lib.run_with_nodename(scp_cmd_arr, NODESET.get_nodename_from_interface(interface)) if os.path.isfile(repos_filename): stdout('uploaded %s' % synctool_lib.prettypath(repos_filename))