Exemplo n.º 1
0
 def set_enetif(self, enetif):
     enetif.ifIndex = self.interface_dict['eth0']
     enetif.ifName = "eth0"
     enetif.ifAlias = "eth0"
     enetif.ifPhysAddress = SysTools.get_mac_address("eth0")
     enetif.ifType = 6
     enetif.ifMTU = 1500
     enetif.ifAdminStatus = 1
     enetif.ifOperStatus = 1
Exemplo n.º 2
0
    def test_sys_tools(self):
        SysTools.touch('/tmp/test_utils')
        SysTools.REBOOT_SKIP_FILES = ('/tmp/test_utils')

        self.assertFalse(SysTools.is_system_openwrt())
        self.assertEqual(SysTools.get_mac_address('if_test'),
                         "00:00:00:00:00:00")
        self.assertEqual(SysTools.get_sys_mac_address(), "00:00:00:00:00:00")

        with open('/tmp/test_mac', 'w') as f:
            f.write('01:02:03:04:05:06')
            f.close()
        SysTools.SYS_MAC_FILE = '/tmp/test_mac'
        self.assertEqual(SysTools.get_sys_mac_address(), "01:02:03:04:05:06")
        SysTools.SYS_MAC_FILE = '/etc/gshadow'
        self.assertEqual(SysTools.get_sys_mac_address(), "00:00:00:00:00:00")

        print(SysTools.get_host_name())
        print(SysTools.get_ip_address('if_test'))
        if not SysTools.reboot():
            SysTools.sys_failure_reboot('skip files exist')
        SysTools.external_reboot(('test', 'test'))
        if os.path.exists('/tmp/test_utils'):
            os.remove('/tmp/test_utils')

        # d = Dispatcher()
        # timestamp = time.time() + 1000
        # SysTools.set_system_time(d, timestamp)
        # SysTools.touch('/etc/openwrt_release')
        # SysTools.set_system_time(d, timestamp)
        # time.sleep(2)
        # self.assertTrue(timestamp > time.time()) #should no permission to change system time
        # del d
        # if os.path.exists('/etc/openwrt_release'):
        #     os.remove('/etc/openwrt_release')
        self.assertIsNotNone(SysTools.sys_up_time())
        ret = SysTools.if_indextoname(1)
        print "ifname of index 1:", ret
        self.assertIsNotNone(ret)
        ret = SysTools.if_indextoname("test")
        self.assertIsNone(ret)
        ret = SysTools.if_indextoname(600)
        self.assertIsNone(ret)

        ret = SysTools.if_nametoindex("lo")
        print "ifindex of lo:", ret
        self.assertIsNotNone(ret)
        ret = SysTools.if_nametoindex(5)
        self.assertIsNone(ret)
        ret = SysTools.if_nametoindex("dafsd")
        self.assertIsNone(ret)
        ret = SysTools.is_if_oper_up('eth0')
        self.assertTrue(ret)
Exemplo n.º 3
0
    def update(self, core_instance, event):
        """update the statistics info.

        :param core_instance: CCAP core instance
        :param event: fsm event instance
        :return:
        """

        self.RPD_MAC = SysTools.get_mac_address(core_instance.interface)

        ccap_core_id = core_instance.ccap_core_id
        added_by = core_instance.added_by
        item = "{}/{}".format(core_instance.interface,
                              core_instance.ccap_core_network_address)

        # limit the core ip count to 20 each node
        if len(self.statistics) >= self.RECORD_CCAP_CORE_CNT_MAX:
            self.logger.warning(
                "Ccap core already exceed the max count %d, ignore %s ",
                self.RECORD_CCAP_CORE_CNT_MAX, item)
            return

        if item not in self.statistics:
            self.statistics[item] = OrderedDict()
        if ccap_core_id not in self.statistics[item]:
            self.statistics[item][ccap_core_id] = OrderedDict()

        # limit the core id count to 5 under each core ip
        while len(self.statistics[item]
                  ) >= self.RECORD_CORE_ID_PER_CCAP_CORE_MAX:
            self.statistics[item].popitem(last=False)

        # limit the event count to 100 each core id
        while len(self.statistics[item]
                  [ccap_core_id]) >= self.RECORD_EVENT_PER_CORE_ID_MAX:
            self.statistics[item][ccap_core_id].popitem(last=False)

        current = time()
        self.statistics[item][ccap_core_id].update({
            self.fmt_timestamp(current): {
                "interface": core_instance.interface,
                "core-ip": core_instance.ccap_core_network_address,
                "mac": self.RPD_MAC,
                "src": event.src,
                "dst": event.dst,
                "event": event.event,
                "Added-By": added_by
            }
        })
Exemplo n.º 4
0
    def gen_dhcp_mapping_info(self, interface):
        """Generate dhcp mapping info if not exist.

        :param interface:
        :return:

        """
        rpd_ident = ['cfg', 'RpdCapabilities', 'RpdIdentification']

        self.dhcp_args_mapping = {
            '0x02': rpd_ident + ['DeviceDescription'],
            '0x04': rpd_ident + ['SerialNumber'],
            '0x05': self.hw_version_path,
            '0x06': rpd_ident + ['CurrentSwVersion'],
            '0x07': rpd_ident + ['BootRomVersion'],
            '0x08':
            "".join(SysTools.get_mac_address(interface).split(':')
                    [0:3]),  # vendor ID
            '0x09': rpd_ident + ['ModelNumber'],
            '0x0A': rpd_ident + ['VendorName']
        }

        # Fill device information to DB, if not loaded
        mac_addr_str = rpd_ident + ['DeviceMacAddress']
        if self.db_adapter.get_leaf(mac_addr_str) is None:
            self.db_adapter.set_leaf(mac_addr_str,
                                     SysTools.get_mac_address(interface), True)

        hostname_str = rpd_ident + ['DeviceAlias']
        if self.db_adapter.get_leaf(hostname_str) is None:
            self.db_adapter.set_leaf(hostname_str, SysTools.get_host_name(),
                                     True)

        if self.db_adapter.get_leaf(self.hw_version_path) is None:
            self.db_adapter.set_leaf(self.hw_version_path,
                                     self.hw_version.encode('hex'), True)
Exemplo n.º 5
0
    def config_rsyslog_remote(self, address):
        # write to remote server, check whether it's been configured already.
        conf = open('/etc/rsyslog.conf', 'r')
        server_configed = conf.read()
        address_configed = server_configed.find(address)
        conf.close()
        if address_configed > 0:
            self.logger.info(
                "Log Server IP address provided for remote logging already configed"
            )
            return

        conf = open('/etc/rsyslog.conf', 'a+')
        # write to remote logserver, TCP to logserver
        conf.write("\n")
        remote_channel = "*." + self.rsyslog_loglevel + "    @" + address
        conf.write(remote_channel)
        conf.write("\n")
        conf.close()

        if SysTools.is_vrpd():
            hostmac = SysTools.get_mac_address("eth0")
        else:
            hostmac = SysTools.get_sys_mac_address()

        hostname = 'RPD' + hostmac.replace(':', '')
        set_host_cmd = 'echo ' + hostname + '>/proc/sys/kernel/hostname'
        os.system(set_host_cmd)

        new_hostline = hostname + " localhost"
        # write to /etc/hosts
        new_host = open('/tmp/new_hosts', 'w')
        old_host = open('/etc/hosts', 'r')
        line = old_host.read()
        found = line.find('localhost')
        configed = line.find('RPD')
        if found > 0 and configed < 0:
            new_host.write(line.replace('localhost', str(new_hostline)))
        else:
            new_host.write(line)
        old_host.close()
        new_host.flush()
        new_host.close()
        os.remove('/etc/hosts')
        shutil.move('/tmp/new_hosts', '/etc/hosts')
        return
Exemplo n.º 6
0
    def dummy_rpd_cap(self, cap):
        cap.NumBdirPorts = 3
        cap.NumDsRfPorts = 1
        cap.NumUsRfPorts = 2
        cap.NumTenGeNsPorts = 2
        cap.NumOneGeNsPorts = 1
        cap.NumDsScQamChannels = 158
        cap.NumDsOfdmChannels = 1
        cap.NumUsScQamChannels = 12
        cap.NumUsOfdmaChannels = 4
        cap.NumDsOob55d1Channels = 1
        cap.NumUsOob55d1Channels = 3
        cap.NumOob55d2Modules = 0
        cap.NumUsOob55d2Demodulators = 0
        cap.NumNdfChannels = 1
        cap.NumNdrChannels = 1
        cap.SupportsUdpEncap = 0
        cap.NumDsPspFlows = 8
        cap.NumUsPspFlows = 4

        cap.RpdIdentification.VendorName = "Cisco"
        cap.RpdIdentification.VendorId = 9
        cap.RpdIdentification.ModelNumber = "0"
        cap.RpdIdentification.DeviceMacAddress = SysTools.get_mac_address(
            "eth0")
        cap.RpdIdentification.CurrentSwVersion = "dummy_cur_sw_ver"
        cap.RpdIdentification.BootRomVersion = "dummy_boot_rom_version"
        cap.RpdIdentification.DeviceDescription = "RPD"
        cap.RpdIdentification.DeviceAlias = "RPD"
        cap.RpdIdentification.SerialNumber = "NA"
        cap.RpdIdentification.UsBurstReceiverVendorId = 4413
        cap.RpdIdentification.UsBurstReceiverModelNumber = "NA"
        cap.RpdIdentification.UsBurstReceiverDriverVersion = "NA"
        cap.RpdIdentification.UsBurstReceiverSerialNumber = "00000000"
        cap.RpdIdentification.RpdRcpProtocolVersion = "1.0"
        cap.RpdIdentification.RpdRcpSchemaVersion = "1.0.8"
        cap.RpdIdentification.HwRevision = "NA"
        cap.RpdIdentification.AssetId = "NA"
        cap.RpdIdentification.VspSelector = ""
        cap.RpdIdentification.CurrentSwImageLastUpdate = Convert.pack_timestamp_to_string(
            0)
        cap.RpdIdentification.CurrentSwImageName = ""
        cap.RpdIdentification.CurrentSwImageServer = "0.0.0.0"

        cap.PilotToneCapabilities.NumCwToneGens = 4
        cap.PilotToneCapabilities.LowestCwToneFreq = 50000000
        cap.PilotToneCapabilities.HighestCwToneFreq = 1218000000
        cap.PilotToneCapabilities.MaxPowerDedCwTone = 100
        cap.PilotToneCapabilities.QamAsPilot = True
        cap.PilotToneCapabilities.MinPowerDedCwTone = -330
        cap.PilotToneCapabilities.MaxPowerQamCwTone = 90
        cap.PilotToneCapabilities.MinPowerQamCwTone = -30

        cap.DeviceLocation.DeviceLocationDescription = "NA"
        cap.DeviceLocation.GeoLocationLatitude = "+000000.0"
        cap.DeviceLocation.GeoLocationLongitude = "+0000000.0"

        cap.NumAsyncVideoChannels = 160
        cap.SupportsFlowTags = True
        cap.SupportsFrequencyTilt = True
        cap.TiltRange = 0
        cap.BufferDepthMonitorAlertSupport = 0
        cap.BufferDepthConfigurationSupport = 0
        cap.RpdUcdProcessingTime = 50
        cap.RpdUcdChangeNullGrantTime = 50
        cap.SupportMultiSectionTimingMerReporting = 0

        cap.RdtiCapabilities.NumPtpPortsPerEnetPort = 11

        cap.MaxDsPspSegCount = 10
        cap.DirectDsFlowQueueMapping = 1
        cap.DsSchedulerPhbIdList = "0 10 12 14 18 20 22 26 28 30 34 36 38 46"
        cap.RpdPendingEvRepQueueSize = 1000
        cap.RpdLocalEventLogSize = 1000
        cap.SupportsOpticalNodeRf = False
        cap.MaxDsFrequency = 1218000000
        cap.MinDsFrequency = 5700000
        cap.MaxBasePower = 0
        cap.MinTiltValue = 0
        cap.MinPowerAdjustScQam = 0
        cap.MaxPowerAdjustScQam = 0
        cap.MinPowerAdjustOfdm = 0
        cap.MaxPowerAdjustOfdm = 0
        cap.OfdmConfigurationCapabilities.RequiresOfdmaImDurationConfig = True
Exemplo n.º 7
0
    def __init__(self):
        self.dhcpv4_process = None
        self.dhcpv6_process = None
        self.sfd_stream = None
        self.db = RPD_DB()
        self.db_adapter = CfgDbAdapter(self.db)
        self.dhcp_data = t_DhcpData()
        self.disp = Dispatcher()
        self.signal_mask = self.create_signal_mask()
        self.dhcp_sock = None
        self.dhcp_timer = None
        self.processes = {}

        ProcessInfo.dispatcher = self.disp
        self.processes['dhcpv6'] = ProcessInfo(
            [
                "odhcp6c",  # Args - start
                "-s",
                "/lib/netifd/dhcpv6.script",
                "-P",
                "0",
                # Request IPv6 Prefix = auto
                "-t",
                "256",
                # Random backoff <1, 256>
                "-v",  # Verbose
                "-I",
                self.DHCP_SOCK_ADDRESS
            ],  # Args - end
            self.DHCP_SOCK_ADDRESS,  # IPC address
            self.BACKOFF_TIMEOUT,  # Timeout in seconds
            self._dhcp_no_lease  # Timeout callback
        )
        self.processes['dhcpv4'] = ProcessInfo(
            [
                "udhcpc",  # Args - start
                "-p",  # Create PID file
                "/var/run/udhcpc-" + self.INTF + ".pid",
                "-f",
                "-t",
                "8",  # Random backoff <1, 256>
                "-i",
                self.INTF,
                "-C",  # Don't send MAC address as client-id
                "-B",  # Enable broadcast
                "-S",  # Enable logging to syslog
                "-n",  # Exit if lease is not obtained
                "-I",
                self.DHCP_SOCK_ADDRESS
            ],  # Args - end
            self.DHCP_SOCK_ADDRESS,  # IPC address
            self.BACKOFF_TIMEOUT,  # Timeout in seconds
            self._dhcp_no_lease  # Timeout callback
        )
        self.processes['rcp'] = ProcessInfo(
            [
                "python",  # Args - start
                "-m",
                "rpd.rcp.rcp_process",
                "--ipc-address",
                self.RCP_SOCK_ADDRESS
            ],  # Args - end
            self.RCP_SOCK_ADDRESS  # IPC address
        )

        confFile = '/etc/config/hal.conf'
        self.processes['hal'] = ProcessInfo(
            ("python -m rpd.hal.src.HalMain --conf=" + confFile).split(" "),
            "")
        self.processes['tpc'] = ProcessInfo(
            [
                "python",  # Args - start
                "-m",
                "rpd.tpc",
                "--ipc-address",
                self.TPC_SOCK_ADDRESS
            ],  # Args - end
            self.TPC_SOCK_ADDRESS,  # IPC address
            self.BACKOFF_TIMEOUT,  # Timeout in seconds
            self.reboot  # Timeout callback
        )
        self.processes['example'] = ProcessInfo(
            [
                "python",  # Args - start
                "-m",
                "rpd.example",
                "--ipc-address",
                self.EXAMPLE_PROC_SOCK_ADDRESS
            ],  # Args - end
            self.EXAMPLE_PROC_SOCK_ADDRESS,  # IPC address
            60,  # Timeout in seconds
            self.reboot  # Timeout callback
        )
        self.processes['example'].start(self.example_msg_cb)
        # Source of subTLV codes - section 6.4.1 of
        # http://www.cablelabs.com/wp-content/uploads/specdocs/CM-SP-R-PHY-I01_150615.pdf
        rpd_ident = ['cfg', 'RpdCapabilities', 'RpdIdentification']

        self.dhcp_args_mapping = {
            '0x02': rpd_ident + ['DeviceDescription'],
            '0x04': rpd_ident + ['SerialNumber'],
            '0x05': Manager.hw_version_path,
            '0x06': rpd_ident + ['CurrentSwVersion'],
            '0x07': rpd_ident + ['BootRomVersion'],
            '0x08':
            "".join(SysTools.get_mac_address(
                self.INTF).split(':')[0:3]),  # vendor ID
            '0x09': rpd_ident + ['ModelNumber'],
            '0x0A': rpd_ident + ['VendorName']
        }

        # Fill device information to DB, if not loaded
        mac_addr_str = rpd_ident + ['DeviceMacAddress']
        if self.db_adapter.get_leaf(mac_addr_str) is None:
            # TODO negative case handling
            self.db_adapter.set_leaf(mac_addr_str,
                                     SysTools.get_mac_address(self.INTF), True)

        hostname_str = rpd_ident + ['DeviceAlias']
        if self.db_adapter.get_leaf(hostname_str) is None:
            # TODO negative case handling
            self.db_adapter.set_leaf(hostname_str, SysTools.get_host_name(),
                                     True)

        # TODO get from HW
        if self.db_adapter.get_leaf(Manager.hw_version_path) is None:
            # TODO negative case handling
            self.db_adapter.set_leaf(Manager.hw_version_path,
                                     Manager.hw_version, True)

        self.fsm = Fysom({
            'initial': {
                'state': 'init'
            },
            'events': [{
                'name': 'init_done',
                'src': 'init',
                'dst': 'if_up_waiting'
            }, {
                'name': 'if_is_up',
                'src': 'if_up_waiting',
                'dst': 'dhcpv6_waiting'
            }, {
                'name': 'dhcpv6_failed',
                'src': 'dhcpv6_waiting',
                'dst': 'dhcpv4_waiting'
            }, {
                'name':
                'dhcp_ack',
                'src': [
                    'dhcpv6_waiting', 'dhcpv4_waiting', 'time_waiting',
                    'log_waiting', 'gcp_started'
                ],
                'dst':
                'time_waiting'
            }, {
                'name': 'time_cfged',
                'src': 'time_waiting',
                'dst': 'log_waiting'
            }, {
                'name': 'log_done',
                'src': 'log_waiting',
                'dst': 'gcp_started'
            }, {
                'name':
                'fatal_failure',
                'src': [
                    'if_up_waiting', 'dhcpv6_waiting', 'dhcpv4_waiting',
                    'time_waiting', 'gcp_started'
                ],
                'dst':
                'reboot'
            }],
            'callbacks': {
                'onchangestate': self._onchangestate,
                'onif_is_up': self._on_iface_is_up,
                'ondhcp_ack': self._ondhcp_ack,
                'ontime_cfged': self._ontime_cfged,
                'onlog_done': self._onlog_done,
                'onfatal_failure': self.reboot,
            }
        })