small-packages/luci-app-momo/htdocs/luci-static/resources/tools/momo.js
2026-05-10 09:48:30 +08:00

153 lines
3.8 KiB
JavaScript

'use strict';
'require baseclass';
'require uci';
'require fs';
'require rpc';
'require request';
const callRCList = rpc.declare({
object: 'rc',
method: 'list',
params: ['name'],
expect: { '': {} }
});
const callRCInit = rpc.declare({
object: 'rc',
method: 'init',
params: ['name', 'action'],
expect: { '': {} }
});
const callMomoGetPaths = rpc.declare({
object: 'luci.momo',
method: 'get_paths',
expect: { '': {} }
});
const callMomoVersion = rpc.declare({
object: 'luci.momo',
method: 'version',
expect: { '': {} }
});
const callMomoProfile = rpc.declare({
object: 'luci.momo',
method: 'profile',
params: ['defaults'],
expect: { '': {} }
});
const callMomoUpdateSubscription = rpc.declare({
object: 'luci.momo',
method: 'update_subscription',
params: ['section_id'],
expect: { '': {} }
});
const callMomoAPI = rpc.declare({
object: 'luci.momo',
method: 'api',
params: ['method', 'path', 'query', 'body'],
expect: { '': {} }
});
const callMomoGetIdentifiers = rpc.declare({
object: 'luci.momo',
method: 'get_identifiers',
expect: { '': {} }
});
const callMomoDebug = rpc.declare({
object: 'luci.momo',
method: 'debug',
expect: { '': {} }
});
return baseclass.extend({
getPaths: async function () {
return callMomoGetPaths();
},
status: async function () {
return (await callRCList('momo'))?.momo?.running;
},
reload: function () {
return callRCInit('momo', 'reload');
},
restart: function () {
return callRCInit('momo', 'restart');
},
version: function () {
return callMomoVersion();
},
profile: function (defaults) {
return callMomoProfile(defaults);
},
updateSubscription: function (section_id) {
return callMomoUpdateSubscription(section_id);
},
updateDashboard: function () {
return callMomoAPI('POST', '/upgrade/ui');
},
openDashboard: async function () {
const profile = await callMomoProfile({ 'experimental': { 'clash_api': { 'external_controller': null, 'secret': null } } });
const apiListen = profile?.['experimental']?.['clash_api']?.['external_controller'];
const apiSecret = profile?.['experimental']?.['clash_api']?.['secret'] ?? '';
if (!apiListen) {
return Promise.reject('Clash API has not been configured');
}
const apiPort = apiListen.substring(apiListen.lastIndexOf(':') + 1);
const params = {
host: window.location.hostname,
hostname: window.location.hostname,
port: apiPort,
secret: apiSecret
};
const query = new URLSearchParams(params).toString();
const url = `http://${window.location.hostname}:${apiPort}/ui/?${query}`;
setTimeout(function () { window.open(url, '_blank') }, 0);
return Promise.resolve();
},
getIdentifiers: function () {
return callMomoGetIdentifiers();
},
listProfiles: async function () {
const paths = await this.getPaths();
return L.resolveDefault(fs.list(paths.profiles_dir), []);
},
getAppLog: async function () {
const paths = await this.getPaths();
return L.resolveDefault(fs.read_direct(paths.app_log_path));
},
getCoreLog: async function () {
const paths = await this.getPaths();
return L.resolveDefault(fs.read_direct(paths.core_log_path));
},
clearAppLog: async function () {
const paths = await this.getPaths();
return fs.write(paths.app_log_path);
},
clearCoreLog: async function () {
const paths = await this.getPaths();
return fs.write(paths.core_log_path);
},
debug: function () {
return callMomoDebug();
},
})