You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-overlay/sys-apps/calculate-lib/files/calculate-lib-2.1.11-fix_ge...

186 lines
6.2 KiB

diff --git a/pym/cl_fill.py b/pym/cl_fill.py
index c5dea91..e86343d 100644
--- a/pym/cl_fill.py
+++ b/pym/cl_fill.py
@@ -129,57 +129,22 @@ class fillVars(object, cl_base.glob_attr):
# все ip
def get_os_net_ip(self):
"""все ip компьютера, разделитель запятая"""
- IPs = []
- netInterfaces=cl_utils.getdirlist("/sys/class/net/")
- for i in netInterfaces:
- res = self._runos("/sbin/ifconfig %s"%i)
- if not res:
- break
- for line in res:
- searchIP = re.search('addr:([0-9\.]+).+Bcast:', line)
- if searchIP:
- # ip адрес
- ip = searchIP.groups()[0]
- IPs.append(ip)
- return ",".join(IPs)
+ return ",".join(map(cl_utils.getIp,
+ cl_utils.getInterfaces()))
# Разрешенные сети (в данном случае все сети)
def get_os_net_allow(self):
"""Разрешенные сети разделитель запятая"""
-
- def getNet(ip, mask):
- """По ip и маске получаем сеть"""
- octetsMult = (0x1, 0x100, 0x10000, 0x1000000)
- octetsIp = map(lambda x: int(x), ip.split("."))
- octetsMask = map(lambda x: int(x), mask.split("."))
- ipNumb = 0
- for i in octetsMult:
- ipNumb += octetsIp.pop()*i
- maskNumb = 0
- for i in octetsMult:
- maskNumb += octetsMask.pop()*i
- startIpNumber = maskNumb&ipNumb
- x = startIpNumber
- nMask = lambda y: len(filter(lambda x: y >> x &1 ,range(32)))
- return "%s.%s.%s.%s/%s"\
- %(x>>24, x>>16&255, x>>8&255, x&255, nMask(maskNumb))
-
networks=[]
- netInterfaces=cl_utils.getdirlist("/sys/class/net/")
- flagError = False
+ netInterfaces=cl_utils.getInterfaces()
for i in netInterfaces:
- res = self._runos("/sbin/ifconfig %s"%i)
- if not res:
- flagError = True
- break
- for j in res:
- s_ip=re.search('addr:([0-9\.]+).+Bcast:.+Mask:([0-9\.]+)' ,j)
- if s_ip:
- ip, mask = s_ip.groups()
- networks.append(getNet(ip, mask))
- if flagError:
- return ""
- return ",".join(networks)
+ ipaddr, mask = cl_utils.getIp(i), \
+ cl_utils.cidrToMask(cl_utils.getMask(i))
+ if ipaddr and mask:
+ networks.append(cl_utils.getIpNet(ipaddr, mask))
+ else:
+ networks.append("")
+ return ",".join(filter(lambda x:x,networks))
def get_os_locale_locale(self):
"""локаль (прим: ru_RU.UTF-8)"""
diff --git a/pym/cl_utils.py b/pym/cl_utils.py
index 195d4d5..8f25ffd 100644
--- a/pym/cl_utils.py
+++ b/pym/cl_utils.py
@@ -21,6 +21,11 @@ from re import search, compile, S
import os
import types
import subprocess
+import socket
+import struct
+import fcntl
+import math
+import ctypes
def getdirlist(s_path):
#Получить список директорий по указаному пути
@@ -508,3 +513,96 @@ def _toUNICODE(val):
return val
else:
return str(val).decode('UTF-8')
+
+SYSFS_NET_PATH = "/sys/class/net"
+
+# From linux/sockios.h
+SIOCGIFADDR = 0x8915
+SIOCGIFNETMASK = 0x891B
+SIOCGIFHWADDR = 0x8927
+
+def getInterfaces():
+ """
+ Get available interfaces (discard which hasn't device)
+ """
+ try:
+ return filter(lambda x:os.path.exists(
+ os.path.join(SYSFS_NET_PATH,x,"device")),
+ os.listdir(SYSFS_NET_PATH))
+ except:
+ return []
+
+def getIp(iface):
+ sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
+ try:
+ res = fcntl.ioctl(sockfd, SIOCGIFADDR, ifreq)
+ except IOError:
+ return ""
+ finally:
+ sockfd.close()
+ ip = struct.unpack('16sH2x4s8x', res)[2]
+ return socket.inet_ntoa(ip)
+
+def getMask(iface):
+ """
+ Get mask for interface
+ """
+ sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ ifreq = struct.pack('16sH14s', iface, socket.AF_INET, '\x00'*14)
+ try:
+ res = fcntl.ioctl(sockfd, SIOCGIFNETMASK, ifreq)
+ except IOError:
+ return 0
+ finally:
+ sockfd.close()
+ netmask = socket.ntohl(struct.unpack('16sH2xI8x', res)[2])
+ return 32 - int(math.log(ctypes.c_uint32(~netmask).value + 1, 2))
+
+def getMac(iface):
+ """
+ Get mac for interface
+ """
+ sockfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
+ ifreq = struct.pack('16sH14s', iface, socket.AF_UNIX, '\x00'*14)
+ res = fcntl.ioctl(sockfd, SIOCGIFHWADDR, ifreq)
+ address = struct.unpack('16sH14s', res)[2]
+ mac = struct.unpack('6B8x', address)
+ sockfd.close()
+ return ":".join(['%02X' % i for i in mac])
+
+def intIpToStrIp(addr):
+ """Convert ip specified by integer to string"""
+ return "{0}.{1}.{2}.{3}".format(
+ addr>>24,(addr>>16)&0xff,(addr>>8)&0xff,addr&0xff)
+
+def maskToCidr(mask):
+ """Convert mask specified by str to net"""
+ mask = strIpToIntIp(mask)
+ return 32-int(math.log(((~mask) & 0xffffffff)+1,2))
+
+def cidrToMask(cidr):
+ """Convert net to mask specified by str"""
+ return intIpToStrIp((2**cidr-1)<<(32-cidr))
+
+def strIpToIntIp(addr):
+ """Convert ip specified by string to integer"""
+ addr = addr.split('.')
+ return ((int(addr[0])<<24)|
+ (int(addr[1])<<16)|
+ (int(addr[2])<<8)|
+ (int(addr[3])))
+ return reduce(lambda x,y:x+(int(y[1])<<(y[0]*8)),
+ enumerate(reversed(addr.split("."))),0)
+
+def getIpNet(ip,mask=None,cidr=None):
+ """Get net (xx.xx.xx.xx/xx) by ip address and mask"""
+ ip = strIpToIntIp(ip)
+ if not mask is None:
+ net = maskToCidr(mask)
+ else:
+ net = int(cidr)
+ mask = cidrToMask(net)
+ mask = strIpToIntIp(mask)
+ return "{ip}/{net}".format(ip=intIpToStrIp(ip&mask),
+ net=net)