155 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			155 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/perl 
							 | 
						||
| 
								 | 
							
								# (C) 2007 Michael Weinberger
							 | 
						||
| 
								 | 
							
								# See http://wiki.contribs.org/Dirty_Tools for full documentation
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use Getopt::Long;
							 | 
						||
| 
								 | 
							
								my %opts;
							 | 
						||
| 
								 | 
							
								my $getRes = GetOptions( 
							 | 
						||
| 
								 | 
							
									"dry-run"=>\$opts{'dry-run'},
							 | 
						||
| 
								 | 
							
									"ibays"=>\$opts{'ibays'},
							 | 
						||
| 
								 | 
							
									"all"=>\$opts{'all'},
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if( ($opts{'all'} and not $ARGV[0]) or (not $opts{'all'} and not $ARGV[1]) )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									die "Usage: dt-passwords-sync [--dry-run] [--ibays] [--all] SOURESERVER [ACCOUNT]\n" 
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								$server=$ARGV[0];
							 | 
						||
| 
								 | 
							
								$dryrun= $opts{'dry-run'};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if( $opts{'all'} )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									$type=$opts{'ibays'} ? "ibay" : "user";
							 | 
						||
| 
								 | 
							
									$u=`/sbin/e-smith/db accounts show|grep '=$type\$'|/bin/sed 's/=.*//'`;
							 | 
						||
| 
								 | 
							
									chomp($u);
							 | 
						||
| 
								 | 
							
									@users=split( /\n/, $u );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								else
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									@users=($ARGV[1]);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# shadow
							 | 
						||
| 
								 | 
							
								$res = `ssh $server /bin/cat /etc/shadow`;
							 | 
						||
| 
								 | 
							
								@shadow=split(/\n/, $res );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# smbpasswd
							 | 
						||
| 
								 | 
							
								if( not $opts{'ibays'} )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									$res = `ssh $server /bin/cat /etc/samba/smbpasswd`;
							 | 
						||
| 
								 | 
							
									@smbpasswd=split(/\n/, $res );
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								for( $i=0; $i<@users; $i++ )
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
									$done=0;
							 | 
						||
| 
								 | 
							
									$account=$users[$i];
							 | 
						||
| 
								 | 
							
									printf '%-10s: %s', $account, $dryrun ? "(dryrun) " : "";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									# shadow
							 | 
						||
| 
								 | 
							
									@u= grep( /^$account:/, @shadow);
							 | 
						||
| 
								 | 
							
									$res=$u[0];
							 | 
						||
| 
								 | 
							
									chomp($res);
							 | 
						||
| 
								 | 
							
									if( not $res )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										print "does not exist.\n";
							 | 
						||
| 
								 | 
							
										next;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									@pe = split( /:/, $res );
							 | 
						||
| 
								 | 
							
									$upw=$pe[1];
							 | 
						||
| 
								 | 
							
									$pwset = $upw =~ /^\!\!/ ? 0 : 1;
							 | 
						||
| 
								 | 
							
									open( IN, "/etc/shadow" );
							 | 
						||
| 
								 | 
							
									open( OUT, ">/etc/shadow.pwsync" );
							 | 
						||
| 
								 | 
							
									while( <IN> )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										chomp($_);
							 | 
						||
| 
								 | 
							
										@e=split( /:/, $_ );
							 | 
						||
| 
								 | 
							
										if( $e[0] eq $account and $e[1] ne $upw)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
											print "shadow synced. ";
							 | 
						||
| 
								 | 
							
											$e[1]=$upw;
							 | 
						||
| 
								 | 
							
											for( $k=0; $k<9; $k++ )
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
												print OUT ':' if $k>0;
							 | 
						||
| 
								 | 
							
												print OUT $e[$k];
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											print OUT "\n";
							 | 
						||
| 
								 | 
							
											$done=1;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
											print OUT "$_\n";;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									close( OUT );
							 | 
						||
| 
								 | 
							
									close( IN );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if( not $opts{'ibays'} )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										# smbpasswd
							 | 
						||
| 
								 | 
							
										@u= grep( /^$account:/, @smbpasswd);
							 | 
						||
| 
								 | 
							
										$res=$u[0];
							 | 
						||
| 
								 | 
							
										chomp($res);
							 | 
						||
| 
								 | 
							
										@pe = split( /:/, $res );
							 | 
						||
| 
								 | 
							
										$lanman_hash=$pe[2];
							 | 
						||
| 
								 | 
							
										$nt_hash=$pe[3];
							 | 
						||
| 
								 | 
							
										$flags=$pe[4];
							 | 
						||
| 
								 | 
							
										$lct=$pe[5];
							 | 
						||
| 
								 | 
							
										$smb_pwset = $flags =~ /D/ ? 0 : 1;
							 | 
						||
| 
								 | 
							
										open( IN, "/etc/samba/smbpasswd" );
							 | 
						||
| 
								 | 
							
										open( OUT, ">/etc/samba/smbpasswd.pwsync" );
							 | 
						||
| 
								 | 
							
										while( <IN> )
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
											chomp($_);
							 | 
						||
| 
								 | 
							
											@e=split( /:/, $_ );
							 | 
						||
| 
								 | 
							
											if( $e[0] eq $account and ( $e[2] ne $lanman_hash or $e[3] ne $nt_hash or $flags ne $e[4] or $lct ne $e[5] ) )
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
												print "smbpasswd synced. ";
							 | 
						||
| 
								 | 
							
												$e[2]=$lanman_hash;
							 | 
						||
| 
								 | 
							
												$e[3]=$nt_hash;
							 | 
						||
| 
								 | 
							
												$e[4]=$flags;
							 | 
						||
| 
								 | 
							
												$e[5]=$lct;
							 | 
						||
| 
								 | 
							
												for( $k=0; $k<7; $k++ )
							 | 
						||
| 
								 | 
							
													{
							 | 
						||
| 
								 | 
							
													print OUT ':' if $k>0;
							 | 
						||
| 
								 | 
							
													print OUT $e[$k];
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
												print OUT "\n";
							 | 
						||
| 
								 | 
							
												$done=1;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											else
							 | 
						||
| 
								 | 
							
												{
							 | 
						||
| 
								 | 
							
												print OUT "$_\n";;
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										close( OUT );
							 | 
						||
| 
								 | 
							
										close( IN );
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if( not $dryrun )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										if( not $opts{'ibays'} )
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
											system( "/bin/chmod --reference /etc/samba/smbpasswd /etc/samba/smbpasswd.pwsync" );
							 | 
						||
| 
								 | 
							
											system( "/bin/chown --reference /etc/samba/smbpasswd /etc/samba/smbpasswd.pwsync" );
							 | 
						||
| 
								 | 
							
											system( "/bin/mv -f /etc/samba/smbpasswd.pwsync /etc/samba/smbpasswd" );
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										system( "/bin/chmod --reference /etc/shadow /etc/shadow.pwsync" );
							 | 
						||
| 
								 | 
							
										system( "/bin/chown --reference /etc/shadow /etc/shadow.pwsync" );
							 | 
						||
| 
								 | 
							
										system( "/bin/mv -f /etc/shadow.pwsync /etc/shadow" );
							 | 
						||
| 
								 | 
							
										system( "/sbin/e-smith/db accounts setprop $account PasswordSet " . ( ($pwset and ($smb_pwset or $opts{'ibays'})) ? 'yes' : 'no' ));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									if( $done )
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										print "ok.";
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
										print "nothing to be done.";
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									print "\n";
							 | 
						||
| 
								 | 
							
									}
							 |