|
|
|
@ -0,0 +1,236 @@
|
|
|
|
|
diff --git calculate/lib/cl_template.py calculate/lib/cl_template.py
|
|
|
|
|
index 6c98b35..75707f0 100644
|
|
|
|
|
--- calculate/lib/cl_template.py
|
|
|
|
|
+++ calculate/lib/cl_template.py
|
|
|
|
|
@@ -2492,7 +2492,7 @@ class _shareTemplate:
|
|
|
|
|
pwdObj = pwd.getpwnam(userName)
|
|
|
|
|
uid = pwdObj.pw_uid
|
|
|
|
|
gid = pwdObj.pw_gid
|
|
|
|
|
- homeDir = pwdObj.pw_dir
|
|
|
|
|
+ homeDir = self.objVar.Get('ur_home_path')
|
|
|
|
|
except:
|
|
|
|
|
raise TemplatesError(_("User %s not found")%str(userName))
|
|
|
|
|
if groupsInfo:
|
|
|
|
|
@@ -4253,6 +4253,7 @@ gettext -d cl_template "$*"
|
|
|
|
|
"""Check template variable cl_name in first directories and files"""
|
|
|
|
|
skipDirs = []
|
|
|
|
|
skipTemplates = []
|
|
|
|
|
+ debug = self.objVar.Get('cl_env_debug_set') == "on"
|
|
|
|
|
for dirsTemplate in dirsTemplates:
|
|
|
|
|
filesAndDirs = map(lambda x: os.path.join(dirsTemplate,x),
|
|
|
|
|
os.listdir(dirsTemplate))
|
|
|
|
|
@@ -4274,8 +4275,9 @@ gettext -d cl_template "$*"
|
|
|
|
|
if textTemplate:
|
|
|
|
|
headerLine = self.getHeaderText(textTemplate)
|
|
|
|
|
if headerLine:
|
|
|
|
|
- if not "cl_name==" in headerLine and \
|
|
|
|
|
- not "ac_" in headerLine:
|
|
|
|
|
+ if not debug and \
|
|
|
|
|
+ not "cl_name==" in headerLine and \
|
|
|
|
|
+ not "ac_" in headerLine:
|
|
|
|
|
if flagDir:
|
|
|
|
|
skipDirs.append(dirFile)
|
|
|
|
|
else:
|
|
|
|
|
@@ -5294,6 +5296,10 @@ gettext -d cl_template "$*"
|
|
|
|
|
if objHeadNew.params.has_key("mirror"):
|
|
|
|
|
if objHeadNew.params.has_key("link"):
|
|
|
|
|
templateFile = objHeadNew.params['link']
|
|
|
|
|
+ if templateFile and templateFile[0] == "~":
|
|
|
|
|
+ # Получаем директорию пользователя
|
|
|
|
|
+ templateFile = os.path.join(self.homeDir,
|
|
|
|
|
+ templateFile.partition("/")[2],"")[:-1]
|
|
|
|
|
templateFile = pathJoin(self._baseDir, templateFile)
|
|
|
|
|
if not os.path.exists(templateFile):
|
|
|
|
|
if os.path.exists(pathOldFile):
|
|
|
|
|
@@ -5312,6 +5318,10 @@ gettext -d cl_template "$*"
|
|
|
|
|
if objHeadNew.params.has_key("link") and\
|
|
|
|
|
not objHeadNew.params.has_key("symbolic"):
|
|
|
|
|
templateFile = objHeadNew.params['link']
|
|
|
|
|
+ if templateFile and templateFile[0] == "~":
|
|
|
|
|
+ # Получаем директорию пользователя
|
|
|
|
|
+ templateFile = os.path.join(self.homeDir,
|
|
|
|
|
+ templateFile.partition("/")[2],"")[:-1]
|
|
|
|
|
templateFile = pathJoin(self._baseDir, templateFile)
|
|
|
|
|
foundTemplateFile = os.path.exists(templateFile)
|
|
|
|
|
if foundTemplateFile:
|
|
|
|
|
@@ -6035,6 +6045,7 @@ class templateClt(scanDirectoryClt, Template):
|
|
|
|
|
# Пропуск шаблонов директорийscanningTemplates
|
|
|
|
|
if self.templDirNameFile == os.path.split(path)[1]:
|
|
|
|
|
return True
|
|
|
|
|
+ self.functObj.currentBelong = ""
|
|
|
|
|
# Проверка на переменные в названии файла
|
|
|
|
|
if not self.getNeedTemplate(path):
|
|
|
|
|
if self.getError():
|
|
|
|
|
diff --git calculate/lib/utils/files.py calculate/lib/utils/files.py
|
|
|
|
|
index e9d19ad..fca4e6e 100644
|
|
|
|
|
--- calculate/lib/utils/files.py
|
|
|
|
|
+++ calculate/lib/utils/files.py
|
|
|
|
|
@@ -44,13 +44,23 @@ def timeout(seconds):
|
|
|
|
|
signal.signal(signal.SIGALRM, original_handler)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
- from magic import open as type_file, MAGIC_NONE as MAGIC_NONE
|
|
|
|
|
-except ImportError:
|
|
|
|
|
+ from magic import (open as type_file, MAGIC_NONE, MAGIC_CONTINUE,
|
|
|
|
|
+ MAGIC_MIME_TYPE, MAGIC_COMPRESS,
|
|
|
|
|
+ MAGIC_MIME_ENCODING, MAGIC_SYMLINK)
|
|
|
|
|
+except ImportError as e:
|
|
|
|
|
try:
|
|
|
|
|
- from magic import open as type_file, NONE as MAGIC_NONE
|
|
|
|
|
+ from magic import (open as type_file, NONE as MAGIC_NONE,
|
|
|
|
|
+ CONTINUE as MAGIC_CONTNUE, MIME_TYPE as MAGIC_MIME_TYPE,
|
|
|
|
|
+ COMPRESS as MAGIC_COMPRESS,MIME_ENCODING as MIME_ENCODING,
|
|
|
|
|
+ SYMLINK as MAGIC_SYMLINK)
|
|
|
|
|
except:
|
|
|
|
|
type_file = None
|
|
|
|
|
- MAGIC_NONE = None
|
|
|
|
|
+ MAGIC_NONE = 0
|
|
|
|
|
+ MAGIC_SYMLINK = 0x002
|
|
|
|
|
+ MAGIC_COMPRESS = 0x004
|
|
|
|
|
+ MAGIC_CONTINUE = 0x020
|
|
|
|
|
+ MAGIC_MIME_TYPE = 0x010
|
|
|
|
|
+ MAGIC_MIME_ENCODING = 0x400
|
|
|
|
|
|
|
|
|
|
from calculate.lib.cl_lang import setLocalTranslate
|
|
|
|
|
setLocalTranslate('cl_lib3',sys.modules[__name__])
|
|
|
|
|
@@ -273,22 +283,33 @@ class proxy_type_file:
|
|
|
|
|
def close(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
+ def _get_cmd_by_flags(self,flags):
|
|
|
|
|
+ """
|
|
|
|
|
+ Получить команду для выполнения по флагам
|
|
|
|
|
+ """
|
|
|
|
|
+ paramdict = {MAGIC_CONTINUE:"-k",
|
|
|
|
|
+ MAGIC_SYMLINK:"-L",
|
|
|
|
|
+ MAGIC_MIME_TYPE:"--mime-type",
|
|
|
|
|
+ MAGIC_MIME_ENCODING:"--mime-encoding",
|
|
|
|
|
+ MAGIC_COMPRESS:"-z"}
|
|
|
|
|
+ appendParam = map(lambda x:paramdict[x],
|
|
|
|
|
+ filter(lambda x:flags & x,
|
|
|
|
|
+ sorted(paramdict.keys())))
|
|
|
|
|
+ fileCmd = getProgPath('/usr/bin/file')
|
|
|
|
|
+ return [fileCmd,'-b']+appendParam
|
|
|
|
|
+
|
|
|
|
|
def file(self,filename):
|
|
|
|
|
if path.exists(filename):
|
|
|
|
|
- if self.flags == 0x410:
|
|
|
|
|
- processFile = process("file","-bi",filename)
|
|
|
|
|
- if processFile.success():
|
|
|
|
|
- return processFile.read().rstrip()
|
|
|
|
|
- else:
|
|
|
|
|
- processFile = process("file","-bz",filename)
|
|
|
|
|
- if processFile.success():
|
|
|
|
|
- return processFile.read().rstrip()
|
|
|
|
|
+ processFile = \
|
|
|
|
|
+ process(*(self._get_cmd_by_flags(self.flags)+[filename]))
|
|
|
|
|
+ if processFile.success():
|
|
|
|
|
+ return processFile.read().rstrip()
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
class typeFile:
|
|
|
|
|
"""Получение типа файла"""
|
|
|
|
|
|
|
|
|
|
- def __init__(self, magic=0x410):
|
|
|
|
|
+ def __init__(self, magic=MAGIC_MIME_ENCODING|MAGIC_MIME_TYPE):
|
|
|
|
|
if type_file is None:
|
|
|
|
|
self.magicObject = proxy_type_file(MAGIC_NONE)
|
|
|
|
|
else:
|
|
|
|
|
@@ -318,12 +339,10 @@ class typeFile:
|
|
|
|
|
def isBinary(self, filename):
|
|
|
|
|
"""является ли файл бинарным"""
|
|
|
|
|
mime = self.getMType(filename)
|
|
|
|
|
- # В случае ошибки
|
|
|
|
|
- if mime.count("`"):
|
|
|
|
|
- return mime
|
|
|
|
|
- elif mime.count("binary"):
|
|
|
|
|
+ if mime.startswith("text"):
|
|
|
|
|
+ return False
|
|
|
|
|
+ else:
|
|
|
|
|
return True
|
|
|
|
|
- return False
|
|
|
|
|
|
|
|
|
|
class scanDirectory:
|
|
|
|
|
"""Класс для cканирования директории"""
|
|
|
|
|
diff --git calculate/lib/utils/ip.py calculate/lib/utils/ip.py
|
|
|
|
|
index 5fd7c18..25d84b5 100644
|
|
|
|
|
--- calculate/lib/utils/ip.py
|
|
|
|
|
+++ calculate/lib/utils/ip.py
|
|
|
|
|
@@ -126,10 +126,17 @@ def intIpToStrIp(addr):
|
|
|
|
|
return "{0}.{1}.{2}.{3}".format(
|
|
|
|
|
addr>>24,(addr>>16)&0xff,(addr>>8)&0xff,addr&0xff)
|
|
|
|
|
|
|
|
|
|
+def numMaskToCidr(netmask):
|
|
|
|
|
+ """
|
|
|
|
|
+ Convert integer mask to cidr
|
|
|
|
|
+ """
|
|
|
|
|
+ neg_net = ctypes.c_uint32(~netmask).value
|
|
|
|
|
+ return 32 - int(math.log(neg_net,2))-1 if neg_net else 32
|
|
|
|
|
+
|
|
|
|
|
def maskToCidr(mask):
|
|
|
|
|
"""Convert mask specified by str to net"""
|
|
|
|
|
mask = strIpToIntIp(mask)
|
|
|
|
|
- return 32-int(math.log(((~mask) & 0xffffffff)+1,2))
|
|
|
|
|
+ return numMaskToCidr(mask)
|
|
|
|
|
|
|
|
|
|
def cidrToMask(cidr):
|
|
|
|
|
"""Convert net to mask specified by str"""
|
|
|
|
|
@@ -234,7 +241,7 @@ def getMask(iface):
|
|
|
|
|
finally:
|
|
|
|
|
sockfd.close()
|
|
|
|
|
netmask = socket.ntohl(struct.unpack('16sH2xI8x', res)[2])
|
|
|
|
|
- return 32 - int(math.log(ctypes.c_uint32(~netmask).value + 1, 2))
|
|
|
|
|
+ return numMaskToCidr(netmask)
|
|
|
|
|
|
|
|
|
|
def getMac(iface):
|
|
|
|
|
"""
|
|
|
|
|
diff --git calculate/lib/variables/__init__.py calculate/lib/variables/__init__.py
|
|
|
|
|
index 5bd1cf6..651c036 100644
|
|
|
|
|
--- calculate/lib/variables/__init__.py
|
|
|
|
|
+++ calculate/lib/variables/__init__.py
|
|
|
|
|
@@ -41,4 +41,4 @@ class VariableClVer(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Package version
|
|
|
|
|
"""
|
|
|
|
|
- value = "3.1.9"
|
|
|
|
|
+ value = "3.1.9.2"
|
|
|
|
|
diff --git calculate/lib/variables/env.py calculate/lib/variables/env.py
|
|
|
|
|
index 6d376e5..83ecdb4 100644
|
|
|
|
|
--- calculate/lib/variables/env.py
|
|
|
|
|
+++ calculate/lib/variables/env.py
|
|
|
|
|
@@ -402,3 +402,10 @@ class VariableClTemplateCltSet(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
def get(self):
|
|
|
|
|
return "on" if "clt" in self.Get('cl_templates_locate') else "off"
|
|
|
|
|
+
|
|
|
|
|
+class VariableClEnvDebugSet(ReadonlyVariable):
|
|
|
|
|
+ """
|
|
|
|
|
+ Переменная для включения отладки
|
|
|
|
|
+ """
|
|
|
|
|
+ type = "bool"
|
|
|
|
|
+ value = "off"
|
|
|
|
|
diff --git calculate/lib/variables/system.py calculate/lib/variables/system.py
|
|
|
|
|
index 1e43f15..70749aa 100644
|
|
|
|
|
--- calculate/lib/variables/system.py
|
|
|
|
|
+++ calculate/lib/variables/system.py
|
|
|
|
|
@@ -75,6 +75,20 @@ class VariableOsRootDev(ReadonlyVariable):
|
|
|
|
|
return {'none':'/dev/ram0'}.get(root_dev,root_dev)
|
|
|
|
|
return ""
|
|
|
|
|
|
|
|
|
|
+class VariableOsMapperRootDev(ReadonlyVariable):
|
|
|
|
|
+ """
|
|
|
|
|
+ Название диска через devicemapper если возможно
|
|
|
|
|
+ """
|
|
|
|
|
+ def get(self):
|
|
|
|
|
+ rootdev = self.Get('os_root_dev')
|
|
|
|
|
+ devLinks = getUdevDeviceInfo(name=rootdev).get("DEVLINKS","")
|
|
|
|
|
+ if devLinks:
|
|
|
|
|
+ mapperName = filter(lambda x:"/dev/mapper" in x,
|
|
|
|
|
+ devLinks.split())
|
|
|
|
|
+ if mapperName:
|
|
|
|
|
+ return mapperName[0]
|
|
|
|
|
+ return rootdev
|
|
|
|
|
+
|
|
|
|
|
class VariableOsRootType(ReadonlyVariable):
|
|
|
|
|
"""
|
|
|
|
|
Root type (ram, hdd, usb-hdd, livecd)
|