コード例 #1
0
def load_functions():
    """Load functions data to database."""

    print "Functions"

    # delete modules before data gets added to avoid duplicate info
    # Function.query.delete()

    # insert data from seed_function
    with open("seed_data/seed_function") as function_data:
        for row in function_data:
            name, description, additional_info, sample_code, output, user_id, module_id = row.rstrip(
            ).split("|")
            function = Function(name=name,
                                description=description,
                                additional_info=additional_info,
                                sample_code=sample_code,
                                output=output,
                                user_id=user_id,
                                module_id=module_id)

            # add function to session
            db.session.add(function)

    # commit changes
    db.session.commit()

    print "Function loaded."
コード例 #2
0
ファイル: analyzer.py プロジェクト: blockide/BlockIDE-qira
def make_function_at(static, addr):
    if static[addr]['function'] != None:
        # already function
        return
    rc = static.r2core
    rc.cmd("af @ %d" % (addr, ))
    this_function = Function(addr)
    static['functions'].add(this_function)

    info = rc.cmd_json("afj %d" % (addr, ))[0]
    callrefs = info['callrefs']
    for ref in callrefs:
        if ref["type"] == "J":
            static[ref['addr']]['crefs'].add(addr)
        if ref["type"] == "C":
            static[ref['addr']]['xrefs'].add(addr)

    function_details = rc.cmd_json("pdfj @ %d" % addr)
    if function_details['addr'] == addr:
        for opcode in function_details['ops']:
            static[opcode['offset']]['function'] = this_function
            i = static[opcode['offset']]['instruction']

    addr_re = re.compile(r'\| (0x[a-f0-9]+) ')
    blocks = rc.cmd_json("agj %d" % addr)[0]['blocks']
    for block in blocks:
        this_block = Block(block['offset'])
        this_function.add_block(this_block)
        for op in block['ops']:
            address = op['offset']
            this_block.add(address)
            static[address]['block'] = this_block
        static['blocks'].add(this_block)
コード例 #3
0
def test_function_definition():
    scope = Scope()
    func = Function(['a', 'b'],
                    [BinaryOperation(Reference('a'), '+', Reference('b'))])
    func_def = FunctionDefinition('sum', func)
    assert func_def.evaluate(scope) == func
    assert scope['sum'] == func
コード例 #4
0
def apply_unifier(a, unifier):
    """Apply unifier to atom/function."""
    if bool(unifier):
        new_terms = []
        for term in a.terms:
            if isinstance(term, Constant):
                new_terms.append(term)
            elif isinstance(term, Variable):
                if term in unifier:
                    new_terms.append(unifier.get(term))
                else:
                    return False
            elif isinstance(term, Function):
                new_terms.append(apply_unifier(term, unifier))
            else:
                return False
        if all(new_terms):
            return Function(name=a.name, terms=new_terms) if isinstance(
                a, Function) else Atom(
                    name=a.name, terms=new_terms, neg=a.neg,
                    naf=a.naf) if isinstance(a, Atom) else False
        else:
            return False
    else:
        return False
コード例 #5
0
def add_modules(username):
    """Add function/module information"""

    if not verify_user(username):
        return redirect("/login")

    mname = request.form.get("mname")
    mdesc = request.form.get("mdesc")
    maddinfo = request.form.get("maddinfo")
    fname = request.form.get("fname")
    fdesc = request.form.get("fdesc")
    faddinfo = request.form.get("faddinfo")
    samplecode = request.form.get("samplecode")
    output = request.form.get("output")

    if fname == "":
        flash("Please input a function name.")
        return redirect("/{}/addmodules".format(username))

    # fetch user to get user_id
    user = User.query.filter_by(username=username).first()

    existing_mod = Module.query.filter(
        (Module.user_id == user.user_id) | (Module.user_id == 1),
        Module.name == mname).first()

    if mname == "":
        module = Module.query.filter_by(module_id=1).first()
    elif existing_mod:
        module = existing_mod
    else:
        module = Module(name=mname,
                        description=mdesc,
                        additional_info=maddinfo,
                        user_id=user.user_id)

        db.session.add(module)
        db.session.commit()

    function = Function(name=fname,
                        description=fdesc,
                        additional_info=faddinfo,
                        sample_code=samplecode,
                        output=output,
                        user_id=user.user_id,
                        module_id=module.module_id)

    db.session.add(function)
    db.session.commit()

    flash("Your notes have been added.")

    return redirect("/{}/studynotes".format(username))
コード例 #6
0
ファイル: deploy.py プロジェクト: rlzh/cs754-p3
def create_reduce_function(function_id, registry, run_registry=None):
    function_name = "red-{}".format(function_id)
    deploy_info = create_deploy_info(
        settings.REDUCE_PATH, 
        settings.REDUCE_CONFIG_TEMPLATE_PATH, 
        registry,
        run_registry
    )
    # create function
    function = Function(function_name, deploy_info, debug=settings.DEBUG)

    # load config data
    config_data = function.get_config_data()
    spec = config_data['spec']
    if spec['env'] == None:
        spec['env'] = []

     # update env vars
    update_env_var(spec['env'], name="ID", value=str(function_id))
    update_env_var(spec['env'], name=settings.HDFS_HOST_KEY, value=settings.HDFS_HOST_VALUE)
    output_dir = "" if settings.HDFS_OUTPUT_DIR_VALUE == "/" else settings.HDFS_OUTPUT_DIR_VALUE
    update_env_var(spec['env'], name='REDUCER_OUTPUT_FILENAME', value="{}/out_{}.txt".format(output_dir, function_id))
    update_env_var(spec['env'], name=settings.HDFS_CHUNK_COUNT_KEY, value=settings.HDFS_CHUNK_COUNT_VALUE)
    update_env_var(spec['env'], name=settings.NUM_MAPPERS_KEY, value=settings.NUM_MAPPERS_VALUE)
    update_env_var(spec['env'], name=settings.HDFS_USER_KEY, value=settings.HDFS_USER_VALUE)
    update_env_var(spec['env'], name=settings.DONE_TOPIC_KEY, value=settings.DONE_TOPIC_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_HOST_KEY, value=settings.RMQ_HOST_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_PORT_KEY, value=settings.RMQ_PORT_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_USER_KEY, value=settings.RMQ_USER_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_PASS_KEY, value=settings.RMQ_PASS_VALUE)
    update_env_var(spec['env'], name=settings.EXCHANGE_NAME_KEY, value=settings.EXCHANGE_NAME_VALUE)


    # update rmq trigger info
    update_rmq_trigger(
        spec['triggers'], 
        settings.RMQ_URL_VALUE, 
        settings.EXCHANGE_NAME_VALUE, 
        ["{}{}".format(settings.REDUCE_TOPIC_PREFIX_VALUE, function_id)],
        max_workers=3,
    )

    # update http trigger
    update_http_trigger(
        spec['triggers'],
        settings.REDUCE_PORT_START + function_id,
        max_workers=3,
    )

    # apply config changes
    function.apply_config(config_data)
    return function
コード例 #7
0
ファイル: deploy.py プロジェクト: rlzh/cs754-p3
def create_map_function(function_id, registry, run_registry=None):
    function_name = "map-{}".format(function_id)
    deploy_info = create_deploy_info(
        settings.MAP_PATH, 
        settings.MAP_CONFIG_TEMPLATE_PATH, 
        registry,
        run_registry
    )
    # create function
    function = Function(function_name, deploy_info, debug=settings.DEBUG)

    # load config data
    config_data = function.get_config_data()
    spec = config_data['spec']
    if spec['env'] == None:
        spec['env'] = []

    # update env vars
    update_env_var(spec['env'], name="ID", value=str(function_id))
    update_env_var(spec['env'], name=settings.RMQ_HOST_KEY, value=settings.RMQ_HOST_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_PORT_KEY, value=settings.RMQ_PORT_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_USER_KEY, value=settings.RMQ_USER_VALUE)
    update_env_var(spec['env'], name=settings.RMQ_PASS_KEY, value=settings.RMQ_PASS_VALUE)
    update_env_var(spec['env'], name=settings.NUM_REDUCERS_KEY, value=settings.NUM_REDUCERS_VALUE)
    update_env_var(spec['env'], name=settings.REDUCE_TOPIC_PREFIX_KEY, value=settings.REDUCE_TOPIC_PREFIX_VALUE)
    update_env_var(spec['env'], name=settings.EXCHANGE_NAME_KEY, value=settings.EXCHANGE_NAME_VALUE)
    update_env_var(spec['env'], name=settings.HDFS_HOST_KEY, value=settings.HDFS_HOST_VALUE)
    update_env_var(spec['env'], name=settings.DONE_TOPIC_KEY, value=settings.DONE_TOPIC_VALUE)
    update_env_var(spec['env'], name=settings.HDFS_USER_KEY, value=settings.HDFS_USER_VALUE)


    # update rmq trigger info
    update_rmq_trigger(
        spec['triggers'], 
        settings.RMQ_URL_VALUE, 
        settings.EXCHANGE_NAME_VALUE, 
        ["{}{}".format(settings.MAP_TOPIC_PREFIX_VALUE, function_id)],
        max_workers=3
    )

    # update http trigger
    update_http_trigger(
        spec['triggers'],
        settings.MAP_PORT_START + function_id,
        max_workers=3,
    )

    # apply config changes
    function.apply_config(config_data)
    return function
コード例 #8
0
def test_end_to_end(capsys):

    yat_fac = FunctionDefinition(
        'fac',
        Function(['n'], [
            Conditional(BinaryOperation(
                Reference('n'), '==', Number(0)), [Number(1)], [
                    BinaryOperation(
                        Reference('n'), '*',
                        FunctionCall(
                            Reference('fac'),
                            [BinaryOperation(Reference('n'), '-', Number(1))]))
                ])
        ]))
    s = Scope()
    yat_fac.evaluate(s)
    a = Print(FunctionCall(Reference('fac'), [Number(5)])).evaluate(s)
    out, err = capsys.readouterr()
    assert a == Number(120)
    assert out == '120\n'
    assert err == ''
コード例 #9
0
def make_function_at(static, address, recurse=True):
    if static[address]['function'] != None:
        # already function
        return
    start = time.time()
    block_starts = set([address])
    function_starts = set()
    this_function = Function(address)
    static['functions'].add(this_function)

    def disassemble(address):
        raw = static.memory(address, 0x10)
        d = static[address]['instruction']
        static[address]['function'] = this_function
        for (c, flag) in d.dests():
            if flag == DESTTYPE.call:
                static._auto_update_name(c, "sub_%x" % (c))
                function_starts.add(c)
                #print "%s %x is in %x xrefs" % (d,address, c)
                static[c]['xrefs'].add(address)
                # add this to the potential function boundary starts
                continue
            if c != address + d.size():
                #print "%s %x is in %x crefs" % (d,address, c)
                static[c]['crefs'].add(address)
                static._auto_update_name(c, "loc_%x" % (c))
                block_starts.add(c)

            #if we come after a jump and are an implicit xref, we are the start
            #of a new block
            elif d.is_jump() and not d.is_call():
                static._auto_update_name(c, "loc_%x" % (c))
                block_starts.add(c)
        return d.dests()

    # recursive descent pass
    pending = Queue.Queue()
    done = set()
    pending.put(address)
    while not pending.empty():
        dests = disassemble(pending.get())
        for (d, flag) in dests:
            if flag == DESTTYPE.call:
                #this will get handled in the function pass
                continue
            if d not in done:
                pending.put(d)
                done.add(d)
        if (time.time() - start) > 0.01:
            time.sleep(0.01)
            start = time.time()

    #print map(hex, done)

    # block finding pass
    for b in block_starts:
        this_block = Block(b)
        this_function.add_block(this_block)
        address = b
        i = static[address]['instruction']
        while not i.is_ending() and i.size() != 0:
            if address + i.size() in block_starts:
                break
            address += i.size()
            i = static[address]['instruction']
            this_block.add(address)
            static[address]['block'] = this_block
            if (time.time() - start) > 0.01:
                time.sleep(0.01)
                start = time.time()
        static['blocks'].add(this_block)

    # find more functions
    if recurse:
        for f in function_starts:
            if static[f]['function'] == None:
                make_function_at(static, f)
コード例 #10
0
ファイル: parser.py プロジェクト: ivantest22/clara
 def addfnc(self, name, params, rettype):
     if self.fnc:
         self.fncsl.append((self.fnc, self.loc))
     self.fnc = Function(name, params, rettype)
     self.fncs[name] = self.fnc
     self.prog.addfnc(self.fnc)
コード例 #11
0
def test_function_call():
    scope = Scope()
    function = Function(['a'], [Reference('a')])
    scope['function'] = function
    function_call = FunctionCall(Reference('function'), [Number(8)])
    assert function_call.evaluate(scope) == Number(8)
コード例 #12
0
            elif isinstance(term, Function):
                new_terms.append(apply_unifier(term, unifier))
            else:
                return False
        if all(new_terms):
            return Function(name=a.name, terms=new_terms) if isinstance(
                a, Function) else Atom(
                    name=a.name, terms=new_terms, neg=a.neg,
                    naf=a.naf) if isinstance(a, Atom) else False
        else:
            return False
    else:
        return False


# Test
if __name__ == '__main__':
    from model import *
    a = Atom(name='a',
             terms=[
                 Function('f1',
                          [Function('f2', [Variable('X')]),
                           Variable('Y')])
             ])
    b = Atom(name='a',
             terms=[
                 Function('f1',
                          [Function('f2', [Constant('a')]),
                           Constant('b')])
             ])
    print(apply_unifier(a, unify_atom(a, b)))