X-Git-Url: http://git.grml.org/?a=blobdiff_plain;f=usr_bin%2Fgrml-lock;h=27ba082034ef0412d3ae806a9e181d909f7127e0;hb=cf233a10facfa3c4b78b2c01edb51449d73c4a1c;hp=e6e50e191ef3fa73b1aa41547b5db83ade6afafe;hpb=d6b26ce3b8ffa721052bfb0eebc546ac9a63e5f9;p=grml-scripts.git diff --git a/usr_bin/grml-lock b/usr_bin/grml-lock index e6e50e1..27ba082 100755 --- a/usr_bin/grml-lock +++ b/usr_bin/grml-lock @@ -1,102 +1,126 @@ -#!/bin/zsh +#!/bin/bash # Filename: grml-lock # Purpose: lock console # Authors: grml-team (grml.org), (c) Michael Prokop # Bug-Reports: see http://grml.org/bugs/ # License: This file is licensed under the GPL v2. -# Latest change: Son Mär 18 16:41:49 CET 2007 [mika] ################################################################################ -PN=$0 +PN="$(basename "$0")" + +[ -n "$USER" ] || USER=grml + +if [ "$1" = "-h" ] || [ "$1" = "--help" ] ; then + echo "${PN}: wrapper script to lock desktop + +This script is a wrapper to lock your desktop session +through the physlock application. + +Usage: just execute $PN without any further options." + exit 0 +fi if [ -r /etc/grml/script-functions ] ; then . /etc/grml/script-functions - check4progs vlock xlock sudo chpasswd dialog || { echo "Sorry, can't continue. Exiting.">&2 ; exit 1 } + check4progs physlock sudo chpasswd dialog || { echo "Sorry, necessary tools missing - can not continue. Exiting.">&2 ; exit 1 ; } fi -if [ -r /etc/grml_version ] ; then -else - dialog --stdout --title "$PN" --msgbox "Warning: this system does not look like a grml-system -it might not work as intended." 7 70 -fi +PWD_TEXT1="Set password (hidden typing):" +PWD_TEXT2="Retype new password:" -welcome_screen() { -dialog --stdout --title "$PN" --msgbox "Welcome to $PN! +# by default use console frontend +DIALOG='dialog' +PWD_CMD="dialog --stdout --title $PN --passwordbox" -This script will lock virtual consoles when running -on console or lock X server when running X. +GUI=false +# only when using X and zenity is available use graphical frontend +if [ -n "${DISPLAY}" ] && [ -x "$(command -v zenity)" ] ; then + DIALOG='zenity' + PWD_CMD="zenity --title $PN --entry --hide-text" + GUI=true +fi -Notice that you can not lock a GNU screen-session -via this script, use the lockscreen command -instead (default is pressing ctrl-a x inside -GNU screen)! +if ! [ -r /etc/grml_version ] ; then + if [ "${GUI}" = true ] ; then + $DIALOG --no-wrap --title "$PN" --warning --text "Warning: this system does not look like a Grml (based) system,\n + and therefore might not work as intended." + else + $DIALOG --title "$PN" --msgbox "Warning: this system does not look like a Grml (based) system + and therefore might not work as intended." 7 70 + fi +fi -Report bugs, send wishes and feedback to the grml team: -http://www.grml.org/ - contact (at) grml.org -" 16 65 +lock_desktop() { + # be backwards compatible, see https://github.com/grml/grml/issues/87 + if physlock --help 2>&1 | grep -q -- '-u user' ; then + sudo physlock -u "$USER" + else + sudo physlock + fi } -lockcons() -{ - vlock -a +is_passwd_set() { + if sudo grep -q "$USER:\*:" /etc/shadow ; then + return 1 + else + return 0 + fi } -lockx() -{ - xlock -} +set_passwd() { + if [ "${GUI}" = true ] ; then + PASSWD1="$($PWD_CMD --text="$PWD_TEXT1")" + PASSWD2="$($PWD_CMD --text="$PWD_TEXT2")" + else + PASSWD1="$($PWD_CMD "$PWD_TEXT1" 0 0)" + PASSWD2="$($PWD_CMD "$PWD_TEXT2" 0 0)" + fi -askxlock() -{ - dialog --stdout --title "$PN" --yesno "Now lock X?" 0 0 - retval=$? - case $retval in - 0) - lockx - ;; - esac -} + if [ -z "$PASSWD1" ] ; then + if [ -n "${GUI}" ] ; then + $DIALOG --title "$PN" --error --text "Error retrieving password. Exiting." + else + $DIALOG --title "$PN" --msgbox "Error retrieving password. Exiting." 0 0 + fi + exit 1 + fi -askvlock() -{ - dialog --stdout --title "$PN" --yesno "Now lock consoles?" 0 0 - retval=$? - case $retval in - 0) - lockcons - ;; - esac + if [ "$PASSWD1" = "$PASSWD2" ] ; then + echo "$USER:$PASSWD2" | sudo chpasswd + else + if [ "${GUI}" = true ] ; then + $DIALOG --no-wrap --title "$PN" --error --text "Error: passwords do not match.\nExiting." + else + $DIALOG --title "$PN" --msgbox "Error: passwords do not match. Exiting." 0 0 + fi + exit 1 + fi } -askpwd() -{ -dialog --stdout --title "$PN" --yesno "Set password for user $USER?" 0 0 -retval=$? -case $retval in - 0) - while [ -z "$PASSWD" ] ; do - PASSWD=$(dialog --stdout --title "$PN" --passwordbox "Set password (hidden typing):" 0 0) - if [ -n "$PASSWD" ] ; then - echo "$USER:$PASSWD" | sudo chpasswd - else - dialog --stdout --title "$PN" --msgbox "Error while setting password. Empty passwords are not accepted." 6 65 - fi - done - ;; - *) -# asklock - ;; -esac +askpwd() { + if [ "${GUI}" = true ] ; then + $DIALOG --no-wrap --title="$PN" --question --cancel-label='Exit' --ok-label='Set password' --text="User $USER has no password set yet.\nWithout a password you will not be able to log in again.\nSet password for user $USER?" + RC=$? + else + $DIALOG --title "$PN" --no-label Exit --yes-label Continue --yesno "User $USER has no password set yet. Without a password you will not be able to log in again. Set password for user $USER?" 0 0 + RC=$? + fi + + if [ "$RC" = "0" ] ; then + set_passwd + else + exit 1 + fi } -if [[ $(tty) == /dev/tty* ]] ; then - welcome_screen - askpwd - askvlock -elif [ -n "$DISPLAY" ] ; then - welcome_screen - askpwd - askxlock +if ! isgrmlcd ; then + lock_desktop +else + if is_passwd_set || askpwd ; then + lock_desktop + else + exit 1 + fi fi ## END OF FILE #################################################################