/ag-update-openbsd
#!/usr/bin/perl
use strict;
use AwesomeGrid;
use AwesomeGrid::Config;
use AwesomeGrid::User;
my $etc = '/etc'; # In production, this should be '/etc'
my $config = AwesomeGrid::Config::config();
# Get a list of awesomegrid users
opendir USERS, "$AwesomeGrid::confdir/users";
my @agusers = grep {/^[^.]/} readdir USERS;
close USERS;
# Get a list of system users
my @sysusers;
my @allsysusers;
open PASSWD, "$etc/master.passwd";
while (<PASSWD>) {
my ($username, undef, $uid, $gid, $class, $change, $expire, $gecos, $home, $shell) = split(/:/);
push(@allsysusers, $username);
next unless $gecos =~ /^\[AG\]/; # Skip non-AG-managed users
push(@sysusers, $username);
}
close PASSWD;
# Check to see what there is in /etc/master.passwd that should be removed.
my @deletes;
for my $sysuser (@sysusers) {
unless (grep { $_ eq $sysuser } @agusers) {
push(@deletes, $sysuser);
}
}
# Check to see which users are going to be added
my @adds;
for my $aguser (@agusers) {
unless (grep { $_ eq $aguser } @allsysusers) {
push(@adds, $aguser);
}
}
# Check to see which users should be updated
my @updates;
for my $user (@allsysusers) {
if (grep { $_ eq $user } @agusers) {
push(@updates, $user);
}
}
unless (@adds or @deletes or @updates) {
print "Nothing to do.\n";
exit 0;
}
print "Adding: ",join(' ',@adds),"\n" if @adds;
print "Deleting: ",join(' ',@deletes),"\n" if @deletes;
print "Updating: ",join(' ',@updates),"\n" if @updates;
print "Proceed? [y/N] ";
my $ans = <STDIN>;
unless ($ans =~ /^[Yy]$/) {
exit(0);
}
# Before proceeding, make a backup copy of /etc/master.passwd
system("cp $etc/master.passwd $etc/master.passwd.ag_backup");
# Deletes first
if (@deletes or @updates) {
open PASSWD, "$etc/master.passwd";
open PASSWDOUT, ">$etc/master.passwd.out";
while (<PASSWD>) {
my ($username) = split(/:/);
next if grep { $username eq $_ } (@deletes,@updates);
print PASSWDOUT;
}
close PASSWDOUT;
close PASSWD;
}
# Then add new ones.
if (@adds or @updates) {
open PASSWD, ">>$etc/master.passwd.out";
for my $add (@updates,@adds) {
my $agu = AwesomeGrid::User->load($add);
unless (exists $agu->{'passwd-bcrypt'}) {
print "$agu->{username} does not have a bcrypt password! Not adding user!\n";
next;
}
printf PASSWD "%s:%s:%d:%d::0:0:[AG]:%s:%s\n",
$agu->{username}, $agu->{'passwd-bcrypt'},
$agu->{uid}, $agu->{uid},
"$config->{homedir}/$agu->{username}",
$config->{'default-shell'};
unless (-d "$config->{homedir}/$agu->{username}") {
print "Creating homedir for $agu->{username}\n";
mkdir "$config->{homedir}/$agu->{username}";
chown $agu->{uid}, $agu->{uid},
"$config->{homedir}/$agu->{username}";
}
}
close PASSWD;
}
# Update the passwd databases
system('/usr/sbin/pwd_mkdb /etc/master.passwd.out')