This commit is contained in:
MahnoKropotkinvich 2025-05-09 04:44:34 +00:00
parent 81f3f4a1df
commit 67addcc131
5 changed files with 168 additions and 14 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
devroot

32
enabled-service-order.sh Normal file → Executable file
View File

@ -7,32 +7,36 @@ done)
# Get ordered list using rcorder # Get ordered list using rcorder
ordered_scripts=$(rcorder -s nostart ${scripts}) ordered_scripts=$(rcorder -s nostart ${scripts})
. /etc/rc.conf
# Function to check if service is enabled # Function to check if service is enabled
is_service_enabled() { is_service_enabled() {
local script=$1 local script=$1
local service_name=$(basename "$script") local service_name=$(basename "$script")
# local disabled="false"
# First check /etc/rc.conf # First check /etc/rc.conf
if grep -q "^${service_name}=YES" /etc/rc.conf 2>/dev/null; then # if grep -q "^${service_name}=NO" /etc/rc.conf 2>/dev/null; then
return 0 # # return 1
fi # disabled=true
# fi
# Then check /etc/defaults/rc.conf
if grep -q "^${service_name}=YES" /etc/defaults/rc.conf 2>/dev/null; then
return 0
fi
# # Then check /etc/defaults/rc.conf
# if grep -q "^${service_name}=NO" /etc/defaults/rc.conf 2>/dev/null; then
# # return 1
# fi
eval "value=\$$service_name"
if [ "$value" = "NO" ]; then
return 1 return 1
fi
return 0
} }
# Filter and display enabled services in order # Filter and display enabled services in order
echo "Enabled services in boot order:" # echo "Enabled services in boot order:"
echo "------------------------------" # echo "------------------------------"
for script in ${ordered_scripts}; do for script in ${ordered_scripts}; do
if is_service_enabled "$script"; then if is_service_enabled "$script"; then
# Extract PROVIDE line to show service name # Extract PROVIDE line to show service name
provide=$(grep "^# PROVIDE:" "$script" | cut -d: -f2-) # provide=$(grep "^# PROVIDE:" "$script" | cut -d: -f2-)
echo "$(basename "$script")${provide:+ ($provide)}" echo "$script"
fi fi
done done

10
postprocess.sh Executable file
View File

@ -0,0 +1,10 @@
#!/bin/sh
while read -r service; do
read -r before
if [ -f "/etc/dinit.d/$before" ]; then
echo "waits-for = $service" >> "/etc/dinit.d/$before"
else
echo "Warning: Service $before not found, skipping waits-for directive" >&2
fi
done < /tmp/before-list
rm /tmp/before-list

30
rc2dinit.sh Executable file
View File

@ -0,0 +1,30 @@
#!/bin/sh
scripts=$(./enabled-service-order.sh)
is_leaf_service(){
local script=$1
if grep -q "^# REQUIRE:." "$script" || \
grep -q "^# BEFORE:." "$script"; then
return 1
fi
return 0
}
mkdir -p /etc/dinit.d
echo "type = internal" >> /etc/dinit.d/boot
for script in $scripts; do
# ./transform.sh $script
if is_leaf_service $script; then
echo "depends-on = $(basename $script)" >> /etc/dinit.d/boot
fi
# name=$(basename "$script")
# if [ "$name" = "DISKS" ]; then
# echo "options: starts-rwfs" >> /etc/dinit.d/$name
# fi
done
for script in $(ls -P /etc/rc.d); do
./transform.sh $script
name=$(basename "$script")
if [ "$name" = "DISKS" ]; then
echo "options: starts-rwfs" >> /etc/dinit.d/$name
fi
done
./postprocess.sh

109
transform.sh Executable file
View File

@ -0,0 +1,109 @@
#!/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"