Commits

Jacek Bzdak committed d564573

Bdchecker w nowym repo

Comments (0)

Files changed (6)

+//**py[co]
+**__pycache__
+.idea/**
+pyro.log
+__author__ = 'jb'

bd_checker_settings.py

+__author__ = 'jb'
+
+HOST = "localhost"
+PORT = "3000"
+USE_PYRO = True
+HMAC_KEY = b"""
+0}"^jpyK;qJ_A3la(1T:PHDIL[?Fm&Qy[BF<S"gL-k'1><[xh!j}<&u}W"}qPmxKokZgfQzpYF!z:sazN/VICsv:1_}<q#wGlrC|7,,"jXZE&FF4L+[zy:A_XAMamBMBd\,I92yc8O4HLG3AxUxqRDy(k3.$2ESz&Y@ABj9om*cl}mYED-Ak`iN+!b],ey]V`{A6 d%@+x/ax4OQ-k+7/IL)f|~1<I,2@63GiB LM$~>c/C*(AlnxYdAMOe~W*Bo<FrVX+7l^F<~5f]"#wC b($xfW<yc9L!g=Z,$sG_n}eQ0#@4jaAb]Wd(Qqbe6'G:@BJ)D@IUJHYS8my`CUKgp8qH`:T-~bLKACS$oDFG#iZ;S=|8-;gVU*LQG+yA&oxBzWb*u#|3|bz!.}+cT[@~nTES+DKhV-q9jb@ +x"&(1eH=W(A}Cm1:zX{&'5xhe(7FtGT7ML10b{_x]>#r4NTn|]3Ky~OQeky]smUrQs}oM,|,c>L!YkJH@Mh#/t+blu?
+""".strip()

bd_checker_settings_prod.py

+__author__ = 'jb'
+
+HOST = "lfitj.if.pw.edu.pl"
+PORT = "3000"
+USE_PYRO = True
+HMAC_KEY = b"""
+0}"^jpyK;qJ_A3la(1T:PHDIL[?Fm&Qy[BF<S"gL-k'1><[xh!j}<&u}W"}qPmxKokZgfQzpYF!z:sazN/VICsv:1_}<q#wGlrC|7,,"jXZE&FF4L+[zy:A_XAMamBMBd\,I92yc8O4HLG3AxUxqRDy(k3.$2ESz&Y@ABj9om*cl}mYED-Ak`iN+!b],ey]V`{A6 d%@+x/ax4OQ-k+7/IL)f|~1<I,2@63GiB LM$~>c/C*(AlnxYdAMOe~W*Bo<FrVX+7l^F<~5f]"#wC b($xfW<yc9L!g=Z,$sG_n}eQ0#@4jaAb]Wd(Qqbe6'G:@BJ)D@IUJHYS8my`CUKgp8qH`:T-~bLKACS$oDFG#iZ;S=|8-;gVU*LQG+yA&oxBzWb*u#|3|bz!.}+cT[@~nTES+DKhV-q9jb@ +x"&(1eH=W(A}Cm1:zX{&'5xhe(7FtGT7ML10b{_x]>#r4NTn|]3Ky~OQeky]smUrQs}oM,|,c>L!YkJH@Mh#/t+blu?
+""".strip()

foo

Empty file removed.
+#!/usr/bin/env python3
+
+import bd_checker_settings
+
+import sys
+import os
+import argparse
+import shelve
+import hashlib
+import datetime
+
+settings_dir = os.path.join(os.path.expanduser("~"), '.bd_tests_run')
+
+if not os.path.exists(settings_dir):
+    os.mkdir(settings_dir)
+
+database = shelve.open(os.path.join(settings_dir, "passdb"))
+
+from argparse import ArgumentParser
+
+import getpass
+
+
+class DataPackage(object):
+    def __init__(self, user_id_1, user_id_2, user_pass_1, user_pass_2, unit_no,
+                 task_no, super_password, args, kwargs):
+        super().__init__()
+        self.user_id_1 = user_id_1
+        self.user_id_2 = user_id_2
+        self.user_pass_1 = user_pass_1
+        self.user_pass_2 = user_pass_2
+        self.unit_no = unit_no
+        self.task_no = task_no
+        self.super_password = super_password
+        self.args = args
+        self.kwargs = kwargs
+
+
+class SplitArgument(argparse._AppendAction):
+
+    def __call__(self, parser, namespace, values, option_string=None):
+        super(SplitArgument, self).__call__(
+            parser,
+            namespace,
+            values.split('='),
+            option_string
+        )
+
+
+def is_check_needed(user_id, unit_no, task_no):
+    sha = hashlib.sha256()
+    sha.update("{}.{}.{}".format(user_id, unit_no, task_no).encode("utf8"))
+    return int(sha.hexdigest(), 16) % 10 == 0
+
+parser = ArgumentParser()
+subparsers = parser.add_subparsers()
+
+parser.add_argument("--user_id", required="USER_ID_1" not in os.environ,
+                          default= os.environ.get("USER_ID_1", None),
+                          help="Nazwa pierwszego użytkownika. Można ominąć po ustawieniu zmiennej środowiskowej USER_ID_1")
+
+parser.add_argument("--force_super_check", required=False,
+                    default=False,
+                    help="Wymusza sprawdzenie przez prowadzącego")
+
+parser.add_argument("--user_id_2", required=False,
+                    default=os.environ.get("USER_ID_2", None),
+                    help="Nazwa pierwszego użytkownika. Można ominąć po ustawieniu zmiennej środowiskowej USER_ID_2")
+
+parser.add_argument("--unit_no", required="UNIT_NO" not in os.environ, type=int,
+                          default=int(os.environ.get("UNIT_NO", "1")),
+                          help="Numer zajęć, rozpoczynając od 1. Możesz ominąć po ustawieniu zmiennej UNIT_NO")
+
+parser.add_argument("--task_no", required=True, type=int,
+                          help="Numer zadania, rozpoczynając od 1")
+
+check_parser = subparsers.add_parser("check", help="Wykonuje zadanie")
+check_parser.set_defaults(action = "check")
+
+check_parser.add_argument("--file", action=SplitArgument,
+                         help="Podaj plik do sprawdzenia, składnia "
+                                "tego polecenia jest taka że podajesz "
+                                "nazwa=ścieżka. Na przykład "
+                                "--file pm_10=/tmp/pm10.csv")
+check_parser.add_argument("--arg", action=SplitArgument,
+                         help="Podaje coś co nie jest plikiem do "
+                               "sprawdzenia. składnia "
+                               "tego polecenia jest taka że podajesz "
+                               "nazwa=ścieżka. Na przykład "
+                               "--arg foo=5.1")
+
+query = subparsers.add_parser("query", help = "Kasuje bazę danych zapamiętanych haseł")
+
+query.set_defaults(action="query")
+
+set_password = subparsers.add_parser("set_password")
+set_password.set_defaults(action="set_password")
+
+clear_cache = subparsers.add_parser("clear_cache")
+clear_cache.set_defaults(action="clear_cache")
+
+show_marks = subparsers.add_parser("show_marks")
+show_marks.set_defaults(action="show_marks")
+show_marks.add_argument("--details", action="store_true", default=False)
+
+
+def _read_password_from_user(user_id, unit_id=None):
+    password = getpass.getpass("Podaj hasło dla użytkownika {}: ".format(
+        user_id))
+    hasher = hashlib.sha256()
+    key = "{}.{:%Y-%m-%d}.{}".format(
+        unit_id, datetime.date.today(), password).encode("utf-8")
+    hasher.update(key)
+
+    if unit_id:
+        data = {}
+        if user_id in database:
+            data = database[user_id]
+        data[str(unit_id)] = {
+            "digest": hasher.hexdigest(),
+            "date": datetime.date.today()
+        }
+        database[str(user_id)] = data
+        database.sync()
+        return {
+            "digest": hasher.hexdigest(),
+            "date": datetime.date.today()
+        }
+
+    return password
+
+
+def _read_password_from_db(user_id, unit_id):
+    try:
+        pass_dict = database[str(user_id)][str(unit_id)]
+        if datetime.date.today() - pass_dict["date"] \
+                < datetime.timedelta(days=3) and False:
+            return pass_dict
+    except (KeyError, TypeError):
+        pass
+    return None
+
+
+def get_password(user_id, unit_id=None):
+    if unit_id is not None and _read_password_from_db(user_id, unit_id):
+        return _read_password_from_db(user_id, unit_id)
+    return _read_password_from_user(user_id, unit_id)
+
+
+def create_pyro_proxy():
+    import Pyro4
+    Pyro4.config.HMAC_KEY = bd_checker_settings.HMAC_KEY
+    uri = "PYRO:executor@{}:{}".format(bd_checker_settings.HOST,
+                                       bd_checker_settings.PORT)
+    print(uri)
+    return Pyro4.Proxy(uri)
+
+
+def do_magic():
+
+    args = parser.parse_args()
+
+    arg_dict = {}
+    if args.action == "show_marks":
+        password = get_password(args.user_id)
+        if args.details:
+            print("Pierwsza kolumna: zajęcia, druga: zadanie, ocena")
+        else:
+            print("Pierwsza kolumna: zajęcia, druga suma ocen za zasdania. "
+                  "Proszę samodzielnie podzielić przez ilość zadań "
+                  "do wykonania")
+        proxy = create_pyro_proxy()
+        results = proxy.show_marks(args.user_id, password, args.details)
+        for row in results:
+            print(row)
+        return
+
+    if args.action == "clear_cache":
+        database.clear()
+        database.close()
+        return
+
+    super_password = None
+    #
+    # if (is_check_needed(args.user_id, args.unit_no, args.task_no) or
+    #     is_check_needed(args.user_id, args.unit_no, args.task_no) or
+    #     args.force_super_check):
+    #     print("To zadanie (wyznaczone losowo) wymaga akceptacji prowadzącego")
+    #     super_password = getpass.getpass("Hasło prowadzącego:")
+
+    if args.action == 'check':
+
+        if args.file:
+            for name, file_name in args.file:
+                with open(file_name) as f:
+                    arg_dict[name] = f.read()
+
+        if args.arg:
+            arg_dict.update(dict(args.arg))
+
+    elif  args.action == 'query':
+        query = []
+        line = ""
+
+        print("Podaj zapytanie (może mieć wiele linii, zakończ pustą linią)")
+        line = sys.stdin.readline()
+        while len(line) > 1:
+            # print(len(line))
+            query.append(line)
+            line = sys.stdin.readline()
+        arg_dict['query'] = "".join(query)
+
+    pack = DataPackage(
+        args.user_id,
+        args.user_id_2,
+        None,
+        None,
+        args.unit_no,
+        args.task_no,
+        super_password,
+        [],
+        arg_dict
+    )
+
+    if not bd_checker_settings.USE_PYRO:
+        from bdchecker.unit_util import execute_test_checker
+        passes, mark, result = execute_test_checker(pack)
+    else:
+
+        proxy = create_pyro_proxy()
+        try:
+            passes, mark, result = proxy.execute_test_checker(pack.__dict__)
+        finally:
+            del proxy
+
+    if result:
+        print(result)
+
+    if passes:
+        print("Zadanie zaliczone z oceną {}".format(mark/2.0))
+    else:
+        print("Zadanie nie zaliczone")
+
+    print("Oceniono {} i {}".format(args.user_id, args.user_id_2))
+
+
+if __name__ == "__main__":
+    do_magic()