The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use warnings;
use strict;
use open 'utf8';
use lib 'lib';    # during devel

use Log::Report        qw/persona/;

use Getopt::Long       qw/GetOptions  :config gnu_compat bundling/;
use URI                ();
use Term::ReadPassword qw/read_password/;

sub run_setup();
sub run_check();
sub run_help();

$Term::ReadPassword::USE_STARS = 1;

my $action = shift @ARGV || 'help';

   if($action eq 'setup') { run_setup }
elsif($action eq 'check') { run_check }
elsif($action eq 'help')  { run_help  }
elsif(index $action, 0, 1 eq '-')
{   print STDERR __x"missing 'action' parameter\n";
    run_help;
}
else
{   error __x"uknown action {action}, try 'help'", action => $action;
}

exit 0;

sub run_setup()
{   my $mode     = 0;
    my $www_group;
    my $secrets  = '/etc/persona';
    my $restart  = 0;
    my $website;
    my $domain;
    my $docroot;
    my $help     = 0;
 
    GetOptions
        'verbose|v+'  => \$mode
      , 'group|g=s'   => \$www_group
      , 'secrets|s=s' => \$secrets
      , 'restart|f!'  => \$restart
      , 'website|w=s' => \$website
      , 'docroot|r=s' => \$docroot
      , 'domain|d=s'  => \$domain
      , 'help|h!'     => \$help
        or exit 1;
    
    if($help)
    {   print <<__HELP; exit 0; }
Usage: $0 setup [OPTIONS]
  --domain  -d  DOMAINNAME  visibility of persona id (required)
  --docroot -r  DIRECTORY   root of website docs (required)
  --group   -f  GROUPNAME   groupname used by webserver
  --help    -h              print this help
  --restart -f              force full reinitation
  --secrets -s  DIRECTORY   where to store the secrets (/etc/persona/)
  --verbose -v              be more verbose during setup
  --website -w  URI         alternative source for domain

      $0 c
__HELP

    dispatcher mode => $mode, 'ALL';

    defined $docroot
        or error __x"doc-root (-r) parameter required";
    
    unless($domain)
    {   $website
            or error __x"provide domain-name (-d) or website (-w)";
    
        my $uri = URI->new($website);
        $domain = $uri->host;
    }

    if($www_group)
    {   getgrnam $www_group
            or error __x"group {name} unknown", name => $www_group;
    }
    else
    {   foreach my $try_group (qw/www-data wwwrun www/)
        {   getgrnam $try_group or next;
            $www_group = $try_group;
            last;
        }

        $www_group
            or error __x"please specify group of webserver (-g)";
    }

    umask 0022;

    eval "require Mozilla::Persona::Setup";
    error $@ if $@;

    Mozilla::Persona::Setup::setup_persona
      ( group   => $www_group
      , secrets => $secrets
      , domain  => $domain
      , docroot => $docroot
      , restart => $restart
      );
}

sub run_check()
{   my $mode    = 0;
    my $help    = 0;

    GetOptions
        'verbose|v+'  => \$mode
      , 'help|h!'     => \$help
        or exit 1;
    
    if($help)
    {   print <<__HELP; exit 0; }
Usage: $0 check [OPTIONS] <idenitities>
  --verbose -v                  be more verbose during setup
  --help    -h                  print this help
__HELP

    @ARGV
        or error __x"specify identity, like me\@example.com";

    dispatcher mode => $mode, 'ALL';
   
    eval "require Mozilla::Persona::Check";
    error $@ if $@;

    foreach my $identity (@ARGV)
    {   my $password = read_password("Password for $identity: ");
        defined $password
            or error __x"no password given, test interrupted.";

        Mozilla::Persona::Check::check_identity
          ( identity  => $identity
          , password  => $password
          );

        print __x"Persona configuration for {id} seems ok.\n"
          , id => $identity;
    }
}

sub run_help()
{   print <<__HELP;
For usage try:
   $0 setup --help
   $0 check --help
__HELP
}

exit 0;