Reading and Writing a conf file - Suggestions and improvements?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Reading and Writing a conf file - Suggestions and improvements?
# 1  
Old 12-05-2014
Reading and Writing a conf file - Suggestions and improvements?

Hello all

As part of my TUI - (line based) Text User Interface, i do have 2 commands to assist working with conf files.
Now, for me they work, but since i wrote them, i automaticly use them they way they should be used... you know what i mean. Smilie

Anyway, they are designed to read 'simple' values, such as words or numbers, maybe a sentence.
However, if there is a 'variable' saved, it shows them, and upon saving it saves it 'as is'.

But this leads to 'shell injection', which i certainly want to avoid here, as i only want the values to be saved or read as is.

The usage is quite simple:
to get a list:
Code:
:) ~ $ tui-conf-get -l /etc/default/grub
GRUB_TIMEOUT
GRUB_DISTRIBUTOR
GRUB_DEFAULT
GRUB_DISABLE_SUBMENU
GRUB_TERMINAL_OUTPUT
GRUB_CMDLINE_LINUX
GRUB_DISABLE_RECOVERY
GRUB_THEME
GRUB_GFXMODE
GRUB_GFXPAYLOAD_LINUX

Read a value:
Code:
✔ ~ $ tui-conf-get /etc/default/grub GRUB_CMDLINE_LINUX
rd.luks.uuid luks-<guid-string> vconsole.font latarcyrheb-sun16 rd.luks.uuid luks-<guid-string> $([ -x /usr/sbin/rhcrashkernel-param ] && /usr/sbin/rhcrashkernel-param || :)✔ ~ $ 

or
Code:
+ ~ $ tui-conf-get /etc/default/grub GRUB_THEME
/boot/grub2/themes/circled-nasa-horizon/theme.txt:) ~ $ 

Write a value:
Code:
✔ ~ $ sudo tui-conf-set /etc/default/grub GRUB_THEME /boot/grub2/themes/circled-nasa-capsule/theme.txt
:) ~ $ tui-conf-get /etc/default/grub GRUB_THEME
/boot/grub2/themes/circled-nasa-capsule/theme.txt+ ~ $

The 'core' of tui-conf-get:
Code:
...
	[[ -z "$2" ]] && printf "$help_text" && exit $RET_HELP
	while getopts "ilh" name
	do 	case $name in
		i)	OPT="-i"
			;;
		l)	grep -v ^# "$2"|grep "="|sed s,"="," ",g|awk '{print $1}'
			exit 0
			;;
		h)	printf "$help_text"
			exit $RET_HELP
			;;
		esac
	done
	shift $(($OPTIND - 1))
	CONFFILE="$1"
	VARNAME="$2"
	[[ ! -f "$CONFFILE" ]]  && echo "$CONFFILE dont exist?" "$TUI_FAIL" && exit 1
#
#	Display & Action
#
	VALUE=$(grep $OPT "${VARNAME}=" "$CONFFILE"|grep -v ^#|sed s,'"','',g|sed s,'=',' ',g) > /dev/zero
	VALUE="${VALUE:${#VARNAME}+1}"
	printf "$VALUE"

The core of tui-conf-set is a bit more complex, as i want to preserve existing quotes of the value, without the user needing to add them again. Also there is specialy handling according to chars within the value-string to be saved, if there is a coma, back-/slash, whatsoever, and change the Sed-Divider (SD) accordingly.
Code:
#
# 	Preformat strings
#
	SEARCH="$(grep $OPT "${VARNAME}=" "$CONFFILE"|grep -v ^#|tr -d [:space:])"
	$SMALL && VARNAME="${VARNAME,,}"
	$CAPS  && VARNAME="${VARNAME^^}"
	printf  "$SEARCH"|grep -q "\"" && \
		REPLACE="$VARNAME=\"$VALUE\"" || \
		REPLACE="$VARNAME=$VALUE"
	# Set proper SED 'divider'
	SD=","
	if echo "$REPLACE"|grep -q "$SD"
	then 	# Coma was found
		SD="/"
		printf "$REPLACE"|grep ","|grep "$SD"|grep -q '\\' && SD="\\"	# backslash was found
		[[ ! "$SD" = "/" ]] && \
			printf "$REPLACE"|grep ","|grep "$SD"|grep -q "/" && SD="|"	# Forward slash was found
	fi
	# Troubles with VARIABLES due to leading '$'
	printf "$SEARCH"|grep -q "\$" && \
		SEARCH="$(printf "$SEARCH"|sed s,'\$','\\\$',g)" && \
		hadDollar=true
	# FORUM EDIT: This was required to escape dollar signes, so they are not 'executed' or read
#
#	Display & Action
#
	# Generate the command
	cmd="$(which sed) s${SD}'${SEARCH}'${SD}'${REPLACE}'${SD}g -i \"$CONFFILE\""
	# Save changes
	if ! grep -q "$VARNAME" "$CONFFILE"
	then	# Its not there yet, just append it
		printf "${REPLACE}\n" >> "$CONFFILE"
	elif $hadDollar
	then	# FORUM EDIT: This is required to remove the escaped dollar signed, so the dollar sign is saved and not its (the variables) value.
	eval "$cmd"
	else	$cmd
	fi
	#
	# Return true if replaced string was found
	# This is required, since using RET=$? returned true eventhough value was not saved...
	grep -q "$REPLACE" "$CONFFILE"

Any suggestions?

To be complete, i add the full scripts as attachments, and inform you that to use sudo tui-conf-set CONFIG VARIABLE VALUE tui-conf-set must be located in either /bin or /sbin, $HOME/bin will not work unless you use: sudo $(which tui-conf-set)
As they are part of a package, they originaly do not have the .sh extension, that has been added to attach them here.

Thank you in advance

Last edited by sea; 12-05-2014 at 10:25 PM.. Reason: typo
This User Gave Thanks to sea For This Post:
# 2  
Old 12-05-2014
Hey

I hope I'm not completely missing the point here. Smilie
It seems there is a lot of searching for characters that need to be escaped, and changing the SD because of file content.

In that case, it might save some work to decide what you want to use for the SD, say '|', and include it in a group of others you want to escape, such as $,/". etc.

Sed has a character '&' which stands for "what was found". You could use it something like this and do all your escaping in one go, and not have to change the SD so much:
Code:
sed 's|["$/\|\@]|\\&|g'

Am I even close to what you need?

Last edited by ongoto; 12-05-2014 at 07:03 PM.. Reason: forgot something
This User Gave Thanks to ongoto For This Post:
# 3  
Old 12-05-2014
Yes, sorry i guess this one belongs to the cathegory of 'unclear description'.

Its exactly what i needed!
And finaly figured why it did fail on some values but not on others while trying to get it working...
i had removed spaces... bad idea... :doh:

But you mix the both... the variable i use as SED-DIVIDER is required, because even with ' strings, it fails if there is the same char within any part of the strings to work with.
But thanks to your saying i had another look and could shorten it a little.

EDIT:
Updated attached file tui-conf-set.sh.
# 4  
Old 12-06-2014
Pretty good.
You've put together a lot of utilities. Haven't had time to try them all but liking what I see. It's a little scary at first, but it shure cuts down on all the comments and clutter.

Cheers
This User Gave Thanks to ongoto For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Suggestions on quality reading

I try to search and read about bash scripting. So far Ive read a few of these: The Beginner Guide to Writing Linux Shell Scripts BASH Programming - Introduction HOW-TO An A-Z Index of the Bash command line for Linux. unix help but I am a visual person that learns from repetition and errors.... (1 Reply)
Discussion started by: graphicsman
1 Replies

2. Shell Programming and Scripting

Reading and writing in same file

Hi All, Here is my requirement. I am grepping through the log files and cutting some fields from the file to generate a csv file. Now I have to check if 2nd field is having some fixed value then with the help of 4th field I have to look in same log and run another grep command to retrieve the... (11 Replies)
Discussion started by: kmajumder
11 Replies

3. Shell Programming and Scripting

reading a file extracting information writing to a file

Hi I am trying to extract information out of a file but keep getting grep cant open errors the code is below: #bash #extract orders with blank address details # # obtain the current date # set today to the current date ccyymmdd format today=`date +%c%m%d | cut -c24-31` echo... (8 Replies)
Discussion started by: Bruble
8 Replies

4. Programming

unexpected values received when writing and reading from file

In the code below i try to write and read from a file, but i get unexpected results, like after writing i cannot open the file, and when reading the file the value entered earlier is not shown bool creat_fragments(int nFragment) { int fd, rand_value; char frag_path, buf; for(int... (8 Replies)
Discussion started by: saman_glorious
8 Replies

5. Shell Programming and Scripting

Searching for Log / Bad file and Reading and writing to a flat file

Need to develop a unix shell script for the below requirement and I need your assistance: 1) search for file.log and file.bad file in a directory and read them 2) pull out "Load_Start_Time", "Data_File_Name", "Error_Type" from log file 4) concatinate each row from bad file as... (3 Replies)
Discussion started by: mlpathir
3 Replies

6. Shell Programming and Scripting

Reading data from DataBase and Writing to a file

Hi All, Please help me in writing data to a file in one row. In database there is a column which contains large data which does not fit in the file in one row. The column contains list of paths. I want to write these paths to a file in one row. Please find the code below writes : ... (2 Replies)
Discussion started by: rajeshorpu
2 Replies

7. Programming

I need help with file reading/writing in C

Hello everybody, I'm trying to code a program which makes the following: It sends an ARP request frame and when it gets the reply, extracts the IP address of source and writes it to a .txt file. This is gonna be done with many hosts (with a for() loop), so, the text file would look like... (2 Replies)
Discussion started by: Zykl0n-B
2 Replies

8. UNIX for Dummies Questions & Answers

Log File Writing and Reading

Hi all, I have the following shell script code which tries to sftp and writes the log into the log file. TestConnection () { echo 'Connection to ' $DESTUSERNAME@$DESTHOSTNAME $SETDEBUG if ]; then rm $SCRIPT ; fi touch $SCRIPT echo "cd" $REMOTEDIR >> $SCRIPT echo "quit" >>... (10 Replies)
Discussion started by: valluvan
10 Replies

9. UNIX for Dummies Questions & Answers

reading ,writing,appending ,manipulating a file.

Hi my prob statement is to create a new file or to append to the 1tst file the followign chages. File 1: txt file. portfolio No a b c d abc 1 Any Any Any charString cds 2 values values values charString efd 3 can can can charString fdg 4 come come come charString... (4 Replies)
Discussion started by: szchmaltz
4 Replies

10. Programming

Reading and Writing file on LAN

Hi gurus I am not a C programmer but I need to read and write files on a computer on LAN using IP address. Suppose on a computer that has an IP 192.168.0.2 Any help or code example. I did in JAVA using URL, but do not know how to do in ANSI-C. In java: ------- URL url = new... (3 Replies)
Discussion started by: lucky001
3 Replies
Login or Register to Ask a Question