summaryrefslogtreecommitdiff
path: root/raveos-updater
diff options
context:
space:
mode:
authorNippy <nippy@Nippy-Mac-mini.local>2026-09-19 18:04:27 +0200
committerNippy <nippy@Nippy-Mac-mini.local>2026-09-19 18:04:27 +0200
commit3eb87a14e133b266ab8d8c634dda3af312474f1f (patch)
tree098ea50e2f159b654f3729c69facc6805556813e /raveos-updater
parentf176110ce0e65756967db40ba2a3fc7d1daa2825 (diff)
downloadRaveOS-PKGBUILD-3eb87a14e133b266ab8d8c634dda3af312474f1f.tar.gz
RaveOS-PKGBUILD-3eb87a14e133b266ab8d8c634dda3af312474f1f.zip
new user settings
Diffstat (limited to 'raveos-updater')
-rw-r--r--raveos-updater/PKGBUILD28
-rw-r--r--raveos-updater/check.py83
-rw-r--r--raveos-updater/raveos-updater164
-rw-r--r--raveos-updater/raveos-updater.desktop12
-rw-r--r--raveos-updater/raveos-updater.hook11
-rw-r--r--raveos-updater/raveos-updater.install20
-rw-r--r--raveos-updater/raveos-updater.service6
-rw-r--r--raveos-updater/raveos-updater.timer10
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