rc2dinit/transform.sh
MahnoKropotkinvich 67addcc131 modified
2025-05-09 04:44:34 +00:00

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"