#!/bin/bash
# Kategorie: server
# Script zum Neusetzen von Zugriffs-, Beseitrechten und ACLs der Gruppen-
# verzeichnisse unter /srv/shares/gruppen
# (c) 2019,2020 Stefan Schaefer - invis-server.org
# Questions: info@invis-server.org

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

#Konfigurationsdaten
conffile="/etc/invis/invis.conf"

# Funktionen
# Werte aus Konfigurationsdatendatei extrahieren
# $1 = Konfigurationsdatei, $2 = Parameter, $3 Wert (Feld)
getconfdata() {
    cat $1 |grep "$2" | cut -d ":" -f $3
}

# function to set default acls, acls, ownership and posix rights
setrights() {
	find "$1" -type d -exec chmod g+rwxs,o-rwx {} \;
	find "$1" -type f -exec chmod g=rw,o-rwx {} \;
	chgrp -R "$2" "$1"
	setfacl -R -d -m group:"$2":rwx "$1"
	find "$1" -type d -exec setfacl -m group:"$2":rwx {} \;
	find "$1" -type f -exec setfacl -m group:"$2":rw {} \;
}

# Variablen
groupsharepath="/srv/shares/gruppen"
dasipath=`getconfdata $conffile "DasiDir" "2"`
aclsafepath="$dasipath/vollsicherungen/acls"
datestring=`date "+%Y%m%d-%N"`
tmpfile="/srv/www/htdocs/portal/tmp/iportal.tmp"

# remove tempfile, if exists
if [[ -f $tmpfile ]]; then
    rm $tmpfile
fi

# Zielverzeichnis anlegen, wenn nicht existent
if [[ ! -d $aclsafepath ]]; then
    mkdir -p $aclsafepath
fi

# returncode
ok=0

# Alle ACLs unter /srv/shares/gruppen sichern, dann loeschen
getfacl -Rn $groupsharepath > $aclsafepath/groupshare-$datestring.acl 2> /dev/null
setfacl -Rb $groupsharepath

for dir in `find "$groupsharepath" -maxdepth 1 -type d`; do
    # kontrollieren, ob es zu einem Verzeichnis eine korrespondierende Gruppe gibt
    isgroup=`basename $dir`
    if [[ `getent group |grep -i ^"$isgroup:"` ]]; then 
	# wenn ja:
	# Gruppenbesitzrecht neu setzen
	# Zugriffsrechte neu setzen  -> 2770
	# Default-ACLs neu setzen
	# Absolute ACLs setzen
	#echo "Gruppe: $isgroup"
	setrights $dir $isgroup
	(( ok=$ok + $? ))
    else
	# wenn nicht, dann Verzeichnis umbenennen z.B. xyz.nogroup
	if [[ "$dir" != "$groupsharepath" ]]; then
	    if [[ ! `echo $dir | grep "_anrufen"$` ]]; then
		mv "$dir" "$dir-bitte_Support_anrufen"
	    fi
	fi
    fi
done

# writing returncode to tempfile
echo $ok > $tmpfile
# make the file writeable for apache
chown .www $tmpfile && chmod g+w $tmpfile
