Example #1
0
def create_user(session: Session, user: User) -> User:
    """
    Create a new user if username isn't already taken.

    :param session: SQLAlchemy database session.
    :type session: Session
    :param user: New user record to create.
    :type user: User

    :return: Optional[User]
    """
    try:
        existing_user = (
            session.query(User).filter(User.username == user.username).first()
        )
        if existing_user is None:
            session.add(user)  # Add the user
            session.commit()  # Commit the change
            LOGGER.success(f"Created user: {user}")
        else:
            LOGGER.warning(f"Users already exists in database: {existing_user}")
        return session.query(User).filter(User.username == user.username).first()
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when creating user: {e}")
        raise e
Example #2
0
def create_post(session: Session, post: Post) -> Post:
    """
    Create a post.

    :param session: SQLAlchemy database session.
    :type session: Session
    :param post: Blog post to be created.
    :type post: Post

    :return: Post
    """
    try:
        existing_post = session.query(Post).filter(Post.slug == post.slug).first()
        if existing_post is None:
            session.add(post)  # Add the post
            session.commit()  # Commit the change
            LOGGER.success(
                f"Created post {post} published by user {post.author.username}"
            )
            return session.query(Post).filter(Post.slug == post.slug).first()
        else:
            LOGGER.warning(f"Post already exists in database: {post}")
            return existing_post
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when creating user: {e}")
        raise e
Example #3
0
def tovala_counter(user_name: str) -> str:
    """
    Keep track of consecutive Tovalas.

    :param str user_name: Name of user reporting a Tovala sighting.

    :returns: str
    """
    try:
        r.hincrby("tovala", user_name, 1)
        r.expire("tovala", 60)
        tovala_users = r.hgetall("tovala")
        tovala_contributors = tally_tovala_sightings_by_user(tovala_users)
        session_total_sightings = total_tovala_sightings(tovala_users)
        standing_total_sightings = get_current_total()
        LOGGER.success(
            f"Saved Tovala sighting to Redis: (tovala, {user_name})")
        return emojize(
            f"\n\n<b>:shallow_pan_of_food: {session_total_sightings} CONSECUTIVE TOVALAS!</b>\n{tovala_contributors}\n:keycap_#: Highest streak: {standing_total_sightings}"
        )
    except RedisError as e:
        LOGGER.error(
            f"RedisError while saving Tovala streak from @{user_name}: {e}")
        return emojize(
            f":warning: my b @{user_name}, broughbert just broke like a littol BITCH :warning:",
            use_aliases=True,
        )
    except Exception as e:
        LOGGER.error(
            f"Unexpected error while saving Tovala streak from @{user_name}: {e}"
        )
        return emojize(
            f":warning: my b @{user_name}, broughbert just broke like a littol BITCH :warning:",
            use_aliases=True,
        )
Example #4
0
    def __call__(self, args=[], stdin=None):  # stdin byte stream

        args = list(filter(lambda x: x != "", args))

        if self.DEBUG_LEVEL > 0 and self.timeout > -1:
            LOGGER.info(self.namespace, f"Setting timeout {self.timeout} {self.path_to_executable} ")

        cmd = ["timeout", f"{self.timeout}"] + [self.path_to_executable] if self.timeout > -1 else [self.path_to_executable]
        p = Popen(cmd + args, stdout=PIPE, stderr=PIPE, stdin=PIPE)


        if stdin is not None:
            p.stdin.write(stdin)

        start = time.time()
        std, err = p.communicate()

        delta = time.time() - start
        if self.debug:
            LOGGER.success(self.namespace, "Command -> %s (%.2f s)" % (self.name, delta))
            LOGGER.info(self.namespace, " ".join([self.path_to_executable] + args))

        rc = p.returncode

        if rc != 0:
            LOGGER.error(self.namespace, "%s %s %s" % (err.decode("utf-8"), rc, std.decode("utf-8")))

            if rc == 124:
                raise TimeoutException()

            raise CallException("Error on stage: %s" % (self.name,), err)

        # Specific implementation process over the std out
        res = self.processInner(std, err)

        if self.debug and self.DEBUG_LEVEL > 0:
            LOGGER.debug(self.namespace, "============================= Command -> %s\n\n" % (self.name,), res)

            if err:
                LOGGER.debug(self.namespace, "stderr \n\n %s \n\n" % (err.decode("utf-8"),))


        return res
Example #5
0
def cleanup_data():
    try:
        session.execute(text("SET FOREIGN_KEY_CHECKS=0;"))
        session.commit()
        session.execute(text("TRUNCATE TABLE comment;"))
        session.commit()
        session.execute(text("TRUNCATE TABLE post;"))
        session.commit()
        session.execute(text("TRUNCATE TABLE user;"))
        session.commit()
        session.execute(text("SET FOREIGN_KEY_CHECKS=1;"))
        session.commit()
        LOGGER.success("Successfully reset all data.")
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when resetting data: {e}")
        raise e
Example #6
0
def orm_delete_user(session: Session, user: User):
    """
    Delete a user if it exists.

    :param session: SQLAlchemy database session.
    :type session: Session
    :param user: User to be deleted.
    :type user: User

    :return: None
    """
    try:
        session.delete(user)  # Delete the user
        session.commit()  # Commit the change
        LOGGER.success(f"Deleted user: {user}")
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when deleting user: {e}")
        raise e
Example #7
0
def create_comment(session: Session, comment: Comment) -> Comment:
    """
    Create a comment posted by `regular_user` on `admin_user`'s post.

    :param session: SQLAlchemy database session.
    :type session: Session
    :param comment: User comment left on published post.
    :type comment: Comment

    :return: Comment
    """
    try:
        session.add(comment)  # Add the Comment
        session.commit()  # Commit the change
        LOGGER.success(f"Created comment {comment} from user {comment.user.username}.")
        return comment
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when creating comment: {e}")
        raise e
Example #8
0
def orm_create_user(session: Session, user: User) -> User:
    """
    Create a new instance of our `User` model.

    :param session: SQLAlchemy database session.
    :type session: Session
    :param user: User data model for creation.
    :type user: User

    :return: User
    """
    try:
        session.add(user)  # Add the user
        session.commit()  # Commit the change
        LOGGER.success(f"Created new user: {user}")
        return user
    except IntegrityError as e:
        LOGGER.error(e.orig)
        raise e.orig
    except SQLAlchemyError as e:
        LOGGER.error(f"Unexpected error when creating user: {e}")
        raise e
Example #9
0
def listen(port, q, program):

    HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
    PORT = port
    result = {}

    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.bind((HOST, PORT))

        LOGGER.info(program, f"Listening...{port}")

        s.listen()
        conn, addr = s.accept()
        with conn:
            LOGGER.success(program, f'Connected by {addr}')
            while True:
                data = conn.recv(1024 << 6)
                data = data.replace('\\'.encode(), '\\\\'.encode()).replace(
                    '\n'.encode(), '\\n'.encode())
                st = f"[{data.decode()[:-1]}]"

                try:
                    js = json.loads(st)

                    for kvpair in js:
                        k, v = kvpair["key"], kvpair["value"]

                        if k not in result:
                            result[k] = []

                        result[k].append(v)
                        q.put([k, v])
                    LOGGER.success(
                        program,
                        f"Populating results...{len(result.keys())} keys")
                    s = np.prod([len(t) for t in result.values()])
                    LOGGER.success(
                        program,
                        f"Populating results...{s} temptative replacements")
                except Exception as e:
                    print(st)
                if not data:
                    break
Example #10
0
    def processLevel(self, levels, program_name, port, bc, OUT_FOLDER, onlybc,
                     meta, outResult):

        pool = ThreadPoolExecutor(
            max_workers=config["DEFAULT"].getint("workers"))

        results = {}

        socket_port = config["souper"].getint("socket_port") + port
        q = queue.Queue()
        for level in levels:

            results[level] = {}

            LOGGER.success(
                program_name,
                "%s: Searching level (increasing execution time) %s: %s souper-workers:%s souper-port:%s"
                % (program_name, level,
                   config["souper"]["souper-level-%s" % level],
                   config["souper"].getint("workers"), socket_port))

            try:
                bctocand = BCCountCandidates(
                    program_name,
                    level=level,
                    souper_workers=config["souper"].getint("workers"),
                    timeout=config["DEFAULT"].getint("exploration-timeout"),
                    socket_port=socket_port)

            except Exception as e:
                LOGGER.error(program_name, traceback.format_exc())
                return
            with ContentToTmpFile(content=bc) as TMP_BC:

                try:

                    serverThread = threading.Thread(
                        target=listen, args=[socket_port, q, program_name])
                    serverThread.start()

                    bctocand(args=[TMP_BC.file], std=None)

                except TimeoutException as e:
                    LOGGER.warning(program_name, f"Timeout reached")

                except Exception as e:
                    LOGGER.error(program_name, traceback.format_exc())
                    raise e

            waitFor = 5
            LOGGER.warning(
                program_name,
                f"Sleeping for {waitFor} seconds waiting for free ports...")
            time.sleep(waitFor)
            while not q.empty():
                i = q.get()
                k, v = i

                if k not in results[level]:
                    results[level][k] = []

                results[level][k].append(v)
        return results
Example #11
0
    def generateVariant(self, job, program_name, merging, port, bc, OUT_FOLDER,
                        onlybc, meta, outResult, current, total):

        if len(job) == 0:
            LOGGER.info(program_name, f"Empty job...")
            return []

        variants = []
        LOGGER.info(program_name, f"Generating {len(job)} variants...")
        r = redis.Redis(host="localhost", port=port)
        for jindex, j in enumerate(job):
            LOGGER.info(
                program_name,
                f"Cleaning previous cache for variant generation...{port}")
            try:
                LOGGER.success(program_name, f"Flushing redis DB...")

                result = r.flushall()
                LOGGER.success(program_name,
                               f"DB flushed away: result({result})")
            except Exception as e:
                LOGGER.error(program_name, traceback.format_exc())

            # Set keys

            name = ""

            try:
                keys = list(merging.keys())
                for k, v in j.items():
                    LOGGER.info(program_name, f"Setting redis db")

                    if v is not None:
                        name += "[%s-%s]" % (keys.index(k),
                                             merging[k].index(v))
                        r.hset(k, "result", v)
                    else:

                        # search for infer word
                        rer = re.compile(r"infer %(\d+)")
                        kl = k
                        if rer.search(kl):
                            r.hset(
                                k, "result",
                                ("result %%%s\n" %
                                 (rer.search(kl).group(1), )).encode("utf-8"))
                        LOGGER.info(program_name,
                                    f"Replacing redundant key-value pair...")

                LOGGER.info(program_name,
                            f"Preparing new variant generation...")

                with ContentToTmpFile(content=bc, LOG_LEVEL=2) as BCIN:
                    tmpIn = BCIN.file
                    with ContentToTmpFile(LOG_LEVEL=2) as BCOUT:
                        tmpOut = BCOUT.file

                        try:
                            sanitized_set_name = name
                            LOGGER.info(
                                program_name,
                                f"Generating variant {sanitized_set_name}...")

                            optBc = BCToSouper(program_name,
                                               level=1,
                                               debug=True,
                                               redisport=port)
                            optBc(args=[tmpIn, tmpOut], std=None)

                            bsOpt = open(tmpOut, 'rb').read()

                            # Generate wasm
                            n = "%s[%s]" % (program_name, sanitized_set_name)
                            hex, size, wasmFile, watFile = self.generateWasm(
                                program_name,
                                bsOpt,
                                OUT_FOLDER,
                                name,
                                debug=True,
                                generateOnlyBc=onlybc)

                            variants.append([
                                hex, n,
                                [[k, v if v is not None else "No replace"]
                                 for k, v in j.items()]
                            ])
                        except Exception as e:
                            LOGGER.error(program_name, traceback.format_exc())
                            raise e
                # call Souper and the linker again
            except Exception as e:
                LOGGER.error(program_name, traceback.format_exc())
            finally:

                LOGGER.info(program_name,
                            "Cleaning cache from variant generation...")

                result = r.flushdb()
                LOGGER.success(program_name,
                               f"Flushing redis DB: result({result})")
                r.close()
        return variants
Example #12
0
    if not os.path.exists(OUT_FOLDER):
        os.mkdir(OUT_FOLDER)


if __name__ == "__main__":

    redis_interfaces = sys.argv[1]
    redisports = [6379]

    if re.compile(r"(,\d+)+").match(redis_interfaces):
        max_workers = len(redis_interfaces.split(",")) - 1
        redisports = [int(t) for t in redis_interfaces.split(",")[1:]]
    else:
        max_workers = 1

    levelPool = ThreadPoolExecutor(
        max_workers=config["DEFAULT"].getint("workers"))

    generationPool = ThreadPoolExecutor(max_workers=max_workers)

    updatesettings(sys.argv[2:-1])

    if not os.path.exists("out"):
        os.mkdir("out")

    RUNTIME_CONFIG["USE_REDIS"] = True

    f = sys.argv[-1]
    LOGGER.success("general", "STARTING")
    main(f, redisports)