169 lines
5.3 KiB
PHP
169 lines
5.3 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
define('CONTROL_API_LIBRARY', true);
|
|
require_once __DIR__ . '/../public/api.php';
|
|
|
|
function touch_panel_io_counters(): array
|
|
{
|
|
$reads = 0;
|
|
$writes = 0;
|
|
foreach (@file('/proc/diskstats', FILE_IGNORE_NEW_LINES) ?: [] as $line) {
|
|
$parts = preg_split('/\s+/', trim($line));
|
|
if (count($parts) < 14) {
|
|
continue;
|
|
}
|
|
$name = (string)$parts[2];
|
|
if (preg_match('/^(loop|ram|zram|dm-)/', $name)) {
|
|
continue;
|
|
}
|
|
$reads += (int)$parts[3];
|
|
$writes += (int)$parts[7];
|
|
}
|
|
|
|
return [
|
|
'reads' => $reads,
|
|
'writes' => $writes,
|
|
];
|
|
}
|
|
|
|
function touch_panel_snapshot(array $snapshot): array
|
|
{
|
|
$network = is_array($snapshot['network'] ?? null) ? $snapshot['network'] : [];
|
|
$wifi = is_array($snapshot['wifi'] ?? null) ? $snapshot['wifi'] : [];
|
|
$system = is_array($snapshot['system'] ?? null) ? $snapshot['system'] : [];
|
|
$fan = is_array($snapshot['fan'] ?? null) ? $snapshot['fan'] : [];
|
|
$touch = is_array($snapshot['touch_display'] ?? null) ? $snapshot['touch_display'] : [];
|
|
|
|
$interfaces = [];
|
|
foreach (($network['interfaces'] ?? []) as $row) {
|
|
if (!is_array($row) || !isset($row['name'])) {
|
|
continue;
|
|
}
|
|
$interfaces[] = [
|
|
'name' => $row['name'],
|
|
'state' => $row['state'] ?? null,
|
|
'carrier' => $row['carrier'] ?? null,
|
|
'rx_errors' => $row['rx_errors'] ?? 0,
|
|
'tx_errors' => $row['tx_errors'] ?? 0,
|
|
'rx_dropped' => $row['rx_dropped'] ?? 0,
|
|
'tx_dropped' => $row['tx_dropped'] ?? 0,
|
|
'rx_bytes' => $row['rx_bytes'] ?? 0,
|
|
'tx_bytes' => $row['tx_bytes'] ?? 0,
|
|
'rx_packets' => $row['rx_packets'] ?? 0,
|
|
'tx_packets' => $row['tx_packets'] ?? 0,
|
|
];
|
|
}
|
|
|
|
$clients = [];
|
|
foreach (($wifi['clients'] ?? []) as $client) {
|
|
if (!is_array($client)) {
|
|
continue;
|
|
}
|
|
$clients[] = [
|
|
'band' => $client['band'] ?? null,
|
|
];
|
|
}
|
|
|
|
return [
|
|
'ok' => (bool)($snapshot['ok'] ?? true),
|
|
'generated_at' => $snapshot['generated_at'] ?? null,
|
|
'fan' => [
|
|
'mode' => $fan['mode'] ?? 'auto',
|
|
'pwm' => $fan['pwm'] ?? 0,
|
|
'percent' => $fan['percent'] ?? 0,
|
|
'rpm' => $fan['rpm'] ?? 0,
|
|
'control_temp_c' => $fan['control_temp_c'] ?? null,
|
|
'policy_ok' => $fan['policy_ok'] ?? true,
|
|
],
|
|
'system' => [
|
|
'hostname' => $system['hostname'] ?? null,
|
|
'temp_c' => $system['temp_c'] ?? null,
|
|
],
|
|
'network' => [
|
|
'default_interface' => $network['default_interface'] ?? null,
|
|
'interfaces' => $interfaces,
|
|
],
|
|
'wifi' => [
|
|
'clients' => $clients,
|
|
],
|
|
'touch_display' => [
|
|
'connected' => $touch['connected'] ?? false,
|
|
],
|
|
'io' => touch_panel_io_counters(),
|
|
'history' => array_map(static function (array $row): array {
|
|
return [
|
|
'time' => $row['time'] ?? null,
|
|
'temp_c' => $row['temp_c'] ?? null,
|
|
'fan_rpm' => $row['fan_rpm'] ?? null,
|
|
'fan_pwm' => $row['fan_pwm'] ?? null,
|
|
'cpu_load_1' => $row['cpu_load_1'] ?? null,
|
|
'mem_percent' => $row['mem_percent'] ?? null,
|
|
];
|
|
}, array_slice(array_values(array_filter($snapshot['history'] ?? [], 'is_array')), -80)),
|
|
'network_history' => array_map(static function (array $row): array {
|
|
return [
|
|
'time' => $row['time'] ?? null,
|
|
'iface' => $row['iface'] ?? null,
|
|
'rx_mbps' => $row['rx_mbps'] ?? 0,
|
|
'tx_mbps' => $row['tx_mbps'] ?? 0,
|
|
'rx_pps' => $row['rx_pps'] ?? 0,
|
|
'tx_pps' => $row['tx_pps'] ?? 0,
|
|
];
|
|
}, array_slice(array_values(array_filter($snapshot['network_history'] ?? [], 'is_array')), -240)),
|
|
];
|
|
}
|
|
|
|
function touch_panel_json(array $payload, int $code = 0): never
|
|
{
|
|
fwrite(STDOUT, json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . PHP_EOL);
|
|
exit($code);
|
|
}
|
|
|
|
try {
|
|
$command = (string)($argv[1] ?? 'status');
|
|
|
|
if ($command === 'status') {
|
|
touch_panel_json([
|
|
'ok' => true,
|
|
'data' => touch_panel_snapshot(collect_snapshot(false)),
|
|
]);
|
|
}
|
|
|
|
if ($command === 'fan') {
|
|
$mode = (string)($argv[2] ?? 'auto');
|
|
$pwm = max(0, min(255, (int)($argv[3] ?? 120)));
|
|
if (!in_array($mode, ['auto', 'manual', 'off'], true)) {
|
|
touch_panel_json([
|
|
'ok' => false,
|
|
'error' => 'bad_mode',
|
|
], 2);
|
|
}
|
|
|
|
set_control_state($mode, $pwm);
|
|
add_fan_action(
|
|
'touch_panel_fan_set',
|
|
$mode,
|
|
$pwm,
|
|
'qt touch panel fan control',
|
|
true
|
|
);
|
|
|
|
touch_panel_json([
|
|
'ok' => true,
|
|
'data' => touch_panel_snapshot(collect_snapshot(false)),
|
|
]);
|
|
}
|
|
|
|
touch_panel_json([
|
|
'ok' => false,
|
|
'error' => 'unknown_command',
|
|
], 2);
|
|
} catch (Throwable $e) {
|
|
touch_panel_json([
|
|
'ok' => false,
|
|
'error' => 'exception',
|
|
'message' => $e->getMessage(),
|
|
], 1);
|
|
}
|