4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#!/usr/bin/perl
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# Copyright (c) 2006 Sun Microsystems Inc. All Rights Reserved
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# The contents of this file are subject to the terms
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# of the Common Development and Distribution License
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# (the License). You may not use this file except in
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# compliance with the License.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# You can obtain a copy of the License at
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# https://opensso.dev.java.net/public/CDDLv1.0.html or
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# opensso/legal/CDDLv1.0.txt
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# See the License for the specific language governing
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# permission and limitations under the License.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# When distributing Covered Code, include this CDDL
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# Header Notice in each file and include the License file
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# at opensso/legal/CDDLv1.0.txt.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# If applicable, add the following below the CDDL Header,
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# with the fields enclosed by brackets [] replaced by
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# your own identifying information:
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# "Portions Copyrighted [year] [name of copyright owner]"
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# $Id
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# The bulk account federation in OpenSSO is achieved through couple of
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# perl scripts.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# 1. amGenerateNI.pl - This script will generate random name identifiers for
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# each user accounts from a service provider and an identity provider that
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# have one to one mappings in a flat file separated by "|".
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# For e.g. a flat file could like this:
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser1,ou=People,dc=sp,dc=com | uid=idpuser1,ou=People,dc=idp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser2,ou=People,dc=sp,dc=com | uid=idpuser2,ou=People,dc=idp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser3,ou=People,dc=sp,dc=com | uid=idpuser3,ou=People,dc=idp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# After running this script on the above flat file, it would generate two
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# other flat files which contains user id to name identifier mappings.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# For e.g., the output may look like this.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser1,ou=People,dc=sp,dc=com | 1is341jv024lkw3j6pmpr0s82apqxn8a
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser2,ou=People,dc=sp,dc=com | wkh34ldd88n8l54gzs4rftb34bs4837u
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uid=spuser3,ou=People,dc=sp,dc=com | l514znc34u34n34gf65hdg6truqh7f2x2424
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# 2. amGenerateLDIF.pl - This script is useful if the service provider or the
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# identity provider is an OpenSSO. It helps in generating LDAP Vx
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# based LDIF files so that they could easily uploaded to the user entries.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# In this case, it assumes that the entries are userDNs.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# This script will require input parameters as follows.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# amGenerateLDIF.pl <nameidmappingsfile> ServiceProviderID IdentityProviderID
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# ProviderRole
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# Where
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# nameidmappingsfile - a file that has userid/nameid mappings.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# ServiceProviderID - Service ProviderID For e.g. http://www.sp1.com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# IdentityProviderID - Identity ProviderID For e.g. http://www.idp1.com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# ProviderRole - ProviderRole For e.g. IDP or SP.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# After running this script, it generates an LDIF file like this:
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# dn: uid=spuser1,ou=People,dc=sp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# changetype: modify
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info: |http://www.idp1.com|null|null|null|1is341jv024lkw3j6pmpr0s82apqxn8a|http://www.sp1.com|urn:liberty:iff:nameid:federated|IDPRole|Active|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info-key: |http://www.sp1.com|1is341jv024lkw3j6pmpr0s82apqxn8a|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# dn: uid=spuser2,ou=People,dc=sp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# changetype: modify
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info: |http://www.idp1.com|null|null|null|wkh34ldd88n8l54gzs4rftb34bs4837u|http://www.sp1.com|urn:liberty:iff:nameid:federated|IDPRole|Active|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info-key: |http://www.sp1.com|wkh34ldd88n8l54gzs4rftb34bs4837u|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# dn: uid=spuser3,ou=People,dc=sp,dc=com
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# changetype: modify
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info: |http://www.idp1.com|null|null|null|l514znc34u34n34gf65hdg6truqh7f2x2424|http://www.sp1.com|urn:liberty:iff:nameid:federated|IDPRole|Active|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# iplanet-am-user-federation-info-key: |http://www.sp1.com|l514znc34u34n34gf65hdg6truqh7f2x2424|
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# The generated LDIF file could be loaded into the user repository using
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# ldapmodify as follows.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# ldapmodify -D "cn=Directory Manager" -w 11111111 -h www.sp1.com -p 389
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# -f generatedfile.ldif
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster#
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# This function generates an alphanumeric sequence of random identifiers. The
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# uniqueness can be extended by modifying the random seed.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostersub generateRandom() {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $length = 30;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = "";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster for ($i=0; $i < $length; $i++)
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $value = int rand 36 ;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster if($value eq '0') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '1') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '2') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '3') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value =~ '4') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '5') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '6') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '7') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '8') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '9') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . $value;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '10') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "a";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '11') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "b";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '12') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "c";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '13') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "d";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '14') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "e";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '15') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "f";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '16') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "g";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '17') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "h";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '18') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "i";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '19') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "k";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '20') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "j";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '21') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "l";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '22') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "m";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '23') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "n";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '24') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "o";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '25') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "p";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '26') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "q";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '27') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "r";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '28') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "s";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '29') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "t";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '30') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "u";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '31') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "v";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '32') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "w";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '33') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "x";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '34') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "y";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster } elsif($value eq '35') {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $rndstr = $rndstr . "z";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster }
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster }
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster return $rndstr;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster}
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# Main function starts here. This script expects a users data file which
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# could possibly contain user ids or common attributes with "|" separated
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# entries. After execution of this script, it will generate two files with
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# spnameidentifiers.txt and idpnameidentifiers.txt data files with a generated
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster# unique identifier along with their userid/common attributes.
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Fostersub Main {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster my $fileName = $ARGV[0];
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster open(USERFH, $fileName) || die("Could not open file!");
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster @allusers=<USERFH>;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster close(USERFH);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster unlink 'spnameidentifiers.txt', 'idpnameidentifiers.txt';
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster open (PH1, ">>spnameidentifiers.txt");
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH1 "# This is a generated file. Modify at your risk!";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH1 "\n";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster open(PH2, ">>idpnameidentifiers.txt");
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH2 "# This is a generated file. Modify at your risk!";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH2 "\n";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster foreach $line (@allusers) {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster chomp ($line);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster if(!($line =~ /^#/) && !($line =~ /^$/)) {
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster ($firstuser, $seconduser)=split(/\|/, $line);
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $firstuser=~ s/(^ *)||( *$)//g;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $seconduser=~ s/(^ *)||( *$)//g;
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster $random=generateRandom();
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH1 "$firstuser | $random";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH1 "\n";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH2 "$seconduser | $random";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster print PH2 "\n";
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster }
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster }
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster}
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan Foster
4fe4e4f798a84a46e567f64ceadd3648eb0582d4Allan FosterMain;