2025-08-26 09:20:45 +08:00

110 lines
2.9 KiB
Plaintext

#!/usr/bin/ucode
'use strict';
import { access, popen, writefile } from 'fs';
import { load_profile, get_users, get_groups, get_cgroups } from '/etc/nikki/ucode/include.uc';
const methods = {
version: {
call: function() {
let process;
let app = '';
if (system('command -v opkg') == 0) {
process = popen('opkg list-installed luci-app-nikki | cut -d " " -f 3');
if (process) {
app = trim(process.read('all'));
process.close();
}
} else if (system('command -v apk') == 0) {
process = popen('apk list -I luci-app-nikki | cut -d " " -f 1 | cut -d "-" -f 4');
if (process) {
app = trim(process.read('all'));
process.close();
}
}
let core = '';
process = popen('mihomo -v | grep Mihomo | cut -d " " -f 3');
if (process) {
core = trim(process.read('all'));
process.close();
}
return { app: app, core: core };
}
},
profile: {
args: { defaults: {} },
call: function(req) {
let profile = {};
const defaults = req.args?.defaults ?? {};
const filepath = '/etc/nikki/run/config.yaml';
const tmpFilepath = '/var/run/nikki/profile.json';
if (access(filepath, 'r')) {
writefile(tmpFilepath, defaults);
const command = `yq -p yaml -o json eval-all 'select(fi == 0) *? select(fi == 1)' ${tmpFilepath} ${filepath}`;
const process = popen(command);
if (process) {
profile = json(process);
process.close();
}
}
return profile;
}
},
update_subscription: {
args: { section_id: 'section_id' },
call: function(req) {
let success = false;
const section_id = req.args?.section_id;
if (section_id) {
success = system(['service', 'nikki', 'update_subscription', section_id]) == 0;
}
return { success: success };
}
},
api: {
args: { method: 'method', path: 'path', query: 'query', body: 'body' },
call: function(req) {
let result = {};
const method = req.args?.method;
const path = req.args?.path;
const query = req.args?.query;
const body = req.args?.body;
const profile = load_profile();
const api_listen = profile['external-controller'];
const api_secret = profile['secret'];
if (!api_listen) {
return result;
}
const url = api_listen + path;
const process = popen(`curl --request '${method}' --oauth2-bearer '${api_secret}' --url-query '${query}' --data '${body}' '${url}'`);
if (process) {
result = json(process);
process.close();
}
return result;
}
},
get_identifiers: {
call: function() {
const users = filter(get_users(), (x) => x != '');
const groups = filter(get_groups(), (x) => x != '');
const cgroups = filter(get_cgroups(), (x) => x != '' && index(x, 'services/nikki') < 0);
return { users: users, groups: groups, cgroups: cgroups };
}
},
debug: {
call: function() {
const success = system('/etc/nikki/scripts/debug.sh > /var/log/nikki/debug.log') == 0;
return { success: success };
}
}
};
return { 'luci.nikki': methods };