new timezone validation and conversion to check

This commit is contained in:
ayntk-ai
2024-08-15 13:25:30 +02:00
parent a51b306c08
commit a1915e40f7

View File

@@ -295,27 +295,51 @@ class Form extends Component
$result = instant_remote_process($commands, $this->server); $result = instant_remote_process($commands, $this->server);
ray('Result of instant_remote_process:', $result); ray('Result of instant_remote_process:', $result);
// Check if the timezone was actually changed // Improved verification
$newTimezone = trim(instant_remote_process(["date +%Z"], $this->server, false)); $verificationCommands = [
ray('New timezone after update:', $newTimezone); "date +'%Z %:z'",
"readlink /etc/localtime | sed 's#/usr/share/zoneinfo/##'",
];
$verificationResult = instant_remote_process($verificationCommands, $this->server, false);
$verificationLines = explode("\n", trim($verificationResult));
if ($newTimezone !== $desired_timezone) { if (count($verificationLines) !== 2) {
ray('Timezone update failed. New timezone does not match requested value.'); ray('Unexpected verification result:', $verificationResult);
$this->dispatch('error', 'Failed to update server timezone. The server reported a different timezone than requested.'); $this->dispatch('error', 'Failed to verify timezone update. Unexpected server response.');
return false; return false;
} }
ray('Updating server settings'); [$abbreviation, $offset] = explode(' ', $verificationLines[0]);
$this->server->settings->server_timezone = $desired_timezone; $actualTimezone = trim($verificationLines[1]);
$this->server->settings->save();
ray('Server settings updated');
ray('Timezone update completed successfully'); // Convert desired_timezone to DateTimeZone for comparison
return true; $desiredTz = new \DateTimeZone($desired_timezone);
$desiredAbbr = (new \DateTime('now', $desiredTz))->format('T');
$desiredOffset = $desiredTz->getOffset(new \DateTime('now', $desiredTz));
// Compare abbreviation, offset, and actual timezone
if ($abbreviation === $desiredAbbr && $offset === $this->formatOffset($desiredOffset) && $actualTimezone === $desired_timezone) {
ray('Timezone update verified successfully');
$this->server->settings->server_timezone = $desired_timezone;
$this->server->settings->save();
ray('Server settings updated');
return true;
} else {
ray('Timezone verification failed. Expected:', $desired_timezone, 'Actual:', $actualTimezone);
$this->dispatch('error', 'Failed to update server timezone. The server reported a different timezone than requested.');
return false;
}
} catch (\Exception $e) { } catch (\Exception $e) {
ray('Exception caught:', $e->getMessage()); ray('Exception caught:', $e->getMessage());
$this->dispatch('error', 'Failed to update server timezone: ' . $e->getMessage()); $this->dispatch('error', 'Failed to update server timezone: ' . $e->getMessage());
return false; return false;
} }
} }
private function formatOffset($offsetSeconds)
{
$hours = abs($offsetSeconds) / 3600;
$minutes = (abs($offsetSeconds) % 3600) / 60;
return sprintf('%s%02d:%02d', $offsetSeconds >= 0 ? '+' : '-', $hours, $minutes);
}
} }