3 # sysvshell and bsdshell export
8 use FS::UID qw(adminsuidsetup datasrc);
9 use FS::Record qw(qsearch qsearchs);
12 my @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' );
14 my $user = shift or die &usage;
17 my $spooldir = "/usr/local/etc/freeside/export.". datasrc;
18 #my $spooldir = "/usr/local/etc/freeside/export.". datasrc. "/shell";
20 my @sysv_exports = qsearch('part_export', { 'exporttype' => 'sysvshell' } );
21 my @bsd_exports = qsearch('part_export', { 'exporttype' => 'bsdshell' } );
23 my $rsync = File::Rsync->new({
28 foreach my $export ( @sysv_exports ) {
29 my $machine = $export->machine;
30 my $prefix = "$spooldir/$machine";
31 mkdir $prefix, 0700 unless -d $prefix;
35 ( open(MASTER,">$prefix/master.passwd")
36 #!!! and flock(MASTER,LOCK_EX|LOCK_NB)
37 ) or die "Can't open $prefix/master.passwd: $!";
38 ( open(PASSWD,">$prefix/passwd")
39 #!!! and flock(MASTER,LOCK_EX|LOCK_NB)
40 ) or die "Can't open $prefix/passwd: $!";
42 chmod 0644, "$spooldir/passwd";
43 chmod 0600, "$prefix/master.passwd";
45 #false laziness with freeside-sqlradius-reset and bind.export
47 map { qsearchs('svc_acct', { 'svcnum' => $_->svcnum } ) }
48 map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
49 grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
52 foreach my $svc_acct ( sort { $a->uid <=> $b->uid } @svc_acct ) {
54 my $password = $svc_acct->_password;
56 #if ( ( length($password) <= 8 )
57 if ( ( length($password) <= 12 )
58 && ( $password ne '*' )
59 && ( $password ne '!!' )
60 && ( $password ne '' )
62 $cpassword=crypt($password,
63 $saltset[int(rand(64))].$saltset[int(rand(64))]
71 # FORMAT OF THE PASSWD FILE HERE
72 print PASSWD join(":",
74 'x', # "##". $username,
83 # FORMAT OF FreeBSD MASTER PASSWD FILE HERE
84 print MASTER join(":",
85 $svc_acct->username, # User name
86 $cpassword, # Encrypted password
87 $svc_acct->uid, # User ID
88 $svc_acct->gid, # Group ID
90 "0", # Password Change Time
91 "0", # Password Expiration Time
92 $svc_acct->finger, # Users name
93 $svc_acct->dir, # Users home directory
94 $svc_acct->shell, # shell
99 #!!! flock(MASTER,LOCK_UN);
100 #!!! flock(PASSWD,LOCK_UN);
105 src => "$prefix/passwd",
106 dest => "root\@$machine:/etc/passwd"
107 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
110 src => "$prefix/master.passwd",
111 dest => "root\@$machine:/etc/master.passwd.new"
112 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
113 ssh("root\@$machine", "pwd_mkdb /etc/master.passwd.new");