#!/bin/sh /etc/rc.common START=80 STOP=10 CFGDIR=/var/etc/radicale2 SYSCFG=$CFGDIR/config USRCFG=$CFGDIR/users DATADIR="/srv/radicale2/data" LOGDIR="" USE_PROCD=1 # we could start with empty configuration file using defaults [ -f ${IPKG_INSTROOT}/etc/config/radicale2 ] || touch ${IPKG_INSTROOT}/etc/config/radicale2 conf_line() { local cfgfile="$1" local option="$2" local value="$3" if [ -n "$value" ]; then eval "echo '$2' = '$value' >>'$cfgfile'" fi } conf_getline() { local cfg="$1" local cfgfile="$2" local option="$3" local defval="$4" local flag="$5" unset value if [ "$flag" != "1" ]; then config_get value "$cfg" "$option" "$defval" conf_line "$cfgfile" "$option" "$value" else config_get_bool value "$cfg" "$option" "$defval" [ -z "$defval" ] && defval=1 if [ "$value" -ne "$defval" ]; then if [ "$value" -ne 0 ]; then conf_line "$cfgfile" "$option" "True" else conf_line "$cfgfile" "$option" "False" fi fi fi } build_hosts_line() { local val="$1" append hostlist "$val" ", " } conf_section() { local cfg="$1" local cfgfile="$2" local hostlist="" local value echo "[$cfg] " >>$cfgfile case $cfg in server) config_list_foreach "$cfg" host build_hosts_line conf_line "$tmpfile" hosts "$hostlist" conf_getline "$cfg" $tmpfile max_connections conf_getline "$cfg" $tmpfile max_conntent_length conf_getline "$cfg" $tmpfile timeout conf_getline "$cfg" $tmpfile ssl 0 1 if [ "$value" -eq 1 ]; then conf_getline "$cfg" $tmpfile certificate conf_getline "$cfg" $tmpfile key conf_getline "$cfg" $tmpfile certificate_authority conf_getline "$cfg" $tmpfile protocol conf_getline "$cfg" $tmpfile ciphers fi conf_getline "$cfg" $tmpfile dns_lookup 1 1 conf_getline "$cfg" $tmpfile realm ;; encoding) conf_getline "$cfg" $tmpfile request conf_getline "$cfg" $tmpfile stock ;; auth) conf_getline "$cfg" $tmpfile "type" htpasswd if [ "$value" = "htpasswd" ]; then conf_getline "$cfg" $tmpfile htpasswd_filename $CFGDIR/users conf_getline "$cfg" "$tmpfile" htpasswd_encryption plain fi conf_getline "$cfg" "$tmpfile" delay ;; rights) conf_getline "$cfg" "$tmpfile" "type" if [ "$value" = "from_file" ]; then conf_getline "$cfg" "$tmpfile" "file" fi ;; storage) conf_getline "$cfg" $tmpfile filesystem_folder "$DATADIR" DATADIR="$value" conf_getline "$cfg" $tmpfile filesystem_locking 1 1 conf_getline "$cfg" $tmpfile max_sync_token_age conf_getline "$cfg" $tmpfile filesystem_close_lock_file 0 1 conf_getline "$cfg" $tmpfile hook ;; web) conf_getline "$cfg" $tmpfile "type" ;; logging) conf_getline "$cfg" "$tmpfile" config conf_getline "$cfg" "$tmpfile" debug 0 1 conf_getline "$cfg" "$tmpfile" full_environment 0 1 conf_getline "$cfg" "$tmpfile" mask_passwords 1 1 ;; headers) config_get "$cfg" "$tmpfile" cors if [ -n "$cors" ]; then echo "Access-Control-Allow-Origin = $cors" >>$tmpfile fi ;; esac echo " " >>$cfgfile } add_missing_sections() { local cfgfile="$1" for section in server encoding auth rights storage web logging headers; do if [ "$section" = "server" ]; then grep -q "\[$section\]" $cfgfile || echo " [$section] hosts = 0.0.0.0:5232, [::]:5232 " >>$cfgfile elif [ "$section" = "auth" ]; then grep -q "\[$section\]" $cfgfile || echo " [$section] type = htpasswd htpasswd_filename = $CFGDIR/users htpasswd_encryption = plain " >>$cfgfile elif [ "$section" = "storage" ]; then grep -q "\[$section\]" $cfgfile || echo " [$section] filesystem_folder = $DATADIR " >>$cfgfile else grep -q "\[$section\]" $cfgfile || echo " [$section] " >>$cfgfile fi done } add_user() { local cfg="$1" local tmpfile="$2" local name password config_get name "$cfg" name config_get password "$cfg" password [ -n "$name" ] && echo "$name:$password" >>$tmpfile } build_users() { local tmpfile="$1" # temporary config file # radicale2 needs read access chmod 0640 $tmpfile config_foreach add_user user "$tmpfile" } build_config() { local tmpfile=$(mktemp) local tmpfile2=$(mktemp) # temporary config file # radicale2 need read access chmod 0640 $tmpfile config_load radicale2 config_foreach conf_section section $tmpfile add_missing_sections $tmpfile build_users $tmpfile2 # move tmp to final mkdir -m0750 -p $CFGDIR cat $tmpfile >$SYSCFG rm -f $tmpfile cat $tmpfile2 >$USRCFG rm -f $tmpfile2 } set_permission() { # config file permissions (read access for group) chmod 0750 $CFGDIR chmod 0640 $SYSCFG chmod 0640 $USRCFG chgrp -R radicale2 $CFGDIR # data directory does not exist [ -d $DATADIR ] || { logger -p user.error -t "radicale2[----]" "Data directory '$DATADIR' does not exist. Startup failed !!!" } } interface_triggers() { local action="$1" local triggerlist trigger config_load radicale2 config_get triggerlist server triggerlist . /lib/functions/network.sh if [ -n "$triggerlist" ]; then for trigger in $triggerlist; do if [ "$action" = "add_trigger" ]; then procd_add_interface_trigger "interface.*" "$trigger" /etc/init.d/radicale2 reload else network_is_up "$trigger" && return 0 fi done else if [ "$action" = "add_trigger" ]; then procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/radicale2 reload else ubus call network.device status | grep -q '"up": true' && return 0 fi fi [ "$action" = "add_trigger" ] || return 1 } start_service() { local haveinterface if [ ! -r /etc/radicale2/config ]; then build_config set_permission fi interface_triggers "check_interface_up" || return procd_open_instance "radicale2" procd_set_param respawn procd_set_param stderr 1 procd_set_param stdout 1 if [ ! -r /etc/radicale2/config ]; then procd_set_param command /usr/bin/radicale2 --config="$SYSCFG" else procd_set_param command /usr/bin/radicale2 --config="/etc/radicale2/config" fi procd_set_param user radicale2 procd_close_instance return 0 } service_triggers() { interface_triggers "add_trigger" procd_add_reload_trigger "radicale2" }