-#!/bin/sh /etc/rc.common
-# Copyright (C) 2013 OpenWrt.org
+#!/usr/bin/ucode /usr/share/ucode/procd.uc
-# start after and stop before networking
-START=12
-STOP=89
-PIDCOUNT=0
+function config_load() {
+ let config = uci.get_all('system', '@system[0]');
-USE_PROCD=1
-PROG=/sbin/logread
+ config.use_dhcp ??= true;
-validate_log_section()
-{
- uci_load_validate system system "$1" "$2" \
- 'log_file:string' \
- 'log_size:uinteger' \
- 'log_hostname:string' \
- 'log_ip:host' \
- 'log_remote:bool:1' \
- 'log_port:port:514' \
- 'log_proto:or("tcp", "udp"):udp' \
- 'log_trailer_null:bool:0' \
- 'log_prefix:string'
+ return config;
}
-validate_log_daemon()
-{
- uci_load_validate system system "$1" "$2" \
- 'log_size:uinteger:0' \
- 'log_buffer_size:uinteger:0'
-}
-
-start_service_daemon()
-{
- [ $log_buffer_size -eq 0 -a $log_size -gt 0 ] && log_buffer_size=$log_size
- [ $log_buffer_size -eq 0 ] && log_buffer_size=64
- procd_open_instance logd
- procd_set_param command "/sbin/logd"
- procd_append_param command -S "${log_buffer_size}"
- procd_set_param respawn 5 1 -1
- procd_close_instance
-}
+function instances() {
+ let config = config_load();
-start_service_file()
-{
- PIDCOUNT="$(( ${PIDCOUNT} + 1))"
- local pid_file="/var/run/logread.${PIDCOUNT}.pid"
-
- [ "$2" = 0 ] || {
- echo "validation failed"
- return 1
- }
- [ -z "${log_file}" ] && return
+ const daemon = {
+ name: 'logd',
+ command: [ '/sbin/logd', '-S', config.log_buffer_size ?? config.log_size ?? 64 ],
+ respawn: [ 5, 1, -1 ],
+ };
- [ "$_BOOT" = "1" ] &&
- [ "$(procd_get_mountpoints "${log_file}")" ] && return 0
+ let retval = [
+ daemon
+ ];
- mkdir -p "$(dirname "${log_file}")"
+ if (config.log_file && (!procd_boot || procd_get_mountpoints(config.log_file))) {
+ fs.mkdir(fs.dirname(config.log_file));
- procd_open_instance logfile
- procd_set_param command "$PROG" -f -F "$log_file" -p "$pid_file"
- [ -n "${log_size}" ] && procd_append_param command -S "$log_size"
- procd_close_instance
-}
+ let log_file = {
+ name: 'logfile',
+ command: [ '/sbin/logd', '-f', '-F', config.log_file ],
+ respawn: [ 5, 1, -1 ],
+ };
-start_service_remote()
-{
- PIDCOUNT="$(( ${PIDCOUNT} + 1))"
- local pid_file="/var/run/logread.${PIDCOUNT}.pid"
+ if (config.log_size) {
+ push(log_file, '-S');
+ push(log_file, config.log_size);
+ }
- [ "$2" = 0 ] || {
- echo "validation failed"
- return 1
+ push(retval, log_file);
}
- [ "${log_remote}" -ne 0 ] || return
- [ -z "${log_ip}" ] && return
- [ -z "${log_hostname}" ] && log_hostname=$(cat /proc/sys/kernel/hostname)
- procd_open_instance logremote
- procd_set_param command "$PROG" -f -h "$log_hostname" -r "$log_ip" "${log_port}" -p "$pid_file"
- case "${log_proto}" in
- "udp") procd_append_param command -u;;
- "tcp") [ "${log_trailer_null}" -eq 1 ] && procd_append_param command -0;;
- esac
- [ -z "${log_prefix}" ] || procd_append_param command -P "${log_prefix}"
- procd_close_instance
+ return retval;
}
-register_mount_trigger()
-{
- [ -n "${log_file}" ] && procd_add_action_mount_trigger start "${log_file}"
-}
+function service_triggers() {
+ let triggers = [
+ procd_config_reload_trigger('system'),
+ ];
-service_triggers()
-{
- config_load system
- procd_add_reload_trigger "system"
- procd_add_validation validate_log_section
- config_foreach validate_log_section system register_mount_trigger
+ return triggers;
}
-start_service()
-{
- config_load system
- config_foreach validate_log_daemon system start_service_daemon
- config_foreach validate_log_section system start_service_file
- config_foreach validate_log_section system start_service_remote
-}
-
-boot() {
- _BOOT=1 start
-}
+procd_service('log', {
+ start: 12,
+ stop: 89,
+ instances,
+ service_triggers,
+});