mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-10-31 21:55:13 +08:00
🍓 Sync 2026-09-15 02:13:06
This commit is contained in:
1 parent
0e5393594c
commit
1dd96ac2bb
146 files changed
+26541
-508
No files matched your search
@@ -0,0 +1,11 @@
|
||||
|
||||
config ssserver 'main'
|
||||
option enabled '0'
|
||||
option server '0.0.0.0'
|
||||
option server_port '8388'
|
||||
option password 'password'
|
||||
option method 'chacha20-ietf-poly1305'
|
||||
option timeout '300'
|
||||
option mode 'tcp_and_udp'
|
||||
option fast_open '0'
|
||||
option open_firewall '1'
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
#!/bin/sh /etc/rc.common
|
||||
|
||||
USE_PROCD=1
|
||||
START=95
|
||||
|
||||
CONF_FILE="/var/etc/ssserver.json"
|
||||
|
||||
ss_server_generate_json() {
|
||||
local server server_port password method timeout fast_open dns_resolver lan_ip mode
|
||||
config_get server "$1" server "0.0.0.0"
|
||||
config_get server_port "$1" server_port "8388"
|
||||
config_get password "$1" password "password"
|
||||
config_get method "$1" method "chacha20-ietf-poly1305"
|
||||
config_get timeout "$1" timeout "300"
|
||||
config_get mode "$1" mode "tcp_and_udp"
|
||||
config_get_bool fast_open "$1" fast_open 0
|
||||
config_get dns_resolver "$1" dns_resolver
|
||||
|
||||
# If DNS is empty, try to get LAN IP
|
||||
if [ -z "$dns_resolver" ]; then
|
||||
lan_ip=$(ubus call network.interface.lan status | jsonfilter -e '@["ipv4-address"][0].address')
|
||||
dns_resolver="${lan_ip:-8.8.8.8}"
|
||||
fi
|
||||
|
||||
mkdir -p /var/etc
|
||||
|
||||
cat > "$CONF_FILE" <<EOF
|
||||
{
|
||||
"server": "$server",
|
||||
"server_port": $server_port,
|
||||
"password": "$password",
|
||||
"method": "$method",
|
||||
"timeout": $timeout,
|
||||
"fast_open": $([ "$fast_open" = "1" ] && echo "true" || echo "false"),
|
||||
"dns": "$dns_resolver",
|
||||
"mode": "$mode"
|
||||
}
|
||||
EOF
|
||||
}
|
||||
|
||||
handle_firewall() {
|
||||
local enabled port mode proto
|
||||
config_get_bool enabled "$1" open_firewall 1
|
||||
config_get port "$1" server_port 8388
|
||||
config_get mode "$1" mode "tcp_and_udp"
|
||||
|
||||
case "$mode" in
|
||||
tcp_only) proto="tcp" ;;
|
||||
udp_only) proto="udp" ;;
|
||||
*) proto="tcp udp" ;;
|
||||
esac
|
||||
|
||||
# Remove existing rule if any
|
||||
uci -q delete firewall.ssserver_wan
|
||||
|
||||
if [ "$enabled" -eq 1 ] && [ "$2" = "start" ]; then
|
||||
uci -q batch <<EOF
|
||||
set firewall.ssserver_wan=rule
|
||||
set firewall.ssserver_wan.name='Allow-Shadowsocks-WAN'
|
||||
set firewall.ssserver_wan.src='wan'
|
||||
set firewall.ssserver_wan.dest_port="$port"
|
||||
set firewall.ssserver_wan.proto="$proto"
|
||||
set firewall.ssserver_wan.target='ACCEPT'
|
||||
commit firewall
|
||||
EOF
|
||||
/etc/init.d/firewall reload
|
||||
else
|
||||
uci -q commit firewall
|
||||
/etc/init.d/firewall reload
|
||||
fi
|
||||
}
|
||||
|
||||
start_service() {
|
||||
config_load ssserver
|
||||
local enabled
|
||||
config_get_bool enabled main enabled 0
|
||||
|
||||
[ "$enabled" -eq 0 ] && return
|
||||
|
||||
ss_server_generate_json main
|
||||
handle_firewall main start
|
||||
|
||||
procd_open_instance
|
||||
procd_set_param command /usr/bin/ssserver -c "$CONF_FILE"
|
||||
procd_set_param respawn
|
||||
procd_set_param stdout 1
|
||||
procd_set_param stderr 1
|
||||
procd_set_param user root
|
||||
procd_close_instance
|
||||
}
|
||||
|
||||
stop_service() {
|
||||
config_load ssserver
|
||||
handle_firewall main stop
|
||||
}
|
||||
|
||||
reload_service() {
|
||||
stop
|
||||
start
|
||||
}
|
||||
|
||||
service_triggers() {
|
||||
procd_add_reload_trigger "ssserver"
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"admin/services/ssserver": {
|
||||
"title": "Shadowsocks Server",
|
||||
"action": {
|
||||
"type": "firstchild"
|
||||
},
|
||||
"order": 50
|
||||
},
|
||||
"admin/services/ssserver/overview": {
|
||||
"title": "Overview",
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "ssserver/overview"
|
||||
},
|
||||
"order": 10
|
||||
},
|
||||
"admin/services/ssserver/config": {
|
||||
"title": "Settings",
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "ssserver/config"
|
||||
},
|
||||
"order": 20
|
||||
},
|
||||
"admin/services/ssserver/log": {
|
||||
"title": "Log",
|
||||
"action": {
|
||||
"type": "view",
|
||||
"path": "ssserver/log"
|
||||
},
|
||||
"order": 30
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"luci-app-ssserver": {
|
||||
"description": "Grant access to ssserver configuration and status",
|
||||
"read": {
|
||||
"ubus": {
|
||||
"luci.ssserver": [ "get_log", "get_ciphers", "get_tfo_status", "get_lan_ip", "get_status" ]
|
||||
},
|
||||
"uci": [ "ssserver", "firewall" ]
|
||||
},
|
||||
"write": {
|
||||
"ubus": {
|
||||
"luci.ssserver": [ "service_action" ]
|
||||
},
|
||||
"uci": [ "ssserver", "firewall" ]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
'use strict';
|
||||
|
||||
import { connect } from 'ubus';
|
||||
import * as fs from 'fs';
|
||||
|
||||
const methods = {
|
||||
get_log: {
|
||||
call: function() {
|
||||
let p = fs.popen('logread -e ssserver');
|
||||
let log = '';
|
||||
if (p) {
|
||||
log = p.read('all');
|
||||
p.close();
|
||||
}
|
||||
return { log: log };
|
||||
}
|
||||
},
|
||||
|
||||
get_ciphers: {
|
||||
call: function() {
|
||||
let ciphers = [];
|
||||
let p = fs.popen('/usr/bin/ssserver --help 2>&1');
|
||||
if (p) {
|
||||
let output = p.read('all');
|
||||
p.close();
|
||||
let start = index(output, '--encrypt-method');
|
||||
if (start >= 0) {
|
||||
let sub = substr(output, start);
|
||||
let res = match(sub, /possible values: (([^\]\r\n]|[\r\n])+)/);
|
||||
if (res) {
|
||||
let list = split(res[1], /,\s*/);
|
||||
for (let c in list) {
|
||||
let val = rtrim(ltrim(c));
|
||||
// Clean up possible newlines and extra spaces
|
||||
val = replace(val, /\s+/g, "");
|
||||
if (val) push(ciphers, val);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Fallback if parsing fails or returns nothing
|
||||
if (length(ciphers) == 0) {
|
||||
ciphers = [
|
||||
'chacha20-ietf-poly1305',
|
||||
'aes-256-gcm',
|
||||
'aes-128-gcm',
|
||||
'2022-blake3-aes-128-gcm',
|
||||
'2022-blake3-aes-256-gcm',
|
||||
'2022-blake3-chacha20-poly1305'
|
||||
];
|
||||
}
|
||||
return { ciphers: ciphers };
|
||||
}
|
||||
},
|
||||
|
||||
get_tfo_status: {
|
||||
call: function() {
|
||||
let val = rtrim(fs.readfile('/proc/sys/net/ipv4/tcp_fastopen') || '0');
|
||||
return { value: +val };
|
||||
}
|
||||
},
|
||||
|
||||
get_lan_ip: {
|
||||
call: function() {
|
||||
let u = connect();
|
||||
let ip = '';
|
||||
if (u) {
|
||||
let status = u.call('network.interface.lan', 'status');
|
||||
if (status && type(status['ipv4-address']) === 'array' && length(status['ipv4-address']) > 0) {
|
||||
ip = status['ipv4-address'][0].address;
|
||||
}
|
||||
u.disconnect();
|
||||
}
|
||||
return { ip: ip };
|
||||
}
|
||||
},
|
||||
|
||||
get_status: {
|
||||
call: function() {
|
||||
let u = connect();
|
||||
let running = false;
|
||||
let pid = null;
|
||||
if (u) {
|
||||
let res = u.call('service', 'list', { name: 'ssserver' });
|
||||
if (res && res.ssserver && res.ssserver.instances) {
|
||||
let inst = res.ssserver.instances.instance1;
|
||||
if (inst && inst.running) {
|
||||
running = true;
|
||||
pid = inst.pid;
|
||||
}
|
||||
}
|
||||
u.disconnect();
|
||||
}
|
||||
return { running: running, pid: pid };
|
||||
}
|
||||
},
|
||||
|
||||
service_action: {
|
||||
args: { action: '' },
|
||||
call: function(req) {
|
||||
let action = req.args?.action ?? '';
|
||||
if (action != 'start' && action != 'stop' && action != 'restart' && action != 'reload')
|
||||
return { success: false, error: 'invalid action' };
|
||||
let rc = system('/etc/init.d/ssserver ' + action + ' >/dev/null 2>&1');
|
||||
return { success: (rc === 0), applied: (rc === 0) };
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
return { 'luci.ssserver': methods };
|
||||
Reference in new issue
Block a user