Skip to content

Releases: PashaCore/POps

v0.1.24-alpha

v0.1.24-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 22 Oct 04:36

İ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. Pardus/Debian için pops-agent_*_all.deb (Debian 12 / Pardus 23 ve sonrası; kurulum: Agent-Linux/README.md).

For operators, in short:

  1. Security first: PHP2Shell (CVE-2026-109618, CVE-2026-109619). Update the PHP of a native server now
    (AlmaLinux/RHEL 9: dnf update 'php*', Debian/Ubuntu: apt upgrade) and restart PHP-FPM. The Docker panel image of
    this release runs PHP 8.3.36. Details under Security.
  2. A rebuilt panel for everyday work. One Bilgisayarlar section (lab tiles, the lab's PCs, a list) and a full
    page per PC with its problems and how to fix them; labelled buttons; Sistem ve Güncelleme and Ayarlar as
    sidebar sections. Same features, same API.
  3. Agent fixes from the second external review, tried on a real PC and on a throwaway Windows machine in CI:
    • uninstalling during a quarantine or an exam no longer leaves the PC without network;
    • an exam no longer gets shorter or longer when the PC clock is wrong;
    • winget uses only the winget source, installs the newest version, retries once without a scope when the package
      has no machine installer, and says where the package landed;
    • a refused shutdown or restart is reported as an error;
    • large file transfers no longer stop after 100 seconds, and transfer errors are in plain Turkish;
    • no BITS when the server CA is pinned; the peer cache also works in labs with public IPv4 addresses.
  4. Keep file transfer off on a PC like remote command and remote screen, and pick features to install off from the
    enrollment token dialog, which now shows the ready msiexec command.
  5. Before updating a native server: migration 0033 adds one column. Reinstall /usr/local/sbin/pops-backup from
    this release for the weekly backup retention. Then send the new agent from Sistem ve Güncelleme.
  6. Known limitation: behind Cloudflare's Free or Pro plan, a file transfer over 100 MB fails (one request per
    file); see the troubleshooting guide.

Try it without installing: https://demo.pashacore.com.tr (demo / demo, read-only).

Added

  • Panel: keep file transfer off on a PC, and choose features to install off. The capability policy on
    Cihaz kaydı ve güvenlik covers file transfer next to remote command and remote screen: the server keeps a
    standing "off" request (set-capabilities files_enabled, migration 0033), re-sends it when the agent reconnects
    reporting it on, and refuses file transfers to that PC meanwhile (#199). The enrollment token dialog lists remote
    command, remote screen, file transfer, exam mode, power actions, messages and in-lab package sharing; the result
    shows the ready msiexec command with NAME_ENABLED=0 for each feature ticked, so a staff PC can be installed with
    them off from the first start (#198).
  • Simulator lab distribution. tools/agent_simulator.py --labs N creates short-lived SIM-LAB-* enrollment
    tokens and spreads simulated agents evenly across them for realistic class and report testing. Thanks to
    @adity982 (#170, closes #72).
  • pops-tls check [--days N] for monitoring. Exits 0 while the server certificate is valid for more than N days (default 30, the threshold renew uses), 1 with one line when it has N days or fewer left or has expired, and 2 when there is no certificate. It changes nothing on disk, so a cron mail or a monitoring plugin can run it. pops-tls show marks the "Kalan" line with "uyarı" inside the threshold. Thanks to @RajGahoi (#155, closes #112).

Changed

  • Panel rebuilt for everyday work (#198). Every page was rebuilt on the same engine and API, without a
    backend change: one Bilgisayarlar section (lab tiles with status squares, the lab's PCs, a flat list) and a full
    PC page (pc?id=) with the problems and their fixes and tabs for general, hardware, software, updates, history,
    events and files; labelled buttons with one primary action per page and the rest in a Diğer menu; lists as the
    main content, rows that open the item; Sistem ve Güncelleme and Ayarlar sections as sidebar sub-items, with
    server and agent updates shown as steps. No KPI tiles or decorative charts on the working pages; statistics stay on
    Raporlar.
  • Agent: winget pins the newest version and says where a package landed (#202). Without a version the agent first
    reads the newest version in the winget source and installs that one, so --scope machine can no longer quietly
    install an old release that still had a machine-scope installer (in the field Anki fell back from 26.09.3 to
    2.1.65); the output says which version was chosen. A second line says where the package landed: machine-wide, or
    only in the SYSTEM account's profile, where the PC's users do not see it.
  • Agent: file transfer errors in plain Turkish (#202). A broken upload or download no longer shows a raw .NET
    message such as Error while copying content to a stream.; it says what happened (for example that the connection
    was cut and that a proxy's size limit, such as Cloudflare's 100 MB, may be the cause) with the original error in
    brackets. HTTP 413, DNS, connection and TLS errors have their own texts.
  • Docs: file transfers through a proxy's size limit in troubleshooting (#201).
  • Backend dependencies: asyncpg 0.32, redis 8.1, pydantic 2.14 and FastAPI 0.143 (#165, #166, #172, #174).
    • asyncpg keeps the pool's min_size connections open (POps: 2 per worker) and fixes a pool deadlock after a protocol abort.
    • redis-py 8 talks RESP3 by default with compatible responses; the multi-worker Redis job passes unchanged.
    • pydantic 2.14 and FastAPI 0.143 need no code change; FastAPI's automatic OpenTelemetry setup is now opt-in and
      POps never used it. Starlette 1.8 is skipped: it needs Python 3.11 and the backend still supports 3.10 (D-20).
    • All of them come from the hash-locked requirements.lock on the next server update.
  • Agent: .NET packages 10.0.13 (Microsoft.Extensions.Hosting, System.Diagnostics.EventLog, System.Management and
    System.ServiceProcess.ServiceController; #177, #178, #182, #183, #191).
  • Docker images: refreshed python:3.12-slim and php base image digests (#187, #189).
  • Agent: the Worker is split into command handlers and a per-agent context (steps a0–a5, b1–b4, d; #162, #163, #192–#195). A CommandDispatcher routes each server action to its own handler class: execute, winget, tasks, Vision and capabilities, exam, file transfer, power, messages and more. CapabilityGate sends every capability_denied from one place. The connection loop, the sender and the tray message routing have their own classes. The agent's folders, runtime state (capabilities, modules, credentials, server trust, HTTP client, update state), the machine seams (firewall, kiosk, exam, file transfer) and the DNS policy monitor are instances held by one AgentContext instead of statics. Worker.cs shrinks from 2,203 to about 710 lines. Behaviour is unchanged. Two small additions: the exam handler releases its resources when the agent stops, and the network change listener is removed when the Worker stops. Design note: docs/design/worker-split.md.
  • Agent tests run in parallel by default. Only classes that open real processes, pipes or sockets run serially; the shared-state collection is gone, because no test changes a process-wide static any more. A guard test fails CI when a parallel class touches mutable static state, and a second one when product code in POpsAgent or POps.Shared adds a mutable static. Both ignore the hit counters that code coverage adds in CI. CI ran 1,479 tests on .NET 10 and 81 on the .NET Framework 4.7.2 MSI actions.
  • Exam mode: the server sends its own time. exam_mode now carries now (unix seconds) next to until. Agents from 0.1.24 take until - now as the time left and count it on a monotonic clock, so a PC clock that is ahead no longer refuses the exam and one that is behind no longer lengthens it. Older agents ignore the field. Schema, example and protocol README updated.
  • Docs: release rhythm stated as it is. README, README.tr, ROADMAP and the code-signing page said releases come out weekly, but 0.1.22 and 0.1.23 came out on the same day. They now say at most one planned release a week, with security fixes in between.
  • Docs: tool scripts. The docstrings of tools/agent_simulator.py, tools/bench_charts.py, tools/html_sinks/check_html_sinks.py and tools/sign_release.py give Python 3.10+ (the oldest version CI tests) and python3 tools/… examples that run from the repository root. Thanks to @RajGahoi (#90).
  • Docs: Turkish contributions. CONTRIBUTING has a short Turkish section, Türkçe katkı, and README.tr links the good first issue and new türkçe labels. Ten first issues are written in Turkish (translations of the FAQ, backup, troubleshooting and quick start guides; a Pardus test of the Linux agent; a spelling and terminology check of the panel's Turkish; a glossary; an exam mode guide for teachers; first-impression feedback on the demo; a review of the pilot school guide).
  • Backups: weekly retention. pops-backup now keeps the newest KEEP_MIN backups (3), every backup younger than KEEP_DAYS days (now 7, was 14; 0 turns the rule off) and the newest backup of each of the last KEEP_WEEKLY weeks (4), and deletes the rest. Each backup carries the agent packages ke...
Read more

v0.1.23-alpha

v0.1.23-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Oct 16:24

İ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. Pardus/Debian için pops-agent_*_all.deb (Debian 12 / Pardus 23 ve sonrası; kurulum: Agent-Linux/README.md).

For operators, in short:

  1. New in the panel:
    • Exam mode per lab: the network is limited to an allow list, with optional app blocking. It lasts at most 8 hours and ends on time even offline.
    • File transfer: send a file to PCs, or fetch one from a PC with a reason.
    • Power actions with a countdown and a note, and messages to the user with an optional read receipt.
    • winget packages in Dağıtım, with a 69-app catalogue.
    • Vision v2: several screens, adaptive quality, and clipboard in a session the user accepted.
    • Every page in English.
  2. For organisations:
    • Sign-in with Active Directory/LDAP or OpenID Connect.
    • Organisational units (district → school): admins and API tokens see only their own schools.
    • REST API v1 with tokens, GLPI export and Sistem → Modüller.
    • Optionally, several backend workers with Redis.
  3. Linux agent, first version (Pardus 23+, Debian 12, Ubuntu 24.04; one .deb):
    • It reports inventory and installed packages, runs commands, and updates itself from signed releases with rollback.
    • It has no screen view, quarantine or tray yet.
  4. Update your agents (Sistem → Güncellemeler). The new Windows agent is needed for exam mode, file transfer, winget, power actions and messages, and Vision v2. Older agents are recognised: they are skipped, or get the old shutdown command. It also:
    • shows each update stage in the panel and resumes downloads (BITS);
    • deletes logs after 30 days;
    • lets you move the log and data folders.
  5. Before updating a native server:
    • Reinstall /usr/local/sbin/pops-deploy-backend from this release first. Migration 0031 rewrites large tables, and the new script takes a database dump before it.
    • Migrations 0024–0032 run by themselves; expect a longer first start.
    • If you edited Dashboard/assets/pops_config.js, rename its global to POPS_API.
    • The lab peer cache for agent updates is off by default.

Try it without installing: https://demo.pashacore.com.tr (demo / demo, read-only). Known limitations are in the README.

Added

  • Agent: lab-local peer cache for updates. The agent announces peer_cache in X-Agent-Features and follows the server's staged rollout. It downloads an update from the peers in update_agent first, then from the server, and checks every source against the signed size and SHA-256. Only when update_agent carries "peer_cache": true (the server's "Sınıf içinde eşten dağıt" setting, off by default) does it keep the verified package in C:\POpsData\cache for 2 hours (or until the next update). It then serves it read-only to PCs in its own subnet on TCP 8817: GET/HEAD /pops-cache/<sha256> only, at most 4 transfers, firewall rule group "POps Peer Cache" (LocalSubnet, POpsAgent.exe). Nothing is served or fetched from peers during quarantine or exam mode. The downloaded stage names the source (peer <hw_id>, server, cache). capabilities reports peer_cache_enabled; PEER_CACHE_ENABLED=0 on the MSI switches it off, and the feature is then not announced.
  • Several backend workers (optional, D-26). With REDIS_URL set, the backend can run as several uvicorn workers or on several servers behind a load balancer, without sticky sessions. Off by default: a single-process install behaves as before. See docs/ha.md.
    • Shared through Redis: commands, panel broadcasts, screen frames (only to session holders), Vision messages, the device list, session grants, the online-agent registry, notification limits and login rate limits.
    • A dead worker's agents are marked Offline, and one leader runs the periodic jobs. If Redis is down, each worker keeps its own agents and panels running.
  • tools/agent_simulator.py --url A,B spreads agents over several backends, and --report-every prints the split.
  • Agent: power actions and messages to the user. The agent announces power and message in X-Agent-Features and follows the server's power and user_message schemas. power shuts the PC down, restarts it, signs the user out or locks it, after a countdown of up to 10 minutes that the tray shows on top with the administrator's note ("Bilgisayar 60 sn içinde yeniden başlatılacak"); the service keeps the time, so it also acts without the tray, and the result is sent just before acting. Lock goes through the tray (LockWorkStation) and falls back to disconnecting the console session; sign-out uses WTSLogoffSession; shutdown and restart use shutdown.exe /f. cancel_task stops a countdown. user_message shows a window with a title, a text of up to 1000 characters and an info or warning icon; with requires_ack the single result waits for the user's Tamam ([TAMAM] okundu) for up to 30 minutes. Sign-out, lock and messages need a signed-in user (otherwise exit code -6, "[REDDEDİLDİ] oturum açık kullanıcı yok"); a message while a user is signed in but the tray is not running fails with -3. Every field is checked again on the agent and the text is cleaned as on the server (control, text-direction and zero-width characters removed; title and note on one line). Both can be switched off on the PC with the new MSI properties POWER_ENABLED=0 / MESSAGE_ENABLED=0 (on by default) or by the server with set_capabilities; switching on again needs the MSI. New event log entries 1130 (power action), 1140 and 1141 (message shown and its outcome) hold only metadata, never the message text.
  • Agent: the capabilities message reports exam_enabled, power_enabled and message_enabled (optional fields in the schema), next to terminal_enabled, vision_enabled, files_enabled and server_ca.
  • Agent: log and data folders from appsettings.json. LogDirectory and DataDirectory move C:\POpsLogs and C:\POpsData, for example to a second disk; the defaults are unchanged.
    • Full local paths only: relative, network (UNC) and device paths, wildcards, alternate data streams, a drive root, the Windows, profiles and install folders, Program Files / ProgramData themselves, and folders whose parent users could replace are refused. A refused value falls back to the default with an error in the log and event 1090; the agent still starts.
    • The chosen folders get the same permissions as the defaults (no inheritance). The updater and the watchdog get the folders from the service; the MSI uses them on an upgrade or repair. Nothing is moved when the setting changes; see docs/configuration.md.
  • Organisational units (district → school). A superadmin builds a tree of units on Ayarlar → Birimler, puts labs into units, and gives users and API tokens a scope.
    • A scoped account sees and acts only on its units' devices, sub-units included.
    • The server enforces the scope on every endpoint (Backend/pops/tenancy.py), so it also holds for API tokens. Out-of-scope ids answer 404, and organisation-wide settings answer 403.
    • Covered: devices, labs, tasks, deployment and winget, file transfer, exam mode, power actions and messages, Vision, logs, inventory, reports and CSV, licences, tickets, scheduled tasks, notifications, update progress and the panel WebSocket.
    • New /api/org-units; org_scope on users and tokens; the unit name shows in the sidebar. Nothing changes until units exist. D-25, migration 0032.
  • Scopes for directory and OIDC accounts. Group mappings can carry a scope (unit ids or "all"). While units exist, a new directory or OIDC account whose mappings set no scope gets an empty scope, so it is never unscoped by accident.
  • Panel sign-in with Active Directory / LDAP and OpenID Connect (Microsoft Entra ID, Google, Keycloak …). A superadmin sets it up under Ayarlar → Güvenlik → Kimlik sağlayıcıları.
    • Directory users sign in with the usual form; with OIDC the sign-in page shows " ile giriş yap".
    • Directory groups (or OIDC group claims) map to İzleyici, Yönetici or Süper admin and to pages, and the mapping is rewritten at every sign-in. Bağlantıyı sına checks the connection and a user's resulting role before saving.
    • Users can be created as, or switched to, directory or OIDC accounts. Local accounts keep working when the directory is down.
    • Turkish how-to: docs/tr/active-directory-ile-giris.md. Migration 0030; new dependency ldap3 (pure Python). Decision D-24.
  • Power actions and messages to the user as their own agent messages (power, user_message), for agents that announce X-Agent-Features: power,message.
    • POST /api/devices/power: shut down, restart, sign out or lock, with a delay of 0–600 s and an optional note of up to 200 characters.
    • POST /api/devices/message: title, text, Bilgi/Uyarı and an optional read receipt.
    • Both are also under /api/v1. Migration 0028.
  • Panel: power and message actions.
    • New Oturumu kapat and Kilitle actions.
    • Kapat and Yeniden başlat get a Gecikme choice (Hemen / 1 dk / 5 dk / 10 dk) and a "Kullanıcıya not" field.
    • New Mesaj gönder dialog with a character counter, Bilgi/Uyarı and "Okundu onayı iste".
    • The task drawer explains -6 (nobody signed in) and -8 (the agent does not support it).
  • Lab-local peer cache for agent updates, server side. Agents that announce peer_cache (X-Agent-Features) are updated...
Read more

v0.1.22-alpha

v0.1.22-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 05 Oct 11:57

İ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.

For operators, in short:

  1. Security: the backend moves to Python 3.10+ (3.12 recommended) with current FastAPI, Starlette and python-multipart; 17 known vulnerabilities in the old dependency set are closed. On an existing AlmaLinux/RHEL 9 server, run the root block below first, then Sistem → Sunucuyu güncelle; the deploy builds a new virtual environment and rolls back on any failure.
  2. Offline panel: fonts and icons are bundled; the panel loads nothing from other hosts and works without internet.
  3. Sign-in page: your organisation's name and logo (Ayarlar → Genel → Kurum).
  4. API: a wrong target_mode, an unregistered PC or an unknown field is now refused with 422 instead of being ignored.
  5. Agents: unchanged; no agent update is needed. This is the first release with an SSH-signed tag (keys/allowed_signers).

The backend needs Python 3.10 or newer (3.12 recommended). The fixes for 17 known vulnerabilities in its dependencies, among them a multipart denial of service that /api/upload exposed without a token, are released only for newer Python versions.

Upgrading a native server on AlmaLinux/RHEL 9, whose backend venv uses the system Python 3.9: first install Python 3.12 and the new deploy scripts as root, then update the server (Sistem → Sunucuyu güncelle). The deploy then builds a new venv with python3.12, swaps it in and rolls back to the old one if the health check fails:

dnf install -y python3.12
REPO=$(. /etc/pops/deploy.conf; echo "$REPO")
git -C "$REPO" fetch --tags origin
TAG=v0.1.22-alpha
for s in pops-deploy-backend pops-selfupdate; do
    git -C "$REPO" show "$TAG:Installer/server/$s" > "/tmp/$s" && install -m 755 "/tmp/$s" "/usr/local/sbin/$s"
done

If you update without these steps, nothing breaks but the server stays on the previous release: the old deploy script runs pip in the 3.9 venv, finds no matching versions and rolls back ("deploy basarisiz"). With the new scripts but without python3.12, the deploy stops before changing anything and Sistem says to install it. Ubuntu 22.04, Debian 12 and Ubuntu 24.04 already have a new enough python3 and only need the new scripts. Docker: rebuild the backend image. Details: docs/deployment.md. The agent code is unchanged.

Added

  • Panel: the organisation's name and logo on the sign-in page. Ayarlar → Genel → Kurum sets the name and a logo (PNG, JPEG or WebP, at most 256 KB, checked by content; SVG is refused). The sign-in page shows them instead of "POps", with a small "POps · Pasha Core" line under the form; the personal links moved to the README. Only a superadmin changes them, and each change is audit-logged (GET /api/branding, GET /api/branding/logo, POST /api/system/branding, POST/DELETE /api/system/branding/logo).
  • Docker: ready-made images on GHCR. From this release on, every release also pushes ghcr.io/pashacore/pops-backend and ghcr.io/pashacore/pops-dashboard (linux/amd64, tags <version> such as 0.1.22-alpha and latest), with a build provenance attestation and an SBOM. The images are pushed only after the release itself is published, so only when the CI tests, the version check and the release approval have passed. docker compose up -d now pulls them instead of building; POPS_IMAGE_TAG in .env pins a version, and docker compose up -d --build still builds from source (docs/docker.md). Upgrading a Docker install: after git pull (or unpacking the new server package), docker compose pull && docker compose up -d switches to the published images; docker compose up -d --build keeps building locally.
  • OpenSSF Scorecard. .github/workflows/scorecard.yml rates the repository's supply-chain practices on every push to main and weekly, uploads the findings to Security → Code scanning and publishes the score shown by the new badge in README and README.tr.

Security

  • Backend dependencies updated to releases that fix known vulnerabilities. python-multipart 0.0.20 → 0.0.32 (multipart denial of service CVE-2026-40347 and CVE-2026-42561, unchecked Content-Length CVE-2026-53540, urlencoded field splitting CVE-2026-53538 and CVE-2026-53539, path traversal with non-default options CVE-2026-24486; FastAPI parses a form body before the auth dependencies run, so the denial of service on /api/upload needed no token); Starlette 0.49.3 → 1.7.0, now pinned (Host-header URL injection CVE-2026-48710 and CVE-2026-54282, form limits not applied to urlencoded bodies CVE-2026-54283, HTTPEndpoint method lookup CVE-2026-48817, StaticFiles UNC paths on Windows CVE-2026-48818); anyio 4.12.1 → 4.15.1 (CVE-2026-63374, CVE-2026-64847), click 8.1.8 → 8.5.0 (CVE-2026-7246), idna 3.13 → 3.20 (CVE-2026-45409) and python-dotenv 1.2.1 → 1.2.4 (CVE-2026-28684). FastAPI 0.128.8 → 0.142.2, uvicorn 0.39.0 → 0.54.0 and cryptography 50.0.1 → 50.0.2 come along. pip-audit reports no known vulnerability for the new requirements on Python 3.10 and 3.12, including the venv's own pip.
  • ecdsa (CVE-2024-23342, no fix) is not a backend dependency. It and python-jose were left in old venvs when 0.1.2-alpha replaced python-jose with PyJWT; nothing imports them. The venv rebuilt for Python 3.12 is a fresh install without them.

Fixed

  • Docs: known limitations in one place; tag signatures stated as they are. README and README.tr have a Known limitations section (Vision on the primary monitor only, no RDP/UAC/sign-in screen, what is checked by hand instead of in CI, one backend process, unsigned Windows binaries, DNS detection only, no API tokens, panel language). They no longer say the panel loads fonts and icons from CDNs. Release tags were not signed before; from this release on they are SSH-signed, and keys/pops_tag_signing.pub with a ready keys/allowed_signers line are in the repository (docs/self-update.md).
  • API: target_mode and unknown fields are checked. POST /api/deploy_orchestration took "lab" (lower case) as a PC name and opened a task for a PC that does not exist, which then waited for ever. The target mode is now case-insensitive and must be ALL, LAB or PC; a PC ID that is not registered is refused with 422 and nothing is created. /api/deploy_orchestration, /api/system/enroll-token and /api/system/deploy-update refuse fields they do not know (422) instead of ignoring them: {"lab": …, "expires_hours": …} used to create a 72-hour token for no lab.
  • Docs: version and install facts. README, README.tr and ROADMAP no longer name an old release as the latest (they link to the releases page), the release timeline goes up to 0.1.21, ROADMAP lists 0.1.14–0.1.21 as done, the quick start says what install.sh really sets up (nginx, PHP-FPM and HTTPS by default; TLS_MODE=none for your own web server), the release page no longer asks for the .NET 8 Desktop Runtime (the MSI carries .NET 10 since 0.1.15), and the review claims say what they are: code-level reviews requested by the maintainer, reports not published.

Changed

  • Backend: Python 3.10 or newer; 3.12 is the target (decision D-20). Backend/requirements.txt states the minimum in a # requires-python: >=3.10 line and pins Starlette and the indirect dependencies above, because pip install -r does not upgrade an indirect dependency that still satisfies its lower bound. Startup and shutdown run in a lifespan handler: Starlette 1.0 removed on_event.
  • Server: pops-deploy-backend rebuilds the venv when its Python is too old. It builds a new venv next to the old one with the first of python3.12, python3.11, python3.10 and python3 that is new enough (<app>/venv-py<version>-<id>, with current pip), installs the requirements there while the service keeps running, and makes <app>/venv a symbolic link to it. On any later failure the rollback puts the old venv back; after a successful health check the old venv is deleted and its snapshot stays with the code backup. Without a suitable interpreter it stops with exit code 3 before changing anything, and pops-selfupdate writes "python3.12 kurun" to the status shown in Sistem.
  • Server: install.sh picks Python 3.10 or newer (the newest of python3.12, python3.11, python3.10, then python3), installs python3.12 with dnf when none is present (AlmaLinux/RHEL 9), and refuses older versions with instructions.
  • CI: the backend, migration, backup, integration and signing jobs run on Python 3.12; the backend job also runs the import check and unit tests on 3.10, the minimum. The release workflow signs on 3.12. Dependabot no longer holds back releases that need Python 3.10.
  • Panel: no third-party assets; works without internet. The fonts (Inter, JetBrains Mono) are bundled with the panel (Dashboard/assets/vendor/fonts, SIL OFL, how they were built is in the README there) and every icon comes from the panel's own icon set; Google Fonts and Font Awesome from cdnjs are no longer loaded. On a school network that blocks CDNs, or with no internet at all, the panel looks the same: icons such as the magnifier in search fields, the close buttons of windows and the empty-list icons no longer disappear. The administrator's browser no longer contacts Google or Cloudflare while using the panel, so the admin's IP address is not sent to them. The "Yetkisiz Erişim" page now shows its lock icon.
  • ...
Read more

v0.1.21-alpha

v0.1.21-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Oct 20:02

İ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.

Sistem → Genel bakış shows charts for the last 24 hours, 7 days or 30 days: agents, processor and memory, API requests, tasks, events, and database and disk.

Upgrading: update the server (Sistem → Sunucuyu güncelle). Migration 0021 adds the server_metrics table; the charts fed by the server's own samples start filling within a few minutes. The agent code is unchanged.

Added

  • Panel: charts on Sistem → Genel bakış. Under the status tiles, Eğilimler shows the last 24 hours, 7 days or 30 days: connected agents (with the agent updates of the period), processor and memory, API requests with server errors, task results, events by risk level, and database size with disk use. Hovering a point shows its time and values. The server samples itself once a minute into a new server_metrics table, kept for 30 days (GET /api/system/overview, superadmin).

Changed

  • The status tiles on Genel bakış are laid out in full rows (1, 2, 4 or 8 per row, depending on the width).

v0.1.20-alpha

v0.1.20-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Oct 15:59

İ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.

Sistem and Ayarlar are grouped into tabs, and Sistem opens on an overview of every card's state; right after an update Sistem no longer shows the previous GitHub release.

Upgrading: update the server (Sistem → Sunucuyu güncelle). No migration; the agent code is unchanged.

Changed

  • Panel: Sistem and Ayarlar in tabs. Sistem opens on Genel bakış, one tile per card with its current state; a click opens the tab that holds it (Güncellemeler, Güvenlik, Sağlık ve yedek, Bildirimler ve saklama). Ayarlar has Kullanıcılar, Güvenlik and Genel. The open tab is kept in the address (?tab=), so a link opens the same tab.

Fixed

  • Sistem showed an older GitHub release than the running version right after an update (for example "v0.1.18 · Çalışan sürümle aynı" on 0.1.19): the server kept the release it had fetched for an hour. A cached release older than the running version is now fetched again (at most every 2 minutes), and the label says "Çalışan sürüm daha yeni" when the running version is ahead.

v0.1.19-alpha

v0.1.19-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Oct 13:41

İ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.

Kayıtlar shows the event log in pages with a filter panel and searches a whole date range on the server; Kontrol merkezi is laid out in two balanced columns; the Apache rules for addresses without .php ship as an example file.

Upgrading: update the server (Sistem → Sunucuyu güncelle). No migration; the agent code is unchanged. On Apache, compare Dashboard/.htaccess with Installer/server/apache-htaccess.example (docs/deployment.md).

Added

  • Panel: Kayıtlar in pages, with more filters. The event list shows 25, 50, 75 or 100 entries per page (remembered in the browser) with page numbers and "1–25 / 312 kayıt". A Süzgeçler panel filters by event type, lab, person and date range; active filters are chips that remove them one by one. A date range or a PC asks the server for that whole range instead of searching only the latest 1000 entries (GET /api/logs accepts pc, since and until).

Fixed

  • Panel: Kontrol merkezi is balanced. Two columns that start and end together: Son etkinlik takes the height of the cards on the right and scrolls inside, the cards on the right stack (İlgilenmen gerekenler, Bugün, Sınıflar, Ajan sürümleri, Sunucu) with the same row heights, and a failure reason lines up with the result on its right. The separate bottom row with cards of different heights is gone.
  • Panel: addresses without .php on Apache servers. 0.1.18 changed the panel's links but the rules that map them live in Dashboard/.htaccess, which is not tracked in the repository, so an update did not bring them and every link answered "Not Found". The rules are now shipped as Installer/server/apache-htaccess.example; on Apache, copy it to Dashboard/.htaccess (docs/deployment.md). Docker and nginx installs were not affected.

v0.1.18-alpha

v0.1.18-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 03 Oct 13:10

İ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 panel's addresses no longer end in .php, and Kontrol merkezi shows the PCs' events next to the jobs, plus the server, agent versions and today's numbers.

Upgrading: update the server (Sistem → Sunucuyu güncelle). No migration; the agent code is unchanged. Docker and nginx installs: rebuild the dashboard image or reload nginx with the new template to get the addresses without .php (the .php addresses keep working until then).

Changed

  • Panel: addresses without .php. Pages are /devices, /labs, /tasks?job=… and the overview is /. Dashboard/.htaccess, the Docker Apache configuration (now with mod_rewrite) and the nginx templates map them to the PHP files; old .php addresses and bookmarks keep working, and on Apache a GET to one is redirected to the address without .php.
  • Panel: Kontrol merkezi shows more. Son etkinlik is one feed of jobs and events from the PCs (logons, blocked sites, quarantine, update results; filter Tümü / İşlemler / Olaylar), using the same readable titles and honest levels as Kayıtlar (both pages now share them). A new bottom row shows Sunucu (status, database, version, update, device keys), Ajan sürümleri (PCs per agent version) and Bugün (jobs, failed jobs, logons, blocked sites, warnings). The separate Son sinyaller card is folded into the feed.

v0.1.17-alpha

v0.1.17-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Oct 22:25

İ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.

Fixes from the first day of the new panel: a PC's recent operations load after switching PCs, tooltips are no longer cut off, and a command the PC refused shows as refused.

Upgrading: update the server (Sistem → Sunucuyu güncelle; migration 0020). The agent code is unchanged; updating agents is optional.

Fixed

  • Panel: "Son işlemler" stays on "Yükleniyor…" no more. Clicking another PC while the detail panel was open ran the old PC's close step after the new PC was set, which cleared it, so its recent operations never appeared. The same order cleared the selected job on İşlemler (its retry and cancel buttons then did nothing) and the selected row on Cihazlar, Sınıflar and the hardware tab of Kayıtlar.
  • Panel: tooltips are no longer cut off and no longer shift the page. They were drawn inside the element, so inside a table they were clipped and added a scroll bar that moved the rows. They now float above the page and stay inside the window.
  • Server: a command the PC refused is "Reddedildi", not "Tamamlandı". An agent with remote commands turned off answers with [REDDEDİLDİ] … and no exit code; when its separate refusal message was missing (or the server was older) the task was stored as completed. Such results are now Denied with exit code -5, and migration 0020 corrects the tasks stored before.

v0.1.16-alpha

v0.1.16-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Oct 21:58

İ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 panel is redesigned: one calm layout on every page, one action bar per page instead of buttons on every row and desk, details in a panel that opens on click, and every operation shows who sent it, when, from which page, to which PCs, the result and, when it failed or was refused, why. Anything sent to PCs shows its progress in a job center at the bottom of the sidebar.

Upgrading: update the server (Sistem → Sunucuyu güncelle; migration 0019). The agent code is unchanged; the 0.1.16-alpha agent package is the same build with the new version number, so updating agents is optional.

Added

  • Panel: sidebar, search and job center. A dark sidebar with grouped pages (Cihazlar, İşlem, Yönetim, Sunucu) replaces the top bar; notifications moved to its bottom. Ctrl+K searches pages, devices and labs and opens the device's detail panel. The job center ("N işlem sürüyor") follows every request that creates tasks (task_ids, POST /api/tasks/status) with a segmented progress bar per job, names the PCs that failed and ends with one toast.
  • Panel: device detail panel. Clicking a PC on Sınıflar, Cihazlar or in search opens the same right-hand panel: status, user, foreground app, lab, IP/MAC, agent, memory, last seen, last disconnect reason, problems (quarantine, outdated agent, agent errors, remote command/screen off), the last operations with who, when, page, result and reason, and the actions (screen, command, power, message, rename, move, teacher PC, quarantine, offline unlock code, delete).
  • Server: tasks carry their context. Tasks store a readable title, the panel page they came from, the reason, the caller's IP and a job id shared by all tasks of one request (migration 0019); POST /api/deploy_orchestration accepts the optional title, source and reason, a retry keeps title and reason. New GET /api/devices/{pc_name}/activity: a PC's recent tasks and remote-screen sessions.
  • Server: who changed the agent policy. Saving the policy records who and when (GET /api/agent_policies/meta) and writes a policy_update entry to the audit chain; Politikalar shows it.
  • Panel: message to the logged-in user of one PC, a selection or a lab (Windows msg, shown for 2 minutes).

Changed

  • Panel: every page rebuilt in one tone. Page names follow the sidebar: Kontrol merkezi, Cihazlar, Sınıflar, İşlemler, Uzak komut, Uzak ekran, Dağıtım, Politikalar, Kayıtlar, Raporlar, Destek talepleri, Ayarlar, Sistem.
    • Sınıflar: the labs are listed under Sınıflar in the sidebar, Atanmamış collects new PCs. One action bar acts on the whole lab or on the selected desks (click the circle, Ctrl/Cmd+click, Ctrl+A); desks show name, user and a status icon, problems as a small mark with a tooltip. Layout editing is drag and drop and is saved on every drop (it never worked before: the drag library was not loaded).
    • Cihazlar: a sortable table with status, lab and agent filters, CSV export and the same action bar; no buttons on rows.
    • İşlemler: tasks are grouped into jobs (one request = one job) with progress, sender, page, reason and the PCs' results; a job opens with retry, pause, resume and cancel and each PC's output and exit code. Scheduled tasks are a tab.
    • Kontrol merkezi: four clickable figures (online, problem PCs, running jobs, current agents), recent activity with who/when/where/result/reason, things that need attention, labs and recent signals with honest levels (logons are "Bilgi").
    • Uzak komut: targets a PC, a lab or the PCs selected on Sınıflar/Cihazlar, warns before sending about PCs that are off or have remote commands disabled, quick commands in one menu, command history.
    • Kayıtlar, Raporlar, Dağıtım, Destek talepleri, Politikalar, Ayarlar, Sistem, Uzak ekran: same layout and detail panels; see docs/dashboard.md.
  • Panel: confirmations name the target and count ("3 bilgisayar yeniden başlatılsın mı?" / "3 bilgisayarı yeniden başlat"); shutdown and restart skip PCs that are off and say how many.
  • Tools: the HTML sink checker treats calls of …Html methods (POps.iconHtml(…)) as ready HTML (their definitions are checked) and the panel's pops_icon() as safe PHP output.

v0.1.15-alpha

v0.1.15-alpha Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Oct 15:45

İ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, ...

Read more