]> mj.ucw.cz Git - moe.git/blob - mop/admin/mo-help-upload-logins.pl
MO-P: Upload logins
[moe.git] / mop / admin / mo-help-upload-logins.pl
1 #!/usr/bin/perl
2 # Helper script for synchronizing /etc/passwd, /etc/group, and /etc/shadow
3
4 use common::sense;
5
6 my $all = $ARGV[0] eq '--all';
7 my @files = ();
8
9 print "Syncing /etc/passwd\n";
10 open my $p, '<', '/etc/passwd' or die;
11 open my $q, '>', '/etc/passwd.new' or die;
12 system qw(chmod --reference /etc/passwd /etc/passwd.new);
13 system qw(chown --reference /etc/passwd /etc/passwd.new);
14 my %sysusers = ();
15 while (<$p>) {
16         my @a = split /:/;
17         # FIXME: Hard-wired UIDs
18         if ($a[3] < 65000 || $a[3] >= 65500) {
19                 print $q $_;
20                 $sysusers{$a[0]} = 1;
21         }
22 }
23 open my $r, '<', 'etcpasswd' or die;
24 while (<$r>) { print $q $_; }
25 close $r;
26 close $q;
27 close $p;
28 push @files, 'passwd';
29
30 print "Syncing /etc/group\n";
31 open my $p, '<', '/etc/group' or die;
32 open my $q, '>', '/etc/group.new' or die;
33 system qw(chmod --reference /etc/group /etc/group.new);
34 system qw(chown --reference /etc/group /etc/group.new);
35 while (<$p>) {
36         my @a = split /:/;
37         # FIXME: Hard-wired GIDs
38         if ($a[2] < 65000 || $a[2] >= 65500) {
39                 print $q $_;
40         }
41 }
42 open my $r, '<', 'etcgroup' or die;
43 while (<$r>) { print $q $_; }
44 close $r;
45 close $q;
46 close $p;
47 push @files, 'group';
48
49 if ($all) {
50         print "Syncing /etc/shadow\n";
51         open my $p, '<', '/etc/shadow' or die;
52         open my $q, '>', '/etc/shadow.new' or die;
53         system qw(chmod --reference /etc/shadow /etc/shadow.new);
54         system qw(chown --reference /etc/shadow /etc/shadow.new);
55         while (<$p>) {
56                 my @a = split /:/;
57                 if ($sysusers{$a[0]}) {
58                         print $q $_;
59                 }
60         }
61         open my $r, '<', 'etcshadow' or die;
62         while (<$r>) { print $q $_; }
63         close $r;
64         close $q;
65         close $p;
66         push @files, 'shadow';
67 }
68
69 for my $f (@files) {
70         rename "/etc/$f", "/etc/$f.old" or die "Rename failed: $!\n";
71         rename "/etc/$f.new", "/etc/$f" or die "Rename failed: $!\n";
72 }