Skip to content

Commit

Permalink
kde-plasma/kscreenlocker: Add missing ck-unlock-session
Browse files Browse the repository at this point in the history
Closes: https://bugs.gentoo.org/648352
Package-Manager: Portage-2.3.19, Repoman-2.3.6
  • Loading branch information
a17r committed Feb 21, 2018
1 parent d966fd1 commit 652b506
Showing 1 changed file with 220 additions and 0 deletions.
220 changes: 220 additions & 0 deletions kde-plasma/kscreenlocker/files/ck-unlock-session
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
#!/bin/sh

# This script is to make unlocking using OpenRC/Consolekit easier when the KDE Screenlocker breaks.
#
# Version: 0.2
# Date written: February 2, 2018
# Last modification: February 17, 2018
#
# Copyright (C) 2018 Daniel Frey
# Copyright (C) 2018 Lars Wendler
#
# This script is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This script is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# Some notes:
# -The switch processing/argument handling is very basic.
# -This script assumes session names start with "Session" when listing
# sessions. This is settable via a variable.
#
# Possible actions:
# -h : Show help screen
# -l : List current consolekit sessions
# -u : Unlock specified session (one parameter required - the session name)
# -a : Attempt to unlock all sessions

# Return code documentation
#
# 0: Script executed normally
# 1: Root access is not present for script
# 2: No arguments passed
# 3: Multiple actions requested, can only do one at a time
# 4: Argument passed was not recognized
# 5: Multiple arguments passed for unlock single session, only one needed
# 6: The argument required for unlocksession() is missing (internal error)

SCRIPTNAME="$(basename $0)"

# Return code constants
readonly ERR_NORMAL_OPERATION=0
readonly ERR_NO_ROOT=1
readonly ERR_NO_ARGS=2
readonly ERR_TOO_MANY_ACTIONS=3
readonly ERR_INVALID_ARGUMENTS=4
readonly ERR_TOO_MANY_ARGS=5
readonly ERR_INTERNAL_ARG_MISSING=6

# Action parameter constants
readonly ACTION_NONE=0
readonly ACTION_HELP=1
readonly ACTION_LIST=2
readonly ACTION_UNLOCKALL=3
readonly ACTION_UNLOCK=4

# This is what's used to look for a session via consolekit.
# By default, assume it is prefixed with "Session".
SESSION_SEARCH_PREFIX="Session"

# Check to make sure script has root access, if not... abort now!
if [ "$(id -u)" -ne 0 ]; then
echo "This script must be run as root."
exit ${ERR_NO_ROOT}
fi

showhelp() {
cat <<EOF
${SCRIPTNAME}: a script that helps unlock consolekit sessions
Usage: ${SCRIPTNAME} [action] [parameters]
Actions:
-l : list current sessions available for unlocking
-u : unlock session specified as a parameter
-a : attempt to unlock all current sessions
-h : this screen
Parameters:
The -u parameter requires a session name to unlock, use -l to
list sessions.
Example:
To unlock a single session, use:
${SCRIPTNAME} -u Session1
No arguments will show this screen.
EOF
}

listsessions() {
# Get a list of all sessions, and remove the full colon from the session name
ALLSESSIONS=$(ck-list-sessions | grep "^${SESSION_SEARCH_PREFIX}" | awk -F : '{print $1}')

echo
echo "Sessions present on this machine, space-delineated:"
echo
echo ${ALLSESSIONS}
echo
echo
echo "Session detail (to help locate a specific session:"
ck-list-sessions | grep -A 2 "^${SESSION_SEARCH_PREFIX}"
}

unlocksession() {
# This function expects one parameter set (the session to unlock).
# Make sure the parameter exists before continuing.
if [ -z "${1}" ]; then
showhelp
exit ${ERR_INTERNAL_ARG_MISSING}
fi

echo "Attempting to unlock session $1; messages from dbus are not suppressed."

# Finally, request the unlock.
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/$1 org.freedesktop.ConsoleKit.Session.Unlock
}

unlockallsessions() {
# Get a list of all sessions, and remove the full colon from the session name
ALLSESSIONS=$(ck-list-sessions | grep "^${SESSION_SEARCH_PREFIX}" | awk -F : '{print $1}')

echo "Attempting to unlock all sessions. Messages from dbus are not suppressed."
echo
# Loop through results, attempt to unlock all sessions.
# Count them and report at the end.
COUNT=0
for i in ${ALLSESSIONS}; do
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/$i org.freedesktop.ConsoleKit.Session.Unlock
let "COUNT+=1"
done

echo
echo "Attempted to unlock ${COUNT} session(s)."
}

check_actions() {
# Make sure multiple actions are not chosen.
if [ ${ACTION} -ne ${ACTION_NONE} ]; then
echo "You can only declare one action at a time!"
echo ""
showhelp
exit ${ERR_TOO_MANY_ACTIONS}
fi
}

# Start of "main" routine

# Initialize variables:
# ACTION=default 0; used to make sure more than one action are not
# specified at the same time. If an invalid argument was passed
# (e.g. one without the hyphen prefix) it will be caught as well.
ACTION="${ACTION_NONE}"

# Show help if no arguments provided at all
if [ $# -eq 0 ]; then
showhelp
exit ${ERR_NO_ARGS}
fi

# Process arguments passed, setting environment appropriately.
# During this check, ensure only one action was requested. This
# script will not do multiple things at a time.
while getopts “hlau:” OPTION; do
case ${OPTION} in
h) # Help action
check_actions
ACTION=${ACTION_HELP}
;;
l) # List action
check_actions
ACTION="${ACTION_LIST}"
;;
a) # Enable all USB hubs/devices action
check_actions
ACTION="${ACTION_UNLOCKALL}"
;;
u) # Enable specific hub/device via find command action
check_actions
ACTION="${ACTION_UNLOCK}"

# Save session name passed for later
UNLOCKSESSION="${OPTARG}"
;;
?) # Unknown parameter
showhelp
exit ${ERR_INVALID_ARGUMENTS}
;;
esac
done

# If script reaches this point, only one action was specified, so it is safe
# to continue processing.
case ${ACTION} in
${ACTION_HELP}) # help action
showhelp
;;
${ACTION_LIST}) # list action
listsessions
;;
${ACTION_UNLOCKALL}) # unlock all sessions
unlockallsessions
;;
${ACTION_UNLOCK}) # unlock single session
unlocksession ${UNLOCKSESSION}
;;
*)
echo "Unrecognized action."
echo
showhelp
exit ${ERR_INVALID_ARGUMENTS}
;;
esac

exit ${ERR_NORMAL_OPERATION}

0 comments on commit 652b506

Please sign in to comment.