Skip to content
Snippets Groups Projects
Select Git revision
  • 7af0a4b9c83626338904aa46a680810bfa870bfa
  • devel default
  • master
  • fo
  • jirka/typing
  • fo-base
  • mj/submit-images
  • jk/issue-96
  • jk/issue-196
  • honza/add-contestant
  • honza/mr7
  • honza/mrf
  • honza/mrd
  • honza/mra
  • honza/mr6
  • honza/submit-images
  • honza/kolo-vs-soutez
  • jh-stress-test-wip
  • shorten-schools
19 results

org_users.py

Blame
    • Martin Mareš's avatar
      7af0a4b9
      Reforma rozesílání mailů · 7af0a4b9
      Martin Mareš authored
      - Máme obecnou funkci na odeslání mailu účastníkovi. V configu se
        dá nastavit, že všechny maily se přesměrovávají na zadanou adresu.
      
      - Všechny maily logujeme.
      
      - Posílání mailů negeneruje výjimky, nýbrž chyby zapisuje do logu.
      
      - Rozlišujeme mail o založení účtu od mailu o resetu hesla. Je v nich
        stejný odkaz, ale liší se popis situace.
      
      - Odkaz na reset hesla se vytváří v odesílacích funkcích. Proto
        z configu potřebujeme znát URL webu.
      7af0a4b9
      History
      Reforma rozesílání mailů
      Martin Mareš authored
      - Máme obecnou funkci na odeslání mailu účastníkovi. V configu se
        dá nastavit, že všechny maily se přesměrovávají na zadanou adresu.
      
      - Všechny maily logujeme.
      
      - Posílání mailů negeneruje výjimky, nýbrž chyby zapisuje do logu.
      
      - Rozlišujeme mail o založení účtu od mailu o resetu hesla. Je v nich
        stejný odkaz, ale liší se popis situace.
      
      - Odkaz na reset hesla se vytváří v odesílacích funkcích. Proto
        z configu potřebujeme znát URL webu.
    instpect-state.py 4.07 KiB
    #!/usr/bin/env python3
    import sys, os, pathlib
    import subprocess
    import functools
    import argparse
    import tabulate
    
    @functools.cache
    def name_to_path(name, prefix_path=pathlib.Path(".")):
        if name == "":
            if prefix_path.is_dir():
                if (prefix_path/"init.sh").is_file():
                    return prefix_path/"init.sh"
            if prefix_path.is_file():
                return prefix_path
            return None
        name = name.split("-")
        variants = []
        for i in range(1, len(name)+1):
            p = prefix_path/("-".join(name[:i]))
            if p.is_dir() or (p.is_file() and i == len(name)):
                variants.append(("-".join(name[i:]), p))
        # print(name, prefix_path, variants)
        if len(variants) == 0:
            return None
        assert len(variants) == 1, (name, prefix_path, variants)
        return name_to_path(*variants[0])
    
    @functools.cache
    def current_version(name):
        if name_to_path(name) is None: return None
        p = subprocess.run([name_to_path(name), "-v"], encoding="utf-8", check=True, stdout=subprocess.PIPE)
        return p.stdout.strip()
    
    def read(path):
        try:
            with open(path) as f:
                return f.read().strip()
        except FileNotFoundError:
            return None
    
    
    class Log:
        def __init__(self, state_dir, name, logname):
            self.state_dir = state_dir
            self.name = name
            self.logname = logname
            self.dir = state_dir/name/logname
            self.state = read(self.dir/"state")
            self.version = read(self.dir/"version") or "0"
            self.date = read(self.dir/"date")
            self.args = " ".join((read(self.dir/"args") or "").split(" ")[1:])
    
    class Installation:
        def __init__(self, state_dir, name):
            self.state_dir = state_dir
            self.name = name
            self.dir = state_dir/name
    
        @functools.cache
        def last(self):
            l = (self.dir/"last").readlink()
            return Log(self.state_dir, self.name, l)
    
        @functools.cache
        def last_ok(self):
            l = (self.dir/"last").readlink()
            return Log(self.state_dir, self.name, l)
    
        def short(self):
            v = self.last().version
            s = self.last().state
            cv = current_version(self.name)
            v_if_n_curr = v if v != cv else ""
            if s == "ok":
                if v == cv:
                    return f"\033[92mOK\033[39m"
                else:
                    return f"\033[93m{v}\033[39m"
            elif s == "faild":
                return f"\033[91mF{v_if_n_curr}\033[39m"
            elif s == "installing":
                return f"\033[91mI{v_if_n_curr}\033[39m"
            else:
                return f"\033[91m{s} {v_if_n_curr}\033[39m"
    
    
    
    def load_state_dir(state_dir=pathlib.Path("state")):
        out = {}
        for i in state_dir.iterdir():
            if i.is_dir():
                name = i.name
                out[name] = Installation(state_dir, name)
        return out
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--server', '-s', action='store_true')
    
    args = parser.parse_args()
    
    
    if args.server:
        devices = []
        p = pathlib.Path("../userconfig_state")
        for i in p.iterdir():
            device = i.name
            #print(device)
            devices.append((device, load_state_dir(i/"state")))
        devices.sort(key=lambda x: list(reversed(x[0].split("@"))))
        all_names = set()
        for name, i in devices:
            for j in i:
                all_names.add(j)
        all_names = list(all_names)
        all_names.sort()
        table = [[name, current_version(name)] + [i[name].short() if name in i else "." for  dev_name, i in devices] for name in all_names]
        head_mach = ["", "v"]
        head_user = ["", "" ]
        for name, i in devices:
            u, m = name.split("@")
            head_mach.append(m[:5])
            head_user.append("jiklv" if u == "jirikalvoda" else u)
        head = [head_mach, head_user, tabulate.SEPARATING_LINE]
        print(tabulate.tabulate(head+table))
    else:
        local = load_state_dir()
        table = [[name, name_to_path(name), local[name].last().args, current_version(name), local[name].last_ok().version,  local[name].short(), local[name].last().date] for name in sorted(local)]
        print(tabulate.tabulate([["Name", "Path","args", "cv", "iv", "state", "date"], tabulate.SEPARATING_LINE]+table))