mourningdove/cgi-bin/LJ/Console/Command.pm
2026-05-24 01:03:05 +00:00

184 lines
4.1 KiB
Perl

# This code was forked from the LiveJournal project owned and operated
# by Live Journal, Inc. The code has been modified and expanded by
# Dreamwidth Studios, LLC. These files were originally licensed under
# the terms of the license supplied by Live Journal, Inc, which can
# currently be found at:
#
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
#
# In accordance with the original license, this code and all its
# modifications are provided under the GNU General Public License.
# A copy of that license can be found in the LICENSE file included as
# part of this distribution.
# Base class for LJ::Console commands
package LJ::Console::Command;
use strict;
use Carp qw(croak);
use LJ::Console::Response;
sub new {
my $class = shift;
my %opts = @_;
my $self = {
command => delete $opts{command},
args => delete $opts{args} || [],
output => [],
};
# args can be arrayref, or just one arg
if ( $self->{args} && !ref $self->{args} ) {
$self->{args} = [ $self->{args} ];
}
croak "invalid argument: args"
if $self->{args} && !ref $self->{args} eq 'ARRAY';
croak "invalid parameters: ", join( ",", keys %opts )
if %opts;
return bless $self, $class;
}
sub args {
my $self = shift;
return @{ $self->{args} || [] };
}
## *command = \&cmd is invalid, since derived clases don't
## override method 'command', invocation of $derived->command
## leads to call of Base::cmd() not Derived::cmd()
sub command {
my $self = shift;
$self->cmd(@_);
}
sub cmd {
my $self = shift;
die "cmd not implemented in $self";
}
sub desc {
my $self = shift;
return "";
}
sub usage {
my $self = shift;
return "";
}
sub args_desc {
my $self = shift;
# [ arg1 => 'desc', arg2 => 'desc' ]
return [];
}
sub can_execute {
my $self = shift;
return 0;
}
sub requires_remote {
my $self = shift;
return 1;
}
# hide from console documentation?
sub is_hidden {
my $self = shift;
return 0;
}
sub as_string {
my $self = shift;
my $ret = join( " ", $self->cmd, $self->args );
return LJ::ehtml($ret);
}
sub as_html {
my $self = shift;
my $out = "<table class='console_command' summary='' border='1' cellpadding='5'><tr>";
$out .= "<td><strong>" . LJ::ehtml( $self->cmd ) . "</strong></td>";
$out .= "<td>" . LJ::ehtml($_) . "</td>" foreach $self->args;
$out .= "</tr></table>";
return $out;
}
# return 1 on success. on failure, return 0 or die. (will be caught)
sub execute {
my $self = shift;
die "execute not implemented in $self";
}
sub execute_safely {
my $cmd = shift;
my $remote = LJ::get_remote();
eval {
return $cmd->error("You must be logged in to run this command.")
if $cmd->requires_remote && !$remote;
return $cmd->error("Your account status prevents you from using the console.")
if $cmd->requires_remote && $remote->is_inactive && !$remote->has_priv("suspend");
return $cmd->error("You are not authorized to run this command.")
unless $cmd->can_execute;
my $rv = $cmd->execute( $cmd->args );
return $cmd->error( "Command " . $cmd->command . "' didn't execute successfully." )
unless $rv;
};
if ($@) {
return $cmd->error( "Died executing '" . $cmd->command . "': $@" );
}
return 1;
}
sub responses {
my $self = shift;
return @{ $self->{output} || [] };
}
sub add_responses {
my $self = shift;
my @responses = @_;
push @{ $self->{output} }, @responses;
}
sub print {
my $self = shift;
my $text = shift;
push @{ $self->{output} }, LJ::Console::Response->new( status => 'success', text => $text );
return 1;
}
sub error {
my $self = shift;
my $text = shift;
push @{ $self->{output} }, LJ::Console::Response->new( status => 'error', text => $text );
return 1;
}
sub info {
my $self = shift;
my $text = shift;
push @{ $self->{output} }, LJ::Console::Response->new( status => 'info', text => $text );
return 1;
}
1;