$GLOBALS["VERBOSE"] = true;
}
$_GET["RsyncStoragePath"] = trim(@file_get_contents("/etc/artica-postfix/settings/Daemons/RsyncStoragePath"));
if ($_GET["RsyncStoragePath"] == null) {
    $_GET["RsyncStoragePath"] = "/var/spool/rsync";
}
create_password_files();
echo "Search user that EnableBackupAccount is enabled\n";
$array = GetUserList();
if (!is_array($array)) {
    echo "No users...\n";
    die;
}
while (list($organisation, $users) = each($array)) {
    echo "Parsing organization {$organisation}\n";
    BuildConfig($organisation, $users);
}
function BuildConfig($organisation, $users)
{
    @mkdir("/etc/rsync/secrets/{$organisation}", null, true);
    $rsyncd = new rsyncd_conf();
    while (list($num, $user) = each($users)) {
        $uid = $user["uid"];
        $RsyncBackupTargetPath = $user["RsyncBackupTargetPath"];
        if ($RsyncBackupTargetPath == null) {
            $RsyncBackupTargetPath = $_GET["RsyncStoragePath"];
        }
        echo "Parsing user number {$num} ({$uid})\n";
        $path_name = md5(strtolower("{$organisation}{$uid}"));
        $path = "{$RsyncBackupTargetPath}/organizations/{$organisation}/{$uid}";
        @mkdir($path, null, true);
function start($aspid = false)
{
    $unix = new unix();
    $sock = new sockets();
    $Masterbin = $unix->CYRUS_DAEMON_BIN_PATH();
    $zarafaBin = $unix->find_program("zarafa-server");
    if (!is_file($Masterbin)) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]}, arpd not installed\n";
        }
        return;
    }
    if (!$aspid) {
        $pidfile = "/etc/artica-postfix/pids/" . basename(__FILE__) . "." . __FUNCTION__ . ".pid";
        $pid = $unix->get_pid_from_file($pidfile);
        if ($unix->process_exists($pid, basename(__FILE__))) {
            $time = $unix->PROCCESS_TIME_MIN($pid);
            if ($GLOBALS["OUTPUT"]) {
                echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Already Artica task running PID {$pid} since {$time}mn\n";
            }
            return;
        }
        @file_put_contents($pidfile, getmypid());
    }
    if ($unix->process_exists($unix->get_pid_from_file("/etc/artica-postfix/artica-backup.pid"))) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} A backup task currently is in use\n";
        }
        return;
    }
    $pid = PID_NUM();
    if ($unix->process_exists($pid)) {
        $timepid = $unix->PROCCESS_TIME_MIN($pid);
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Service already started {$pid} since {$timepid}Mn...\n";
        }
        return;
    }
    if (is_file("/etc/artica-postfix/stop.cyrus.imapd")) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} LOCKED !\n";
        }
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Remove /etc/artica-postfix/stop.cyrus.imapd !\n";
        }
        return;
    }
    if (is_file("/etc/artica-postfix/cyrus-stop")) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} LOCKED !\n";
        }
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Remove /etc/artica-postfix/cyrus-stop !\n";
        }
        return;
    }
    $unix->CreateUnixUser("postfix", "postfix");
    $php5 = $unix->LOCATE_PHP5_BIN();
    $EnableCyrusImap = $sock->GET_INFO("EnableCyrusImap");
    if (!is_numeric($EnableCyrusImap)) {
        $EnableCyrusImap = 1;
    }
    $DisableMessaging = intval($sock->GET_INFO("DisableMessaging"));
    $DisableIMAPVerif = intval($sock->GET_INFO("DisableIMAPVerif"));
    if ($DisableIMAPVerif == 0) {
        if (is_file("{$zarafaBin}")) {
            if ($GLOBALS["OUTPUT"]) {
                echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Zarafa is installed, aborting\n";
            }
            stop(true);
            return;
        }
    }
    if ($EnableCyrusImap == 0) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} service disabled (see EnableCyrusImap)\n";
        }
        return;
    }
    if ($DisableMessaging == 1) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} service disabled (see DisableMessaging)\n";
        }
        return;
    }
    if (!is_file('/usr/bin/cyradm')) {
        $cyradm = $unix->CYRADM_PATH();
        if (is_file($cyradm)) {
            shell_exec("/bin/ln -s {$cyradm} /usr/bin/cyradm");
        }
    }
    if (is_file('/usr/share/artica-postfix/exec.imapd.conf.php')) {
        shell_exec("{$php5} /usr/share/artica-postfix/exec.imapd.conf.php >/dev/null 2>&1");
    }
    if (!is_file('/etc/artica-postfix/cyrus.check.time')) {
        shell_exec("/usr/share/artica-postfix/bin/artica-install --cyrus-rights >/dev/null 2>&1");
    }
    shell_exec("{$php5} /usr/share/artica-postfix/exec.check-cyrus-account.php --check-adms");
    $sysctl = $unix->find_program("sysctl");
    $echo = $unix->find_program("echo");
    $nohup = $unix->find_program("nohup");
    if ($GLOBALS["OUTPUT"]) {
        echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} service\n";
    }
    if ($GLOBALS["OUTPUT"]) {
        echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Check permissions\n";
    }
    CheckPermissions();
    BuildConfig();
    $params[] = "{$nohup} {$Masterbin}";
    $params[] = "-M /etc/cyrus.conf";
    $params[] = "-C /etc/imapd.conf";
    $params[] = "-p /var/run/cyrmaster.pid -d >/dev/null 2>&1 &";
    $cmd = @implode(" ", $params);
    shell_exec($cmd);
    for ($i = 1; $i < 5; $i++) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Waiting {$i}/5\n";
        }
        sleep(1);
        $pid = PID_NUM();
        if ($unix->process_exists($pid)) {
            break;
        }
    }
    $pid = PID_NUM();
    if ($unix->process_exists($pid)) {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Success PID {$pid}\n";
        }
        $lmtpsocket = "/var/spool/postfix/var/run/cyrus/socket/lmtp";
        for ($i = 1; $i < 5; $i++) {
            if ($unix->is_socket($lmtpsocket)) {
                if ($GLOBALS["OUTPUT"]) {
                    echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Waiting socket success..\n";
                }
                $unix->chown_func("postfix", "postfix", "/var/spool/postfix/var/run");
                $unix->chown_func("postfix", "postfix", "{$lmtpsocket}");
                break;
            }
            if ($GLOBALS["OUTPUT"]) {
                echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Waiting socket {$i}/5\n";
            }
            sleep(1);
        }
    } else {
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} Failed\n";
        }
        if ($GLOBALS["OUTPUT"]) {
            echo "Starting......: " . date("H:i:s") . " [INIT]: {$GLOBALS["TITLENAME"]} {$cmd}\n";
        }
    }
}