home *** CD-ROM | disk | FTP | other *** search
Wrap
Paul Falstad's zsh script | 1997-06-19 | 32.8 KB | 752 lines
#!/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 ""