Expose domains and servers on admin panel.

master
Manager Bot 3 years ago
parent cdfa3419cc
commit 31a3e46a53
  1. 18
      Web/lib/MJB/Web.pm
  2. 77
      Web/lib/MJB/Web/Controller/Admin.pm
  3. 6
      Web/templates/admin/_nav.html.ep
  4. 72
      Web/templates/admin/domains.html.ep
  5. 70
      Web/templates/admin/servers.html.ep

@ -187,12 +187,18 @@ sub startup ($self) {
$auth->post( '/blog/:id/settings' )->to('Blog#do_settings' )->name('do_blog_settings' ); $auth->post( '/blog/:id/settings' )->to('Blog#do_settings' )->name('do_blog_settings' );
# Admin Dashboard # Admin Dashboard
$auth->get ( '/admin' )->to('Admin#index' )->name('show_admin' ); $admin->get ( '/admin' )->to('Admin#index' )->name('show_admin' );
$auth->post( '/admin' )->to('Admin#do_admin_become' )->name('do_admin_become' ); $admin->post( '/admin' )->to('Admin#do_admin_become' )->name('do_admin_become' );
$auth->get ( '/admin/people' )->to('Admin#people' )->name('show_admin_people' ); $admin->get ( '/admin/people' )->to('Admin#people' )->name('show_admin_people' );
$auth->get ( '/admin/person/:id' )->to('Admin#person' )->name('show_admin_person' ); $admin->get ( '/admin/person/:id' )->to('Admin#person' )->name('show_admin_person' );
$auth->get ( '/admin/blogs' )->to('Admin#blogs' )->name('show_admin_blogs' ); $admin->get ( '/admin/blogs' )->to('Admin#blogs' )->name('show_admin_blogs' );
$auth->get ( '/admin/settings' )->to('Admin#settings' )->name('show_admin_settings' ); $admin->get ( '/admin/domains' )->to('Admin#domains' )->name('show_admin_domains' );
$admin->post( '/admin/domain' )->to('Admin#do_domain' )->name('do_admin_domain' );
$admin->post( '/admin/domain/remove' )->to('Admin#do_domain_remove' )->name('do_admin_domain_remove' );
$admin->get ( '/admin/servers' )->to('Admin#servers' )->name('show_admin_servers' );
$admin->post( '/admin/server' )->to('Admin#do_server' )->name('do_admin_server' );
$admin->post( '/admin/server/remove' )->to('Admin#do_server_remove' )->name('do_admin_server_remove' );
$admin->get ( '/admin/settings' )->to('Admin#settings' )->name('show_admin_settings' );
} }

@ -1,5 +1,6 @@
package MJB::Web::Controller::Admin; package MJB::Web::Controller::Admin;
use Mojo::Base 'Mojolicious::Controller', -signatures; use Mojo::Base 'Mojolicious::Controller', -signatures;
use Try::Tiny;
sub index ( $c ) { sub index ( $c ) {
@ -50,4 +51,80 @@ sub blogs ( $c ) {
} }
sub servers ( $c ) {
my $servers = $c->stash->{servers} = [ $c->db->servers->all ];
}
sub do_server ( $c ) {
my $fqdn = $c->param('server_fqdn');
my $server = try {
$c->db->storage->schema->txn_do( sub {
$c->db->servers->create({ hostname => $fqdn });
});
} catch {
$c->flash( error_message => "Server could not be created: $_" );
$c->redirect_to( $c->url_for( 'show_admin_servers' ) );
return;
};
$c->flash( confirmation => "Added $fqdn to server pool." );
$c->redirect_to( $c->url_for( 'show_admin_servers' ) );
}
sub do_server_remove ( $c ) {
my $server = $c->db->server($c->param('sid'));
if ( ! $server ) {
$c->flash( error_message => "Server could not be removed, because it doesn't exist?" );
$c->redirect_to( $c->url_for( 'show_admin_servers' ) );
return;
}
my $hostname = $server->hostname;
$server->delete;
$c->flash( confirmation => "Removed $hostname from server pool." );
$c->redirect_to( $c->url_for( 'show_admin_servers' ) );
}
sub domains ( $c ) {
my $domains = $c->stash->{domains} = [ $c->db->hosted_domains->all ];
}
sub do_domain ( $c ) {
my $fqdn = $c->param('domain_fqdn');
my $domain = try {
$c->db->storage->schema->txn_do( sub {
$c->db->hosted_domains->create({ name => $fqdn });
});
} catch {
$c->flash( error_message => "domain could not be created: $_" );
$c->redirect_to( $c->url_for( 'show_admin_domains' ) );
return;
};
$c->flash( confirmation => "Added $fqdn to domain pool." );
$c->redirect_to( $c->url_for( 'show_admin_domains' ) );
}
sub do_domain_remove ( $c ) {
my $domain = $c->db->hosted_domain($c->param('did'));
if ( ! $domain ) {
$c->flash( error_message => "domain could not be removed, because it doesn't exist?" );
$c->redirect_to( $c->url_for( 'show_admin_domains' ) );
return;
}
my $hostname = $domain->name;
$domain->delete;
$c->flash( confirmation => "Removed $hostname from domain pool." );
$c->redirect_to( $c->url_for( 'show_admin_domains' ) );
}
1; 1;

@ -26,6 +26,12 @@
<div class="flex-grow-1 text-right"></div> <div class="flex-grow-1 text-right"></div>
<li class="nav-item">
<a class="nav-link <%= $page eq 'servers' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_servers' ) %>">Servers</a>
</li>
<li class="nav-item">
<a class="nav-link <%= $page eq 'domains' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_domains' ) %>">Domains</a>
</li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link <%= $page eq 'settings' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_settings' ) %>">Settings</a> <a class="nav-link <%= $page eq 'settings' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_settings' ) %>">Settings</a>
</li> </li>

@ -0,0 +1,72 @@
% layout 'standard', title => 'Admin Panel', sb_active => 'admin';
%= include 'admin/_nav', page => 'domains'
% if ( my $confirmation = flash 'confirmation' ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%== $confirmation %>
</div>
% }
% if ( my $confirmation = flash 'error_message' ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
<%== $confirmation %>
</div>
% }
% if ( $c->stash->{success} ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%= $c->stash->{success_message} %>
</div>
% }
% if ( $c->stash->{errors} ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
There were errors with your request that could not be resolved:
<ul>
% for my $error ( @{$c->stash->{errors}} ) {
<li><%= $error %></li>
% }
</ul>
</div>
% }
<form class="row mt-3 gy-2 gx-3 align-items-center" method="POST" enctype="multipart/form-data" action="<%= $c->url_for( 'do_admin_domain' ) %>">
<div class="col-auto">
<label for="upload" class="col-form-label">Domain FQDN</label>
</div>
<div class="col-auto">
<input type="text" class="form-control" id="domain_fqdn" name="domain_fqdn" />
</div>
<div class="col-auto">
<button type="submit" class="btn btn-sm btn-primary">Add Hosted Domain</button>
</div>
</form>
<hr />
<table style="border: 1px solid #ccc" class="table">
<tbody>
<tr>
<th class="text-nowrap">ID</th>
<th class="text-nowrap">FQDN</th>
<th class="text-nowrap">SSL Challenge</th>
<th class="text-nowrap">Delete</th>
</tr>
</thead>
<tbody>
% for my $domain ( @{$domains} ) {
<tr>
<td><%= $domain->id %></td>
<td><%= $domain->name %></td>
<td><%= $domain->letsencrypt_challenge %></td>
<td>
<form style="margin-top: 1.5em; display: inline;" method="POST" action="<%= $c->url_for( 'do_admin_domain_remove' ) %>">
<input type="hidden" name="did" value="<%= $domain->id %>">
<button type="submit" class="btn btn-sm btn-outline-danger">Delete Domain</button>
</form>
</td>
</tr>
% }
</tbody>
</table>

@ -0,0 +1,70 @@
% layout 'standard', title => 'Admin Panel', sb_active => 'admin';
%= include 'admin/_nav', page => 'servers'
% if ( my $confirmation = flash 'confirmation' ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%== $confirmation %>
</div>
% }
% if ( my $confirmation = flash 'error_message' ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
<%== $confirmation %>
</div>
% }
% if ( $c->stash->{success} ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%= $c->stash->{success_message} %>
</div>
% }
% if ( $c->stash->{errors} ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
There were errors with your request that could not be resolved:
<ul>
% for my $error ( @{$c->stash->{errors}} ) {
<li><%= $error %></li>
% }
</ul>
</div>
% }
<form class="row mt-3 gy-2 gx-3 align-items-center" method="POST" enctype="multipart/form-data" action="<%= $c->url_for( 'do_admin_server' ) %>">
<div class="col-auto">
<label for="upload" class="col-form-label">Server FQDN</label>
</div>
<div class="col-auto">
<input type="text" class="form-control" id="server_fqdn" name="server_fqdn" />
</div>
<div class="col-auto">
<button type="submit" class="btn btn-sm btn-primary">Add Server</button>
</div>
</form>
<hr />
<table style="border: 1px solid #ccc" class="table">
<tbody>
<tr>
<th class="text-nowrap">ID</th>
<th class="text-nowrap">FQDN</th>
<th class="text-nowrap">Delete</th>
</tr>
</thead>
<tbody>
% for my $server ( @{$servers} ) {
<tr>
<td><%= $server->id %></td>
<td><%= $server->hostname %></td>
<td>
<form style="margin-top: 1.5em; display: inline;" method="POST" action="<%= $c->url_for( 'do_admin_server_remove' ) %>">
<input type="hidden" name="sid" value="<%= $server->id %>">
<button type="submit" class="btn btn-sm btn-outline-danger">Delete Server</button>
</form>
</td>
</tr>
% }
</tbody>
</table>
Loading…
Cancel
Save