127 lines
3.4 KiB
QML
127 lines
3.4 KiB
QML
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import qs.Commons
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property var pluginApi: null
|
|
|
|
readonly property url updaterJson: Qt.resolvedUrl("file://" + Settings.configDir + "/plugins/update-count/updaterConfigs.json")
|
|
readonly property int minutesToMillis: 60_000
|
|
|
|
readonly property int updateIntervalMinutes: pluginApi?.pluginSettings.updateIntervalMinutes || pluginApi?.manifest?.metadata.defaultSettings?.updateIntervalMinutes || 30
|
|
readonly property string updateTerminalCommand: pluginApi?.pluginSettings.updateTerminalCommand || pluginApi?.manifest?.metadata.defaultSettings?.updateTerminalCommand || ""
|
|
|
|
property int updateCount: 0
|
|
property var updater: null
|
|
property var customUpdater: ({
|
|
name: "custom",
|
|
cmdGetNumUpdates: pluginApi?.pluginSettings.customCmdGetNumUpdates || "",
|
|
cmdDoSystemUpdate: pluginApi?.pluginSettings.customCmdDoSystemUpdate || ""
|
|
})
|
|
|
|
//
|
|
// ------ Initialization ------
|
|
//
|
|
property var updaters: []
|
|
property int checkIndex: 0
|
|
property var current: null
|
|
|
|
FileView {
|
|
id: updaterFile
|
|
path: root.updaterJson
|
|
|
|
onLoaded: {
|
|
try {
|
|
root.updaters = JSON.parse(updaterFile.text());
|
|
root.runAllCmdChecks();
|
|
} catch (e) {
|
|
Logger.e("UpdateCount", "JSON Error in", root.updaterJson, ":", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
function runAllCmdChecks() {
|
|
if (!root.updaters || root.updaters.length === 0) {
|
|
return;
|
|
}
|
|
|
|
root.checkIndex = 0;
|
|
root.checkNext();
|
|
}
|
|
|
|
function checkNext() {
|
|
if (root.checkIndex >= root.updaters.length) {
|
|
startGetNumUpdates();
|
|
return;
|
|
}
|
|
|
|
root.current = root.updaters[root.checkIndex++];
|
|
cmdCheckProc.command = ["sh", "-c", root.current.cmdCheck];
|
|
cmdCheckProc.running = true;
|
|
}
|
|
|
|
Process {
|
|
id: cmdCheckProc
|
|
|
|
onExited: function (exitCode, exitStatus) {
|
|
if (exitCode === 0) {
|
|
root.updater = root.current
|
|
Logger.i("UpdateCount", `Initialization finished. Detected updater: ${root.updater.name}.`);
|
|
root.startGetNumUpdates()
|
|
} else {
|
|
root.checkNext();
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// ------ Get number of updates ------
|
|
//
|
|
Timer {
|
|
id: timerGetNumUpdates
|
|
|
|
interval: root.updateIntervalMinutes * root.minutesToMillis
|
|
running: true
|
|
repeat: true
|
|
onTriggered: root.startGetNumUpdates()
|
|
}
|
|
|
|
function startGetNumUpdates() {
|
|
const cmd = root.customUpdater.cmdGetNumUpdates || root.updater.cmdGetNumUpdates || "exit 1"
|
|
getNumUpdates.command = ["sh", "-c", cmd]
|
|
getNumUpdates.running = true;
|
|
}
|
|
|
|
Process {
|
|
id: getNumUpdates
|
|
|
|
stdout: StdioCollector {
|
|
onStreamFinished: {
|
|
var count = parseInt(text.trim());
|
|
root.updateCount = isNaN(count) ? -1 : count;
|
|
if (root.updateCount >= 0) {
|
|
Logger.i("UpdateCount", `Updates available: ${root.updateCount}`);
|
|
} else {
|
|
Logger.e("UpdateCount", `getNumUpdates return '${text.trim()}' cannot be parsed into int`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// ------ Start update ------
|
|
//
|
|
function startDoSystemUpdate() {
|
|
const cmd = root.customUpdater.cmdDoSystemUpdate || root.updater.cmdDoSystemUpdate || "echo 'No update cmd found.'"
|
|
const term = root.updateTerminalCommand.trim();
|
|
|
|
const fullCmd = (term.indexOf("{}") !== -1) ? term.replace("{}", cmd) : term + " " + cmd;
|
|
|
|
Quickshell.execDetached(["sh", "-c", fullCmd]);
|
|
Logger.i("UpdateCount", `Executed update command: ${fullCmd}`);
|
|
}
|
|
}
|