]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
plymouth-set-default-theme: Use a more targeted bash ini-parser function instead...
authornerdopolis <bluescreen_avenger@verizon.net>
Wed, 10 Jan 2024 03:02:14 +0000 (22:02 -0500)
committern3rdopolis <bluescreenavenger@gmail.com>
Sat, 13 Jan 2024 00:31:19 +0000 (00:31 +0000)
scripts/plymouth-set-default-theme.in

index 4af16245a6bd0c8ec606d61f0b45fca096b2aa70..bb600fc42300a551f64382e19577807871732e7f 100755 (executable)
@@ -42,25 +42,116 @@ function list_themes ()
         done
 }
 
-function read_theme_name_from_file ()
+function read_or_set_file_ini_value ()
 {
-        echo $(grep -v '^#' $1 2> /dev/null |
-               awk '
-                     BEGIN {
-                        RS="[[][[:blank:]]*[^[:space:]]+[:blank:]*[]\n]";
-                        FS="[=[:space:]]+";
-                        OFS="";
-                        ORS=""
-                     }
-                     $1 ~/Theme/ { print $2 }
-               ')
+        CONFIG_FILE_PATH="$1"
+        CONFIG_FILE_INI_SEGMENT="$2"
+        CONFIG_FILE_VALUE_NAME="$3"
+        CONFIG_FILE_VALUE_NEW_VALUE="$4"
+
+        unset CONFIG_FILE_LINES_ARRAY
+
+        if [[ ! -e "$CONFIG_FILE_PATH" && ! -z $CONFIG_FILE_VALUE_NEW_VALUE ]]; then
+                echo > "$CONFIG_FILE_PATH"
+        else
+                if [[ ! -e "$CONFIG_FILE_PATH" ]]; then
+                        return
+                fi
+        fi
+
+        #read the config file
+        CONFIG_FILE_ARRAY=$(<"$CONFIG_FILE_PATH")
+
+        #Convert the file data to an array
+        readarray -t CONFIG_FILE_ARRAY <<< "$CONFIG_FILE_ARRAY"
+
+        #Build the initial array for the NeedsFile list
+        CONFIG_FILE_LINES_ARRAY=()
+
+        #Handle all the valid lines in the file
+        PARSE_INI_SEGMENT=0
+
+        INI_SEGMENT_LINE_NUMBER=0
+        CONFIG_VALUE_LINE_NUMBER=0
+
+        CONFIG_FILE_LINE_COUNT=${#CONFIG_FILE_ARRAY[@]}
+
+        for (( CONFIG_FILE_LINE_NUMBER=0 ; CONFIG_FILE_LINE_NUMBER < $CONFIG_FILE_LINE_COUNT ; CONFIG_FILE_LINE_NUMBER++ )); do
+                CONFIG_FILE_LINE=${CONFIG_FILE_ARRAY[$CONFIG_FILE_LINE_NUMBER]}
+
+                #Remove whitespace
+                CONFIG_FILE_LINE="${CONFIG_FILE_LINE##*( )}"
+                CONFIG_FILE_LINE="${CONFIG_FILE_LINE%%*( )}"
+
+                #Remove comments
+                CONFIG_FILE_LINE=${CONFIG_FILE_LINE%%#*}
+
+                if [[ $PARSE_INI_SEGMENT == 1 && $CONFIG_FILE_LINE =~ ^[[:space:]]*"[" ]]; then
+                        PARSE_INI_SEGMENT=0
+                fi
+
+                if [[ $CONFIG_FILE_LINE == "[$CONFIG_FILE_INI_SEGMENT]" ]]; then
+                        if [[ $INI_SEGMENT_LINE_NUMBER == 0 ]]; then
+                                INI_SEGMENT_LINE_NUMBER=$(( CONFIG_FILE_LINE_NUMBER + 1 ))
+                        fi
+                        PARSE_INI_SEGMENT=1
+                        continue
+                fi
+                if [[ $PARSE_INI_SEGMENT == 0 ]]; then
+                        continue
+                fi
+
+                KEY_NAME=""
+                KEY_VALUE=""
+
+                CONFIG_FILE_LINE_LAST_CHAR=${CONFIG_FILE_LINE:$((${#CONFIG_FILE_LINE} -1 )):1}
+                IFS="="
+                CONFIG_FILE_LINE=($CONFIG_FILE_LINE)
+                unset IFS
+
+                KEY_NAME=${CONFIG_FILE_LINE[0]}
+                KEY_NAME="${KEY_NAME##*( )}"
+                KEY_NAME="${KEY_NAME%%*( )}"
+
+                KEY_VALUE=${CONFIG_FILE_LINE[1]}
+                KEY_VALUE="${KEY_VALUE##*( )}"
+                KEY_VALUE="${KEY_VALUE%%*( )}"
+
+                if [[ "$KEY_NAME" == "$CONFIG_FILE_VALUE_NAME" ]]; then
+                        if [[ $CONFIG_VALUE_LINE_NUMBER == 0 ]]; then
+                                CONFIG_VALUE_LINE_NUMBER=$(( CONFIG_FILE_LINE_NUMBER + 1 ))
+                        fi
+
+                        if [[ -z "$CONFIG_FILE_VALUE_NEW_VALUE" ]]; then
+                                echo "$KEY_VALUE"
+                                break
+                        fi
+                fi
+
+        done
+
+        if [[ ! -z $CONFIG_FILE_VALUE_NEW_VALUE ]]; then
+                if [[ $INI_SEGMENT_LINE_NUMBER == 0 ]]; then
+                        INI_SEGMENT_LINE_NUMBER=1
+                        sed -i "$INI_SEGMENT_LINE_NUMBER i [$CONFIG_FILE_INI_SEGMENT]" "$CONFIG_FILE_PATH"
+                fi
+
+                if [[ $CONFIG_VALUE_LINE_NUMBER == 0 ]]; then
+                        CONFIG_FILE_LINE_COUNT=$(( $INI_SEGMENT_LINE_NUMBER + 1 ))
+                        sed -i "$CONFIG_FILE_LINE_COUNT i $CONFIG_FILE_VALUE_NAME=$CONFIG_FILE_VALUE_NEW_VALUE" "$CONFIG_FILE_PATH"
+                else
+                        sed -ie "${CONFIG_VALUE_LINE_NUMBER}s/.*/$CONFIG_FILE_VALUE_NAME=$CONFIG_FILE_VALUE_NEW_VALUE/" "$CONFIG_FILE_PATH"
+                fi
+        fi
+
+        unset CONFIG_FILE_ARRAY
 }
 
 function get_default_theme ()
 {
-        THEME_NAME=$(read_theme_name_from_file ${PLYMOUTH_CONFDIR}/plymouthd.conf)
+        THEME_NAME=$(read_or_set_file_ini_value ${PLYMOUTH_CONFDIR}/plymouthd.conf Daemon Theme)
         if [ -z "$THEME_NAME" -o ! -r "${PLYMOUTH_DATADIR}/plymouth/themes/$THEME_NAME/$THEME_NAME.plymouth" ]; then
-                THEME_NAME=$(read_theme_name_from_file ${PLYMOUTH_POLICYDIR}/plymouthd.defaults)
+                THEME_NAME=$(read_or_set_file_ini_value ${PLYMOUTH_POLICYDIR}/plymouthd.defaults Daemon Theme)
         fi
 
         if [ -z "$THEME_NAME" -o ! -r "${PLYMOUTH_DATADIR}/plymouth/themes/$THEME_NAME/$THEME_NAME.plymouth" \
@@ -215,9 +306,7 @@ fi
 [ -L ${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth ] && rm -f ${PLYMOUTH_DATADIR}/plymouth/themes/default.plymouth
 
 [ -d ${PLYMOUTH_CONFDIR} ] || mkdir -p ${PLYMOUTH_CONFDIR}
-grep -q '^[[]Daemon[]]' ${PLYMOUTH_CONFDIR}/plymouthd.conf 2> /dev/null || echo '[Daemon]' >> ${PLYMOUTH_CONFDIR}/plymouthd.conf
-sed -i -e '/^Theme[[:blank:]]*=.*/d' ${PLYMOUTH_CONFDIR}/plymouthd.conf
-sed -i -e "s/^\([[]Daemon[]]\)\n*/\1\nTheme=${THEME_NAME}/" ${PLYMOUTH_CONFDIR}/plymouthd.conf
+read_or_set_file_ini_value ${PLYMOUTH_CONFDIR}/plymouthd.conf Daemon Theme ${THEME_NAME}
 
 [ $DO_INITRD_REBUILD -ne 0 ] && (${PLYMOUTH_LIBEXECDIR}/plymouth/plymouth-update-initrd)
 exit 0