PKtHN` processor --stdout--> archive)" ) if self.on_rotate else None logfile = (f' {self.parent.logs_dir / self.svc.name}', "Store logs here") runfile.write(columnize_comments(*filter(None, ( shebang, hash_run, receive, timestamp, rotate, prune, process, logfile )))) runfile.chmod(0o755) def main(): for app in ( EssexCat, EssexDisable, EssexEnable, EssexList, EssexLog, EssexNew, EssexOff, EssexOn, EssexPid, EssexPrint, EssexReload, EssexSignal, EssexStart, EssexStatus, EssexStop, EssexSync, EssexTree, EssexUpgrade ): app.unbind_switches('help-all', 'v', 'version') Essex() if __name__ == '__main__': main() PKtHNHN  essex/essex_complete.py#!/usr/bin/env python3 import shlex from sys import argv from itertools import count from collections import defaultdict from plumbum import local subcommands = ( 'cat', 'disable', 'enable', 'list', 'log', 'new', 'off', 'on', 'pid', 'print', 'reload', 'sig', 'start', 'status', 'stop', 'sync', 'tree', 'upgrade' ) signals = ( 'alrm', 'abrt', 'quit', 'hup', 'kill', 'term', 'int', 'usr1', 'usr2', 'stop', 'cont', 'winch' ) # Declare switches, which take arguments stop_cmds = ('off', 'reload', 'stop', 'sync', 'upgrade') opts = defaultdict(tuple, { sc: ('-f', '--fail-after', '-k', '--kill-after') for sc in stop_cmds }) opts.update({ 'essex': ('-d', '--directory', '-l', '--logs-directory'), 'log': ('-n', '--lines'), 'new': ( '-d', '--working-dir', '-f', '--finish', '-o', '--on-rotate', '-p', '--prune-at', '-r', '--rotate-at', '-u', '--as-user' ) }) # Declare flags, which take no arguments. All svcs have -h, --help hlp = ('-h', '--help') flags = defaultdict(lambda: hlp) flags['cat'] += ('-n', '--no-color') flags['log'] += ('-f', '--follow', '-a', '--all') flags['new'] += ('-e', '--enable') flags['list'] += ('-e', '--enabled') flags['print'] += ('-n', '--no-color') flags['status'] += ('-e', '--enabled') flags['tree'] += ('-q', '--quiet') def get_subcmd(words): subcmd = 'essex' for idx in count(1): if idx == len(words): return subcmd if all(( words[idx] not in (*opts['essex'], *flags['essex']), words[idx - 1] not in opts['essex'], words[idx] in subcommands )): return words[idx] def get_svcs_dir(words, defaults=('./svcs', '~/svcs', '/var/svcs', '/svcs')): for idx in (1, 3): if idx < len(words) and words[idx] in ('-d', '--directory'): return local.path(words[idx + 1]) try: svcs_paths = local.env['SERVICES_PATHS'].split(':') except KeyError: svcs_paths = defaults for folder in map(local.path, svcs_paths): if folder.is_dir(): return folder return local.path(svcs_paths[0]) def get_svcs(words): return tuple(f for f in get_svcs_dir(words) if 'run' in f) def main(): cmd, partial_word, prev_word = argv[1:] line = local.env['COMP_LINE'] suggestions = [] words = shlex.split(line) subcmd = get_subcmd(words) suggestions.extend( opt for opt in (*opts[subcmd], *flags[subcmd]) if opt.startswith(partial_word) ) if prev_word in (*opts[subcmd], *hlp): suggestions.clear() elif subcmd == 'essex': suggestions.extend( sc for sc in subcommands if sc.startswith(partial_word) ) elif subcmd == 'sig' and prev_word == 'sig': suggestions.extend( sig for sig in signals if sig.startswith(partial_word) ) elif subcmd not in ('list', 'new', 'off', 'on', 'tree'): suggestions.extend( svc.name for svc in get_svcs(words) if svc.name.startswith(partial_word) ) if subcmd == 'new' and prev_word in ('-u', '--as-user'): suggestions.extend( line.split(':')[0] for line in local.path('/etc/passwd').read().splitlines() ) print('\n'.join(suggestions)) if __name__ == '__main__': main() PK]o$Nessex/requirements.in# python 3 plumbum PKtHN7Fessex/requirements.txtplumbum==1.6.7 \ --hash=sha256:d143f079bfb60b11e9bec09a49695ce2e55ce5ca0246877bdb0818ab7c7fc312 \ --hash=sha256:df96a5facf621db4a6d682bdc93afa5ed6b107a8667c73c3f0a0f0fab4217c81 PK!H'BM3K&essex-1.2.0.dist-info/entry_points.txtN+I/N.,()O-.Nz`2>9? '$*713 C"PK]o$N|essex-1.2.0.dist-info/LICENSE DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2004 Sam Hocevar Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. PK!HMuSaessex-1.2.0.dist-info/WHEEL HM K-*ϳR03rOK-J,/RH,szd&Y)r$[)T&UD"PK!H[%Pessex-1.2.0.dist-info/METADATAXko7DX'f4[(HQxׂ&XMPrJrdiws#7\`!Ͻ/y&(E[鼲fȟE-\z/lYEںn1ke$W&H7xL?8) >T!}^J`2׶Y#]A?Uj9DL(呖 'I73]a?ŭup#\QC6$ޯG0۩tݻLB%}nJoHv!k>.0 xzۗkNm/a/Z6ҔJcxÄϤ >?l9d>NzE9W^g'Mj5.;|ͷj#f4nuPJM+@_ _򷪔<D–2k[ BcO!qQ5ABC_-I ~~KY^*gPgG*Bt@IXH+Nj)[)ѽߡ~ioTN_8_g?z5CdBgϽM&>⋱OGgg?o%->C EEaɪϲJ 2#q-H 8e0>Q\.`6qU Y4K|w$o:QyY I>f$Y\==:]^]_kXR:2kg/* fŠRJPO(}?+^Fcy={p+4xZk4b[RZYm\qifI[bM&zsmSǁFWOyq#֞,DxWo)8Q}# 5Q|kMpqK/Vͮ@\S*O~Gu'OԴujfAd#+*mn7ץ<@{6w*!\RB#vU7 AmbF ih`빁jKjkZ 8շumK.9 q.)OǨK.o?@A1\>,nFWyt]2 o/(D1 2c\w'.ʤ#e@>;}x?%v