Skip to content

Commit

Permalink
Refactor scheduled task handling and update version references in var…
Browse files Browse the repository at this point in the history
…ious files
  • Loading branch information
T-REX-XP committed Feb 21, 2025
1 parent f7b25fa commit 53fe81f
Show file tree
Hide file tree
Showing 19 changed files with 694 additions and 704 deletions.
28 changes: 4 additions & 24 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -69,30 +69,10 @@ rr-manager_extra_install:
install -m 755 -d $(STAGING_DIR)/app/images/
install -m 755 -d $(STAGING_DIR)/app/images/1x

install -m 755 src/scripts/checkUpdateStatus.cgi $(STAGING_DIR)/app/scripts/checkUpdateStatus.cgi
install -m 755 src/scripts/getAddons.cgi $(STAGING_DIR)/app/scripts/getAddons.cgi
install -m 755 src/scripts/getAvailableUpdates.cgi $(STAGING_DIR)/app/scripts/getAvailableUpdates.cgi
install -m 755 src/scripts/getConfig.cgi $(STAGING_DIR)/app/scripts/getConfig.cgi
install -m 755 src/scripts/getModules.cgi $(STAGING_DIR)/app/scripts/getModules.cgi
install -m 755 src/scripts/getNetworkInfo.cgi $(STAGING_DIR)/app/scripts/getNetworkInfo.cgi
install -m 755 src/scripts/getRrReleaseInfo.cgi $(STAGING_DIR)/app/scripts/getRrReleaseInfo.cgi
install -m 755 src/scripts/readUpdateFile.cgi $(STAGING_DIR)/app/scripts/readUpdateFile.cgi
install -m 755 src/scripts/uploadConfigFile.cgi $(STAGING_DIR)/app/scripts/uploadConfigFile.cgi
install -m 755 src/scripts/uploadUpdateFileInfo.cgi $(STAGING_DIR)/app/scripts/uploadUpdateFileInfo.cgi

install -m 644 src/app/alias.syno-app-portal.RRM.conf $(STAGING_DIR)/app/alias.syno-app-portal.RRM.conf
install -m 644 src/app/config $(STAGING_DIR)/app/config
install -m 755 src/app/config.txt $(STAGING_DIR)/app/config.txt
install -m 644 src/app/helptoc.conf $(STAGING_DIR)/app/helptoc.conf
install -m 644 src/app/index.conf $(STAGING_DIR)/app/index.conf
install -m 755 src/app/install.sh $(STAGING_DIR)/app/install.sh
install -m 644 src/app/rr-manager.js $(STAGING_DIR)/app/rr-manager.js
install -m 644 src/app/rr-manager.widget.js $(STAGING_DIR)/app/rr-manager.widget.js
install -m 755 src/app/style.css $(STAGING_DIR)/app/style.css

install -m 755 src/images/1x/cate_icn_addons.png $(STAGING_DIR)/app/images/1x/cate_icn_addons.png
install -m 755 src/images/1x/cate_icn_overview.png $(STAGING_DIR)/app/images/1x/cate_icn_overview.png
install -m 755 src/images/1x/cate_icn_setting.png $(STAGING_DIR)/app/images/1x/cate_icn_setting.png
install -m 755 src/scripts/* $(STAGING_DIR)/app/scripts/
install -m 644 src/app/config $(STAGING_DIR)/app/
install -m 644 src/app/*.* $(STAGING_DIR)/app/
install -m 755 src/images/1x/* $(STAGING_DIR)/app/images/1x/

install -m 755 src/app/tasks.sql $(STAGING_DIR)/app/tasks.sql

Expand Down
1 change: 0 additions & 1 deletion src/app/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ echo "DELETE FROM task WHERE task_name='SetRootPrivsToRrManager'" | sqlite3 /usr
echo "DELETE FROM task WHERE task_name='RunRrUpdate'" | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db
echo "DELETE FROM task WHERE task_name='ApplyRRConfig'" | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db
# add new tasks
cat /var/packages/rr-manager/target/app/tasks.sql | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db
echo "DELETE FROM task WHERE task_name='SetRootPrivsToRrManager'" | sqlite3 /usr/syno/etc/esynoscheduler/esynoscheduler.db
#Add sudoers for loader disk
echo -e "sc-rr-manager ALL=(ALL) NOPASSWD: /usr/bin/rr-loaderdisk.sh mountLoaderDisk\nsc-rr-manager ALL=(ALL) NOPASSWD: /usr/bin/rr-loaderdisk.sh unmountLoaderDisk" | tee /etc/sudoers.d/99-rr-loaderdisk /etc.defaults/sudoers.d/99-rr-loaderdisk > /dev/null
Expand Down
27 changes: 3 additions & 24 deletions src/app/rr-manager.widget.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,29 +35,8 @@ Ext.define("SYNOCOMMUNITY.RRManager.Widget", {
await this.startPolling();
}
},
runScheduledTask: function (taskName) {
that = this;
return new Promise((resolve, reject) => {
let params = {
task_name: taskName
};
let args = {
api: 'SYNO.Core.EventScheduler',
method: 'run',
version: 1,
params: params,
stop_when_error: false,
mode: 'sequential',
callback: function (success, message) {
success ? resolve(message) : reject('Unable to get packages!');
}
};
that.sendWebAPI(args);
});
},
startPolling: async function () {
const self = this;
self.runScheduledTask('MountLoaderDisk');
const rrRR = await this.checkRRVersion();
const rrConf = await this.getRRConf();
let rr_health_status = rrConf.rr_health == 'healthy' ? this.TYPE_NORMAL : this.TYPE_ATTENTION;
Expand All @@ -69,7 +48,7 @@ Ext.define("SYNOCOMMUNITY.RRManager.Widget", {
self.packages = await self.getPackagesList();
const rrManagerPackage = self?.packages?.packages?.find(package => package.id == 'rr-manager');
self.versionInfo = {
rr_version: rrConf?.rr_version,
rr_loader_version: rrConf?.rr_version.LOADERVERSION,
rr_manager_version: rrManagerPackage?.version,
rr_update_version: rrRR.tag
};
Expand Down Expand Up @@ -327,7 +306,7 @@ Ext.define("SYNOCOMMUNITY.RRManager.Widget", {
name: "rrVerison",
id: "rrVerison",
xtype: "box",
html: String.format('<p ext:qtip="{1}" class="syno-sysinfo-system-health-south-data">{0}</p>', versionInfo.rr_version, Ext.util.Format.htmlEncode(versionInfo.rr_version))
html: String.format('<p ext:qtip="{1}" class="syno-sysinfo-system-health-south-data">{0}</p>', versionInfo.rr_loader_version, Ext.util.Format.htmlEncode(versionInfo.rr_loader_version))
},
{
xtype: "box",
Expand All @@ -339,7 +318,7 @@ Ext.define("SYNOCOMMUNITY.RRManager.Widget", {
html: String.format('<p ext:qtip="{1}" class="syno-sysinfo-system-health-south-data">{0}</p>', versionInfo.rr_manager_version, Ext.util.Format.htmlEncode(versionInfo.rr_manager_version))
}
];
if (versionInfo.rr_version !== versionInfo.rr_update_version) {
if (versionInfo.rr_loader_version !== versionInfo.rr_update_version) {
labels.push({
xtype: "box",
html: String.format('<p ext:qtip="{1}" class="syno-sysinfo-system-health-south-title">{0}</p>', "RR update available!", Ext.util.Format.htmlEncode("RR update available!"))
Expand Down
10 changes: 0 additions & 10 deletions src/conf/privilege_
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,5 @@
"action": "postinst",
"run-as": "package"
}
],
"executable": [
{
"relpath": "app/scripts/getConfig.cgi",
"run-as": "package"
},
{
"relpath": "app/scripts/getAddons.cgi",
"run-as": "package"
}
]
}
95 changes: 53 additions & 42 deletions src/scripts/checkUpdateStatus.cgi
Original file line number Diff line number Diff line change
@@ -1,62 +1,73 @@
#!/usr/bin/env python3
import cgi
#!/usr/bin/env python

import os
import json
import cgitb; cgitb.enable() # Enable CGI error reporting
import cgi
import cgitb

print("Content-Type: application/json\n") # JSON is following, with an extra newline for headers end
cgitb.enable() # Enable CGI error reporting

# Authenticate the user
f = os.popen('/usr/syno/synoman/webman/modules/authenticate.cgi', 'r')
user = f.read().strip()

def read_rrmanager_config(file_path):
try:
config = {}
with open(file_path, 'r') as file:
with open(file_path, "r") as file:
for line in file:
line = line.strip()
if line and not line.startswith('#'):
key, value = line.split('=')
if line and not line.startswith("#"):
key, value = line.split("=")
config[key.strip()] = value.strip()
return config
except IOError as e:
return f"Error reading user-config.yml: {e}"
except e:
return "{}"

response = {}
response['success'] = False

if len(user) > 0:
# Parse query string
arguments = cgi.FieldStorage()
rr_manager_config = read_rrmanager_config('/var/packages/rr-manager/target/app/config.txt')
filename = rr_manager_config.get('RR_UPDATE_PROGRESS_FILE')

if filename:
# Construct file path
file_path = os.path.join('/tmp', filename)

if os.path.abspath(file_path).startswith('/tmp/'):
try:
with open(file_path, 'r') as file:
content = file.read()
# Attempt to parse the content as JSON
parsed_content = json.loads(content)
# Success, set the result
response["result"] = parsed_content
response['success'] = True
except json.JSONDecodeError:
response["status"] = "File content is not valid JSON."
except Exception as e:
response["status"] = f"Could not read file: {str(e)}"

if __name__ == "__main__":
user = os.popen("/usr/syno/synoman/webman/modules/authenticate.cgi", "r").read().strip()

# Debug
if not user:
import getpass

user = getpass.getuser()
if user != "root":
user = ""

response = {}
response["success"] = False
if user:
# Parse query string
arguments = cgi.FieldStorage()
rr_manager_config = read_rrmanager_config(
"/var/packages/rr-manager/target/app/config.txt"
)
filename = rr_manager_config.get("RR_UPDATE_PROGRESS_FILE")

if filename:
# Construct file path
file_path = os.path.join("/tmp", filename)

if os.path.abspath(file_path).startswith("/tmp/"):
try:
with open(file_path, "r") as file:
content = file.read()
# Attempt to parse the content as JSON
parsed_content = json.loads(content)
# Success, set the result
response["result"] = parsed_content
response["success"] = True
except json.JSONDecodeError:
response["status"] = "File content is not valid JSON."
except Exception as e:
response["status"] = f"Could not read file: {str(e)}"
else:
response["status"] = "Invalid file path."
else:
response["status"] = "Invalid file path."
response["status"] = "Filename parameter is missing."
else:
response["status"] = "Filename parameter is missing."
else:
response["status"] = "Authentication failed."
response["status"] = "Authentication failed."

# Print the JSON response at the end
print(json.dumps(response))
print("Content-type: application/json\n")
print(json.dumps(response, indent=4))
Loading

0 comments on commit 53fe81f

Please sign in to comment.