Current Path : /usr/local/mgr5/sbin/ |
Current File : //usr/local/mgr5/sbin/pkg_configure_roundcube.py |
#!/usr/bin/env python # coding: utf-8 import sys sys.path.insert(0, '/usr/local/mgr5/lib/pkgpython') from core_pkg_funcs import * import re import os def OStype(): ''' тип ОС ''' if os.path.exists('/etc/debian_version'): return 'DEBIAN' elif os.path.exists('/etc/redhat-release'): return 'CENTOS' else: uname, _, _ = CmdRun(['uname']) if 'FreeBSD' in uname: return 'FREEBSD' return 'UNKNOWN' # Определяем ISPmanager-Lite тут или ISPmanager-Node # TODO: Перенести в ISPMGR LIB потом ISPMGR = 'ispmgr' with open('/usr/local/mgr5/etc/mgrlist.conf', 'r') as mgrlist_conf: for line in mgrlist_conf: line.strip() if 'ispmgrnode' in line: ISPMGR = 'ispmgrnode' break OSFAMILY = OStype() # TODO: перенести в ISPMGR LIB def ReloadWeb(): modules = Mgr(ISPMGR).param_get_list('WebModules') if 'apache' in modules: if OSFAMILY == 'CENTOS': Service('httpd').reload() elif OSFAMILY == 'DEBIAN': Service('apache2').reload() elif OSFAMILY == 'FREEBSD': Service('apache24').reload() if 'nginx' in modules: Service('nginx').reload() if OSFAMILY == 'CENTOS': Service('php-fpm').reload() elif OSFAMILY == 'DEBIAN': Service('php5-fpm').reload() elif OSFAMILY == 'FREEBSD': Service('php-fpm').reload() ROUNDVER = 0.9 if OSFAMILY == 'CENTOS': if os.path.isfile('/etc/roundcuemail/db.inc.php') and os.path.isfile('/etc/roundcuemail/main.inc.php'): ROUNDCUBE_DBCONF = '/etc/roundcubemail/db.inc.php' ROUNDCUBE_CONF = '/etc/roundcubemail/main.inc.php' else: ROUNDCUBE_DBCONF = '/etc/roundcubemail/config.inc.php' ROUNDCUBE_CONF = ROUNDCUBE_DBCONF ROUNDVER = 1 ROUNDCUBE_APACHECONF = '/etc/httpd/conf.d/roundcubemail.conf' DBNAME = 'roundcube' elif OSFAMILY == 'DEBIAN': ROUNDCUBE_DBCONF = '/etc/roundcube/debian-db.php' if os.path.isfile('/etc/roundcube/main.inc.php'): ROUNDCUBE_CONF = '/etc/roundcube/main.inc.php' else: ROUNDCUBE_CONF = '/etc/roundcube/config.inc.php' ROUNDVER = 1 ROUNDCUBE_APACHECONF = '/etc/apache2/conf.d/roundcube' DBNAME = 'roundcube' else: ROUNDCUBE_CONF = '/usr/local/www/roundcube/config/config.inc.php' ROUNDCUBE_DBCONF = ROUNDCUBE_CONF ROUNDVER = 1 ROUNDCUBE_APACHECONF = '/etc/apache2/conf.d/roundcube' DBNAME = 'roundcube' if ROUNDVER < 1: DB_RE = re.compile(r"(^\$rcmail_config\['db_dsnw'\]).*") HOST_RE = re.compile(r"(^\$rcmail_config\['default_host'\]).*") SMTP_HOST_RE = re.compile(r"(^\$rcmail_config\['smtp_server'\]).*") AUTH_RE = re.compile(r"(^\$rcmail_config\['imap_auth_type'\]).*") AUTH_TYPE_STR = "$rcmail_config['imap_auth_type'] = 'plain';\n" TEMP_RE = re.compile(r"(^\$rcmail_config\['temp_dir'\]).*") LANG_RE = re.compile(r"(^\$rcmail_config\['language'\]).*") SMTP_AUTH_RE = re.compile(r"(^\$rcmail_config\['smtp_auth_type'\]).*") SMTP_AUTH_TYPE_STR = "$rcmail_config['smtp_auth_type'] = 'plain';\n" SMTP_USER_RE = re.compile(r"(^\$rcmail_config\['smtp_user'\]).*") SMTP_PASS_RE = re.compile(r"(^\$rcmail_config\['smtp_pass'\]).*") CREATE_DIRS_RE = re.compile(r"(^\$rcmail_config[\'create_default_folders\']).*") CREATE_DIRS_STR = "$rcmail_config['create_default_folders'] = true;\n" else: DB_RE = re.compile(r"(^\$config\['db_dsnw'\]).*") HOST_RE = re.compile(r"(^\$config\['default_host'\]).*") SMTP_HOST_RE = re.compile(r"(^\$config\['smtp_server'\]).*") AUTH_RE = re.compile(r"(^\$config\['imap_auth_type'\]).*") AUTH_TYPE_STR = "$config['imap_auth_type'] = 'plain';\n" TEMP_RE = re.compile(r"(^\$config\['temp_dir'\]).*") LANG_RE = re.compile(r"(^\$config\['language'\]).*") SMTP_AUTH_RE = re.compile(r"(^\$config\['smtp_auth_type'\]).*") SMTP_AUTH_TYPE_STR = "$config['smtp_auth_type'] = 'plain';\n" SMTP_USER_RE = re.compile(r"(^\$config\['smtp_user'\]).*") SMTP_PASS_RE = re.compile(r"(^\$config\['smtp_pass'\]).*") CREATE_DIRS_RE = re.compile(r"(^\$config[\'create_default_folders\']).*") CREATE_DIRS_STR = "$config['create_default_folders'] = true;\n" def get_dump_file(): ''' Получить путь к дампу ''' if OSFAMILY == 'CENTOS': import rpm ts = rpm.ts() mi = ts.dbMatch('name', 'roundcubemail') if not mi: # Если нету пакета, выходим sys.exit(1) # Ищем, где лежит дамп for h in mi: pkg = h break sqldump = None for fname in pkg['FILENAMES']: if 'mysql.initial.sql' in fname: sqldump = fname break if not sqldump: print("Can not find dump") sys.exit(1) elif OSFAMILY == 'DEBIAN': sqldump = '/usr/share/dbconfig-common/data/roundcube/install/mysql' elif OSFAMILY == 'FREEBSD': sqldump = '/usr/local/www/roundcube/SQL/mysql.initial.sql' else: raise Exception('Unknown OS') return sqldump def roundcube_configure(): ''' Собственно настраивается roundcube ''' # Проверяем, что есть все нужные конфиги if not (os.path.isfile(ROUNDCUBE_DBCONF) and os.path.isfile(ROUNDCUBE_CONF)): print("Can not found configs") sys.exit(1) # Создаём базу данных db_password = CreateDbMysql(DBNAME) # Коннектимся к mysql и заливаем дамп if sys.version_info[0] < 3: input = open(get_dump_file()).read() else: input = open(get_dump_file(), 'rb').read() CmdRun( ['mysql', '--user={0}'.format(DBNAME), '--password={0}'.format(db_password), DBNAME], input=input ) # Меняем в файлах строки # Файл db.inc with open(ROUNDCUBE_DBCONF, 'r+') as dbconf: newlines = [] found = False for line in dbconf: if re.search(r'^\s*#', line): # Строка с комметарием. Не тратим на неё время continue if OSFAMILY in ['CENTOS', 'FREEBSD']: if DB_RE.match(line): replace_r = r"\1 = 'mysql://{0}:{1}@localhost/{2}';\n".format(DBNAME, db_password, DBNAME) line = DB_RE.sub(replace_r, line) found = True elif OSFAMILY == 'DEBIAN': if re.search(r'^\s*\$dbname\s*=', line): line = "$dbname='" + DBNAME + "';\n" elif re.search(r'^\s*\$dbuser\s*=', line): line = "$dbuser='" + DBNAME + "';\n" elif re.search(r'^\s*\$dbtype\s*=', line): line = "$dbtype='mysql';\n" elif re.search(r'^\s*\$dbpass\s*=', line): line = "$dbpass='" + db_password + "';\n" elif re.search(r'^\s*\$dbserver\s*=', line): line = "$dbserver='localhost';\n" newlines.append(line) dbconf.truncate(0) dbconf.seek(0) dbconf.writelines(newlines) dbconf.flush() # Файл main.inc with open(ROUNDCUBE_CONF, 'r+') as mainconf: newlines = [] auth_matched = False smtp_auth_matched = False create_dirs_matched = False for line in mainconf: if HOST_RE.match(line): line = HOST_RE.sub(r"\1 = 'localhost';\n", line) if SMTP_HOST_RE.match(line): line = SMTP_HOST_RE.sub(r"\1 = 'localhost';\n", line) if AUTH_RE.match(line): line = AUTH_RE.sub(r"\1 = 'plain';\n", line) auth_matched = True if TEMP_RE.match(line): line = TEMP_RE.sub(r"\1 = '/tmp';\n", line) if LANG_RE.match(line): line = LANG_RE.sub(r"\1 = '';\n", line) if SMTP_AUTH_RE.match(line): line = SMTP_AUTH_RE.sub(r"\1 = 'plain';\n", line) smtp_auth_matched = True if SMTP_USER_RE.match(line): line = SMTP_USER_RE.sub(r"\1 = '%u';\n", line) if SMTP_PASS_RE.match(line): line = SMTP_PASS_RE.sub(r"\1 = '%p';\n", line) if CREATE_DIRS_RE.match(line): line = CREATE_DIRS_RE.sub(r"\1 = true;\n", line) create_dirs_matched = True newlines.append(line) if not auth_matched: newlines.append(AUTH_TYPE_STR) if not smtp_auth_matched: newlines.append(SMTP_AUTH_TYPE_STR) if not create_dirs_matched: newlines.append(CREATE_DIRS_STR) mainconf.truncate(0) mainconf.seek(0) mainconf.writelines(newlines) mainconf.flush() if os.path.isfile(ROUNDCUBE_APACHECONF): with open(ROUNDCUBE_APACHECONF, 'w') as apacheconf: apacheconf.write('# Disabled by ISPmanager\n') # Релоадим nginx и apache ReloadWeb() # Добавляем параметр и перезапускаем ISPmanager mgr = Mgr(ISPMGR) mgr.param_add('WebMail', 'roundcube') # Метод перезапустит манагер самостоятельно def main(): if (OSFAMILY == 'CENTOS' and len(sys.argv) >= 2 and int(sys.argv[1]) == 1) \ or (OSFAMILY == 'DEBIAN' and len(sys.argv) == 2 and sys.argv[1] or OSFAMILY == 'FREEBSD'): # Это установка roundcube_configure() else: # Это обновление. Не делаем ничего pass if __name__ == '__main__': main()