<?php
$disable_functions_str = ini_get("disable_functions");
if (!$disable_functions_str) {
    exit("ok\n");
}

$functions_required = [
    "stream_socket_server",
    "stream_socket_accept",
    "stream_socket_client",
    "pcntl_signal_dispatch",
    "pcntl_signal",
    "pcntl_alarm",
    "pcntl_fork",
    "pcntl_wait",
    "posix_getuid",
    "posix_getpwuid",
    "posix_kill",
    "posix_setsid",
    "posix_getpid",
    "posix_getpwnam",
    "posix_getgrnam",
    "posix_getgid",
    "posix_setgid",
    "posix_initgroups",
    "posix_setuid",
    "posix_isatty",
    "proc_open",
    "proc_get_status",
    "proc_close",
    "shell_exec",
    "exec",
    "putenv",
    "getenv",
];

$has_disbaled_functions = false;
foreach ($functions_required as $func) {
    if (strpos($disable_functions_str, $func) !== false) {
        $has_disbaled_functions = true;
        break;
    }
}

if (!$has_disbaled_functions) {
    exit("ok\n");
}

$disable_functions = explode(",", $disable_functions_str);
$disable_functions_removed = [];
foreach ($disable_functions as $index => $func) {
    $func = trim($func);
    foreach ($functions_required as $func_prefix) {
        if (strpos($func, $func_prefix) === 0) {
            $disable_functions_removed[$func] = $func;
            unset($disable_functions[$index]);
        }
    }
}

$php_ini_file = php_ini_loaded_file();
if (!$php_ini_file || !is_file($php_ini_file)) {
    exit("$php_ini_file not found\n");
}

$php_ini_content = file_get_contents($php_ini_file);
if (!$php_ini_content) {
    exit("$php_ini_file content empty\n");
}

$new_disable_functions_str = implode(",", $disable_functions);
$php_ini_content = preg_replace("/\ndisable_functions *?=[^\n]+/", "\ndisable_functions = $new_disable_functions_str", $php_ini_content);

file_put_contents($php_ini_file, $php_ini_content);

foreach ($disable_functions_removed as $func) {
    echo DIRECTORY_SEPARATOR === "/" ? str_pad($func, 30) . " \033[32;40m [enabled] \033[0m\r\n" : str_pad($func, 30) . " [enabled]\r\n";
}

echo "\r\nsuccess\r\n";