diff options
| author | Nippy <nippy@Nippy-Mac-mini.local> | 2026-09-19 18:04:27 +0200 |
|---|---|---|
| committer | Nippy <nippy@Nippy-Mac-mini.local> | 2026-09-19 18:04:27 +0200 |
| commit | 3eb87a14e133b266ab8d8c634dda3af312474f1f (patch) | |
| tree | 098ea50e2f159b654f3729c69facc6805556813e /raveos-updater | |
| parent | f176110ce0e65756967db40ba2a3fc7d1daa2825 (diff) | |
| download | RaveOS-PKGBUILD-3eb87a14e133b266ab8d8c634dda3af312474f1f.tar.gz RaveOS-PKGBUILD-3eb87a14e133b266ab8d8c634dda3af312474f1f.zip | |
new user settings
Diffstat (limited to 'raveos-updater')
| -rw-r--r-- | raveos-updater/PKGBUILD | 28 | ||||
| -rw-r--r-- | raveos-updater/check.py | 83 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater | 164 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater.desktop | 12 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater.hook | 11 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater.install | 20 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater.service | 6 | ||||
| -rw-r--r-- | raveos-updater/raveos-updater.timer | 10 |
8 files changed, 334 insertions, 0 deletions
diff --git a/raveos-updater/PKGBUILD b/raveos-updater/PKGBUILD new file mode 100644 index 0000000..6bb6622 --- /dev/null +++ b/raveos-updater/PKGBUILD @@ -0,0 +1,28 @@ +# Maintainer: nippy <nippy@tuta.io> + +pkgname=raveos-updater +pkgver=1.0.0 +pkgrel=1 +pkgdesc="RaveOS update checker background service and tray indicator" +arch=('any') +url="https://git.rp1.hu/RaveOS" +license=('GPL') +depends=('python' 'python-pyqt6' 'pacman') +install="${pkgname}.install" +source=() +sha256sums=() + +package() { + install -Dm755 "${startdir}/check.py" \ + "${pkgdir}/usr/lib/raveos-updater/check.py" + install -Dm755 "${startdir}/raveos-updater" \ + "${pkgdir}/usr/bin/raveos-updater" + install -Dm644 "${startdir}/raveos-updater.service" \ + "${pkgdir}/usr/lib/systemd/system/raveos-updater.service" + install -Dm644 "${startdir}/raveos-updater.timer" \ + "${pkgdir}/usr/lib/systemd/system/raveos-updater.timer" + install -Dm644 "${startdir}/raveos-updater.hook" \ + "${pkgdir}/usr/share/libalpm/hooks/raveos-updater.hook" + install -Dm644 "${startdir}/raveos-updater.desktop" \ + "${pkgdir}/etc/xdg/autostart/raveos-updater.desktop" +} diff --git a/raveos-updater/check.py b/raveos-updater/check.py new file mode 100644 index 0000000..79a0ba3 --- /dev/null +++ b/raveos-updater/check.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""RaveOS frissítés-ellenőrző. + +A raveos-core-repo szinkron adatbázisából kiolvassa a RaveOS saját +csomagjainak legfrissebb verzióját, összeveti a telepített verziókkal, +és a /var/lib/raveos-updater/status.json fájlba írja az eredményt. + +Használat: + check.py # pacman -Sy után ellenőriz (root; a systemd timer hívja) + check.py --no-sync # nem szinkronizál, a meglévő DB-t használja (pacman hook) +""" + +import json +import os +import subprocess +import sys +from datetime import datetime + +REPO = "raveos-core-repo" +STATUS_DIR = "/var/lib/raveos-updater" +STATUS_FILE = os.path.join(STATUS_DIR, "status.json") + + +def run(args): + return subprocess.run(args, capture_output=True, text=True) + + +def main(): + sync = "--no-sync" not in sys.argv[1:] + error = None + + if sync: + r = run(["pacman", "-Sy", "--noconfirm"]) + if r.returncode != 0: + error = "sync failed" + + installed = {} + repo = {} + + try: + for line in run(["pacman", "-Q"]).stdout.splitlines(): + name, _, version = line.partition(" ") + if version: + installed[name] = version + + for line in run(["pacman", "-Sl", REPO]).stdout.splitlines(): + parts = line.split() + if len(parts) >= 3: + repo[parts[1]] = parts[2] + except FileNotFoundError: + error = "pacman not found" + + updates = [] + for name, newver in sorted(repo.items()): + oldver = installed.get(name) + if oldver is None: + continue + r = run(["vercmp", newver, oldver]) + try: + newer = int(r.stdout.strip()) > 0 + except (ValueError, AttributeError): + continue + if newer: + updates.append({"name": name, "old": oldver, "new": newver}) + + status = { + "count": len(updates), + "checked": datetime.now().astimezone().isoformat(timespec="seconds"), + "updates": updates, + } + if error: + status["error"] = error + + os.makedirs(STATUS_DIR, exist_ok=True) + tmp = STATUS_FILE + ".tmp" + with open(tmp, "w", encoding="utf-8") as f: + json.dump(status, f, ensure_ascii=False, indent=2) + os.replace(tmp, STATUS_FILE) + os.chmod(STATUS_FILE, 0o644) + + +if __name__ == "__main__": + main() diff --git a/raveos-updater/raveos-updater b/raveos-updater/raveos-updater new file mode 100644 index 0000000..769da64 --- /dev/null +++ b/raveos-updater/raveos-updater @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +"""RaveOS Update Indicator — tálca-jelző. + +Önálló (DE-független) tálca-alkalmazás. A /var/lib/raveos-updater/status.json +fájlt olvassa, amit a háttérszolgáltatás (check.py + systemd timer) állít elő. +A jobb felső tálcán egy ikon mutatja, ha van elérhető RaveOS frissítés. + +Első verzió: GNOME (Qt6 SNI tálca az AppIndicator kiegészítővel). +Később Plasma/Hyprland/COSMIC is ugyanezt a status.json-t használja. +""" + +import json +import os +import shlex +import shutil +import subprocess +import sys + +from PyQt6.QtCore import Qt, QTimer +from PyQt6.QtGui import QAction, QBrush, QColor, QFont, QIcon, QPainter, QPen, QPixmap +from PyQt6.QtWidgets import QApplication, QMenu, QSystemTrayIcon + +STATUS_FILE = "/var/lib/raveos-updater/status.json" +CHECK_CMD = "/usr/lib/raveos-updater/check.py" +APP_NAME = "RaveOS Update Indicator" + + +def read_status(): + try: + with open(STATUS_FILE, encoding="utf-8") as f: + return json.load(f) + except Exception: + return None + + +def make_icon(count): + pm = QPixmap(64, 64) + pm.fill(Qt.GlobalColor.transparent) + p = QPainter(pm) + p.setRenderHint(QPainter.RenderHint.Antialiasing) + + if count: + p.setBrush(QBrush(QColor("#23e06b"))) + p.setPen(QPen(QColor("#12833c"), 3)) + else: + p.setBrush(QBrush(QColor("#5a5a5a"))) + p.setPen(QPen(QColor("#3a3a3a"), 3)) + p.drawEllipse(6, 6, 52, 52) + + p.setPen(QColor("#ffffff")) + if count: + font = QFont() + font.setBold(True) + font.setPixelSize(30) + p.setFont(font) + p.drawText(pm.rect(), Qt.AlignmentFlag.AlignCenter, str(count) if count < 100 else "99") + else: + pen = QPen(QColor("#ffffff"), 7) + pen.setCapStyle(Qt.PenCapStyle.RoundCap) + pen.setJoinStyle(Qt.PenJoinStyle.RoundJoin) + p.setPen(pen) + p.drawLine(18, 33, 28, 43) + p.drawLine(28, 43, 47, 20) + p.end() + return QIcon(pm) + + +def spawn_terminal(cmd): + candidates = [ + ["kgx", "-e", "bash", "-c", cmd], + ["gnome-terminal", "--", "bash", "-c", cmd], + ["konsole", "-e", "bash", "-c", cmd], + ["xterm", "-e", "bash", "-c", cmd], + ] + for c in candidates: + if shutil.which(c[0]): + subprocess.Popen(c, start_new_session=True) + return True + return False + + +class Updater: + def __init__(self, app): + self.app = app + self.tray = QSystemTrayIcon() + self.tray.setToolTip(APP_NAME) + self.menu = QMenu() + self.tray.setContextMenu(self.menu) + self.refresh() + self.tray.show() + # Qt6 SNI: a tálca-ikon regisztrációjához legalább egy esemény-hurok + # iteráció kell, különben GNOME-on nem jelenik meg az ikon. + self.app.processEvents() + + self.timer = QTimer() + self.timer.timeout.connect(self.refresh) + self.timer.start(60_000) + + def refresh(self): + st = read_status() + self.menu.clear() + + if st is None: + self.tray.setIcon(make_icon(0)) + self._add("RaveOS állapot ismeretlen", enabled=False) + self._add("(az ellenőrzés még nem futott le)", enabled=False) + elif st.get("error"): + self.tray.setIcon(make_icon(0)) + self._add("RaveOS ellenőrzés sikertelen", enabled=False) + self._add(st["error"], enabled=False) + else: + count = st.get("count", 0) + self.tray.setIcon(make_icon(count)) + if count: + self._add(f"{count} RaveOS frissítés elérhető", enabled=False) + self.tray.setToolTip(f"{APP_NAME}: {count} frissítés elérhető") + self.menu.addSeparator() + for u in st.get("updates", []): + self._add(f"{u['name']} {u['old']} → {u['new']}", enabled=False) + else: + self._add("RaveOS naprakész", enabled=False) + self.tray.setToolTip(f"{APP_NAME}: naprakész") + checked = st.get("checked", "") + if checked: + self._add("Ellenőrizve: " + checked.replace("T", " ")[:16], enabled=False) + + self.menu.addSeparator() + self._add("Frissítés most", self._update_now) + self._add("Ellenőrzés most", self._check_now) + self._add("Kilépés", self.app.quit) + + def _add(self, text, callback=None, enabled=True): + act = QAction(text, self.menu) + act.setEnabled(enabled) + if callback: + act.triggered.connect(callback) + self.menu.addAction(act) + return act + + def _update_now(self): + spawn_terminal("rave upgrade; exec bash") + + def _check_now(self): + if shutil.which("pkexec"): + subprocess.Popen(["pkexec", CHECK_CMD], start_new_session=True) + else: + subprocess.Popen(["sudo", CHECK_CMD], start_new_session=True) + + +def main(): + app = QApplication(sys.argv) + app.setApplicationName(APP_NAME) + app.setQuitOnLastWindowClosed(False) + + if not QSystemTrayIcon.isSystemTrayAvailable(): + print("RaveOS Update Indicator: nincs elérhető tálca (SNI) a jelenlegi környezetben.", + file=sys.stderr) + + Updater(app) + sys.exit(app.exec()) + + +if __name__ == "__main__": + main() diff --git a/raveos-updater/raveos-updater.desktop b/raveos-updater/raveos-updater.desktop new file mode 100644 index 0000000..501f8c7 --- /dev/null +++ b/raveos-updater/raveos-updater.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Type=Application +Name=RaveOS Update Indicator +Name[hu]=RaveOS Frissítésjelző +Comment=Shows when RaveOS package updates are available +Comment[hu]=Jelzi, ha elérhető RaveOS frissítés +Exec=/usr/bin/raveos-updater +Icon=raveos-updater +Terminal=false +NoDisplay=true +X-GNOME-Autostart-enabled=true +StartupNotify=false diff --git a/raveos-updater/raveos-updater.hook b/raveos-updater/raveos-updater.hook new file mode 100644 index 0000000..ebc1583 --- /dev/null +++ b/raveos-updater/raveos-updater.hook @@ -0,0 +1,11 @@ +[Trigger] +Operation = Install +Operation = Upgrade +Operation = Remove +Type = Package +Target = * + +[Action] +Description = Refreshing RaveOS update status +When = PostTransaction +Exec = /usr/lib/raveos-updater/check.py --no-sync diff --git a/raveos-updater/raveos-updater.install b/raveos-updater/raveos-updater.install new file mode 100644 index 0000000..f2993fd --- /dev/null +++ b/raveos-updater/raveos-updater.install @@ -0,0 +1,20 @@ +_enable() { + if command -v systemctl >/dev/null 2>&1; then + systemctl daemon-reload >/dev/null 2>&1 || true + systemctl enable --now raveos-updater.timer >/dev/null 2>&1 || true + fi +} + +post_install() { + _enable +} + +post_upgrade() { + _enable +} + +pre_remove() { + if command -v systemctl >/dev/null 2>&1; then + systemctl disable --now raveos-updater.timer >/dev/null 2>&1 || true + fi +} diff --git a/raveos-updater/raveos-updater.service b/raveos-updater/raveos-updater.service new file mode 100644 index 0000000..118c71e --- /dev/null +++ b/raveos-updater/raveos-updater.service @@ -0,0 +1,6 @@ +[Unit] +Description=RaveOS update check service + +[Service] +Type=oneshot +ExecStart=/usr/lib/raveos-updater/check.py diff --git a/raveos-updater/raveos-updater.timer b/raveos-updater/raveos-updater.timer new file mode 100644 index 0000000..9ab66a9 --- /dev/null +++ b/raveos-updater/raveos-updater.timer @@ -0,0 +1,10 @@ +[Unit] +Description=RaveOS update check timer + +[Timer] +OnBootSec=5min +OnUnitActiveSec=2h +Persistent=true + +[Install] +WantedBy=timers.target |