def source(rcfile, clean=False, update=False): assert_shell_perms('source') pipe = Popen("env -i sh -c 'set -a && source %s && env'" % rcfile, stdout=PIPE, shell=True) data = pipe.communicate()[0] env = dict((line.decode().split("=", 1) for line in data.splitlines())) cleanup_env(env) return env
def sed_find_block(open_st, close_st, src): assert_shell_perms('sed') pattern = f'/{open_st}/,/{close_st}/p' cmd = f'gsed -n "{pattern}" {src}' res = sed_fcmd(cmd, src) if res: ok(f'Found block {open_st}') else: err(f'Did not find block {open_st}') return True if res else False
def sed_replace_kv(key, new_val, src): assert_shell_perms('sed') quotes = '([\'\\"])?' #tricky use quote if found pattern = fr's|^\s*(export )?{key}\={quotes}[^=]*$|\1{key}=\2{new_val}\2|' cmd = fr'gsed -r -i.bak "{pattern}" {src}' res = sed_fcmd(cmd, src) info( f' Replacing key[{key}] with value[{new_val}] on {src} {res.decode()}')
def sed_add_line(line, src, force=False): assert_shell_perms('sed') out_str = (f"{line}{NL}") found = False if force or not found: with open(src, "a") as dest: dest.write(out_str) else: warn('Line already found. Not adding!')
def sed_insert_file_where(where, insert, src): assert_shell_perms('sed') pattern = f'/{where}/r {insert}' cmd = f'gsed -e "{pattern}" -e /{where}/d {src}' res = sed_fcmd(cmd, src) src_new = f'{src}.new' with open(src_new, 'wb') as dest: dest.write(res) info(f' Attempting insert of [{where}] on {src}') rename_file(src_new, src)
def sed_add_block(open_st, close_st, data, src, force=False): assert_shell_perms('sed') #add date string to data prior to add block out_str = (f"{NL}{open_st}{NL}" f"{data}{NL}" f"{close_st}{NL}") found = sed_find_block(open_st, close_st, src) if force or not found: with open(src, "a") as dest: dest.write(out_str) else: warn('Block already found. Not adding!')
def unit_test(): try: assert_shell_perms('mv') file1='../../inf/.testrc' file2='../../inf/.include' dir1='../../inf/' print(path_type(dir1)) print(path_type(file1)) print(path_type('./moo')) return 0 except KeyboardInterrupt: info('\nDone')
def unit_test(): try: assert_shell_perms('sed') file = '../../inf/.testrc' file2 = '../../inf/.include' sed_delete_block('# ----test:str---- #', '# ----test:end---- #', file) sed_replace_kv('VAL2', 'moop', file) sed_replace_kv('VAL3', 'soop', file) sed_replace_kv('XY', '999', file) print(line_comment('hey girl', 'js')) print(line_marker('hello', 'sh')[0]) print(line_marker('hello', 'sh')[1]) sed_find_block(*line_marker('test', 'sh'), file) date_st = date_comment('sh', 'Last Updated') sed_add_block( *line_marker('hey girl', 'sh'), f'''{date_st}{NL} # you know I like that pussy ''', file, False) sed_insert_file_where('\#include_me', file2, file) sed_add_block(*line_marker('test', 'sh'), f'''{date_st}{NL} # next ''', file, False) sed_find_block(*line_marker('test', 'sh'), file) #sed_delete_line("#happy pussy",file) sed_add_line(f'#include_me', file) return 0 except KeyboardInterrupt: info('\nDone')
def sed_delete_line(line, src): assert_shell_perms('sed') cmd = f'gsed -i.bak "s|{line}||gi" {src}' res = sed_fcmd(cmd, src) info(f' Deleting line [{line}] on {src} {res.decode()}')
def rem_file(src): try: assert_shell_perms('rm') if is_file(src): remove(src) except FileNotFoundError as e: err(f'File [{src}] does not exist.')
def rename_file(src,dest): try: assert_shell_perms('rename') rename(src,dest) except FileNotFoundError as e: pass
def copy_file(src,dest): try: assert_shell_perms('mv') except FileNotFoundError as e: pass
def find_cmd(cmd, src, **options): assert_shell_perms('find')
def grep_cmd(cmd, src, **options): assert_shell_perms('grep')
def sed_delete_block(open_st, close_st, src, verify=False): assert_shell_perms('sed') pattern = f'/{open_st}/,/{close_st}/d' cmd = f'gsed -i.bak "{pattern}" {src}' res = sed_fcmd(cmd, src) info(f' Deleting block [{open_st}] on {src} {res.decode()}')
def sed_fcmd(cmd, src, **options): assert_shell_perms('sed') assert_file_exists(src) res = check_output([f'{cmd}'], shell=True) rem_file(f'{src}.bak') return res
def sed_esc(st): assert_shell_perms('sed') pattern = r"s/[^^]/[&]/g; s/\^/\\^/g; $!a\'$'\n''\\n" cmd = f'sed -e "{pattern}" <<< "{st}" | tr -d "\n"' res = check_output([f'{cmd}'], shell=True) return res