<?php

	global $sectld;
	$sectld ="com|co|org|info|priv|gov|net|ac|me|ltd|bme";
	$sectld.="|sport|tm|agrar|city|hotel|ingatlan|jogasz|konyvelo|lakas|suli|tozsde|utazas";
	$sectld.="|2000|bolt|casino|film|forum|games|media|news|reklam|shop|video";
	$sectld.="|erotica|erotika|sex|szex";

	global $force_run;
	$force_run=0;

	global $spooldir;
	$spooldir='/var/spool/sys-admin';

	function parse_cfg_file($cfgfile, $sections=FALSE)
	{
		$data = file_get_contents($cfgfile);
		$invalid = array("!","{","}","~","^");
		$data = str_replace($invalid, "", $data);
		$data = str_replace("#", ";", $data);
		return parse_ini_string($data,$sections);
	}

	function check_force_run($arg_no=1)
	{
		global $argv;
		global $force_run;
		if (array_key_exists($arg_no, $argv) && $argv[$arg_no]=='force')
		{
		    $force_run=1;
		}
	}

	function check_live()
	{
		global $ini;
		global $ignore_live;
		global $force_run;

		if (get_ini_opt('global','live') === '0' && (!(isset($ignore_live) && $ignore_live == 1)) && ($force_run == 0))
		{
			logme("Backend is disabled. To enable, set [global] live to 1 (in sys-admin.conf)");
			exit(0);
		}
	}

	function init($max_try=3)
	{
		global $ini;
		global $node;
		global $ignore_live;
		global $force_run;
		// global $MYCONN;

		openlog('sys-admin[backend]',0,LOG_DAEMON);

		$inifile=dirname(__FILE__)."/../config/sys-admin.conf";
		if (!(file_exists($inifile)))
		{
			panic("Main config file not found (sys-admin.conf)");
		}

		/// read configuration options
		$ini=parse_ini_file($inifile,true);

		/// check ini file
		checkopts($ini);


		$node=$ini['global']['node'];
		if (!(is_numeric($node))) { $node=1; }

		if ($max_try>0)
		{
			DBconnect($max_try);
		}
	}

	function DBconnect($max_try=3)
	{
		global $ini;
		global $node;
		global $MYCONN;

		if ($max_try==0)
		{
			return(true);
		}

		$panic_mode=($max_try>1) ? true : false;

		$myport=NULL;
		$mysocket=NULL;
		if (array_key_exists('socket',$ini['mysql']) && !(empty($ini['mysql']['socket'])))
		{
			$mysocket=$ini['mysql']['socket'];

			for ($try=1; $try<=$max_try; $try++)
			{
				if (file_exists($mysocket))
				{
					break;
				}
				if ($try==$max_try)
				{
					logme("Admin MySQL socket doesn't exist: $mysocket. Is MySQL running?", $panic_mode);
					die(69);
				}
				else
				{
					logme("Waiting for Admin MySQL socket ($try/$max_try): $mysocket...");
				}
				sleep(10);
			}
		}
		elseif (array_key_exists('port',$ini['mysql']) && !(empty($ini['mysql']['port'])) && is_numeric($ini['mysql']['port']))
		{
			$myport=$ini['mysql']['port'];
		}
		else
		{
			panic("No unix socket or TCP port given. Cannot connect to Admin MySQL.");
		}

		for ($try=1; $try<=$max_try; $try++)
		{
			$MYCONN=new mysqli($ini['mysql']['host'], $ini['mysql']['user'], $ini['mysql']['password'], $ini['mysql']['db'], $myport, $mysocket);
			if (!($MYCONN->connect_errno))
			{
				break;
			}
			if ($try==$max_try)
			{
				panic("Cannot connect to Admin MySQL server:".$MYCONN->connect_error);
			}
			else
			{
				logme("Connection to Admin MySQL failed, retrying ($try/$max_try): ".$MYADMCONN->connect_error);
			}
			sleep(3);
		}
		$MYCONN->set_charset('utf8');
	}

	function admDBconnect($max_try=3)
	{
		global $ini;
		global $node;
		global $MYADMCONN;

		if ($max_try==0)
		{
			return(true);
		}

		$panic_mode=($max_try>1) ? true : false;

		if (array_key_exists('cmysql',$ini) && array_key_exists('chrdir',$ini['cmysql']) && !(empty($ini['cmysql']['chrdir'])))
		{
			$chrdir=$ini['cmysql']['chrdir'];
		}
		else
		{
			$chrdir='';
		}

		if (file_exists($chrdir."/etc/mysql/debian.cnf"))
		{
			$myini=parse_cfg_file($chrdir."/etc/mysql/debian.cnf",true);
		}
		else
		{
			$myini=array();
		}

		// adm mysql host
		if (array_key_exists('cmysql',$ini) && array_key_exists('host',$ini['cmysql']) && !(empty($ini['cmysql']['host'])))
		{
			$myadmhost=$ini['cmysql']['host'];
		}
		elseif (array_key_exists('client',$myini) && array_key_exists('host',$myini['client']) && !(empty($myini['client']['host'])))
		{
			$myadmhost=$myini['client']['host'];
		}
		else
		{
			$myadmhost='localhost';
		}

		// adm mysql socket/port
		$myadmport=NULL;
		$myadmsocket=NULL;
		if (array_key_exists('cmysql',$ini) && array_key_exists('socket',$ini['cmysql']) && !(empty($ini['cmysql']['socket'])))
		{
			$myadmsocket=$chrdir.$ini['cmysql']['socket'];
		}
		elseif (array_key_exists('cmysql',$ini) && array_key_exists('port',$ini['cmysql']) && !(empty($ini['cmysql']['port'])))
		{
			$myadmport=$ini['cmysql']['port'];
		}
		elseif (array_key_exists('client',$myini) && array_key_exists('socket',$myini['client']) && !(empty($myini['client']['socket'])))
		{
			$myadmsocket=$chrdir.$myini['client']['socket'];
		}
		elseif (array_key_exists('client',$myini) && array_key_exists('port',$myini['client']) && !(empty($myini['client']['port'])) && is_numeric($myini['client']['port']))
		{
			$myadmport=$myini['client']['port'];
		}
		else
		{
			$myadmsocket=$chrdir.'/run/mysqld/mysqld.sock';
		}

		if ($myadmsocket)
		{
			// wait for socket
			for ($try=1; $try<=$max_try; $try++)
			{
				if (file_exists($myadmsocket))
				{
					break;
				}
				if ($try==$max_try)
				{
					logme("Controlled MySQL socket doesn't exist: $mysocket. Is MySQL running?", $panic_mode);
					die(69);
				}
				else
				{
					logme("Waiting for controlled MySQL socket ($try/$max_try): $mysocket...");
				}
				sleep(10);
			}
		}

		// adm mysql user
		if (array_key_exists('cmysql',$ini) && array_key_exists('user',$ini['cmysql']) && !(empty($ini['cmysql']['user'])))
		{
			$myadmuser=$ini['cmysql']['user'];
		}
		elseif (array_key_exists('client',$myini) && array_key_exists('user',$myini['client']) && !(empty($myini['client']['user'])))
		{
			$myadmuser=$myini['client']['user'];
		}
		else
		{
			$myadmuser='root';
		}

		// adm mysql pass
		if (array_key_exists('cmysql',$ini) && array_key_exists('password',$ini['cmysql']) && !(empty($ini['cmysql']['password'])))
		{
			$myadmpass=$ini['cmysql']['password'];
		}
		elseif (array_key_exists('client',$myini) && array_key_exists('password',$myini['client']) && !(empty($myini['client']['password'])))
		{
			$myadmpass=$myini['client']['password'];
		}
		else
		{
			$myadmpass='';
		}

		// wait for connection
		for ($try=1; $try<=$max_try; $try++)
		{
			$MYADMCONN=new mysqli($myadmhost, $myadmuser, $myadmpass, 'mysql', $myadmport, $myadmsocket);
			if (!($MYADMCONN->connect_errno))
			{
				break;
			}
			if ($try==$max_try)
			{
				panic("Cannot connect to controlled MySQL server: ".$MYADMCONN->connect_error);
			}
			else
			{
				logme("Connection to controlled MySQL failed, retrying ($try/$max_try): ".$MYADMCONN->connect_error);
			}
			sleep(3);
		}
		$MYADMCONN->set_charset('utf8');
	}

	function DBquery($query, $resultmode = MYSQLI_STORE_RESULT)
	{
		global $MYCONN;
		$res=$MYCONN->query($query, $resultmode);
		if ($MYCONN->errno)
		{
			panic("DB error:".$MYCONN->error);
		}
		return $res;
	}

	function admDBquery($query, $resultmode = MYSQLI_STORE_RESULT)
	{
		global $MYADMCONN;
		$res=$MYADMCONN->query($query, $resultmode);
		if ($MYADMCONN->errno)
		{
			panic("Controlled DB error:".$MYADMCONN->error);
		}
		return $res;
	}

	function DBclose()
	{
		global $MYCONN;
		$res=$MYCONN->close();
		return $res;
	}

	function admDBclose()
	{
		global $MYADMCONN;
		$res=$MYADMCONN->close();
		return $res;
	}

	function check_update($key)
	{
		global $node;
		global $force_run;
		// check if update neccessary
		$res=DBquery("SELECT `value` AS trig FROM var WHERE `key` = '".$key."' AND `node` = '".$node."' AND `lock` = 0 AND DATE_ADD(`modified`, INTERVAL 30 SECOND ) < NOW();");

		$nr=$res->num_rows;
		if ($nr<1) die(0);

		$r=$res->fetch_assoc();

		// exit if nothing to update or not forced
		if ( $r['trig']!=1 && $force_run==0 ) die(0);

		// lock update
		DBquery("UPDATE `var` SET `value`='0', `lock`='1' WHERE `key` = '".$key."' AND `node` = '".$node."';");
	}

	function unlock_update($key)
	{
		global $node;
		DBquery("UPDATE `var` SET `lock`='0', `modified`=NOW() WHERE `key` = '".$key."' AND `node` = '".$node."';");
		DBclose();
	}


	function logme($text, $panic=false)
	{
		global $NOLOG;

		if ($NOLOG == true)
		{
			if ($panic == true)
			{
				echo "ERROR: ".$text."\n";
			}
			else
			{
				echo $text."\n";
			}
		}
		else
		{
			if ($panic == true)
			{
				//echo "sys-admin [backend]: $text\n";
				$text='ERROR: '.$text;
				$paniclog="/var/log/sysadmin-panic.log";
				fpush($paniclog, $text."\n", true);
				return syslog (LOG_ALERT,'ERROR: '.$text);
			}
			else
			{
				return syslog (LOG_NOTICE,$text);
			}
		}
	}

	function panic($text)
	{
		logme($text, true);
		die(69);
	}

	function multirow2array($string)
	{
		$cleanstring = str_replace(array('\r', '\t' ), '', $string);
		$exploded=explode("\n",$cleanstring);
		$rows=array();
		foreach ($exploded as $row) {
			$row=trim($row);
			if ($row!="") {$rows[]=$row;}
		}
		return $rows;
	}

	function fpush($path,$data,$append=false)
	{
		if ($append) { $mode='a'; } else { $mode='w'; }
		$fp = fopen($path,$mode);
		fwrite($fp,$data);
		fclose($fp);
	}

	function checkdir($path, $uid, $gid)
	{
		$ret=0;
		if (!is_dir($path))
		{
			mkdir ($path);
			$ret=1;
		}
		$stat=stat($path);
		if ($stat['uid']!= $uid) chown($path,$uid);
		if ($stat['gid']!= $gid) chgrp($path,$gid);
		return $ret;
	}

	function check_valid_dir($dir="")
	{
		if ($dir=="") { return false; }
		if ( ! preg_match("#^[A-Za-z0-9\-\.\_\/]+$#", $dir) ) {
			return false;
		}
		if ( preg_match("#\.\.#", $dir) ) {
			return false;
		}
		return true;
	}

	function mail_header_encode($string)
	{
		if (mb_check_encoding($string, 'ASCII'))
		{
			return $string;
		}
		else
		{
			return '=?UTF-8?B?'.base64_encode($string).'?=';
		}
	}

	function mailsend($mail_fromname, $mail_fromaddr, $mail_toaddr, $mail_subject, $mail_body)
	{

		$mail_fromname=str_replace(',',' ',$mail_fromname);

		$headers = 'Content-Type: text/plain; charset=UTF-8; format=flowed' . "\n";
		$headers.= 'Content-Transfer-Encoding: 8bit' . "\n";
		$headers.= 'From: '.mail_header_encode($mail_fromname).' <'.$mail_fromaddr.'>';

		$subj=mail_header_encode($mail_subject);

		if ( mail($mail_toaddr, $subj, $mail_body, $headers, '-f'.$mail_fromaddr) )
		{
			return true;
		}
		else
		{
			echo "Can't send mail to $mail_toaddr\n";
			return false;
		}

	}

	function backend_enabled($type,$name)
	{
		global $ini;
		if (array_key_exists($type,$ini) && array_key_exists($name,$ini[$type]) && $ini[$type][$name] == 0)
		{
			return false;
		}
		return true;
	}

	function checkopts($ini)
	{

		$mand['global']=array('node','domain','host','mx','template_dir','skeleton_dir','firstuid','webroot','mailroot','name','email');
		$mand['mysql']=array('host','user','db','password');
		$mand['nodeip']=array('1');
		$mand['dovecot']=array('mailuser','version');
		if (backend_enabled('confgen','bind-confgen'))
		{
			$mand['bind']=array('name','conftest','confdir','zonetest','ns2');
		}
		if (backend_enabled('confgen','apache-confgen'))
		{
			$mand['apache']=array('name','conftest','confdir','logdir','port');
			$mand['nginx']=array('name','conftest','confdir');
		}
		if (backend_enabled('confgen','ssl-gen'))
		{
			$mand['ssl']=array('keydir','user','group');
		}
		if (backend_enabled('confgen','opendkim-confgen'))
		{
			$mand['opendkim']=array('name','confdir','active_key','key');
		}
		if (backend_enabled('cron','webalizer'))
		{
			$mand['webalizer']=array('statdir','bin','conf');
		}

		foreach ($mand as $main => $options)
		{
			$sect_count=0;
			foreach ($options as $option)
			{
				if (empty($ini[$main][$option]))
				{
					panic("No [$main] $option given in config file.");
				}
				elseif (is_array($ini[$main][$option]))
				{
					$opt_count=count($ini[$main][$option]);
					if ($sect_count == 0)
					{
						$sect_count=$opt_count;
					}
					elseif ($sect_count != $opt_count)
					{
						panic("[$main] $option has missing elements in config file.");
					}
				}
			}
		}
	}

	function get_ini_opt()
	{
		if(func_num_args() < 2)
		{
			return NULL;
		}
		global $ini;
		$idata=$ini;
		$inikeys=func_get_args();
		foreach ($inikeys as $inikey)
		{
			if (!(is_array($idata)))
			{
				return NULL;
			}
			if (array_key_exists($inikey,$idata))
			{
				$idata=$idata[$inikey];
			}
			else
			{
				return NULL;
			}
		}
		return $idata;
	}

	function exec_err($command, $display_err=false, $envvars=array())
	{
		foreach($envvars as $envar=>$enval)
		{
			putenv(strtoupper($envar).'='.$enval);
		}
		exec($command, $output, $exit);
		if ($exit != 0)
		{
			logme("ERROR running $command:", $display_err);
			logme(implode("\n", $output), $display_err);
		}
		foreach($envvars as $envar=>$enval)
		{
			putenv(strtoupper($envar));
		}
		return $exit;
	}

	function exec_as_err($command, $user='www-data', $display_err=false, $envvars=array())
	{
		foreach($envvars as $envar=>$enval)
		{
			putenv(strtoupper($envar).'='.$enval);
		}
		exec('su '.$user.' -s /bin/sh -c "'.$command.'" 2>&1', $output, $exit);
		if ($exit != 0)
		{
			logme("ERROR running $command:", $display_err);
			logme(implode("\n", $output), $display_err);
		}
		foreach($envvars as $envar=>$enval)
		{
			putenv(strtoupper($envar));
		}
		return $exit;
	}

	function exec_hook($hook_name, $clientid, $client, $domain=NULL, $vhost=NULL, $hook_env=array(), $user='www-data')
	{
		global $ini;

		$hook_script=NULL;
		$hook_script_root=NULL;

		if (array_key_exists('global', $ini) && array_key_exists('hook_dir', $ini['global']) && check_valid_dir($ini['global']['hook_dir']) && is_dir($ini['global']['hook_dir']))
		{
			$hr=$ini['global']['hook_dir'];
		}
		else
		{
			$hr='/etc/sys-admin/hooks';
		}

#		$client_script_path=NULL;
#		$client_script=NULL;
#		$client_script_root=NULL;
#		$domain_script_path=NULL;
#		$domain_script=NULL;
#		$domain_script_root=NULL;
#		$vhost_script_path=NULL;
#		$vhost_script=NULL;
#		$vhost_script_root=NULL;

		$global_script_path=$hr;
		$global_script=$global_script_path.'/'.$hook_name.'.sh';
		$global_script_root=$global_script_path.'/'.$hook_name.'-root.sh';

		$envvars=array();

		foreach ($hook_env as $var=>$val)
		{
			$envvars['VH_'.strtoupper($var)]=$val;
		}

		if ($clientid && $client)
		{
			$client_script_path=$hr.'/'.$client;
			$client_script=$client_script_path.'/'.$hook_name.'.sh';
			$client_script_root=$client_script_path.'/'.$hook_name.'-root.sh';
			$envvars['VH_CLIENT_PATH']=$ini['global']['webroot'].'/'.$client;
			$envvars['VH_CLIENT']=$client;
			$envvars['VH_CLIENTID']=$clientid;
			$envvars['VH_UID']=$ini['global']['firstuid']+$clientid;

			if ($domain)
			{
				$domain_script_path=$hr.'/'.$client.'/'.$domain;
				$domain_script=$domain_script_path.'/'.$hook_name.'.sh';
				$domain_script_root=$domain_script_path.'/'.$hook_name.'-root.sh';
				$envvars['VH_DOMAIN_PATH']=$ini['global']['webroot'].'/'.$client.'/'.$domain;
				$envvars['VH_DOMAIN']=$domain;
				if($vhost)
				{
					$vhost_script_path=$hr.'/'.$client.'/'.$domain.'/'.$vhost;
					$vhost_script=$vhost_script_path.'/'.$hook_name.'.sh';
					$vhost_script_root=$vhost_script_path.'/'.$hook_name.'-root.sh';
					$envvars['VH_HOST']=$vhost;
					$envvars['VH_NAME']=$vhost.'.'.$domain;
					$envvars['VH_PATH']=$ini['global']['webroot'].'/'.$client.'/'.$domain.'/'.$vhost;
				}
			}
		}
		else
		{
			return(false);
		}

		if ($vhost_script_path && check_valid_dir($vhost_script_path) && is_dir($vhost_script_path) && file_exists($vhost_script_root))
		{
			$hook_script_root=$vhost_script_root;
		}
		elseif ($domain_script_path && check_valid_dir($domain_script_path) && is_dir($domain_script_path) && file_exists($domain_script_root))
		{
			$hook_script_root=$domain_script_root;
		}
		elseif ($client_script_path && check_valid_dir($client_script_path) && is_dir($client_script_path) && file_exists($client_script_root))
		{
			$hook_script_root=$client_script_root;
		}
		elseif ($global_script_path && check_valid_dir($global_script_path) && is_dir($global_script_path) && file_exists($global_script_root))
		{
			$hook_script_root=$global_script_root;
		}

		if ($vhost_script_path && check_valid_dir($vhost_script_path) && is_dir($vhost_script_path) && file_exists($vhost_script))
		{
			$hook_script=$vhost_script;
		}
		elseif ($domain_script_path && check_valid_dir($domain_script_path) && is_dir($domain_script_path) && file_exists($domain_script))
		{
			$hook_script=$domain_script;
		}
		elseif ($client_script_path && check_valid_dir($client_script_path) && is_dir($client_script_path) && file_exists($client_script))
		{
			$hook_script=$client_script;
		}
		elseif ($global_script_path && check_valid_dir($global_script_path) && is_dir($global_script_path) && file_exists($global_script))
		{
			$hook_script=$global_script;
		}

		if ($hook_script_root && file_exists($hook_script_root))
		{
			logme("Executing ".$hook_name." ROOT hook '$hook_script_root'");
			exec_err($hook_script_root, false, $envvars);
		}

		if ($hook_script && file_exists($hook_script))
		{
			logme("Executing ".$hook_name." hook '$hook_script'");
			exec_as_err($hook_script, $user, false, $envvars);
		}
		return(true);
	}

	function initsystem()
	{
		exec('readlink -f /proc/1/exe', $output, $exit);
		$initsys=$output[0];
		switch($initsys)
		{
			case '/lib/systemd/systemd':
				return 'systemd';
				break;
			case '/usr/lib/systemd/systemd':
				return 'systemd';
				break;
			case '/sbin/init':
				return 'sysvinit';
				break;
		}
	}

	function daemons_startstop($dss)
	{
		$initsys=initsystem();
		switch($initsys)
		{
			case 'systemd':
				$sds=array();
				foreach($dss as $daemon => $startstop)
				{
					$sds[$startstop][]=$daemon;
				}
				foreach($sds as $startstop => $daemons)
				{
					$daemon_list=implode(' ',$daemons);
					exec_err('/bin/systemctl '.$startstop.' '.$daemon_list);
				}
				break;
			case 'sysvinit':
				foreach ($dss as $daemon => $startstop)
				{
					exec_err('/etc/init.d/'.$daemon.' '.$startstop);
				}
				break;
		}
	}

	function find_shell_command($cmd)
	{
		exec("which $cmd", $output, $exit);
		if (array_key_exists(0, $output))
		{
			$cmd_path=$output[0];
			if (file_exists($cmd_path))
			{
				return($cmd_path);
			}
			else
			{
				return false;
			}
		}
		else
		{
			return false;
		}
	}

	function findlog($vhname, $upstream, $ini)
	{

		$tds=date('Ymd');

		$ydate=strtotime("yesterday");
		$yds=date('mdY', $ydate);

		$lognames=array(
				"vhosts/$vhname/access.log-$tds.gz",
				"vhosts/$vhname/access.log-$tds",
				"vhosts/$vhname/$yds-access.log",
				"vhosts/$vhname/access.log",
				"daily/$vhname-access.log-$tds.gz",
				"daily/$vhname-access.log-$tds",
				"$vhname-access.log-$tds.gz",
				"$vhname-access.log-$tds",
				"$vhname-access.log"
			);

		if (array_key_exists($upstream,$ini['apache']['logdir']))
		{
			$logdir=$ini['apache']['logdir'][$upstream];

			foreach ($lognames as $logn)
			{
				$ln=$logdir.'/'.$logn;

				if (file_exists($ln) && (!(is_link($ln))) && filesize($ln)>0)
				{
					return $ln;
				}
			}
		}
		return false;
	}

	function fixrights($dir,$uid,$writable)
	{
		if ($dir=="") { panic('Programming error in fixrights'); }

		if (is_dir($dir))
		{
			exec ("chown $uid:33 $dir -R");
			exec ("chmod a=r $dir -R");
			exec ("chmod u=rwX,g=rX,o=rX $dir -R");

			$wr_arr=multirow2array($writable);
			foreach($wr_arr as $wr)
			{
				$subdir="$dir/$wr";
				if ( check_valid_dir($subdir))
				{
					if (is_dir($subdir))
					{
						exec ("chmod g+w $subdir -R");
					}
					elseif (is_file($subdir))
					{
						exec ("chmod g+w $subdir");
					}
				}
			}
		}
	}

	function writeall($dir,$uid=33)
	{
		if ($dir=="") { panic('Programming error in writeall'); }

		if (is_dir($dir))
		{
			exec ("chown 33:33 $dir -R");
			//exec ("chmod u+w,g+w $dir -R");
			exec ("chmod u=rwX,g=rwX,o=rX $dir -R");
		}
	}

	function listdir($dir)
	{
		if (!(is_dir($dir))) { panic("$dir doesn't exist!"); }
		$filearr=array();
		if ($mrh=opendir($dir))
		{
			while (false !== ($file = readdir($mrh)))
			{
				if ($file != "." && $file != ".." && is_dir($dir."/".$file))
				{
					$filearr[]=$file;
				}
			}
			closedir($mrh);
		}
		return $filearr;
	}


	function register_ssl_plugins()
	{
		global $ini;
		global $ssl_plugins;

		if (array_key_exists('disabled', $ini['ssl']))
		{
			$disabled_plugins=explode(' ',$ini['ssl']['disabled']);
		}
		else
		{
			$disabled_plugins=array();
		}

		//search for plugins
		$ssl_plugins=array();
		foreach (glob(dirname(__FILE__)."/ssl/*.php") as $pluginfile)
		{
			$plugin_name=NULL;
			require_once $pluginfile;
			if ($plugin_name && class_exists($plugin_name) && (!(in_array($plugin_name, $disabled_plugins))))
			{
				$ssl_plugins[$plugin_name::$order]=$plugin_name;
			}
		}
		ksort($ssl_plugins);
	}

	function find_ssl_keys($domain, $host, $ssl_plugin_max_level=0)
	{
		global $ini;
		global $ssl_plugins;

		$ssldir=$ini['ssl']['keydir'];

		if (!(isset($ssl_plugins)) || !(is_array($ssl_plugins)))
		{
			die('Programming ERROR: SSL plugins not registered');
		}

		foreach ($ssl_plugins as $sslplugin_level => $sslplugin)
		{
			if (!$ssl_plugin_max_level || $ssl_plugin_max_level >= $sslplugin_level)
			{
				$key_path=$sslplugin.'/'.str_replace(array('{domain}', '{host}'), array($domain,$host), $sslplugin::$filename_key);
				$cert_path=$sslplugin.'/'.str_replace(array('{domain}', '{host}'), array($domain,$host), $sslplugin::$filename_cert);

				if (file_exists($ssldir.'/'.$key_path) && file_exists($ssldir.'/'.$cert_path))
				{
					return array(
						'name' => $sslplugin,
						'key' => $key_path,
						'cert' => $cert_path
						);
					break;
				}
			}
		}
		return false;
	}

	function split_domrec_txt($rec)
	{
		$rec=trim($rec, '" ');
		$rec=preg_replace('/\"[ ]*\"/', '', $rec);
		if (strlen($rec)>253)
		{
			$rec=chunk_split($rec, 250, '" "');
			$rec=trim($rec, '" ');
		}
		$rec="\"$rec\"";
		return $rec;
	}

	// check domain name format
	function check_format_domain($name)
	{
		global $sectld;
		$name=strtolower($name);

		if ( preg_match("#^www\..*#",$name) ) {
			return false;
		}

		if ( ! preg_match("#^[a-z0-9áéíóöőúüűú\-]+(\.(".$sectld."))?\.[a-z]{2,10}+$#", $name) )
		{
			return false;
		}

		return true;
	}

