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
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)
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 } })
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)
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
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
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, } })