$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); }