1 #!/bin/sh
2 ###############################################################################
3 # GOsa agent library #
4 ###############################################################################
6 SSH='ssh -o "StrictHostKeyChecking=no" -o "UserKnownHostsFile /dev/null" -o "BatchMode yes" '
8 get_hostname_from_ip() {
9 v=$(host -i $1); w=${v##*[ ]}
10 echo ${w%%.*} | grep -q 'NX'
11 if [ $? -eq 0 ]; then
12 echo "unknown"
13 else
14 echo "$v" | grep -q ';;'
15 if [ $? -eq 0 ]; then
16 if [ -n "$HOSTNAME" ]; then
17 echo "$HOSTNAME"
18 else
19 echo "unknown"
20 fi
21 else
22 echo ${w%%.*}
23 fi
24 fi
25 }
27 get_hostname_from_display()
28 {
29 if [ -n "$DISPLAY" ]; then
31 HOST=${DISPLAY%%:*}
32 NUMBER=${DISPLAY##*:}
34 # IP addresses are not supported here
35 echo $HOST | grep -q '^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$'
36 if [ $? -ne 0 ]; then
37 echo ${DISPLAY%%.*}
38 else
39 get_hostname_from_ip $HOST
40 fi
42 else
43 echo "unknown"
44 fi
45 }
48 kill_user_processes() {
49 # don't let root do this
50 if [ "$USER" == "root" -o $UID -eq 0 ]; then
51 return
52 fi
54 # Preset, or load from file
55 candidates="kdeinit\: soffice.bin mozilla-bin"
56 [ -r /etc/goto/kill-process.conf ] && candidates=$(cat /etc/goto/kill-process.conf)
58 # kill old existing user processes
59 for process in $candidates; do
60 ps -fu $USER | grep "$process" | grep -v 'kprogress' | awk ' FS=" " { system("kill "$2) } '
61 done
63 # kill old existing user processes that didn't left us with SIGTERM
64 for process in $candidates; do
65 ps -fu $USER | grep "$process" | grep -v 'kprogress' | awk ' FS=" " { system("kill "$2) } '
66 done
67 }
69 fix_ldif() {
70 (cat -; echo "bank") | awk '
71 /^[a-zA-Z]/ {
72 if(line!=""){
73 print line
74 }
76 line = $0
77 }
78 /^ / {
79 line = line substr($0,2)
80 }
81 '
82 }
85 ldap_init() {
86 if [ $# -ne 2 ]; then
87 for config in /etc/*ldap/ldap.conf /etc/ldap.conf; do
89 # Not readable? Continue
90 [ ! -r $config ] && continue
92 # Try to read config
93 touch /tmp/agent.$$
94 cat $config | while read line; do
95 echo $line | grep -q '^BASE'
96 [ $? -eq 0 ] && echo LDAP_BASE="\"$(echo $line|tr '\t' ' '|cut -d\ -f2-)\"" >>/tmp/agent.$$
97 echo $line | grep -q '^HOST'
98 [ $? -eq 0 ] && echo LDAP_HOST="$(echo $line|tr '\t' ' '|cut -d\ -f2-)" >>/tmp/agent.$$
99 echo $line | grep -q '^URI'
100 [ $? -eq 0 ] && echo LDAP_HOST="$(v=`echo $line|tr '\t' ' '|cut -d\ -f2-`;echo ${v##*://})" >> /tmp/agent.$$
101 done
102 eval $(cat /tmp/agent.$$)
103 rm /tmp/agent.$$
105 # One successful configuration should be enough
106 break
107 done
108 if [ -z "$LDAP_HOST" -o -z "$LDAP_BASE" ]; then
109 echo "Critical: no LDAP configuration found!"
110 exit
111 fi
112 else
113 LDAP_HOST=$1
114 LDAP_BASE=$2
115 fi
116 }
119 ldap_count() {
120 ldapsearch -x -LLL -h "$LDAP_HOST" -b "$LDAP_BASE" "$1" dn | grep '^dn:' | wc -l
121 }
124 decode_blob() {
125 base64-decode > /tmp/agent-lib-decode.$$
126 file /tmp/agent-lib-decode.$$ 2>/dev/null| grep -qi 'text'
127 [ $? -eq 0 ] && cat /tmp/agent-lib-decode.$$ | recode 'utf8..latin1'
128 [ -f /tmp/agent-lib-decode.$$ ] && rm /tmp/agent-lib-decode.$$
129 }
131 ldap_import() {
132 for v in $(set grep ldap_import_ | cut -d= -f1); do unset $v; done
133 vname_lastrun=""
134 counter=0
135 > /tmp/agent-lib.$$
136 (ldapsearch -x -LLL -h "$LDAP_HOST" -b "$LDAP_BASE" $2 "$1" $3 2> /dev/null) | fix_ldif | sed 's/^\([^:]*\):\(.*\)$/\1="\2"/' | while read line; do
137 vname=$(echo $line|cut -d= -f1)
138 vvalue=$(echo $line|cut -d= -f2-)
140 echo $line | grep -q '=": '
141 if [ $? -eq 0 ]; then
142 vvalue=`echo $line|sed 's/^[^="]*=": //'|decode_blob`
143 vvalue="$vvalue\""
144 else
145 vvalue=`echo $line|sed 's/^[^="]*=" //'`
146 fi
148 if [ "$vname_lastrun" == "$vname" ]; then
149 counter=$(( $counter + 1 ));
150 else
151 counter=0
152 vname_lastrun=$vname
153 fi
155 echo "ldap_import_$vname[$counter]=\"$vvalue" >> /tmp/agent-lib.$$
156 done
158 eval $(cat /tmp/agent-lib.$$)
159 rm /tmp/agent-lib.$$
160 }
162 ldap_cat() {
163 vname_lastrun=""
164 counter=0
165 > /tmp/agent-lib.$$
166 (ldapsearch -x -LLL -h "$LDAP_HOST" -b "$1" -s base 2> /dev/null) | fix_ldif | sed 's/
167 ^\([^:]*\):\(.*\)$/\1="\2"/' | while read line; do
168 vname=$(echo $line|cut -d= -f1)
169 vvalue=$(echo $line|cut -d= -f2-)
171 echo $line | grep -q '=": '
172 if [ $? -eq 0 ]; then
173 vvalue=`echo $line|sed 's/^[^="]*=": //'|decode_blob`
174 vvalue="$vvalue\""
175 else
176 vvalue=`echo $line|sed 's/^[^="]*=" //'`
177 fi
179 if [ "$vname_lastrun" == "$vname" ]; then
180 counter=$(( $counter + 1 ));
181 else
182 counter=0
183 vname_lastrun=$vname
184 fi
186 echo "ldap_import_$vname[$counter]=\"$vvalue" >> /tmp/agent-lib.$$
187 done
189 eval $(cat /tmp/agent-lib.$$)
190 rm /tmp/agent-lib.$$
191 }
195 ldap_get_group_membership_of() {
196 ldapsearch -x -LLL -h "$LDAP_HOST" -b "$LDAP_BASE" "(memberUid=$1)" \
197 cn 2> /dev/null | fix_ldif | awk '/^cn: / {print $2}'
198 }
201 ldap_get_applications_of() {
202 ldapsearch -x -LLL "(memberUid=$1)" gosaMemberApplication | fix_ldif | \
203 awk '/^gosaMemberApplication:/ {print $2}'| sort | uniq
204 }
207 ldap_get_appservers() {
208 ldapsearch -x -LLL "(objectclass=goTerminalServer)" cn | fix_ldif | grep -w cn: |cut -d' ' -f 2
209 }
212 translate() {
213 # Look for translation
214 while read line; do
215 string="${line%%=*}"
216 if [ "$string" == "$*" ]; then
217 echo "${line##*=}"
218 return
219 fi
220 done < /etc/goto/goto-locales.dat
221 echo $*
222 }
225 show_progress() {
226 # No translation available
227 echo $PROGRESS $(translate "$*")
228 }
231 create_desktop_link() {
232 echo "$gosaApplicationFlags" | grep -q "D"
233 if [ $? -eq 0 ]; then
234 [ $DEBUG -eq 1 ] && echo "goto_setup: creating desktop link for application $application" 1>&2
235 cat << EOF > ~/Desktop/$cn
236 [Desktop Entry]
237 Comment=$description
238 Encoding=UTF-8
239 Exec=$gosaApplicationExecute
240 Icon=$HOME/.kde/share/icons/${cn}.png
241 Name=$gosaApplicationName
242 Type=Application
243 EOF
244 fi
245 }
248 create_menu_entry() {
249 echo "$gosaApplicationFlags" | grep -q "M"
250 if [ $? -eq 0 ]; then
251 [ $DEBUG -eq 1 ] && echo "goto_setup: creating menu link for application $application" 1>&2
252 cat << EOF > ~/.local/share/applications/$cn.desktop
253 [Desktop Entry]
254 Type=Application
255 Encoding=UTF-8
256 Exec=$gosaApplicationExecute
257 Name=$gosaApplicationName
258 GenericName=
259 Comment=$description
260 Icon=$HOME/.kde/share/icons/${cn}.png
261 Terminal=false
262 Categories=$appcat;
263 EOF
264 fi
265 }
268 delete_all_applinks() {
269 list=`ldapsearch -x "objectClass=gosaApplication" cn | fix_ldif | awk '/^cn: / {print $2}'`
270 for link in $list; do
271 [ -f $HOME/Desktop/$link ] && rm -f $HOME/Desktop/$link
272 [ -f $HOME/.kde/share/applnk/$link.desktop ] && rm -rf $HOME/.kde/share/applnk/$link.desktop
273 done
274 }
277 function terminal_load_hardware_profile() {
278 rm -f $RAM/etc/sysconfig/GOto && touch $RAM/etc/sysconfig/GOto
279 ldapsearch -x -LLL -h $LDAP_HOST -b "$LDAP_BASE" -D "cn=terminal-admin,$LDAP_BASE" -w "$(cat /etc/goto/secret)" "(&(objectClass=gotoWorkstation)(macAddress=$1))" 2> /dev/null | fix_ldif | sed -e 's/^\([^:]*\): \(.*\)$/\U\1\E="\2"/' -e 's/^GOTO//g' >> /etc/sysconfig/GOto
281 # Get DN and load all parent defaults from tree
282 current=$(grep "^DN=" /etc/sysconfig/GOto|sed 's/\"//g;s/, /,/g;s/^.*,ou=terminals,ou=systems,//g')
284 # Load potential object group entries
285 ldapsearch -x -LLL -h $LDAP_HOST -b "$LDAP_BASE" -D "cn=terminal-admin,$LDAP_BASE" -w "$(cat /etc/goto/secret)" "(&(objectClass=gosaGroupOfNames)(member=$(echo -n $current|sed 's/^DN=//')))" 2> /dev/null | fix_ldif | sed -e 's/^\([^:]*\): \(.*\)$/\U\1\E="\2"/' -e 's/^GOTO//g' >> /etc/sysconfig/GOto
287 # get reverse list of potential default entries - for backward compatibility
288 { while true; do
289 # write out current value
290 echo "ou=terminals,ou=systems,$current"
292 # prepare next entry
293 echo $current | grep -q ','
294 [ $? -ne 0 ] && break
295 [ "$LDAP_BASE" == "$current" ] && break
296 current=${current#*,}
297 done } | tac | while read line; do
299 # Read potential default entries and append
300 # them to sysconfig/GOto
301 ldapsearch -x -LLL -h $LDAP_HOST -D "cn=terminal-admin,$LDAP_BASE" -w "$(cat /etc/goto/secret)" -b $line "(&(objectClass=gotoWorkstation)(cn=wdefault))" 2> /dev/null | fix_ldif | sed -e 's/^\([^:]*\): \(.*\)$/\U\1\E="\2"/' -e 's/^GOTO//g' >> /etc/sysconfig/GOto
302 done
304 # Reverse sysconfig/GOto
305 tac /etc/sysconfig/GOto > /etc/sysconfig/GOto.tmp
306 mv /etc/sysconfig/GOto.tmp /etc/sysconfig/GOto
307 }
310 terminal_has_hardware_profile() {
311 # Do we have a configuration?
312 terminal_load_hardware_profile $1
313 grep -v "cn=default," /etc/sysconfig/GOto | grep -q "DN="
314 }
317 terminal_activated() {
318 # Do we have a configuration?
319 terminal_load_hardware_profile $1
320 grep -v ',ou=incoming,' /etc/sysconfig/GOto | grep -v 'cn=default,' | grep -q "DN="
321 }
324 terminal_dump_hwprofile() {
325 # Save mac address
326 mac=$1
327 name=$(hostname)
329 # Source hardware information detected by hwsetup
330 for module in xserver sound netcard mouse; do
331 [ -f /etc/sysconfig/$module ] && . /etc/sysconfig/$module
332 done
334 # Get hardware information directly from /proc
335 cpu=$(cat /proc/cpuinfo | awk 'BEGIN { FS=": "; ORS="" } /^vendor_id/ {print $2" / "} /^model name/{print $2" - "} /^cpu MHz/ {print $2" MHz"}')
336 mem=$(cat /proc/meminfo | awk '/^MemTotal:/ {print $2" KB"}')
337 modlist=$(lsmod | sed -e '/^Module/d;/^snd/d;s/^\(\w*\).*$/\1/g')
338 hsync=$(ddcxinfo-knoppix -hsync|tr -d ' ')
339 vsync=$(ddcxinfo-knoppix -vsync|tr -d ' ')
341 # USB support?
342 [ -d /proc/bus/usb ] && usb="true" || usb="false"
344 # Add floppy/cdrom
345 grep -q 'floppy' /etc/sysconfig/autofs && FLOPPY='YES' || FLOPPY='NO'
346 grep -q 'cdrom' /etc/sysconfig/autofs && CDROM='YES' || CDROM='NO'
348 cat << EOF
349 dn: cn=$name,ou=incoming,$LDAP_BASE
350 objectClass: gotoWorkstation
351 objectClass: goHard
352 cn: $name
353 macAddress: $mac
354 gotoMode: locked
355 gotoXDriver: $XMODULE
356 gotoXMouseType: $XMOUSETYPE
357 gotoXMouseport: $DEVICE
358 gotoXHsync: $hsync
359 gotoXVsync: $vsync
360 ghUsbSupport: $usb
361 gotoFloppyEnable: $FLOPPY
362 gotoCdromEnable: $CDROM
363 gotoSndModule: $SNDMODULE
364 EOF
366 # Insert IDE-Devices
367 for f in /proc/ide/ide?/hd?/model; do
368 [ -f $f ] && echo "ghIdeDev: "$(echo $f | cut -d/ -f5)" ("$(cat $f)")"
369 done
371 (cat /proc/scsi/scsi | sed -ne 's/.*Vendor: \([^ ]*\) *Model: \([^ ]*\) *.*$/\1 \2/p') 2> /dev/null|while read line; do
372 echo ghScsiDev: $line
373 done
375 # Insert modules
376 for m in $modlist; do
377 echo "gotoModules: $m"
378 done | sort | uniq
380 # Add potential swap filesystems
381 [ -f /etc/sysconfig/swap ] && cat /etc/sysconfig/swap | while read line; do
382 echo "gotoFilesystem: $line"
383 done
385 # Add autofs devices
386 [ -f /etc/sysconfig/autofs ] && cat /etc/sysconfig/autofs | while read line; do
387 echo "gotoAutoFs: $line"
388 done
390 cat << EOF
391 ghGfxAdapter: $XDESC
392 ghNetNic: `cat /etc/sysconfig/netcard|grep "^FULLNAME"|cut -d= -f2|tr -d "\""`
393 ghSoundAdapter: `cat /etc/sysconfig/sound|grep "^FULLNAME"|cut -d= -f2|tr -d "\""`
394 ghMemSize: $mem
395 ghCpuType: $cpu
396 EOF
397 }
400 terminal_save_hardware_profile() {
401 # Get hardware ldif and strip out possibly broken entries
402 terminal_dump_hwprofile $1 | grep -v '^[^:]*: *$' &> /tmp/upload.ldif
404 # Upload ldif
405 while true; do
406 error=$(ldapadd -x -h "$LDAP_HOST" -D "cn=terminal-admin,$LDAP_BASE" -w "$(cat /etc/goto/secret)" < /tmp/upload.ldif 2>&1)
407 if [ $? -ne 0 ]; then
408 dialog --msgbox "Das Terminal konnte sich nicht am LDAP anmelden. Bitte prüfen Sie de Einstellungen: $error" 14 60
409 else
410 break
411 fi
412 done
413 }
416 terminal_alsa_setup() {
417 audio=$(lspci -n | awk '/ 0401/ {print $3}' | sed 's/://g' | head -1)
418 KVER=$(uname -r)
419 MODULE=$(cat /lib/modules/$KVER/modules.pcimap | (while read driver vendor device dummy; do
420 if expr $driver : 'snd-.*' > /dev/null; then
421 printf '%04x%04x %s\n' $vendor $device $driver | grep "^$audio" | cut -d\ -f2
422 fi
423 done))
424 echo "SNDMODULE=\"$MODULE\"" >> /etc/sysconfig/sound
425 }
428 terminal_autofs_setup(){
429 wcount=1
430 lcount=1
432 # Remove old ones
433 rm -f /etc/sysconfig/autofs /etc/sysconfig/swap
435 # Generate autofs entries for removable devices
436 for d in /dev/floppy/?; do
437 [ "$d" == "/dev/floppy/?" ] && break
438 nr=$(echo $d | sed 's/^.*\/\([^/]*$\)/\1/g')
439 echo "floppy$nr -fstype=auto,sync,nodev,nosuid,umask=000,quiet,rw :$d" >> /etc/sysconfig/autofs
440 done
442 for d in /dev/cdroms/*; do
443 [ "$d" == "/dev/cdroms/*" ] && break
444 name=`echo $d | sed 's/^.*\/\([^/]*$\)/\1/g'`
445 echo "$name -fstype=iso9660,sync,nodev,nosuid,umask=000,quiet,ro :$d" >> /etc/sysconfig/autofs
446 done
448 # Generate autofs entries for fixed drives
449 (sfdisk -qLl | grep "^/" | tr -d '\*') | while read device d1 d2 d3 d4 type d5; do
450 case $type in
451 [4bce])
452 echo "win$wcount -fstype=vfat,sync,nodev,nosuid,umask=000,quiet,rw :$device" >> /etc/sysconfig/autofs
453 wcount=$(( $wcount + 1 ))
454 ;;
455 7)
456 echo "win$wcount -fstype=ntfs,sync,nodev,nosuid,umask=000,quiet,ro :$device" >> /etc/sysconfig/autofs
457 wcount=$(( $wcount + 1 ))
458 ;;
459 83)
460 echo "linux$lcount -fstype=ext3,sync,nodev,nosuid,umask=000,quiet,rw :$device" >> /etc/sysconfig/autofs
461 lcount=$(( $lcount + 1 ))
462 ;;
463 82)
464 echo "$device none swap sw 0 0" >> /etc/sysconfig/swap
465 ;;
466 esac
467 done
468 }
471 get_xdmcp_server(){
472 SERVERS=$(ldapsearch -LLL -b "$LDAP_BASE" -H $LDAP_HOST -x '(&(objectclass=goTerminalServer)(goXdmcpIsEnabled=true))'| awk '/^cn/{print $2}' 2> /dev/null)
474 # Generate load sorted server list
475 { for s in $SERVERS; do
476 xdmping $s -v -t 1 2> /dev/null | awk '!/contacting/ {print $5"|"$1"|"$2}' | sed 's/[:,]//g'
477 done } | egrep "^[0-9]" | sort -n > /tmp/xservers.tmp
479 case $(cat /tmp/xservers.tmp | wc -w | awk '{print $1}') in
480 0)
481 return
482 ;;
483 1)
484 cat /tmp/xservers.tmp | cut -d\| -f2
485 return
486 ;;
487 *)
488 AVAILABLE=""
489 for i in $(cat /tmp/xservers.tmp); do
490 NEW=$(echo "$i" | awk -F "|" '{if ($1 < 0.5) print $1"|"$2}')
491 [ -n "$NEW" ] && AVAILABLE="$NEW\n$AVAILABLE"
492 done
493 if [ -n "$AVAILABLE" ]; then
494 echo -e "$AVAILABLE" > /tmp/xservers.tmp
495 NUM=$(cat /tmp/xservers.tmp | wc -l | awk '{print $1 - 1}')
496 ROW=$(echo $NUM | awk '{print rand() * $1 + 1 ;}' | cut -d . -f1)
497 cat /tmp/xservers.tmp | sed -n "${ROW}p" | cut -d\| -f2
498 else
499 cat /tmp/xservers.tmp|egrep "^[0-9]"|tr "." ","|sort -n|head -1|cut -d\| -f2
500 fi
501 ;;
502 esac
503 }
506 get_fontpath() {
507 ldapsearch -x -LLL -h $LDAP_HOST -b "$LDAP_BASE" "(&(objectClass=goTerminalServer)(cn=$1))" |
508 grep "^goFontPath" | cut -d\ -f2- | sed 's!\/!\/!g'
509 }