Skip to content

v0.1.15-alpha

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:45
· 339 commits to main since this release

İmzalı sürüm (ed25519). manifest.json ve manifest.json.sig release'e dahildir; açık anahtar depoda keys/pops_release_ed25519.pub.pem. Doğrulama için bkz. keys/README.md. Ajan için POps-Agent-*-win-x64.msi önerilir (sessiz kurulum ve özellikleri: Installer/README.md); zip eski elle kurulum yoludur. Ajan paketleri Windows'ta SmartScreen uyarısı verebilir (Authenticode imzası henüz yok). MSI kendi .NET 10 çalışma zamanını getirir; uç noktada önceden bir şey kurmak gerekmez.

The agent moves to .NET 10 and ships its own runtime: no .NET prerequisite on the PC. Features can be turned off for the whole organisation or per lab (modules, with "Okul laboratuvarı" and "Kurum" profiles); the server enforces it and agents follow it. A device key stays on the hardware it was issued to, and POpsAgent.exe --generalize prepares disk images. The panel has no browser pop-ups any more, shares one design and several buttons that did nothing work. The server keeps running while its disk stalls, and a deploy stops before pip when the venv belongs to another user.

Upgrading: update the server first (Sistem & Sürüm → Sunucuyu güncelle; migration 0018). Then fetch 0.1.15-alpha on Ajan güncelleme and send it to one PC first: the MSI is about 41 MB (it contains the .NET 10 runtime) and replaces the framework-dependent build; if the new version does not start, the agent rolls back by itself. The .NET 8 runtime stays on the PC. Nothing changes for modules until a superadmin turns one off.

Added

  • Server: modules and install profiles (server side). Vision, remote commands, file deployment, scheduled tasks, Windows Update, software inventory, licences, helpdesk, DNS policy, quarantine, Wake-on-LAN and reports can be turned off for the whole organisation or per lab (module_settings, migration 0018); the most specific setting wins and without a setting everything stays on, so upgrading changes nothing. A superadmin sets them with POST /api/modules/{id} or applies the "Okul laboratuvarı" / "Kurum" profile. A module that is off is enforced on the server: its endpoints answer 409 (X-POps-Module), the task queue and the scheduler skip its devices, turning Vision off closes open sessions and turning remote commands off denies waiting tasks. Agents that send their key with the policy request also get the module list of their lab. The panel page follows.

Fixed

  • Panel: an older release is no longer offered as an update. While a new version was tagged but its GitHub release not yet published, the server ran the new version and Sistem & Sürüm offered the previous one as "Yeni sürüm"; versions are now compared, not just checked for a difference (server and agent package).
  • Release: the agent package step runs. A PowerShell string ("$drawing:") read as a scope prefix and stopped the first self-contained build.
  • Panel: the dashboard chart shows something. "Ağdaki PC Sayısı" plotted the number of registered PCs from the moment the page opened (one point at first, so the chart looked empty, and the number hardly ever changes). It now shows how many PCs are online over the last 10 minutes, out of the registered total, and keeps the history while you move between pages.
  • Panel: buttons that did nothing work. Devices: the flat/by-lab view switch only redrew when the table's HTML length changed by more than 50 characters, so it, status changes and selections often did not show. Labs: every lab whose name contains a space was hidden. Task queue and Logs: the type filters compared a field the server no longer sends (log_type; logs carry category and risk_level), so every filter except "all" was empty. Terminal: "Wake" did nothing for a single PC. Deployment: the live tracker stayed at "queued" forever; it now follows the tasks it created.
  • Panel: actions report what really happened. Bulk restart/shutdown, quick commands, quarantine, wake, package delete and other actions no longer say "sent" before the server answered; errors show the server's reason (validation errors included, they used to read "[object Object]"). A Vision session the server refuses no longer leaves the switch on without a picture. Retry is offered only for finished tasks.
  • Panel: renaming a PC from the Terminal is validated (Windows rules: at most 15 letters, digits and hyphens); the name used to go into the PowerShell command unchecked.
  • Server: a deploy whose virtual environment holds files of another user stops before pip. pops-deploy-backend checks that every file in the venv belongs to OWNER before installing changed requirements; otherwise it changes nothing and prints the chown command. On the development server, packages once installed as root made pip fail half-way through the 0.1.14 update.
  • Server: a task result is shown only for the device's own task. A result whose task ID belongs to another device or no longer exists is still acknowledged (the agent stops resending it) but is no longer broadcast to the panels.
  • Server: a stalled log destination no longer freezes the server. Log lines were written to stderr on the event loop, so when the write waited (a stalled disk, journald or a Docker log pipe not reading) every connection waited with it: agent WebSocket handshakes timed out and HTTP requests hung. On the project server a stalled disk held appends to a log file for 5–30 seconds (PostgreSQL commits waited just as long). Lines are still formatted where they are logged (same request_id), but one background thread writes them in order. If 10 000 lines are waiting, new ones are dropped, and when the writer catches up it logs one log yazımı yetişemedi warning with the dropped count.
  • Panel: the server-update confirmation names what is installed (the latest published release, or main on the development channel); it always said main.

Changed

  • Panel: no browser pop-ups. Every confirm, alert and prompt (about 35, on 11 pages) is an in-page dialog with focus handling, Esc and Enter, and destructive actions in red; results appear as toasts. One request helper for all pages (session expiry goes to the login page, the server's error text is shown). Pages share one design: consistent buttons with hover, focus and loading states, tables with row hover, empty and loading states, and every page fits a phone screen. The Devices and Task queue pages are rebuilt; the scheduled-task form opens in a dialog.

Agent

  • Modules (agent side). The policy request carries the device key (X-Agent-Id + X-Agent-Secret). The modules returned for the PC's lab are kept in memory, never in capabilities.json. A feature works only when the module is on and the local capability allows it, and it comes back by itself within a minute when the server turns the module on again. Without modules (older server, no key) everything is on. Per module, while it is off:

    • terminal: execute gets exit code -5 and capability_denied with reason: module_disabled.
    • vision: no tunnel, preview or remote input (capability_denied, module_disabled); an open session is ended.
    • helpdesk: the tray hides "Sorun bildir" and "Taleplerim" (HELPDESK_MENU over the pipe).
    • software: no inventory is sent; when the module opens, the list is resent.
    • patches: no Windows Update scan or report; scan_updates and install_updates are refused.
    • wol: wake_peer is refused.

    Changes are logged once and written to the event log as 1080. dns_policy and quarantine need nothing on the agent: the server sends an empty list and auto_quarantine: false.

  • .NET 10, self-contained: no prerequisite on the PC. .NET 8 support ends on 10 November 2026. The agent, tray, watchdog and updater now target .NET 10 (LTS) and are published self-contained into one folder that shares the runtime, so the MSI installs the runtime with them and no longer requires the .NET 8 Desktop Runtime (its check is gone). A framework-dependent .NET 10 package would have failed to install on PCs without that runtime, and the updater would have rolled every such PC back. The MSI grows from about 4 MB to about 41 MB (about 270 files, 117 MB installed); only Turkish satellite resources are included. No ReadyToRun: it added 9 MB without a measurable start-up gain. The tray is published last because it needs the WindowsDesktop builds of System.Drawing.dll and Microsoft.VisualBasic.dll; the release workflow checks this. Updating from 0.1.14 works as before; rolling back from 0.1.15 to an earlier version runs that version on the .NET 8 runtime still installed on the PC. Packages move to 10.0.x; Dependabot ignores major (11.x) updates. Decision D-19.

  • A copied installation no longer uses the original's key. When the agent receives its key (set_secret) it writes C:\POpsData\secure\hw.bind: the SHA-256 of uuid|bios_sn (normalized as in dna_payload), separate digests of the values that are real, and the ID the key belongs to; also in PersistDir when set. Installations that already have a key write today's hardware on their first start (trust on first use). Every start, before the ID and key are read, compares the values that were real both times. If all of them changed (a copied image on another PC changes both; a single comparable value decides alone), identity.key, the key (and its PersistDir copy), bypass.device, hw.bind and unconfirmed task results (pending-results.json) are moved (not deleted) to secure\clone-<UTC time>\, Windows event 1070 is written, the ID is derived from the hardware again and the agent enrolls with enroll.token if there is one; the original's task results are not sent under the new ID. If one changed and the other did not (motherboard service, a corrected BIOS serial, a VM setting), nothing is touched, it is logged and event 1072 is written once per start; the server's 4409 covers a real copy. Empty, all-zero, shared or placeholder values ("To be filled by O.E.M.", "Default string") are never compared; when nothing can be compared, it is logged once and nothing is touched. On frozen PCs with PersistDir the newer hw.bind wins and the ID it holds is restored. An image captured with 0.1.14 or older has no hw.bind; each copy trusts its own hardware and only the server's 4409 stops it.

  • POpsAgent.exe --generalize [--enroll-token <token>] prepares a disk image: needs an elevated prompt, stops the service and the watchdog, deletes the ID, key (and PersistDir copy), bypass.device, hw.bind, unconfirmed task and update results, the software-inventory record and secure\clone-*, and writes the token to secure\enroll.token, so every PC started from the image enrolls itself. Exit codes 0 done, 1 incomplete, 2 not administrator, 3 service or watchdog not stopped, 4 invalid arguments; with 2–4 nothing is changed. docs/agent.md (Disk images) recommends a multi-use token.

  • Close code 4409 (ID connected from another PC): the agent waits 10 minutes plus jitter before reconnecting instead of the normal back-off, logs every refusal and writes Windows event 1071 once per service start.

  • Software inventory load is spread. The first report after start comes 1–31 minutes later (random per start) instead of after a fixed minute, so 2000 PCs switched on together send about 65 reports a minute instead of all in the same minute; 30 minutes stays inside a 40-minute lesson. A list identical to the last successful send (SHA-256 of the sorted list, same device ID) is not sent again for 7 days, and the record (C:\POpsData\software-inventory.json) survives restarts, so a reboot no longer means a resend; a new key (set_secret) forgets it. When the list is not sent, agent_health.last_inventory_upload is still refreshed: the server's copy is known to be current, so the panel does not show it as old.