The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;

use FindBin '$Bin';
use lib "$Bin/../lib";
use GBrowse::ConfigData;
use Bio::Graphics::Browser2;
use Bio::Graphics::Browser2::UserDB;
use Getopt::Long;

my ($name,$pass);

my @ORIGINAL_ARGV = @ARGV;

GetOptions('name=s'        => \$name,
	   'password=s'    => \$pass) or die <<EOF;
Usage: $0 [options]

Sets the administrator\'s login name and password. This login name
will have the ability to upload public tracks to GBrowse.

   -name      Login name for admin user [default "admin"].
   -pass      Login password for admin user.

This script uses the "user_account_db" and "admin_account" options
in the currently installed GBrowse.conf configuration file to find 
the appropriate accounts database and the name of the administrator.
If a password is not provided on the command line, you will be 
prompted for it on standard input.

WARNING: This script should be run as the web server user using
"sudo -u www-data $0". If it detects that it is not being run as this
user, it will attempt to sudo itself for you.
EOF
 ;

my $wwwuser = GBrowse::ConfigData->config('wwwuser');
my $uid     = (getpwnam($wwwuser))[2];
unless ($uid == $<) {
    print STDERR "Not running as $wwwuser. Trying to use sudo to remedy. You may be asked for your login password.\n";
    my @args = ('sudo','-u',$wwwuser,$0, @ORIGINAL_ARGV);
    exec @args;
    exit 0;
}

my $globals = Bio::Graphics::Browser2->open_globals or die "Couldn't open GBrowse.conf";
my $userdb  = Bio::Graphics::Browser2::UserDB->new($globals);

$name ||= $globals->admin_account;

unless ($pass) {
    print STDERR "New password for $name: ";
    system "stty -echo";
    $pass = <STDIN>;
    chomp($pass);
    print STDERR "\n";

    my $newpass;
    print STDERR "New password for $name (confirm): ";
    $newpass = <STDIN>;
    chomp($newpass);
    print STDERR "\n";
    system "stty echo";
    die "Passwords don't match!\n" unless $pass eq $newpass;
}

$userdb->delete_user_by_username($name);

# this creates a new session for the admin user
my $session     = $globals->session;
my $sessionid   = $session->id;
my $uploadsid   = $session->uploadsid;
$session->flush();

my ($status,undef,$message) = 
    $userdb->do_add_user($name,'admin@nowhere.net','GBrowse Administrator',$pass,$sessionid,'allow admin');
warn $message,"\n";
$userdb->set_confirmed_from_username($name);

warn "Admin account \"$name\" is now registered with sessionid=$sessionid, uploadsid=$uploadsid.\n" if $message =~ /success/i;

exit 0;

__END__