Skip to content

Commit 4504836

Browse files
committed
Allow server endpoint to be run locally
1 parent c3a7ec5 commit 4504836

File tree

2 files changed

+158
-152
lines changed

2 files changed

+158
-152
lines changed

lib/Brass/API.pm

+6-152
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,6 @@ get 'api/pwd/' => sub {
8585
my $user = var 'api_user'
8686
or error __"Authentication required";
8787

88-
my $schema = schema;
89-
9088
my $passphrase = var('payload')->{passphrase}
9189
or error __"Need passphrase for retrieving and setting passwords";
9290

@@ -109,8 +107,6 @@ get 'api/cert/' => sub {
109107
my $user = var 'api_user'
110108
or error __"Authentication required";
111109

112-
my $schema = schema;
113-
114110
my $return = $cdb->run_cert(
115111
server => query_parameters->get('server'),
116112
action => query_parameters->get('action'),
@@ -128,158 +124,16 @@ get 'api/server/' => sub {
128124
my $user = var 'api_user'
129125
or error __"Authentication required";
130126

131-
my $schema = schema;
132-
133-
my $action = query_parameters->get('action')
134-
or error __"Need required action";
135-
my $server = query_parameters->get('server');
136-
my $param = query_parameters->get('param');
137-
138-
my $output = '';
139-
if ($action eq 'summary')
140-
{
141-
my $rs = $schema->resultset('Servertype')->search({},{
142-
prefetch => { server_servertypes => 'server' },
143-
});
144-
145-
$rs = $rs->search({ 'me.name' => $param })
146-
if $param;
147-
148-
my @types = $rs->all;
149-
150-
my %return;
151-
foreach my $type (@types)
152-
{
153-
next unless $type->server_servertypes->count;
154-
$output .= $type->name.":";
155-
$return{$type->name} ||= [];
156-
foreach my $server ($type->server_servertypes)
157-
{
158-
push @{$return{$type->name}}, $server->server->name;
159-
}
160-
}
161-
$output = encode_json(\%return);
162-
}
163-
elsif ($action eq 'domain')
164-
{
165-
$server or error __"Please specify server";
166-
my ($serv) = $schema->resultset('Server')->search({
167-
'me.name' => $server,
168-
},{
169-
prefetch => 'domain',
170-
});
171-
$output .= $serv->domain->name;
172-
}
173-
elsif ($action eq 'is_production')
174-
{
175-
$server or error __"Please specify server";
176-
my ($serv) = $schema->resultset('Server')->search({
177-
'me.name' => $server,
178-
},{
179-
prefetch => 'domain',
180-
});
181-
$output .= $serv->is_production;
182-
}
183-
elsif ($action eq 'metadata')
184-
{
185-
$server or error __"Please specify server";
186-
my ($serv) = $schema->resultset('Server')->search({
187-
'me.name' => $server,
188-
},{
189-
prefetch => 'domain',
190-
});
191-
$output .= ($serv->metadata || '{}');
192-
}
193-
elsif ($action eq 'sshkeys')
194-
{
195-
$server or error __"Please specify server";
196-
my $server_rs = $schema->resultset('Server')->by_name($server)
197-
or error __"Server not found";
198-
my ($serv) = $schema->resultset('Server')->search({
199-
'me.name' => $server,
200-
'user.deleted' => undef,
201-
# Restrict keys to either ones without a servertype restriction, or
202-
# ones that match the servertype of this server
203-
'pw_servertypes.servertype_id' => [undef, map { $_->servertype_id } $server_rs->server_servertypes],
204-
},{
205-
prefetch => {
206-
server_servertypes => {
207-
servertype => {
208-
user_servertypes => {
209-
user => {
210-
pws => 'pw_servertypes',
211-
},
212-
},
213-
},
214-
},
215-
},
216-
});
217-
my %keys;
218-
foreach my $st ($serv->server_servertypes)
219-
{
220-
foreach my $ust ($st->servertype->user_servertypes)
221-
{
222-
foreach my $pw ($ust->user->pws)
223-
{
224-
my $key = $pw->publickey or next;
225-
$key =~ s/\s+$//; # May or may not have trailing space
226-
$keys{$key} = 1 if $key;
227-
}
228-
}
229-
}
230-
$output .= "$_\n" foreach keys %keys;
231-
}
232-
elsif ($action eq 'sudo')
233-
{
234-
$server or error __"Please specify server";
235-
my $serv = $schema->resultset('Server')->search({
236-
'me.name' => $server,
237-
})->next
238-
or error __x"Server {server} not found", server => $server;
239-
$output .= $serv->sudo if $serv->sudo;
240-
}
241-
elsif ($action eq 'update')
242-
{
243-
$server or error "Please specify server";
244-
my $update =
245-
my $data = request->body;
246-
# Valid?
247-
my $decoded;
248-
try { $decoded = decode_json $data };
249-
error "Unable to decode request body data as JSON: $@"
250-
if $@;
251-
252-
my %update;
253-
$update{update_result} = $decoded->{update_result}
254-
or error __"Please specify update result";
255-
$update{update_datetime} = $decoded->{update_datetime}
256-
or error __"Update datetime required";
257-
$update{restart_required} = $decoded->{restart_required}
258-
or error __"Please specify update restart_required";
259-
$update{os_version} = $decoded->{os_version}
260-
or error __"Please specify update os_version";
261-
$update{backup_verify} = $decoded->{backup_verify};
262-
defined $update{backup_verify}
263-
or error __"Please specify update backup_verify";
264-
my ($serv) = $schema->resultset('Server')->search({
265-
'me.name' => $server,
266-
});
267-
$serv->update({
268-
update_datetime => DateTime->from_epoch(epoch => $update{update_datetime}),
269-
update_result => $update{update_result},
270-
restart_required => $update{restart_required},
271-
os_version => $update{os_version},
272-
backup_verify => $update{backup_verify},
273-
});
274-
}
275-
else {
276-
die "Unknown action $action";
277-
}
127+
my $return = $cdb->run_cert(
128+
server => query_parameters->get('server'),
129+
action => query_parameters->get('action'),
130+
param => query_parameters->get('param'),
131+
);
278132

279133
content_type 'application/json';
280134
encode_json({
281135
"is_error" => 0,
282-
"result" => $output,
136+
"result" => $return,
283137
});
284138
};
285139

lib/Brass/ConfigDB.pm

+152
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,10 @@ sub _run_local
6262
{
6363
$self->run_cert(%params);
6464
}
65+
elsif ($type eq 'server')
66+
{
67+
$self->run_server(%params);
68+
}
6569
}
6670

6771
sub _run_remote
@@ -334,6 +338,154 @@ sub run_cert
334338
}
335339
}
336340

341+
sub run_server
342+
{ my ($self, %params) = @_;
343+
344+
my $schema = $self->schema;
345+
my $server = $params{server};
346+
my $param = $params{param};
347+
my $action = $params{action}
348+
or error __"Need required action";
349+
350+
if ($action eq 'summary')
351+
{
352+
my $rs = $schema->resultset('Servertype')->search({},{
353+
prefetch => { server_servertypes => 'server' },
354+
});
355+
356+
$rs = $rs->search({ 'me.name' => $param })
357+
if $param;
358+
359+
my @types = $rs->all;
360+
361+
my %return;
362+
foreach my $type (@types)
363+
{
364+
next unless $type->server_servertypes->count;
365+
$return{$type->name} ||= [];
366+
foreach my $server ($type->server_servertypes)
367+
{
368+
push @{$return{$type->name}}, $server->server->name;
369+
}
370+
}
371+
return encode_json(\%return);
372+
}
373+
elsif ($action eq 'domain')
374+
{
375+
$server or error __"Please specify server";
376+
my ($serv) = $schema->resultset('Server')->search({
377+
'me.name' => $server,
378+
},{
379+
prefetch => 'domain',
380+
});
381+
return $serv->domain->name;
382+
}
383+
elsif ($action eq 'is_production')
384+
{
385+
$server or error __"Please specify server";
386+
my ($serv) = $schema->resultset('Server')->search({
387+
'me.name' => $server,
388+
},{
389+
prefetch => 'domain',
390+
});
391+
return $serv->is_production;
392+
}
393+
elsif ($action eq 'metadata')
394+
{
395+
$server or error __"Please specify server";
396+
my ($serv) = $schema->resultset('Server')->search({
397+
'me.name' => $server,
398+
},{
399+
prefetch => 'domain',
400+
});
401+
return $serv->metadata || '{}';
402+
}
403+
elsif ($action eq 'sshkeys')
404+
{
405+
$server or error __"Please specify server";
406+
my $server_rs = $schema->resultset('Server')->by_name($server)
407+
or error __"Server not found";
408+
my ($serv) = $schema->resultset('Server')->search({
409+
'me.name' => $server,
410+
'user.deleted' => undef,
411+
# Restrict keys to either ones without a servertype restriction, or
412+
# ones that match the servertype of this server
413+
'pw_servertypes.servertype_id' => [undef, map { $_->servertype_id } $server_rs->server_servertypes],
414+
},{
415+
prefetch => {
416+
server_servertypes => {
417+
servertype => {
418+
user_servertypes => {
419+
user => {
420+
pws => 'pw_servertypes',
421+
},
422+
},
423+
},
424+
},
425+
},
426+
});
427+
my %keys;
428+
foreach my $st ($serv->server_servertypes)
429+
{
430+
foreach my $ust ($st->servertype->user_servertypes)
431+
{
432+
foreach my $pw ($ust->user->pws)
433+
{
434+
my $key = $pw->publickey or next;
435+
$key =~ s/\s+$//; # May or may not have trailing space
436+
$keys{$key} = 1 if $key;
437+
}
438+
}
439+
}
440+
return join("\n", keys %keys);
441+
}
442+
elsif ($action eq 'sudo')
443+
{
444+
$server or error __"Please specify server";
445+
my $serv = $schema->resultset('Server')->search({
446+
'me.name' => $server,
447+
})->next
448+
or error __x"Server {server} not found", server => $server;
449+
return $serv->sudo ? 1 : 0;
450+
}
451+
elsif ($action eq 'update')
452+
{
453+
$server or error "Please specify server";
454+
my $data = request->body;
455+
# Valid?
456+
my $decoded;
457+
try { $decoded = decode_json $data };
458+
error "Unable to decode request body data as JSON: $@"
459+
if $@;
460+
461+
my %update;
462+
$update{update_result} = $decoded->{update_result}
463+
or error __"Please specify update result";
464+
$update{update_datetime} = $decoded->{update_datetime}
465+
or error __"Update datetime required";
466+
$update{restart_required} = $decoded->{restart_required}
467+
or error __"Please specify update restart_required";
468+
$update{os_version} = $decoded->{os_version}
469+
or error __"Please specify update os_version";
470+
$update{backup_verify} = $decoded->{backup_verify};
471+
defined $update{backup_verify}
472+
or error __"Please specify update backup_verify";
473+
my ($serv) = $schema->resultset('Server')->search({
474+
'me.name' => $server,
475+
});
476+
$serv->update({
477+
update_datetime => DateTime->from_epoch(epoch => $update{update_datetime}),
478+
update_result => $update{update_result},
479+
restart_required => $update{restart_required},
480+
os_version => $update{os_version},
481+
backup_verify => $update{backup_verify},
482+
});
483+
}
484+
else {
485+
die "Unknown action $action";
486+
}
487+
}
488+
337489
sub randompw()
338490
{ my $pwgen = CtrlO::Crypt::XkcdPassword->new;
339491
$pwgen->xkcd( words => 3, digits => 2 );

0 commit comments

Comments
 (0)