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 _pack_mcast_group_source_req(self): try: grp_addrinfo = socket.getaddrinfo(self.grp_ip, None)[0] family = grp_addrinfo[0] src_addrinfo = socket.getaddrinfo(self.src_ip, None)[0] ifindex = SysTools.if_nametoindex(self.interface) if ifindex is None: raise McastException("ifindex is None for %s" % self.interface) """ mcast_req as : uint32_t interface; struct sockaddr_storage group_req; (128 bytes); struct sockaddr_storage source_req; (128 bytes); for the sockaddr_storage: if this is INET6 family first 28 bytes are struct sockaddr_in6 type: sa_family_t sin6_family (2byte); in_port_t sin6_port (2byte); uint32_t sin6_flowinfo (4byte); struct in6_addr sin6_addr (16 bytes); uint32_t sin6_scope_id; (4 byte) if this is the INET family first 16 bytes are struct sockaddr_in type: sa_family_t sa_family (2byte) in_port_t sin_port (2byte) struct in_addr sin_addr (4byte) padding (8 bytes) char sa_data[14] """ if family == socket.AF_INET: group_ip_bin = socket.inet_aton(self.grp_ip) group_req = struct.pack( 'HH', family, self.port) + group_ip_bin + struct.pack( '120s', "") source_ip_bin = socket.inet_aton(self.src_ip) source_req = struct.pack( 'HH', family, 0) + source_ip_bin + struct.pack('120s', "") proto = socket.IPPROTO_IP else: group_ipv6_bin = socket.inet_pton(family, grp_addrinfo[4][0]) group_req = struct.pack('HHI', family, self.port, 0) + group_ipv6_bin + struct.pack( 'I100s', 0, "") source_ipv6_bin = socket.inet_pton(family, src_addrinfo[4][0]) source_req = struct.pack('HHI', family, 0, 0) + source_ipv6_bin + struct.pack( 'I100s', 0, "") proto = socket.IPPROTO_IPV6 """ for alignment, 64bit total size is 264, 32bit system, total size is 260 """ arch = platform.architecture() if arch[0] == "32bit": mcast_req = struct.pack('I', ifindex) + group_req + source_req else: mcast_req = struct.pack('II', ifindex, 0) + group_req + source_req return (mcast_req, proto) except Exception as e: self.logger.warning( "exception happen when prepare mcast_grp_src_req grp_ip[%s],src_ip[%s],local[%s]: %s", self.grp_ip, self.src_ip, self.local_ip, str(e)) return (None, None)