diff --git a/eoptasks.py b/eoptasks.py index e036a63..86ac9d9 100755 --- a/eoptasks.py +++ b/eoptasks.py @@ -50,42 +50,52 @@ class Server: return 'ssh %s "%s"' % (self.name, cmd) -servers = [] +def get_servers(): + servers = [] + config = configparser.ConfigParser() + config.read(os.path.join(os.path.expanduser('~/.config/eoptasks.ini'))) + servergroup = config.get('config', 'servergroups', fallback=None) + if servergroup is None: + print("You need to create ~/.config/eoptasks.ini with such a content:\n" + "\n" + " [config]\n" + " servergroups = /home/user/src/puppet/data/servergroups.yaml\n") + sys.exit(1) -config = configparser.ConfigParser() -config.read(os.path.join(os.path.expanduser('~/.config/eoptasks.ini'))) -servergroup = config.get('config', 'servergroups', fallback=None) -if servergroup is None: - print("You need to create ~/.config/eoptasks.ini with such a content:\n" - "\n" - " [config]\n" - " servergroups = /home/user/src/puppet/data/servergroups.yaml\n") - sys.exit(1) + servergroups = yaml.load(open(servergroup))['servergroups'] + for group in servergroups: + for servername in servergroups[group]: + servers.append(Server(servername, group)) + return servers -servergroups = yaml.load(open(servergroup))['servergroups'] -for group in servergroups: - for servername in servergroups[group]: - servers.append(Server(servername, group)) +def parse_args(): + parser = argparse.ArgumentParser() + parser.add_argument('-l', '--list-servers', action='store_true') + parser.add_argument('-k', dest='keywords', type=str) + parser.add_argument('cmd', type=str, nargs='?', default=None) + args = parser.parse_args() + return args -parser = argparse.ArgumentParser() -parser.add_argument('-l', '--list-servers', action='store_true') -parser.add_argument('-k', dest='keywords', type=str) -parser.add_argument('cmd', type=str, nargs='?', default=None) +def filter_servers(servers, args): + selected_servers = [] + if args.keywords: + for keyword in args.keywords.split(','): + keywords = set(keyword.split('/')) + selected_servers.extend([ + x for x in servers + if keywords.issubset(x.keywords) and not x in selected_servers]) + for keyword in args.keywords.split(','): + if keyword.startswith('!') or keyword.startswith('-'): + selected_servers = [x for x in selected_servers if keyword[1:] not in x.keywords] + else: + selected_servers = servers + return selected_servers -args = parser.parse_args() -selected_servers = [] -if args.keywords: - for keyword in args.keywords.split(','): - keywords = set(keyword.split('/')) - selected_servers.extend([ - x for x in servers - if keywords.issubset(x.keywords) and not x in selected_servers]) - for keyword in args.keywords.split(','): - if keyword.startswith('!') or keyword.startswith('-'): - selected_servers = [x for x in selected_servers if keyword[1:] not in x.keywords] -else: - selected_servers = servers +args = parse_args() + +servers = get_servers() +selected_servers = filter_servers(servers, args) if args.list_servers: for server in sorted(selected_servers, key=lambda x: x.name): @@ -100,27 +110,12 @@ if not args.cmd: sys.stderr.write('Missing command\n') sys.exit(1) -cmd = { - 'apt.update': 'sudo apt update', - 'apt.upgrade': 'sudo apt update && sudo apt upgrade -y', - 'collectstatic': '''sudo -u authentic-multitenant authentic2-multitenant-manage collectstatic --noinput; - sudo -u bijoe bijoe-manage collectstatic --noinput; - sudo -u chrono chrono-manage collectstatic --noinput; - sudo -u combo combo-manage collectstatic --noinput; - sudo -u corbo corbo-manage collectstatic --noinput; - sudo -u fargo fargo-manage collectstatic --noinput; - sudo -u hobo hobo-manage collectstatic --noinput; - sudo -u passerelle passerelle-manage collectstatic --noinput; - sudo -u wcs wcs-manage collectstatic; - /bin/true'''.replace('\n', ''), -}.get(args.cmd, args.cmd) +def init_tmux_session(): + tmux_session_name = 's%s' % random.randrange(1000) + os.system('tmux new-session -s %s -n 🌑 -d /bin/bash -c "sleep 2h"' % tmux_session_name) + return tmux_session_name -tmux_session_name = 's%s' % random.randrange(1000) -os.system('tmux new-session -s %s -n 🌑 -d /bin/bash -c "sleep 2h"' % tmux_session_name) -tmux = libtmux.Server() -session = tmux.find_where({'session_name': tmux_session_name}) -status_window = session.attached_window -status_window.attached_pane.send_keys('eoptasks\n ', enter=False) +tmux_session_name = init_tmux_session() pid = os.fork() if pid: @@ -130,6 +125,27 @@ else: return re.match(r'(.*?)(\d*)$', server_name).group(1).replace( '.rbx.', '.loc.').replace('.gra.', '.loc.').replace('.sbg.', '.loc.') + tmux = libtmux.Server() + session = tmux.find_where({'session_name': tmux_session_name}) + + cmd = { + 'apt.update': 'sudo apt update', + 'apt.upgrade': 'sudo apt update && sudo apt upgrade -y', + 'collectstatic': '''sudo -u authentic-multitenant authentic2-multitenant-manage collectstatic --noinput; + sudo -u bijoe bijoe-manage collectstatic --noinput; + sudo -u chrono chrono-manage collectstatic --noinput; + sudo -u combo combo-manage collectstatic --noinput; + sudo -u corbo corbo-manage collectstatic --noinput; + sudo -u fargo fargo-manage collectstatic --noinput; + sudo -u hobo hobo-manage collectstatic --noinput; + sudo -u passerelle passerelle-manage collectstatic --noinput; + sudo -u wcs wcs-manage collectstatic; + /bin/true'''.replace('\n', ''), + }.get(args.cmd, args.cmd) + + status_window = session.attached_window + status_window.attached_pane.send_keys('eoptasks\n ', enter=False) + total_number = len(selected_servers) random.shuffle(selected_servers) while selected_servers: @@ -158,4 +174,10 @@ else: status_window.rename_window('🌒') while len(session.list_windows()) > 1: time.sleep(0.1) - status_window.kill_window() + try: + status_window.kill_window() + except libtmux.exc.LibTmuxException: + # killing the last window will end the tmux session, and it's not + # handled correctly by kill_window as it ends by updating the list + # of windows (and hitting the dead tmux). + pass