8 use FS::UID qw(adminsuidsetup datasrc);
9 use FS::Record qw(qsearch qsearchs);
14 my @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
16 my $user = shift or die &usage;
19 my $spooldir = "/usr/local/etc/freeside/export.". datasrc;
20 #my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/shell";
22 my @bsd_exports = qsearch('part_export', { 'exporttype' => 'bsdshell' } );
24 my $rsync = File::Rsync->new({
29 foreach my $export ( @bsd_exports ) {
30 my $machine = $export->machine;
31 my $prefix = "$spooldir/$machine";
32 mkdir $prefix, 0700 unless -d $prefix;
36 ( open(MASTER,">$prefix/master.passwd")
37 #!!! and flock(MASTER,LOCK_EX|LOCK_NB)
38 ) or die "Can't open $prefix/master.passwd: $!";
39 ( open(PASSWD,">$prefix/passwd")
40 #!!! and flock(PASSWD,LOCK_EX|LOCK_NB)
41 ) or die "Can't open $prefix/passwd: $!";
43 chmod 0644, "$prefix/passwd";
44 chmod 0600, "$prefix/master.passwd";
46 #false laziness with freeside-sqlradius-reset and bind.export
48 map { qsearchs('svc_acct', { 'svcnum' => $_->svcnum } ) }
49 map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
50 grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
53 next unless @svc_acct;
55 foreach my $svc_acct ( sort { $a->uid <=> $b->uid } @svc_acct ) {
57 my $password = $svc_acct->_password;
59 #if ( ( length($password) <= 8 )
60 if ( ( length($password) <= 12 )
61 && ( $password ne '*' )
62 && ( $password ne '!!' )
63 && ( $password ne '' )
65 $cpassword=crypt($password,
66 $saltset[int(rand(64))].$saltset[int(rand(64))]
74 # FORMAT OF THE PASSWD FILE HERE
75 print PASSWD join(":",
77 'x', # "##". $username,
86 # FORMAT OF FreeBSD MASTER PASSWD FILE HERE
87 print MASTER join(":",
88 $svc_acct->username, # User name
89 $cpassword, # Encrypted password
90 $svc_acct->uid, # User ID
91 $svc_acct->gid, # Group ID
93 "0", # Password Change Time
94 "0", # Password Expiration Time
95 $svc_acct->finger, # Users name
96 $svc_acct->dir, # Users home directory
97 $svc_acct->shell, # shell
102 #!!! flock(MASTER,LOCK_UN);
103 #!!! flock(PASSWD,LOCK_UN);
108 src => "$prefix/passwd",
109 dest => "root\@$machine:/etc/passwd"
110 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
113 src => "$prefix/master.passwd",
114 dest => "root\@$machine:/etc/master.passwd.new"
115 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
116 ssh("root\@$machine", "pwd_mkdb /etc/master.passwd.new");