Your IP : 3.144.225.144


Current Path : /usr/local/mgr5/sbin/
Upload File :
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()