#!/bin/sh # Check arguments if [ $# -ne 1 ]; then echo "Usage: $0 " exit 1 fi RC_SCRIPT="$1" if [ ! -f "$RC_SCRIPT" ]; then echo "Error: $RC_SCRIPT not found" exit 1 fi # Extract service name from PROVIDE # SERVICE_NAME=$(grep '^# PROVIDE:' "$RC_SCRIPT" | cut -d: -f2 | tr -d ' ') # if [ -z "$SERVICE_NAME" ]; then # echo "Error: No PROVIDE directive found" # exit 1 # fi KEYWORDS=$(grep '^# KEYWORD:' "$RC_SCRIPT" | cut -d: -f2 ) # Extract dependencies from REQUIRE REQUIRES=$(grep '^# REQUIRE:' "$RC_SCRIPT" | cut -d: -f2 ) # Extract BEFORE BEFORE=$(grep '^# BEFORE:' "$RC_SCRIPT" | cut -d: -f2) eval "$(grep '^name=' "$RC_SCRIPT")" eval "$(grep '^command=' "$RC_SCRIPT")" eval "$(grep '^start_cmd=' "$RC_SCRIPT")" eval "$(grep '^stop_cmd=' "$RC_SCRIPT")" # Check for command definitions COMMAND=$command START_CMD=$start_cmd STOP_CMD=$stop_cmd if [ -n "$name" ]; then SERVICE_NAME=$name else SERVICE_NAME=$(basename $RC_SCRIPT) fi # Create dinit service file create_service_file() { cat > "/etc/dinit.d/$SERVICE_NAME" << EOF # Converted from rc.d script $(basename "$RC_SCRIPT") EOF # Determine service type if [ -n "$STOP_CMD" ]; then mkdir -p /etc/dinit.d/wrappers/ create_wrapper_script echo "type = scripted" >> "/etc/dinit.d/$SERVICE_NAME" echo "command = /etc/dinit.d/wrappers/$SERVICE_NAME start" >> "/etc/dinit.d/$SERVICE_NAME" echo "stop-command = /etc/dinit.d/wrappers/$SERVICE_NAME stop" >> "/etc/dinit.d/$SERVICE_NAME" elif [ -n "$COMMAND" ]; then echo "type = process" >> "/etc/dinit.d/$SERVICE_NAME" echo "command = $COMMAND" >> "/etc/dinit.d/$SERVICE_NAME" else echo "type = internal" >> "/etc/dinit.d/$SERVICE_NAME" fi if echo "$KEYWORDS" | grep -q "interact"; then echo "options = runs-on-console" >> "/etc/dinit.d/$SERVICE_NAME" #echo "termsig = SIGINT" >> "/etc/dinit.d/$SERVICE_NAME" fi # Add dependencies for dep in $REQUIRES; do echo "depends-on = $dep" >> "/etc/dinit.d/$SERVICE_NAME" done for before in $BEFORE; do echo "before = $before" >> "/etc/dinit.d/$SERVICE_NAME" # echo "waits-for = $SERVICE_NAME" >> "/etc/dinit.d/$before" echo "$SERVICE_NAME" >> /tmp/before-list echo "$before" >> /tmp/before-list done } create_wrapper_script() { cat > "/etc/dinit.d/wrappers/${SERVICE_NAME}" << EOF #!/bin/sh . /etc/rc.conf # Check if service is enabled in rc.conf service_name=\$(basename "$RC_SCRIPT") eval "value=\\\$\$service_name" if [ "\$value" = "NO" ]; then exit 0 # Exit successfully but do nothing if disabled fi case "\$1" in start) $RC_SCRIPT start ;; stop) $RC_SCRIPT stop ;; *) exit 1 ;; esac EOF chmod 755 "/etc/dinit.d/wrappers/${SERVICE_NAME}" } # Main execution mkdir -p /usr/local/lib/dinit.d create_service_file echo "Created dinit service: /etc/dinit.d/$SERVICE_NAME"