diff options
Diffstat (limited to 'bin/passwd.import')
| -rwxr-xr-x | bin/passwd.import | 121 | 
1 files changed, 121 insertions, 0 deletions
| diff --git a/bin/passwd.import b/bin/passwd.import new file mode 100755 index 000000000..8ab9e2ae3 --- /dev/null +++ b/bin/passwd.import @@ -0,0 +1,121 @@ +#!/usr/bin/perl -Tw + +use strict; +use vars qw(%part_svc); +use Date::Parse; +use Term::Query qw(query); +use Net::SCP qw(iscp); +use FS::UID qw(adminsuidsetup datasrc); +use FS::Record qw(qsearch qsearchs); +use FS::svc_acct; +use FS::part_svc; + +my $user = shift or die &usage; +adminsuidsetup $user; + +push @FS::svc_acct::shells, qw(/bin/sync /sbin/shutdown /bin/halt /sbin/halt); #others? + +my($spooldir)="/usr/local/etc/freeside/export.". datasrc; + +#$FS::svc_acct::nossh_hack = 1; +$FS::svc_Common::noexport_hack = 1; + +### + +%part_svc=map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_acct'}); + +die "No services with svcdb svc_acct!\n" unless %part_svc; + +print "\n\n", &menu_svc, "\n", <<END; +Enter part number to import. +END +my($shell_svcpart)=&getpart; + +print "\n\n", <<END; +Enter the location and name of your _user_ passwd file, for example +"mail.isp.com:/etc/passwd" or "nis.isp.com:/etc/global/passwd" +END +my($loc_passwd)=&getvalue(":"); +iscp("root\@$loc_passwd", "$spooldir/passwd.import"); + +print "\n\n", <<END; +Enter the location and name of your _user_ shadow file, for example +"mail.isp.com:/etc/shadow" or "bsd.isp.com:/etc/master.passwd" +END +my($loc_shadow)=&getvalue(":"); +iscp("root\@$loc_shadow", "$spooldir/shadow.import"); + +sub menu_svc { +  ( join "\n", map "$_: ".$part_svc{$_}->svc, sort keys %part_svc ). "\n"; +} +sub getpart { +  $^W=0; # Term::Query isn't -w-safe +  my $return = query "Enter part number:", 'irk', [ keys %part_svc ]; +  $^W=1; +  $return; +} +sub getvalue { +  my $prompt = shift; +  $^W=0; # Term::Query isn't -w-safe +  my $return = query $prompt, ''; +  $^W=1; +  $return; +} + +print "\n\n"; + +### + +open(PASSWD,"<$spooldir/passwd.import"); +open(SHADOW,"<$spooldir/shadow.import"); + +my(%password); +while (<SHADOW>) { +  chop; +  my($username,$password)=split(/:/); +  #$password =~ s/^\!$/\*/; +  #$password =~ s/\!+/\*SUSPENDED\* /; +  $password =~ s/^NP$/\*/; +  $password =~ s/^\*LK\*$/\*/; +  $password{$username}=$password; +} + +while (<PASSWD>) { +  chop; +  my($username,$x,$uid,$gid,$finger,$dir,$shell) = split(/:/); +  my $password = $password{$username}; + +  my $svcpart = $shell_svcpart; + +  #if ( qsearchs('svc_acct', { 'username' => $username } ) ) { +  #  warn "warning: $username already exists; skipping\n"; +  #  next; +  #} + +  my($svc_acct) = new FS::svc_acct ({ +    'svcpart'   => $svcpart, +    'username'  => $username, +    '_password' => $password, +    'uid'       => $uid, +    'gid'       => $gid, +    'finger'    => $finger, +    'dir'       => $dir, +    'shell'     => $shell, +    #%{$allparam{$username}}, +  }); +  my($error); +  $error=$svc_acct->insert; +  if ( $error ) { +    if ( $error =~ /duplicate/i ) { +      warn "$username: $error"; +    } else { +      die "$username: $error"; +    } +  } + +} + +sub usage { +  die "Usage:\n\n  passwd.import user\n"; +} + | 
