#!/bin/bash
# Script created by Rainer Rössler (roesslerrr-at-web.de)
# License: Free Software (License GPLv3)

# Dieses Script verlinkt Konfigurationsdateien im Serverhome
# (unter Einstellungen) mit dem lokalen Home,
# in dem die Programme nach den Konfigurationen suchen.

if [ -f /etc/linuxmuster-client/profile/usersettings.conf ]
then
 ZWANGSLINKS=`cat /etc/linuxmuster-client/profile/usersettings.conf | grep ^[^#\ ]`
else
 ZWANGSLINKS=""
fi

# Es wird aus usersettings.conf eingelesen, welche Konfigurationen 
# zwingend verlinkt werden. Ist im Serverhome unter Einstellungen 
# keine entsprechende Datei, werden die Daten vom Standardprofil 
# dorthin kopiert. 

if [ -f /etc/linuxmuster-client/profile/usersettings-opt.conf ]
then
 OPTLINKS=`cat /etc/linuxmuster-client/profile/usersettings-opt.conf | grep ^[^#\ ]`
else
 OPTLINKS=""
fi

# Optionale Links werden in usersettings-opt.conf eingetragen.
# Ist hier ein "ALL:ALL" (Quelle Serverhome:Ziel lokales Home) 
# eingetragen, werden alle Konfigurationsdateien
# im Serverhome unter Einstellungen mit der gleichnamigen
# Konfigurationsdatei im lokalen Home verlinkt
# (z.B. ".gimp-2.6" wird verlinkt mit ".gimp-2.6").
# Sind spezielle Orte für die Konfiguration zu verwenden,
# müssen diese separat aufgeführt werden
# (z.B. "firefox:.mozilla/firefox/123xyz.default"
#  oder "libreoffice:.config/libreoffice").

# Konfiguration einlesen für                                                                                                         
# Basics zu linuxmuster-clients                                                                                                      
. /etc/linuxmuster-client/linuxmuster-client.conf || exit 1
# Verzeichnis für Einstellungen im Heimatverzeichnis auf dem Server                                                                  
. /etc/linuxmuster-client/profile/home-preference.conf || exit 1                                                                     
# Verzeichnisnamen über Links                                                                                                        
#. /etc/linuxmuster-client/shares/linkfoldername.conf || exit 1

# Hier ist der Ort anzugeben, an dem die Konfigurationen
# auf dem Server liegen
#SERVEREINSTELLUNGEN="Home_auf_Server/Einstellungen"
SERVEREINSTELLUNGEN=`echo $HOMEFOLDERNAME/$HOMEPREFERENCEFOLDERNAME`

# Die Variable $HOMEDIR wird übergreifend gesetzt
# daher auskommentiert
#HOMEDIR="`pwd`"
 
# this script should only get executed once, before the users home from the
# server gets mounted. In this case $USER and $VOLUME are the same.
# $USER and $VOLUME can also be the same, when mounting $VOLUME from a different server,
# thus return if $USER and $VOLUME are different or if the serverip is different from the serverip of the main server
requestserverip=$(gethostip $SERVER | awk '{print $2}')
lmlserverip=$(grep "^uri\ ldap://" /etc/ldap.conf | head -n 1 | sed "s@^uri\ ldap://@@;s@/.*@@")
if [ $USER != $VOLUME -o $lmlserverip != $requestserverip ]; then
   msg2log pre-mount "LML: $lmlserverip, Request: $requestserverip"
   return 0
fi

# Ist das Verzeichnis $SERVEREINSTELLUNGEN nicht vorhanden, 
# wird es angelegt
if [ -d $HOMEDIR/$SERVEREINSTELLUNGEN ]
then
 cd ~
else 
 mkdir -p $HOMEDIR/$SERVEREINSTELLUNGEN
fi

# Um in den Schleifen Inhalte mit Leerzeichen verarbeiten zu können,
# die durch das Leerzeichen nicht als getrennte Inhalte interpretiert werden
# wird folgende Option IFS=$'\012' gesetzt
IFS=$'\012'

# Serverkonfigurationen nach ZWANGSLINKS erzeugen

for ZWANG in $ZWANGSLINKS; do
 
 SERVER=`echo $ZWANG | cut -d ":" -f 1`
 
 LOKAL=`echo $ZWANG | cut -d ":" -f 2`
 
 # Wenn Ziel auf Server NICHT vorhanden, 
 # (weder als Verzeichnis -d noch als Datei -f)
 # wird dieses aus dem Standardprofil 
 # (also das lokal vorhandene) kopiert.

 # Konfigurationsverzeichnisse

 if [ -d `echo $HOMEDIR/$SERVEREINSTELLUNGEN/$SERVER` ]
 then
  cd $HOMEDIR
 else
  
  if [ -f `echo $HOMEDIR/$SERVEREINSTELLUNGEN/$SERVER` ]
  then 
   cd $HOMEDIR
  else
   
   if [ -d `echo $HOMEDIR/$LOKAL` ]
   then
    
    cp -a $HOMEDIR/$LOKAL $HOMEDIR/$SERVEREINSTELLUNGEN/$SERVER
    
   else
    
    if [ -f `echo $HOMEDIR/$LOKAL` ]
    then 
     
     cp $HOMEDIR/$LOKAL $HOMEDIR/$SERVEREINSTELLUNGEN/$SERVER
     
    else
     
     touch $HOMEDIR/$SERVEREINSTELLUNGEN/$SERVER-kann-nicht-erzeugt-werden
     # Hinweis:
     # Ohne Standard kann kein Konfiguration erzeugt werden,
     # da nicht bekannt ist, ob es eine Datei oder ein Verzeichnis sein muss.
    
    fi  
    
   fi 
   
  fi
  
 fi 
 
done


# Konfigurationen im Serverhome erzeugt


# Für die Konfigurationen auf dem Serverhome (unter Einstellungen)
# werden Links ins lokale Home erzeugt, sofern die 
# Konfigurationen unter usersettings.conf oder usersettings-opt.conf
# aufgeführt sind, bzw. ein "ALL:ALL" enthalten ist (dann werden alle
# verlinkt).

# Alle Dateien im Serverhome unter Einstellungen werden eingelesen
ZIELE=`ls -A $HOMEDIR/$SERVEREINSTELLUNGEN/`

# ". .." werden entfernt
#ZIELE=`echo $ZIELE | cut -b 6-`
# mit Option -A nicht mehr notwendig

# Alle vorgesehenen Konfigurationen einlesen
# ist ein "ALL:ALL" enthalten?
if [ "`echo $OPTLINKS | grep "ALL:ALL"`" = "" ]
then 
 ALLE="0"
else
 ALLE="1"
fi

ALLEKONF=`echo $ZWANGSLINKS $OPTLINKS`

# Alle eingelesenen Dateien aus Serverhome werden mit dem 
# lokalen home verlinkt, sofern entsprechende Einträge (ALLE=0)
# oder "ALL:ALL" gefunden wird (ALLE=1).

for LINKZIEL in $ZIELE; do

 if [ "`echo $ALLEKONF | grep $LINKZIEL`" = "" ]
 then
  # wenn keine Konfiguration gesetzt ist und
  # "ALL:ALL" gesetzt (-> ALLE=1)
  # wird der Link 1:1 gesetzt (LINKZIEL <-> LINKZIEL)
  if [ "$ALLE" = "1" ]
  then
   rm -rf $HOMEDIR/$LINKZIEL
   ln -s $HOMEDIR/$SERVEREINSTELLUNGEN/$LINKZIEL $HOMEDIR/$LINKZIEL
  fi
 else 
  # anderenfalls gibt es einen Konfiguration für die Einstellungen
  # dann wird das Ziel bestimmt und der Link gesetzt
 
  # zunächst werden Zwangslinks durchsucht
  # ein vorheriges Zusammensetzen von optionalen und Zwangslinks
  # funktioniert nicht, das dann alles als eine Zeile interpretiert wird
  
  for EINZEL in $ZWANGSLINKS; do
   if [ "`echo $EINZEL | grep $LINKZIEL`" == "" ] 
   then
    cd ~
   else
    LOKAL=`echo $EINZEL | cut -d ":" -f 2`
    rm -rf $HOMEDIR/$LOKAL
    ln -s $HOMEDIR/$SERVEREINSTELLUNGEN/$LINKZIEL $HOMEDIR/$LOKAL
   fi 
  done
  
  # dann werden optionale Links durchsucht
  for EINZEL in $OPTLINKS; do
   if [ "`echo $EINZEL | grep $LINKZIEL`" == "" ] 
   then
    cd ~
   else
    LOKAL=`echo $EINZEL | cut -d ":" -f 2`
    rm -rf $HOMEDIR/$LOKAL
    ln -s $HOMEDIR/$SERVEREINSTELLUNGEN/$LINKZIEL $HOMEDIR/$LOKAL
   fi 
  done

  
 fi

done

# Das Script wird nicht mit einem "exit 0" beendet, da es in das Script
# /usr/sbin/linuxmuster-pam-mount includiert ist und dadurch ein exit
# das Hauptscript beenden würde.
