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