3 # convert from linux passwd/shadow to master.passwd
6 use Class::Date qw(:errors date now);
11 my ($f, $data, $fields) = @_;
13 open(FH, '<', $f) || die "can't open $f";
16 my @list = split(':');
18 for (my $i = 0; $i < scalar(@$fields); $i++) {
19 $data->{$list[0]}->{$fields->[$i]} = $list[$i];
26 my ($fh, $data, $fields) = @_;
28 foreach my $key (keys(%$data)) {
29 print $fh join(':', map { my $x = $data->{$key}->{$_}; die $_ unless(defined($x)); $x } @$fields), "\n";
35 &read_file($f, $users,
36 ['login', 'pw', 'uid', 'gid', 'gecos', 'home', 'shell']);
41 &read_file($f, $users,
42 ['login', 'pw', 'last_changed', 'may_change', 'must_change', 'expire_warn', 'disable', 'disabled_since', 'reserved']);
47 &write_file(\*STDOUT, $users,
48 [ 'login', 'pw', 'uid', 'gid', 'class', 'change', 'expire', 'gecos', 'home', 'shell' ]);
51 sub days_to_epoch_seconds {
54 my $rel = new Class::Date::Rel { day => $days };
66 my $f = $d->{'must_change'};
68 if (defined($f) && $f > 0) {
69 $d->{'change'} = &days_to_epoch_seconds($f);
70 } elsif ($f == '-1') {
85 while (my ($user, $data) = each(%$data)) {
86 &conv_class($user, $data);
87 &conv_change($user, $data);
88 &conv_expire($user, $data);
93 print STDERR "Usage: $0 <passwd> <shadow>\n";
98 &usage() if (scalar(@ARGV) != 2);
101 &read_passwd($ARGV[0], \%users);
102 &read_shadow($ARGV[1], \%users);
103 &conv_fields(\%users);