RT# 29974 - Added ability to show invoice_pay_by_message on total new charges line...
[freeside.git] / bin / passwd.import
1 #!/usr/bin/perl -Tw
2
3 use strict;
4 use vars qw(%part_svc);
5 use Date::Parse;
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_ passwd file, for example
36 "mail.isp.com:/etc/passwd" or "nis.isp.com:/etc/global/passwd"
37 END
38 my($loc_passwd)=&getvalue(":");
39 iscp("root\@$loc_passwd", "$spooldir/passwd.import");
40
41 print "\n\n", <<END;
42 Enter the location and name of your _user_ shadow file, for example
43 "mail.isp.com:/etc/shadow" or "bsd.isp.com:/etc/master.passwd"
44 END
45 my($loc_shadow)=&getvalue(":");
46 iscp("root\@$loc_shadow", "$spooldir/shadow.import");
47
48 sub menu_svc {
49   ( join "\n", map "$_: ".$part_svc{$_}->svc, sort keys %part_svc ). "\n";
50 }
51 sub getpart {
52   $^W=0; # Term::Query isn't -w-safe
53   my $return = query "Enter part number:", 'irk', [ keys %part_svc ];
54   $^W=1;
55   $return;
56 }
57 sub getvalue {
58   my $prompt = shift;
59   $^W=0; # Term::Query isn't -w-safe
60   my $return = query $prompt, '';
61   $^W=1;
62   $return;
63 }
64
65 print "\n\n";
66
67 ###
68
69 open(PASSWD,"<$spooldir/passwd.import");
70 open(SHADOW,"<$spooldir/shadow.import");
71
72 my(%password);
73 while (<SHADOW>) {
74   chop;
75   my($username,$password)=split(/:/);
76   #$password =~ s/^\!$/\*/;
77   #$password =~ s/\!+/\*SUSPENDED\* /;
78   $password =~ s/^NP$/\*/;
79   $password =~ s/^\*LK\*$/\*/;
80   $password{$username}=$password;
81 }
82
83 while (<PASSWD>) {
84   chop;
85   my($username,$x,$uid,$gid,$finger,$dir,$shell) = split(/:/);
86   my $password = $password{$username};
87
88   my $svcpart = $shell_svcpart;
89
90   #if ( qsearchs('svc_acct', { 'username' => $username } ) ) {
91   #  warn "warning: $username already exists; skipping\n";
92   #  next;
93   #}
94
95   my($svc_acct) = new FS::svc_acct ({
96     'svcpart'   => $svcpart,
97     'username'  => $username,
98     '_password' => $password,
99     'uid'       => $uid,
100     'gid'       => $gid,
101     'finger'    => $finger,
102     'dir'       => $dir,
103     'shell'     => $shell,
104     #%{$allparam{$username}},
105   });
106   my($error);
107   $error=$svc_acct->insert;
108   if ( $error ) {
109     if ( $error =~ /duplicate/i ) {
110       warn "$username: $error";
111     } else {
112       die "$username: $error";
113     }
114   }
115
116 }
117
118 sub usage {
119   die "Usage:\n\n  passwd.import user\n";
120 }
121