diff --git a/i18n/cl_lib_ru.mo b/i18n/cl_lib_ru.mo index 323ab4b..eaa0c41 100644 Binary files a/i18n/cl_lib_ru.mo and b/i18n/cl_lib_ru.mo differ diff --git a/pym/cl_base.py b/pym/cl_base.py index ad7d96d..aa79af4 100644 --- a/pym/cl_base.py +++ b/pym/cl_base.py @@ -379,6 +379,7 @@ class iniParser(cl_profile._error): return False self.checkIni = "samba" # В файле есть данные + textIni = re.sub(r"^#.*$",textIni,'',re.M) if not self.isEmptyFile(textIni): try: objIni = cl_profile.plasma(textIni) @@ -878,6 +879,8 @@ class DataVars(object): calculate_ini = self.__getPathCalculateIni() # получаем полный путь до файла ini if location == 'default': + name_calculate_ini = calculate_ini[3] + if location == 'custom': name_calculate_ini = calculate_ini[2] elif location == 'local': name_calculate_ini = calculate_ini[1] @@ -917,6 +920,8 @@ class DataVars(object): calculate_ini = self.__getPathCalculateIni() # получаем полный путь до файла ini if location == 'default': + name_calculate_ini = calculate_ini[3] + if location == 'custom': name_calculate_ini = calculate_ini[2] elif location == 'local': name_calculate_ini = calculate_ini[1] @@ -1000,7 +1005,7 @@ class DataVars(object): act_section = self.__getActiveSections() set_act_section = set(act_section) i = 0 - locations = ['remote','local','default'] + locations = ['remote','local','custom','default'] for name_calculate_ini in calculate_ini: # проверить сущестование ini файла if os.path.exists(name_calculate_ini): diff --git a/pym/cl_fill.py b/pym/cl_fill.py index 0ec327c..f5b5c8a 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_profile.py b/pym/cl_profile.py index dda1318..87acf30 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -20,6 +20,9 @@ import cl_base import stat import re import xml.dom.minidom +import xml +if hasattr(xml,"use_pyxml"): + xml.use_pyxml() from xml import xpath import subprocess import types diff --git a/pym/cl_utils.py b/pym/cl_utils.py index 8be7251..dc626c6 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): #Получить список директорий по указаному пути @@ -291,7 +296,8 @@ def runOsCommand(cmd, inStr=None, ret_first=None, env_dict=None): retcode = pipe.wait() res = fout.readlines() fout.close() - res += ferr.readlines() + if not ("dovecot start" in cmd or "dovecot restart" in cmd): + res += ferr.readlines() ferr.close() if res: if len(res) == 1 or ret_first: @@ -508,3 +514,94 @@ 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: x!= "lo",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) diff --git a/pym/cl_vars.py b/pym/cl_vars.py index 381ddfd..6f857ea 100644 --- a/pym/cl_vars.py +++ b/pym/cl_vars.py @@ -39,7 +39,8 @@ class Data: # Пути к ini файлам cl_env_path = {'value':['/var/calculate/remote/calculate.env', '/var/calculate/calculate.env', - '/etc/calculate/calculate.env']} + '/etc/calculate/calculate.env', + '/var/lib/calculate/calculate.env']} # локаль (прим: ru_RU.UTF-8) os_locale_locale = {}