#!/usr/bin/perl
# username is passed as 1st arg, passwd as 2nd

use Crypt::PasswdMD5;

$user = $ARGV[0];
$password = $ARGV[1];
$salt = "";

open URAND, "</dev/urandom";
binmode URAND;
for($i=0;$i<8;$i++) {
  read URAND, $randbyte, 1;
  $randnum = ord($randbyte);
  $salt .= chr(($randnum % 26) + 65);
}
close URAND;

$crypted = unix_md5_crypt($password, $salt);

open SHADOW, "</etc/shadow";
open SHADOWTMP, ">/tmp/shadow~";
while(<SHADOW>) {
  $line = $_;
  if($line =~ /^$user:/) {
    @fields = split(/:/, $line);
    $fields[1] = $crypted;
    $line = join(":", @fields);
  }
  print SHADOWTMP $line;
} 
close SHADOW;
close SHADOWTMP;

rename "/tmp/shadow~", "/etc/shadow";
chmod 0640, "/etc/shadow";
exec("/bin/chown root.shadow /etc/shadow");
