schema: add start/stop to services

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2021-06-05 05:14:08 +02:00
parent 4973d24bdc
commit 86f618203f
17 changed files with 89 additions and 30 deletions

View File

@@ -304,6 +304,12 @@ let ipcalc = {
};
let services = {
state: {},
set_enabled: function(name, state) {
this.state[name] = b(state);
},
lookup_interfaces: function(service) {
let interfaces = [];
@@ -379,5 +385,9 @@ return {
warn: (fmt, ...args) => push(logs, sprintf("[W] (In %s) ", location || '/') + sprintf(fmt, ...args)),
info: (fmt, ...args) => push(logs, sprintf("[!] (In %s) ", location || '/') + sprintf(fmt, ...args))
});
},
services_state: function() {
return services.state;
}
};

View File

@@ -1,6 +1,10 @@
{% let interfaces = services.lookup_interfaces("dhcp-snooping") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("dhcpsnoop", enable) %}
{% if (!enable) return %}
# DHCP Snooping configuration
set event.dhcp=event
set event.dhcp.type=dhcp
set event.dhcp.filter='*'
@@ -8,8 +12,8 @@ set event.dhcp.filter='*'
{{ n ? 'add_list' : 'set' }} event.dhcp.filter={{ filter }}
{% endfor %}
set dhcpsnooping.@snooping[-1].enable=1
set dhcpsnoop.@snooping[-1].enable=1
{% for (let interface in interfaces): %}
{% let name = ethernet.calculate_name(interface) %}
add_list dhcpsnooping.@snooping[-1].network={{ s(name) }}
add_list dhcpsnoop.@snooping[-1].network={{ s(name) }}
{% endfor %}

View File

@@ -1,3 +1,4 @@
{% if (!health) return %}
# Health configuration
set ustats.health.interval={{ health.interval }}

View File

@@ -1,3 +1,4 @@
{% if (!statistics) return %}
# Statistics configuration
set ustats.stats.interval={{ statistics.interval }}

View File

@@ -1,3 +1,4 @@
{% if (!wifi_frames) return %}
# Wifi-frame reporting configuration
set event.wifi=event

View File

@@ -1,5 +1,8 @@
{% let interfaces = services.lookup_interfaces("http") %}
{% if (length(interfaces)): %}
{% let enable = length(interfaces) %}
{% services.set_enabled("uhttpd", enable) %}
{% if (!enable) return %}
# HTTP service configuration
add uhttpd uhttpd
@@ -18,9 +21,9 @@ set uhttpd.@uhttpd[-1].http_keepalive='20'
set uhttpd.@uhttpd[-1].tcp_keepalive='1'
set uhttpd.@uhttpd[-1].ubus_prefix='/ubus'
add_list uhttpd.@uhttpd[-1].listen_http='0.0.0.0:{{ http.http_port }}'
{% let interfaces = services.lookup_interfaces("http") %}
{% for (let interface in interfaces): %}
{% let name = ethernet.calculate_name(interface) %}
{% let interfaces = services.lookup_interfaces("http") %}
{% for (let interface in interfaces): %}
{% let name = ethernet.calculate_name(interface) %}
add firewall rule
set firewall.@rule[-1].name='Allow-http-{{ name }}'
@@ -28,5 +31,4 @@ set firewall.@rule[-1].src='{{ name }}'
set firewall.@rule[-1].port='{{ http.http_port }}'
set firewall.@rule[-1].proto='tcp'
set firewall.@rule[-1].target='ACCEPT'
{% endfor %}
{% endif %}
{% endfor %}

View File

@@ -1,7 +1,10 @@
{% let interfaces = services.lookup_interfaces("ieee8021x") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("ieee8021x", enable) %}
{% if (!enable) return %}
# IEEE8021x service configuration
{% let interfaces = services.lookup_interfaces("ieee8021x") %}
{% for (let interface in interfaces): %}
{% let name = ethernet.calculate_name(interface) %}
add ieee8021x network

View File

@@ -1,11 +1,14 @@
{% let interfaces = services.lookup_interfaces("igmp") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("igmpproxy", enable) %}
{% if (!enable) return %}
# IGMP service configuration
{% if (igmp.enable): %}
{% let interfaces = services.lookup_interfaces("igmp") %}
{% for (let interface in interfaces): %}
{% if (!interface.ipv4) continue; %}
{% let name = ethernet.calculate_name(interface) %}
{% let interfaces = services.lookup_interfaces("igmp") %}
{% for (let interface in interfaces): %}
{% if (!interface.ipv4) continue; %}
{% let name = ethernet.calculate_name(interface) %}
add igmpproxy phyint
set igmpproxy.@phyint[-1].network={{ name }}
set igmpproxy.@phyint[-1].zone={{ s((interface.role == "usptream") ? "wan" : name) }}
@@ -13,5 +16,4 @@ set igmpproxy.@phyint[-1].direction={{ s(interface.role) }}
{% if (interface.role == "upstream"): %}
set igmpproxy.@phyint[-1].altnet='0.0.0.0/0'
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}

View File

@@ -1,10 +1,13 @@
{% let interfaces = services.lookup_interfaces("lldp") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("lldpd", enable) %}
{% if (!enable) return %}
# LLDP service configuration
set lldpd.config.enable=1
set lldpd.config.description={{ s(lldp.describe) }}
set lldpd.config.lldp_location={{ s(lldp.location) }}
{% let interfaces = services.lookup_interfaces("lldp") %}
{% for (let interface in interfaces): %}
{% for (let port in ethernet.lookup_by_interface_spec(interface)): %}
add_list lldpd.config.interface={{ s(port) }}

View File

@@ -1,3 +1,4 @@
{% if (!length(log)) return %}
# Syslog service configuration

View File

@@ -1,5 +1,13 @@
{% let interfaces = services.lookup_interfaces("mdns") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("umdns", enable) %}
{% if (!enable) return %}
# MDNS service configuration
delete umdns.@umdns[-1].network
set umdns.@umdns[-1].enable={{ b(mdns.enable) }}
add umdns umdns
set umdns.@umdns[-1].enable=1
{% for (let interface in interfaces): %}
add_list umdns.@umdns[-1].network={{ s(interface) }}
{% endfor %}

View File

@@ -1,3 +1,4 @@
{% if (!length(ntp)) return %}
# NTP service configuration

View File

@@ -1,7 +1,10 @@
{% let enable = length(radius_proxy) %}
{% services.set_enabled("radsecproxy", enable) %}
{% if (!enable) return %}
{%
if (!radius_proxy.host || !radius_proxy.port || !radius_proxy.secret) {
warn("Can't start radius-proxy due to missing settings.");
services.set_enabled("radsecproxy", false);
return;
}
%}
@@ -20,7 +23,7 @@ add radsecproxy tls
set radsecproxy.@tls[-1].name='tls'
set radsecproxy.@tls[-1].CACertificateFile='/etc/ucentral/cas.pem'
set radsecproxy.@tls[-1].certificateFile='/etc/ucentral/cert.pem'
set radsecproxy.@tls[-1].certificateKeyFile='/etc/ucentral/cert.key'
set radsecproxy.@tls[-1].certificateKeyFile='/etc/ucentral/key.pem'
set radsecproxy.@tls[-1].certificateKeyPassword=''
add radsecproxy server

View File

@@ -1,3 +1,6 @@
{% let enable = length(rtty) %}
{% services.set_enabled("rtty", enable) %}
{% if (!enable) return %}
# RTTY service configuration

View File

@@ -1,3 +1,7 @@
{% let interfaces = services.lookup_interfaces("ssh") %}
{% let enable = length(interfaces) %}
{% services.set_enabled("dropbear", enable) %}
{% if (!enable) return %}
# SSH service configuration
@@ -8,7 +12,6 @@ set dropbear.@dropbear[-1].PasswordAuth={{ b(ssh.password_authentication) }}
add_list dropbear.@dropbear[-1].pubkey={{ s(key) }}
{% endfor %}
{% let interfaces = services.lookup_interfaces("ssh") %}
{% for (let interface in interfaces): %}
{% let name = ethernet.calculate_name(interface) %}

View File

@@ -1,8 +1,11 @@
{% let ssids = services.lookup_ssids("wifi-steering") %}
add usteer usteer
{% if (wifi_steering.mode == 'local' && length(ssids)): %}
{% let enable = (wifi_steering.mode == 'local' && length(ssids)) %}
{% services.set_enabled("usteer", enable) %}
{% if (!enable) return %}
# Wifi-Steering service configuration
add usteer usteer
set usteer.@usteer[-1].network='up'
set usteer.@usteer[-1].key={{ s(wifi_steering.key) }}
set usteer.@usteer[-1].assoc_steering={{ b(wifi_steering.assoc_steering) }}
@@ -11,10 +14,6 @@ set usteer.@usteer[-1].min_connect_snr={{ wifi_steering.required_probe_snr }}
set usteer.@usteer[-1].roam_scan_snr={{ wifi_steering.required_roam_snr }}
set usteer.@usteer[-1].load_kick_enabled={{ b(wifi_steering.load_kick_threshold) }}
set usteer.@usteer[-1].load_kick_threshold={{ wifi_steering.load_kick_threshold }}
{% let ssids = services.lookup_ssids("wifi-steering") %}
{% for (let ssid in ssids): %}
{% for (let ssid in ssids): %}
add_list usteer.@usteer[-1].ssid_list={{ ssid.name }}
{% endfor %}
{% else %}
set usteer.@usteer[-1].enabled=0
{% endif %}
{% endfor %}

View File

@@ -16,6 +16,15 @@ let error = 0;
inputfile.close();
let logs = [];
function set_service_state(state) {
for (let service, enable in renderer.services_state()) {
if (enable != state)
continue;
printf("%s %s\n", service, enable ? "starting" : "stopping");
system(sprintf("/etc/init.d/%s %s", service, enable ? "start" : "stop"));
}
}
try {
let state = schemareader.validate(inputjson, logs);
@@ -38,6 +47,8 @@ try {
apply.write(batch);
apply.close();
set_service_state(false);
for (let cmd in [ 'uci -c /tmp/config-shadow commit',
'cp /tmp/config-shadow/* /etc/config/',
'rm -rf /tmp/config-shadow',
@@ -46,6 +57,9 @@ try {
fs.unlink('/etc/ucentral/ucentral.active');
fs.symlink(ARGV[2], '/etc/ucentral/ucentral.active');
set_service_state(true);
} else {
error = 1;
}