#! /var/run/current-system/sw/bin/perl use strict; use Hydra::Schema; use Hydra::Helper::Nix; use Hydra::Model::DB; use Getopt::Long qw(:config gnu_getopt); use Digest::SHA1 qw(sha1_hex); sub showHelp { print < \$renameFrom, "type=s" => \$type, "full-name=s" => \$fullName, "email-address=s" => \$emailAddress, "password=s" => \$password, "wipe-roles" => \$wipeRoles, "role=s" => \@roles, "help" => sub { showHelp() } ) or exit 1; die "$0: one user name required\n" if scalar @ARGV != 1; my $userName = $ARGV[0]; die "$0: type must be `hydra' or `persona'\n" if defined $type && $type ne "hydra" && $type ne "persona"; my $db = Hydra::Model::DB->new(); txn_do($db, sub { my $user = $db->resultset('Users')->find({ username => $renameFrom // $userName }); if ($renameFrom) { die "$0: user `$renameFrom' does not exist\n" unless $user; $user->update({ username => $userName }); } elsif ($user) { print STDERR "updating existing user `$userName'\n"; } else { print STDERR "creating new user `$userName'\n"; $user = $db->resultset('Users')->create( { username => $userName, type => "hydra", emailaddress => "", password => "!" }); } die "$0: Persona user names must be email addresses\n" if $user->type eq "persona" && $userName !~ /\@/; $user->update({ type => $type }) if defined $type; $user->update({ fullname => $fullName eq "" ? undef : $fullName }) if defined $fullName; if ($user->type eq "persona") { die "$0: Persona accounts do not have an explicitly set email address.\n" if defined $emailAddress; die "$0: Persona accounts do not have a password.\n" if defined $password; $user->update({ emailaddress => $userName, password => "!" }); } else { $user->update({ emailaddress => $emailAddress }) if defined $emailAddress; $user->update({ password => sha1_hex($password) }) if defined $password; } $user->userroles->delete if $wipeRoles; $user->userroles->update_or_create({ role => $_ }) foreach @roles; });