From 3e9faead437ea365ac318156fe79e02e326254a5 Mon Sep 17 00:00:00 2001 From: ljm42 Date: Tue, 12 Mar 2024 12:57:17 -0700 Subject: [PATCH] Replace UpdateDNS.php with a stub (#857) * This new stub file makes no network calls and always returns success * It is meant to be backwards compatible with older releases of Unraid that expect the script to exist --- .../plugins/dynamix.my.servers/Connect.page | 2 +- .../plugins/dynamix/include/UpdateDNS.php | 431 +----------------- 2 files changed, 8 insertions(+), 425 deletions(-) diff --git a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page index f4e3f923d..46b668ee0 100644 --- a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page +++ b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix.my.servers/Connect.page @@ -140,7 +140,7 @@ function registerServer(button) { button.form.submit(); }); - // give the unraid-api time to call rc.nginx and UpdateDNS before refreshing the page + // give the unraid-api time to call rc.nginx before refreshing the page const delay = 4000; setTimeout(function() { button.form.submit(); diff --git a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php index 59512d69e..c33893561 100644 --- a/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php +++ b/plugin/source/dynamix.unraid.net/usr/local/emhttp/plugins/dynamix/include/UpdateDNS.php @@ -1,6 +1,6 @@ 1) && $argv[1] == "-v") { - $verbose = true; - $anon = true; -} -if ($cli && ($argc > 1) && $argv[1] == "-vv") { - $verbose = true; -} -$var = parse_ini_file('/var/local/emhttp/var.ini'); -$nginx = parse_ini_file('/var/local/emhttp/nginx.ini'); -$is69 = version_compare($var['version'],"6.9.9","<"); -$reloadNginx = false; -$dnserr = false; -$icon_warn = "⚠️ "; -$icon_ok = "✅ "; - -$myservers_flash_cfg_path='/boot/config/plugins/dynamix.my.servers/myservers.cfg'; -$myservers = file_exists($myservers_flash_cfg_path) ? @parse_ini_file($myservers_flash_cfg_path,true) : []; -// ensure some vars are defined here so we don't have to test them later -if (empty($myservers['remote']['apikey'])) { - $myservers['remote']['apikey'] = ""; -} -if (empty($myservers['remote']['wanaccess'])) { - $myservers['remote']['wanaccess'] = "no"; -} -if (empty($myservers['remote']['wanport'])) { - $myservers['remote']['wanport'] = 443; -} -// remoteaccess, externalport if ($cli) { - $remoteaccess = (empty($nginx['NGINX_WANFQDN'])) ? 'no' : 'yes'; - $externalport = $myservers['remote']['wanport']; -} else { - $remoteaccess = $_POST['remoteaccess']??'no'; - $externalport = intval($_POST['externalport']??443); - - if ($remoteaccess != 'yes') { - $remoteaccess = 'no'; - } - - if ($externalport < 1 || $externalport > 65535) { - $externalport = 443; - } - - if ($myservers['remote']['wanaccess'] != $remoteaccess) { - // update the wanaccess ini value - $orig = file_exists($myservers_flash_cfg_path) ? parse_ini_file($myservers_flash_cfg_path,true) : []; - if (!$orig) { - $orig = ['remote' => $myservers['remote']]; - } - $orig['remote']['wanaccess'] = $remoteaccess; - $text = ''; - foreach ($orig as $section => $block) { - $pairs = ""; - foreach ($block as $key => $value) if (strlen($value)) $pairs .= "$key=\"$value\"\n"; - if ($pairs) $text .= "[$section]\n".$pairs; - } - if ($text) file_put_contents($myservers_flash_cfg_path, $text); - // need nginx reload - $reloadNginx = true; - } + exit("success".PHP_EOL); } -$isRegistered = !empty($myservers['remote']['username']); - -// protocols, hostnames, ports -$internalprotocol = 'http'; -$internalport = $nginx['NGINX_PORT']; -$internalhostname = $nginx['NGINX_LANMDNS']; -$externalprotocol = 'https'; -// keyserver will expand *.hash.myunraid.net or add www to hash.unraid.net as needed -$externalhostname = $nginx['NGINX_CERTNAME']; -$isLegacyCert = preg_match('/.*\.unraid\.net$/', $nginx['NGINX_CERTNAME']); -$isWildcardCert = preg_match('/.*\.myunraid\.net$/', $nginx['NGINX_CERTNAME']); -$internalip = $nginx['NGINX_LANIP']; - -if ($nginx['NGINX_USESSL']=='yes') { - // When NGINX_USESSL is 'yes' in 6.9, it could be using either Server_unraid_bundle.pem or certificate_bundle.pem - // When NGINX_USESSL is 'yes' in 6.10, it is is using Server_unraid_bundle.pem - $internalprotocol = 'https'; - $internalport = $nginx['NGINX_PORTSSL']; - if ($is69 && $nginx['NGINX_CERTNAME']) { - // this is from certificate_bundle.pem - $internalhostname = $nginx['NGINX_CERTNAME']; - } -} -if ($nginx['NGINX_USESSL']=='auto') { - // NGINX_USESSL cannot be 'auto' in 6.9, it is either 'yes' or 'no' - // When NGINX_USESSL is 'auto' in 6.10, it is using certificate_bundle.pem - $internalprotocol = 'https'; - $internalport = $nginx['NGINX_PORTSSL']; - // keyserver will expand *.hash.myunraid.net as needed - $internalhostname = $nginx['NGINX_CERTNAME']; -} - -// My Servers version -$plgversion = file_exists("/var/log/plugins/dynamix.unraid.net.plg") ? trim(@exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.plg 2>/dev/null')) - : ( file_exists("/var/log/plugins/dynamix.unraid.net.staging.plg") ? trim(@exec('/usr/local/sbin/plugin version /var/log/plugins/dynamix.unraid.net.staging.plg 2>/dev/null')) - : 'base-'.$var['version'] ); - -// only proceed when when signed in or when legacy unraid.net SSL certificate exists -if (!$isRegistered && !$isLegacyCert) { - response_complete(406, array('error' => _('Nothing to do'))); -} - -// keyfile -$keyfile = empty($var['regFILE']) ? false : @file_get_contents($var['regFILE']); -if ($keyfile === false) { - response_complete(406, array('error' => _('Registration key required'))); -} -$keyfile = @base64_encode($keyfile); - -// build post array -$post = [ - 'keyfile' => $keyfile, - 'plgversion' => $plgversion -]; -if ($isLegacyCert) { - // sign in not required to maintain local ddns for unraid.net cert - // enable local ddns regardless of use_ssl value - $post['internalip'] = $internalip; - // if host.unraid.net does not resolve to the internalip and DNS Rebind Protection is disabled, disable caching - if (host_lookup_ip(generate_internal_host($nginx['NGINX_CERTNAME'], $post['internalip'])) != $post['internalip'] && rebindDisabled()) $dnserr = true; -} -if ($isRegistered) { - // if signed in, send data needed to maintain My Servers Dashboard - $post['internalhostname'] = $internalhostname; - $post['internalport'] = $internalport; - $post['internalprotocol'] = $internalprotocol; - $post['remoteaccess'] = $remoteaccess; - $post['servercomment'] = $var['COMMENT']; - $post['servername'] = $var['NAME']; - if ($isWildcardCert) { - // keyserver needs the internalip to generate the local access url - $post['internalip'] = $internalip; - } - if ($remoteaccess == 'yes') { - // include wanip in the cache file so we can track if it changes - $post['_wanip'] = trim(@file_get_contents("https://wanip4.unraid.net/")); - $post['externalhostname'] = $externalhostname; - $post['externalport'] = $externalport; - $post['externalprotocol'] = $externalprotocol; - // if wanip.hash.myunraid.net or www.hash.unraid.net does not resolve to the wanip, disable caching - if (host_lookup_ip(generate_external_host($post['externalhostname'], $post['_wanip'])) != $post['_wanip']) $dnserr = true; - } -} - -// Include unraid-api report -$unraidreport = []; -if (file_exists('/usr/local/sbin/unraid-api')) { - $jsonString = trim(@exec("/usr/local/sbin/unraid-api report --json 2>/dev/null")); - $unraidreport = @json_decode($jsonString, true); - if ($unraidreport === false) { - $post['unraidreport'] = $jsonString; - } else { - // remove fields we don't need to submit - unset($unraidreport['servers']); - } -} elseif (strpos($plgversion, "base-") === false) { - // The plugin is installed but the api doesn't exist. This is a failed install. Generate basic troubleshooting data. - if (file_exists('/boot/config/plugins/dynamix.my.servers/env')) { - @extract(parse_ini_file('/boot/config/plugins/dynamix.my.servers/env',true)); - } - if (empty($env)) { - $env = "production"; - } - $unraidreport['os']['version'] = $var['version']; - $unraidreport['api']['version'] = "failed install"; - $unraidreport['api']['status'] = "missing"; - $unraidreport['api']['environment'] = $env; - $unraidreport['relay']['status'] = "disconnected"; - $unraidreport['minigraph']['status'] = "disconnected"; - if ($isRegistered) { - $unraidreport['myServers']['status'] = "authenticated"; - $unraidreport['myServers']['myServersUsername'] = $myservers['remote']['username']; - } else { - $unraidreport['myServers']['status'] = "signed out"; - } - $unraidreport['apiKey'] = (empty($myservers['remote']['apikey'])) ? "invalid" : "exists"; -} - -if (!empty($unraidreport)) { - // include unraid-api crash logs - $crashLog = '/var/log/unraid-api/crash.json'; - $crashAge = 0; - if (file_exists($crashLog)) { - $crashTime = filemtime($crashLog); - $crashAge = time() - $crashTime; // age of crashLog in seconds - $crashDetails = @json_decode(@file_get_contents($crashLog), true); - if (empty($crashDetails['apiVersion']) && $crashAge < 30*60) { - // found a recent crash log without an apiVersion, assume was created by current version of api - $crashDetails['apiVersion'] = $unraidreport['api']['version']; - // overwrite the crash log so it will always have the apiVersion - file_put_contents($crashLog, json_encode($crashDetails, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); - // reset to original timestamp so crashAge remains accurate - touch($crashLog, $crashTime); - } - $unraidreport['crashAge'] = $crashAge; - $unraidreport['crashLogs'] = $crashDetails; - } - - // add flash backup status - $flashbackup_ini = '/var/local/emhttp/flashbackup.ini'; - $flashbackup_status = (file_exists($flashbackup_ini)) ? @parse_ini_file($flashbackup_ini) : []; - if (empty($flashbackup_status['activated'])) { - $flashbackup_status['activated'] = ""; - } - if (empty($flashbackup_status['error'])) { - $flashbackup_status['error'] = ""; - } - $unraidreport['flashbackup']['activated'] = ($flashbackup_status['activated']) ? "yes" : "no"; - $unraidreport['flashbackup']['error'] = ($flashbackup_status['error']) ? $flashbackup_status['error'] : "no"; - - // add unraidreport to payload - $post['unraidreport'] = json_encode($unraidreport); - - // if the api is stopped and there are no crashLogs, or any crashLogs are more than maxCrashAge, start the api - $maxCrashAge = 1*60*60; // 1 hour - if ($unraidreport['api']['status'] == 'stopped' && (empty($unraidreport['crashLogs']) || $crashAge > $maxCrashAge)) { - exec("echo \"/usr/local/sbin/unraid-api start\" | at -M now >/dev/null 2>&1"); - } -} - -// if remoteaccess is enabled in 6.10.0-rc3+ and WANIP has changed since nginx started, reload nginx -if (isset($post['_wanip']) && ($post['_wanip'] != $nginx['NGINX_WANIP']) && version_compare($var['version'],"6.10.0-rc2",">")) $reloadNginx = true; -// if remoteaccess is currently disabled (perhaps because a wanip was not available when nginx was started) -// BUT the system is configured to have it enabled AND a wanip is now available -// then reload nginx -if ($remoteaccess == 'no' && $nginx['NGINX_WANACCESS'] == 'yes' && !empty(trim(@file_get_contents("https://wanip4.unraid.net/")))) $reloadNginx = true; -if ($reloadNginx) { - exec("/etc/rc.d/rc.nginx reload &>/dev/null"); -} - -// maxage is 36 hours -$maxage = 36*60*60; -if ($dnserr || $verbose) $maxage = 0; -$datafile = "/tmp/UpdateDNS.txt"; -$datafiletmp = "/tmp/UpdateDNS.txt.new"; -$dataprev = @file_get_contents($datafile) ?: ''; -$datanew = implode("\n",$post)."\n"; -if ($datanew == $dataprev && (time()-filemtime($datafile) < $maxage)) { - response_complete(204, null, _('No change to report')); -} -file_put_contents($datafiletmp,$datanew); -rename($datafiletmp, $datafile); - -// do not submit the wanip, it will be captured from the submission if needed for remote access -unset($post['_wanip']); - -// report necessary server details to limetech for DNS updates -$ch = curl_init('https://keys.lime-technology.com/account/server/register'); -curl_setopt($ch, CURLOPT_POST, 1); -curl_setopt($ch, CURLOPT_POSTFIELDS, $post); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); -$result = curl_exec($ch); -$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); -$error = curl_error($ch); -curl_close($ch); - -if ( ($result === false) || ($httpcode != "200") ) { - // delete cache file to retry submission on next run - @unlink($datafile); - response_complete($httpcode ?? "500", array('error' => $error)); -} - -response_complete($httpcode, $result, _('success')); +header('Content-Type: application/json'); +http_response_code(204); +exit(0); ?>