#!/usr/bin/zsh

# Copyright 1997 by Uli Zappe <uli@nexttoyou.de> / NEXTTOYOU
# Distributed under the terms of the GNU General Public License
#
# This software is provided as is, without any warranty
#
# Version 1.1
#
# Diese Software ist ausf�hrlich beschrieben in NEXTTOYOU 1/97



########################################################################################
## Defaults
########################################################################################

DELTIME=10									# Tage bis zum n�chsten L�schen
INNPFAD=/usr/spool/news/database/nov		# Pfad zur Overview-Datenbank von INN
EMPFAD=/Library/Mail/Images     			# Pfad relativ zum Homeverzeichnis mit zus�tzlichen TIFFs (beginnt mit / !)
ZEIT=6										# Monate, nach denen ein Eintrag gel�scht wird
LOGZ=2000									# maximale Zeilenzahl der Log-Datei
DATASIZE=10									# maximale Datengr��e in MB; f�r sehr gro�e Newsserver u.U. zu vergr��ern (zsh Default 6MB)

OVERVIEW='*verview'							# Name der Dateien in der INN-Overview-Datenbank
DATABASE=/LocalLibrary/Images/People		# Ordner, in dem die MailTIFFs abgelegt werden
MAILBOXES=/Mailboxes						# Pfad zu den Mailboxen relativ zum Heimverzeichnis der Nutzer
NET='/Net/$H'								# Pfad f�r nicht-lokale Ordner

RECYCLER=/.NeXT/.NextTrash					# Pfad zum Recycler



########################################################################################
## Lokalisierung
########################################################################################

SPRACHE=$(dread System "Language" | sed -e 's/System Language //' -e 's/;.*//')
if [[ $SPRACHE = German ]]; then

FALSCH_ARG="Ung�ltiges Argument "
FALSCH_OPT="Ung�ltige Option -"
FEHL_ARG="Fehlendes Argument bei Option -"
ANWENDUNG="mailDBupdate.in unterst�tzt folgende Optionen und Parameter:\n
-a HOST  Erg�nze den alternativen Hostnamen HOST. In diesem Fall wird f�r Nutzer
         des lokalen Netzwerkes nicht nur das Alias Nutzer@Hostname.Domain
         erstellt, sondern auch das Alias Nutzer@HOST.Domain. Das ist
         erforderlich, falls sendmail so konfiguriert ist, da� man in seiner
         E-Mail-Adresse nicht den Hostnamen seines Rechners tr�gt. In diesem
         Fall sorgt das Alias mit HOST daf�r, da� man selbst trotzdem erkannt
         wird, wenn eigene Postings aus Mailinglisten zur�ckkommen. Insbesondere
         kann mit \"\" auch ein leerer Hostname angegeben werden, falls die
         eigene E-Mail-Adresse Nutzer@Domain lauten sollte (Achtung! Hierf�r
         funktioniert NUR die Schreibweise -a<LEERZEICHEN>\"\"!). Au�erdem
         bewirkt diese Angabe, da� eine eigene Datei Nutzer@HOST.Domain.aliases
         korrekt eingeordnet wird, wenn sie via fetchMailTIFFs vom NEXTTOYOU-
         Server zur�ckkommt.\n
-d ZAHL  Das L�schen alter MailTIFFs soll alle ZAHL Tage vorgenommen werden
         (Default $DELTIME). ZAHL sollte kleiner als der k�rzeste Ablauf-
         Zeitraum der Artikel von PersonalINN sein, wenn auch alle Personen
         in den News l�ckenlos ber�cksichtigt werden sollen.
         Ist ZAHL=0, wird die L�schfunktion ausgeschaltet. Die Optionen -n, -s
         und -t sind dann hinf�llig.\n
-f       Forciere Update. Ist diese Option gesetzt, wird die MailTIFF-Datenbank
         upgedatet, auch wenn keine neuen MailTIFFs hinzugekommen sind. Das
         kann sinnvoll sein, wenn die Datenbank korrupt ist.\n
-h       Zeige diese Hilfe an.\n
-l ZAHL  Maximale Zeilenzahl der Log-Datei (Default $LOGZ).\n
-m PFAD  Zum Heimverzeichnis relativer Pfad zu Ordnern, die zus�tzliche
         MailTIFFs enthalten (Default $EMPFAD). Der Pfad
         mu� f�r alle Heimverzeichnisse aller Nutzer derselbe sein. In jedem
         Ordner mu� sich eine Datei aliases.tiffs befinden, die zu allen Tiffs
         in diesem Ordner die zugeh�rigen E-Mail-Adressen im Format
            MailTIFF.tiff Nutzer@Host.Domain
         auflistet. Mit Hilfe dieser Angaben kann mailDBupdate.in die MailTIFFs
         nach $DATABASE verschieben und korrekt benennen.
         EnhanceMail.bundle legt Dateien dieses Formats an und kann so
         mailDBupdate.in MailTIFFs liefern.
         Ist PFAD=0, werden keine zus�tzlichen Ordner mit MailTIFFs ausgewertet.
         Ist die Option -o gesetzt, werden nur Ordner auf dem eigenen Rechner
         ausgewertet.\n
-n PFAD  Pfad zu der Overview-Datenbank von INN (Default ist der in PersonalINN
         verwendete Pfad $INNPFAD). Diese Datenbank wird
         ben�tigt, um festzustellen, welche Personen, von denen MailTIFFs vor-
         handen sind, in Newsgruppen gepostet haben, um entsprechend veraltete
         MailTIFFs zu l�schen. Der Pfad sollte zu einem Ordner f�hren, in dem
         m�glichst ausschlie�lich Overview-Dateien untergebracht sind.
         Ist PFAD=0, wertet mailDBupdate.in zum L�schen nicht ben�tigter
         MailTIFFs ausschlie�lich die Daten der Mailbox-Ordner aus.\n
-o       mailDBupdate.in �berpr�ft beim L�schen der MailTIFFs die Mailbox-
         Ordner aller Rechner des Netzwerks; dazu m�ssen die Ordner der
         Client-Maschinen jedoch exportiert werden. Kann dies nicht geschehen,
         so bewirkt diese Option, da� nur Mailboxen ausgewertet werden, die sich
         auf dem Server-Rechner befinden, auf dem mailDBupdate.in l�uft.
         Ebenso werden f�r zus�tzliche MailTIFFs (siehe Option -m) nur
         Ordner des eigenen Rechners ausgewertet.\n
-s ZAHL  maximale Datengr��e in MB, die mailDBupdate.in verarbeiten kann
         (Default $DATASIZE MB). Dieser Wert mu� gr��er als die gr��te einzelne
         Overview-Datei der Overview-Datenbank von INN, gr��er als die gr��te
         table_of_contents-Datei der Mailboxen und gr��er als die Liste aller
         in den News gespeicherten E-Mail-Adressen insgesamt sein.\n
-t ZAHL  MailTIFFs einer Person werden gel�scht, wenn sie l�nger als ZAHL Monate
         weder in einer Mailbox noch in einer Newsgruppe mehr gespeichert war
         (Default $ZEIT).\n
-x PFAD  Pfad, �ber den die Ordner anderer Rechner als desjenigen, auf dem
         mailDBupdate.in l�uft, zu erreichen sind (Default '$NET').
         Kommt in diesem Pfad der Hostname des jeweilige Rechners vor, so kann
         er hier durch die Variable \$H angegeben werden. In diesem Fall ist der
         Pfad unbedingt in einfache Anf�hrungszeichen ('...') einzuschlie�en!
         Der Pfad kann auch leer sein (Achtung! Dabei ist NUR die Schreibweise
         -x<LEERZEICHEN>'' zul�ssig!); allerdings funktioniert die Option -o
         mangels Unterscheidungskriterium dann nicht mehr.\n
RECHNER  Nach den Optionen k�nnen noch die Hostnamen RECHNER beliebig vieler
         Computer des lokalen Netzwerkes als Parameter aufgelistet werden.
         mailDBupdate.in wertet dann auch die lokalen Nutzer dieser Computer
         aus.\n\n"
		 
AKTUALISIERE="Aktualisiere MailTIFF-Datenbank"
NETINFO="  Registriere Nutzer des lokalen Netzwerks aus NetInfo..."
HOL_MT="  Hole MailTIFFs aus "
HOLE="    Hole "
FEHLER1="Fehler "
HOL_FEHLER=" beim Holen von "
EINTRAG_FEHLER=" beim Eintragen von "
INTERNET="  Registriere MailTIFFs von Internet-Nutzern..."
REGISTER="    Registriere "
NEU_ALIAS="  Registriere neue Aliases..."
REG_ALIAS="    Registriere Aliases f�r "
LOESCH_MT="L�sche veraltete MailTIFFs"
REG_MAIL="  Registriere in Mails gespeicherte Adressen..."
REG_NEWS="  Registriere in News gespeicherte Adressen..."
ABGLEICH="  Gleiche Adressen der MailTIFF-Datenbank mit den registrierten Adressen ab..."
KEIN_LOESCHEN="  Keine MailTIFFs zu l�schen"
LOESCH1="  L�sche 1 MailTIFF..."
LOESCH_1="  L�sche "
LOESCH_2=" MailTIFFs..."
LOESCHE="    L�sche "
LOESCH_FEHLER=" beim L�schen von "

TEXT1="# Nutzerliste
# Diese Datei wird von mailDBupdate.in automatisch erstellt.\n
# Mail.app zeigt nur Bilder von Nutzern an, die hier aufgelistet sind.
# Das Bild mu� genau den Namen der E-Mail-Adresse des Nutzers (plus der
# Endung \".tiff\") haben.
# Diese Nutzer erscheinen auch unter \"login\"-Namen im Adre�panel von Mail.app.\n\n\n
# Nutzer des lokalen Netzes:\n"
TEXT2="# Aliases f�r die Mail-Adressen in passwd
# Diese Datei wird von mailDBupdate.in automatisch erstellt.\n
# Sind ein Bild und passwd-Eintrag f�r die Adresse hinter
# dem Doppelpunkt vorhanden, so wird dieses Bild auch f�r
# die Adresse vor dem Doppelpunkt angezeigt.\n\n\n
# Standard-Aliases f�r Nutzer des lokalen Netzes;
# ben�tigt f�r PersonalINN & Newsreader sowie Mail.app
# bei eigenen Beitr�gen, die aus Mailinglisten zur�ckkommen
# (Standardkonfiguration von sendmail vorausgesetzt):\n"
TEXT3="\n\n\n# Spezial-Aliases f�r Nutzer des lokalen Netzes;
# ben�tigt f�r Mail.app bei besonderen Konfigurationen
# von sendmail oder anderen Sonderf�llen f�r
# eigene Beitr�ge, die aus Mailinglisten zur�ckkommen:\n"
TEXT4="\n\n\n# Nutzer aus dem Internet, von denen Mail-Bilder gespeichert sind:
# (Die Angaben hinter dem Doppelpunkt markieren, in welchem Monat
# seit Januar 1990 von diesem Nutzer das letzte Mal eine E-Mail oder
# ein News-Beitrag gespeichert waren und wo (NA = der Nutzer war von
# Beginn an nicht gespeichert).\n"
TEXT5="\n\n\n# Aliases f�r Nutzer aus dem Internet, die von mehreren Mail-Adressen
# aus schreiben; gem�� der Datei $DATABASE/aliases.in:\n"
TEXT6="Keine DNS-Daten erh�ltlich!
 Bitte konfigurieren Sie Ihren Domain-Namen korrekt in der NetInfo- 
 Domain (/locations/resolver) oder aber in /etc/resolv.conf."
TEXT7="DOMAIN_NICHT_KONFIGURIERT"
TEXT8="# Aliases fuer Nutzer aus dem Internet, die von mehreren Mail-Adressen
# aus schreiben; Eintr�ge in diese Datei k�nnen auch selbst manuell
# vorgenommen werden im Format \"Alias-Adresse: Adresse\", wobei \"Adresse\"
# die E-Mail-Adresse des Nutzers ist, wie sie im Namen des Mail-Bildes
# auftaucht (OHNE \".tiff\" am Ende!).\n\n\n"


else


FALSCH_ARG="Illegal argument "
FALSCH_OPT="Illegal option -"
FEHL_ARG="Missing argument for Option -"
ANWENDUNG="mailDBupdate.in supports the following options and parameters:\n
-a HOST    Add the alternative hostname HOST. In this case not only will the
           alias user@hostname.domain be added for users of the local network,
           but also the alias user@HOST.domain. This is necessary if you have
           sendmail configured in such a way that the hostname of your machine
           is not part of your email address. In this case the alias with HOST
           ensures that your own address is recognized if postings of yours
           return from mailing lists. Note that HOST may be an empty string
           (\"\") in case your address is user@domain (Attention! In this
           case ONLY the notation -a<SPACE>\"\" will work!). Furthermore,
           this entry causes an aliases file of one's own to be correctly
           adjusted when it returns from the NEXTTOYOU server via
           fetchMailTIFFs.\n
-d NUMBER  Old MailTIFFs will be deleted every NUMBER days (default $DELTIME).
           NUMBER should be smaller than the shortest article expiration cycle
           in PersonalINN if all persons stored in the news shall be taken
           into account without a gap.
           If NUMBER=0 the delete function is disabled. The options -n, -s and
           -t are meaningless in this case.
-f         Force update. If this option is set, the MailTIFF database will get
           updated even if no new MailTIFFs have arrived. This may be useful in
           case the database becomes corrupt.\n
-h         Display this help.\n
-l NUMBER  Maximum line number of the log file (default $LOGZ).\n
-m PATH    Path to directories including additional MailTIFFs, relative to the
           home directories (default $EMPFAD). This path
           must be the same for all home directories. In each directory there
           must be a file aliases.tiffs that lists the corresponding email
           addresses for all tiffs in this directory in the format
              MailTIFF.tiff user@host.domain 
           With this list mailDBupdate.in is able to move the MailTIFFs to
           $DATABASE and name them correctly.
           EnhanceMail.bundle creates lists in this format and can thus
           provide MailTIFFs for mailDBupdate.in.
           If PATH=0 no additional directories with MailTIFFs are checked.
           If the option -o is set, only directories on the own machine
           will be checked.\n
-n PATH    Path to the overview database of INN (default is the path used
           by PersonalINN, $INNPFAD). This database is
           needed to check which persons with MailTIFFs stored have posted
           to newsgroups, to delete accordingly outdated MailTIFFs. PATH
           should lead to a directory with preferably only overview files
           in it.
           If PATH=0 mailDBupdate.in checks only the data of the mailbox
           directories to determine which MailTIFFs to delete.\n
-o         For deleting MailTIFFs, mailDBupdate.in checks the mailbox
           directories of all machines of the network; however, for this
           purpose the directories of the client machines need to be exported.
           If this is not feasible, this option may be used to make
           mailDBupdate.in check only mailbox directories on the server machine
           it runs on.
           Also, for additional MailTIFFs (see option -m) only directories of
           the own machine will be checked.\n
-s NUMBER  Maximum data size in MB mailDBupdate.in can handle (default $DATASIZE MB).
           This number must be larger than the largest single overview file
           of INN, larger than the largest table_of_contents file of the
           mailbox directories and larger than a list of all email addresses
           which are stored in news.\n
-t NUMBER  MailTIFFs of a person will be deleted when he/she hasn't been
           stored either in a mailbox or in a newsgroup for more than
           NUMBER months (default $ZEIT).\n
-x PATH    Path the directories of machines other than the one mailDBupdate.in
           runs on are accessable by on your network (default '$NET').
           If the hostname of the corresponding machine is included in the
           pathname, you can enter it here using the variable \$H. In this case
           the path must be enclosed in single quotes ('...')! The path can
           also be empty (Attention! ONLY the notation -x<SPACE>'' is allowed
           for this!); however, the option -o won't work in that case because
           it can't tell local from remote directories anymore.\n
MACHINE    After the options any number of MACHINE hostnames of computers
           in the local network may be listed as parameters. mailDBupdate.in
           will then take into account the local users of these computers,
           too.\n\n"
		 
AKTUALISIERE="Updating MailTIFF database"
NETINFO="  Registering users from the local NetInfo network..."
HOL_MT="  Getting MailTIFFs from "
HOLE="    Getting "
FEHLER1="Error "
HOL_FEHLER=" while getting "
EINTRAG_FEHLER=" while registering "
INTERNET="  Registering MailTIFFs of internet users..."
REGISTER="    Registering "
NEU_ALIAS="  Registering new aliases..."
REG_ALIAS="    Registering aliases for "
LOESCH_MT="Deleting outdated MailTIFFs"
REG_MAIL="  Registering addresses stored in mails..."
REG_NEWS="  Registering addresses stored in news..."
ABGLEICH="  Comparing addresses of the MailTIFF database with the registered addresses..."
KEIN_LOESCHEN="  No MailTIFFs to delete"
LOESCH1="  Deleting 1 MailTIFF..."
LOESCH_1="  Deleting "
LOESCH_2=" MailTIFFs..."
LOESCHE="    Deleting "
LOESCH_FEHLER=" while deleting "

TEXT1="# User list
# This file is generated automatically by mailDBupdate.in.\n
# Mail.app will display only pictures of users listed here.
# The name of the picture must be exactly that of the e-mail address
# of the user (plus the suffix \".tiff\").
# These users will also appear as Login Names in Mail.app's Addresses panel.\n\n\n
# Users from the local network:\n"
TEXT2="# Aliases for the mail addresses in passwd
# This file is generated automatically by mailDBupdate.in.\n
# If a picture and a passwd entry are available for the address
# after the colon, this picture will be diplayed also for the
# address before the colon.\n\n\n
# Standard aliases for users from the local network;
# needed for PersonalINN & Newsreader as well as Mail.app
# in case of own postings returning from mailing lists
# (given the default configuration of sendmail):\n"
TEXT3="\n\n\n# Special aliases for users from the local network;
# needed for Mail.app with special configurations of sendmail
# or other special situations in case of own postings returning from
# mailing lists:\n"
TEXT4="\n\n\n# Users from the internet for which mail pictures are available:
# (The data behind the colon mark in which month since January 1990
# a mail or a news posting of this user had been stored for the
# last time, and where (NA = this user had not been stored from
# the beginning).\n"
TEXT5="\n\n\n# Aliases for users from the internet who have more than one
# email address; according to the file $DATABASE/aliases.in:\n"
TEXT6="No DNS data available!
 Please set up your domain name correctly in your NetInfo 
 domain (/locations/resolver) or in /etc/resolv.conf."
TEXT7="DOMAIN_NOT_CONFIGURED"
TEXT8="# Aliases for users from the internet who have more than one
# email address. Entries in this file may also be made manually in the
# format \"Alias-Address: Address\", with \"Address\" being the email
# address of the user that is also used in her MailTIFF (WITHOUT
# \".tiff\" at the end!).\n\n\n"

fi




########################################################################################
## Basis-Einstellungen
########################################################################################

PROGNAME=$(basename $0)
SPACE=" "
TAB="	"
NEWLINE="
"
DEFAULT_IFS=$NEWLINE	### Leerzeichen und Tabs sind in Pfadnamen erlaubt
IFS=$DEFAULT_IFS

if [ -d ~/.OpenStep ]; then		### anderer Recycler-Pfad unter OPENSTEP
	RECYCLER=/.OpenStep/.NextTrash
fi




########################################################################################
## Log-Funktion
########################################################################################

logge()
{
echo $1 1>&1	### 1>&1 ist wegen eines Bugs von zsh 2.5.02 n�tig (andernfalls stoppt das Skript an dieser Stelle, wenn von cron aufgerufen)!
echo $(date | awk '{printf("%s %2s %s",$2,$3,$4)}')" $HOST $PROGNAME""[$$]: $1" >>$DATABASE/log	### [ nicht direkt an $PROGNAME, da das sonst Array-Variable!
if [[ $2 = E ]]; then echo $(date | awk '{printf("%s %2s %s",$2,$3,$4)}')" $HOST $PROGNAME""[$$]: $1" >>/dev/console; fi
}




########################################################################################
## Funktion zur Auswertung von NetInfo
########################################################################################

# Die folgende Funktion ermittelt aus NetInfo alle Nutzer einer vorgegebenen lokalen NetInfo-Domain
# (oder der root-Domain, falls der 3. Parameter nicht angegeben wird), die eine dreistellige User-ID
# und Ihr Heimverzeichnis nicht in /usr/template haben. Falls der erste Parameter y ist, tr�gt sie
# diese Nutzer in passwd ein. In aliases tr�gt sie ein Alias von dem Nutzer mit voller Internet-Adresse
# (Nutzer@Hostname_f�r_Mail-Alias.Rechner-Domain) auf den blo�en Nutzernamen ein. Falls der erste
# Parameter nicht y ist, wird das Alias dem Array ALT_ALIAS zugef�gt.

# FORMAT:   update   Regul�rer_Hostname?_y_oder_n  Hostname_f�r_Mail-Alias  Hostname_f�r_NetInfo_Domain 

update()
{		### filtere Nutzer mit ein- oder zweistelligen User-IDs und solche aus /usr/template aus; entferne alles nach ":" von den restlichen
nidump passwd /$3 | sed -e 's/.*:.*:.:.*:.*:.*:.*//' -e 's/.*:.*:..:.*:.*:.*:.*//' -e 's/.*:.*:.*:.*:.*:\/usr\/template.*:.*//' -e 's/:.*//' -e '/^$/d' | while read U_NUTZER
do
	if [[ -z "$2" ]]; then U_ALIAS="$U_NUTZER@$DOMAIN"
	else U_ALIAS="$U_NUTZER@$2.$DOMAIN"; fi
	echo "$U_ALIAS: $U_NUTZER" >> aliases
	if [[ "$1" = "y" ]]; then echo $U_NUTZER: >> passwd
	else ALT_ALIASES=($ALT_ALIASES $U_ALIAS); fi
done
}




########################################################################################
## Initialisierung der Variablen
########################################################################################

### Ermittle Domain des Rechners aus NetInfo oder /etc/resolv.conf
if [[ -n "$(nidump -r /locations /$HOST | grep resolver;)" ]]; then
	DOMAIN=$(nidump -r /locations/resolver /$HOST | grep domain | sed -e 's/domain = "*//' -e 's/"*;//')	### " manchmal vorhanden, manchmal nicht
elif [[ -n "$(nidump -r /locations / | grep resolver;)" ]]; then
	DOMAIN=$(nidump -r /locations/resolver / | grep domain | sed -e 's/domain = "*//' -e 's/"*;//')
elif [[ -r /etc/resolv.conf ]]; then
	DOMAIN=$(grep domain /etc/resolv.conf | sed -e "s%domain[$SPACE$TAB]*%%")
else
	logge $TEXT6 E
	DOMAIN=$TEXT7
fi



### Werte Optionen aus
while getopts :a:d:fhl:m:n:ot:x: OPT
do
	case $OPT in
		a)	ALT_HOST=$OPTARG; ALT=1 ;;
		d)	if [[ $(echo $OPTARG | tr -d 0-9) != "" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			DELTIME=$OPTARG ;;
		f)	DELTA=1 ;;
		h)	echo "\n$ANWENDUNG"; exit ;;
		l)	if [[ $(echo $OPTARG | tr -d 0-9) != "" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			LOGZ=$OPTARG ;;
		m)	if [[ $OPTARG[1] != "/" && $OPTARG != "0" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			EMPFAD=$OPTARG ;;
		n)	if [[ $OPTARG[1] != "/" && $OPTARG != "0" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			INNPFAD=$OPTARG ;;
		o)	OWN=1 ;;
		t)	if [[ $(echo $OPTARG | tr -d 0-9) != "" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			ZEIT=$OPTARG ;;
		x)	if [[ $OPTARG[1] != "/" && $OPTARG != "" ]]; then logge ""; logge $FALSCH_ARG$OPTARG E ; logge ""; echo $ANWENDUNG ; exit 1; fi
			NET=$OPTARG ;;
		\?)	logge ""; logge $FALSCH_OPT$OPTARG E ; logge ""; echo $ANWENDUNG		
			exit 1 ;;
		:)	logge ""; logge $FEHL_ARG$OPTARG E ; logge ""; echo $ANWENDUNG
			exit 1 ;;
	esac
done
shift $(expr $OPTIND - 1)
for LOC_HOST
do
	LOC_HOSTS=($LOC_HOSTS $LOC_HOST)
done



### Erstelle Listen der einzelnen Rechner-Domains und aller Nutzer-Heimverzeichnisse
MYHOST=(/ $HOST)	### root-Domain und eigene lokale Domain
HOSTS=($MYHOST $LOC_HOSTS)	### root-Domain, eigene lokale Domain und andere lokale Domains
for H in $MYHOST	### Heimverzeichnisse netzweiter Nutzer und der lokalen auf dem eigenen Rechner
do
	HOMES=($HOMES $(nidump passwd /$H | sed -e 's/.*:.*:.:.*:.*:.*:.*//' -e 's/.*:.*:..:.*:.*:.*:.*//' -e 's/.*:.*:.*:.*:.*:\/usr\/template.*:.*//' -e '/^$/d' | awk -F: '{print $6}'))
done

for H in $LOC_HOSTS	### Heimverzeichnisse lokaler Nutzer auf anderen als dem eigenen Rechner (/Net/rechnername wird dem lokalen Pfad vorangestellt)
do
	IFS=$SPACE; PFAD=$(eval echo $NET); IFS=$DEFAULT_IFS
	HOMES=($HOMES $(nidump passwd /$H | sed -e 's/.*:.*:.:.*:.*:.*:.*//' -e 's/.*:.*:..:.*:.*:.*:.*//' -e 's/.*:.*:.*:.*:.*:\/usr\/template.*:.*//' -e '/^$/d' | awk -F: '{print $6}' | sed "s%^%$PFAD%"))
done

if [[ $OWN = 1 ]]; then		### nur Mailboxverzeichnisse auf dem eigenen Rechner (also nur mit "/Net/eigenerHost" oder ohne "/Net")
	H=$HOST
	IFS=$SPACE; PFAD=$(eval echo $NET); IFS=$DEFAULT_IFS
	VERZEICHNIS=$(echo $PFAD | sed "s%$H\$%%")
	MYHOMES=$(print -l $HOMES | grep "^$PFAD/")
	MYHOMES=($MYHOMES $(print -l $HOMES | grep -v "^$VERZEICHNIS") )
	HOMES=$MYHOMES
fi



### Setze aktuelles Verzeichnis
cd $DATABASE



### �berpr�fe, ob seit dem letzten passwd-Update neue Bilder in das Verzeichnis kopiert wurden
if [[ . -nt passwd || ! -a passwd ]]; then
DELTA=1
fi




########################################################################################
## Update der MailTIFF-Datenbank
########################################################################################

logge ""; logge $AKTUALISIERE;

### Mache Backup der Internet-Nutzer; lege passwd und aliases mit Textvorspann neu an
if [[ -r passwd ]]; then
	USRS_IN=$(fgrep @ passwd)
	else DELTA=1
fi
echo $TEXT1 > passwd
echo $TEXT2 > aliases



### Trage Nutzer des lokalen Netzwerks ein
logge $NETINFO

# Trage netzweite und lokale Nutzer des eigenen Rechners und ggf.
# lokale Nutzer weiterer Rechner des lokalen Netzes ein
for H in $HOSTS
do
	update y $HOST $H
done

# Falls mit -a gestartet, trage netzweite und lokale Nutzer des eigenen
# Rechners und ggf. lokale Nutzer weiterer Rechner des lokalen Netzes mit
# dem zus�tzlichen Alias ein
if [[ $ALT = 1 ]]; then
	echo $TEXT3 >> aliases
	for H in $HOSTS
	do
		update n "$ALT_HOST" $H
	done
fi



### Kopiere MailTIFFs aus anderen Ordnern nach LocalLibrary/Images/People
if [[ $EMPFAD != 0 ]]; then
print -l $HOMES | sed -e "s%$%$EMPFAD%g" | while read DIR
	do
		if [[ -s $DIR/aliases.tiffs ]]; then
			DELTA=1
			logge $HOL_MT$DIR"..."
			find $DIR -name '*.tiff' -size 0c -exec rm {} \;	### Entferne Dateien mit 0 Byte (EnhanceMail erzeugt diese, falls keine Internet-Verbindung besteht, wenn es ein MailTIFF holen will)
			< $DIR/aliases.tiffs | while read MTIFF 
			do
				IFS=$SPACE; TIFF=($(echo $MTIFF)); IFS=$DEFAULT_IFS	### Datenpaare sind durch Leerzeichen getrennt
				if [[ -w $DIR/$TIFF[1] ]]; then 
					logge $HOLE$TIFF[2]
					mv -f $DIR/$TIFF[1] ./$TIFF[2].tiff
					if [[ $? != 0 ]];then FEHLER=1; logge ""; logge $FEHLER1$ERRNO$HOL_FEHLER$TIFF[2] E; logge ""; fi
				fi
			done
			[[ $FEHLER = 1 ]] || rm $DIR/aliases.tiffs; FEHLER=0	### falls Fehler auftrat, aliases.tiffs nicht l�schen
		fi
	done
fi


### Trage alle Internet-Nutzer, von denen Mail-TIFFs vorliegen, in passwd ein
echo $TEXT4 >> passwd
if [[ $DELTA = 1 && -n "$(find . -name '*@*.tiff' -print)" ]]; then		### falls es Ver�nderungen im People-Ordner gab und TIFFs dort vorhanden sind
	logge $INTERNET
	ls | egrep '.+@.+tiff$' | sed 's/.tiff$/:/' > /tmp/tmp1	### liste Internet-Nutzer in LocalLibrary/Images/People auf
	echo "$USRS_IN" | join -a2 - /tmp/tmp1 >> passwd	### erg�nze die Daten aus passwd um neue Nutzer
	for LOG in $(echo "$USRS_IN" | sed 's/:.*$/:/' | comm -13 - /tmp/tmp1 | sed -e 's/:$//' -e "s/^/$REGISTER/")
	do
	logge $LOG
	done
else
	echo "$USRS_IN" >> passwd
fi



### Trage neue Internet-Aliases ein
if [[ -s aliases.in ]]; then ALIASESIN=$(fgrep @ aliases.in); fi
ALIASES=($(find . -name '*.aliases' -print | sed -e 's%^./%%' -e 's/.aliases$//'))	### filtere das f�hrende ./ (von find) und .aliases am Schlu� aus

if [[ ${#ALIASES} != 0 ]]; then
	logge $NEU_ALIAS
	for A in $ALIASES
	do
		logge $REG_ALIAS$A
		if [[ -r $A.aliases ]]; then
			LOKAL=0;	### Teste, ob Stammadresse einer alternativen lokalen Adresse entspricht (nur wenn Name UND alternative Domain gleich sind, darf diese weggelassen werden!)
			for AAL in $ALT_ALIASES
			do
				if [[ $AAL = $A ]]; then LOKAL=1; break; fi
			done
			if [[ $LOKAL = 1 ]]; then	### falls ja, h�nge Nutzer an; ersetze volle Stammadresse durch Nutzername; ansonsten wie unten
				NUTZER=$(echo $A | sed "s/@.*$//")
				ALIASESIN="$ALIASESIN\n$(sed -e "s/$/: $A/" -e "s/$A: $A//" -e "s/^ *: $A//" -e "s/$A/$NUTZER/" $A.aliases)\n"
			else	### sonst h�nge Nutzer an; filtere mit Nutzer identische Aliases, Leerzeichen und Leerzeilen als Aliases aus; filtere f�r Aliases lokaler Nutzer eigene Domain aus
				ALIASESIN="$ALIASESIN\n$(sed -e "s/$/: $A/" -e "s/$A: $A//" -e "s/^ *: $A//" -e "s/@$HOST.$DOMAIN$//" $A.aliases)\n"
			fi
		else FEHLER=1; logge ""; logge $FEHLER1$ERRNO$EINTRAG_FEHLER$A E; logge ""; fi
	done
fi

echo "$TEXT8$(echo $ALIASESIN | sort | awk -F"\n" '$1 != prev { print $1; prev = $1 }')" > aliases.in	### sortiere, sondere Dubletten aus, h�nge Vorspann an
if [[ $? != 0 ]]; then FEHLER=1; fi
if [[ $FEHLER != 1 ]];then find . -name '*.aliases' -exec rm {} \; ; fi		### falls Fehler auftrat, *.aliases-Dateien nicht l�schen



### H�nge Internet-Aliases an
echo $TEXT5 >>aliases
sed -e  's/#.*//' -e '/^$/d' < aliases.in >> aliases



########################################################################################
## L�schen alter Bilder
########################################################################################

### Ermittle Datum im Format "Monate seit Januar 1990"  (alternatives "date" benutzt deutsche Monate!)
IFS=$SPACE	### Leerzeichen wird als Separator f�r date ben�tigt
set $(date -u)	### nur bei -u kein zus�tzliches Feld "DST" im Sommer
IFS=$DEFAULT_IFS
case $2 in
	Jan	)	MONTH=0		;;
	Feb	)	MONTH=1		;;
	Mar	)	MONTH=2		;;
	M�r	)	MONTH=2		;;
	Apr	)	MONTH=3		;;
	May	)	MONTH=4		;;
	Mai	)	MONTH=4		;;
	Jun	)	MONTH=5		;;
	Jul	)	MONTH=6		;;
	Aug	)	MONTH=7		;;
	Sep	)	MONTH=8		;;
	Oct	)	MONTH=9		;;
	Okt	)	MONTH=9		;;
	Nov	)	MONTH=10	;;
	Dec	)	MONTH=11	;;
	Dez	)	MONTH=11	;;
esac
((DATE=($6-1990)*12+$MONTH))

### Ermittle taggenaues Datum und Zeit seit dem letzten L�schvorgang
((DAY=$DATE*30+$3))
if [[ -r .deleteMailTIFFs ]]; then LAST_DAY=$(< .deleteMailTIFFs)
else
	echo $DAY > .deleteMailTIFFs
	LAST_DAY=0
fi
((DIFF=$DAY-LAST_DAY))

### starte L�schfunktion, falls $DELTIME Tage vergangen sind
if [[ $DELTIME -ne 0 && $DIFF -ge $DELTIME ]] ; then
	logge ""; logge $LOESCH_MT
	limit datasize $DATASIZE"m"	### vergr��ere maximal zul�ssige Datengr��e
	
	
	
	
	###### Lese die Mailbox-Inhaltsverzeichnisse ein ######
	logge $REG_MAIL
	
	### Liste die Mailboxverzeichnisse auf
	MBX_DS=($(print -l $HOMES | sed -e "s%$%$MAILBOXES%g"))

	### Liste Inhaltsverzeichnisse der Mailboxen auf
	MTOCS=($(find $MBX_DS -name '*.attach' -prune -o -name table_of_contents -print))
	
	### Liste die in den Inhaltsverzeichnissen befindlichen Mailadressen in /tmp/mailadr auf und f�ge : ans Ende
	if [[ -n $MTOCS ]]; then
		cat $MTOCS | strings | tr -cs 'a-zA-Z@._0-9-+' '\012' | egrep .+@.+ | sort | uniq | sed -e 's/$/:/' > /tmp/mailadr
	else
		echo -n > /tmp/mailadr
	fi 
	
	### Liste alle Mailbox-Adressen mit angeh�ngtem Monat und (MAIL) in /tmp/mailadr.MAIL auf
	sed -e "s/\$/ $DATE (MAIL)/" /tmp/mailadr > /tmp/mailadr.MAIL
	
	### Liste zu allen Mailbox-Adressen, die als Aliases in aliases.in vorkommen, die zugeh�rigen Stammadressen mit angeh�ngtem Monat und (MAIL ALIAS) in /tmp/mailadr.MAILALIAS auf
	grep '@.*:' aliases.in | sort > /tmp/tmp1
	join -o 1.2 /tmp/tmp1 /tmp/mailadr | sort | uniq | sed -e "s/\$/: $DATE (MAIL ALIAS)/" > /tmp/mailadr.MAILALIAS






	###### Lese die Overview-Datenbank von PersonalINN ein ######
	if [[ -d $INNPFAD ]]; then
		logge $REG_NEWS
	
		### Liste die Overview-Dateien auf
		cd $INNPFAD
		NOV=($(find . -type f -name $OVERVIEW -print))	### entsprechend /NextDeveloper/Headers/ansi/limits.h maximal 40960 Bytes ~= 8000 Newsgruppen als Argument f�r cat m�glich;
		
		### Liste die in den Overview-Dateien befindlichen Mailadressen in /tmp/newsadr auf und f�ge : ans Ende
		if [[ -n $NOV ]]; then
			cat $NOV | awk -F"$TAB" '$3 != prev { print $3; prev = $3 }' | sed -e 's/^.*<//' -e 's/ *(.*$//' -e 's/>//' -e 's/$/:/' | sort | uniq > /tmp/newsadr
		else
			echo -n > /tmp/newsadr
		fi
		cd $DATABASE
		
		### Liste alle News-Adressen mit angeh�ngtem Monat und (NEWS) in /tmp/mailadr.NEWS auf
		sed -e "s/\$/ $DATE (NEWS)/" /tmp/newsadr > /tmp/mailadr.NEWS
	
		### Liste zu allen News-Adressen, die als Aliases in aliases.in vorkommen, die zugeh�rigen Stammadressen mit angeh�ngtem Monat und (NEWS ALIAS) in /tmp/mailadr.NEWSALIAS auf
		grep '@.*:' aliases.in | sort > /tmp/tmp1
		join -o 1.2 /tmp/tmp1 /tmp/newsadr | sort | uniq | sed -e "s/\$/: $DATE (NEWS ALIAS)/" > /tmp/mailadr.NEWSALIAS
		
		### Erg�nze passwd um die in den News gefundenen Markierungen
		logge $ABGLEICH
		fgrep @ passwd > /tmp/tmp2 
		join -a2 /tmp/mailadr.NEWSALIAS /tmp/tmp2 > /tmp/tmp1
		join -a2 /tmp/mailadr.NEWS /tmp/tmp1 > /tmp/tmp2
				
	else
		logge $ABGLEICH
		fgrep @ passwd > /tmp/tmp2
	fi


	### Erg�nze passwd um die in Mail gefundenen Markierungen	
	join -a2 /tmp/mailadr.MAILALIAS /tmp/tmp2 > /tmp/tmp1
	join -a2 /tmp/mailadr.MAIL /tmp/tmp1 > /tmp/tmp2


	### h�nge (NA)-Markierung an (falls neuer Eintrag); l�sche dann alle Markierungen bis auf die erste und trage in passwd ein
	PASSWD=$(<passwd)
	echo $PASSWD | fgrep -v @ > passwd
	sed -e "s/\$/ $DATE (NA)/" -e 's/\(: [0-9]* ([^)]*)\).*$/\1/' /tmp/tmp2 >> passwd
	





	###### L�sche die MailTIFFs und zugeh�rige Aliases von Bildern, die l�nger als $ZEIT Monate nicht ben�tigt wurden ######
	
	PASSWD=$(<passwd)
	VERALTET=($(echo $PASSWD | fgrep @ | awk $DATE' - $2 > '$ZEIT' {print $1}' | sed 's/:$//'))	### erstelle Liste mit abgelaufenen Einr�gen aus passwd, entferne ":"
	NUMMER=${#VERALTET}
		
	if [[ $NUMMER = 0 ]]; then logge $KEIN_LOESCHEN
	else 
		if [[ $NUMMER = 1 ]]; then logge $LOESCH1
		else logge $LOESCH_1$NUMMER$LOESCH_2
		fi
		ALIASESIN=$(< aliases.in)
		for WEG in $VERALTET
		do
			logge $LOESCHE$WEG
			mv -f $WEG.tiff ~$RECYCLER	### verschiebe Tiff in Recycler
			if [[ $? = 0 ]] ; then	### falls TIFF erfolgreich gel�scht, entferne Eintr�ge in aliases.in und passwd
				ALIASESIN=$(echo $ALIASESIN | fgrep -v $WEG)
				PASSWD=$(echo $PASSWD | fgrep -v $WEG)
			else 
				logge ""; logge $FEHLER1$ERRNO$LOESCH_FEHLER$WEG E; logge ""
			fi
		done
		echo $ALIASESIN >aliases.in
	fi
	echo $PASSWD >passwd
	
	echo $DAY > .deleteMailTIFFs
fi




########################################################################################
## Stutze Log-Datei auf LOGZ Zeilen
########################################################################################

LOG=$(tail -$LOGZ log)	### Zwischenspeicherung in Variable erforderlich, damit sich tail nicht selbst st�rt
echo $LOG > log

logge ""
