adding shadow.reimport
[freeside.git] / bin / shadow.reimport
1 #!/usr/bin/perl -Tw
2 # $Id: shadow.reimport,v 1.1 2004-02-03 00:19:45 ivan Exp $
3
4 use strict;
5 use vars qw(%part_svc);
6 use Term::Query qw(query);
7 use Net::SCP qw(iscp);
8 use FS::UID qw(adminsuidsetup datasrc);
9 use FS::Record qw(qsearch qsearchs);
10 use FS::svc_acct;
11 use FS::part_svc;
12
13 my $user = shift or die &usage;
14 adminsuidsetup $user;
15
16 push @FS::svc_acct::shells, qw(/bin/sync /sbin/shutdown /bin/halt /sbin/halt); #others?
17
18 my($spooldir)="/usr/local/etc/freeside/export.". datasrc;
19
20 #$FS::svc_acct::nossh_hack = 1;
21 $FS::svc_Common::noexport_hack = 1;
22
23 ###
24
25 %part_svc=map { $_->svcpart, $_ } qsearch('part_svc',{'svcdb'=>'svc_acct'});
26
27 die "No services with svcdb svc_acct!\n" unless %part_svc;
28
29 print "\n\n", &menu_svc, "\n", <<END;
30 Enter part number to import.
31 END
32 my($shell_svcpart)=&getpart;
33
34 print "\n\n", <<END;
35 Enter the location and name of your _user_ shadow file, for example
36 "mail.isp.com:/etc/shadow" or "bsd.isp.com:/etc/master.passwd"
37 END
38 my($loc_shadow)=&getvalue(":");
39 iscp("root\@$loc_shadow", "$spooldir/shadow.import");
40
41 sub menu_svc {
42   ( join "\n", map "$_: ".$part_svc{$_}->svc, sort keys %part_svc ). "\n";
43 }
44 sub getpart {
45   $^W=0; # Term::Query isn't -w-safe
46   my $return = query "Enter part number:", 'irk', [ keys %part_svc ];
47   $^W=1;
48   $return;
49 }
50 sub getvalue {
51   my $prompt = shift;
52   $^W=0; # Term::Query isn't -w-safe
53   my $return = query $prompt, '';
54   $^W=1;
55   $return;
56 }
57
58 print "\n\n";
59
60 ###
61
62 open(SHADOW,"<$spooldir/shadow.import");
63
64 my($line, $updated);
65 while (<SHADOW>) {
66   $line++;
67   chop;
68   my($username,$password)=split(/:/);
69
70   my @svc_acct = grep { $_->cust_svc->svcpart == $shell_svcpart } 
71                  qsearch('svc_acct', { 'username' => $username } );
72
73   next unless @svc_acct;
74
75   if ( scalar(@svc_acct) > 1 ) {
76     warn "more than one $username found!\n";
77     next;
78   }
79
80   my $svc_acct = shift @svc_acct;
81
82   next if $svc_acct->_password eq $password;
83
84   my $new_svc_acct = new FS::svc_acct( { $svc_acct->hash } );
85   $new_svc_acct->_password($password);
86   #my $error = $new_svc_acct->replace($svc_acct);
87   #die "$username: $error" if $error;
88
89   $updated++;
90
91 }
92
93 warn "$updated of $line passwords changed\n";
94
95 sub usage {
96   die "Usage:\n\n  shadow.reimport user\n";
97 }
98