2015-10-18 15:20:08 +00:00
#!/usr/bin/perl
2016-09-18 08:22:33 +00:00
# TODO:
# - when a group is deleted, it changes type inside the database:
# from "group" it becomes "group-deleted".
# We still need to manage this, as we can't add a group with the same name
# of a removed group.
# - It looks like the above problem is present for users also. The error is:
# Attempt to create account 'XXXXXXXX' which already exists in passwd at /usr/share/perl5/vendor_perl/esmith/AccountsDB.pm line 493, <FH> line XXXXXXXX.
2015-10-18 15:20:08 +00:00
use strict ;
2016-03-30 23:17:24 +00:00
use Getopt::Long ;
2015-10-18 15:20:08 +00:00
use esmith::AccountsDB ;
use esmith::event ;
use File::Temp qw( tempfile ) ;
2016-03-30 23:17:24 +00:00
my $ file ;
my $ separator = "\t" ;
my $ add_existing_users_to_groups ;
2016-09-18 08:05:58 +00:00
my $ remove_users ;
my $ record ;
2016-03-30 23:17:24 +00:00
my $ user_already_exists ;
my $ displayHelp ;
2015-10-18 15:20:08 +00:00
my $ accountsDb = esmith::AccountsDB - > open ( ) || die ( "Could not open accounts DB" ) ;
2016-03-30 23:17:24 +00:00
GetOptions (
"file=s" = > \ $ file ,
"separator=s" = > \ $ separator ,
"add_existing_users_to_groups" = > \ $ add_existing_users_to_groups ,
2016-09-18 08:05:58 +00:00
"remove_users" = > \ $ remove_users ,
2016-03-30 23:17:24 +00:00
"help" = > \ $ displayHelp
) or displayHelp ( ) ;
if ( $ displayHelp ) {
displayHelp ( ) ;
}
if ( $ file ) {
2015-10-18 15:20:08 +00:00
open ( FH , "<" , $ file ) or die ;
} else {
open ( FH , "-" ) ;
}
while ( <FH> ) {
# Remove trailing whitespace:
chomp $ _ ;
$ _ =~ s/\s+$// ;
2016-03-30 21:19:15 +00:00
my ( $ username , $ firstName , $ lastName , $ password , @ groups ) = split ( /$separator/ , $ _ ) ;
2015-10-18 15:20:08 +00:00
if ( ! $ username ) {
next ;
}
2016-09-18 08:05:58 +00:00
if ( ! $ firstName && ! $ remove_users ) {
2015-10-18 15:20:08 +00:00
warn "[WARNING] Account `$username` is missing FirstName column: skipped.\n" ;
next ;
}
2016-09-18 08:05:58 +00:00
if ( ! $ lastName && ! $ remove_users ) {
2015-10-18 15:20:08 +00:00
warn "[WARNING] Account `$username` is missing LastName column: skipped.\n" ;
next ;
}
2016-03-30 23:17:24 +00:00
$ user_already_exists = 0 ;
2016-09-18 08:05:58 +00:00
$ record = $ accountsDb - > get ( $ username ) ;
if ( $ record ) {
if ( $ remove_users ) {
$ record - > delete ;
warn "[INFO] deleted $username\n" ;
next ;
2016-03-30 23:17:24 +00:00
} else {
2016-09-18 08:05:58 +00:00
if ( ! $ add_existing_users_to_groups ) {
warn "[WARNING] Account `$username` already registered: skipped.\n" ;
next ;
} else {
$ user_already_exists = 1 ;
}
2016-03-30 23:17:24 +00:00
}
2015-10-18 15:20:08 +00:00
}
2016-09-18 08:05:58 +00:00
if ( $ remove_users ) {
next ;
}
GRP: foreach my $ group ( @ groups ) {
next GRP if $ group =~ /^-/ ;
2016-03-30 21:19:15 +00:00
if ( ! $ accountsDb - > get ( $ group ) ) {
my $ groupRecord = $ accountsDb - > new_record ( $ group , {
'type' = > 'group'
} ) ;
warn "[INFO] created group $group.\n" ;
}
2015-10-18 15:20:08 +00:00
}
2016-03-30 23:17:24 +00:00
if ( ! $ user_already_exists ) {
2015-10-18 15:20:08 +00:00
2016-03-30 23:17:24 +00:00
my $ record = $ accountsDb - > new_record ( $ username , {
'type' = > 'user' ,
'FirstName' = > $ firstName ,
'LastName' = > $ lastName ,
'Samba' = > 'enabled'
} ) ;
if ( ! $ record ) {
warn "[ERROR] Account `$username` record creation failed.\n" ;
next ;
}
if ( ! esmith::event:: event_signal ( 'user-create' , $ username ) ) {
warn "[ERROR] Account `$username` user-create event failed.\n" ;
next ;
}
if ( $ password ) {
my ( $ pfh , $ pfilename ) = tempfile ( 'import_users_XXXXX' , UNLINK = > 0 , DIR = > '/tmp' ) ;
print $ pfh $ password ;
close ( $ pfh ) ;
if ( ! esmith::event:: event_signal ( 'password-modify' , $ username , $ pfilename ) ) {
warn "[ERROR] Account `$username` user-create event failed.\n" ;
next ;
}
unlink $ pfilename ;
}
2015-10-18 15:20:08 +00:00
}
2016-03-30 21:19:15 +00:00
foreach my $ group ( @ groups ) {
2016-09-18 08:05:58 +00:00
if ( $ group =~ m/^\-/ ) {
$ group =~ s/^\-// ;
$ accountsDb - > remove_user_from_groups ( $ username , $ group ) ;
warn "[INFO] $username removed from group $group\n" ;
} else {
$ accountsDb - > add_user_to_groups ( $ username , $ group ) ;
warn "[INFO] $username added to group $group\n" ;
}
2016-03-30 21:19:15 +00:00
}
2015-10-18 15:20:08 +00:00
warn "[INFO] imported $username\n" ;
}
2016-03-30 23:17:24 +00:00
sub displayHelp {
2016-09-18 08:05:58 +00:00
die ( "Usage: $0 [--file INPUTFILE] [--separator SEPARATOR] [--add_existing_users_to_groups] [--remove_users]\n" ) ;
2016-03-30 23:17:24 +00:00
}