tazpanel diff settings.cgi @ rev 498

Use bottom panel as status bar; settings: data picker, lock icon for locked users; font: add 'calendar', 'modem', and 'vpn' icons; etc...
author Aleksej Bobylev <al.bobylev@gmail.com>
date Mon May 18 17:13:57 2015 +0300 (2015-05-18)
parents df54c758feb8
children 2a891cb47520
line diff
     1.1 --- a/settings.cgi	Tue May 12 15:05:51 2015 +0300
     1.2 +++ b/settings.cgi	Mon May 18 17:13:57 2015 +0300
     1.3 @@ -22,12 +22,14 @@
     1.4  	getent $1 2>/dev/null || cat /etc/$1
     1.5  }
     1.6  
     1.7 +
     1.8  listdb() {
     1.9 -	for item in $(getdb $1 | cut -d ":" -f 1); do
    1.10 +	for item in $(getdb $1 | cut -d: -f1); do
    1.11  		echo "<option>$item</option>\n"
    1.12  	done
    1.13  }
    1.14  
    1.15 +
    1.16  restart_lxpanel() {
    1.17  	# `lxpanelctl restart` exists, but it breaks often leaving us without any panel
    1.18  	lxpanel_pid="$(ps -o comm,pid | fgrep lxpanel | awk '{print $2}')"
    1.19 @@ -36,7 +38,7 @@
    1.20  
    1.21  	if [ "$USER" == "$lxpanel_user" ]; then
    1.22  		kill $lxpanel_pid
    1.23 -		DISPLAY=':0.0' XAUTHORITY='/var/run/slim.auth' $lxpanel_comm 1>/tmp/debug1 2>/tmp/debug2 &
    1.24 +		DISPLAY=':0.0' XAUTHORITY='/var/run/slim.auth' $lxpanel_comm &
    1.25  	fi
    1.26  }
    1.27  
    1.28 @@ -54,50 +56,65 @@
    1.29  		case $(GET do) in
    1.30  
    1.31  			# Groups page
    1.32 -			delgroups)
    1.33 -				for i in $groups; do delgroup $i; done ;;
    1.34 -			addgroup)
    1.35 -				addgroup $groups ;;
    1.36 -			addmember)
    1.37 -				addgroup $(GET member) $groups ;;
    1.38 -			delmember)
    1.39 -				delgroup $(GET member) $groups ;;
    1.40 +			delgroups) for i in $groups; do delgroup $i; done ;;
    1.41 +			addgroup)  addgroup $groups ;;
    1.42 +			addmember) addgroup $(GET member) $groups ;;
    1.43 +			delmember) delgroup $(GET member) $groups ;;
    1.44  
    1.45  			# Users page
    1.46 -			delusers)
    1.47 -				for i in $users; do deluser $i; done ;;
    1.48 -			lockusers)
    1.49 -				for i in $users; do passwd -l $i | log; done ;;
    1.50 -			unlockusers)
    1.51 -				for i in $users; do passwd -u $i | log; done ;;
    1.52 -			chpasswd)
    1.53 -				echo "$users:$(GET password)" | chpasswd -m | log ;;
    1.54 +			delusers)    for i in $users; do deluser $i; done ;;
    1.55 +			lockusers)   for i in $users; do passwd -l $i | log; done ;;
    1.56 +			unlockusers) for i in $users; do passwd -u $i | log; done ;;
    1.57 +			chpasswd)    echo "$users:$(GET password)" | chpasswd -m | log ;;
    1.58  			adduser)
    1.59  				if [ -n "$users" ]; then
    1.60 -					name=$(GET name); name=${name:-SliTaz User}
    1.61 -					adduser -D -s /bin/sh -g "$name" -G users -h /home/$users $users
    1.62 +					name="$(GET name)"
    1.63 +					adduser -D -s /bin/sh -g "${name:-SliTaz User}" -G users -h /home/$users $users
    1.64  					echo "$user:$(GET passwd)" | chpasswd -m | log
    1.65  					for i in audio cdrom floppy video tty; do addgroup $users $i; done
    1.66 +					passwd -u $users | log
    1.67  				fi ;;
    1.68  
    1.69  			# System time
    1.70 -			settz)
    1.71 -				GET tz > /etc/TZ;;
    1.72 -			date) # normalize to two digits
    1.73 -				date $(printf '%02d%02d%02d%02d%d.%02d' "$(GET month)" "$(GET day)" "$(GET hour)" "$(GET min)" "$(GET year)" "$(GET sec)") >/dev/null;;
    1.74 -			rdate)
    1.75 +			calendar) # display Yad date picker (AJAX)
    1.76 +				new_date="$(DISPLAY=':0.0' XAUTHORITY='/var/run/slim.auth' \
    1.77 +					yad --calendar --on-top --mouse --undecorated \
    1.78 +					--window-icon=config-date --title="$(_ 'Set date')" \
    1.79 +					--date-format='%x<span style="display:none">%F</span>')"
    1.80 +				header
    1.81 +				echo "$new_date"; exit 0;;
    1.82 +
    1.83 +			settz) # set timezone
    1.84 +				GET tz > /etc/TZ ;;
    1.85 +
    1.86 +			date) # only accepted format is MMDDhhmm[[YY]YY][.ss]
    1.87 +				if [ -n "$(GET dateFull)" ]; then
    1.88 +					dateFull="$(GET dateFull)" # %F = YYYY-MM-DD
    1.89 +					date $(printf '%02d%02d%02d%02d%d.%02d' "${dateFull:5:2}" \
    1.90 +						"${dateFull:8:2}" "$(GET hour)" "$(GET min)" \
    1.91 +						"${dateFull:0:4}" "$(GET sec)") >/dev/null
    1.92 +				else
    1.93 +					date $(printf '%02d%02d%02d%02d%d.%02d' "$(GET month)" \
    1.94 +						"$(GET day)" "$(GET hour)" "$(GET min)" "$(GET year)" \
    1.95 +						"$(GET sec)") >/dev/null
    1.96 +				fi;;
    1.97 +
    1.98 +			rdate) # get and possibly set the system date/time from a remote host
    1.99  				rdate -s tick.greyware.com ;;
   1.100 -			hwclock)
   1.101 +
   1.102 +			hwclock) # query and set hardware clock (RTC)
   1.103  				hwclock -w -u ;;
   1.104  
   1.105 +			gethwclock) # get date/time from hardware clock (AJAX)
   1.106 +				header; hwclock -ur | sed 's|0.000000 seconds||'; exit 0;;
   1.107 +
   1.108  		esac
   1.109  		;;
   1.110  
   1.111  
   1.112 -	*\ gen_locale\ *)
   1.113 -		new_locale=$(GET gen_locale) ;;
   1.114 -	*\ gen_keymap\ *)
   1.115 -		new_keymap=$(GET gen_keymap) ;;
   1.116 +	*\ gen_locale\ *) new_locale=$(GET gen_locale) ;;
   1.117 +	*\ gen_keymap\ *) new_keymap=$(GET gen_keymap) ;;
   1.118 +
   1.119  	*\ apply_xorg_kbd\ *)
   1.120  		sed -i "s/XkbLayout.*/XkbLayout \" \"$(GET apply_xorg_kbd)\"/" \
   1.121  			/etc/X11/xorg.conf.d/40-Keyboard.conf ;;
   1.122 @@ -112,9 +129,9 @@
   1.123  
   1.124  		dd="$HOME/.local/share/desktop-directories"; sd="$dd/SliTazMenu.directory"
   1.125  
   1.126 -		case $REMOTE_USER in
   1.127 -			root) color=31; ind='#';;
   1.128 -			*)    color=32; ind='$';;
   1.129 +		case "$REMOTE_USER" in
   1.130 +			root) color='31'; ind='#';;
   1.131 +			*)    color='32'; ind='$';;
   1.132  		esac
   1.133  
   1.134  		case $(GET tweak) in
   1.135 @@ -166,7 +183,7 @@
   1.136  		;;
   1.137  
   1.138  
   1.139 -	*\ menuIcon\ *)
   1.140 +	*\ menuIcon\ *) # return specified image (AJAX)
   1.141  		icon="/usr/share/pixmaps/$(GET menuIcon).png"
   1.142  		[ ! -r $icon ] && exit 0
   1.143  		header "Content-Type: image/png"; cat $icon; exit 0
   1.144 @@ -214,18 +231,16 @@
   1.145  				</thead>
   1.146  				<tbody>
   1.147  EOT
   1.148 -		for group in $(getdb group | cut -d ":" -f 1); do
   1.149 +		for group in $(getdb group | cut -d: -f1); do
   1.150  			IFS=':'
   1.151  			set -- $(getdb group | grep "^$group:")
   1.152  			unset IFS
   1.153 -			gid=$3
   1.154 -			members=$4
   1.155  			cat <<EOT
   1.156  					<tr>
   1.157  						<td><input type="checkbox" name="group" value="$group" id="$group"/>
   1.158  							<label for="$group" data-icon="group">$group</label></td>
   1.159 -						<td>$gid</td>
   1.160 -						<td>${members//,/, }</td>
   1.161 +						<td>$3</td>
   1.162 +						<td>${4//,/, }</td>
   1.163  					</tr>
   1.164  EOT
   1.165  		done
   1.166 @@ -239,40 +254,27 @@
   1.167  
   1.168  <section>
   1.169  	<header>$(_ 'Add a new group')</header>
   1.170 -	<form>
   1.171 +	<form class="wide">
   1.172  		<input type="hidden" name="groups"/>
   1.173 -		<table>
   1.174 -			<tr><td>$(_ 'Group name:')</td>
   1.175 -				<td><input type="text" name="group"/></td>
   1.176 -			</tr>
   1.177 -			<tr><td colspan="2">
   1.178 -				<button type="submit" name="do" value="addgroup" data-icon="add">$(_ 'Create group')</button>
   1.179 -			</td></tr>
   1.180 -		</table>
   1.181 +		<footer>$(_ 'Group name:') <input type="text" name="group"/>
   1.182 +			<button type="submit" name="do" value="addgroup" data-icon="add">$(_ 'Create group')</button>
   1.183 +		</footer>
   1.184  	</form>
   1.185  </section>
   1.186  
   1.187  
   1.188  <section>
   1.189  	<header>$(_ 'Manage group membership')</header>
   1.190 -	<form>
   1.191 +	<form class="wide">
   1.192  		<input type="hidden" name="groups"/>
   1.193 -		<table>
   1.194 -			<tr>
   1.195 -				<td>$(_ 'Group name:')</td>
   1.196 -				<td><select name="group">$(listdb group)</select></td>
   1.197 -				<td>$(_ 'User name:')</td>
   1.198 -				<td><select name="member">$(listdb passwd)</select></td>
   1.199 -			</tr>
   1.200 -			<tr>
   1.201 -				<td colspan="2">
   1.202 -					<button name="do" value="addmember" data-icon="add">$(_ 'Add user')</button>
   1.203 -				</td>
   1.204 -				<td colspan="2">
   1.205 -					<button name="do" value="delmember" data-icon="delete">$(_ 'Remove user')</button>
   1.206 -				</td>
   1.207 -			</tr>
   1.208 -		</table>
   1.209 +		<div>
   1.210 +			$(_ 'Group name:') <select name="group">$(listdb group)</select>
   1.211 +			$(_ 'User name:') <select name="member">$(listdb passwd)</select>
   1.212 +		</div>
   1.213 +		<footer>
   1.214 +			<button name="do" value="addmember" data-icon="add">$(_ 'Add user')</button>
   1.215 +			<button name="do" value="delmember" data-icon="delete">$(_ 'Remove user')</button>
   1.216 +		</footer>
   1.217  	</form>
   1.218  </section>
   1.219  
   1.220 @@ -303,18 +305,20 @@
   1.221  				<tr>
   1.222  					<td>$(_ 'Login')</td>
   1.223  					<td>$(_ 'User ID')</td>
   1.224 -					<td>$(_ 'Name')</td>
   1.225 +					<td>$(_ 'User Name')</td>
   1.226  					<td>$(_ 'Home')</td>
   1.227  					<td>$(_ 'Shell')</td>
   1.228  				</tr>
   1.229  			</thead>
   1.230  			</tbody>
   1.231  EOT
   1.232 -		for login in $(getdb passwd | cut -d ":" -f 1); do
   1.233 -			if [ -d /home/$login ]; then
   1.234 -				colorlogin=$login
   1.235 -				grep -qs "^$login:!" /etc/shadow &&
   1.236 -					colorlogin="<span style='color: red;'>$login</span>"
   1.237 +		for login in $(getdb passwd | cut -d: -f1); do
   1.238 +			if [ -d "/home/$login" ]; then
   1.239 +				blocked=''; usericon='user'
   1.240 +				if grep -qs "^$login:!" /etc/shadow; then
   1.241 +					blocked='class="color31"'
   1.242 +					usericon="lock"
   1.243 +				fi
   1.244  				IFS=':'
   1.245  				set -- $(getdb passwd | grep "^$login:")
   1.246  				unset IFS
   1.247 @@ -322,7 +326,7 @@
   1.248  <tr>
   1.249  	<td style="white-space: nowrap">
   1.250  		<input type="checkbox" name="user" value="$login" id="$login"/>
   1.251 -		<label for="$login" data-icon="user">$colorlogin</label></td>
   1.252 +		<label for="$login" data-icon="$usericon" $blocked>$login</label></td>
   1.253  	<td>$3:$4</td>
   1.254  	<td>$(echo $5 | sed s/,.*//)</td>
   1.255  	<td>$6</td>
   1.256 @@ -337,11 +341,9 @@
   1.257  EOT
   1.258  		cat <<EOT
   1.259  		<footer>
   1.260 -			<div>
   1.261 -				$(_ 'Password:')
   1.262 -				<input type="password" name="password"/>
   1.263 -				<button type="submit" name="do" value="chpasswd" data-icon="ok">$(_ 'Change password')</button>
   1.264 -			</div>
   1.265 +			$(_ 'Password:')
   1.266 +			<input type="password" name="password"/>
   1.267 +			<button type="submit" name="do" value="chpasswd" data-icon="ok">$(_ 'Change password')</button>
   1.268  		</footer>
   1.269  	</form>
   1.270  </section>
   1.271 @@ -368,7 +370,7 @@
   1.272  </section>
   1.273  EOT
   1.274  
   1.275 -		# `who` output is empty in the Live mode
   1.276 +		# `who` output is empty in the SLiM sessions
   1.277  		if [ -n "$(who)" ]; then
   1.278  			cat <<EOT
   1.279  <section>
   1.280 @@ -396,10 +398,12 @@
   1.281  		#
   1.282  		check_root_tazpanel
   1.283  
   1.284 -		LOADING_MSG="$(_ 'Please wait...')"; loading_msg
   1.285 +		loading_msg "$(_ 'Please wait...')"
   1.286  
   1.287  		cur_loc=$(locale | grep LANG | cut -d= -f2)
   1.288  		cat <<EOT
   1.289 +
   1.290 +
   1.291  <h2 id="locale">$(_ 'Choose locale')</h2>
   1.292  
   1.293  <section>
   1.294 @@ -498,6 +502,7 @@
   1.295  <section>
   1.296  	<header>$(_ 'Small quick tweaks for user %s' "$user")</header>
   1.297  
   1.298 +	<div>
   1.299  	<fieldset><legend>$(_ 'Terminal prompt')</legend>
   1.300  		<table class="wide">
   1.301  			<tr>
   1.302 @@ -577,6 +582,7 @@
   1.303  				'{ printf "<a data-icon=\"conf\" href=\"index.cgi?file=%s\">%s</a> ", $1, gensub(h, "~", "")}'
   1.304  			)")</p>
   1.305  	</fieldset>
   1.306 +	</div>
   1.307  </section>
   1.308  EOT
   1.309  		;;
   1.310 @@ -601,7 +607,7 @@
   1.311  <section>
   1.312  	<header>$(_ 'System time')</header>
   1.313  	<div>
   1.314 -	<form class="wide">
   1.315 +	<form class="wide" id="sysTimeForm">
   1.316  		<fieldset><legend>$(_ 'Time zone:')</legend>
   1.317  			<select name="tz">
   1.318  				$(cd /usr/share/zoneinfo; find * -type f ! -name '*.tab' | sort | \
   1.319 @@ -617,11 +623,14 @@
   1.320  		</fieldset>
   1.321  
   1.322  		<fieldset id="hwclock1"><legend>$(_ 'Hardware clock:')</legend>
   1.323 -			$(hwclock -ur | sed 's|0.000000 seconds||')
   1.324 +			<span id="hwclocks">$(hwclock -ur | sed 's|0.000000 seconds||')</span>
   1.325  			<button name="do" value="hwclock" id="hwclock" data-icon="clock">$(_ 'Set hardware clock')</button>
   1.326  		</fieldset>
   1.327  
   1.328  		<fieldset><legend>$(_ 'Set date')</legend>
   1.329 +EOT
   1.330 +		if [ -z "$(which yad)" ]; then
   1.331 +			cat <<EOT
   1.332  			<input type="number" name="day" value="$(date +%d)" min="1" max="31" size="4" required/>
   1.333  			<select name="month" value="$(date +%m)">
   1.334  				$(for i in $(seq 12); do
   1.335 @@ -630,10 +639,30 @@
   1.336  				done)
   1.337  			</select>
   1.338  			<input type="number" name="year" value="$(date +%Y)" min="2015" max="2030" size="6" required/>
   1.339 +EOT
   1.340 +		else
   1.341 +			cat <<EOT
   1.342 +			<button onclick="datePicker(); return false">
   1.343 +				<span id="dateTime" data-icon="calendar">$(date +%x)<span style="display:none">$(date +%F)</span></span>
   1.344 +			</button>
   1.345 +EOT
   1.346 +		fi
   1.347 +		cat <<EOT
   1.348  		-	<input type="number" name="hour" value="$(date +%H)" min="0"    max="23"   size="4" required/><!--
   1.349  		-->:<input type="number" name="min"  value="$(date +%M)" min="0"    max="59"   size="4" required/><!--
   1.350  		-->:<input type="number" name="sec"  value="00"          min="0"    max="59"   size="4" required/>
   1.351 +EOT
   1.352 +		if [ -z "$(which yad)" ]; then
   1.353 +			cat <<EOT
   1.354  			<button name="do" value="date" data-icon="ok">$(_ 'Set date')</button>
   1.355 +EOT
   1.356 +		else
   1.357 +			cat <<EOT
   1.358 +
   1.359 +			<button data-icon="ok" onclick="submitSysTimeForm()">$(_ 'Set date')</button>
   1.360 +EOT
   1.361 +		fi
   1.362 +		cat <<EOT
   1.363  		</fieldset>
   1.364  	</form>
   1.365  	</div>
   1.366 @@ -643,9 +672,34 @@
   1.367  Date.prototype.timeNow = function() {
   1.368  	return ((this.getHours() < 10)?"0":"") + this.getHours() + ":" + ((this.getMinutes() < 10)?"0":"") + this.getMinutes() + ":" + ((this.getSeconds() < 10)?"0":"") + this.getSeconds();
   1.369  }
   1.370 -setInterval(function(){document.getElementById('time').innerText = new Date().timeNow()}, 1000);
   1.371 +setInterval(function(){
   1.372 +	document.getElementById('time').innerText = new Date().timeNow();
   1.373 +	ajax('settings.cgi?do=gethwclock', '1', 'hwclocks');
   1.374 +}, 1000);
   1.375  
   1.376 -//document.getElementById('hwclock').disabled = 'disabled';
   1.377 +
   1.378 +// Run date picker and return value to the 'dateTime' element
   1.379 +function datePicker() {
   1.380 +	ajax('settings.cgi?do=calendar', '1', 'dateTime');
   1.381 +}
   1.382 +
   1.383 +// Actions to do before form submit and submit
   1.384 +function submitSysTimeForm() {
   1.385 +	sysTimeForm = document.getElementById('sysTimeForm');
   1.386 +
   1.387 +	var dateFull = document.createElement('INPUT');
   1.388 +	dateFull.name = 'dateFull';
   1.389 +	dateFull.value = document.getElementById('dateTime').childNodes[1].innerText;
   1.390 +	dateFull.type = 'hidden';
   1.391 +	sysTimeForm.appendChild(dateFull);
   1.392 +
   1.393 +	var submitDo = document.createElement('INPUT');
   1.394 +	submitDo.name = 'do'; submitDo.value = 'date';
   1.395 +	submitDo.type = 'hidden';
   1.396 +	sysTimeForm.appendChild(submitDo);
   1.397 +
   1.398 +	sysTimeForm.submit();
   1.399 +}
   1.400  </script>
   1.401  </section>
   1.402  EOT