Skip to end of metadata
Go to start of metadata

broadcast

#!/bin/bash
##########################################################################
#        Broadcast v1.0							 #
#									 #
# A sleazy, dirty, creepy hack to broadcast a message to every single    #
# connected user within an X environment.                                #
# Feel free to enhance and share any enhancement !                       #
#						everchere@everchere.com  #
##########################################################################

#Checking the number of parameters given:
if [ $# -ne 3 ]; then echo "Wrong number of parameters:";echo "Usage: $0 TITLE MESSAGE DURATION";exit 1; fi;
#First parameter is the title of the info box
TITLE="$1"
#Second parameter is the message to be broadcasted
MSG="$2"
#Third parameter is the timeout duration for the Info box.
DURATION="$3"


## Null-Initializes the list of ADVertised CLienTs
ADVCLT=""
## Grabs the name of one of the connected users from which to grab a list of connected displays
USERNAME=`w -h | head -1 | cut -d' ' -f1`
## Grabs the list of connected users
USERLIST=`w -h | cut -d' ' -f1 | sort -d -u |grep [^root]`


## Adds :0 to the list of the displays, since it might not be grabed later if $USERNAME
## is a Network User.
XAUTHOP=":0 "
## Grabs the list of the connected displays from $USERNAME and removes duplicates
XAUTHOP="$XAUTHOP `su $USERNAME -c -l 'xauth list $DISPLAY' | sed 's/.*\(:[0-9]\+\).*/\1/g' | sort -d -u`"


## Core Stuff:

# For each Connected display...
for i in $XAUTHOP
do

	# Try to display the message with each user's environment.
	# That's dirty and kind of "brutal", but I couldn't find a way
	# to associate a display to a user in a clean way... 
	for j in $USERLIST
	do
		# Try to display for the user only if he was not already advertised.
		if ! (echo "$ADVCLT" | grep $j)
		then 
			su $j -c -l "export DISPLAY='localhost${i}'; zenity --info --title='$TITLE' --text='$MSG' --timeout $DURATION"
			# If we could advertise for the user, add him to the list of advertised users.
			[ $? -eq 5 -o $? -eq 0 ] && ADVCLT="$ADVCLT $j" 
		fi
		
		# Same thing here, for non-network users.
        	if ! (echo "$ADVCLT" | grep $j)
        	then
			su $j -c -l "export DISPLAY='${i}'; zenity --info --title='$TITLE' --text='$MSG' --timeout $DURATION" && ADVCLT="$ADVCLT $j"
     		 	[ $? -eq 5 -o $? -eq 0 ] && ADVCLT="$ADVCLT $j"
       		 fi
	done
done

  • No labels