Code

Inital acl fixed for conferences
[gosa.git] / contrib / fai / goto-fai / goto-support.lib
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
119 ldap_count() {
120         ldapsearch -x -LLL -h "$LDAP_HOST" -b "$LDAP_BASE" "$1" dn | grep '^dn:' | wc -l
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.$$
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
154                 
155                 echo "ldap_import_$vname[$counter]=\"$vvalue" >> /tmp/agent-lib.$$
156         done
158         eval $(cat /tmp/agent-lib.$$)
159         rm /tmp/agent-lib.$$
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}'
201 ldap_get_applications_of() {
202         ldapsearch -x -LLL "(memberUid=$1)" gosaMemberApplication | fix_ldif | \
203                                 awk '/^gosaMemberApplication:/ {print $2}'| sort | uniq
207 ldap_get_appservers() {
208         ldapsearch -x -LLL "(objectclass=goTerminalServer)" cn | fix_ldif | grep -w cn: |cut -d' ' -f 2
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 $*
225 show_progress() {
226         # No translation available
227         echo $PROGRESS $(translate "$*")
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
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
267  
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
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
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="
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="
324 terminal_dump_hwprofile() {
325         # Save mac address
326         mac=$1
327         name=$(hostname)
328         
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
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
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
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
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
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'