Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ if ($var['shareCacheEnabled']!='yes') {
} elseif ($var['shareUser']=='-') {
echo "<p class='notice'>User shares not enabled!</p>";
}
$vars = @parse_ini_file("/var/local/emhttp/var.ini");
$plugin = 'ca.mover.tuning';
$config_file = '/boot/config/plugins/' . $plugin . '/' . $plugin . '.cfg';
$config_default_file = '/usr/local/emhttp/plugins/' . $plugin . '/default.cfg';
Expand All @@ -30,6 +31,7 @@ $sizefDisabled = ($cfg['sizef'] != "yes") ? "disabled" : "";
$sizefSyncDisabled = ($cfg['sizefSync'] != "yes") ? "disabled" : "";
$sparsnessfDisabled = ($cfg['sparsnessf'] != "yes") ? "disabled" : "";
$version = ($cfg['version']);
$moverRunning = file_exists('/var/run/mover.pid');

?>

Expand All @@ -49,15 +51,20 @@ $.fn.toggleAttr = function(attr) {

function updateCron() {
var cron = $("#cronSchedule").val();
var tune_cron = $("#tune_cronSchedule").val();
var cronEnabled = $("#forceCron").val();
var ismoverDisabled = $("#moverDisabled").val();
$.post("/plugins/ca.mover.tuning/updateCron.php",{cronEnabled:cronEnabled,cron:cron,ismoverDisabled:ismoverDisabled});
$.post("/plugins/ca.mover.tuning/updateCron.php",{cronEnabled:cronEnabled,cron:cron,tune_cron:tune_cron,ismoverDisabled:ismoverDisabled});
}

function moveNow() {
$.post("/plugins/ca.mover.tuning/mover.php crond start");
}

function startTuneMover() {
$.post("/plugins/ca.mover.tuning/mover.php", { cmdStartTuneMover: 1 });
}
Comment on lines +65 to +67
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

location.reload() may fire before POST completes.

The startTuneMover() function triggers an async POST but location.reload() is called synchronously in the onclick handler (line 787). This could reload the page before the server processes the request.

Consider using a callback or promise to reload after the POST completes:

 function startTuneMover() {
-$.post("/plugins/ca.mover.tuning/mover.php", { cmdStartTuneMover: 1 });
+$.post("/plugins/ca.mover.tuning/mover.php", { cmdStartTuneMover: 1 }, function() {
+    location.reload();
+});
 }

Then update line 787:

-<input type="button" name="StartTuneMover" value="_(Move now)_" onclick="startTuneMover(); location.reload()" ...>
+<input type="button" name="StartTuneMover" value="_(Move now)_" onclick="startTuneMover()" ...>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function startTuneMover() {
$.post("/plugins/ca.mover.tuning/mover.php", { cmdStartTuneMover: 1 });
}
function startTuneMover() {
$.post("/plugins/ca.mover.tuning/mover.php", { cmdStartTuneMover: 1 }, function() {
location.reload();
});
}
🤖 Prompt for AI Agents
In
source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/Mover.tuning.page
around lines 65-67 (and update the onclick at line 787), the startTuneMover()
function issues an async POST but the page is reloaded synchronously in the
onclick handler; change startTuneMover() to wait for the POST to complete and
then reload the page (use the $.post promise callback or $.ajax success/done to
call location.reload()), and remove the immediate synchronous location.reload()
from the onclick so the reload happens only after the POST finishes.


function resetDefaults() {
$.post("/plugins/ca.mover.tuning/reset.php");
}
Expand Down Expand Up @@ -147,6 +154,16 @@ _(Disable Mover running on a schedule)_:
:end

<div markdown="1" id="moverTuningSettings">
<?php if (version_compare($vars['version'], '7.2.1', '>=')): ?>
_(Mover Tuning schedule)_:
: <input type='text' id='tune_cronSchedule' name='moverTuneCron' size='1' class='tune_mycron' placeholder='0 */4 * * *' value='<?=htmlspecialchars($cfg['moverTuneCron'])?>'>

<blockquote class="inline_help">
<p>Runs the <strong><code>age_mover</code></strong> schedule from the Mover Tuning plugin using your custom cron entry (includes all plugin filters).</p>
<p> Cron Schedule entry example <strong>0 */4 * * *</strong>.&nbsp; To run at <em>every</em><strong> 4 hours</strong>.&nbsp; <a href="https://crontab.guru/" target="_blank" rel="noopener noreferrer"><i class="fa fa-clock-o"></i> What Is Cron</a></p>
</blockquote>
<?php endif; ?>

_(Test Mode (dry run))_:
: <select name='testmode' size='1' id='testmode' onchange="toggleTestModeWarning(this.value)">
<?=mk_option($cfg['testmode'],"no",_('No'))?>
Expand Down Expand Up @@ -704,6 +721,10 @@ _(Resynchronize all Primary files to Secondary)_:
<input type="submit" name="#apply" value="_(Apply)_" id='Apply'>
<input type="button" id="DONE" value="_(Done)_" onclick="done()">
<input type="button" id="Defaults" value="_(Defaults)_" onclick="resetDefaults(); location.reload()">
<?if ($showMoverButton):?>
<input type="button" name="StartTuneMover" value="_(Move now)_" onclick="startTuneMover(); location.reload()" title="Run Mover Tuning ..."<?if ($moverRunning):?> disabled<?endif;?>>
<?if ($moverRunning):?><span>_(Mover is running)_</span><?endif;?>
<?endif;?>
</span>

</form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ sparsnessv="1"
filetypesv=""
omoverthresh=""
cron=""
moverTuneCron=""
forceParity="no"
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#!/usr/bin/php
<?PHP
exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
$vars = @parse_ini_file("/var/local/emhttp/var.ini");

Check warning on line 3 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L3

The use of function parse_ini_file() is discouraged
if (version_compare($vars['version'], '7.2.1', '<')) {

Check warning on line 4 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L4

Implicit true comparisons prohibited; use === TRUE instead
exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
} else {
exec("/usr/local/sbin/mover start >> /var/log/syslog &", $output, $retval);

Check failure on line 7 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L7

System program execution function exec() detected with dynamic parameter
}
Comment on lines +3 to +8
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add null check for parse_ini_file failure.

If /var/local/emhttp/var.ini is missing or unreadable, $vars will be false, and accessing $vars['version'] will trigger a PHP warning. While version_compare(null, '7.2.1', '<') happens to return true (falling back to mover.old), this should be explicit.

 $vars = @parse_ini_file("/var/local/emhttp/var.ini");
+if (!$vars || !isset($vars['version'])) {
+    exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
+    exit;
+}
 if (version_compare($vars['version'], '7.2.1', '<')) {
     exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
 } else {
     exec("/usr/local/sbin/mover start >> /var/log/syslog &", $output, $retval);
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$vars = @parse_ini_file("/var/local/emhttp/var.ini");
if (version_compare($vars['version'], '7.2.1', '<')) {
exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
} else {
exec("/usr/local/sbin/mover start >> /var/log/syslog &", $output, $retval);
}
$vars = @parse_ini_file("/var/local/emhttp/var.ini");
if (!$vars || !isset($vars['version'])) {
exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
exit;
}
if (version_compare($vars['version'], '7.2.1', '<')) {
exec("/usr/local/sbin/mover.old start >> /var/log/syslog &", $output, $retval);
} else {
exec("/usr/local/sbin/mover start >> /var/log/syslog &", $output, $retval);
}
🧰 Tools
🪛 GitHub Check: Codacy Static Code Analysis

[warning] 3-3: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L3
The use of function parse_ini_file() is discouraged


[warning] 4-4: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L4
Implicit true comparisons prohibited; use === TRUE instead


[failure] 7-7: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php#L7
System program execution function exec() detected with dynamic parameter

🤖 Prompt for AI Agents
In source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/moveNow.php
around lines 3 to 8, add an explicit null/false check after parse_ini_file to
handle failure: test that $vars is an array (or not false) and that a 'version'
key exists, then set a safe default (e.g. null or '0.0.0') or log an error; use
that vetted value in version_compare so you don't index into a non-array and so
behavior is explicit (fallback to using mover.old when version is missing or
below 7.2.1). Ensure any error logging or default choice is minimal and keeps
the same exec calls unchanged.

?>
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,13 @@
logger("Option 1 set to 'start' due to version < 7.0.0\n");
}
}
// For Unraid v7.2.1+, use $_POST for pressed move now button in plugin page
else if (version_compare($vars['version'], '7.2.1', '>=')) {

Check warning on line 60 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L60

Implicit true comparisons prohibited; use === TRUE instead
if (isset($_POST['cmdStartTuneMover'])) {

Check warning on line 61 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61

Direct use of $_POST Superglobal detected.

Check warning on line 61 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61

Implicit true comparisons prohibited; use === TRUE instead

Check failure on line 61 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61

Processing form data without nonce verification.
$args[0] = 'start';
$option1 = $args[0];
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Consider adding nonce verification for POST handling.

The $_POST['cmdStartTuneMover'] parameter is used without CSRF/nonce verification. While Unraid provides authentication, a logged-in user could be tricked into triggering the mover via a malicious page. If Unraid provides a nonce mechanism (e.g., via the Wrappers include), consider using it.

If nonce verification isn't available in this plugin context, at minimum validate that the request came from the expected source or document why CSRF protection isn't applicable here.

🧰 Tools
🪛 GitHub Check: Codacy Static Code Analysis

[warning] 60-60: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L60
Implicit true comparisons prohibited; use === TRUE instead


[warning] 61-61: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61
Direct use of $_POST Superglobal detected.


[warning] 61-61: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61
Implicit true comparisons prohibited; use === TRUE instead


[failure] 61-61: source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L61
Processing form data without nonce verification.


// Combine all arguments into a single string with spaces
$options = implode(' ', $args);
Expand Down Expand Up @@ -90,7 +97,11 @@
if ($cfg['movenow'] == "yes") {
$mover_str = "/usr/local/emhttp/plugins/ca.mover.tuning/age_mover";
} else {
$mover_str = "/usr/local/sbin/mover.old";
if (version_compare($vars['version'], '7.2.1', '<')) {
$mover_str = "/usr/local/sbin/mover.old";
} else {
$mover_str = "/usr/local/sbin/mover";
}
}

if ($options == "stop") {
Expand All @@ -117,13 +128,13 @@
//Default "move now" button has been hit.
$niceLevel = $cfg['moverNice'] ?: "0";
$ioLevel = $cfg['moverIO'] ?: "-c 2 -n 0";
logger("ionice $ioLevel nice -n $niceLevel /usr/local/sbin/mover.old $options");
passthru("ionice $ioLevel nice -n $niceLevel /usr/local/sbin/mover.old $options");
logger("ionice $ioLevel nice -n $niceLevel $mover_str $options");
passthru("ionice $ioLevel nice -n $niceLevel $mover_str $options");

Check failure on line 132 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/mover.php#L132

System program execution function passthru() detected with dynamic parameter
}
}

if ($cron && $cfg['moverDisabled'] == 'yes') {
logger("Mover schedule disabled");
logger("Mover Tuning schedule disabled");
exit();
}

Expand All @@ -132,7 +143,7 @@
exit();
}

logger("Starting Mover ...");
logger("Starting Mover Tuning ...");

startMover();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
require_once("/usr/local/emhttp/plugins/dynamix/include/Wrappers.php");

$cfg = parse_plugin_cfg("ca.mover.tuning");
$vars = @parse_ini_file("/var/local/emhttp/var.ini") ?: [];

Check warning on line 6 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L6

Implicit true comparisons prohibited; use === TRUE instead

// Get config value of forced cron
$cfg_cronEnabled = $cfg['force'];
// Get cron time of forced cron (normalized)
$cfg_cron = trim($cfg['cron'] ?? '');
// Get config value of mover disabled
$cfg_moverDisabled = $cfg['moverDisabled'];
// Get Mover Tuning cron time (normalized)
$cfg_moverTuneCron = trim($cfg['moverTuneCron'] ?? $vars['shareMoverSchedule'] ?? '');

function logger($string)
{
Expand All @@ -20,9 +23,26 @@
}
}

function make_tune_cron()
{
global $vars;
if (!empty($vars['shareMoverSchedule'])) {

Check warning on line 29 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L29

Operator ! prohibited; use === FALSE instead
// Disable Unraid mover
$vars['shareMoverSchedule'] = "";
}

$tuneCron = isset($_POST['tune_cron']) ? trim($_POST['tune_cron']) : '';

Check failure on line 34 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L34

$_POST['tune_cron'] not unslashed before sanitization. Use wp_unslash() or similar

Check warning on line 34 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L34

Direct use of $_POST Superglobal detected.

Check warning on line 34 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L34

Implicit true comparisons prohibited; use === TRUE instead
$cronTuneFile = "# Generated schedule for Mover Tuning move\n" . $tuneCron . " /usr/local/emhttp/plugins/ca.mover.tuning/age_mover start |& logger -t move\n\n";
file_put_contents("/boot/config/plugins/ca.mover.tuning/mover.tune.cron", $cronTuneFile);

Check warning on line 36 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L36

The use of function file_put_contents() is discouraged
}

function make_cron()
{
$cronFile = "# Generated schedule for forced move\n" . trim($_POST['cron']) . " /usr/local/sbin/mover.old start |& logger -t move\n\n";
global $vars;
$version = $vars['version'] ?? '0.0.0';
$mover = version_compare($version, '7.2.1', '<') ? '/usr/local/sbin/mover.old' : '/usr/local/sbin/mover';

Check warning on line 43 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L43

Implicit true comparisons prohibited; use === TRUE instead
$cron = isset($_POST['cron']) ? trim($_POST['cron']) : '';

Check failure on line 44 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L44

$_POST['cron'] not unslashed before sanitization. Use wp_unslash() or similar

Check warning on line 44 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L44

Direct use of $_POST Superglobal detected.

Check warning on line 44 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L44

Implicit true comparisons prohibited; use === TRUE instead
$cronFile = "# Generated schedule for forced move\n{$cron} {$mover} start |& logger -t move\n\n";
file_put_contents("/boot/config/plugins/ca.mover.tuning/mover.cron", $cronFile);
}

Expand Down Expand Up @@ -63,5 +83,17 @@
}
}

// Handle Mover Tuning custom cron schedule
if ($cfg_moverTuneCron != $_POST['tune_cron']) {

Check failure on line 87 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L87

Detected usage of a possibly undefined superglobal array index: $_POST['tune_cron']. Use isset() or empty() to check the index exists before using it

Check warning on line 87 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L87

Direct use of $_POST Superglobal detected.

Check failure on line 87 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L87

Processing form data without nonce verification.

if (trim($_POST['tune_cron']) != "") {

Check failure on line 89 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L89

Detected usage of a possibly undefined superglobal array index: $_POST['tune_cron']. Use isset() or empty() to check the index exists before using it

Check warning on line 89 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L89

Direct use of $_POST Superglobal detected.

Check warning on line 89 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L89

Operator != prohibited; use !== instead

Check failure on line 89 in source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

source/ca.mover.tuning/usr/local/emhttp/plugins/ca.mover.tuning/updateCron.php#L89

Processing form data without nonce verification.
make_tune_cron();
logger("Mover Tuning cron schedule updated successfully.");
} else {
@unlink("/boot/config/plugins/ca.mover.tuning/mover.tune.cron");
logger("Mover Tuning cron schedule removed.");
}
}

exec("update_cron");
?>