From 37c8a68d3ce513b3ece696e8f8de94dbaa1548a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20Zl=C3=A1mal?= <zlamal@cesnet.cz> Date: Fri, 4 Nov 2016 09:19:40 +0100 Subject: [PATCH] Added service for filling Tritius system - Implemented service vsup_tritius for filling Tritius system. - Table is inside perun own db. --- gen/vsup_tritius | 119 ++++++++++++++++++++++++++++++++++++++++++++ send/vsup_tritius | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100755 gen/vsup_tritius create mode 100755 send/vsup_tritius diff --git a/gen/vsup_tritius b/gen/vsup_tritius new file mode 100755 index 00000000..12a66893 --- /dev/null +++ b/gen/vsup_tritius @@ -0,0 +1,119 @@ +#!/usr/bin/perl +use feature "switch"; +use strict; +use warnings; +use perunServicesInit; +use perunServicesUtils; + +local $::SERVICE_NAME = "vsup_tritius"; +local $::PROTOCOL_VERSION = "3.0.0"; +my $SCRIPT_VERSION = "3.0.0"; + +perunServicesInit::init; +my $DIRECTORY = perunServicesInit::getDirectory; +my $fileName = "$DIRECTORY/$::SERVICE_NAME".".csv"; +my $data = perunServicesInit::getFlatData; + +#Constants +our $A_LOGIN; *A_LOGIN = \'urn:perun:user_facility:attribute-def:virt:login'; +our $A_UCO; *A_UCO= \'urn:perun:user:attribute-def:def:ucoVsup'; +our $A_TITLE_BEFORE; *A_TITLE_BEFORE = \'urn:perun:user:attribute-def:core:titleBefore'; +our $A_FIRST_NAME; *A_FIRST_NAME = \'urn:perun:user:attribute-def:core:firstName'; +our $A_LAST_NAME; *A_LAST_NAME = \'urn:perun:user:attribute-def:core:lastName'; +our $A_ARTISTIC_FIRST_NAME; *A_ARTISTIC_FIRST_NAME = \'urn:perun:user:attribute-def:def:artisticFirstName'; +our $A_ARTISTIC_LAST_NAME; *A_ARTISTIC_LAST_NAME = \'urn:perun:user:attribute-def:def:artisticLastName'; +our $A_TITLE_AFTER; *A_TITLE_AFTER = \'urn:perun:user:attribute-def:core:titleAfter'; +our $A_BIRTH_NUMBER; *A_BIRTH_NUMBER = \'urn:perun:user:attribute-def:def:birthNumber'; +our $A_GENDER; *A_GENDER = \'urn:perun:user:attribute-def:def:gender'; +our $A_PHONE; *A_PHONE = \'urn:perun:user:attribute-def:def:preferredPhone'; +our $A_CARD_BARCODES; *A_CARD_BARCODES = \'urn:perun:user:attribute-def:def:cardBarCodes'; +our $A_CARD_CHIP_NUMBERS; *A_CARD_CHIP_NUMBERS = \'urn:perun:user:attribute-def:def:cardCodes'; +our $A_VSUP_MAIL; *A_VSUP_MAIL = \'urn:perun:user:attribute-def:def:vsupMail'; +# address +our $A_ADDRESS_STREET_KOS; *A_ADDRESS_STREET_KOS = \'urn:perun:user:attribute-def:def:addressStreetKos'; +our $A_ADDRESS_STREET_DC2; *A_ADDRESS_STREET_DC2 = \'urn:perun:user:attribute-def:def:addressStreetDc2'; +our $A_ADDRESS_HOUSE_NUMBER_KOS; *A_ADDRESS_HOUSE_NUMBER_KOS = \'urn:perun:user:attribute-def:def:addressHouseNumberKos'; +our $A_ADDRESS_HOUSE_NUMBER_DC2; *A_ADDRESS_HOUSE_NUMBER_DC2 = \'urn:perun:user:attribute-def:def:addressHouseNumberDc2'; +our $A_ADDRESS_TOWN_KOS; *A_ADDRESS_TOWN_KOS = \'urn:perun:user:attribute-def:def:addressTownKos'; +our $A_ADDRESS_TOWN_DC2; *A_ADDRESS_TOWN_DC2 = \'urn:perun:user:attribute-def:def:addressTownDc2'; +our $A_ADDRESS_POSTAL_CODE_KOS; *A_ADDRESS_POSTAL_CODE_KOS = \'urn:perun:user:attribute-def:def:addressPostalCodeKos'; +our $A_ADDRESS_POSTAL_CODE_DC2; *A_ADDRESS_POSTAL_CODE_DC2 = \'urn:perun:user:attribute-def:def:addressPostalCodeDc2'; + +# GATHER USERS +my $users; # $users->{$uco}->{ATTR} = $attrValue; + +# +# AGGREGATE DATA +# +# FOR EACH USER +foreach my $user (($data->getChildElements)[1]->getChildElements) { + + my %uAttributes = attributesToHash $user->getAttributes; + + my $uco = $uAttributes{$A_UCO}; + $users->{$uco}->{$A_LOGIN} = $uAttributes{$A_LOGIN}; + $users->{$uco}->{$A_VSUP_MAIL} = $uAttributes{$A_VSUP_MAIL}; + $users->{$uco}->{$A_FIRST_NAME} = (defined $uAttributes{$A_ARTISTIC_FIRST_NAME} ? $uAttributes{$A_ARTISTIC_FIRST_NAME} : (defined $uAttributes{$A_FIRST_NAME} ? $uAttributes{$A_FIRST_NAME} : '')); + $users->{$uco}->{$A_LAST_NAME} = (defined $uAttributes{$A_ARTISTIC_LAST_NAME} ? $uAttributes{$A_ARTISTIC_LAST_NAME} : (defined $uAttributes{$A_LAST_NAME} ? $uAttributes{$A_LAST_NAME} : '')); + $users->{$uco}->{$A_TITLE_BEFORE} = (defined $uAttributes{$A_TITLE_BEFORE} ? $uAttributes{$A_TITLE_BEFORE} : ''); + $users->{$uco}->{$A_TITLE_AFTER} = (defined $uAttributes{$A_TITLE_AFTER} ? $uAttributes{$A_TITLE_AFTER} : ''); + $users->{$uco}->{$A_PHONE} = (defined $uAttributes{$A_PHONE} ? $uAttributes{$A_PHONE} : ''); + $users->{$uco}->{$A_GENDER} = (defined $uAttributes{$A_GENDER} ? $uAttributes{$A_GENDER} : ''); + $users->{$uco}->{$A_BIRTH_NUMBER} = (defined $uAttributes{$A_BIRTH_NUMBER} ? $uAttributes{$A_BIRTH_NUMBER} : ''); + + # if multiple, send only first one + if (defined $uAttributes{$A_CARD_BARCODES}) { + $users->{$uco}->{$A_CARD_BARCODES} = $uAttributes{$A_CARD_BARCODES}->[0]; + } else { + $users->{$uco}->{$A_CARD_BARCODES} = ''; + } + if (defined $uAttributes{$A_CARD_CHIP_NUMBERS}) { + $users->{$uco}->{$A_CARD_CHIP_NUMBERS} = $uAttributes{$A_CARD_CHIP_NUMBERS}->[0]; + } else { + $users->{$uco}->{$A_CARD_CHIP_NUMBERS} = ''; + } + + if (defined $uAttributes{$A_ADDRESS_STREET_DC2}) { + # has address from DC2 + $users->{$uco}->{'STREET'} = (defined $uAttributes{$A_ADDRESS_STREET_DC2} ? $uAttributes{$A_ADDRESS_STREET_DC2} : ''); + $users->{$uco}->{'HOUSE_NUMBER'} = (defined $uAttributes{$A_ADDRESS_HOUSE_NUMBER_DC2} ? $uAttributes{$A_ADDRESS_HOUSE_NUMBER_DC2} : ''); + $users->{$uco}->{'TOWN'} = (defined $uAttributes{$A_ADDRESS_TOWN_DC2} ? $uAttributes{$A_ADDRESS_TOWN_DC2} : ''); + $users->{$uco}->{'POSTAL_CODE'} = (defined $uAttributes{$A_ADDRESS_POSTAL_CODE_DC2} ? $uAttributes{$A_ADDRESS_POSTAL_CODE_DC2} : ''); + } elsif (defined $uAttributes{$A_ADDRESS_STREET_KOS}) { + # has address from KOS + $users->{$uco}->{'STREET'} = (defined $uAttributes{$A_ADDRESS_STREET_KOS} ? $uAttributes{$A_ADDRESS_STREET_KOS} : ''); + $users->{$uco}->{'HOUSE_NUMBER'} = (defined $uAttributes{$A_ADDRESS_HOUSE_NUMBER_KOS} ? $uAttributes{$A_ADDRESS_HOUSE_NUMBER_KOS} : ''); + $users->{$uco}->{'TOWN'} = (defined $uAttributes{$A_ADDRESS_TOWN_KOS} ? $uAttributes{$A_ADDRESS_TOWN_KOS} : ''); + $users->{$uco}->{'POSTAL_CODE'} = (defined $uAttributes{$A_ADDRESS_POSTAL_CODE_KOS} ? $uAttributes{$A_ADDRESS_POSTAL_CODE_KOS} : ''); + } else { + # don't have address + $users->{$uco}->{'STREET'} = ''; + $users->{$uco}->{'HOUSE_NUMBER'} = ''; + $users->{$uco}->{'TOWN'} = ''; + $users->{$uco}->{'POSTAL_CODE'} = ''; + } + +} + +# +# PRINT user data LDIF +# +open FILE,">$fileName" or die "Cannot open $fileName: $! \n"; +binmode FILE, ":utf8"; + +# FOR EACH USER ON FACILITY +my @keys = sort keys %{$users}; +for my $uco (@keys) { + + # print attributes, which are never empty + print FILE $uco . "\t" . $users->{$uco}->{$A_LOGIN} . "\t" . $users->{$uco}->{$A_VSUP_MAIL} . "\t" . $users->{$uco}->{$A_FIRST_NAME} + . "\t" . $users->{$uco}->{$A_LAST_NAME} . "\t" . $users->{$uco}->{$A_TITLE_BEFORE} . "\t" . $users->{$uco}->{$A_TITLE_AFTER} + . "\t" . $users->{$uco}->{$A_BIRTH_NUMBER} . "\t" . $users->{$uco}->{$A_GENDER} . "\t" . $users->{$uco}->{$A_PHONE} + . "\t" . $users->{$uco}->{$A_CARD_BARCODES} . "\t" . $users->{$uco}->{$A_CARD_CHIP_NUMBERS} . "\t" . $users->{$uco}->{'STREET'} + . "\t" . $users->{$uco}->{HOUSE_NUMBER} . "\t" . $users->{$uco}->{'TOWN'} . "\t" . $users->{$uco}->{'POSTAL_CODE'} . "\n"; + +} + +close(FILE); + +perunServicesInit::finalize; diff --git a/send/vsup_tritius b/send/vsup_tritius new file mode 100755 index 00000000..cb563345 --- /dev/null +++ b/send/vsup_tritius @@ -0,0 +1,122 @@ +#!/usr/bin/perl +use strict; +use warnings FATAL => 'all'; +use DBI; +use Getopt::Long qw(:config no_ignore_case); +use Data::Dumper; +use Encode qw(encode); +use ScriptLock; + +my $username; +my $password; +my $tableName = 'perun2tritius_osoby'; + +# define service +my $service_name = "vsup_tritius"; + +# GEN folder location +my $facility_name = $ARGV[0]; +chomp($facility_name); +my $service_files_base_dir="../gen/spool"; +my $service_files_dir="$service_files_base_dir/$facility_name/$service_name"; +my $service_file = "$service_files_dir/$service_name.csv"; + +# propagation destination +my $destination = $ARGV[1]; +chomp($destination); + +# create service lock +my $lock = ScriptLock->new($facility_name . "_" . $service_name . "_" . $destination); +($lock->lock() == 1) or die "Unable to get lock, service propagation was already running."; + +# parse destination +my ($db_machine,$db_port,$db_name) = split(/:/, $destination); + +# load authz +my $configPath = "/etc/perun/services/$service_name/$db_name"; +open FILE, $configPath or die "Could not open config file $configPath: $!"; +while(my $line = <FILE>) { + if($line =~ /^username: .*/) { + $username = ($line =~ m/^username: (.*)$/)[0]; + } elsif($line =~ /^password: .*/) { + $password = ($line =~ m/^password: (.*)$/)[0]; + } +} + +if(!defined($password) || !defined($username) || !defined($tableName)) { + print "Can't get config data from config file.\n"; + exit 14; +} + +#Main Structure +my $dataByUco = {}; + +open FILE, $service_file or die "Could not open $service_file: $!"; +while(my $line = <FILE>) { + my @parts = split /\t/, $line; + $dataByUco->{$parts[0]}->{'LOGIN'} = $parts[1]; + $dataByUco->{$parts[0]}->{'EMAIL'} = $parts[2]; + $dataByUco->{$parts[0]}->{'FIRST_NAME'} = (($parts[3] ne '') ? $parts[3] : undef); + $dataByUco->{$parts[0]}->{'LAST_NAME'} = (($parts[4] ne '') ? $parts[4] : undef); + $dataByUco->{$parts[0]}->{'TITLE_BEFORE'} = (($parts[5] ne '') ? $parts[5] : undef); + $dataByUco->{$parts[0]}->{'TITLE_AFTER'} = (($parts[6] ne '') ? $parts[6] : undef); + $dataByUco->{$parts[0]}->{'BIRTH_NUMBER'} = (($parts[7] ne '') ? $parts[7] : undef); + $dataByUco->{$parts[0]}->{'GENDER'} = (($parts[8] ne '') ? $parts[8] : undef); + $dataByUco->{$parts[0]}->{'PHONE'} = (($parts[9] ne '') ? $parts[9] : undef); + $dataByUco->{$parts[0]}->{'CARD_BARCODE'} = (($parts[10] ne '') ? $parts[10] : undef); + $dataByUco->{$parts[0]}->{'CARD_CHIP_NUMBER'} = (($parts[11] ne '') ? $parts[11] : undef); + $dataByUco->{$parts[0]}->{'STREET'} = (($parts[12] ne '') ? $parts[12] : undef); + $dataByUco->{$parts[0]}->{'HOUSE_NUMBER'} = (($parts[13] ne '') ? $parts[13] : undef); + $dataByUco->{$parts[0]}->{'TOWN'} = (($parts[14] ne '') ? $parts[14] : undef); + $dataByUco->{$parts[0]}->{'POSTAL_CODE'} = (($parts[15] ne '') ? $parts[15] : undef); +} +close FILE; + +my $dbh = DBI->connect("dbi:Pg:dbname=$db_name;host=$db_machine;port=$db_port", $username, $password,{ RaiseError=>1, AutoCommit=>0 }) or die "Connect to database $db_name Error!\n"; + +my $DEBUG=0; +#statistic and information variables +my $inserted = 0; +my $deleted = 0; + +$deleted += $dbh->do("DELETE FROM $tableName"); + +#update and insert new +foreach my $uco (sort keys $dataByUco) { + + my $LOGIN = $dataByUco->{$uco}->{'LOGIN'}; + my $EMAIL = $dataByUco->{$uco}->{'EMAIL'}; + my $TITLE_BEFORE = $dataByUco->{$uco}->{'TITLE_BEFORE'}; + my $FIRST_NAME = $dataByUco->{$uco}->{'FIRST_NAME'}; + my $LAST_NAME = $dataByUco->{$uco}->{'LAST_NAME'}; + my $TITLE_AFTER = $dataByUco->{$uco}->{'TITLE_AFTER'}; + my $PHONE = $dataByUco->{$uco}->{'PHONE'}; + my $BIRTH_NUMBER = $dataByUco->{$uco}->{'BIRTH_NUMBER'}; + my $GENDER = $dataByUco->{$uco}->{'GENDER'}; + my $CARD_BARCODE = $dataByUco->{$uco}->{'CARD_BARCODE'}; + my $CARD_CHIP_NUMBER = $dataByUco->{$uco}->{'CARD_CHIP_NUMBER'}; + my $STREET = $dataByUco->{$uco}->{'STREET'}; + my $HOUSE_NUMBER = $dataByUco->{$uco}->{'HOUSE_NUMBER'}; + my $TOWN = $dataByUco->{$uco}->{'TOWN'}; + my $POSTAL_CODE = $dataByUco->{$uco}->{'POSTAL_CODE'}; + + if($DEBUG == 1) { print "INSERT NEW RECORD: $uco\n"; } + $inserted++; + # we will do insert + my $insertPerson = $dbh->prepare(qq{INSERT INTO $tableName (UCO, LOGIN, EMAIL, TITUL_PRED, JMENO, PRIJMENI, TITUL_ZA, TELEFON, ROD_CISLO, POHLAVI, KARTA_KOD_CIPU, KARTA_KOD_CAROVY, ADR_ULICE, ADR_CP_CO, ADR_MESTO, ADR_PSC, ZMENENO_KDY) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,NOW())}); + $insertPerson->execute($uco, $LOGIN, $EMAIL, $TITLE_BEFORE, $FIRST_NAME, $LAST_NAME, $TITLE_AFTER, $PHONE, $BIRTH_NUMBER, $GENDER, $CARD_CHIP_NUMBER, $CARD_BARCODE, $STREET, $HOUSE_NUMBER, $TOWN, $POSTAL_CODE); + +} + +commit $dbh; +$dbh->disconnect(); + +# print info about operations +print "=======================================\n"; +print "Inserted:\t$inserted\n"; +print "Deleted:\t$deleted (old rows)\n"; +print "=======================================\n"; + +$lock->unlock(); + +exit 0; -- GitLab