Tee

Bezeichnung Wert
Titel
Tee
Untertitel
Geschichten zum Entspannen
Verfasserangabe
diverse Autoren
Medienart
Sprache
Person
Reihe
Reihenvermerk
24675
Auflage
1. Auflage
Verlag
Ort
Zürich
Jahr
Umfang
240 Seiten
ISBN10
3-257-24675-7
ISBN13
978-3-257-24675-9
Schlagwort
Annotation
#!/usr/bin/perl # # Name: dokserv # # Eingabe: ueber QUERY_STRING (CGI); Parameter: # idn = IDN des Dokumentes (req) # dok_var = Dokumentenvariante (opt) # dok_nam = Dokumentenname (opt) # dok_ext = Dokument-Extension (opt) # dok_fpr = Dokument-Fingerprint (opt) # datei = Dateiname - Erweiterung fuer beliebige ARchivdateien # s. Hinweise vom 12.3.2001 # # In Abweichung davon werden auch requests akzeptiert, # die statt der IDN folgende Parameter besetzt haben # (Loesung fuer BIBLIOPLUS vom 6.12.2004): # Eingabe: prov = Provider der Datei (req) # id = Identifikation (req) # dok_var = Dokumentenvariante (opt) # # # Ausgabe: bei ausschliesslicher Angabe der IDN wird die # Dokument-Informationsseite ausgegeben # ($DOC_ROOT/$idn/$DOC_PAGE_NAME.$DOC_PAGE_EXT), # bei besetztem idn, dok_var und dok_fpr wird das Dokument # $DOC_ROOT/$idn/$dok_var/$DOC_FPR_PREFIX$dok_fpr.$DOC_FPR_EXT # ausgegeben, # bei besetztem idn, dok_var und dok_ext wird # das Dokument $DOC_ROOT/$idn/$dok_var/$idn.$dok_ext ausgegeben, # bei besetztem idn, dok_nam und dok_ext wird # das Dokument $DOC_ROOT/$idn/$dok_nam.$dok_ext ausgegeben. # In den letzten beiden Faellen wird ausserdem der korrekte MIME- # type ueber $dok_ext bestimmt. # # bei besetztem prov,id (ohne dok_var) wird Variante 1 des # Dokumentes in der Tabelle objects der DB ostore ausgg. # bei besetztem prov,id,dok_var wird entspr. Variante des # Dokumentes in der Tabelle objects der DB ostore ausgg. # In den letzten beiden Faellen wird dok_ext in der DB benutzt # um den mimetype zu ermitteln # # Note: fuer die Kodierung wird eine Datei mit MIME-Typen benoetigt. # Format: # # MIME-TYPE ext1 ext2 ... # ... # # Beispiel: # # text/html html htm # video/mpeg mpeg mpg mpe # # Ein hash (#) als Kommentarzeichen in der ersten Spalte ist erlaubt # # Autor: Thomas Seidel # # 18.06.1998 SeT erstellt # 07.07.1998 SeT dok_fpr fuer Fingerprints ergaenzt # 04.09.1998 SeT Content-Disposition: inline; filename=xxx ergaenzt # 20.04.1999 SeT Pfad fuer mime.types auf /usr/local/apache/etc geaendert # 11.10.1999 gp pfade fuer neuen deposit geaendert # 16.08.2000 rh ergaenzt um neue Verzeichnis-Struktur fuer Verlags-Publikationen # 29.01.2001 si Dokumentuebersichten fuer Netpub's heissen access.xml # 12.03.2001 si Erweiterung der Eingabe um Parameter "datei". Bei Wahl # dieses Parameters koennen keine der anderen Parameter # beruecksichtigt werden # 12.03.2001 si Erweiterung zur Bedienung von beliebigen Dateien # im Pfad $DOC_ROOT_ARCH (z.Zt. nur fuer das ARCHDBSM) # 29.03.2001 si Erweiterung zur Bedienung von Personendaten im Pfad # $DOC_ROOT_PERS (statische HTML-Seiten only) # 23.11.2001 si Keine Beruecksichtigung der access.xml, stattdessen access.htm - Probleme, dass Cocoon nicht laeuft # 18.11.2002 au Ber�cksichtiung von Hex-codierten "=" in URL # 08.05.2003 Si Erweiterung zur Bedienung von PND-Eintr�gen: erh�lt dokserv # Parameter idn mit einem Wert zwischen 10000000 und 14999999 # wird ein Link auf OPAC geliefert: sub output_pnd # 10.12.2003 Si Bei Anforderung einer nicht vorhandenen Frontpage wird ein # http-Header mit Status-Code 404 gesendet + Meldung wie vor # dafuer wurde die Routine "output_perled_file" umbenannt # 30.06.2004 Si Link fuer OPAC geaendert (LInk in PND-Eintrag) # 06.12.2004 Si fuer Retrieval von BIBLIOPLUS-Dokumenten aus ostore ergaenzt # 17.01.2005 sI verbesserte Fehlermeldung, wenn Parameter id statt idn ang. # 19.09.2008 Si Abfrage ob Datei .restricted in Verzeichnis. Wenn ja, R�ckgabe einer 403-Meldung # 04.02.2010 Si seit heute werden auch 10stellige IDNs bei Diss'n unterst�tzt. �nderung in Zeilen 157 und 165 # 23.02.2010 Si seit heute werden auch 10stellige IDNs bei NP'n unterst�tzt. �nderung in Zeilen 177ff # Root-Verzeichnisse fuer die Dokumente # echt: $DOC_ROOT_VERL = '/data/diglib/data/ep/netpub'; $DOC_ROOT_DISS = '/data/diglib/data/ep/dissonline'; $DOC_ROOT_ARCH = '/data/diglib/data/ep/archiv'; $DOC_ROOT_PERS = '/data/htdocs/personen'; # test: # $DOC_ROOT_VERL = '/home/heuvelmann/public_html/data/netpub'; # $DOC_ROOT_DISS = '/home/heuvelmann/public_html/data/dissonline'; # Namen und Extensionen der Dokumentuebersichtsseiten $DOC_PAGE_NAME_VERL = 'access'; $DOC_PAGE_EXT_VERL = 'htm'; #$DOC_PAGE_EXT_VERL = 'xml'; $DOC_PAGE_NAME_DISS = 'index'; $DOC_PAGE_EXT_DISS = 'htm'; $DOC_PAGE_EXT_PERS = 'htm'; # Praefix und Extension fuer Fingerprintdatei $DOC_FPR_PREFIX = 'ddb'; $DOC_FPR_EXT = 'txt'; # Datei mit MIME-Kodierungen # $MIME_TYPES = '/httpd/conf/mime.types'; # echt: $MIME_TYPES = '/etc/mime.types'; #$MIME_TYPES = '/etc/apache2/mime.types'; # test: # $MIME_TYPES = '/usr/local/apache/etc/mime.types'; # HTML-Datei fuer Meldungen # echt: $ERR_PAGE = "/data/diglib/data/ep/dissonline/etc/dokserv_msg.htm"; # test: # $ERR_PAGE = "/home/heuvelmann/public_html/etc/dokserv_msg.htm"; # Hauptprogramm # parse_query/1 parses incoming data to erl and eval scripts (See mod_esi(3)) # as defined in the standard URL format, that is '+' becomes 'space' and # decoding of hexadecimal characters (%xx). MAIN: { PARSE_QUERY: { $QUERY_STRING = $ENV{'QUERY_STRING'};# or last PARSE_QUERY; %param = &split_string($QUERY_STRING) or last PARSE_QUERY; # Zweig fuer beliebige Dateien - alte Loesung fuer DBSM-Dateien if( $par_file = $param{'datei'} ){ $par_dok_ext = $par_file; $par_dok_ext =~ s/.+\.(\w+)$/$1/; $par_file =~ s/\-/\//g; $doc_file = "$DOC_ROOT_ARCH/$par_file"; &output_doc($doc_file, $par_dok_ext) or last PARSE_QUERY; last MAIN; } # Zweig fuer BIBLIOPLUS Objekte aus Datenbank ostore if( $param{'prov'} ne '' && $param{'id'} ne '' ){ $prov = $param{'prov'}; $id = $param{'id'}; $dok_var = $param{'dok_var'}; if( $dok_var eq '' ){ $dok_var=1; } # default &output_obj($prov, $id, $dok_var) or last PARSE_QUERY; last MAIN; } $par_idn = $param{'idn'} or last PARSE_QUERY; # Zweig fuer Personendaten # if ( $par_idn =~ /^[1][^5]\d+[\dxX]$/ ) {# n� Zeile ist genauer # if ( $par_idn =~ /^[1][^5-9]\d+[\dxX]$/ ) { - f�hrte dazu, dass 10stellige IDNs als PND-Ids interpretiert wurden # 4.2.2010/si: auch 10stellige IDNs sind m�glich mit f�hrender 1 if ( $par_idn =~ /^[1][^5-9]\d\d\d\d\d\d[\dxX]$/ ) { &output_pnd($par_idn) or last PARSE_QUERY; #folgende 2 Zeilen auskommentiert - wurden die jemals benutzt? 8.5.03 Si # $doc_file = "$DOC_ROOT_PERS/$par_idn.$DOC_PAGE_EXT_PERS"; # &output_doc($doc_file, $DOC_PAGE_EXT_PERS) or last PARSE_QUERY; last MAIN; } # 4.2.2010/si Optionale f�hrende 1 wird toleriert - f�r Unterst�tzung 10stelliger IDNs if ( $par_idn !~ /^1?[0-9]{8}[0-9Xx]$/ ) { last PARSE_QUERY; } $par_idn = lc( $par_idn ); # Zweig fuer Verlagspublikationen: $DOC_ROOT = $DOC_ROOT_VERL; $DOC_PAGE_NAME = $DOC_PAGE_NAME_VERL; $DOC_PAGE_EXT = $DOC_PAGE_EXT_VERL; if ( length($par_idn) == 9 ){ @idn_array = split (/ */, $par_idn, 9) or last PARSE_QUERY; $path_netpub = "$DOC_ROOT/" ."$idn_array[7]$idn_array[8]/" ."$idn_array[5]$idn_array[6]/" ."$idn_array[3]$idn_array[4]/" ."$par_idn"; } elsif ( length($par_idn) == 10 ){ @idn_array = split (/ */, $par_idn, 10) or last PARSE_QUERY; $path_netpub = "$DOC_ROOT/" ."$idn_array[8]$idn_array[9]/" ."$idn_array[6]$idn_array[7]/" ."$idn_array[4]$idn_array[5]/" ."$par_idn"; } if ( -d "$path_netpub/_meta" ) { $doc_file = "$path_netpub/_meta/$DOC_PAGE_NAME.$DOC_PAGE_EXT"; $par_dok_ext = $DOC_PAGE_EXT; } elsif ( -d "$path_netpub/_META" ) { $doc_file = "$path_netpub/_META/$DOC_PAGE_NAME.$DOC_PAGE_EXT"; $par_dok_ext = $DOC_PAGE_EXT; } # Zweig fuer Dissertationen: else { $DOC_ROOT = $DOC_ROOT_DISS; $DOC_PAGE_NAME = $DOC_PAGE_NAME_DISS; $DOC_PAGE_EXT = $DOC_PAGE_EXT_DISS; if ( ( $par_dok_ext = $param{'dok_ext'} ) ) { if ( ( $par_dok_var = $param{'dok_var'} ) ) { $doc_file = "$DOC_ROOT/$par_idn/$par_dok_var/$par_idn.$par_dok_ext"; } elsif ( ( $par_dok_nam = $param{'dok_nam'} ) ) { $doc_file = "$DOC_ROOT/$par_idn/$par_dok_nam.$par_dok_ext"; } else { last PARSE_QUERY; } } else { if ( ( $par_dok_fpr = $param{'dok_fpr'} ) ) { if ( ( $par_dok_var = $param{'dok_var'} ) ) { $doc_file = "$DOC_ROOT/$par_idn/$par_dok_var/$DOC_FPR_PREFIX$par_dok_fpr.$DOC_FPR_EXT"; $par_dok_ext = $DOC_FPR_EXT; } else { last PARSE_QUERY; } } else { $doc_file = "$DOC_ROOT/$par_idn/$DOC_PAGE_NAME.$DOC_PAGE_EXT"; $par_dok_ext = $DOC_PAGE_EXT; } } } &output_doc($doc_file, $par_dok_ext) or last PARSE_QUERY; last MAIN; } if( $par_idn ){ $message = " Leider wurde der angeforderte Datensatz nicht gefunden. Mit den Suchm�glichkeiten unseres Katalogs kann der Datensatz (IDN = $par_idn) ermittelt werden. Zum Katalog https://portal.dnb.de Handelt es sich um ein lizenzpflichtiges Dokument, ist die Netzpublikation nur an bestimmten Endger�ten in den Leses�len der Deutschen Nationalbibliothek verf�gbar. Handelt es sich um einen technischen Fehler, wenden Sie sich an die Email-Adresse np-problem@dnb.de "; } elsif($param{'id'}){ $message = "Auf das Dokument (ID = $param{'id'}) kann nicht zugegriffen werden, da die Angabe eines Providers fehlt. Eventuell wollten Sie auf das Dokument mit der IDN=$param{'id'} zugreifen: http://deposit.dnb.de/cgi-bin/dokserv?idn=$param{'id'}"; } else { $message = "Auf das Dokument (datei = $param{datei}) kann nicht zugegriffen werden."; } &output_perled_file_404( $ERR_PAGE ); } # Unterprogramme................. sub split_string { my ($string) = @_; my (%params); $string =~ s/%3[dD]/=/g; # HMA 18.11.02, kann so auch URL mit Hex-Cod "=" verarbeiten foreach $par ( split ( '&', $string ) ) { ($name, $value) = split ( '=', $par, 2 ); $params{$name} = $value; } return %params; } sub output_doc { my ($doc_file, $doc_ext) = @_; my ($mime_type); my ($doc_name); $mime_type = &get_mime_type($doc_ext) or return 0; $doc_name = substr($doc_file, rindex($doc_file, '/') + 1); $restricted_file = $doc_file; $restricted_file =~ s/$doc_name/\.restricted/; if ( -r $restricted_file ){ $message = "Auf das Dokument (datei = $param{datei}) kann aus rechtlichen Gründen nicht zugegriffen werden."; &output_perled_file_404( $ERR_PAGE ); return 1; } if ( ! -r $doc_file ) { return 0 }; print "Content-type: $mime_type\n"; print "Content-Disposition: inline; filename=$doc_name\n\n"; &output_file($doc_file) or return 0; return 1; } sub output_obj { my ($doc_prov, $doc_id, $doc_var) = @_; my ($mime_type, $doc_ext, $out_doc); use lib '/data/diglib/software/perl5-site_perl/BiblioPlus'; use ostore; # MySQL-Modul # erst Dateinamenserweiterung erfragen (fungiert auch als DB-Test) $doc_ext = &ostore::GET_NAME_EXT($doc_prov,$doc_id,$doc_var); $mime_type = &get_mime_type($doc_ext) or return 0; $out_doc = &ostore::READ_OBJECT($doc_prov,$doc_id,$doc_var); if( $out_doc =~ /^failed/ ){ $message = "Auf das Dokument mit dem Schlüssel ($doc_prov,$doc_id,$doc_var) kann nicht zugegriffen werden."; &output_perled_file_404( $ERR_PAGE ); return 1; } if( $out_doc =~ /charset=UTF-8/m ){ print "Content-type: $mime_type;charset=UTF-8\n\n"; } else { print "Content-type: $mime_type\n\n"; } print $out_doc; return 1; } sub output_pnd { my ($idn) = @_; print "Content-type: text/html\n\n"; if ( $ENV{'REMOTE_ADDR'} =~ /^10\.3\d\..*/ ){ print "\n\n Deutsche Nationalbibliothek\n \n\n\n"; } else { print "\n\n Deutsche Nationalbibliothek\n \n\n\n"; #obsolet seit ? print "\n\n Deutsche Nationalbibliothek\n \n\n\n"; # obsolet seit 29.6.04 print "\n\n Die Deutsche Bibliothek\n \n\n\n"; } return 1; } sub get_mime_type { my ($doc_ext) = @_; $doc_ext = lc( $doc_ext ); open( MIME_FILE, $MIME_TYPES ) or return 0; while ( ) { next if /^\#/; chomp; ( $type, @ext ) = split; if ( grep( $doc_ext eq $_, @ext ) ) { close( MIME_FILE ); return $type; } } close( MIME_FILE ); return "unknown/binary"; } sub output_file { my ($doc_file) = @_; open (OUT_DOC, $doc_file) or return 0; while ( ) { print; } close (OUT_DOC); } sub output_perled_file_404 { my ($file) = @_; my ($tail); print "Status: 404 Not Found\n"; print "Content-type: text/html\n\n"; #print " "; open (OUT_FILE, $file) or return 0; while ( ) { print, next unless / /i; print $`; $perl = $'; while ( ) { $perl = $perl . $`, $tail = $', last if /<\/perl>/i; $perl = $perl . $_; } eval $perl; print $tail; } close (OUT_FILE); }
Weiterführende Links