Commit 611129fe authored by Tobias Zeumer's avatar Tobias Zeumer
Browse files
parent af3c58bb
# LBS-Service für borrower_update
Zwei einfach Skripte, die Dateien im Pica-Format (Version 3 oder 4) annehmen womit so Benutzer automatisch eingespielt werden können.
Die LBS3-Version ist schneller, erlaubt dafür aber ein paar Datenfelder weniger. Sie läuft aber auch mit LBS4.
## Einrichtung
* [Version für LBS3](pica3/README.md) (oder LBS4)
* [Version für LBS4](pica4/README.md)
## Testen
Für einen minimalistischen Test können die [Upload-Clients](/upload/README.md) verwendet werden.
## Weitere Ressourcen
### Verbindung via SSH-Tunnel erlauben
Wie sendet man mit einer gesicherten Verbindung an den jeweiligen Dienst? Siehe dafür das Projekt [lbs/linux-server/module-linux-client](https://collaborating.tuhh.de/tub/dd/lbs/linux-server/module-linux-client)
### Dateien im Pica-Format erzeugen
Entweder per Hand und nach der Pica-Dokumentation oder z.B. mit der PHP-Class aus dem Projekt [php-borrower-update](https://collaborating.tuhh.de/tub/dd/lbs/php-ressources/php-borrower-update). Dort ist auch das Format nochmal genauer erklärt.
\ No newline at end of file
[Zur Übersicht](../../../README.md)
# Client für borrower_update
## Info
In diesem Verzeichnis liegen zwei Varianten für einen Zugriff via Socket auf den borrower_update-Service (siehe dazu [LBS3-Service für borrower_update](../pica3) bzw. [LBS4-Service für borrower_update](../pica4)).
1. Perl-Version: *pica_upload_client*
2. PHP-Version: *upload.php*
## Verbindung
Es wird jeweils davon ausgegangen, dass ein SSH-Tunnel auf dem Server läuft, der diese(s) Script(s) ausführt. Siehe dazu [Permanenter SSH-Tunnel](../ssh).
Voreingestellt ist jeweils der Port für Pica4 (4097), kann aber gegen Pica3 (4096) getauscht werden.
## Beispieldaten
In user.txt sind minimale Beispieldaten angegeben, die so für Pica3 und Pica4 funktionieren.
#!/usr/bin/perl
use Socket;
use IO::Handle;
## configuration section
my $remote="localhost";
my $port=4097;
my $password='PASSWORD';
## end configuration
$iaddr = inet_aton($remote) || die "no host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(SOCK, $paddr) || die "connect: $!";
SOCK->autoflush(1);
STDIN->autoflush(1);
print "step 1 \n";
print SOCK "$password\n" || die "print: $!";
while (<STDIN>) {
print SOCK $_ || die "print: $!"; ;
}
print SOCK "eof\n" || die "print: $!"; ;
print "step 2\n";
$ok = 0;
while (<SOCK>) {
print $_ ;
$ok = ($_ =~ /^Anzahl eingefügter Benutzer: [1-9]/) ? 1 : $ok;
last if ($ok);
}
print "step 3: $ok Users\n";
exit(($ok) ? 0 : 1);
<?php
/* Info
* Dies ist nur eine absolut minimales Script zur Veranschaulichung, wie
* Daten im PICA3 (Port 4096) bzw. PICA4 (Port 4097) Format gesendet werden
* können.
*
* Angenommen wird, dass ein Tunnel besteht und daher localhost verwendet wird.
*
*/
echo "<pre>";
// Ohne Tunnel, Auskommentierung folgender beiden Zeilen ändern und dritte Zeilen
// entsprechend auskommentieren:
// $server = gethostbyname('lhlbs.gbv.de');
// $client = stream_socket_client("tcp://$server:4097", $errno, $errorMessage);
$client = stream_socket_client("tcp://localhost:4097", $errno, $errorMessage);
if ($client === false) {
//throw new UnexpectedValueException("Failed to connect: $errorMessage");
echo "Failed to connect: $errorMessage";
exit;
}
$password = "PASSWORD\n";
$message = file_get_contents('user.txt');
$message .= "\neof\n";
echo "(1) SENDING PASSWORD\n\n";
fwrite($client, $password);
echo "(2) SENDING DATA\n\n";
fwrite($client, $message);
echo "(3) RECEIVING RESULT\n\n";
$response = stream_get_contents($client);
if (!$response) {
echo "Error: Probably wrong password.\n\n";
} else {
echo $response;
}
echo "(4) CLOSING CONNECTION\n\n";
fclose($client);
?>
\ No newline at end of file
000 23
001 01-22-2018
100 U
101 0001234
102 0001234
103 20
104 0
105 PicaUpload
107 Vorname
109 01-01-1950
110 1
111 1
115 DE
200 U
201 1
202 01-22-2018
300 U
301 1
303 Teststrae 55
304 12345
305 Hamburg
\ No newline at end of file
[Zur Übersicht](../README.md)
# LBS3-Service für borrower_update
## Vorbemerkung
* Es wird von einer VZG-Hosting-Umgebung für das LBS ausgegangen.
* Sofern bei Angaben "har" zu finden ist, ist dies das Kürzel für Harburg und kann ggf. lokal angepasst werden.
* Pfade und Passwort ggf. anpassen
## Einrichtung
### Server
#### Dateien kopieren
1. Der gesamte Inhalt des pica3-Ordners wird nach *lbs-server@/pica/prod/har/user_import kopiert
2. (Rechte an Dateien für Jaguar-User setzen)
#### Autostart sicherstellen
In *lbs-server@/etc/vzg/start_lbs-server* am Ende ergänzen: `su - lbs_prod -c '$HOME/har/user_import/start_user_import.rc start'` (auf die Datei wird beim Systemstart via *lbs-server@/etc/rc3.d/S91_start_lbs* verlinkt).
## Hinweise
* user_import_lbs3 kann auch in der Shell direkt ausgeführt werden, für ein Livemonitoring beim Testen
\ No newline at end of file
#!/usr/bin/ksh
# Filename : user_import_lbs4.rc
# Author : Jarmo Schrader
# Creation date : 15.01.2015
# Short description : submits user_import_lbs4
# Modified : Tobias Zeumer
# Functional description :
#
# File for manual (or especially automatically) starting the user import daemon
# for lbs3 (borrower_update)
#
# Usage for autostarting Daemon in VZG hosting:
# 1. Edit file: /etc/vzg/start_lbs-server
# 2. Add line at end:
# "su - lbs_prod -c '$HOME/har/user_import/user_import_lbs3.rc start'"
#
# ------------------------------------------------------------------------------
# Make sure daemon is only started by user jaguar
# ------------------------------------------------------------------------------
if [ ! $USER = "lbs_prod" ]; then
echo "ERROR:\n $0 may only be run by user lbs_prod."
echo "AS ROOT you may use:\n \"su - jaguar -c $0 start\""
exit 1
fi
# ------------------------------------------------------------------------------
# Configuration
# ------------------------------------------------------------------------------
# Environment
#. $HOME/.profile_jaguar
#PATH=/sbin:/usr/sbin:/usr/bin:/bin ; export PATH
# Config: Folders
CUSTOMFOLDER="har/user_import"
HOMEDIR="/pica/prod/${CUSTOMFOLDER}"
LOGDIR="${HOMEDIR}/log"
# Config: Process (script name)
# Note: By the book it probably should be "/var/run/${DAEMON}.pid"?
DAEMON="user_import_lbs3"
PIDFILENAME="${HOMEDIR}/.${DAEMON}.pid"
# ------------------------------------------------------------------------------
# Functions
# ------------------------------------------------------------------------------
# Read PID from PID-File
function getpid {
if [ -f $PIDFILENAME ]; then
if [ -r $PIDFILENAME ]; then
pid=`cat $PIDFILENAME`
if [ "X$pid" != "X" ]; then
# Verify that process with this pid is still running.
pid=`ps -p $pid | grep $pid | grep -v grep | awk '{print $1}' | tail -1`
if [ "X$pid" = "X" ]; then
# This is a stale pid file
rm -f $PIDFILENAME
echo "Removed stale pid file: $PIDFILENAME"
fi
fi
else
echo "Cannot read $PIDFILENAME"
exit 1
fi
else
pid=""
fi
}
# Service: start script as a daemon
function service_start {
getpid
if [ "X$pid" = "X" ]; then
#org-har: nohup ${HOMEDIR}/${DAEMON} > /dev/null &
#nohup ${HOMEDIR}/${DAEMON} >> ${LOGDIR}/${DAEMON}_daemon.log 2>&1 & <<< Append to log...
nohup ${HOMEDIR}/${DAEMON} > ${LOGDIR}/${DAEMON}_daemon.log 2>&1 &
# Check if processs is running at all
sleep 1
running=`ps -ef | grep user_import_lbs3 | grep -v grep | awk '{ print $2 }'`
if [[ "X$running" = "X" ]]; then
echo "FAILURE! Script ${DAEMON} failed to start. Please check " ${LOGDIR}/${DAEMON}_daemon.log
else
# Store PID in file
echo $running > $PIDFILENAME
echo "${DAEMON} started"
fi
else
echo "${DAEMON} already running under pid $pid"
fi
}
# Service: stop
function service_stop {
getpid
if [ "X$pid" = "X" ]; then
echo "${DAEMON} was not running."
else
# Try stopping it
kill $pid
if [ $? -ne 0 ]; then
echo "Unable to stop ${DAEMON}."
exit 1
else
rm -f $PIDFILENAME
echo "${DAEMON} stopped"
fi
fi
}
# Service: restart
function service_restart {
service_stop
sleep 10
service_start
}
# Service: status
function service_status {
getpid
if [ "X$pid" = "X" ]; then
echo "${DAEMON} is not running."
exit 1
else
echo "${DAEMON} is running under pid $pid."
exit 0
fi
}
# ------------------------------------------------------------------------------
# Script commands
# ------------------------------------------------------------------------------
case "$1" in
start)
service_start
;;
stop)
service_stop
;;
restart)
service_restart
;;
status)
service_status
;;
*)
echo "usage $0 start|stop|restart|status"
;;
esac
# ------------------------------------------------------------------------------
# Exit
# ------------------------------------------------------------------------------
exit 0
#!/usr/bin/perl
# user_import_lbs3
# Das Script sollte nicht direkt, sondern als Daemon via start_user_import.rc
# laufen
#
# @todo
# - Variable $iln = ist nur für das borrower-update-Kommando wichtig, nicht für
# den eigentlichen Import (jedenfalls LBS3 war es so - checken)
# - keine die's (mail schicken oder so)
# - $cmd_pica ist viel schneller fertig, als die Ausgabe nahe legt, ggf. mit &
# starten und nur auf Änderungen des Logs gucken? Minimum Wartezeit ist sonst
# ca. 15 Sekunden (ein Benutzer)
#
# Perlvariante TUB TUHH von
#
# "Updateprozess fuer Einspielung von Nutzerdaten UB Hildesheim
# ASCII Datei in <base> als upd4_<ILN>_<Nachname>_<Timestamp>.asc einspielen
# Aufruf nur durch User jaguar moeglich
# 10.10.2014 J. Schrader"
# ------------------------------------------------------------------------------
# Basic setup
# ------------------------------------------------------------------------------
# Environment
use strict;
use warnings;
# Required Perl libraries
use Socket;
use IO::Handle;
# Convenience Perl libraries
use File::Basename;
use POSIX qw/strftime/;
use File::Copy;
# ------------------------------------------------------------------------------
# Configuration
# ------------------------------------------------------------------------------
my $iln='23';
my $port=4096;
my @ip_ok = ( '127.0.0.1', '134.28.50.1', '134.28.50.47' );
my $password = 'PASSWORD';
my $log_verbose = 1;
my $mail_on_error = 1;
my $mail_to = 'tobias.zeumer@tuhh.de';
my $mail_from = 'lbs4@tuhh.de';
# ------------------------------------------------------------------------------
# Variables
# ------------------------------------------------------------------------------
# Paths
my $current_script = basename($0);
my $script_home = $0;
$script_home =~ s/\/$current_script//g;
my $input_fName = 'ousp_upd_borrower.asc'; #cannot be changed in lbs3
my $input_file = '/pica/prod/asc/'.$input_fName; #cannot be changed in lbs3
my $log_directory = $script_home.'/log';
my $result_fName = "borrower_update_$iln.log";
my $result_file = '/pica/prod/log/ousp_upd_borrower.txt'; # $log_directory."/".$result_fName; cannot be changed in lbs3
my $logfile = $log_directory.'/user_import_lbs3.log';
my $backup_failed = $script_home.'/data/failed_imports';
# Other
my $proto = getprotobyname('tcp');
my $client_ip = '';
my $client_pass = '';
my $accept_client = 0;
my $result = '';
# Borrower_update and mail als system()-commands
#my $cmd_pica="$script_home/pica_upload_cmd.sh";
my $cmd_pica = 'PATH=/usr/bin:/pica/prod/com:/usr/sbin ; export PATH;
. /pica/prod/lbs_system/define_lbs_env;
. /pica/prod/lbs_system/define_prod ;
/usr/bin/echo "y" | /pica/prod/com/doe ousp_upd_borrower > /dev/null';
my $cmd_mail = "echo \"Bitte $backup_failed prüfen.\" | mailx -r $mail_from -s \"ILN $iln: Fehler bei Benutzerimport\" $mail_to";
# ------------------------------------------------------------------------------
# Start "Logger"
# ------------------------------------------------------------------------------
open(LOG, '>>', $logfile) or die "Could not open file '$logfile' $!";
# ------------------------------------------------------------------------------
# Functions
# ------------------------------------------------------------------------------
# Shorthand for messages with formated time
sub message {
my $msg = strftime("%Y-%m-%d %H:%M:%S", localtime(time)) ." ". $_[0] . "\n";
if ($log_verbose) {
print $msg;
}
return $msg;
}
# ------------------------------------------------------------------------------
# Start server
# ------------------------------------------------------------------------------
print LOG message("Starting Server");
socket(Server, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) || die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";
print LOG message("Server started. Waiting for connections...");
# ------------------------------------------------------------------------------
# Wait for input
# ------------------------------------------------------------------------------
for ( ; my $paddr = accept(Client,Server); close Client) {
Client->autoflush(1);
my($port, $iaddr) = sockaddr_in($paddr);
$client_ip = inet_ntoa($iaddr);
# --------------------------------------------------------------------------
# Verify client
# --------------------------------------------------------------------------
$accept_client = 0;
print LOG message("Client $client_ip connected");
# Check IP
foreach my $allowed_ip (@ip_ok) {
$accept_client = ($allowed_ip eq $client_ip) ? 1 : 0;
}
($accept_client eq 1) ? print LOG message("Client IP permitted") : print LOG message("Client IP ${client_ip} denied");
# Check password (you should use SSH ;))
if ($accept_client) {
chomp($client_pass = <Client>);
$client_pass =~ s/\r$//;
$accept_client = ($password eq $client_pass) ? 1 : 0;
}
($accept_client eq 1) ? print LOG message("Client password accepted") : print LOG message("Client provided wrong credentials");
# --------------------------------------------------------------------------
# Receive and input user data
# --------------------------------------------------------------------------
if ($accept_client) {
-f $result_file && ( unlink($result_file) || next );
-f $input_file && ( unlink($input_file) || next );
# Read data from client
print LOG message("Receiving data");
open (DATA,'>' . $input_file) || next;
while (<Client>) {
last if $_ =~ /^eof/;
print DATA $_;
}
close(DATA) || next;
# Run pica command
print LOG message("Processing data");
system($cmd_pica);
# Convert and open result file
# (Always return UTF-8; use system, because Perl "Text::Iconv" is not
# available by default in hosting. Anyway, not really necessary... :))
#open (my $fh, '<:encoding(UTF-8)', $result_file.".utf8") || next;
system("iconv -f 8859-1 -t UTF-8 -c ${result_file} > ${result_file}.utf8");
open (my $fh, , $result_file.".utf8") || next;
read $fh, $result, -s $result_file;
close $fh;
# Search for errors
my @result_check = $result =~ /^.*Erstellungsdatum : \d{2}-\d{2}-\d{4}(.*?)?.*Anzahl gelesener Nutzer : (\d)?(.*Anzahl nicht verarbeiteter Nutzer : \d)+.*$/s;
$result_check[0] = '';
$result_check[1] = $result =~ /^.*Anzahl gelesener Nutzer : (\d)?.*$/s;
$result_check[2] = $result =~ /^.*Anzahl nicht verarbeiteter Nutzer : (\d)?.*$/s;
#print "Error message(s): $result_check[0]\n";
#print "User count in file : $result_check[1]\n";
#print "Count of unprocessed users (=error): $result_check[2]\n";
if ($result_check[2] ne '0') {
my $timestamp = strftime("%Y-%m-%d_%H-%M-%S", localtime(time));
print LOG message("ERROR: Unprocessed users: $result_check[2] of $result_check[1]. Error message:$result_check[0]");
# Copy input and result file for later check
copy($input_file, "${backup_failed}/${timestamp}_${input_fName}") or die "Copy failed: $!";
copy($result_file, "${backup_failed}/${timestamp}_${result_fName}") or die "Copy failed: $!";
print LOG message("Created backup of erroneuos files: ${backup_failed}/${timestamp}_${input_fName} and ${backup_failed}/${timestamp}_${result_fName}");
# Send error mail if desired
if ($mail_on_error eq 1) {
print LOG message("Sent mail to $mail_to");
system($cmd_mail);
}
} else {
print LOG message("Sucessfully processed $result_check[1] users.");
}
# Return result to client
print LOG message("Sending reply");
print Client $result;
}
else {
print Client "Bye!\n";
}
print LOG message("Close connection"); # Autoflush at start really
}
close(Server);
[Zur Übersicht](../README.md)
# LBS4-Service für borrower_update
## Vorbemerkung
* Es wird von einer VZG-Hosting-Umgebung für das LBS ausgegangen.
* Sofern bei Angaben "har" zu finden ist, ist dies das Kürzel für Harburg und kann ggf. lokal angepasst werden.
* Pfade und Passwort ggf. anpassen
## Einrichtung
### Server
#### Dateien kopieren
1. Der gesamte Inhalt des pica4-Ordners wird nach *lbs-server@/pica/jaguar/har/user_import kopiert
2. (Rechte an Dateien für Jaguar-User setzen)
#### Autostart sicherstellen
In *lbs-server@/etc/vzg/start_lbs-server* am Ende ergänzen: `su - jaguar -c '$HOME/har/user_import/start_user_import.rc start'` (auf die Datei wird beim Systemstart via *lbs-server@/etc/rc3.d/S91_start_lbs* verlinkt).
## Hinweise
* user_import_lbs4 kann auch in der Shell direkt ausgeführt werden, für ein Livemonitoring beim Testen
\ No newline at end of file
000 23
001 09-03-2017
100 U
101 0001234
102 0001234
103 20
104 0
105 TestStudent
107 Tobis
109 08-03-1981
110 1
111 1
115 DE
200 U
201 1
202 01-04-2017
300 U
301 1
303 Teststrae 55
304 12345
305 Hamburg
314 Benjamin.Test@abc.de
301 2
303 Teststrae 99
304 54321
305 Hamburg
314 bla@da.de
Markdown is supported
0% or