3 # sysvshell and bsdshell export
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 @sysv_exports = qsearch('part_export', { 'exporttype' => 'sysvshell' } );
23 my @bsd_exports = qsearch('part_export', { 'exporttype' => 'bsdshell' } );
25 my $rsync = File::Rsync->new({
30 foreach my $export ( @sysv_exports ) {
33 foreach my $export ( @bsd_exports ) {
34 my $machine = $export->machine;
35 my $prefix = "$spooldir/$machine";
36 mkdir $prefix, 0700 unless -d $prefix;
40 ( open(MASTER,">$prefix/master.passwd")
41 #!!! and flock(MASTER,LOCK_EX|LOCK_NB)
42 ) or die "Can't open $prefix/master.passwd: $!";
43 ( open(PASSWD,">$prefix/passwd")
44 #!!! and flock(MASTER,LOCK_EX|LOCK_NB)
45 ) or die "Can't open $prefix/passwd: $!";
47 chmod 0644, "$spooldir/passwd";
48 chmod 0600, "$prefix/master.passwd";
50 #false laziness with freeside-sqlradius-reset and bind.export
52 map { qsearchs('svc_acct', { 'svcnum' => $_->svcnum } ) }
53 map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
54 grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
57 next unless @svc_acct;
59 foreach my $svc_acct ( sort { $a->uid <=> $b->uid } @svc_acct ) {
61 my $password = $svc_acct->_password;
63 #if ( ( length($password) <= 8 )
64 if ( ( length($password) <= 12 )
65 && ( $password ne '*' )
66 && ( $password ne '!!' )
67 && ( $password ne '' )
69 $cpassword=crypt($password,
70 $saltset[int(rand(64))].$saltset[int(rand(64))]
78 # FORMAT OF THE PASSWD FILE HERE
79 print PASSWD join(":",
81 'x', # "##". $username,
90 # FORMAT OF FreeBSD MASTER PASSWD FILE HERE
91 print MASTER join(":",
92 $svc_acct->username, # User name
93 $cpassword, # Encrypted password
94 $svc_acct->uid, # User ID
95 $svc_acct->gid, # Group ID
97 "0", # Password Change Time
98 "0", # Password Expiration Time
99 $svc_acct->finger, # Users name
100 $svc_acct->dir, # Users home directory
101 $svc_acct->shell, # shell
106 #!!! flock(MASTER,LOCK_UN);
107 #!!! flock(PASSWD,LOCK_UN);
112 src => "$prefix/passwd",
113 dest => "root\@$machine:/etc/passwd"
114 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
117 src => "$prefix/master.passwd",
118 dest => "root\@$machine:/etc/master.passwd.new"
119 } ) or die "rsync to $machine failed: ". join(" / ", $rsync->err);
120 ssh("root\@$machine", "pwd_mkdb /etc/master.passwd.new");