コード例 #1
0
ファイル: route.py プロジェクト: wwyf/virtual-routing-demo
    def run(self):
        """ 从队列中拿到一个包,做适当转换后,交给链路层 """
        while True:
            # 如果队列为空,那就等直到队列中有包
            while route_send_package.qsize() == 0:
                # NOTICE:此处循环可能会导致性能下降,CPU占用率100%
                time.sleep(0.2)
                continue
            # 从队列中获得一个包
            ip_package = route_send_package.get()

            # DEBUG信息
            logger.debug(' this package will be modiflied according to route table !')
            logger.debug(ip_package)

            # 使用成员函数处理IP包,修改其中的dest_ip字段,获得新的IP包
            ret_ip_package = self.ip_package_modifier(ip_package) # type: Optional["IP_Package"]
            if ret_ip_package == None:
                logger.info('{} is unreachable. \nShow your route table by "show route table"'.format(ip_package.final_ip))
                continue
            # DEBUG信息
            logger.debug('ip pkg has been modified. now forwarding...\n modified package is below')
            logger.debug(ret_ip_package)

            # 发送IP包
            link_layer.send(ret_ip_package.to_bytes())
コード例 #2
0
 def run(self) -> None:
     logger.debug('network layer listerner begin to work')
     while True:
         recv = self.network_layer.recv()
         if recv:
             logger.info('network layer pkg received\n{}'.format(recv))
         time.sleep(0.1)
コード例 #3
0
def onchange_refresh_route_table(src, dst, changeto):
    graph[src][dst] = changeto
    graph[dst][src] = changeto
    ret = calculate_shortest_path(ROUTER_INDEX)
    route.my_route_table.reset_route_table()
    for item in ret:
        route.my_route_table.update_item(*item)
    logger.info('refresh route table fishied.\n%s', ret)
コード例 #4
0
 def run_ping(self):
     logger.info("tracking direct router neighbor threading run...")
     for interface in self.network_layer.interfaces:
         src_ip = interface.vip
         dst_ip = interface.counter_vip
         netmask = interface.netmask
         msg = {'code': 0, 'msg': "are you still here?"}
         self.network_layer.send(src_ip, dst_ip, utilities.objEncode(msg),
                                 100)
         logger.debug('send ping from %s to %s', src_ip, dst_ip)
コード例 #5
0
    def run(self):
        """
        Run all the steps at one time
        """
        logger.info('Add the world condition')
        logger.info('Create question for each country')
        self.create_country_q()

        # Run the condition formating for all the questions
        self.format_condition()
        self.insert_code_in_dict()
コード例 #6
0
def logout_refresh_route_table(index):
    if index in disable_node:
        return
    disable_node.append(index)
    logger.info('refreshing router table ,logout index is %d', index)
    for i in range(V):
        graph[index][i] = -1
        graph[i][index] = -1
    ret = calculate_shortest_path(ROUTER_INDEX)
    route.my_route_table.reset_route_table()
    for a, b, c in ret:
        route.my_route_table.update_item(a, b, c)
    logger.info('refresh route table fishied.\n%s', ret)
コード例 #7
0
    def run(self):
        while True:
            time.sleep(5)
            self.tracking_direct_router_neighbour.run_ping()
            time.sleep(3)
            #logger.debug('-----------------tracking is alive running-----------------')
            for interface in self.track:
                #logger.debug('--------------interface----------\n%s', interface)
                if self.track[interface] == 0:
                    if interface not in self.dead_interfaces:
                        self.dead_interfaces.append(interface)
                        cvip = interface[1]
                        logger.info('######## ip %s logout! #########', cvip)

                        # broadcast
                        index = interface2index[(cvip,
                                                 24)]  #TODO:: hard code subnet
                        logger.info('broadcast logout index ##### %d', index)
                        logout_refresh_route_table(index)
                        self.broadcast_logout(
                            index)  #TODO: here, continue. not work
                    # self.track.remove(interface)
                else:
                    self.track[interface] = 0
            for interface in self.dead_interfaces:
                ip = interface[1]
                logger.info('[logout] logout ip is %s', ip)
                index = interface2index[(ip, 24)]
                logger.info('[logout] logout index is %d\n', index)
コード例 #8
0
ファイル: SubsystemManager.py プロジェクト: ot32em/Roystonea
    def SubsystemPortMapping(self, req):
        portstatus = req.data[self.config['portstatus_index']]
        vmname = req.data[self.config['vmname_index']]
        guestport = req.data[self.config['guestport_index']]
        hostport = req.data[self.config['hostport_index']]

        vmip = socket.gethostbyname(vmname)

        if portstatus == 'adding':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.config['cmd_iptables'], '-A', hostport, vmip, guestport)
            logger.info('Add port mapping for %s, from %s to %s on hostmachine'%(vmname, guestport, hostport)) 
        elif portstatus == 'deleting':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(cmd_iptables, '-D', hostport, vmip, guestport)
            logger.info('Delete port mapping for %s, from %s to %s on hostmachine'%(vmname, guestport, hostport)) 

        (result, value) = pexpect.run(iptables_cmd, withexitstatus = 1)
コード例 #9
0
    def run(self):
        logger.info('network layer listener begin to work...')
        while True:
            ospf_pkg = self.network_layer.recv_ospf()
            ordinary_pkg = self.network_layer.recv()
            if ospf_pkg is None and ordinary_pkg is None:
                time.sleep(0.01)
                continue
            if ospf_pkg:
                src_ip = ospf_pkg.dest_ip
                dest_ip = ospf_pkg.src_ip
                netmask = ospf_pkg.net_mask
                if ospf_pkg.protocol != 119:
                    logger.error(
                        'error! get ospf pkg, protocol is %d instead of 119',
                        ospf_pkg.protocol)
                ospf_msg = utilities.objDecode(ospf_pkg.data)
                logger.info("get ospf msg\n%s", ospf_msg)

                if ospf_msg['code'] == 0:
                    if not is_controller:
                        logger.warn(
                            "IM NOT CONTROLLER. get request msg. ignore.")
                        continue
                    src_index = ospf_msg['src_index']
                    init_global_route_table(GLOBAL_ROUTE_INFORMATIOIN_FILE,
                                            src_index)
                    sp = calculate_shortest_path(src_index)
                    response_msg = {
                        "code": 1,
                        "msg": "here's your route table",
                        "route_table": sp
                    }
                    response_msg_bytes = utilities.objEncode(response_msg)
                    pkg = route.IP_Package(src_ip, dest_ip, dest_ip, netmask,
                                           response_msg_bytes)
                    pkg.protocol = 119
                    errno = route.link_layer.send(pkg.to_bytes())
                    if errno < 0:
                        logger.warning(
                            'fail to send to link layer. errno is %d\n', errno)
                elif ospf_msg['code'] == 1:
                    logger.info('get route table response msg\n%s', ospf_msg)
                    route_table = ospf_msg['route_table']
                    for dest_net, netmask, dest_ip in route_table:
                        route.my_route_table.update_item(
                            dest_net, netmask, dest_ip)

            if ordinary_pkg:
                #TODO: refine here
                logger.info("get odinary msg\n%s", ordinary_pkg)
コード例 #10
0
def calculate_shortest_path(src: int):
    ret = []

    dist, prev = shortestPath.SPFA(graph, src)
    logger.debug("[controller] finished run spfa\n dist %s \n prev %s\n", dist,
                 prev)
    logger.debug("[controller, info] interface2index\n%s", interface2index)
    logger.debug("[controller, info] index2interface\n%s", index2interface)

    for ip, netmask in interface2index:
        # 自己的端口不需要作转发
        if interface2index[(ip, netmask)] == src:
            continue
        logger.debug('[controller] dealing with %s, %s', ip, netmask)
        subnet = utilities.get_subnet(ip, netmask)
        index = interface2index[(ip, netmask)]
        prev_index = prev[index]
        if prev_index == -1:
            continue
        if prev_index == src:
            target_index = interface2index[(ip, netmask)]
            (dst_ip, dst_nm) = index2interface[target_index]
            # route.my_route_table.update_item(ip, netmask, dst_ip)
            ret.append((ip, netmask, dst_ip))
            logger.info(
                '[1]add item into response msg\n \
                %s, %s, %s', ip, netmask, dst_ip)
        else:
            try_get = index2interface.get(prev_index)
            while try_get is None:
                prev_index = prev[prev_index]
                try_get = index2interface.get(prev_index)
            prev_ip, prev_netmask = try_get
            # route.my_route_table.update_item(ip, netmask, prev_ip)
            ret.append((ip, netmask, prev_ip))
            logger.info(
                '[2]add item into response msg\n \
                %s, %s, %s', ip, netmask, prev_ip)

    logger.debug("calculation return value\n%s", ret)
    return ret
コード例 #11
0
ファイル: SubsystemManager.py プロジェクト: ot32em/Roystonea
    def SubsystemPortmappingTest(self):
        print 'hi this is portmapping'
        vmid = 472
        guestport = 22
        vmname = 'ot32em-8-8'
        portstatus = 'adding'
        hostport = 4000


        vmip = socket.gethostbyname(vmname)

        if portstatus == 'adding':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.config['cmd_iptables'], '-A', hostport, vmip, guestport)
            logger.info('Add port mapping for %s, from %s to %s on hostmachine'%(vmname, guestport, hostport)) 
        elif portstatus == 'deleting':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(cmd_iptables, '-D', hostport, vmip, guestport)
            logger.info('Delete port mapping for %s, from %s to %s on hostmachine'%(vmname, guestport, hostport)) 

        (result, value) = pexpect.run(iptables_cmd, withexitstatus = 1)
コード例 #12
0
    def SubsystemPortMapping(self, req):
        portstatus = req.data[self.config['portstatus_index']]
        vmname = req.data[self.config['vmname_index']]
        guestport = req.data[self.config['guestport_index']]
        hostport = req.data[self.config['hostport_index']]

        vmip = socket.gethostbyname(vmname)

        if portstatus == 'adding':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.config['cmd_iptables'], '-A', hostport, vmip, guestport)
            logger.info(
                'Add port mapping for %s, from %s to %s on hostmachine' %
                (vmname, guestport, hostport))
        elif portstatus == 'deleting':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(cmd_iptables, '-D', hostport, vmip, guestport)
            logger.info(
                'Delete port mapping for %s, from %s to %s on hostmachine' %
                (vmname, guestport, hostport))

        (result, value) = pexpect.run(iptables_cmd, withexitstatus=1)
コード例 #13
0
    def SubsystemPortmappingTest(self):
        print 'hi this is portmapping'
        vmid = 472
        guestport = 22
        vmname = 'ot32em-8-8'
        portstatus = 'adding'
        hostport = 4000

        vmip = socket.gethostbyname(vmname)

        if portstatus == 'adding':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.config['cmd_iptables'], '-A', hostport, vmip, guestport)
            logger.info(
                'Add port mapping for %s, from %s to %s on hostmachine' %
                (vmname, guestport, hostport))
        elif portstatus == 'deleting':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(cmd_iptables, '-D', hostport, vmip, guestport)
            logger.info(
                'Delete port mapping for %s, from %s to %s on hostmachine' %
                (vmname, guestport, hostport))

        (result, value) = pexpect.run(iptables_cmd, withexitstatus=1)
コード例 #14
0
 def run(self) -> None:
     logger.debug('network layer listener begin to work')
     while True:
         for protocol in ['rip', 'cost']:
             if protocol == 'rip':
                 pkg = network_layer.recv_rip()
                 if pkg is None:
                     continue
                 if(pkg.protocol == 120):
                     rip_msg = utilities.objDecode(pkg.data)
                     rip_worker.process(rip_msg)
             elif protocol == 'cost':
                 pkg = network_layer.recv_cost()
                 if pkg is None:
                     continue
                 if(pkg.protocol == 121):
                     cost_msg = utilities.objDecode(pkg.data)
                     _vip = cost_msg['vip']
                     _cost = cost_msg['cost']
                     for intf in rip_worker.interfaces:
                         if intf.vip == _vip:
                             logger.info('Cost %s -> %s changed to %d', rip_worker.route_name, intf.counter_name, _cost)
                             rip_worker.dis_vec[intf.counter_name]['cost'] = _cost
         time.sleep(0.01)
コード例 #15
0
def main():

    # Get the file and transform it to create all the questions and conditions for each country

    logger.info(
        'Getting the file and transforming it for the country specific conditions'
    )
    getting_question = gettingQuestions()
    getting_question.run()

    # Init the survey creation process
    logger.info('Init the survey creation')
    creating_survey = surveyCreation(getting_question.dict_questions)
    logger.info('Running the survey creation')
    creating_survey.run()
コード例 #16
0
ファイル: rUI.py プロジェクト: vtotient/rUI
    def do_connectDevice(self, inp):
        """Connect to a serial device.
        Shows list of open devices and prompts selection."""
        logger.info("Listing devices")

        # Get a list of the available serial ports
        self.device.closePort()
        ports = self.device.listDevices() 
        portNames = []
    
        # Get device names and print to screen
        i = 0
        for port in ports:
            logger.info("Device found: %s", port)
            portNames.append(port.device)
            # Format
            print(str(i) + "     " + str(port))
            i = i + 1
        
        # Prompt user to select serial device
        while True:
            selection = input("Enter selection[q(quit)]: ")

            if selection is "q":
                return False
            
            # Verify valid selction 
            try:
                selection = int(selection)
            except:
                print("Invalid option...try again")
                continue
            
            if selection < len(portNames):
                self.device.setPort(portNames[selection])
                self.device.openPort()

                setLocalOption({'lastPort':portNames[selection]})

                logger.info("Selecting device: %s", portNames[selection])
                break
            else:
                print("Selection out of range...try again")
コード例 #17
0
    def task(self):
        time.sleep(0.1)
        msg_queue = []
        msg_queue.append(self.network_layer.recv_ospf())
        msg_queue.append(self.network_layer.recv())
        msg_queue.append(self.network_layer.recv_ping())

        available_msg = [msg for msg in msg_queue if not msg is None]
        for msg in available_msg:
            if msg.protocol == 100:
                data = utilities.objDecode(msg.data)
                sip = msg.src_ip
                dip = msg.dest_ip
                netmask = msg.net_mask
                if data['code'] == 0:
                    # get ping request from other
                    logger.info('get ping from %s\n', sip)
                    msg = {'code': 1, 'msg': 'I am here.'}
                    self.network_layer.send(dip, sip, utilities.objEncode(msg),
                                            100)
                if data['code'] == 1:
                    # get ping response from it
                    logger.info('ping response. I know %s reachable', sip)
                    self.tracking_neighbour_alive.wakeup(dip, sip)
            elif msg.protocol == 119:
                data = utilities.objDecode(msg.data)
                msgid = data['id']
                if msgid in known_msgid_list:
                    # logger.debug('already know %d, continue', msgid)
                    continue
                known_msgid_list.append(msgid)
                self.broadcastMsg(data, 119)
                msg_type = data['type']
                if msg_type == 'logout':
                    # pass #TODO: here, maybe bugs
                    lgout_index = data['index']
                    logger.info(
                        'get logout broadcast. now refresh route table according to broadcast %d',
                        lgout_index)
                    logout_refresh_route_table(lgout_index)
            else:
                logger.debug('recv msg!!\n%s', msg)
コード例 #18
0
 def run(self):
     """ 启动一个新的线程,监听一个端口 """
     self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,
                                   1)
     self.server_socket.bind(self.pip_port)
     self.server_socket.listen(config.MAX_TCP_LINK)
     # 等待网线那一头,直连的Interface与我建立连接
     (client_socket, address) = self.server_socket.accept()
     # 等待网线那一头的Interface给我发消息
     rdt_s = rdt_socket.rdt_socket(client_socket)
     while True:
         data = rdt_s.recvBytes()
         # NOTICE:应该直接将二进制对象放到队列中
         # pkg = IP_Package.bytes_package_to_object(data)
         link_buf.put(data)
         if IP_Package.bytes_package_to_object(data).protocol == 120:
             continue
         logger.info('--------------------------------------------------')
         logger.info("Link layer pkg received\n{}".format(
             IP_Package.bytes_package_to_object(data)))
         logger.info('--------------------------------------------------')
コード例 #19
0
    def portmapping(self, vmname, vmip, vmport, hostport, action):
        if action == 'a':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.cmd_iptables, '-A', hostport, vmip, vmport)
            logger.info('Add port mapping for %s, from %s to %s on hostmachine'%(vmname, vmport, hostport))
            logger.debug(iptables_cmd)

        elif action == 'd':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.cmd_iptables, '-D', hostport, vmip, vmport)
            logger.info('Delete port mapping for %s, from %s to %s on hostmachine'%(vmname, vmport, hostport))
            logger.debug(iptables_cmd)
        else :
            logger.error('Error argument!')
            return 0

        (result, value) = pexpect.run(iptables_cmd, withexitstatus = 1)

        if value != 0 :
            logger.error(result)
            return 0

        return 1

        if connect:
            logger.info('Start.')
            logger.info('Database connected.')
            while 1:
                query_portreq = "SELECT * FROM %s WHERE state='adding' \
                        OR state='deleting 'ORDER BY hostport"%(porttb)
                db.query(query_portreq)
                req_res = db.store_result()
                fetched_req_data = req_res.fetch_row()
                while fetched_req_data:
                    state = fetched_req_data[0][idx_state]
                    vmname = fetched_req_data[0][idx_vmname]
                    vmport = fetched_req_data[0][idx_vmport]
                    oldhostport = fetched_req_data[0][idx_hostport]

                    if (state == 'adding') :
                        vmip = socket.gethostbyname(vmname)
                        newport = oldhostport
                        if (newport == '-1') :
                            newport = get_port()
                        if (newport != -1) :
                            portmapping(vmname, vmip, vmport, newport, 'a')
                            query = "UPDATE %s SET state='using', \
                                hostport='%s', ip='%s' \
                                WHERE hostport=%s"%(porttb, newport, vmip, oldhostport)
                            db.query(query)
                        else :
                            logger.error('No more port!')
                    elif (fetched_req_data[0][idx_state] == 'deleting') :
                        #delete port
                        vmip = fetched_req_data[0][idx_ip]
                        portmapping(vmname, vmip, vmport, oldhostport, 'd')
                        query = "DELETE FROM %s WHERE hostport=%s"%(porttb, oldhostport)
                        db.query(query)
                    else :
                        logger.error("I don't know what's wrong!")

                fetched_req_data = req_res.fetch_row()
            time.sleep(sleep_time)
コード例 #20
0
    def portmapping(self, vmname, vmip, vmport, hostport, action):
        if action == 'a':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.cmd_iptables, '-A', hostport, vmip, vmport)
            logger.info(
                'Add port mapping for %s, from %s to %s on hostmachine' %
                (vmname, vmport, hostport))
            logger.debug(iptables_cmd)

        elif action == 'd':
            iptables_cmd = '%s %s PREROUTING -p tcp --dport %s -j DNAT --to %s:%s' \
                    %(self.cmd_iptables, '-D', hostport, vmip, vmport)
            logger.info(
                'Delete port mapping for %s, from %s to %s on hostmachine' %
                (vmname, vmport, hostport))
            logger.debug(iptables_cmd)
        else:
            logger.error('Error argument!')
            return 0

        (result, value) = pexpect.run(iptables_cmd, withexitstatus=1)

        if value != 0:
            logger.error(result)
            return 0

        return 1

        if connect:
            logger.info('Start.')
            logger.info('Database connected.')
            while 1:
                query_portreq = "SELECT * FROM %s WHERE state='adding' \
                        OR state='deleting 'ORDER BY hostport" % (porttb)
                db.query(query_portreq)
                req_res = db.store_result()
                fetched_req_data = req_res.fetch_row()
                while fetched_req_data:
                    state = fetched_req_data[0][idx_state]
                    vmname = fetched_req_data[0][idx_vmname]
                    vmport = fetched_req_data[0][idx_vmport]
                    oldhostport = fetched_req_data[0][idx_hostport]

                    if (state == 'adding'):
                        vmip = socket.gethostbyname(vmname)
                        newport = oldhostport
                        if (newport == '-1'):
                            newport = get_port()
                        if (newport != -1):
                            portmapping(vmname, vmip, vmport, newport, 'a')
                            query = "UPDATE %s SET state='using', \
                                hostport='%s', ip='%s' \
                                WHERE hostport=%s" % (porttb, newport, vmip,
                                                      oldhostport)
                            db.query(query)
                        else:
                            logger.error('No more port!')
                    elif (fetched_req_data[0][idx_state] == 'deleting'):
                        #delete port
                        vmip = fetched_req_data[0][idx_ip]
                        portmapping(vmname, vmip, vmport, oldhostport, 'd')
                        query = "DELETE FROM %s WHERE hostport=%s" % (
                            porttb, oldhostport)
                        db.query(query)
                    else:
                        logger.error("I don't know what's wrong!")

                fetched_req_data = req_res.fetch_row()
            time.sleep(sleep_time)
コード例 #21
0
 def run(self):
     logger.info('network layer listener begin to work...')
     while True:
         self.task()
コード例 #22
0
 elif main_action == 'start':
     # 开启RIP协议
     rip_worker.start()
 elif main_action == 'add':
     # 往路由表中增加表项
     route.my_route_table.update_item(user_args[1], int(user_args[2]), user_args[3])
 elif main_action == 'delete':
     # 删除某一项
     route.my_route_table.delete_item(user_args[1], int(user_args[2]))
     for rname, lvip_mask in rip_worker.topo.items():
         for lvip, lmask in lvip_mask:
             if user_args[1] == lvip and int(user_args[2]) == lmask:
                 if rname in rip_worker.direct_routes:
                     print("Cannot delete, {} is a directly connected route")
                 else:
                     logger.info('[RIP] Reset cost %s to %s to INF', network_layer.name, rname)
                     rip_worker.dis_vec[rname]['cost'] = DV_INF
                     rip_worker.dis_vec[rname]['path'] = []
 elif main_action == 'send':
     # 发送信息
     network_layer.send(user_args[1], user_args[2], user_args[3].encode('ascii'))
 elif main_action == 'recv':
     # 非阻塞接受IP包
     ip_pkg = network_layer.recv()
     if ip_pkg == None:
         print('no receive!')
     else:
         print(ip_pkg)
 elif main_action == 'offline':
     rip_worker.working_flag = False
     for rname, detail in rip_worker.dis_vec.items():
コード例 #23
0
ファイル: rUI.py プロジェクト: vtotient/rUI
        
    @require_device
    def do_getSpiState(self, inp):
        "Get SPI State"

        STMReceiveCode = 3 # Integer code that the STM looks for
        self.device.writeInt8(STMReceiveCode)
        state = self.device.readBytes(1)

        states = ["HAL_SPI_STATE_RESET: Peripheral not Initialized",
                    "HAL_SPI_STATE_READY: Peripheral Initialized and ready for use",
                    "HAL_SPI_STATE_BUSY: an internal process is ongoing",
                    "HAL_SPI_STATE_BUSY_TX: Data Transmission process is ongoing",
                    "HAL_SPI_STATE_BUSY_RX: Data Reception process is ongoing",
                    "HAL_SPI_STATE_BUSY_TX_RX: Data Transmission and Reception process is ongoing",
                    "HAL_SPI_STATE_ERROR: SPI error state",
                    "HAL_SPI_STATE_ABORT: Abort state"]

        print("State: "+str(state[0]))
        print(states[state[0]])



if __name__ == '__main__':
    logger.info("---Starting rUI---")
    # Driver 
    p = rUI()
    p.cmdloop()

コード例 #24
0
    def process(self, rip_msg : dict):
        medium = rip_msg['from']
        # 步骤一:阻止含有之前已经处理过的离线的路由器的信息的rip报文
        if medium in self.tear_down:
            return
        
        for rname, detail in rip_msg['dv'].items():
            for drname in self.tear_down:
                if drname in detail['path']:
                    logger.debug("[RIP] [Dropped] DV of %s contain offline route %s", medium, drname)
                    return

        for rname in rip_msg['topo'].keys():
            if rname in self.tear_down:
                logger.debug("[RIP] [Dropped] TOPO of %s contain offline route %s", medium, rname)
                return

        logger.debug("[RIP] received rip package from %s", medium)
        new_tear_down = set(rip_msg['tear_down']) - set(self.tear_down)
        self.tear_down = list(set().union(self.tear_down, rip_msg['tear_down']))

        # 步骤二:删除自身所有有关新得知的离线了的路由器的信息
        # 删除距离向量中的这一行
        if len(new_tear_down) != 0:
            to_del = []
            for drname in new_tear_down:
                if drname in self.dis_vec.keys():
                    to_del.append(drname)
            for drname in to_del:
                del self.dis_vec[drname]

            # 删除距离向量中所有途径offline路由器的
            to_del = []
            for drname in new_tear_down:
                for rname, detail in self.dis_vec.items():
                    if drname in detail['path']:
                        to_del.append(rname)
            for rname in to_del:
                del self.dis_vec[rname]


            for drname in new_tear_down:
                # 删除路由表中有关的
                for vip, nm in self.topo[drname]:
                    route.my_route_table.delete_item(vip, nm)
                    route.my_route_table.delete_item(utilities.get_subnet(vip, nm), nm)
                # 网络层端口中将其设为offline
                for intf in network_layer.interfaces:
                    if intf.counter_name == drname:
                        intf.status = "offline"
                # 删除关于它的拓扑记录
                del self.topo[drname]
                self.dis_mat = {}
                for intf in self.interfaces:
                    self.dis_mat[intf.counter_name] = {}
                return

        for dest, intfs in rip_msg['topo'].items():
            if dest not in self.topo:
                self.topo[dest] = intfs
                logger.info("[RIP] learned topo of {} : {}".format(dest, intfs))
                if dest in self.direct_routes:
                    for vip, netmask in intfs:
                        logger.info("[RIP] Updating route table\n{} {} THROUTH {}".format(vip, netmask, self.next_hop[dest]))
                        route.my_route_table.update_item(vip, netmask, self.next_hop[dest])

        # 步骤三:更新自己的距离向量和拓扑图,因为可能学习到新的节点
        # if medium not in self.topo.keys():
        #     self.topo[medium] = rip_msg['intfs']
        if medium not in self.dis_vec.keys():
                logger.critical("Unexpected rip msg from %s", rip_msg['from'])
        else:
            mininum = DV_INF
            for dest, detail in rip_msg['dv'].items():
                if not dest in self.topo.keys():
                    continue
                cost = detail['cost']
                newcost = self.dis_vec[medium]['cost'] + cost
                if dest == self.route_name:
                    continue
                elif dest not in self.dis_vec.keys():
                    newpath = detail['path']
                    newpath.insert(0, self.route_name)
                    self.dis_vec[dest] = \
                        {
                            "cost": newcost,
                            "path": newpath
                        }
                    logger.info("[RIP] New shortest path found\n{} -> {} cost {}, path: {}".format(
                        self.route_name, dest, self.dis_vec[dest]['cost'], self.dis_vec[dest]['path']))
                    for vip, netmask in self.topo[dest]:
                        logger.info("[RIP] Updating route table\n{} {} THROUTH {}".format(vip, netmask, self.next_hop[medium]))
                        route.my_route_table.update_item(vip, netmask, self.next_hop[medium])

        # 步骤四:更新距离矩阵中的一行
        self.dis_mat[medium] = rip_msg['dv']
        logger.debug('{}'.format(utilities.obj_to_beautiful_json(self.dis_mat)))
        # 步骤五:运行核心的dv算法
        for dest, detail in self.dis_vec.items():
            # 直连的链路cost不在这里更新cost,只在cost change protocol中更新
            if dest in self.direct_routes:
                continue
            # 不需要对未知子网Interfaces情况的路由器计算距离,计算了也没用,也加不了路由表
            if not dest in self.topo.keys():
                continue
            mininum = DV_INF
            new_path = []
            medium = ''
            for entry_route, dv in self.dis_mat.items():
                # 去不到就continue,相当于设置了正无穷
                if dest not in dv.keys():
                    continue

                new_cost = self.dis_vec[entry_route]['cost'] + dv[dest]['cost']
                if new_cost < mininum:
                    # 毒性逆转(poisoned reverse)
                    # 如果可能的最短路径中包含目的节点自身
                    if dest in dv[dest]['path'] and dest != dv[dest]['path'][-1]:
                        continue
                    logger.debug('maybe shortest : {} to {}'.format(self.route_name, dest))
                    logger.debug('{} plus {}'.format(dest, dv[dest]['path']))
                    mininum = new_cost
                    medium = entry_route
                    new_path = dv[dest]['path']
                    if new_path[0] != self.route_name:
                        new_path.insert(0, self.route_name)

            # 更新距离向量和路由表,并打印适量调试信息
            old_cost = detail['cost']
            detail['cost'] = mininum
            if mininum >= DV_INF:
                detail['path'] = []
            else:
                logger.debug("{} to {} now walks {}".format(self.route_name, dest, new_path))
                detail['path'] = new_path
            if medium != '':
                for vip, netmask in self.topo[dest]:
                    route.my_route_table.update_item(vip, netmask, self.next_hop[medium])

            if old_cost != detail['cost']:
                 logger.info("[RIP] New shortest path found\n{} -> {} cost {}, path: {}".format(
                     self.route_name, dest, self.dis_vec[dest]['cost'], self.dis_vec[dest]['path']))
コード例 #25
0
    def create_survey_settings(self):
        """
        Add the welcome and the end message and set up the different setting in the survey
        """
        def get_text(type_message, lang=None):
            """
            """
            if lang and lang != "en":
                filename = "{}_message_{}.md".format(type_message, lang)
            else:
                filename = "{}_message.md".format(type_message)

            folder = os.path.join(self.year, "texts")
            path = os.path.join(folder, filename)
            with open(path, "r") as f:
                html_file = markdown(f.read())

            # Need to add target="_blank" to the link for opening in new tab in limesurvey
            soup = BeautifulSoup(html_file, "html.parser")
            links = soup.find_all("a")
            for link in links:
                link["target"] = "_blank"
            return soup

        for lang in self.languages:
            logger.info(
                'Creating the questions for the language: {}'.format(lang))
            # All these None are a workaround to fix the bug that add
            # two titles for the second language. No idea why
            survey_settings = None
            setting_with_lang = None
            survey_title = None
            survey_title_row = None
            # Get the welcome message
            welcome_message = get_text("welcome", lang)
            # Get the end message
            end_message = get_text("end", lang)
            survey_settings = self._to_modify(
                static_headers.global_settings,
                specific_config.settings_to_modify)
            survey_settings = self._to_add(survey_settings,
                                           specific_config.settings_to_add)

            survey_title = specific_config.survey_title[lang]
            survey_title_row = {
                "class": "SL",
                "name": "surveyls_title",
                "text": survey_title,
            }
            survey_settings.insert(0, survey_title_row)
            survey_settings = self._add_text_message(survey_settings,
                                                     welcome_message,
                                                     "welcome")
            survey_settings = self._add_text_message(survey_settings,
                                                     end_message, "end")
            # adding the policy data
            # consent_message = get_text('consent', lang)
            # survey_settings = self._add_text_message(survey_settings, consent_message, 'policy_notice')
            # Add the appropriate language field for each of the dictionary
            setting_with_lang = list()
            for d in survey_settings:
                d["language"] = lang
                setting_with_lang.append(d)

            self._record_list(setting_with_lang)