From: Chris Sharp Date: Thu, 30 Apr 2020 17:35:09 +0000 (-0400) Subject: adding SIP account creation tool X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=ee671b93c5563c527d88f316d0a872a33bed484d;p=contrib%2Fpines.git adding SIP account creation tool --- diff --git a/sip/create_sip_accounts.pl b/sip/create_sip_accounts.pl new file mode 100755 index 0000000..216d67c --- /dev/null +++ b/sip/create_sip_accounts.pl @@ -0,0 +1,210 @@ +#!/usr/bin/perl + +use warnings; +use strict; +use Text::CSV qw/ csv /; +use DBI; + +# take a SIP2 account username and an org_unit shortname and generate +# a four-digit PIN, insert the user and address, then generate copy- +# and-pastable XML to add to the oils_sip.xml file. + +sub usage { + print "$0 \nOR: $0 \n"; + exit; +} + +my ($username, $org_unit, $file); +my $arg_count = @ARGV; + +if ( $arg_count == 2 ) { + # assume we're adding a single account + ($username, $org_unit) = @ARGV; +} else { + $file = $ARGV[0]; +} + + +unless (($username && $org_unit) || $file) { + usage; +} + +# set up the DB connection +my $dbh = DBI->connect +( + "dbi:Pg:service=evergreen", + undef, + undef, + { + AutoCommit => 0, + RaiseError => 1, + PrintError => 0 + } +) or die DBI->errstr; + +# check that we don't already have a user with this barcode/usrname +my $barcode_check_sql = qq( +select 1 +from actor.card +where barcode = ? +); + +my $username_check_sql = qq( +select 1 +from actor.usr +where usrname = ? +); + +my $org_unit_sql = qq( +select ou.id, + addr.street1, + addr.street2, + addr.city, + addr.county, + addr.state, + addr.country, + addr.post_code +from actor.org_unit ou +join actor.org_address addr on (ou.mailing_address = addr.id) +where ou.shortname = ? +); + +my $insert_user_sql = qq( +insert into actor.usr ( + profile, + usrname, + passwd, + ident_type, + ident_value, + first_given_name, + family_name, + home_ou, + dob +) values ( + 36, + ?, + ?, + 3, + 'na', + ?, + 'SIP', + ?, + '1970-01-01' +)); + +my $insert_address_sql = qq( +insert into actor.usr_address ( + usr, + street1, + street2, + city, + county, + state, + country, + post_code +) values ( + (select id from actor.usr where usrname = ?), + ?, + ?, + ?, + ?, + ?, + 'USA', + ? +)); + +my $link_addr_sql = qq( +update actor.usr +set mailing_address = ( + select id + from actor.usr_address + where usr in ( + select id + from actor.usr + where usrname = ? + ) +) +where usrname = ? +); + +my $insert_card_sql = qq( +insert into actor.card ( + usr, + barcode +) values( + (select id from actor.usr where usrname = ?), + ? +)); + +my $link_card_sql = qq( +update actor.usr +set card = ( + select id + from actor.card + where barcode = ? +) +where usrname = ? +and not deleted +); + +sub generate_password { + my @nums = map { int(rand(10)) } (1..4); + my $pin = join( "", @nums); + return $pin; +} + +my $sip_accounts = csv (in => "$file"); +my @completed_accounts; +foreach my $sip_acct (@$sip_accounts) { + my $username = @$sip_acct[0]; + my $org_unit = @$sip_acct[1]; + my $barcode = $username; + my $password = generate_password(); + # check that we don't already have a user with this username or barcode + my $sth = $dbh->prepare($barcode_check_sql); + $sth->execute($barcode); + my @barcode_check = $sth->fetchrow_array; + my $already_have_barcode = $barcode_check[0]; + $sth = $dbh->prepare($username_check_sql); + $sth->execute($username); + my @username_check = $sth->fetchrow_array; + my $already_have_username = $username_check[0]; + unless ($already_have_username || $already_have_barcode) { + # gather the rest of the data we need + $sth = $dbh->prepare($org_unit_sql); + $sth->execute($org_unit); + my @address_data = $sth->fetchrow_array; + my $ou_id = $address_data[0]; + my $street1 = $address_data[1]; + my $street2 = $address_data[2]; + my $city = $address_data[3]; + my $county = $address_data[4]; + my $state = $address_data[5]; + my $country = $address_data[6]; + my $post_code = $address_data[7]; + my $first_name = $username; + # do the import + $sth = $dbh->prepare($insert_user_sql); + $sth->execute($username, $password, $first_name, $ou_id); + $sth = $dbh->prepare($insert_address_sql); + $sth->execute($username, $street1, $street2, $city, $county, $state, $post_code); + $sth = $dbh->prepare($link_addr_sql); + $sth->execute($username, $username); + $sth = $dbh->prepare($insert_card_sql); + $sth->execute($username, $barcode); + $sth = $dbh->prepare($link_card_sql); + $sth->execute($barcode, $username); + $dbh->commit; + $sth->finish; + my @credentials = ($org_unit, $username, $password); + my $credentials_ref = \@credentials; + push @completed_accounts, $credentials_ref; + } +} + +$dbh->disconnect(); + +foreach my $account (@completed_accounts) { + print qq(\t\t\n\t\t\n); +} +