110 lines
2.9 KiB
Bash
Executable File
110 lines
2.9 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
# Check arguments
|
|
if [ $# -ne 1 ]; then
|
|
echo "Usage: $0 <rc_script>"
|
|
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"
|