import base64 import os import sys import glob import re import FileIface import fsio import syslog APPL_PATH = "/home/tool/web2py/applications/BS350" JS_CTRL_PATH = APPL_PATH + "/static/app/controller" CONFIG_PATH = "/home/tool/config/" _DEFAULT_PATH = CONFIG_PATH + "default/" RESSRV_FILENAME = CONFIG_PATH + 'ResSrv.json' SECURITY_FILENAME = CONFIG_PATH + 'SecSrv.json' WLAN_FILENAME = CONFIG_PATH + 'wlan.json' WLAN_DEFAULT_FILENAME = _DEFAULT_PATH + 'wlan.json' QCODE_FILENAME = CONFIG_PATH + 'QCode.json' QCODE_DEFAULT_FILENAME = _DEFAULT_PATH + 'QCode.json' ASSIGN_FILENAME = CONFIG_PATH + 'scanAssign.json' ASSIGN_DEFAULT_FILENAME = _DEFAULT_PATH + 'scanAssign.json' SCANNER_FILENAME = CONFIG_PATH + 'scanCfg.json' SCANNER_DEFAULT_FILENAME = _DEFAULT_PATH + 'scanCfg.json' AUTH_EXPIRATION_FILE = CONFIG_PATH + 'auth_expiration.json' BMS_PATH = CONFIG_PATH + "plctab" BMS_DEFAULT_PATH = _DEFAULT_PATH + "plctab" JOB_PATH = CONFIG_PATH + 'jobs' JOB_DEFAULT_PATH = _DEFAULT_PATH + 'jobs' SD_DOC_DIR_NAME = 'documentation' SD_CFG_DIR_NAME = 'config' SD_LOGS_DIR_NAME = 'logs' SD_CFG_EXT = 'nxcfg' PRG_PATH = '/home/tool/config/srbprg' SH_TOOL_PATH = '/etc/backup' SEVEN_ZIP_BIN = '/home/tool/bin/7za' CHAN_CONF_FILENAME = '/home/tool/config/ChanCfg.json' CONFIG_JOB_IMPORTER = CONFIG_PATH + "job_importer" CONFIG_PRG_IMPORTER = CONFIG_PATH + "prg_importer" TMP_CRED_FILENAME = "TMP_CRED" # FTP_TO_SD_CARD_FILENAME = CONFIG_PATH + "FtpToSDCfg.json" def get_existent_ctrls(): existentCtrls = [] for fname in os.listdir(JS_CTRL_PATH): if fname.endswith("Ctrl.js"): existentCtrls.append(fname[:-3]) return existentCtrls def getSDPaths(): """ Return list of auto-mounted directories from SD card """ paths = [] blockList = [os.path.basename(i) for i in glob.glob('/sys/class/block/mmcblk*')] if blockList: # check if sd has partitions (mmcblk*p*) partitions = filter(lambda x: 'p' in x, blockList) # Use partition blocks or device block if SD has no partitions tmppaths = partitions if partitions else blockList # Get mount path from block name tmppaths = [os.path.join('/mnt/mmc', path) for path in tmppaths] # Filter existing/accessible paths paths = filter(lambda path: os.access(path, os.F_OK), tmppaths) return paths def generatePwd(): import base64 import hashlib return base64.b64encode(hashlib.sha1('NexoOS').digest()) def generateLogPwd(): import base64 import hashlib backup = fsio.jsonload("/home/tool/config/backup.json") return base64.b64encode(hashlib.sha1("SecretNexoOS{0}{1}".format(getMajorVersion(), backup['log_passwd'])).digest()) def generateCfgPwd(): import base64 import hashlib pw = "NexoOS{0}".format(getMajorVersion()) return base64.b64encode(hashlib.sha1(pw).digest()) def getMajorVersion(): v = version() return v.split("-")[1] def version(): try: with open('/etc/version', 'r') as f: version = f.readlines()[0] return version.strip() except: return '-' def getPrevMajorVersion(): v = prevVersion() return v.split("-")[1] def prevVersion(): try: with open(FileIface.PARSYSTEM, 'r') as f: version = f.readlines()[0] return version.strip() except: return '-' def cfg_list(): """Retrieve the whole config list revision file and return it as json structure""" # . => any character (except newline, with DOTALL even newline matches) # \s => [ \t\n\r\f\v] # \S => [^ \t\n\r\f\v] # * => zero or more # + => one or more reLine = re.compile(r'^\s*(\S+)\s+(\S+)\s*.*$') filename = "/home/tool/config/CfgList" cfgList = fsio.read(filename) lines = cfgList.split("\n") res = {} for l in lines: l = l.strip() g = reLine.match(l) if g is not None: res[g.groups()[0]] = g.groups()[1] return res def cfg_rev(filename): """Get the current revision of a specific file""" return cfg_list().get(filename) def gen_rev_pwd(filename): """generate a revision password from a specific file""" rev = cfg_rev(filename) pwd = base64.b64encode(rev) return pwd def gen_mode_rev_pwd(): """generate a revision password for mode export and import""" fn_idle_cw = "jobs/idle_cw.lua" fn_idle_en = "jobs/idle_en.lua" fn_init = "jobs/init.lua" rev_idle_cw = cfg_rev(fn_idle_cw) rev_idle_en = cfg_rev(fn_idle_en) rev_init = cfg_rev(fn_init) pwd = "cw:{0},en:{1},init:{2}".format(rev_idle_cw, rev_idle_en, rev_init) return base64.b64encode(pwd) def write_credentials_to_SD(path, obj, ret): """write current credentials from level 5 user to sd card""" if not path: ret['success'] = False ret['msg'] = "No SD card" return import subprocess file_target = os.path.join(path, "."+TMP_CRED_FILENAME) tmp_target = os.path.join("/tmp", TMP_CRED_FILENAME) try: backup_json = fsio.jsonload("/home/tool/config/backup.json") pwd = backup_json['log_passwd'] fsio.write(tmp_target, str(obj)) p = subprocess.Popen([SEVEN_ZIP_BIN, "u", file_target, "-p" + pwd, tmp_target], stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.communicate() os.remove(tmp_target) except: syslog.syslog(syslog.LOG_ERR, str(sys.exc_info()[1])) ret['success': False] ret['msg': str(sys.exc_info()[1])]