<?php
/**
*
*	본 프로그램은 패스코리아넷에서 개발 및 배포하는 Nmail PHP 제품의 설치 프로그램입니다.
*
*	https://passkorea.net
*
*   - php79 stack 용 설치 예시
*     /usr/bin/php nmail-php-3.2_221209_install.php --web-conf='/etc/nginx/nginx.conf' --web-group=nobody --web-group-id=99 --web-server-name='mail.passkorea.kr'
*/
################################################################################

function scanf($msg, $values=array(), $length=64, $isupper=true, $allownull=false, $defalut_value=true, $isecho=true)
{
	if ($isecho)
		echo $msg;
	// [2006-09-06] AnNyung 1.2 에서 php stdin 사용시 문제가 발견됨.
	// [2006-11-13] Windows PHP 5.2.0 에서 입력안되던 문제 수정.
	// [2006-11-14] RWAPM 에서 STDIN 이 지원되지 않는 문제 발견.
	// [2007-01-29] 일부 Linux 에서 엔터를 2byte로 인식해서 scanf()가 반복되는 문제 해결.
	if (defined('STDIN'))
	{
		$data = fgets(STDIN,$length+1);
	} else
	{
		$stdin = (file_exists("/dev/stdin")) ? "/dev/stdin" : "php://stdin";
		$fp = fopen($stdin,"r");
		$data = fgets($fp,$length+1);
		fclose($fp);
	}	// if()
	$data = trim($data);
	if ($data == '')
		$isecho = false;

	if ($isupper)
		$data = strtoupper($data);

	if ($defalut_value && $values && $data == '')
	{
		$data = $values[0];
	}	// if()

	if (!$allownull && ($data == '' || ($values && sizeof($values) > 1 && !in_array($data, $values))))
	{
		$data = scanf($msg, $values, $length, $isupper, $allownull, $defalut_value, $isecho);
	}	// if()

	return $data;
}	// function()


/*
	linux : uid=48(apache) gid=48(apache) groups=48(apache)
	solaris : uid=60001(nobody) gid=60001(nobody)
*/
function get_uid($id, $ishidden=false)
{
	ob_start();
	if ($ishidden)
	{
		system('id '.$id);
	} else
	{
		system('id '.$id);
	}	// if()
	$uid = ob_get_contents();
	ob_end_clean();
	preg_match('/uid=([0-9]+)/', $uid, $mc);
	return $mc[1];
}	// function()

function cmd($cmd, $ishidden=false)
{
	ob_start();
	if ($ishidden)
	{
		system($cmd);
	} else
	{
		system($cmd);
	}	// if()
	$res = ob_get_contents();
	ob_end_clean();
	return trim($res);
}	// function()

function alert($msg)
{
	global $crlf;
	echo $crlf."[경고] ".$msg.$crlf.$crlf;
}	// function()

function title($msg)
{
	global $__TITLE_NO;
	global $crlf;
	//usleep(500000);
	if (!$__TITLE_NO)
	{
		$__TITLE_NO = 1;
	} else
	{
		$__TITLE_NO++;
	}	// if()
	echo $crlf;
	echo "==============================================================================".$crlf;
	echo "= [".$__TITLE_NO."] ".$msg.$crlf;
	echo "==============================================================================".$crlf;
}	// function()

function get_ioncube_name()
{
	$_u = php_uname();
	$_os = substr($_u,0,strpos($_u,' '));
	$_os_key = strtolower(substr($_u,0,3));

	$_php_version = phpversion();
	$_php_family = substr($_php_version,0,3);

	$_loader_sfix = (($_os_key == 'win') ? '.dll' : '.so');

	$_ln_new="ioncube_loader_${_os_key}_${_php_family}${_loader_sfix}";
	$_ln_new_ts="ioncube_loader_${_os_key}_${_php_family}_ts${_loader_sfix}";

	return array($_ln_new, $_ln_new_ts);
}	// function()

$php_info = '';
function get_php_ini_path()
{
	global $crlf, $php_info;
	if ($php_info == '')
	{
		ob_start();
		phpinfo(INFO_GENERAL);
		$php_info = ob_get_contents();
		ob_end_clean();
	}	// if()

	foreach (explode("\n",$php_info) as $line) {
		// [2022-12-09] php79 stack 지원
		if (strpos($line, 'z-php79.ini') !== false) {
			return trim(strip_tags($line));
		}

		if (preg_match('/command/i',$line)) {
		  continue;
		}
		// [2006-11-13] C:\Program Files\PHP\php.ini 일때의 문제해결.
		#if (eregi("configuration file.*(</B></td><TD ALIGN=\"left\">| => |v\">)([^ <]*)(.*</td.*)?",$line,$match)) {
		// Loaded Configuration File => /etc/php.ini
		// <tr><td class="e">Loaded Configuration File </td><td class="v">/etc/php.ini </td></tr>
		// <tr><td class="e">Loaded Configuration File </td><td class="v">C:\Program Files\PHP\php.ini </td></tr>
		// [2012-10-23]
		//if (eregi("configuration file.*(</B></td><TD ALIGN=\"left\">| => |v\">)([^<]*)(.*</td.*)?",$line,$match)) {
		if (preg_match("/Loaded Configuration File[ =>]*([^<]+)/i",strip_tags($line),$match)) {
		  $php_ini_path = trim($match[1]);
		} else if (preg_match("/Configuration File \(php.ini\) Path[ =>]*([^<]+)/i",strip_tags($line),$match)) {		// [2013-10-01] CentOS 5, PHP 5.1.6
		  $php_ini_path = trim($match[1]);
		}
	}

	return $php_ini_path;
}	// function()

function get_php_ini_configure()
{
	global $crlf, $php_info;
	if ($php_info == '')
	{
		ob_start();
		phpinfo(INFO_GENERAL);
		$php_info = ob_get_contents();
		ob_end_clean();
	}	// if()

	foreach (explode("\n",$php_info) as $line) {
		// [2012-10-23]
		//if (eregi("Configure Command.*(</B></td><TD ALIGN=\"left\">| => |v\">)([^<]*)(.*</td.*)?",$line,$match)) {
		if (preg_match("/Configure Command[ =>]*([^<]+)/i",strip_tags($line),$match)) {
		  $php_ini_configure = $match[1];
		}
	}

	return $php_ini_configure;
}	// function()

function get_php_ini_thread_safety()
{
	global $crlf, $php_info;
	if ($php_info == '')
	{
		ob_start();
		phpinfo(INFO_GENERAL);
		$php_info = ob_get_contents();
		ob_end_clean();
	}	// if()

	foreach (explode("\n",$php_info) as $line) {
		// [2012-10-23]
		//if (eregi("Configure Command.*(</B></td><TD ALIGN=\"left\">| => |v\">)([^<]*)(.*</td.*)?",$line,$match)) {
		if (preg_match("/Thread Safety[ =>]*([^<]+)/i",strip_tags($line),$match)) {
		  $thread_safety = $match[1];
		}
	}

	if (strtolower(trim($thread_safety)) == 'enabled')
	{
		$thread_safety = true;
	} else
	{
		$thread_safety = false;
	}	// if()

	return $thread_safety;
}	// function()

function get_php_ini_compiler()
{
	global $crlf, $php_info;
	if ($php_info == '')
	{
		ob_start();
		phpinfo(INFO_GENERAL);
		$php_info = ob_get_contents();
		ob_end_clean();
	}	// if()

	foreach (explode("\n",$php_info) as $line) {
		if (preg_match("/Compiler[ =>]*([^<]+)/i",strip_tags($line),$match)) {
		  $php_ini_configure = $match[1];
		}
	}

	return $php_ini_configure;
}	// function()

function cmd_grep($data, $str)
{
	global $crlf;
	$_ex = explode("\n", $data);
	$data2 = '';
	for ($i=0; $i<sizeof($_ex); $i++)
	{
		$_ex[$i] = trim($_ex[$i]);
		if ($_ex[$i] != '' && strpos($_ex[$i], $str) !== false)
			$data2 .= $_ex[$i].$crlf;
	}	// for()
	return $data2;
}	// function()

function get_ext_dir()
{
	$ini_ext_dir = ini_get('extension_dir');
	if ($ini_ext_dir != './' && is_dir($ini_ext_dir))
	{
		return $ini_ext_dir;
	} else
	{
		return PHP_EXTENSION_DIR;
	}	// if()
}	// function()

function escapeshellarg_os($str)
{
	global $uname;
	if ($uname == 'WIN')
	{
		return '"'.trim(str_replace('"', '""', $str)).'"';
	} else
	{
		return escapeshellarg($str);
	}	// if()
}	// function()

function die_fix($msg, $is_view_alert=true)
{
	global $crlf;

	if ($is_view_alert)
	{
		echo $crlf."[경고] 엔메일 설치작업이 중단되었습니다.".$crlf."  아래 문구를 확인하셔서 조치후 설치프로그램을 다시 실행하시면 됩니다.".$crlf."=>".$crlf;
	}	// if()
	echo $msg.$crlf;
	$uname = strtoupper(PHP_OS);
	if (substr($uname, 0, 3) === 'WIN')
	{
		echo "계속하려면 아무 키나 누르십시오 . . .".$crlf;
		system('pause');
	}	// if()
	exit;
}	// function()

// [2009-06-15]
function get_httpd_info($ps_ef)
{
	$httpd = array();

	// [2013-12-02] 우분투
	//$httpd['ps'] = cmd($ps_ef.'|grep httpd|head -n5');
	$httpd['ps'] = cmd($ps_ef.'|grep -P \'http|apache\'|head -n5');

	preg_match("/([^ ]+bin\/(httpd|apache|apache2)+[^\n\r ]*)/i", $httpd['ps'], $mc);
	$httpd['bin'] = $mc[1];
	if (file_exists($httpd['bin']))
	{
		$httpd['compiled'] = cmd($httpd['bin'].' -V');
		preg_match("/HTTPD_ROOT=\"([^\n\r\" ]+)/i", $httpd['compiled'], $mc);
		$httpd['HTTPD_ROOT'] = $mc[1];

		preg_match("/SERVER_CONFIG_FILE=\"([^\n\r\" ]+)/i", $httpd['compiled'], $mc);
		$httpd['SERVER_CONFIG_FILE'] = $mc[1];

		if (substr($httpd['SERVER_CONFIG_FILE'], 0, 1) == '/')
		{
			$httpd['conf'] = $httpd['SERVER_CONFIG_FILE'];
		} else
		{
			$httpd['conf'] = $httpd['HTTPD_ROOT'].'/'.$httpd['SERVER_CONFIG_FILE'];
		}	// if()

		if (!file_exists($httpd['conf']))
			$httpd['conf'] = '';


		// apachectl
		$_apachectl = dirname($httpd['bin']).'/apachectl';
		if (file_exists($_apachectl))
		{
			$httpd['apachectl'] = $_apachectl;
		} else if ($httpd['bin'] == '/usr/sbin/httpd')
		{
			if (file_exists('/etc/init.d/httpd'))
			{
				$httpd['apachectl'] = '/etc/init.d/httpd';
			} else if (file_exists('/etc/init.d/apache'))
			{
				$httpd['apachectl'] = '/etc/init.d/apache';
			}	// if()
		} else if ($httpd['bin'] == '/usr/sbin/httpd2')
		{
			if (file_exists('/etc/init.d/apache2'))
			{
				$httpd['apachectl'] = '/etc/init.d/apache2';
			} else if (file_exists('/usr/sbin/httpd2'))
			{
				$httpd['apachectl'] = '/usr/sbin/apache2ctl';
			}	// if()
		} else if ($httpd['bin'] == '/usr/sbin/apache2')		// [2013-12-02] 우분투 12.04 LTS
		{
			if (file_exists('/etc/init.d/apache2'))
			{
				$httpd['apachectl'] = '/etc/init.d/apache2';
			} else if (file_exists('/usr/sbin/apache2ctl'))
			{
				$httpd['apachectl'] = '/usr/sbin/apache2ctl';
			}	// if()
		}	// if()
	}	// if()

	return $httpd;
}	// function()

	function php_module_load_check($uname, $extension)
	{
		if ($uname == 'WIN')
		{
			$result = cmd('php -m');
		} else
		{
			$result = cmd('/usr/bin/php -m');
		}	// if()

		$_sp = strpos($result, '[PHP Modules]');

		if ($_sp !== false)
		{
			$str = substr($result, $_sp+14);
			if (strpos($str, "\n".$extension) !== false)
			{
				return true;
			}	// if()
		}	// if()

		return false;
	}	// function()

################################################################################


error_reporting(E_ALL ^ E_NOTICE);
set_time_limit(0);
ini_set('memory_limit', '2047M');
ini_set('output_buffering', 0);
define("DS", DIRECTORY_SEPARATOR);
$nm_db_name = 'nmail2';
$nm_db_user = 'nmail2';


// os
$uname = strtoupper(PHP_OS);
$uname_machine = php_uname('m');
$crlf = "\n";
if (substr($uname, 0, 3) === 'WIN')
{
	$uname = 'WIN';
	$crlf = "\r\n";
} else if ($uname != 'SUNOS')
{
	$uname = 'LINUX';
}	// if()


################################################################################

echo "[Nmail Install] 엔메일 설치작업을 시작합니다.".$crlf.$crlf;


$conf = array();
$conf['nm_ver'] = '3.2';
$conf['nm_file'] = 'nmail-php-'.$conf['nm_ver'].'.tgz';
$conf['db'] = 'MYSQL';
// [2007-04-09] euckr, utf8
$conf['db_charset'] = 'utf8';
$conf['db_collate'] = 'utf8_general_ci';

if (file_exists('nmail-php-'.$conf['nm_ver'].'_oracle.tgz'))
{
	$conf['db'] = 'ORACLE';
	$conf['nm_file'] = 'nmail-php-'.$conf['nm_ver'].'_oracle.tgz';
} else if (file_exists('nmail-php-'.$conf['nm_ver'].'_utf8.tgz'))
{
	$conf['db_charset'] = 'utf8';
	$conf['db_collate'] = 'utf8_general_ci';
	$conf['nm_file'] = 'nmail-php-'.$conf['nm_ver'].'_utf8.tgz';
}	// if()


################################################################################

// [2009-05-06] root권한으로만 실행되도록 함.
	if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
	{
		ob_start();
		system('whoami');
		$whoami = trim(ob_get_contents());
		ob_end_clean();
		if ($whoami != '' && $whoami != 'root')
		{
			die("[경고] 엔메일 설치작업이 중단되었습니다.".$crlf."  root 계정에서 실행하셔야 합니다.".$crlf);
		}	// if()
	}	// if()


// [2009-06-13] php 경로 확인
	if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')
	{
		if (!file_exists('/usr/bin/php'))
		{
			die("[경고] 엔메일 설치작업이 중단되었습니다.".$crlf."  PHP 실행파일이 /usr/bin/php 경로에 존재해야 합니다.".$crlf."  만약 /usr/local/bin/php 등 다른 경로에 있는 경우라면 아래처럼 심볼릭링크를 걸어주시면 됩니다.".$crlf."    ex) ln -s /usr/local/php/bin/php* /usr/bin/".$crlf);
		} else
		{
			$tmp = '.nmail_install_tmp_test_php_path';
			$fp = fopen($tmp, "w");
			fwrite($fp, '<?php echo PHP_CONFIG_FILE_SCAN_DIR."|".phpversion(); ?>');
			fclose($fp);

			$cmd = '/usr/bin/php '.$tmp;
			$res = cmd($cmd);
			$_ex = explode('|', $res);
			unlink($tmp);

			if ($res != PHP_CONFIG_FILE_SCAN_DIR."|".phpversion())
			{
				echo "[경고] 엔메일 설치작업이 중단되었습니다.".$crlf;
				echo "  현재 실행한 php 와 /usr/bin/php 의 버전이나 php.ini 경로가 다릅니다.".$crlf;
				echo "    현재 실행된 php)".$crlf;
				echo "        php.ini path) ".PHP_CONFIG_FILE_SCAN_DIR.$crlf;
				echo "        php version) ".phpversion().$crlf;
				echo "    /usr/bin/php)".$crlf;
				echo "        php.ini path) ".$_ex[0].$crlf;
				echo "        php version) ".$_ex[1].$crlf;
				echo $crlf;
				echo "  주의) 서버내에 php가 2개 이상 설치되어 있다면, /usr/bin/php 에서의 PHP 버전과 웹서버에 연동된 PHP 버전이 일치하도록 설정을 변경해야 합니다.".$crlf;
				echo "    위 문제가 없다면 아래처럼 다시 실행하여 주십시오.".$crlf.$crlf;
				echo "      /usr/bin/php ".$_SERVER['argv'][0].$crlf;
				exit;
			}	// if()
		}	// if()
	}	// if()


// [2009-06-16] SELinux
	$file = '/etc/selinux/config';
	if (file_exists($file))
	{
		$data = file_get_contents($file);
		preg_match_all("/(^|\n)+SELINUX=([^\n]+)/", $data, $mc);
		$is_modify = false;
		if (is_array($mc[2]) && sizeof($mc[2]) > 0)
		{
			for ($i=0; $i<sizeof($mc[2]); $i++)
			{
				if ($mc[2][$i] != '' && $mc[2][$i] != 'disabled')
				{
					$is_modify = true;
					break;
				}	// if()
			}	// for()
		}	// if()

		if ($is_modify)
		{
			echo "SELinux 가 활성화된 상태에서는 설치할 수 없습니다.".$crlf;
			$scan = scanf("- 지금 SELinux 를 비활성화(disabled)하시겠습까? [Y/n] : ", array('Y', 'N'), 2);
			if ($scan == 'Y')
			{
				copy($file, $file.'.backupByNmail_'.date('Ymd_His'));
				$data = preg_replace("/(^|\n)+SELINUX=([^\n]+)/", "\\1SELINUX=disabled", $data);
				$fp = fopen($file, "w");
				fwrite($fp, $data);
				fclose($fp);
				cmd('/usr/sbin/setenforce 0');
			} else
			{
				die_fix("SELinux 가 활성화된 상태에서는 설치할 수 없습니다.".$crlf);
			}	// if()
		}	// if()
	}	// if()


// module check
if ($conf['db'] == 'MYSQL' && !function_exists('mysqli_connect'))
	die_fix("PHP 모듈중 'mysqli'이 설치되지 않았으므로 다음처럼 추가해야 합니다.".$crlf."RPM 설치시) php-mysqli 또는 php-mysqlnd 패키지를 설치하시면 됩니다.".$crlf."컴파일 설치시) configure 옵션중 --with-mysql 옵션을 추가하면 됩니다.".$crlf);
if ($conf['db'] == 'ORACLE' && !function_exists('oci_connect') && !function_exists('OCILogon'))
	die_fix("PHP 모듈중 'oci8'이 설치되지 않았으므로 다음처럼 추가해야 합니다.".$crlf."컴파일 설치시) configure 옵션중 --with-oci8[=DIR] 혹은 --with-oracle[=DIR] 옵션을 추가하면 됩니다.".$crlf);
if (!function_exists('mb_substr'))
	die_fix("PHP 모듈중 'mbstring'이 설치되지 않았으므로 다음처럼 추가해야 합니다.".$crlf."RPM 설치시) php-mbstring 패키지를 설치하시면 됩니다.".$crlf."컴파일 설치시) configure 옵션중 --enable-mbstring --enable-mbregex 옵션을 추가하면 됩니다.".$crlf);
if (!function_exists('iconv'))
	die_fix("PHP 모듈중 'iconv'가 설치되지 않았으므로 다음처럼 추가해야 합니다.".$crlf."RPM 설치시) php-iconv 패키지를 설치하시면 됩니다.".$crlf."컴파일 설치시) configure 옵션중 --with-iconv 옵션을 추가하면 됩니다.".$crlf);

// [2007-01-29] 현재 변수 설정을 보여주도록 함.
if ($conf['db'] == 'ORACLE' && (!getenv('ORACLE_HOME') || !getenv('ORACLE_SID') || !getenv('NLS_LANG')))
	die_fix("PHP 에서 Oracle에 접속하기 위한 환경변수가 선언되지 않았습니다.".$crlf."  => ORACLE_HOME, ORACLE_SID, NLS_LANG, ORA_NLS33 ...".$crlf."메뉴얼을 참고해서 환경변수를 적용후 재시도하시기 바랍니다.".$crlf."참고) Apache 웹서버 실행스크립트에서 사용되는 Oracle 환경변수와 동일합니다.".$crlf."    ex) source /home/oracle/.bash_profile".$crlf."".$crlf."현재 선언된 변수)".$crlf."   ORACLE_HOME=".getenv("ORACLE_HOME").$crlf."   ORACLE_SID=".getenv("ORACLE_SID").$crlf."   NLS_LANG=".getenv("NLS_LANG").$crlf);

// version check
if (version_compare(phpversion(), '4.3.0', '<'))
	die_fix("엔메일은 PHP 4.3.0 이상에서만 동작하도록 제작되었습니다.".$crlf."현재 설치된 PHP의 버젼은 ".phpversion()." 이므로 업그레이드가 필요합니다.".$crlf);

// [2006-10-20] php.ini check
$ini_ob = trim(ini_get('open_basedir'));
if ($ini_ob != '')
{
	die_fix("PHP의 설정파일인 php.ini 에서 다음 옵션이 설정되어 있습니다.".$crlf."  open_basedir = ".$ini_ob.$crlf."이 경우 엔메일 설치나 사용도중 에러가 발생할 수 있으므로 해당 옵션을 제거하거나 주석처리해야 합니다.".$crlf);
}	// if()
$ini_df = trim(ini_get('disable_functions'));
if ($ini_df != '')
{
	die_fix("PHP의 설정파일인 php.ini 에서 다음 옵션이 설정되어 있습니다.".$crlf."  disable_functions = ".$ini_df.$crlf."이 경우 엔메일 설치나 사용도중 에러가 발생할 수 있으므로 해당 옵션을 제거하거나 주석처리해야 합니다.".$crlf);
}	// if()

// [2009-06-12]
$ini_df = trim(ini_get('short_open_tag'));
if (!$ini_df)
{
	die_fix("PHP의 설정파일인 php.ini 에서 다음 옵션이 설정되어 있습니다.".$crlf."  short_open_tag = Off".$crlf."이 경우 엔메일 설치나 사용도중 에러가 발생할 수 있으므로 해당 옵션을 Off 에서 On 으로 변경하셔야 합니다.".$crlf);
}	// if()


// [2013-07-26] PHP 5.4 이상 지원불가
//if (version_compare(phpversion(), '5.4.0', '>='))
// [2015-06] 인스톨러 수정
if (version_compare(phpversion(), '7.1.0', '>'))
{
	die_fix("PHP 7.1 이상 버전은 지원되지 않습니다.  PHP 7.0.X 버전을 사용하셔야 합니다.".$crlf);
}	// if()
// [2015-06] 인스톨러 수정
if ($uname != 'WIN' && $uname_machine != 'x86_64')
{
	die_fix("32bit OS는 설치 지원되지 않습니다.  64bit OS를 사용하셔야 합니다.".$crlf);
}


// [2013-07-29] magic_quotes_runtime = On 미지원.  (대부분 솔루션에서 미지원)
$ini_df = trim(ini_get('magic_quotes_runtime'));
if ($ini_df)
{
	die_fix("PHP의 설정파일인 php.ini 에서 다음 옵션이 설정되어 있습니다.".$crlf."  magic_quotes_runtime = On".$crlf."이 경우 엔메일 설치나 사용도중 에러가 발생할 수 있으므로 해당 옵션을 On 에서 Off 로 변경하셔야 합니다.".$crlf);
}	// if()


// nm_file
if ($uname != 'WIN')
{
	if (!file_exists($conf['nm_file']))
		die_fix("설치파일( ".$conf['nm_file']." )이 존재하지 않습니다.".$crlf."현재 설치 스크립트와 동일한 디렉토리에 넣어두시기 바랍니다.".$crlf);
} else
{
	if (!file_exists('nmail_dir.ini'))
		die_fix("[nmail_dir_set.bat]를 먼저 실행하셔야 합니다.".$crlf);
}	// if()


// [2008-09-24] 편지함 백업/복구시 사용되는 압축 프로그램 Linux/Windows 구분
if ($uname != 'WIN')
{
	$zip_bin = '/usr/bin/zip';
	if (!file_exists($zip_bin))
	{
		echo $crlf."  에러)".$crlf."    서버에서 편지함 백업/복구시 사용되는 압축프로그램을 찾을 수 없습니다.".$crlf."      => ".$zip_bin.$crlf;
		echo "    서버 OS의 배포판에서 제공하는 zip 패키지를 설치하셔야 합니다.".$crlf;
		echo "    만약 zip 패키지를 설치하지 않으실 경우 편지함 백업/복구 기능은 사용할 수 없습니다.".$crlf;
		$scan = scanf("- 무시하고 설치를 계속하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'N')
			die_fix("zip 패키지를 설치하고 엔메일 설치를 다시 시작하시면 됩니다.".$crlf);
	} else if (!is_executable($zip_bin))
	{
		echo $crlf."  에러)".$crlf."    서버에서 편지함 백업/복구시 사용되는 압축프로그램의 실행권한이 없습니다.".$crlf."      => ".$zip_bin.$crlf;
		$scan = scanf("- 압축프로그램을 웹메일에서 실행할 수 있도록 권한을 부여하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'Y')
			chmod($zip_bin, 0777);
	}	// if()

	$unzip_bin = '/usr/bin/unzip';
	if (!file_exists($unzip_bin))
	{
		echo $crlf."  에러)".$crlf."    서버에서 편지함 백업/복구시 사용되는 압축프로그램을 찾을 수 없습니다.".$crlf."      => ".$unzip_bin.$crlf;
		echo "    서버 OS의 배포판에서 제공하는 unzip 패키지를 설치하셔야 합니다.".$crlf;
		echo "    만약 unzip 패키지를 설치하지 않으실 경우 편지함 백업/복구 기능은 사용할 수 없습니다.".$crlf;
		$scan = scanf("- 무시하고 설치를 계속하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'N')
			die_fix("unzip 패키지를 설치하고 엔메일 설치를 다시 시작하시면 됩니다.".$crlf);
	} else if (!is_executable($unzip_bin))
	{
		echo $crlf."  에러)".$crlf."    서버에서 편지함 백업/복구시 사용되는 압축프로그램의 실행권한이 없습니다.".$crlf."      => ".$unzip_bin.$crlf;
		$scan = scanf("- 압축프로그램을 웹메일에서 실행할 수 있도록 권한을 부여하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'Y')
			chmod($unzip_bin, 0777);
	}	// if()

	// [2009-06-16] --with-exec-dir
	$php_ini_configure = get_php_ini_configure();
	preg_match("/--with-exec-dir=([^']+)/i", $php_ini_configure, $mc);
	$with_exe_dir = $mc[1];
	if ($with_exe_dir != '' && $with_exe_dir != '/usr/bin' && $with_exe_dir != '/usr/bin/')
	{
		echo $crlf."  안내)".$crlf."    PHP 컴파일 옵션에 '--with-exec-dir=".$with_exe_dir."'항목이 있습니다.".$crlf."    이 경우 압축프로그램을 해당 디렉토리안에 복사해야 편지함 백업/복구 기능을 사용할 수 있습니다.".$crlf;
		$scan = scanf("- [".$with_exe_dir."] 디렉토리로 zip, unzip, rm 파일을 복사하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'Y')
		{
			copy($zip_bin, $with_exe_dir.DS);
			copy($unzip_bin, $with_exe_dir.DS);
			copy('/bin/rm', $with_exe_dir.DS);
		}	// if()
	}	// if()
}	// if()


switch ($uname)
{
	case 'WIN':
		$ps_ef = '';
		$home_dir = trim(implode(file('nmail_dir.ini')));
		$mailroot_dir = $home_dir.'\MailRoot';
		$_php_version = phpversion();
		$_php_family = substr($_php_version,0,3);

		// [2013-08-12] Windows TS 구분
		if (get_php_ini_thread_safety())
		{
			// [2013-12-03] PHP 5.3 + MSVC6 + TS
			if ($_php_family == "5.3" && strpos(get_php_ini_compiler(), 'MSVC6') !== false)
			{
				$mailparse_lib = 'php_mailparse_'.$_php_family.'.vc6.dll';
			} else
			{
				$mailparse_lib = 'php_mailparse_'.$_php_family.'.dll';
			}	// if()
		} else
		{
			$mailparse_lib = 'php_mailparse_'.$_php_family.'.nts.dll';
		}	// if()
		break;

	case 'LINUX':
		$ps_ef = 'ps -efw';
		$home_dir = '/home';
		$mailroot_dir = '/var/MailRoot';
		$mailparse_lib = 'mailparse.so';
		break;

	case 'SUNOS':
		$ps_ef = 'ps -ef';
		$home_dir = '/export/home';
		$mailroot_dir = '/var/MailRoot';
		$mailparse_lib = 'mailparse.so';
		break;
}	// switch()

// root 인지 체크
if ($uname == 'LINUX')
{
	$whoami = cmd('/usr/bin/whoami');
	if ($whoami != '' && $whoami != 'root')
		die_fix("root 권한으로 실행하시기 바랍니다.".$crlf."".$crlf."ex) su -".$crlf);
}	// if()


################################################################################

// options - command line argument

$shortopts  = "";

$longopts  = array(
	"web-conf::",    // Optional value
	"web-group::",    // Optional value
	"web-group-id::",    // Optional value
	"web-server-name::",    // Optional value
);
$options = getopt($shortopts, $longopts);

################################################################################



// license
// [2013-07-30] 2시간이내에 재실행시 라이센스를 다시 묻지 않기.
if (!file_exists('nmail_license_agree.ini') || filemtime('nmail_license_agree.ini') < (time()-7200))
{


if ($uname == 'WIN')
{
echo '
---- Nmail 라이센스 규정----

주의 : 패스코리아넷은 본 라이센스 협약의 모든 조건에 동의한다는 전제하에 Nmail 프로그램
(이하 “프로그램”) 과 관련된 소프트웨어의 라이센스를 귀하(이하 “사용자”)에게 허가합니다.
협약 조건을 상세히 검토하시기 바랍니다.


패스코리아넷은 사용자에게 아래 명시된 소프트웨어 및 문서 프로그램를 이용하기 위한
테스트용 및 비영리용 라이센스를 부여합니다.

테스트용 라이센스 :
패스코리아넷은 사용자에게  제품 테스트 목적으로 프로그램을 이용할 수 있는 비독점적이며
양도할 수 없는 제한된 라이센스를 부여합니다. 사용자는 단지 테스트 목적으로만 사용할 수 있습니다.

';
scanf("-- 다음 페이지 --", array(), 5, false, true);
echo '
비영리 및 비업무용 제한 라이센스(이하 "비영리용 라이센스") :
비영리 단체나 기관등은 다음과 같은 금지 사항을 준수하여야 합니다.
(1) 제품명, 저작권 및 기타 주의 사항 및 소유 제한 사항을 프로그램에서 제거할 수 없습니다.
(2) Nmail 제품군의 경우 저작권 표시와 메일 발송시 붙는 문구를 제거할 수 없습니다.
(3) 비영리용 라이센스로 영리기관(개인회사, 일반법인등)에서 사용할 수 없습니다.

정식 라이센스 :
회사나 영리를 목적으로 하는 곳에서는 패스코리아넷으로부터 라이센스를 구입해야 합니다.
이 경우 테스트용, 비영리용 라이센스의 제약을 적용받지 않고 사용하실 수 있습니다.

프로그램의 저작권 및 소유권 : 프로그램들은 패스코리아넷의 비공개적 재산이며 저작권 및 기타
지적 재산 관련법에 의해 보호됩니다. 고객은 프로그램을 사용권만 부여받으며 본 협약에 명시된
프로그램 이외의 명시되거나 내포된 어떠한 권리도 갖지 않습니다.
지적 재산권을 포함하여 프로그램 및 매체에 대한 모든 권리, 소유권은 항상 패스코리아넷에게
속합니다.

';
scanf("-- 다음 페이지 --", array(), 5, false, true);
echo '
보증 포기 : 프로그램은 어떠한 종류의 보증도 없이 “현재 상태 그대로”제공됩니다.
패스코리아넷은 나아가 특정 목적의 상업성 및 적합성에 대한 어떠한 내포된 보증을 포함하여
명시 또는 내포된 모든 보증을 포기합니다.

책임 제한 : 어떠한 경우에도 패스코리아넷은 사용자나 제 3자의 계약이나 부당 행위로 인한
모든 직간접적 우연적, 특수한, 응보적, 결과적 피해나 이익, 수익, 데이타 또는 데이타 사용의 손실로
인한 피해에 대해서는 패스코리아넷은 그러한 피해 가능성을 통고받았다 할지라도 책임이 없습니다.
따라서 어떠한 경우에도 패스코리아넷의 전적인 책임 범위는 본 라이센스에 대해 사용자가 실제
지불한 비용의 손해에 한합니다.

파기 : 사용자는 언제라도 모든 프로그램 복제본을 폐기함으로써 본 라이센스를 파기할 수 있습니다.
패스코리아넷은 언제라도 사용자가 본 라이센스의 조건을 위반했을 경우 임의로 고객의 프로그램
사용권을 박탈할 수 있습니다. 그러한 경우에 사용자는 반드시 프로그램을 폐기하여야 합니다. 상기
보증 포기 및 책임 제한 부분은 본 협약의 파기 후에도 유효합니다.

';
scanf("-- 다음 페이지 --", array(), 5, false, true);
echo '
테스트용, 비영리용 라이센스의 기술 지원 불가 :
패스코리아넷은 본 협약에 따라 라이센스를 받은 프로그램에 대해 사용자에게
기술 지원, 전화 지원, 업데이트를 제공할 의무가 없습니다.

패스코리아넷은 사용자의 프로그램 사용에 대한 감사권을 가집니다. 본 협약의 어느조항이라도
타당성이나 구속력을 상실하더라도 나머지 조항의 효력은 영향을 받지 않습니다.


제품지원 홈페이지 : http://passkorea.net
제품 구입안내 : (TEL)1544-1608 (nmail@passkorea.net)

';
} else
{
echo '
---- Nmail 라이센스 규정----

주의 : 패스코리아넷은 본 라이센스 협약의 모든 조건에 동의한다는 전제하에 Nmail 프로그램
(이하 “프로그램”) 과 관련된 소프트웨어의 라이센스를 귀하(이하 “사용자”)에게 허가합니다.
협약 조건을 상세히 검토하시기 바랍니다.


패스코리아넷은 사용자에게 아래 명시된 소프트웨어 및 문서 프로그램를 이용하기 위한
테스트용 및 비영리용 라이센스를 부여합니다.

테스트용 라이센스 :
패스코리아넷은 사용자에게  제품 테스트 목적으로 프로그램을 이용할 수 있는 비독점적이며
양도할 수 없는 제한된 라이센스를 부여합니다. 사용자는 단지 테스트 목적으로만 사용할 수 있습니다.

비영리 및 비업무용 제한 라이센스(이하 "비영리용 라이센스") :
비영리 단체나 기관등은 다음과 같은 금지 사항을 준수하여야 합니다.
(1) 제품명, 저작권 및 기타 주의 사항 및 소유 제한 사항을 프로그램에서 제거할 수 없습니다.
(2) Nmail 제품군의 경우 저작권 표시와 메일 발송시 붙는 문구를 제거할 수 없습니다.
(3) 비영리용 라이센스로 영리기관(개인회사, 일반법인등)에서 사용할 수 없습니다.

정식 라이센스 :
회사나 영리를 목적으로 하는 곳에서는 패스코리아넷으로부터 라이센스를 구입해야 합니다.
이 경우 테스트용, 비영리용 라이센스의 제약을 적용받지 않고 사용하실 수 있습니다.

';
scanf("-- 다음 페이지 --", array(), 5, false, true);
echo '

프로그램의 저작권 및 소유권 : 프로그램들은 패스코리아넷의 비공개적 재산이며 저작권 및 기타
지적 재산 관련법에 의해 보호됩니다. 고객은 프로그램을 사용권만 부여받으며 본 협약에 명시된
프로그램 이외의 명시되거나 내포된 어떠한 권리도 갖지 않습니다.
지적 재산권을 포함하여 프로그램 및 매체에 대한 모든 권리, 소유권은 항상 패스코리아넷에게
속합니다.

보증 포기 : 프로그램은 어떠한 종류의 보증도 없이 “현재 상태 그대로”제공됩니다.
패스코리아넷은 나아가 특정 목적의 상업성 및 적합성에 대한 어떠한 내포된 보증을 포함하여
명시 또는 내포된 모든 보증을 포기합니다.

책임 제한 : 어떠한 경우에도 패스코리아넷은 사용자나 제 3자의 계약이나 부당 행위로 인한
모든 직간접적 우연적, 특수한, 응보적, 결과적 피해나 이익, 수익, 데이타 또는 데이타 사용의 손실로
인한 피해에 대해서는 패스코리아넷은 그러한 피해 가능성을 통고받았다 할지라도 책임이 없습니다.
따라서 어떠한 경우에도 패스코리아넷의 전적인 책임 범위는 본 라이센스에 대해 사용자가 실제
지불한 비용의 손해에 한합니다.

파기 : 사용자는 언제라도 모든 프로그램 복제본을 폐기함으로써 본 라이센스를 파기할 수 있습니다.
패스코리아넷은 언제라도 사용자가 본 라이센스의 조건을 위반했을 경우 임의로 고객의 프로그램
사용권을 박탈할 수 있습니다. 그러한 경우에 사용자는 반드시 프로그램을 폐기하여야 합니다. 상기
보증 포기 및 책임 제한 부분은 본 협약의 파기 후에도 유효합니다.

테스트용, 비영리용 라이센스의 기술 지원 불가 :
패스코리아넷은 본 협약에 따라 라이센스를 받은 프로그램에 대해 사용자에게
기술 지원, 전화 지원, 업데이트를 제공할 의무가 없습니다.

패스코리아넷은 사용자의 프로그램 사용에 대한 감사권을 가집니다. 본 협약의 어느조항이라도
타당성이나 구속력을 상실하더라도 나머지 조항의 효력은 영향을 받지 않습니다.


제품지원 홈페이지 : http://passkorea.net
제품 구입안내 : (TEL)1544-1608 (nmail@passkorea.net)

';
}	// if()

$scan = scanf("위 Nmail 라이센스 규정에 동의하십니까? [y/N] : ", array('N', 'Y'), 2);
if ($scan == 'N')
	die_fix("Nmail 라이센스 규정에 동의하지 않으시면 설치할 수 없습니다.".$crlf);
else
	touch('nmail_license_agree.ini');

} else
{
echo '
---- Nmail 라이센스 규정----

이미 동의하였으므로 생략합니다. 

  만약 라이센스 내용을 다시 확인하려면 nmail_license_agree.ini 파일을 삭제하고, 
  설치 프로그램을 다시 실행하면 됩니다.

';

}	// if()


################################################################################

// input
title("설치시 사용될 정보를 입력합니다.");
echo "괄호로 둘러 쌓인 항목( [nmail2] )은 엔터만 입력하면 지정되는 기본값입니다.".$crlf;
echo "특별한 사유가 없다면 가급적 기본값으로 설치하는 것을 권장해드립니다.".$crlf;
echo $crlf;


// nm_root, user, pass


// nm_domain
$file = $mailroot_dir.DS.'server.tab';
if (file_exists($file))
{
	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	preg_match('/"RootDomain"\t"([^"]+)"/i', $file_read_ori, $mc);
} else
{
	$mc = array();
}	// if()
if ($mc[1] != '' && $mc[1] != 'domain.com')
{
	$conf['nm_domain'] = $mc[1];
	echo "- 엔메일 기본 도메인 : ".$conf['nm_domain'].$crlf."  (설치완료후 관리툴에서 변경가능)".$crlf;
} else
{
	$equal = false;
	while ($equal == false)
	{
		$conf['nm_domain'] = scanf("- 엔메일 기본 도메인(YourDomain.com)".$crlf."  주의) 2차도메인인 mail.YourDomain.com 은 입력하시면 안됩니다.".$crlf."  입력하신 도메인은 [ UserID@YourDomain.com ]형태의 메일주소로 사용됩니다.".$crlf."  : ", array(), 255, false);
		$host = gethostbyname($conf['nm_domain']);

		// [2009-06-15]
		if (strpos($conf['nm_domain'], 'mail.') === 0)
		{
			echo $crlf;
			echo "[".$conf['nm_domain']."] 도메인에 mail. 호스트가 붙어 있습니다.".$crlf."  이 경우 메일 송수신시 사용되는 메일주소는 [ UserID@".$conf['nm_domain']." ]형태입니다.".$crlf;
			$scan = scanf("입력하신 도메인을 그대로 사용하시겠습니까? [y/N] : ", array('N', 'Y'), 2);
			if ($scan == 'N')
				continue;
		}	// if()

		echo $crlf;
		if ($host == $conf['nm_domain'])
		{
			echo "[".$conf['nm_domain']."] 도메인의 IP를 찾지 못했으며 예상되는 원인은 다음과 같습니다.".$crlf."  1. DNS 서버에서 해당 도메인을 등록하지 않은 경우.".$crlf."  2. /etc/resolv.conf 에 등록된 네임서버에 문제가 있어서 해당 도메인을 찾지 못하는 경우.".$crlf;
			$scan = scanf("입력하신 도메인을 그대로 사용하시겠습니까? [y/N] : ", array('N', 'Y'), 2);
			if ($scan == 'Y')
				$equal = true;
		} else
		{
			echo "[".$conf['nm_domain']."] 도메인의 IP는 [".$host."]입니다.".$crlf."DNS 설정에 의해 메일서버 IP와 다를 수 도 있습니다.".$crlf;
			$scan = scanf("입력하신 도메인을 사용하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
			if ($scan == 'Y')
				$equal = true;
		}	// if()
	}	// while()

}	// if()

if ($uname == 'WIN')
{
	$conf['nm_root'] = $home_dir;
} else
{
	$ini = 'nmail_dir.ini';
	if (file_exists($ini))
	{
		$nmail_dir = trim(implode(file($ini)));

		// 실제 설치 디렉토리가 존재하는 경우에만 설치 디렉토리 재입력이 안되도록 함.  재입력을 위해서는 nmail_dir.ini 파일을 삭제해야 함.
		if (is_dir($nmail_dir))
		{
			$conf['nm_root'] = $nmail_dir;
			echo $crlf.'- 엔메일 설치 디렉토리 : '.$conf['nm_root'].$crlf;
		}	// if()
	} else
	{
		$nmail_dir = $home_dir."/nmail2";
	}	// if()

	// [2013-07-30] 설치 디렉토리를 입력한 경우, 다시 실행하더라도 재입력하지 않도록 함.
	if ($conf['nm_root'] == '')
	{
		$conf['nm_root'] = scanf("- 엔메일 설치 디렉토리(없을 경우 자동생성됨)".$crlf."  [".$nmail_dir."] : ", array($nmail_dir), 255, false);

		$fp = fopen($ini, "w");
		fwrite($fp, $conf['nm_root']);
		fclose($fp);
	}	// if()
}	// if()

#$conf['nm_user'] = scanf("- 엔메일 전용 시스템 계정(없을 경우 자동생성됨)".$crlf."  [nmail2] : ", array('nmail2'), 255, false);
$conf['nm_user'] = 'nmail2';


$db_file = $conf['nm_root'].'/nmail/include/global_db.php';

// [2007-04-09]
if (file_exists($db_file))
{
	define("_INCLUDED_GLOBAL", 1);
	include($db_file);

	if ($G_SYS[DB_PASSWORD] != 'YourPasssword')
	{
		$conf['nm_pass'] = $G_SYS[DB_PASSWORD];
	}	// if()
}	// if()

if ($conf['nm_pass'] == '')
{
	// nmail/include/member_lib.php
	// [2013-07-08] 비밀번호 안전 레벨
	function member_password_security($m_pwd, $m_id)
	{
		global $G_SYS;
		$error = '';

		$m_pwd = stripslashes($m_pwd);

		if (strlen($m_pwd) > 20)
		{
			$error = "20자 이상은 입력할 수 없습니다.";
		} else if ($m_pwd == $m_id)
		{
			$error = "아이디와 같을 수 없습니다.";
		} else
		{
			switch ($G_SYS['S_PASS_EVEL'])
			{
				case 1:
					if (strlen($m_pwd) < 4)
					{
						$error = "4자 이상 입력해야 합니다.";
					} else if (in_array($m_pwd, array('0000', '00000', '000000', '1111', '11111', '111111', '2222', '3333', '4444', '5555', '6666', '7777', '8888', '9999', '1234', '12345', '123456', '1234567', '12345678', '123456789', '1234567890', '123123')))
					{
						$error = "동일하거나 순차적인 숫자로만(1111,1234,...) 사용할 수 없습니다.";
					}	// if()
					break;

				case 2:
					if (strlen($m_pwd) < 6)
					{
						$error = "6자 이상 입력해야 합니다.";
					} else if (!preg_match('/[a-zA-Z]/', $m_pwd) || (!preg_match('/[0-9]/', $m_pwd) && !preg_match("/[~`\!@#\$%\^&\*\(\)_\+\{\}\|\:\"\<\>\?\-\=\[\];\'\/\.,\\\]/", $m_pwd)))
					{
						$error = "영문과 숫자가 1개 이상 포함되어야 합니다.";
					}	// if()
					break;

				default:		// 3
					if (strlen($m_pwd) < 8)
					{
						$error = "8자 이상 입력해야 합니다.";
					} else if (!preg_match('/[a-z]/', $m_pwd) || (!preg_match('/[A-Z]/', $m_pwd) && !preg_match("/[~`\!@#\$%\^&\*\(\)_\+\{\}\|\:\"\<\>\?\-\=\[\];\'\/\.,\\\]/", $m_pwd)))
					{
						//vd(preg_quote("~`!@#$%^&*()_+{}|:\"<>?-=[]\;'/.,"));  // "~`\!@#\$%\^&\*\(\)_\+\{\}\|\:"\<\>\?-\=\[\]\\;'/\.,"
						$error = "영문소문자 1개 이상, 영문대문자나 특수문자가 1개 이상 포함되어야 합니다.";
					}	// if()
					break;
			}	// switch()


			if ($error == '')
			{
				if (in_array($m_pwd, array('asdf', 'qwer', 'test', 'abcd', 'admin', 'password', 'abc123', 'qwerty', 'monkey', 'letmein', 'dragon', 'baseball', 'iloveyou', 'sunshine', 'master', 'welcome', 'shadow', 'ashley', 'football', 'jesus', 'michael', 'ninja', 'mustang', 'password1')))
				{
					$error = "유추하기 쉬운 단어로만(test,asdf,...) 사용할 수 없습니다.";
				}	// if()
			}	// if()
		}	// if()

		return $error;
	}	// function()

	$equal = false;
	while ($equal == false)
	{
		if ($uname == 'WIN')
		{
			$conf['nm_pass'] = scanf("- 엔메일 셋팅시 사용될 비밀번호(영문,숫자,특수문자)".$crlf."  관리자계정, 디비계정에서 사용됩니다.".$crlf."  : ", array(), 40, false);
		} else
		{
			$conf['nm_pass'] = scanf("- 엔메일 셋팅시 사용될 비밀번호(영문,숫자,특수문자)".$crlf."  시스템계정, 관리자계정, 디비계정에서 사용됩니다.".$crlf."  : ", array(), 40, false);
		}	// if()

		$nm_pass2 = scanf("- 엔메일 셋팅시 사용될 비밀번호 확인".$crlf."  : ", array(), 40, false);

		if (strlen($conf['nm_pass']) < 6)
		{
			alert("비밀번호는 6자 이상으로 입력하여 주십시오.");
		} else if (substr($conf['nm_pass'], 0, 1) == '#')
		{
			alert("비밀번호의 첫글자는 #으로 시작하실 수 없습니다.  다시 입력하여 주십시오.");
		} else if ($conf['nm_pass'] != $nm_pass2)
		{
			alert("비밀번호가 일치하지 않습니다.  다시 입력하여 주십시오.");
		} else
		{
			$G_SYS['S_PASS_EVEL'] = 3;
			$error = member_password_security($conf['nm_pass'], 'postmaster');
			if ($error != '')
			{
				alert($error);
			} else
			{
				$equal = true;
			}	// if()
		}	// if()
	}	// while()
}	// if()

################################################################################

// 엔메일 관리용 시스템 계정 추가.
if ($uname != 'WIN')
{
	title("엔메일 관리용 시스템 계정을 생성합니다.");
	if (get_uid($conf['nm_user'], true) == NULL)
	{
		// [2013-12-03] 우분투
		//system("/usr/sbin/useradd -d ".$conf['nm_root']." ".$conf['nm_user']);
		system("/usr/sbin/useradd -m -d ".$conf['nm_root']." ".$conf['nm_user']);
		if (get_uid($conf['nm_user']) == NULL)
		{
			echo "[".$conf['nm_user']."]계정을 알수 없는 원인으로 생성하지 못하였습니다.".$crlf."수작업으로 직접 생성해주시기 바랍니다.".$crlf;
		} else
		{
			echo "[".$conf['nm_user']."]계정을 생성하였습니다.".$crlf;
			if ($uname == 'LINUX')
			{
				// 시스템 계정의 비밀번호 지정.
				// [2013-12-02] 우분투
				if (strpos(php_uname(), 'ubuntu') !== false)
				{
					$tmp = '.adduserpasswdtmp';
					$fp = fopen($tmp, "w");
					fwrite($fp, $conf['nm_user'].":".$conf['nm_pass']);
					fclose($fp);
					system("cat ".$tmp." | /usr/sbin/chpasswd");
					unlink($tmp);
				} else
				{
					$tmp = '.adduserpasswdtmp';
					$fp = fopen($tmp, "w");
					fwrite($fp, $conf['nm_pass']);
					fclose($fp);
					system("passwd --stdin ".$conf['nm_user']." < ".$tmp);
					unlink($tmp);
				}	// if()
				// 시스템 계정의 디렉토리 퍼미션 조절.
				chmod($conf['nm_root'], 0711);
			}	// if()
		}	// if()
	} else
	{
		echo "[".$conf['nm_user']."]계정은 이미 존재하므로 생성하지 않습니다.".$crlf;
	}	// if()
}	// if()

################################################################################

// 압축파일 해제
if ($uname != 'WIN')
{
	title("엔메일 설치파일을 복사합니다.");
	if (!file_exists($conf['nm_root'].'/nmail/include/global.php'))
	{
		if (!is_dir($conf['nm_root']))
		{
			if (!mkdir($conf['nm_root']))
			{
				die_fix("엔메일 설치 디렉토리를 생성할 수 없습니다.".$crlf);
			} else
			{
				echo "엔메일 설치 디렉토리가 존재하지 않아 생성하였습니다.".$crlf;
			}	// if()
		}	// if()
		chdir($conf['nm_root']);
		system("gunzip < ".dirname(__FILE__).'/'.$conf['nm_file']." | tar -xf -");

		if (!file_exists($conf['nm_root'].'/nmail/include/global.php'))
		{
			die_fix("복사에 실패하였습니다.".$crlf."아래 명령을 참고해서 수작업으로 직접 복사한뒤 설치 프로그램을 다시 실행해보십시오.".$crlf."  cd ".$conf['nm_root']."; gunzip < ".dirname(__FILE__).'/'.$conf['nm_file']." | tar -xf -".$crlf);
		} else
		{
			echo $conf['nm_root']." 디렉토리에 압축을 풀어 복사했습니다.".$crlf;
		}	// if()
	} else
	{
		echo "이미 복사되었으므로 생략합니다.".$crlf;
	}	// if()

	// link
	title("엔메일 설치디렉토리를 확인합니다.");
	// [2006-10-20]/export/home 이 없을 경우 생성후 심볼릭링크 생성.
	if ($uname == 'SUNOS')
	{
		if (!is_dir($home_dir))
		{
			if (!mkdir($home_dir, 0711))
			{
				die_fix("Solaris 환경일 경우 [".$home_dir."] 디렉토리가 반드시 존재해야 합니다.".$crlf."[".$home_dir."] 디렉토리를 생성하다가 실패했으므로 직접 생성후 설치를 재시도하시기 바랍니다.".$crlf);
			}	// if()
		}	// if()
	}	// if()
	if (!file_exists($home_dir.'/nmail2') && $conf['nm_root'] != $home_dir.'/nmail2' && $conf['nm_root'] != $home_dir.'/nmail2/')
	{
		symlink($conf['nm_root'], $home_dir.'/nmail2');
		echo "기본 설치디렉토리인 [".$home_dir."/nmail2]가 아니므로 심볼릭링크를 생성해두었습니다.".$crlf;
	} else
	{
		echo "이상이 없습니다.".$crlf;
	}	// if()
}	// if()


// [2009-06-25] 설치가 완료될때까지는 웹페이지에서는 접근이 불가능하게 함.
if (file_exists($conf['nm_root'].'/nmail/index__INSTALLING.php'))
{
	rename($conf['nm_root'].'/nmail/index.php', $conf['nm_root'].'/nmail/index__INSTALLING_ori.php');
	rename($conf['nm_root'].'/nmail/index__INSTALLING.php', $conf['nm_root'].'/nmail/index.php');
}	// if()


if (!file_exists($conf['nm_root'].'/nmail/include/global_var.php'))
{
	copy($conf['nm_root'].'/nmail/include/global_var.default.php', $conf['nm_root'].'/nmail/include/global_var.php');
}	// if()



################################################################################

// nm_db - 패키지의 압축을 푼뒤에 시작해야 함.
if ($conf['db'] == 'MYSQL')
{
title("엔메일용 디비와 계정생성 작업을 시작합니다.");
} else
{
	title("엔메일용 디비 계정정보를 확인합니다.");
}	// if()

// test
if (!defined("_INCLUDED_GLOBAL"))
{
	define("_INCLUDED_GLOBAL", 1);
}	// if()
include($db_file);

if ($conf['db'] == 'MYSQL')
{
	$link = @mysqli_connect($G_SYS[DB_HOST], $G_SYS[DB_USER], $G_SYS[DB_PASSWORD]);
	$sdb = @mysqli_select_db($link, $G_SYS[DB_NAME]);
} else
{
	// [2013-08-28] 오라클 처음 입력된 문자열로 연결시도하이 딜레이되는 현상 개선
	if ($G_SYS[DB_HOST] == 'connect_string' && $G_SYS[DB_PASSWORD] == 'YourPasssword')
	{
		$link = false;
		$sdb = false;
	} else
	{
		$link = @OCILogon($G_SYS[DB_USER], $G_SYS[DB_PASSWORD], $G_SYS[DB_HOST]);
		$sdb = true;
	}	// if()
}	// if()
if ($link == false || $sdb == false)
{
	$equal = false;
	if ($conf['db'] == 'MYSQL')
	{

		while ($equal == false)
		{
			echo "- MySQL 서버 주소(Host/IP)를 입력하세요.".$crlf;
			echo "  주의) 엔메일을 설치하려는 서버내에 MySQL 서버가 같이 있는 경우, localhost 를 입력하시면 됩니다.".$crlf;
			$conf['nm_db_host'] = scanf("  [localhost] : ", array('localhost'), 255, false);
			echo "- MySQL root 계정의 비밀번호를 입력하세요.".$crlf;
			$conf['nm_db_root'] = scanf("  : ", array(), 255, false, true);
			echo $crlf;
			echo "입력된 정보로 MySQL 서버에 접속 테스트를 시작합니다...".$crlf;
			$link = mysqli_connect($conf['nm_db_host'], 'root', $conf['nm_db_root']);
			if ($link === false)
			{
				alert("MySQL 서버에 접속할 수 없거나 Root 비밀번호가 틀렸습니다.".$crlf."먼저 MySQL 서버가 시작되어 있는지 확인해보시기 바랍니다.".$crlf."이상이 없다면 확인후 정보를 다시 입력하여 주십시오.");
			} else
			{
				echo "...연결성공!".$crlf;
				$equal = true;
			}	// if()
		}	// while()

		echo "엔메일용 디비와 계정의 아이디는 편의를 위해 [nmail2]로 설정됩니다.".$crlf;

		$mysql_version = mysqli_fetch_row(mysqli_query($link, "SELECT VERSION()"));
		if (version_compare($mysql_version[0], '4.1.0', '>='))
		{
			// [2022-12-09] MariaDB 10.6 부터 이모지 지원을 위해 utf8mb4 사용
			if (version_compare($mysql_version[0], '10.6', '>=')) {
				$conf['db_charset'] = 'utf8mb4';
				$conf['db_collate'] = 'utf8mb4_unicode_ci';
			}

			mysqli_query($link, "SET NAMES ".$conf['db_charset']);
			$create_db_sql = "CREATE DATABASE ".$nm_db_name." DEFAULT CHARACTER SET ".$conf['db_charset']." COLLATE ".$conf['db_collate'];
		} else
		{
			$create_db_sql = "CREATE DATABASE ".$nm_db_name;
		}	// if()

		$sdb = @mysqli_select_db($link, $nm_db_name);
		if ($sdb === false)
		{
		   if (mysqli_query($link, $create_db_sql)) {
			   print ("엔메일 데이터베이스를 생성하였습니다. => ".$nm_db_name.$crlf);
		   } else {
			   printf ("엔메일 데이터베이스 생성 에러: %s".$crlf, mysqli_error($link));
		   }
		} else
		{
			echo "엔메일 데이터베이스는 이미 생성되어 있으므로 생략합니다.".$crlf;
		}	// if()

		$link2 = @mysqli_connect($conf['nm_db_host'], $nm_db_user, $conf['nm_pass']);
		if ($link2 === false)
		{
			mysqli_query($link, "GRANT USAGE ON * . * TO '".$nm_db_user."'@'".$conf['nm_db_host']."' IDENTIFIED BY '".addslashes($conf['nm_pass'])."'") or die ("엔메일 디비 계정 생성 오류 : ".mysqli_error());
			mysqli_query($link, "GRANT ALL PRIVILEGES ON ".$nm_db_name." . * TO '".$nm_db_user."'@'".$conf['nm_db_host']."' WITH GRANT OPTION") or die ("엔메일 디비 계정 권한부여 오류 : ".mysqli_error());
			echo "엔메일 디비 계정을 생성하였습니다. => ".$nm_db_user.$crlf;
		} else
		{
			echo "엔메일 디비 계정은 이미 생성되어 있으므로 생략합니다.".$crlf;
		}	// if()

		$link3 = mysqli_connect($conf['nm_db_host'], $nm_db_user, $conf['nm_pass']);
		if ($link3 === false)
		{
			die_fix("알수없는 원인으로 엔메일 디비 계정 생성에 실패하였습니다.".$crlf."수작업으로 설정후 다시 설치를 시작하여 주십시오.".$crlf);
		} else
		{
			echo "엔메일 디비 계정 접속 테스트에 성공하였습니다.".$crlf;
		}	// if()

		$sdb2 = mysqli_select_db($link2,$nm_db_name);
		if ($sdb2 === false)
		{
			die_fix("알수없는 원인으로 엔메일 디비 계정 권한부여에 실패하였습니다.".$crlf."수작업으로 설정후 다시 설치를 시작하여 주십시오.".$crlf);
		} else
		{
			echo "엔메일 디비 계정 권한부여 테스트에 성공하였습니다.".$crlf;
		}	// if()

		// global_db.php
		$fp = fopen($db_file, "r");
		$db_file_read_ori = fread($fp, filesize($db_file));
		fclose($fp);

		$db_file_read = $db_file_read_ori;
		$db_file_read = str_replace('YourPasssword', str_replace("'", "\'", $conf['nm_pass']), $db_file_read);

		// host
			if ($conf['nm_db_host'] != 'localhost')
			{
				$db_file_read = str_replace('$G_SYS[DB_HOST] = "localhost";', '$G_SYS[DB_HOST] = "'.$conf['nm_db_host'].'";', $db_file_read);
			}	// if()

		// mysql 한글 인코딩 관련.
			if (version_compare($mysql_version[0], '4.1.0', '>='))
			{
				$db_file_read = str_replace('$G_SYS[DB_CHARSET] = "";', '$G_SYS[DB_CHARSET] = "'.$conf['db_charset'].'";', $db_file_read);
			}	// if()

		if (strcmp($db_file_read, $db_file_read_ori))
		{
			$fp = fopen($db_file, "w");
			fwrite($fp, $db_file_read);
			fclose($fp);
			echo "엔메일 디비 설정파일을 저장하였습니다.".$crlf."  ".$conf['nm_root']."/nmail/include/global_db.php".$crlf;
		}	// if()
	} else
	{
		while ($equal == false)
		{
			$conf['nm_db_host'] = scanf("- Oracle SID  ex) ora, ora9, XE ...".$crlf."  : ", array(), 255, false);
			$conf['nm_db_user'] = scanf("- Oracle User".$crlf."  : ", array(), 255, false, false);
			$conf['nm_db_pass'] = scanf("- Oracle User Password".$crlf."  : ", array(), 255, false, false);
			echo "입력된 정보로 Oracle DB에 접속 테스트를 시작합니다...".$crlf;
			$link = OCILogon($conf['nm_db_user'], $conf['nm_db_pass'], $conf['nm_db_host']);
			if ($link === false)
			{
				alert("Oracle DB에 접속할 수 없거나 User/Password 가 틀렸습니다.".$crlf."먼저 Oracle 서버가 시작되어 있는지 확인해보시기 바랍니다.".$crlf."이상이 없다면 확인후 정보를 다시 입력하여 주십시오.");
			} else
			{
				echo "...연결성공!".$crlf;
				$equal = true;
			}	// if()
		}	// while()

		// global_db.php
		$fp = fopen($db_file, "r");
		$db_file_read_ori = fread($fp, filesize($db_file));
		fclose($fp);

		$db_file_read = $db_file_read_ori;

		$db_file_read = str_replace('$G_SYS[DB_HOST] = \'connect_string\'', '$G_SYS[DB_HOST] = \''.str_replace("'", "\'", $conf['nm_db_host']).'\'', $db_file_read);
		$db_file_read = str_replace('$G_SYS[DB_USER] = \'nmail2\'', '$G_SYS[DB_USER] = \''.str_replace("'", "\'", $conf['nm_db_user']).'\'', $db_file_read);
		$db_file_read = str_replace('$G_SYS[DB_PASSWORD] = \'YourPasssword\'', '$G_SYS[DB_PASSWORD] = \''.str_replace("'", "\'", $conf['nm_db_pass']).'\'', $db_file_read);

		$db_file_read = str_replace('$G_SYS[XM_CTRL_P] = \'YourPasssword\'', '$G_SYS[XM_CTRL_P] = \''.str_replace("'", "\'", $conf['nm_pass']).'\'', $db_file_read);

		if (strcmp($db_file_read, $db_file_read_ori))
		{
			$fp = fopen($db_file, "w");
			fwrite($fp, $db_file_read);
			fclose($fp);
			echo "엔메일 디비 설정파일을 저장하였습니다.".$crlf."  ".$conf['nm_root']."/nmail/include/global_db.php".$crlf;
		}	// if()

	}	// if()
} else
{
	echo "이미 디비 설정파일이 설정되었으므로 생략합니다.".$crlf;
}	// if()

################################################################################


// [2009-04-03] DNS 직접 지정 - /etc/resolv.conf 에 등록된 DNS를 자동 입력하도록 함.
	if (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' && file_exists('/etc/resolv.conf'))
	{
		$resolv = file('/etc/resolv.conf');
		$dns = array();
		for ($i=0; $i<sizeof($resolv); $i++)
		{
			preg_match('/^nameserver[ \t]+((([0-9]{1,3}){1}\.){3}([0-9]{1,3}){1})?/i', $resolv[$i], $mc);
			if ($mc[1] != '')
			{
				$dns[] = $mc[1];
			}	// if()
		}	// for()

		if (sizeof($dns) > 0)
		{
			$dns[] = '164.124.101.2';
			$dns[] = '168.126.63.2';
			$dns[] = '8.8.8.8';
			$dns = array_values(array_unique($dns));

			$file = $conf['nm_root'].'/upload/config/nmail_server.php';
			if (file_exists($file))
			{
				$data = file_get_contents($file);
				if (strpos($data, '$G_SYS[S_DNS_DIRECT] = array();') !== false)
				{
					title("메일발송시 사용할 DNS 목록을 선택합니다.");
					echo "다음 DNS 목록은 [메일서버관리 >> 서버 설정]에서 'DNS 직접 지정'항목에 추가되며,".$crlf;
					echo "    설치가 완료된 뒤에도 관리자모드에서 변경이 가능합니다.".$crlf.$crlf;
					foreach ($dns as $key=>$val)
					{
						echo "    ".$val.$crlf;
					}	// foreach()
					echo $crlf;
					$scan = scanf("위 DNS 목록을 사용하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
					if ($scan == 'Y')
					{
						$exp = $dns;
						$_s_dns_direct = '';
						$_s_dns_direct_cfg = '';
						for($i=0; $i<sizeof($exp); $i++)
						{
							$chk_id = trim($exp[$i]);
							if ($chk_id != '')
							{
								if ($_s_dns_direct != '')
									$_s_dns_direct .= ",";
								$_s_dns_direct .= "'".$chk_id."'";

								if ($_s_dns_direct_cfg != '')
									$_s_dns_direct_cfg .= ",";
								$_s_dns_direct_cfg .= $chk_id.":tcp";
							}
						}	// for()
						$data = str_replace('$G_SYS[S_DNS_DIRECT] = array();', '$G_SYS[S_DNS_DIRECT] = array('.$_s_dns_direct.');', $data);
						$fp = fopen($file, "w");
						fwrite($fp, $data);
						fclose($fp);

						// mailserver
						if ($_s_dns_direct_cfg != '')
						{
							$file = $conf['nm_root'].'/MailRoot/server.tab';
							$data = file_get_contents($file);
							$data .= '"SmartDNSHost"	"'.$_s_dns_direct_cfg.'"'.$crlf;
							$fp = fopen($file, "w");
							fwrite($fp, $data);
							fclose($fp);
						}	// if()
					}	// if()
				}	// if()
			}	// if()
		}	// if()
	}	// if()

################################################################################

// 메일엔진 설정
if ($uname != 'WIN')
{
	title("엔메일 메일엔진 관련파일을 복사합니다.");
	if (!file_exists($mailroot_dir) || (!file_exists('/etc/init.d/xmail') && !file_exists('/etc/rc.d/init.d/xmail')))
	{
		if (!file_exists($mailroot_dir))
			symlink($conf['nm_root'].'/MailRoot', $mailroot_dir);
		chdir($conf['nm_root'].'/MailRoot/_script/');
		system('./sysv_inst.sh');

		if (!file_exists('/etc/init.d/xmail') && !file_exists('/etc/rc.d/init.d/xmail'))
		{
			die_fix("복사에 실패하였습니다.".$crlf."아래 명령을 참고해서 수작업으로 직접 복사한뒤 설치 프로그램을 다시 실행해보십시오.".$crlf."  cd ".$conf['nm_root']."/MailRoot/_script/;./sysv_inst.sh".$crlf);
		} else
		{
			echo "복사했습니다.".$crlf;
		}	// if()

		// [2006-10-31] 레드햇 계열의 리눅스일때는 chkconfig 등록
		if (file_exists('/sbin/chkconfig'))
		{
			system('/sbin/chkconfig --add xmail');
		}	// if()
	} else
	{
		echo "이미 복사되었으므로 생략합니다.".$crlf;
	}	// if()

	title("엔메일 Agent 관련파일을 복사합니다.");
	if (!file_exists('/etc/init.d/nmailagent') && !file_exists('/etc/rc.d/init.d/nmailagent'))
	{
		chdir($conf['nm_root'].'/tools/agent/');
		system('./nmailagent_inst.sh');

		if (!file_exists('/etc/init.d/nmailagent') && !file_exists('/etc/rc.d/init.d/nmailagent'))
		{
			die_fix("복사에 실패하였습니다.".$crlf."아래 명령을 참고해서 수작업으로 직접 복사한뒤 설치 프로그램을 다시 실행해보십시오.".$crlf."  cd ".$conf['nm_root']."/tools/agent/;./nmailagent_inst.sh".$crlf);
		} else
		{
			echo "복사했습니다.".$crlf;
		}	// if()

		if (file_exists('/sbin/chkconfig'))
		{
			system('/sbin/chkconfig --add nmailagent');
		}	// if()
	} else
	{
		echo "이미 복사되었으므로 생략합니다.".$crlf;
	}

}	// if()

// 기본 도메인 지정 - server.tab
title("메일엔진에서 기본 도메인을 설정합니다.");
$file = $mailroot_dir.DS.'server.tab';
if (file_exists($file))
{
	echo "  ".$file.$crlf;
	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	$file_read = $file_read_ori;
	$file_read = str_replace('domain.com', $conf['nm_domain'], $file_read);
	if (strcmp($file_read, $file_read_ori))
	{
		$fp = fopen($file, "w");
		fwrite($fp, $file_read);
		fclose($fp);
		echo "기본 도메인을 [".$conf['nm_domain']."]으로 설정하였습니다.".$crlf;
	} else
	{
		echo "기본 도메인은 이미 설정되었습니다.".$crlf;
	}	// if()
} else
{
	die_fix("메일엔진의 설정파일이 존재하지 않습니다. => ".$file.$crlf);
}	// if()

// [2009-06-13] sendmail.sh
if ($uname != 'WIN')
{
	$file = $mailroot_dir.DS.'bin'.DS.'sendmail.sh';
	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	$file_read = $file_read_ori;
	$file_read = str_replace('DEFAULT_DOMAIN=domain.com', 'DEFAULT_DOMAIN='.$conf['nm_domain'], $file_read);
	if (strcmp($file_read, $file_read_ori))
	{
		$fp = fopen($file, "w");
		fwrite($fp, $file_read);
		fclose($fp);
	}	// if()
}	// if()

// [2009-06-13] nmail_server.php
$file = $conf['nm_root'].DS.'upload'.DS.'config'.DS.'nmail_server.php';
$fp = fopen($file, "r");
$file_read_ori = fread($fp, filesize($file));
fclose($fp);
$file_read = $file_read_ori;
$file_read = str_replace('domain.com', $conf['nm_domain'], $file_read);
if (strcmp($file_read, $file_read_ori))
{
	$fp = fopen($file, "w");
	fwrite($fp, $file_read);
	fclose($fp);
}	// if()


// 메일엔진 필터파일 경로 변경.
if ($uname == 'SUNOS')
{
	$file = $mailroot_dir.DS.'filters'.DS.'nmail.tab';
	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	$file_read = $file_read_ori;
	$file_read = preg_replace('/^\/home\//', '/export/home/', $file_read);
	if (strcmp($file_read, $file_read_ori))
	{
		$fp = fopen($file, "w");
		fwrite($fp, $file_read);
		fclose($fp);
	}	// if()

	$file = $mailroot_dir.DS.'filters'.DS.'nmail_out.tab';
	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	$file_read = $file_read_ori;
	$file_read = preg_replace('/^\/home\//', '/export/home/', $file_read);
	if (strcmp($file_read, $file_read_ori))
	{
		$fp = fopen($file, "w");
		fwrite($fp, $file_read);
		fclose($fp);
	}	// if()

    $file = $mailroot_dir.DS.'filters.pre-data.tab';
    $fp = fopen($file, "r");
    $file_read_ori = fread($fp, filesize($file));
    fclose($fp);
    $file_read = $file_read_ori;
    $file_read = preg_replace('/^\/home\//', '/export/home/', $file_read);
    if (strcmp($file_read, $file_read_ori))
    {
        $fp = fopen($file, "w");
        fwrite($fp, $file_read);
        fclose($fp);
    }	// if()

    $file = $mailroot_dir.DS.'filters.post-data.tab';
    $fp = fopen($file, "r");
    $file_read_ori = fread($fp, filesize($file));
    fclose($fp);
    $file_read = $file_read_ori;
    $file_read = preg_replace('/^\/home\//', '/export/home/', $file_read);
    if (strcmp($file_read, $file_read_ori))
    {
        $fp = fopen($file, "w");
        fwrite($fp, $file_read);
        fclose($fp);
    }	// if()
}	// if()

################################################################################


// 엔메일 동작시 사용될 Apache 웹서버의 User/Group 정보 확인
if ($uname != 'WIN')
{
	// 설정파일
	$gid = $mailroot_dir.DS.'NMAIL_APACHE_GID';
	$id = $mailroot_dir.DS.'NMAIL_APACHE_ID';
	$apache_conf = $mailroot_dir.DS.'NMAIL_APACHE_CONF';

	// [2022-12-09] Nginx 웹서버 지원
	if (isset($options['web-conf']) && isset($options['web-group']) && isset($options['web-group-id']))
	{
		title("웹메일 서비스에 사용될 Nginx/Apache 웹서버의 정보를 확인합니다.");

		echo "- Nginx/Apache 웹서버의 입력된 정보".$crlf;
		echo "  설정파일 : ".$options['web-conf'].$crlf;
		echo "  Group : ".$options['web-group'].$crlf;
		echo "  Group ID : ".$options['web-group-id'].$crlf;
		echo $crlf;
		echo "위 정보가 잘못되었을 경우 엔메일 동작시 각종 퍼미션 문제가 발생할 수 있습니다.".$crlf;

		if ( ! file_exists($gid) || ! file_exists($id) || ! file_exists($apache_conf)) {
			$confirm = scanf("위 정보가 정확합니까? [Y/n] : ", array('Y', 'N'), 2);

			echo $crlf;
			if ($confirm == 'Y') {
				$fp = fopen($gid, "w");
				fwrite($fp, $options['web-group-id']);
				fclose($fp);

				$fp = fopen($id, "w");
				fwrite($fp, $options['web-group']);
				fclose($fp);

				$fp = fopen($apache_conf, "w");
				fwrite($fp, $options['web-conf']);
				fclose($fp);

				echo "엔메일 동작시 사용될 Nginx/Apache 웹서버의 Group 정보를 저장하였습니다." . $crlf;
			} else {
				die_fix(
					"엔메일 동작시 사용될 Nginx/Apache 웹서버의 Group 정보를 저장하지 않았습니다." . $crlf . "관련정보를 확인후 다시 실행해보시기 바랍니다." . $crlf
				);
			}    // if()
		}
	} else {
		title("웹메일 서비스에 사용될 Apache 웹서버의 정보를 확인합니다.");

		// [2013-12-02] 우분투
		if (file_exists('/etc/apache2/envvars')) {
			$GLOBALS['_nmail_inst_ubuntu_apache2_envvars'] = file_get_contents('/etc/apache2/envvars');
		}    // if()

		// 중복실행체크
		if ( ! file_exists($gid) || ! file_exists($id) || ! file_exists($apache_conf)) {
			// [2009-06-15]
			echo "실행중인 Apache 웹서버의 프로세스 목록입니다." . $crlf . $crlf;
			$httpd = get_httpd_info($ps_ef);
			echo $httpd['ps'] . $crlf . $crlf;

			$scan_get_httpd_info = 'N';
			if ($httpd['conf'] != '') {
				echo "- Apache 웹서버 경로 확인 " . $crlf;
				echo "    httpd path : " . $httpd['bin'] . $crlf;
				echo "    httpd.conf path : " . $httpd['conf'] . $crlf;
				echo "    httpd start/stop script path : " . $httpd['apachectl'] . $crlf . $crlf;
				$scan_get_httpd_info = scanf("위 정보가 정확합니까? [Y/n] : ", array('Y', 'N'), 2);
			}    // if()

			if ($scan_get_httpd_info == 'Y') {
				$conf['apache_conf']      = $httpd['conf'];
				$conf['apache_conf_read'] = file_get_contents($httpd['conf']);
				preg_match("/(^|\n)+User([^\n]+)/", $conf['apache_conf_read'], $mc1);
			} else {
				// [2007-04-10] 아파치 설정파일 찾기
				echo "Apache 웹서버의 설정파일을 자동 검색중입니다..." . $crlf;
				$conf_files = array();
				// [2013-12-02] 우분투
				//$res = trim(cmd("find /etc /usr/local/apache* /usr/local/httpd* -name 'httpd.conf' -type f"));
				$res = trim(
					cmd(
						"find /etc /usr/local/apache* /usr/local/httpd* -type f -size +10 -name 'httpd.conf' -o -name 'apache2.conf' -o -name 'uid.conf'"
					)
				);
				echo $crlf;
				if (trim($res) != '') {
					$equal = false;
					while ($equal == false) {
						$ex   = explode("\n", $res);
						$_val = array();
						echo $crlf . "- Apache 웹서버의 설정파일 [" . sizeof($ex) . "]개가 검색되었습니다." . $crlf;
						for ($i = 0; $i < sizeof($ex); $i++) {
							echo "    " . ($i + 1) . ". " . $ex[$i] . $crlf;
							$_val[] = ($i + 1);
						}    // for()
						echo $crlf;
						$scan = scanf(
							"  위 목록에서 실제 사용중인 설정파일의 번호를 입력하여 주십시오. [1-" . sizeof($ex) . "] : ", $_val, 3, true, false,
							false
						);

						$conf['apache_conf'] = $ex[$scan - 1];

						$fp                       = fopen($conf['apache_conf'], "r");
						$conf['apache_conf_read'] = fread($fp, filesize($conf['apache_conf']));
						fclose($fp);
						preg_match("/(^|\n)+User([^\n]+)/", $conf['apache_conf_read'], $mc1);
						if (trim($mc1[2]) == '') {
							$scan = scanf(
								$crlf . "선택한 설정파일에 'User'옵션이 없습니다." . $crlf
								. "  참고) SUSE Linux 의 경우 /etc/apache2/uid.conf 에 해당 옵션이 존재합니다." . $crlf
								. "목록에 없는 설정파일의 경로를 직접 입력하시겠습니까? [y/N] : ", array('N', 'Y'), 2
							);
							if ($scan == 'Y') {
								$equal2 = false;
								while ($equal2 == false) {
									$conf['apache_conf'] = scanf(
										"- Apache 웹서버의 설정파일 경로를 직접 입력하여 주십시오." . $crlf . " : ", array(), 128, false
									);
									if ( ! file_exists($conf['apache_conf'])) {
										alert("존재하지 않는 파일입니다.  다시 입력하여 주십시오.");
									} else {
										$fp                       = fopen($conf['apache_conf'], "r");
										$conf['apache_conf_read'] = fread($fp, filesize($conf['apache_conf']));
										fclose($fp);
										preg_match("/(^|\n)+User([^\n]+)/", $conf['apache_conf_read'], $mc1);
										if (trim($mc1[2]) == '') {
											alert("'User' 옵션이 없으므로 올바른 설정파일이 아닙니다. 다시 입력하여 주십시오.");
										} else {
											$equal2 = true;
											$equal  = true;
										}    // if()
									}    // if()
								}    // while()
							}    // if()
						} else {
							$equal = true;
						}    // if()
					}    // while()
				} else {
					echo "Apache 웹서버의 설정파일 자동 검색에 실패하였습니다." . $crlf;
					echo "  설정파일이 /etc, /usr/local 아래에 있지 않은 경우" . $crlf . "  Apache 웹서버가 설치되어 있는지 확인하시거나 직접 입력하셔야 합니다."
						. $crlf . "" . $crlf;

					$equal = false;
					while ($equal == false) {
						$conf['apache_conf'] = scanf("- Apache 웹서버의 설정파일 경로를 직접 입력하여 주십시오." . $crlf . " : ", array(),
							128, false);
						if ( ! file_exists($conf['apache_conf'])) {
							alert("존재하지 않는 파일입니다.  다시 입력하여 주십시오.");
						} else {
							$fp                       = fopen($conf['apache_conf'], "r");
							$conf['apache_conf_read'] = fread($fp, filesize($conf['apache_conf']));
							fclose($fp);
							preg_match("/(^|\n)+User([^\n]+)/", $conf['apache_conf_read'], $mc1);
							if (trim($mc1[2]) == '') {
								alert("'User' 옵션이 없으므로 올바른 설정파일이 아닙니다. 다시 입력하여 주십시오.");
							} else {
								$equal = true;
							}    // if()
						}    // if()
					}    // while()
				}    // if()
			}    // if()

			// 실행유저
			preg_match("/(^|\n)+Group([^\n]+)/", $conf['apache_conf_read'], $mc2);

			// [2013-12-02] 우분투
			if (trim($mc1[2]) == '${APACHE_RUN_USER}') {
				if (isset($GLOBALS['_nmail_inst_ubuntu_apache2_envvars'])) {
					preg_match(
						"/(^|\n| )+APACHE_RUN_USER=([^\n]+)/", $GLOBALS['_nmail_inst_ubuntu_apache2_envvars'], $mc3
					);
					$conf['apache_user'] = $mc3[2];

					preg_match(
						"/(^|\n| )+APACHE_RUN_GROUP=([^\n]+)/", $GLOBALS['_nmail_inst_ubuntu_apache2_envvars'], $mc3
					);
					$conf['apache_group'] = $mc3[2];
				}    // if()
			} else {
				$conf['apache_user']  = trim($mc1[2]);
				$conf['apache_group'] = trim($mc2[2]);
			}    // if()
			echo $crlf;
			echo "- Apache 웹서버의 자동 검출된 정보" . $crlf;
			echo "  설정파일 : " . $conf['apache_conf'] . $crlf;
			echo "  User : " . $conf['apache_user'] . $crlf;
			echo "  Group : " . $conf['apache_group'] . $crlf;

			if ($conf['apache_group'] == '' || $conf['apache_group'] == '#-1') {
				die_fix(
					$crlf . "Apache 웹서버의 Group 정보를 가져오지 못했습니다." . $crlf . "설정파일(" . $conf['apache_conf']
					. ")에서 Group 정보가 제대로 등록되어 있는지 확인해보셔야 합니다." . $crlf
					. "만약 Group 정보가 #-1 처럼 잘못되어 있다면 User 정보와 동일하게 변경해주시면 됩니다." . $crlf . "    ex)" . $crlf
					. "        User nobody" . $crlf . "        Group #-1" . $crlf . "        =>" . $crlf
					. "        User nobody" . $crlf . "        Group nobody" . $crlf
				);
			}    // if()

			$conf['apache_group_id'] = get_uid($conf['apache_group']);
			if ( ! is_numeric($conf['apache_group_id'])) {
				echo $crlf;
				echo "[" . $conf['apache_group'] . "]의 Group ID를 자동으로 가져오지 못했습니다." . $crlf . $crlf;
				$cmd = "grep '" . $conf['apache_group'] . "' /etc/group";
				echo "시스템 Group 정보 확인) " . $cmd . $crlf;
				$res = cmd($cmd);
				echo $res . $crlf . $crlf;
				$conf['apache_group_id'] = scanf(
					"위 Group 정보를 참고하여 [" . $conf['apache_group'] . "]의 Group ID를 직접 입력하여 주십시오.  ex) 48, 99, ... : ",
					array(), 5
				);
			}    // if()

			echo "  Group ID : " . $conf['apache_group_id'] . $crlf;
			echo $crlf;
			echo "위 정보가 잘못되었을 경우 엔메일 동작시 각종 퍼미션 문제가 발생할 수 있습니다." . $crlf;

			$confirm = scanf("위 정보가 정확합니까? [Y/n] : ", array('Y', 'N'), 2);

			echo $crlf;
			if ($confirm == 'Y') {
				$fp = fopen($gid, "w");
				fwrite($fp, $conf['apache_group_id']);
				fclose($fp);

				$fp = fopen($id, "w");
				fwrite($fp, $conf['apache_group']);
				fclose($fp);

				$fp = fopen($apache_conf, "w");
				fwrite($fp, $conf['apache_conf']);
				fclose($fp);

				echo "엔메일 동작시 사용될 Apache 웹서버의 Group 정보를 저장하였습니다." . $crlf;
			} else {
				die_fix("엔메일 동작시 사용될 Apache 웹서버의 Group 정보를 저장하지 않았습니다." . $crlf . "관련정보를 확인후 다시 실행해보시기 바랍니다." . $crlf);
			}    // if()
		} else {
			echo "이미 확인되어 저장되었으므로 생략합니다." . $crlf;
		}    // if()
	}

	// 퍼미션 조절
	title("복사된 파일들의 퍼미션을 조정합니다.");
	system("chown -R ".$conf['nm_user']." ".$conf['nm_root']."/*");
	chdir($conf['nm_root'].'/tools');
	system("./perm_change.sh");

}	// if()

################################################################################

// PHP mailparse 모듈 설치
title("PHP mailparse 모듈을 설치합니다.");

if ($uname == 'WIN')
{
	if (!file_exists(get_ext_dir().''.DS.$mailparse_lib))
	{
		// [2006-11-14] RWAPM에서 php_mbstring.dll 이 있어야 실행되는 문제 보완.
		if (!file_exists(get_ext_dir().''.DS.'php_mbstring.dll'))
		{
			copy($conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'php_mbstring.dll', get_ext_dir().''.DS.'php_mbstring.dll');
		}	// if()
	   copy($conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.$mailparse_lib, get_ext_dir().''.DS.$mailparse_lib);

	   echo "확장모듈 디렉토리에 복사하였습니다.".$crlf;
	} else
	{
		echo "이미 설치되었으므로 생략합니다.".$crlf;
	}	// if()
} else
{
	if (!file_exists(get_ext_dir().''.DS.$mailparse_lib))
	{
		if (!is_dir(get_ext_dir()))
		{
			system("mkdir -p ".get_ext_dir());
			echo "PHP 확장모듈 디렉토리가 존재하지 않아 생성하였습니다.".$crlf;
		}	// if()


		echo "PHP 확장모듈이 존재하지 않아 설치 패키지에서 알맞은 버젼을 찾고 있습니다...".$crlf;
		$_tmp_dir = get_ext_dir().''.DS.'_mailparseByNmail';
		if (!file_exists($_tmp_dir))
		{
			// [2007-11-10] 재설치 과정에서 디렉토리가 바뀌었을 경우 기존 링크를 제거하도록 함.
			@unlink($_tmp_dir);
			symlink($conf['nm_root'].''.DS.'tools'.DS.'mailparse', $_tmp_dir);
		}	// if()
		// [2009-07-06] PHP 5.2.9에서 dl() 함수로 mailparse 모듈을 테스트시 호환성 문제 해결
		chdir($_tmp_dir);

		$ok_file = '';
		$case_ok = 0;

		$_ex = explode('.', phpversion());
		$_php_ver2 = 'PHP'.$_ex[0].'.'.$_ex[1];

		// [2012-10-23] OS, PHP 버전이 일치하는 so 파일을 가장 먼저 검사
		$_os_version = '';
		if (file_exists('/etc/redhat-release'))
		{
			$_os_name = file_get_contents('/etc/redhat-release');
			// [2015-06] 인스톨러 수정
			if (preg_match('/CentOS release ([0-9.]+)/', $_os_name, $mc))
			{
				$_os_version = $mc[1];
			} else if (preg_match('/CentOS Linux release ([0-9.]+)/', $_os_name, $mc))
			{
				$_os_version = $mc[1];
			}	// if()
		}	// if()


		$_mailparse_list = array();
		if ($handle = opendir($conf['nm_root'].''.DS.'tools'.DS.'mailparse')) {
		   while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != ".." && strpos($file, '.so') !== false && strpos($file, $_php_ver2) !== false) {
					$_mailparse_list[] = $file;
				}
			}
			closedir($handle);
		}

		// [2012-10-23] OS
		$_mailparse_first_check = '';
		foreach ($_mailparse_list as $key=>$val)
		{
			$_current_centos_file = 'CentOS'.$_os_version;
			if ($uname_machine == 'x86_64')
				$_current_centos_file .= '_64bit';
			if (strpos($val, $_current_centos_file) !== false)
			{
				if (strpos($val, 'PHP'.phpversion()) !== false)
				{
					$_mailparse_first_check = $val;
					break;
				}	// if()
			}	// if()
		}	// foreach()

		if ($_mailparse_first_check != '')
		{
			$_mailparse_list[sizeof($_mailparse_list)] = $_mailparse_list[0];
			$_mailparse_list[0] = $_mailparse_first_check;
		}	// if()


		// 1차 시도 - php.ini 를 새로 만들어 테스트.
		foreach ($_mailparse_list as $key=>$file)
		{
			// php_tmp.ini
			$php_ini_ori = get_php_ini_path();
			$php_ini_tmp = $conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'php_tmp.ini';
			copy($php_ini_ori, $php_ini_tmp);

			$php_ini_tmp_add = '';
			if (file_exists(PHP_CONFIG_FILE_SCAN_DIR.'/mbstring.ini'))
				$php_ini_tmp_add = file_get_contents(PHP_CONFIG_FILE_SCAN_DIR.'/mbstring.ini').$crlf;
			// [2016-12-29] remi repo php설치시 ini파일명 문제
			else if (file_exists(PHP_CONFIG_FILE_SCAN_DIR.'/20-mbstring.ini'))
				$php_ini_tmp_add = file_get_contents(PHP_CONFIG_FILE_SCAN_DIR.'/20-mbstring.ini').$crlf;
			$php_ini_tmp_add .= 'extension='.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.$file.$crlf;

			$fp = fopen($php_ini_tmp, "a");
			fwrite($fp, $php_ini_tmp_add);
			fclose($fp);

			$cmd = '/usr/bin/php -c '.$php_ini_tmp.' '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'mailparse_test_php53.php';
			echo $cmd."\n";
			$res = cmd($cmd);
			if (strpos($res,'MAILPARSE_OK') !== false)
			{
			   copy($_tmp_dir.DS.''.$file, get_ext_dir().''.DS.$mailparse_lib);
			   $ok_file = $file;
			   break;
			} else
			{
			   echo ".";
			}	// if()
		}	// foreach()


		// 2차 시도 - 기존 방식
		if (!$ok_file)
		{
			foreach ($_mailparse_list as $key=>$file)
			{
				$res = '';

				if ($case_ok == 0 || $case_ok == 1)
				{
					$cmd = '/usr/bin/php -c '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'php.ini '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'mailparse_test.php _mailparseByNmail'.DIRECTORY_SEPARATOR.$file;
					$res = cmd($cmd);
					$case = 1;
				}	// if()

				if (($case_ok == 0 || $case_ok == 2) && strpos($res,'MAILPARSE_OK') === false)
				{
					$cmd = '/usr/bin/php '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'mailparse_test.php _mailparseByNmail'.DIRECTORY_SEPARATOR.$file;
					ob_start();
					system($cmd);
					$res = ob_get_contents();
					ob_end_clean();
					$case = 2;
				}	// if()

				if (($case_ok == 0 || $case_ok == 3) && strpos($res,'MAILPARSE_OK') === false)
				{
					$cmd = '/usr/bin/php -c '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'php.ini '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'mailparse_test.php '.$file;
					ob_start();
					system($cmd);
					$res = ob_get_contents();
					ob_end_clean();
					$case = 3;
				}	// if()

				if (($case_ok == 0 || $case_ok == 4) && strpos($res,'MAILPARSE_OK') === false)
				{
					$cmd = '/usr/bin/php -c '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'php2.ini '.$conf['nm_root'].''.DS.'tools'.DS.'mailparse'.DS.'mailparse_test.php '.$file;
					ob_start();
					system($cmd);
					$res = ob_get_contents();
					ob_end_clean();
					$case = 4;
				}	// if()

			   if (strpos($res,'MAILPARSE_OK') !== false)
			   {
				   if ($case_ok == 0)
					   $case_ok = $case;
				   copy($_tmp_dir.DS.''.$file, get_ext_dir().''.DS.$mailparse_lib);
				   $ok_file = $file;
				   break;
			   } else
			   {
				   echo ".";
			   }	// if()
			}	// foreach()
		}	// if()

		if ($ok_file)
		{
			echo "알맞은 버젼을 찾아서 확장모듈 디렉토리에 복사하였습니다.  => ".$ok_file.$crlf;
		} else
		{
			if (!file_exists(get_ext_dir().''.DS.$mailparse_lib))
			{
				echo "pear / pecl 을 통한 설치를 시도합니다.".$crlf;
				system("pecl install mailparse");
				system("pear install mailparse");
			}	// if()

			die_fix("PHP mailparse 모듈을 자동으로 설치할 수 없습니다.".$crlf."일부 OS에서는 설치메뉴얼을 참고해서 해당 모듈을 따로 설치해야 합니다.".$crlf."만약 설치가 안된다면 다음처럼 OS, PHP 버젼과 함께 패스코리아넷 ( http://passkorea.net ) 으로 문의주시기 바랍니다.".$crlf."  cat /etc/*-release".$crlf."  php -v".$crlf."".$crlf."참고)".$crlf."  php.ini 에서 [extension_dir=./]처럼 옵션이 지정되어 있었다면 설치 프로그램을 다시 실행해보시기 바랍니다.".$crlf."  해당 옵션은 설치 프로그램에서 자동으로 변경되는데 다시 실행해야 옵션이 적용되기 때문입니다.".$crlf);
		}	// if()

	} else
	{
		echo "이미 설치되었으므로 생략합니다.".$crlf;
	}	// if()
}	// if()

################################################################################

// PHP ioncube 모듈 설치
title("PHP ioncube 모듈을 설치합니다.");
$ioncube = get_ioncube_name();

// [2013-08-12] Windows TS 구분
if (get_php_ini_thread_safety())
{
	$ioncube_ts = $ioncube[1];
} else
{
	$ioncube_ts = $ioncube[0];
}	// if()

if (!file_exists(get_ext_dir().''.DS.''.$ioncube_ts))
{
	if ($uname == 'WIN')
	{
		if (!file_exists($conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.''.$ioncube_ts))
		{
			die_fix("PHP ioncube 모듈을 자동으로 설치할 수 없습니다.".$crlf."아래 사이트에서 직접 다운받아 PHP extension directory 로 복사후 설치를 시작해야 합니다.".$crlf."  url) http://www.ioncube.com/loaders.php".$crlf."  PHP extension directory) ".get_ext_dir().$crlf);
		} else
		{
			copy($conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.''.$ioncube_ts, get_ext_dir().''.DS.''.$ioncube_ts);
			echo "cp ".$conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.''.$ioncube_ts." ".get_ext_dir().''.DS.''.$ioncube_ts.$crlf;
			echo "설치되었습니다.".$crlf;
		}	// if()
	} else
	{
		if ($uname == 'SUNOS')
		{
			if (php_uname('m') == 'sun4u')
			{
				$ioncube_dir = 'sun_sparc';
			} else
			{
				$ioncube_dir = 'sun_x86';
			}	// if()
		} else
		{
			if (php_uname('m') == 'x86_64')
			{
				$ioncube_dir = 'lin_x86-64';
			} else
			{
				$ioncube_dir = 'lin_x86';
			}	// if()
		}	// if()

		if (!file_exists($conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.$ioncube_dir.DS.$ioncube_ts))
		{
			die_fix("PHP ioncube 모듈을 자동으로 설치할 수 없습니다.".$crlf."아래 사이트에서 직접 다운받아 PHP extension directory 로 복사후 설치를 시작해야 합니다.".$crlf."  url) http://www.ioncube.com/loaders.php".$crlf."  ex)".$crlf."    wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_fre_6_x86.tar.gz".$crlf."    gunzip < ioncube_loaders_fre_6_x86.tar.gz | tar -xf -".$crlf."    cp ioncube/*.so ".get_ext_dir()."/".$crlf);
		} else
		{
			copy($conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.$ioncube_dir.DS.$ioncube_ts, get_ext_dir().''.DS.''.$ioncube_ts);
			echo "cp ".$conf['nm_root'].''.DS.'tools'.DS.'loader'.DS.$ioncube_dir.DS.$ioncube_ts." ".get_ext_dir().''.DS.''.$ioncube_ts.$crlf;
			echo "설치되었습니다.".$crlf;
		}	// if()
	}	// if()
} else
{
	echo "이미 설치되었으므로 생략합니다.".$crlf;
}	// if()

scanf($crlf."[Enter]를 누르시면 설치작업이 계속 진행됩니다.".$crlf, array(), 5, false, true);


################################################################################


// 메일엔진 바이너리 확인
if ($uname != 'WIN')
{
	title("메일엔진 실행파일을 확인합니다.");

	if ($uname == 'SUNOS')
	{
		putenv('LD_LIBRARY_PATH=/usr/local/lib.old:'.getenv('LD_LIBRARY_PATH'));
	}	// if()

	if (file_exists('/usr/bin/ldd'))
	{
		$ldd_errors = array(
			'not found',
			'undefined symbol',
			'error while loading shared libraries',
			'cannot open shared object file',
			'not a dynamic executable',
			'bad ELF interpreter',
			);
		$ldd_ischeck = true;
	} else
	{
		$ldd_ischeck = false;
	}	// if()
	$tmpf = '.nmail_install_tmp_xmail_ldd_result_asdfkljafaasad';

	$test = cmd($mailroot_dir.DS.'bin'.DS.'XMCrypt test', true);
	$ldd_iserror = false;
	if ($ldd_ischeck)
	{
		cmd('/usr/bin/ldd -r '.$mailroot_dir.DS.'bin'.DS.'XMail &> '.$tmpf);
		$test2 = implode($crlf, file($tmpf));
		for ($i=0; $i<sizeof($ldd_errors); $i++)
		{
			if (strpos($test2, $ldd_errors[$i]) !== false)
			{
				$ldd_iserror = true;
				break;
			}	// if()
		}	// for()
	}	// if()
	if ($test != '11001611' || $ldd_iserror != false)
	{
		$ok_file = '';
		$ms_dir = $conf['nm_root'].''.DS.'tools'.DS.'mailserver';
		if ($handle = opendir($ms_dir)) {
			while (false !== ($file = readdir($handle))) {
				if ($file != "." && $file != ".." && strpos($file, 'bin_') === 0 && is_dir($ms_dir.DS.$file))
				{
					#echo "$file".$crlf;
					$test = cmd($conf['nm_root'].'/tools/mailserver/'.$file.'/XMCrypt test', true);
					$ldd_iserror = false;
					if ($ldd_ischeck)
					{
						system('/usr/bin/ldd -r '.$conf['nm_root'].'/tools/mailserver/'.$file.'/XMail &> '.$tmpf);
						$test2 = implode($crlf, file($tmpf));
						for ($i=0; $i<sizeof($ldd_errors); $i++)
						{
							if (strpos($test2, $ldd_errors[$i]) !== false)
							{
								$ldd_iserror = true;
								break;
							}	// if()
						}	// for()
					}	// if()
					if ($test == '11001611' && $ldd_iserror == false)
					{
						$ok_file = $file;
						break;
					} else
					{
						echo ".";
					}	// if()
				}	// if()
		   }
		   closedir($handle);
		} else
		{
			echo "다음 디렉토리가 존재 하지 않아 메일엔진 실행파일을 확인할 수 없습니다.".$crlf."  =>".$ms_dir;
		}	// if()

		if ($ok_file)
		{
			echo $crlf."알맞은 실행파일로 교체합니다.  => ".$ok_file.$crlf;
			system('/etc/init.d/xmail stop');
			system('/bin/cp '.$conf['nm_root'].'/tools/mailserver/'.$ok_file.'/* /var/MailRoot/bin/');
		} else
		{
			die_fix("메일엔진 실행파일을 자동으로 설치할 수 없습니다.".$crlf."일부 OS에서는 설치메뉴얼을 참고해서 메일엔진의 소스를".$crlf."직접 컴파일해서 사용하셔야 합니다.".$crlf);
		}	// if()
	} else
	{
		echo "정상적으로 실행됩니다.".$crlf;
	}	// if()

	if (file_exists($tmpf))
	{
		unlink($tmpf);
	}	// if()
}	// if()


################################################################################


// 메일엔진 관리자 비밀번호 설정.
title("메일엔진 관리자 비밀번호를 설정합니다.");

// [2013-08-28] Oracle 은 MySQL 처럼 root 권한으로 nmail2 계정을 생성하지 않고, 이미 만들어진 계정 사용하므로 예외처리
$xm_ctrl_p = $conf['nm_pass'];
if ($G_SYS[XM_CTRL_P] != 'YourPasssword')
	$xm_ctrl_p = $G_SYS[XM_CTRL_P];

$xmc = cmd($mailroot_dir.DS.'bin'.DS.'XMCrypt '.escapeshellarg_os($xm_ctrl_p), true);
$file = $mailroot_dir.DS.'ctrlaccounts.tab';
echo "  ".$file.$crlf;
$fp = fopen($file, "r");
$file_read_ori = fread($fp, filesize($file));
fclose($fp);
$file_read = $file_read_ori;
$file_read = str_replace('YourPasssword', $xmc, $file_read);
if (strcmp($file_read, $file_read_ori))
{
	$fp = fopen($file, "w");
	fwrite($fp, $file_read);
	fclose($fp);
	echo "메일엔진 관리자 비밀번호를 설정하였습니다.".$crlf;
} else
{
	echo "메일엔진 관리자 비밀번호는 이미 설정되었습니다.".$crlf;
}	// if()

// 메일엔진 시작
title("메일엔진을 시작합니다.");
if ($uname == 'WIN')
{
	// [2006-10-20] nmail_dir_set.php 에서 먼저 처리됨.
	/*
	# 레지스트리 등록
	echo "메일엔진 환경설정을 레지스트리에 추가해야 합니다.".$crlf."확인창이 나오면 [예]를 눌러 주십시오.".$crlf;
	system($conf['nm_root'].'/tools/install_config.reg');
	# 서비스에서 자동시작되도록 등록
	system($home_dir.'\MailRoot/bin/XMail --install-auto');
	*/
	$xmail_upgrade_txt = 'xmail-1.27_20160407_upgrade_windows.txt';
} else
{
	# CentOS7일 경우 systemctl 명령으로 서비스 시작
	if(file_exists('/usr/bin/systemctl')){
		system('/usr/bin/systemctl start xmail.service');
	} else
	{
		system('/etc/init.d/xmail start');
	}
	sleep(1);
	$xmail_upgrade_txt = 'xmail-1.27_20160407_upgrade.txt';
}	// if()


// [2009-06-16] 메일서버 동작여부 확인
$fp = fsockopen('127.0.0.1', '6017', $errno, $err_msg, 10);
if (!$fp) {
	die_fix("메일엔진이 시작되지 않았습니다.".$crlf."  ".$errno." - ".$err_msg.$crlf."  메일엔진 재설치 방법)".$crlf."    ".$conf['nm_root']."/tools/mailserver/".$xmail_upgrade_txt.$crlf);
}
$ret = explode(' ', fgets($fp, 1024));
fclose($fp);
if ($ret[0] == '-')
{
	die_fix("메일엔진에 알 수 없는 문제가 있습니다.".$crlf."  메일엔진 재설치 방법)".$crlf."    ".$conf['nm_root']."/tools/mailserver/".$xmail_upgrade_txt.$crlf);
}	// if()


// 백업스크립트 디비 비밀번호 설정.
if ($conf['db'] == 'MYSQL')
{
	if ($uname != 'WIN')
	{
		title("백업스크립트의 디비 계정 비밀번호를 설정합니다.");
		$file = $conf['nm_root'].'/_backup/backup.sh';
		echo "  ".$file.$crlf;
		$fp = fopen($file, "r");
		$file_read_ori = fread($fp, filesize($file));
		fclose($fp);
		$file_read = $file_read_ori;
		$file_read = str_replace('YourPasssword', escapeshellarg_os($conf['nm_pass']), $file_read);

		// [2007-04-09] MySQL 4.1 이상일때의 한글 설정.
			$mysql_version = mysqli_fetch_row(mysqli_query($link, "SELECT VERSION()"));
			if (version_compare($mysql_version[0], '4.1.0', '>='))
			{
				$file_read = str_replace("\nMYSQLDUMP=mysqldump\n", "\nMYSQLDUMP=\"mysqldump --default-character-set=".$conf['db_charset']."\"\n", $file_read);
			}	// if()

		if (strcmp($file_read, $file_read_ori))
		{
			$fp = fopen($file, "w");
			fwrite($fp, $file_read);
			fclose($fp);
			echo "백업스크립트의 디비 계정 비밀번호를 설정하였습니다.".$crlf;
		} else
		{
			echo "백업스크립트의 디비 계정 비밀번호는 이미 설정되었습니다.".$crlf;
		}	// if()
	}	// if()
}	// if()


################################################################################



// php.ini
title("PHP의 설정파일(php.ini)에 엔메일 관련 설정을 추가합니다.");

function php_ini_set($file, $mailparse_isset)
{
	global $crlf;
	global $mailparse_lib, $uname, $conf;

	// [2006-10-20] php.ini 가 없을 경우의 에러.
	if (!is_file($file))
	{
		die ("PHP의 설정파일인 php.ini 파일을 찾지 못했습니다.".$crlf."  php.ini path) ".$file.$crlf."PHP 설치 경로 등에서 해당 파일을 찾아 복사해서 넣으신 후 설치를 재시도하시기 바랍니다.".$crlf);
	}	// if()

	$fp = fopen($file, "r");
	$file_read_ori = fread($fp, filesize($file));
	fclose($fp);
	$file_read = $file_read_ori;


	// 엔메일 설정이 추가되지 않았을때만 입력받음.
	if (strpos($file_read, 'Nmail Auto Config - Begin') === false && strpos($file_read, 'nWmail Auto Config') === false)
	{
		// [2013-07-29] 업로드 용량 입력
		$equal = false;
		while ($equal == false)
		{
			$conf['upload_max_filesize'] = scanf("- 대용량 첨부, 웹하드 업로드시 허용할 최대 업로드 용량을 입력하여 주십시오.".$crlf."    (MB단위, 100MB는 100 입력, 2GB는 2047 입력)".$crlf." : ", array(), 10, false);
			if (!is_numeric($conf['upload_max_filesize']))
			{
				alert("최대 업로드 용량은 숫자로만 입력하여 주십시오.");
			} else if ($conf['upload_max_filesize'] < 10)
			{
				alert("최대 업로드 용량은 10 이상으로 입력하여 주십시오.");
			} else if ($conf['upload_max_filesize'] > 2047)
			{
				alert("최대 업로드 용량은 2047 이하로 입력하여 주십시오.");
			} else
			{
				$equal = true;

				// [2013-07-30]
				$config_file = $conf['nm_root'].'/upload/config/nmail_server.php';

				$fp = fopen($config_file, "r");
				$config_file_read = fread($fp, filesize($config_file));
				fclose($fp);

				$config_file_read = str_replace('$G_SYS[UPLOAD_MAIL_BIGFILE_MAX_SIZE] = 104857600;', '$G_SYS[UPLOAD_MAIL_BIGFILE_MAX_SIZE] = '.($conf['upload_max_filesize']*1048576).';', $config_file_read);
				$config_file_read = str_replace('$G_SYS[UPLOAD_WEBHARD_MAX_SIZE] = 104857600;', '$G_SYS[UPLOAD_WEBHARD_MAX_SIZE] = '.($conf['upload_max_filesize']*1048576).';', $config_file_read);

				$fp = fopen($config_file, "w");
				fwrite($fp, $config_file_read);
				fclose($fp);
			}	// if()
		}	// while()
	}	// if()


	// mailparse 로드 여부.  일부 RPM의 경우 /etc/php.d 에 선언되어 있으므로 중복 선언 불필요.
	/*
	$skip_mailparse = '';
	if (extension_loaded("mailparse"))
	{
		$skip_mailparse = ';';
	}	// if()
	*/
	$skip_mailparse = ($mailparse_isset) ? ';' : '';

	// [Zend] 가 설치되었을땐 해당 항목 위에 설치해야 함.
	$ioncube = get_ioncube_name();
    $zend_extension = "";

	$skip_ioncube = (extension_loaded('ionCube Loader')) ? ';' : '';

	if ($uname != 'WIN')
	{
		if (get_php_ini_thread_safety())
		{
			if (version_compare(phpversion(), '5.3.0', '>='))
			{
				$zend_extension .= $skip_ioncube.'zend_extension="'.get_ext_dir().''.DS.''.$ioncube[1].'"';
			} else
			{
				$zend_extension .= $skip_ioncube.'zend_extension_ts="'.get_ext_dir().''.DS.''.$ioncube[1].'"';
			}	// if()
		} else
		{
			$zend_extension = $skip_ioncube.'zend_extension="'.get_ext_dir().''.DS.''.$ioncube[0].'"';
		}	// if()
	} else		// [2013-07-29] Linux, Windowws 설치 방법 동일함.
	{
		if (get_php_ini_thread_safety())
		{
			if (version_compare(phpversion(), '5.3.0', '>='))
			{
				$zend_extension .= $skip_ioncube.'zend_extension="'.get_ext_dir().''.DS.''.$ioncube[1].'"';
			} else
			{
				$zend_extension .= $skip_ioncube.'zend_extension_ts="'.get_ext_dir().''.DS.''.$ioncube[1].'"';
			}	// if()
		} else
		{
			$zend_extension = $skip_ioncube.'zend_extension="'.get_ext_dir().''.DS.''.$ioncube[0].'"';
		}	// if()
	}	// if()

	// [2012-10-05] PHP 5.3
	// [2015-06] 인스톨러 수정
	if (version_compare(phpversion(), '5.4.0', '>=')){
		$_ini_error_reporting = '';
		$_ini_allow_call_time_pass_reference = 'allow_call_time_pass_reference = Off';
		$ini_df = trim(ini_get('date.timezone'));
		if (!$ini_df)
			$_ini_error_reporting .= 'date.timezone = "Asia/Seoul"'.$crlf;
		$_ini_error_reporting .= 'error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_DEPRECATED & ~E_STRICT';
	}else if (version_compare(phpversion(), '5.3.0', '>='))
	{
		$_ini_error_reporting = '';
		$_ini_allow_call_time_pass_reference = 'allow_call_time_pass_reference = On';
		$ini_df = trim(ini_get('date.timezone'));
		if (!$ini_df)
			$_ini_error_reporting .= 'date.timezone = "Asia/Seoul"'.$crlf;
		$_ini_error_reporting .= 'error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_DEPRECATED';
	} else
	{
		$_ini_error_reporting = 'error_reporting = E_ALL & ~E_NOTICE';
		$_ini_allow_call_time_pass_reference = 'allow_call_time_pass_reference = On';
	}	// if()

	// [2013-07-29] 업로드 용량 입력
	if (is_numeric($conf['upload_max_filesize']) && $conf['upload_max_filesize'] >= 10 && $conf['upload_max_filesize'] <= 2047)
	{
		$_upload_max_filesize = $conf['upload_max_filesize'];
		$_post_max_size = $conf['upload_max_filesize'] + 30;
		if ($_post_max_size > 2047)
			$_post_max_size = 2047;
	} else
	{
		$_upload_max_filesize = '100';
		$_post_max_size = '130';
	}	// if()


// [2013-07-26] register_globals, magic_quotes_gpc 제거.
$php_ini_add = $crlf.';---------------------------------'.$crlf.
';Nmail Auto Config - Begin'.$crlf.
$skip_mailparse.'extension_dir="'.get_ext_dir().'"'.$crlf.
$skip_mailparse.'extension='.$mailparse_lib.$crlf.
';donwload - http://www.ioncube.com/loaders.php'.$crlf.
$zend_extension.$crlf.
$_ini_allow_call_time_pass_reference.$crlf.
';Attachment Size'.$crlf.
'upload_tmp_dir = "'.$conf['nm_root'].DS.'upload'.DS.'phptemp"'.$crlf.
'upload_max_filesize = '.$_upload_max_filesize.'M'.$crlf.
'post_max_size = '.$_post_max_size.'M'.$crlf.
'memory_limit = 384M'.$crlf.
'max_input_time = 3600'.$crlf.
'max_execution_time = 3600'.$crlf.
';General'.$crlf.
$_ini_error_reporting.$crlf.
'display_errors = On'.$crlf.
'log_errors = On'.$crlf.
'display_startup_errors = On'.$crlf.
'error_log = syslog'.$crlf.
';Nmail Auto Config - End'.$crlf.
';---------------------------------'.$crlf.
$crlf;

	// 엔메일 설정이 추가되지 않았을때만 추가함.
	if (strpos($file_read, 'Nmail Auto Config - Begin') === false && strpos($file_read, 'nWmail Auto Config') === false)
	{
		$file_read = preg_replace('/([\n\r]+\[Zend\][\n\r\t ]+)/i', $php_ini_add."\\1", $file_read);
		if (!strcmp($file_read, $file_read_ori))
		{
			// [2009-06-13] 새로추가된 설정은 혼동되지 않도록 주석처리함.
			$env = array('extension_dir', 'allow_call_time_pass_reference', 'upload_max_filesize', 'post_max_size', 'memory_limit', 'max_input_time', 'max_execution_time', 'error_reporting', 'display_errors', 'log_errors', 'display_startup_errors', 'error_log');
			foreach ($env as $key=>$val)
			{
				$file_read = preg_replace("/([\n\r]+)[\t ]*(".$val.")([\t =]+)/i", "\\1; Skip by Nmail Auto Config".$crlf.";\\2\\3", $file_read);
			}	// foreach()

			$file_read .= $php_ini_add;
		}	// if()
	}	// if()

	if (strcmp($file_read, $file_read_ori))
	{
		copy($file, $file.'.backupByNmail_'.date('Ymd_His'));
		$fp = fopen($file, "w");
		fwrite($fp, $file_read);
		fclose($fp);
		echo "$file 파일에 다음처럼 설정을 추가해두었습니다.".$crlf;
		echo $php_ini_add;

		// [2009-06-13] 추가한 기록남김
		$fp = fopen($conf['nm_root'].'/upload/config/php_ini_add.'.date('Ymd_His'), "w");
		fwrite($fp, $data);
		fclose($fp);
	} else
	{
		echo "$file 파일에 이미 엔메일 관련 설정이 추가되어 있습니다.".$crlf;

		$sp1 = strrpos($file_read, ';Nmail Auto Config - Begin');
		$sp2 = strrpos($file_read, ';Nmail Auto Config - End');

		if ($sp1 > 0 && $sp2 > 0)
		{
			echo $crlf.substr($file_read, $sp1, $sp2 - $sp1 + 24).$crlf;
		} else
		{
			echo $php_ini_add;
		}	// if()
	}	// if()
}	// function()

function php_mailparse_ini_set($ini_dir)
{
	global $crlf;
	global $mailparse_lib;

	// [2006-11-13] windows PHP, 사용자 직접 추가 등 mailparse 모듈이 이미 설치된 경우.
	if (extension_loaded('mailparse'))
		return true;

	if ($ini_dir != '' && is_dir($ini_dir))
	{
		// [2016-12-29] remi repo php설치시 ini파일명 문제
		#if (file_exists($ini_dir.'/mbstring.ini'))
		if (file_exists($ini_dir.'/mbstring.ini') || file_exists($ini_dir.'/20-mbstring.ini'))
		{
			if (!file_exists($ini_dir.'/z-mailparse.ini'))
			{
				$data = "; Enable mailparse extension module".$crlf."extension=".$mailparse_lib.$crlf;
				$fp = fopen($ini_dir.'/z-mailparse.ini', "w");
				fwrite($fp, $data);
				fclose($fp);
				echo "[".$ini_dir."/z-mailparse.ini] 설정파일을 생성했습니다.".$crlf;
			} else
			{
				echo "[".$ini_dir."/z-mailparse.ini] 설정파일은 이미 생성되었습니다.".$crlf;
			}	// if()
			return true;
		}	// if()
	}	// if()
	return false;
}	// function()

$file = get_php_ini_path();
$ini_dir = PHP_CONFIG_FILE_SCAN_DIR;		// [2012-10-23] Scan this dir for additional .ini files

$mailparse_isset = php_mailparse_ini_set($ini_dir);
if (preg_match('/\/cli$/', $ini_dir))
{
	$ini_dir2 = preg_replace('/\/cli$/', '/apache', $ini_dir);
	if (is_dir($ini_dir2))
	{
		$mailparse_isset2 = php_mailparse_ini_set($ini_dir2);
	}	// if()
}	// if()

php_ini_set($file, $mailparse_isset);
// AnNyung Linux - PHP4
if (strpos($file, '/cli/php.ini') !== false)
{
	/* [2007-04-10] suse linux
		/etc/php5/cli/php.ini
		/etc/php5/apache2/php.ini
	*/
	$apache_php_ini = array(
			'/php.ini',
			'/apache/php.ini',
			'/apache2/php.ini',
			'/httpd/php.ini',
			'/httpd2/php.ini'
			);
	for ($i=0; $i<sizeof($apache_php_ini); $i++)
	{
		$file2 = str_replace('/cli/php.ini', $apache_php_ini[$i], $file);
		if (file_exists($file2))
		{
			php_ini_set($file2, $mailparse_isset2);
			break;
		}	// if()
	}	// for()
} else if (basename($file) == 'php-cli.ini')		// AnNyung Linux - PHP5
{
	$file2 = str_replace('php-cli.ini', 'php.ini', $file);
	if (file_exists($file2))
		php_ini_set($file2, $mailparse_isset2);
}	// if()


// [2006-10-20] 확장모듈 테스트.
chdir(get_ext_dir());


// [2012-10-05] PHP 5.3
if (version_compare(phpversion(), '5.3.0', '>='))
{
	if ($uname != 'WIN')
	{
		$die_msg_add = "      /usr/bin/php ".$_SERVER['argv'][0].$crlf;
	} else
	{
		$die_msg_add = "      nmail_install.bat".$crlf;
	}	// if()

	if (!extension_loaded('mailparse'))
	{
		if (php_module_load_check($uname, 'mailparse'))
		{
			die_fix($crlf.$crlf."PHP의 mailparse 확장모듈 로딩을 위해, 엔메일 설치프로그램을 다시 실행해 주시면 됩니다.".$crlf.$crlf.$die_msg_add, false);
		} else
		{
			die_fix("현재 설치된 PHP의 mailparse 확장모듈을 로딩할 수 없습니다.".$crlf."설치문서를 참고해서 해당 모듈을 다시 설치하시기 바랍니다.".$crlf."그래도 안된다면 다음처럼 OS, PHP 버젼과 함께 패스코리아넷 ( http://passkorea.net ) 으로 문의주시기 바랍니다.".$crlf."  cat /etc/*-release".$crlf."  php -v".$crlf);
		}	// if()
	}	// if()

	if (!extension_loaded('ionCube Loader'))
	{
		if (php_module_load_check($uname, 'ionCube Loader'))
		{
			die_fix($crlf.$crlf."PHP의 ionCube Loader 확장모듈 로딩을 위해, 엔메일 설치프로그램을 다시 실행해 주시면 됩니다.".$crlf.$crlf.$die_msg_add, false);
		} else
		{
			die_fix("현재 설치된 PHP의 ionCube Loader 확장모듈을 로딩할 수 없습니다.".$crlf."Linux (x86/32bit) 환경이 아닐 경우 아래 사이트에서 직접 다운받아 PHP extension directory 로 복사후 설치를 시작해야 합니다.".$crlf."  url) http://www.ioncube.com/loaders.php".$crlf."  ex)".$crlf."  wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz".$crlf."  gunzip < ioncube_loaders_lin_x86-64.tar.gz | tar -xf -".$crlf."  cp ioncube/*.so ".get_ext_dir()."/".$crlf);
		}	// if()
	}	// if()

} else
{
	if (!extension_loaded('mailparse'))
	{
		if (!dl($mailparse_lib))
		{
			die_fix("현재 설치된 PHP의 mailparse 확장모듈을 로딩할 수 없습니다.".$crlf."설치문서를 참고해서 해당 모듈을 다시 설치하시기 바랍니다.".$crlf."이미 설치된 상태라면 엔메일 설치 프로그램을 다시 실행하면 정상적으로 넘어가는 경우도 있습니다.".$crlf."그래도 안된다면 다음처럼 OS, PHP 버젼과 함께 패스코리아넷 ( http://passkorea.net ) 으로 문의주시기 바랍니다.".$crlf."  cat /etc/*-release".$crlf."  php -v".$crlf);
		} else
		{
			echo "PHP의 mailparse 확장모듈이 정상적으로 설치되었습니다.".$crlf;
		}	// if()
	}	// if()

	if (!extension_loaded('ionCube Loader'))
	{
		$ioncube = get_ioncube_name();
		if (!dl($ioncube[0]))
		{
				die_fix("현재 설치된 PHP의 ionCube Loader 확장모듈을 로딩할 수 없습니다.".$crlf."Linux (x86/32bit) 환경이 아닐 경우 아래 사이트에서 직접 다운받아 PHP extension directory 로 복사후 설치를 시작해야 합니다.".$crlf."  url) http://www.ioncube.com/loaders.php".$crlf."  ex)".$crlf."  wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz".$crlf."  gunzip < ioncube_loaders_lin_x86-64.tar.gz | tar -xf -".$crlf."  cp ioncube/*.so ".get_ext_dir()."/".$crlf);
		} else
		{
			echo "PHP의 ionCube Loader 확장모듈이 정상적으로 설치되었습니다.".$crlf;
		}	// if()
	}	// if()
}	// if()

scanf($crlf."[Enter]를 누르시면 설치작업이 계속 진행됩니다.".$crlf, array(), 5, false, true);


// 설정파일 테스트.
title("설정파일들을 테스트합니다.");
chdir($conf['nm_root'].DS.'tools');
$res = cmd('php install_test_config.php');
if (strpos($res,'__NMAIL_PHP_INSTALL_EXEC_OK__') === false)
{
	die_fix($res);
} else
{
	echo str_replace('__NMAIL_PHP_INSTALL_EXEC_OK__', '', $res);
}	// if()

title("엔메일 디비 데이타를 설치파일로부터 가져옵니다.");
system('php install_db_import.php');

title("엔메일 기본 도메인을 추가합니다.");
$res = cmd('php domain_add.php '.$conf['nm_domain'].' FROM_INSTALL');
if (strpos($res,'__NMAIL_PHP_INSTALL_EXEC_OK__') === false && strpos($res,'이미 추가된 도메인입니다.') === false)
{
	die_fix($res);
} else
{
	echo str_replace('__NMAIL_PHP_INSTALL_EXEC_OK__', '', $res);
}	// if()

title("엔메일 메일서버 관리자 계정을 추가합니다.");

// [2013-08-28] Oracle 은 MySQL 처럼 root 권한으로 nmail2 계정을 생성하지 않고, 이미 만들어진 계정 사용하므로 예외처리
//$res = cmd('php mbr_add.php '.$conf['nm_domain'].' "PostMaster" postmaster '.escapeshellarg_os($conf['nm_pass']).' ADMIN FROM_INSTALL');
$res = cmd('php mbr_add.php '.$conf['nm_domain'].' "PostMaster" postmaster '.escapeshellarg_os($xm_ctrl_p).' ADMIN FROM_INSTALL');
if (strpos($res,'__NMAIL_PHP_INSTALL_EXEC_OK__') === false && strpos($res,'이미 가입된 ID입니다') === false)
{
	die_fix($res);
} else
{
	echo str_replace('__NMAIL_PHP_INSTALL_EXEC_OK__', '', $res);
}	// if()

if ($uname == 'WIN')
{
	title("PHP의 mail() 함수를 사용한 발송 테스트.");
} else
{
	title("sendmail wrapper (/usr/sbin/sendmail) 발송 테스트.");
}	// if()
system('php install_test_mail.php postmaster@'.$conf['nm_domain']);

scanf($crlf."[Enter]를 누르시면 설치작업이 계속 진행됩니다.".$crlf, array(), 5, false, true);



################################################################################

// apache_bin
if ($uname != 'WIN')
{
	// [2022-12-09] Nginx 웹서버 지원
	if (isset($options['web-conf']) && isset($options['web-group']) && isset($options['web-group-id']))
	{
		// nginx + php70-php-fpm 재시작은 별도 안내
	} else {
		title("Apache 웹서버의 설치 정보를 확인합니다.");

		if (!$conf['apache_conf'])
		{
			$fp = fopen($apache_conf, "r");
			$conf['apache_conf'] = fread($fp, filesize($apache_conf));
			fclose($fp);
		}	// if()
		$conf['apache_conf_base'] = dirname(dirname($conf['apache_conf']));

		// [2009-06-16]
		$httpd = get_httpd_info($ps_ef);
		if ($httpd['bin'] != '')
		{
			$conf['apache_bin'] = $httpd['bin'];
			echo "- Apache 웹서버의 실행파일은 [".$conf['apache_bin']."]로 자동검출되었습니다.".$crlf;
			$scan = scanf("  위 실행파일이 맞습니까? [Y/n] : ", array('Y', 'N'), 2);
		} else
		{
			echo "Apache 웹서버의 실행파일 자동검출에 실패하였습니다.".$crlf;
			echo "Apache 웹서버가 실행중인지 확인하시거나 직접 입력하셔야 합니다.".$crlf."".$crlf;
			$scan = 'N';
		}	// if()

		if ($scan == 'N')
		{
			$equal = false;
			while ($equal == false)
			{
				$conf['apache_bin'] = scanf("- Apache 웹서버의 실행파일을 직접 입력하여 주십시오.".$crlf."  RPM 설치시의 일반적인 경로) /usr/sbin/httpd".$crlf."  컴파일 설치시의 일반적인 경로) /usr/local/apache/bin/httpd".$crlf."  : ", array(), 128, false);
				if (!file_exists($conf['apache_bin']))
				{
					alert("존재하지 않는 파일입니다.  다시 입력하여 주십시오.");
				} else
				{
					$equal = true;
				}	// if()
			}	// while()
		}	// if()


		// apachectl
		$conf['apachectl'] = $httpd['apachectl'];

		if ($conf['apachectl'] == '')
		{
			$equal = false;
			while ($equal == false)
			{
				$conf['apachectl'] = scanf("- Apache 웹서버의 실행 스크립트를 직접 입력하여 주십시오.".$crlf."  RPM 설치시의 일반적인 경로) /etc/init.d/httpd".$crlf."  컴파일 설치시의 일반적인 경로) /usr/local/apache/bin/apachectl".$crlf."  : ", array(), 128, false);
				if (!file_exists($conf['apachectl']))
				{
					alert("존재하지 않는 파일입니다.  다시 입력하여 주십시오.");
				} else
				{
					$equal = true;
				}	// if()
			}	// while()
		}	// if()

		// Apache 웹서버를 재시작합니다.
		title("Apache 웹서버를 재시작합니다.");
		system($conf['apachectl'].' restart');
		echo "  ".$conf['apachectl']." restart".$crlf."".$crlf;
	}

	// [2006-10-31]
	title("메일데이타와 디비의 동기화 스크립트를 Cron 데몬에 등록합니다.");
	$cron_dir = '/etc/cron.hourly';
	$cron_file = $cron_dir.DS.'nmail_mail_box_dbsync.cron';
	if (!is_dir($cron_dir))
	{
		echo "Cron 데몬의 디렉토리를 찾을 수 없습니다.".$crlf."  => ".$cron_dir.$crlf."아래 스크립트를 1시간 간격으로 자동 실행되도록 Cron 데몬에서 등록해두시면 됩니다.".$crlf."  => ".$conf['nm_root'].DS."tools/mail_box_dbsync.php ALL".$crlf;
	} else
	{
		if (!file_exists($cron_file))
		{
			// [2013-10-23] 크론 데몬의 실행 결과를 파일로 남기도록 함.
			//$data = "#!/bin/sh".$crlf.$conf['nm_root'].DS."tools/mail_box_dbsync.php ALL".$crlf;
			$data = "#!/bin/sh".$crlf.$conf['nm_root'].DS."tools/mail_box_dbsync.php ALL >> ".$conf['nm_root'].DS."weblogs/cron_dbsync-`date +%Y%m%d`.txt".$crlf;
			$fp = fopen($cron_file, "w");
			fwrite($fp, $data);
			fclose($fp);
			chmod($cron_file, 0700);
			echo "Cron 데몬에서 1시간 간격으로 자동 실행되도록 동기화 스크립트를 생성했습니다.".$crlf."  => ".$cron_file.$crlf;
		} else
		{
			echo "동기화 스크립트가 Cron 데몬에 이미 등록되어 있습니다.".$crlf."  => ".$cron_file.$crlf;
		}	// if()
	}	// if()

	// [2009-06-15]
	if ($conf['db'] == 'MYSQL')
	{
		title("MySQL DB의 테이블최적화 스크립트를 Cron 데몬에 등록합니다.");
		$cron_dir = '/etc/cron.daily';
		$cron_file = $cron_dir.DS.'nmail_mysql_optimize.cron';
		if (!is_dir($cron_dir))
		{
			echo "Cron 데몬의 디렉토리를 찾을 수 없습니다.".$crlf."  => ".$cron_dir.$crlf."아래 스크립트를 1일 간격으로 자동 실행되도록 Cron 데몬에서 등록해두시면 됩니다.".$crlf."  => ".$conf['nm_root'].DS."tools/mysql_optimize.php".$crlf;
		} else
		{
			if (!file_exists($cron_file))
			{
				symlink($conf['nm_root'].DS."tools/mysql_optimize.php", $cron_file);
				echo "Cron 데몬에서 1일 간격으로 자동 실행되도록 테이블최적화 스크립트를 생성했습니다.".$crlf."  => ".$cron_file.$crlf;
			} else
			{
				echo "테이블최적화 스크립트가 Cron 데몬에 이미 등록되어 있습니다.".$crlf."  => ".$cron_file.$crlf;
			}	// if()
		}	// if()
	}	// if()
}	// if()

################################################################################


// [2006-10-31] max_allowed_packet=32M
if ($conf['db'] == 'MYSQL')
{
	title("MySQL Server의 max_allowed_packet 값을 확인합니다.");
	echo "본문이 큰 메일을 저장하기 위해서는 이 값이 32M정도로 여유있게 설정되어 있어야 합니다.".$crlf."".$crlf;
	#$res = mysqli_query($link, "show variables like 'max_allowed_packet'");
	#var_dump(mysqli_error($link));
	#$row = mysqli_fetch_row($res);
	// [2007-11-10]
	$row = mysqli_fetch_row(mysqli_query($link, "show variables like 'max_allowed_packet'"));
	if ($row[1] < 33554432)
	{
		if ($uname == 'WIN')
		{
			$my_cnf = 'my.ini';
			$my_cnf2 = 'C:\Program Files\MySQL\MySQL Server 5.0\my.ini';
		} else
		{
			$my_cnf = 'my.cnf';
			if (file_exists('/etc/my.cnf'))
			{
				$my_cnf2 = 'vi /etc/my.cnf';
			} else if (file_exists('/etc/mysql/my.cnf'))
			{
				$my_cnf2 = 'vi /etc/mysql/my.cnf';
			} else
			{
				$my_cnf2 = 'vi /etc/my.cnf';
			}	// if()
		}	// if()

		echo "현재 설정은 [max_allowed_packet=".ceil($row[1]/1024/1024)."M]이므로".$crlf;
		echo "이보다 큰 본문은 디비에 저장되지 않는 에러가 발생하게 됩니다.".$crlf;
		echo "해결방법은 MySQL Server 의 설정 파일인 ".$my_cnf." 에 다음처럼 설정후 재시작해주시면 됩니다.".$crlf."".$crlf;
		echo "  ex)".$crlf;
		$mysql_version = mysqli_fetch_row(mysqli_query($link, "SELECT VERSION()"));
		if (version_compare($mysql_version[0], '4.0', '>='))
		{
			echo "    ".$my_cnf2.$crlf;
			echo "        [mysqld]".$crlf;
			echo "        max_allowed_packet=32M".$crlf;
		} else
		{
			echo "    ".$my_cnf2.$crlf;
			echo "        [mysqld]".$crlf;
			echo "        set-variable = max_allowed_packet=32M".$crlf;
		}	// if()
		echo $crlf."보다 자세한 내용은 아래 문서를 참고하시면 됩니다.".$crlf;
		echo "  http://dev.mysql.com/doc/refman/4.1/en/packet-too-large.html".$crlf;
	} else
	{
		echo "현재 설정은 [max_allowed_packet=".ceil($row[1]/1024/1024)."M]이므로 문제가 없습니다.".$crlf;
	}	// if()
}	// if()


scanf($crlf."[Enter]를 누르시면 설치작업이 계속 진행됩니다.".$crlf, array(), 5, false, true);


// [2022-12-09] Nginx 웹서버 지원
if (isset($options['web-conf']) && isset($options['web-group']) && isset($options['web-group-id']))
{
	title("Nginx 웹서버의 사이트 설정 안내");

	//  nginx server_name 직접 입력 지원
	if (isset($options['web-server-name']))
	{
		$nginx_server_name = $options['web-server-name'];
	} else if (preg_match("/[a-z]+/i", $conf['nm_domain']))        // domain
	{
		$nginx_server_name = 'mail.' . $conf['nm_domain'];
	} else {
		$nginx_server_name = $conf['nm_domain'];
	}

	$nginx_site_conf_data = 'server {
    set $APP_BACKEND php70_backend;

    listen       80;
    server_name ' . $nginx_server_name . ';
    root   ' . $conf['nm_root'] . DS . 'nmail;

    access_log  /var/log/nginx/nmail2.access.log  main;
    error_log  /var/log/nginx/nmail2.error.log;

    # 업로드시 파일+내용 최대 크기.  php.ini 의 post_max_size 값과 동일하게 설정.
    client_max_body_size ' . $conf['upload_max_filesize'] . 'm;

    index  index.php index.html index.htm;

    # 브라우저에 캐싱을 위해, 리소스 만료일 지정
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|wav|swf|eot|ttf|otf|woff|woff2|flv|mp3|mp4|xml)$ {
        #access_log off;
        #log_not_found off;
        #expires max;
        #expires 14d;
        expires 2h;
    }

    include /root/stack/apps/deny.conf;
    include /root/stack/apps/fastcgi-php-html.conf;

    fastcgi_read_timeout 300s;

    # Nmail PHP 3 - disable output buffering
    fastcgi_buffering off;
}
';

	// /etc/nginx/conf.d/nmail2.conf 파일 없을 경우 생성 묻기
	$nginx_nmail2_conf = '/etc/nginx/conf.d/nmail2.conf';
	if ( ! file_exists($nginx_nmail2_conf))
	{
		echo "다음 nginx 사이트 설정을 확인해주세요.".$crlf.$crlf;
		echo $nginx_site_conf_data.$crlf.$crlf;
		$scan = scanf("- 위 사이트 설정을 [ " . $nginx_nmail2_conf . " ] 파일로 저장하시겠습니까? [Y/n] : ", array('Y', 'N'), 2);
		if ($scan == 'Y')
		{
			if (file_put_contents($nginx_nmail2_conf, $nginx_site_conf_data)) {
				echo $crlf."nginx 설정 테스트 및 서비스 재시작을 해주셔야 반영됩니다.".$crlf.$crlf;
				echo "    ex) nginx -t && systemctl restart nginx".$crlf.$crlf;
			}
		}
	} else
	{
		echo "이미 사이트 설정 파일이 추가되어 있습니다.  " . $nginx_nmail2_conf . $crlf.$crlf;
	}

	// 설정 내용 보관
	file_put_contents($conf['nm_root'] . '/upload/config/nginx_site.' . date('Ymd_His'), $nginx_site_conf_data);
} else {
// Apache
	title("Apache 웹서버의 가상호스트/앨리어스 설정 안내");


// [2013-12-02] 우분투
	$EAVAILhost_prefix = '# VirtualHost Enabled
NameVirtualHost *:80
';

	if (isset($GLOBALS['_nmail_inst_ubuntu_apache2_envvars'])
		&& strpos(
			$GLOBALS['_nmail_inst_ubuntu_apache2_envvars'], 'APACHE_LOG_DIR'
		) !== false) {
		$apache_logs_dir = '${APACHE_LOG_DIR}' . DS;
		if (file_exists('/etc/apache2/sites-available/default')) {
			$conf['apache_conf'] = '/etc/apache2/sites-available/default';
			$virtualhost_prefix  = '';
		}    // if()
	} else {
		$apache_logs_dir = 'logs' . DS;
	}    // if()


	echo "이제 Apache 웹서버의 설정파일인 httpd.conf 에 가상호스트(혹은 앨리어스) 설정을 추가하고" . $crlf . "Apache 웹서버를 재시작하면 웹메일을 사용하실 수 있게 됩니다."
		. $crlf . $crlf;
	echo "  httpd.conf 에 추가해야할 내용)" . $crlf;
	echo "    주의1) 서버에 따라 NameVirtualHost, VIrtualHost 항목은 다를 수 있으니 기존 설정을 확인하세요." . $crlf;
	echo "    주의2) ServerName 은 DNS 설정에 따라 'mail'이라는 2차도메인이 붙지 않을 수 도 있으니" . $crlf . "        DNS 서버관리자에게 문의하시기 바랍니다."
		. $crlf;
	echo "    주의3) VIrtualHost 가 없던 사이트에서 VIrtualHost 를 추가할 경우 기존 홈페이지까지 엔메일로 접근될 수 있습니다." . $crlf
		. "        따라서 기존 홈페이지의 VIrtualHost 는 따로 만들어주셔야 합니다." . $crlf . $crlf;

	if ($uname != 'WIN') {
		echo "  ex) " . $crlf;
		echo "    vi " . $conf['apache_conf'] . $crlf;
		scanf("-- 다음 페이지 --", array(), 5, false, true);
	} else {
		echo "  httpd.conf 의 일반적인 경로)" . $crlf;
		echo "    개별 설치시) C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\httpd.conf" . $crlf;
		echo "    RWAPM 설치시) C:\RWAPM\RTM20040531\conf\httpd.conf" . $crlf;
		scanf("-- 다음 페이지 --", array(), 5, false, true);
	}    // if()


	if (preg_match("/[a-z]+/i", $conf['nm_domain']))        // domain
	{
		$virtualhost = $virtualhost_prefix . '
# Nmail PHP - http://mail.' . $conf['nm_domain'] . '/
<VirtualHost *:80>
     ServerAdmin postmaster@' . $conf['nm_domain'] . '
     DocumentRoot "' . $conf['nm_root'] . DS . 'nmail"
     ServerName mail.' . $conf['nm_domain'] . '
     ServerAlias mail.*
     #ServerAlias mail.MultiDomain1.com mail.MultiDomain2.com
     ErrorLog ' . $apache_logs_dir . 'nmail2.error_log
     CustomLog ' . $apache_logs_dir . 'nmail2.access_log combined
     <Directory "' . $conf['nm_root'] . DS . 'nmail">
         Options None
         AllowOverride All
         AddDefaultCharset Off
         <IfModule mod_authz_core.c>
           Require all granted
         </IfModule>
         <IfModule !mod_authz_core.c>
           Order allow,deny
           Allow from all
         </IfModule>
     </Directory>
</VirtualHost>
';
		$alias       = '# Nmail PHP - http://www.' . $conf['nm_domain'] . '/webmail/
Alias /webmail "' . $conf['nm_root'] . DS . 'nmail"
<Directory "' . $conf['nm_root'] . DS . 'nmail">
         Options None
         AllowOverride All
         AddDefaultCharset Off
         <IfModule mod_authz_core.c>
           Require all granted
         </IfModule>
         <IfModule !mod_authz_core.c>
           Order allow,deny
           Allow from all
         </IfModule>
</Directory>
';
	} else        // ip
	{
		$virtualhost = $virtualhost_prefix . '
# Nmail PHP - http://' . $conf['nm_domain'] . '/
<VirtualHost *:80>
     ServerAdmin postmaster@' . $conf['nm_domain'] . '
     DocumentRoot "' . $conf['nm_root'] . DS . 'nmail"
     ServerName ' . $conf['nm_domain'] . '
     ServerAlias mail.*
     #ServerAlias mail.MultiDomain1.com mail.MultiDomain2.com
     ErrorLog ' . $apache_logs_dir . 'nmail2.error_log
     CustomLog ' . $apache_logs_dir . 'nmail2.access_log combined
     <Directory "' . $conf['nm_root'] . DS . 'nmail">
         Options None
         AllowOverride All
         AddDefaultCharset Off
         <IfModule mod_authz_core.c>
           Require all granted
         </IfModule>
         <IfModule !mod_authz_core.c>
           Order allow,deny
           Allow from all
         </IfModule>
     </Directory>
</VirtualHost>
';
		$alias       = '# Nmail PHP - http://' . $conf['nm_domain'] . '/webmail/
Alias /webmail "' . $conf['nm_root'] . DS . 'nmail"
<Directory "' . $conf['nm_root'] . DS . 'nmail">
         Options None
         AllowOverride All
         AddDefaultCharset Off
         <IfModule mod_authz_core.c>
           Require all granted
         </IfModule>
         <IfModule !mod_authz_core.c>
           Order allow,deny
           Allow from all
         </IfModule>
</Directory>
';

	}    // if()

// [2009-06-13]
	$fp = fopen($conf['nm_root'] . '/upload/config/httpd_virtualhost.' . date('Ymd_His'), "w");
	fwrite($fp, $virtualhost);
	fclose($fp);

	$fp = fopen($conf['nm_root'] . '/upload/config/httpd_alias.' . date('Ymd_His'), "w");
	fwrite($fp, $alias);
	fclose($fp);

	echo '

### NmailPHP Virtual Host ###

' . $virtualhost . '

### NmailPHP Alias ###

' . $alias . '';
}

// [2009-06-25] 설치가 완료될때까지는 웹페이지에서는 접근이 불가능하게 함.
if (file_exists($conf['nm_root'].'/nmail/index__INSTALLING_ori.php'))
{
	// [2013-07-29] 설치가 완료된 이후에, PHP 확장 모듈 변경등으로 인해 설치 프로그램을 재실행한 경우, 끝까지 실행하지 않아도 되도록 개선함.
	//rename($conf['nm_root'].'/nmail/index.php', $conf['nm_root'].'/nmail/index__INSTALLING.php');
	rename($conf['nm_root'].'/nmail/index.php', $conf['nm_root'].'/nmail/index__INSTALL_COMPLETE.php');
	rename($conf['nm_root'].'/nmail/index__INSTALLING_ori.php', $conf['nm_root'].'/nmail/index.php');
}	// if()


echo $crlf."----------------- 설치 완료 -----------------".$crlf;

if ($uname == 'WIN')
{
	echo $crlf."계속하려면 아무 키나 누르십시오 . . .".$crlf;
	echo "안내) 아무 키나 눌러도 창이 닫히지 않을때는 우측 상단의 [X]를 눌러 강제로 닫아도 됩니다.".$crlf;
	system('pause');
}	// if()

?>