|
|
|
@ -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)
|
|
|
|
|