From 67addcc1319472c72af147726ca107207dd40eba Mon Sep 17 00:00:00 2001 From: MahnoKropotkinvich Date: Fri, 9 May 2025 04:44:34 +0000 Subject: [PATCH] modified --- .gitignore | 1 + enabled-service-order.sh | 32 +++++++----- postprocess.sh | 10 ++++ rc2dinit.sh | 30 +++++++++++ transform.sh | 109 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 168 insertions(+), 14 deletions(-) create mode 100644 .gitignore mode change 100644 => 100755 enabled-service-order.sh create mode 100755 postprocess.sh create mode 100755 rc2dinit.sh create mode 100755 transform.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9c6945e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +devroot diff --git a/enabled-service-order.sh b/enabled-service-order.sh old mode 100644 new mode 100755 index 6f9da27..0b6eaa5 --- a/enabled-service-order.sh +++ b/enabled-service-order.sh @@ -7,32 +7,36 @@ done) # Get ordered list using rcorder ordered_scripts=$(rcorder -s nostart ${scripts}) - +. /etc/rc.conf # Function to check if service is enabled is_service_enabled() { local script=$1 local service_name=$(basename "$script") - + # local disabled="false" # First check /etc/rc.conf - if grep -q "^${service_name}=YES" /etc/rc.conf 2>/dev/null; then - return 0 - fi + # if grep -q "^${service_name}=NO" /etc/rc.conf 2>/dev/null; then + # # return 1 + # 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 + # # 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 fi - - return 1 + return 0 } # Filter and display enabled services in order -echo "Enabled services in boot order:" -echo "------------------------------" +# echo "Enabled services in boot order:" +# echo "------------------------------" for script in ${ordered_scripts}; do if is_service_enabled "$script"; then # Extract PROVIDE line to show service name - provide=$(grep "^# PROVIDE:" "$script" | cut -d: -f2-) - echo "$(basename "$script")${provide:+ ($provide)}" + # provide=$(grep "^# PROVIDE:" "$script" | cut -d: -f2-) + echo "$script" fi done \ No newline at end of file diff --git a/postprocess.sh b/postprocess.sh new file mode 100755 index 0000000..6f36612 --- /dev/null +++ b/postprocess.sh @@ -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 \ No newline at end of file diff --git a/rc2dinit.sh b/rc2dinit.sh new file mode 100755 index 0000000..a637a96 --- /dev/null +++ b/rc2dinit.sh @@ -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 \ No newline at end of file diff --git a/transform.sh b/transform.sh new file mode 100755 index 0000000..3823c45 --- /dev/null +++ b/transform.sh @@ -0,0 +1,109 @@ +#!/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"