|
|
#-*- coding: utf-8 -*-
|
|
|
|
|
|
# Copyright 2008-2010 Calculate Ltd. http://www.calculate-linux.org
|
|
|
#
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
# You may obtain a copy of the License at
|
|
|
#
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
#
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
# See the License for the specific language governing permissions and
|
|
|
# limitations under the License.
|
|
|
|
|
|
import sys, os
|
|
|
|
|
|
from cl_print import color_print
|
|
|
from cl_datavars import DataVars
|
|
|
|
|
|
import cl_overriding
|
|
|
# translate language
|
|
|
import cl_lang
|
|
|
tr = cl_lang.lang()
|
|
|
tr.setLocalDomain('cl_lib')
|
|
|
tr.setLanguage(sys.modules[__name__])
|
|
|
|
|
|
class services(color_print):
|
|
|
'''Общие методы для серверных программ,
|
|
|
|
|
|
Методы для работы с сервисами'''
|
|
|
clLibVars = False
|
|
|
|
|
|
def createClLibVars(self, clLibVars=False):
|
|
|
"""Создает объект библиотечных переменных"""
|
|
|
if not clLibVars:
|
|
|
clLibVars = DataVars()
|
|
|
# Заменяем значения переменных переменными из env файлов
|
|
|
clLibVars.flIniFile()
|
|
|
# Устанавливаем у объекта атрибут объект переменных
|
|
|
self.clLibVars = clLibVars
|
|
|
return True
|
|
|
|
|
|
def allServicesApi(self):
|
|
|
self.createClLibVars(clLibVars=self.clLibVars)
|
|
|
apiDict = self.clLibVars.Get('cl_api')
|
|
|
if not apiDict or not type(apiDict) is dict:
|
|
|
return []
|
|
|
apiFiles = apiDict.values()
|
|
|
apiObjects = []
|
|
|
for apiFile in apiFiles:
|
|
|
importPath, moduleName = os.path.split(apiFile)
|
|
|
moduleName = moduleName.rpartition(".py")[0]
|
|
|
if not importPath in sys.path:
|
|
|
sys.path.insert(0, importPath)
|
|
|
try:
|
|
|
className = getattr(__import__(moduleName,
|
|
|
globals(), locals(),
|
|
|
['serviceAPI']),
|
|
|
'serviceAPI')
|
|
|
except (ImportError, AttributeError):
|
|
|
self.printERROR(_("Can not import module %s")% apiFile)
|
|
|
return False
|
|
|
try:
|
|
|
apiObjects.append(className())
|
|
|
except:
|
|
|
self.printERROR(_("Can not create API object"))
|
|
|
self.printERROR(_("Module %s")% apiFile)
|
|
|
return False
|
|
|
return apiObjects
|
|
|
|
|
|
def runMethodToPkg(self, pkgName, methodName, argv=[]):
|
|
|
"""Execute method from pkg"""
|
|
|
allServObjs = self.allServicesApi()
|
|
|
if allServObjs is False:
|
|
|
return False
|
|
|
allSetupServObjs = filter(lambda x:\
|
|
|
x.isSetup() and x.getPkgName()==pkgName,
|
|
|
allServObjs)
|
|
|
if not allSetupServObjs:
|
|
|
return False
|
|
|
pkgObj = allSetupServObjs[0]
|
|
|
if not hasattr(pkgObj, methodName):
|
|
|
self.printERROR(_("Can not found method %(method)s in \
|
|
|
API object service %(service)s") %{'method':methodName,
|
|
|
'service':pkgObj.getServiceName()})
|
|
|
cl_overriding.exit(1)
|
|
|
if argv:
|
|
|
res = getattr(pkgObj, methodName)(*argv)
|
|
|
else:
|
|
|
res = getattr(pkgObj, methodName)()
|
|
|
return res
|
|
|
|
|
|
def runMethodFromAllServices(self, methodName, sortedServices="normal",
|
|
|
argv=[], result='bool'):
|
|
|
"""Execute method from all setup services"""
|
|
|
if not result in ('bool', 'list'):
|
|
|
self.printERROR(_("Method: runMethodFromAllServices()"))
|
|
|
self.printERROR(_("Can't result argv in bool or list"))
|
|
|
cl_overriding.exit(1)
|
|
|
allServObjs = self.allServicesApi()
|
|
|
if allServObjs is False:
|
|
|
return False
|
|
|
allSetupServObjs = filter(lambda x: x.isSetup(), allServObjs)
|
|
|
|
|
|
def smpPrioritetReverse(objectA, objectB):
|
|
|
'''Comparison of the run priorities of objects
|
|
|
|
|
|
to sort in descending order
|
|
|
'''
|
|
|
prioritetA = objectA.getRunPrioritet()
|
|
|
prioritetB = objectB.getRunPrioritet()
|
|
|
if prioritetA == prioritetB:
|
|
|
return 0
|
|
|
elif prioritetA < prioritetB:
|
|
|
return 1
|
|
|
else:
|
|
|
return -1
|
|
|
|
|
|
def smpPrioritetNormal(objectA, objectB):
|
|
|
'''Comparison of the run priorities of objects
|
|
|
|
|
|
to sort in descending order
|
|
|
'''
|
|
|
prioritetA = objectA.getRunPrioritet()
|
|
|
prioritetB = objectB.getRunPrioritet()
|
|
|
if prioritetA == prioritetB:
|
|
|
return 0
|
|
|
elif prioritetA > prioritetB:
|
|
|
return 1
|
|
|
else:
|
|
|
return -1
|
|
|
if sortedServices == "normal":
|
|
|
smpPrioritet = smpPrioritetNormal
|
|
|
elif sortedServices == "reverse":
|
|
|
smpPrioritet = smpPrioritetReverse
|
|
|
else:
|
|
|
smpPrioritet = smpPrioritetNormal
|
|
|
allSetupServObjs.sort(smpPrioritet)
|
|
|
if result=='list':
|
|
|
data = []
|
|
|
for service in allSetupServObjs:
|
|
|
if not hasattr(service, methodName):
|
|
|
self.printERROR(_("Can not found method %(method)s in \
|
|
|
API object service %(service)s") %{'method':methodName,
|
|
|
'service':service.getServiceName()})
|
|
|
cl_overriding.exit(1)
|
|
|
if argv:
|
|
|
res = getattr(service, methodName)(*argv)
|
|
|
else:
|
|
|
res = getattr(service, methodName)()
|
|
|
if result=='bool':
|
|
|
if res is False:
|
|
|
return False
|
|
|
elif result=='list':
|
|
|
serviceName = service.getServiceName()
|
|
|
data.append((serviceName, res))
|
|
|
if result=='bool':
|
|
|
return True
|
|
|
elif result=='list':
|
|
|
return data
|
|
|
|
|
|
def stopAllServices(self):
|
|
|
"""Stop all services that were setup"""
|
|
|
return self.runMethodFromAllServices("stop", sortedServices="reverse")
|
|
|
|
|
|
def startAllServices(self):
|
|
|
"""Start all services that were setup"""
|
|
|
return self.runMethodFromAllServices("start")
|
|
|
|
|
|
def delRunlevelAllServices(self):
|
|
|
"""Delete all services that were setup from runlevel"""
|
|
|
return self.runMethodFromAllServices("delRunlevel",
|
|
|
sortedServices="reverse")
|
|
|
def delVarsFromAllServices(self):
|
|
|
"""Delete template vars from all services"""
|
|
|
return self.runMethodFromAllServices("delVarsFromEnv",
|
|
|
sortedServices="reverse")
|
|
|
|
|
|
def getInfoFromAllServices(self, request):
|
|
|
"""Get info from all services"""
|
|
|
return self.runMethodFromAllServices("getServiceInfo", argv=[request],
|
|
|
result='list')
|
|
|
def clGetVar(self, pkgName, varName):
|
|
|
"""Get variable value from pkg"""
|
|
|
clVars = self.runMethodToPkg(pkgName, 'getVars')
|
|
|
if clVars is False:
|
|
|
return ""
|
|
|
try:
|
|
|
value = clVars.Get(varName)
|
|
|
except:
|
|
|
self.printERROR(_("Can not found variable %(var)s "
|
|
|
"in package %(pkg)s") %{'var':varName,
|
|
|
'pkg':pkgName})
|
|
|
cl_overriding.exit(1)
|
|
|
return value
|
|
|
|
|
|
def clGet(self, pkgNameOrAll, request):
|
|
|
"""Get info from service or all services"""
|
|
|
res = ""
|
|
|
if pkgNameOrAll == "all":
|
|
|
listData = self.getInfoFromAllServices(request)
|
|
|
if not listData:
|
|
|
return res
|
|
|
res = "\n".join(map(lambda x: x[1], listData))
|
|
|
else:
|
|
|
res = self.runMethodToPkg(pkgNameOrAll, "getServiceInfo",
|
|
|
argv=[request])
|
|
|
if not res:
|
|
|
res = ""
|
|
|
return res |