summaryrefslogtreecommitdiff
path: root/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm
diff options
context:
space:
mode:
Diffstat (limited to 'ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm')
-rw-r--r--ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm641
1 files changed, 0 insertions, 641 deletions
diff --git a/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm b/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm
deleted file mode 100644
index 30145d09fa9..00000000000
--- a/ndb/tools/old_dirs/ndbnet/lib/NDB/Net/Command.pm
+++ /dev/null
@@ -1,641 +0,0 @@
-package NDB::Net::Command;
-
-use strict;
-use Carp;
-use Getopt::Long;
-use Text::ParseWords ();
-use Text::Tabs ();
-
-require NDB::Net::Base;
-
-use vars qw(@ISA);
-@ISA = qw(NDB::Net::Base);
-
-# constructors
-
-my $log;
-
-sub initmodule {
- $log = NDB::Util::Log->instance;
-}
-
-my($cmdtab, $aliastab);
-
-NDB::Net::Command->attributes(
- name => sub { /^\s*\w+\b/ },
- argv => sub { ref eq 'ARRAY' },
- optspec => sub { ref eq 'ARRAY' },
- argspec => sub { /^\d+$/ || ref eq 'CODE' },
- short => sub { defined && ! ref },
- help => sub { defined && ! ref },
- opts => sub { ref eq 'HASH' },
- args => sub { ref eq 'ARRAY' },
-);
-
-sub desc {
- my $cmd = shift;
- return "command " . $cmd->getname("?");
-};
-
-sub processname {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my $cmdargv = $cmd->getargv;
- my $name = shift(@$cmdargv);
- my %seen = ();
- while ((my $entry) = grep($name eq $_->{name}, @$aliastab)) {
- $seen{$name}++ && last;
- unshift(@$cmdargv, split(' ', $entry->{value}));
- $name = shift(@$cmdargv);
- }
- if ((my $entry) = grep($_->{name} eq $name, @$cmdtab)) {
- $cmd->setname($entry->{name})
- or $log->push, return undef;
- $cmd->setoptspec($entry->{optspec})
- or $log->push, return undef;
- $cmd->setargspec($entry->{argspec})
- or $log->push, return undef;
- }
- else {
- $log->put("$name: undefined")->push($cmd);
- return undef;
- }
- return 1;
-}
-
-sub getopttype {
- my $cmd = shift;
- my($key) = @_;
- if (grep(/^$key$/, @{$cmd->getoptspec})) {
- return 1;
- }
- if (grep(/^$key=/, @{$cmd->getoptspec})) {
- return 2;
- }
- return undef;
-}
-
-sub processargv {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my $cmdargv = $cmd->getargv;
- my @newargv = ();
- while (@$cmdargv) {
- my $v = shift(@$cmdargv);
- if (! defined($v)) {
- next;
- }
- if (ref($v) eq 'ARRAY') {
- unshift(@$cmdargv, @$v); # push back
- next;
- }
- if (ref($v) eq 'HASH') {
- for my $k (sort keys %$v) {
- if ($cmd->getopttype($k) == 1) {
- push(@newargv, "--$k");
- next;
- }
- if ($cmd->getopttype($k) == 2) {
- push(@newargv, "--$k", $v->{$k});
- next;
- }
- $log->put("$k: undefined option")->push($cmd);
- return undef;
- }
- next;
- }
- if (ref($v)) {
- confess 'oops';
- }
- push(@newargv, $v);
- }
- push(@$cmdargv, @newargv);
- return 1;
-}
-
-sub processopts {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my $cmdargv = $cmd->getargv;
- local(@ARGV) = @$cmdargv;
- try: {
- local $SIG{__WARN__} = sub {
- my $errstr = "@_";
- while (chomp($errstr)) {}
- $log->put($errstr)->push($cmd);
- };
- $cmd->setopts({})
- or $log->push, return undef;
- Getopt::Long::Configure(qw(
- default no_getopt_compat no_ignore_case
- ));
- GetOptions($cmd->getopts, @{$cmd->getoptspec})
- or return undef;
- }
- $cmd->setargs([ @ARGV ])
- or $log->push, return undef;
- return 1;
-}
-
-sub processargs {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my $cmdargs = $cmd->getargs;
- if ($cmd->getargspec =~ /^\d+$/) {
- if (@$cmdargs != $cmd->getargspec) {
- $log->put("invalid arg count %d != %d",
- scalar(@$cmdargs), $cmd->getargspec)->push($cmd);
- return undef;
- }
- }
- if (ref($cmd->getargspec) eq 'CODE') {
- local $_ = scalar(@$cmdargs);
- if (! &{$cmd->getargspec}()) {
- $log->put("invalid arg count %d",
- scalar(@$cmdargs))->push($cmd);
- return undef;
- }
- }
- return 1;
-}
-
-sub new {
- my $class = shift;
- @_ % 2 == 0 or confess 0+@_;
- my %attr = @_;
- my $cmd = $class->SUPER::new(%attr);
- my $cmdargv = [];
- $cmd->setargv($cmdargv)
- or $log->push, return undef;
- my $line = $attr{line};
- my $argv = $attr{argv};
- defined($line) != defined($argv) # exactly one
- or confess 'oops';
- if (defined($line)) {
- ! ref($line) or confess 'oops';
- push(@$cmdargv, Text::ParseWords::shellwords($line));
- }
- if (defined($argv)) {
- ref($argv) eq 'ARRAY' or confess 'oops';
- push(@$cmdargv, @$argv);
- }
- if (! @$cmdargv) {
- $log->put("empty command");
- return undef;
- }
- $cmd->processname
- or $log->push, return undef;
- $cmd->processargv
- or $log->push, return undef;
- $cmd->processopts
- or $log->push, return undef;
- $cmd->processargs
- or $log->push, return undef;
- return $cmd;
-}
-
-sub getline {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my @text = ($cmd->getname);
- for my $k (sort keys %{$cmd->getopts}) {
- if ($cmd->getopttype($k) == 1) {
- push(@text, "--$k");
- next;
- }
- if ($cmd->getopttype($k) == 2) {
- push(@text, "--$k", quotemeta($cmd->getopts->{$k}));
- next;
- }
- confess 'oops';
- }
- for my $s (@{$cmd->getargs}) {
- push(@text, quotemeta($s));
- }
- return "@text";
-}
-
-sub setopt {
- my $cmd = shift;
- my($key, $value) = @_;
- if ($cmd->getopttype($key) == 1) {
- @_ == 1 or confess 0+@_;
- $cmd->getopts->{$key} = 1;
- }
- elsif ($cmd->getopttype($key) == 2) {
- @_ == 2 or confess 0+@_;
- $cmd->getopts->{$key} = $value;
- }
- else {
- confess 'oops';
- }
-}
-
-sub getopt {
- my $cmd = shift;
- @_ == 1 or confess 0+@_;
- my($key) = @_;
- $cmd->getopttype($key) or confess 'oops';
- return $cmd->getopts->{$key};
-}
-
-sub setarg {
- my $cmd = shift;
- @_ == 2 or confess 0+@_;
- my($idx, $value) = @_;
- $cmd->getargs->[$idx] = $value;
-}
-
-sub getarg {
- my $cmd = shift;
- @_ == 1 or confess 0+@_;
- my($idx) = @_;
- return $cmd->getargs->[$idx];
-}
-
-sub getarglist {
- my $cmd = shift;
- @_ == 1 or confess 0+@_;
- my($idx) = @_;
- my @args = @{$cmd->getargs};
- @args = @args[$idx..$#args];
- return \@args;
-}
-
-sub helptext {
- my $cmd = shift;
- @_ <= 1 or confess 0+@_;
- my $name = $cmd->getargs->[0];
- my $text = "";
- my $indent = " "x4;
- if (defined($name)) {
- for my $entry (@$aliastab) {
- if ($entry->{name} eq $name) {
- $text .= "alias $name=\"$entry->{value}\"\n";
- ($name) = split(' ', $entry->{value});
- last;
- }
- }
- }
- else {
- $text .= "COMMANDS\n";
- }
- for my $entry (@$cmdtab) {
- if (defined($name)) {
- if ($entry->{name} eq $name) {
- $text .= uc($name) . "\n";
- for my $t (split(/\n/, $entry->{help})) {
- $text .= $indent;
- $text .= Text::Tabs::expand($t) . "\n";
- }
- last;
- }
- }
- else {
- $text .= $indent;
- $text .= sprintf("%-16s%s\n", $entry->{name}, $entry->{short});
- }
- }
- if (! $text) {
- $log->put("$name: undefined");
- return undef;
- }
- return $text;
-}
-
-sub aliastext {
- my $cmd = shift;
- @_ == 0 or confess 0+@_;
- my $text = "";
- my $indent = " "x4;
- $text .= "ALIASES\n";
- for my $entry (@$aliastab) {
- $text .= $indent;
- $text .= sprintf("%-16s%s\n", $entry->{name}, $entry->{value});
- }
- return $text;
-}
-
-# commands
-# name command name (unique)
-# optspec option spec in Getopt::Long style
-# argspec arg count (number or sub)
-# short one line summary
-# help long help text
-# opts options HASH (after parse)
-# args arguments ARRAY (after parse)
-
-$cmdtab = [
- {
- name => "help",
- optspec => [ qw() ],
- argspec => sub { $_[0] <= 1 },
- short => "print help (try: h h)",
- help => <<END,
-help [name]
-name command name or alias
-
-Print help summary or longer help text for one command.
-
-General:
-
-Options can be placed anywhere on command line and can be abbreviated.
-Example: "start db11 -i" instead of "start --init_rm db11".
-
-Several commands have internal option --local which makes current server
-do the work, instead of passing it to other servers. This option should
-not be used explicitly, except for testing.
-END
- },
- {
- name => "alias",
- optspec => [ qw() ],
- argspec => 0,
- short => "list aliases",
- help => <<END,
-alias
-
-List built-in aliases. New ones cannot be defined (yet).
-END
- },
- {
- name => "quit",
- optspec => [ qw() ],
- argspec => 0,
- short => "exit ndbnet",
- help => <<END,
-quit
-
-Exit ndbnet client.
-END
- },
- {
- name => "server",
- optspec => [ qw(all direct pass parallel script=s local) ],
- argspec => sub { $_ >= 1 },
- short => "net server commands",
- help => <<END,
-server action id... [options]
-action start restart stop ping
-id net server id from net config
---all do all servers listed in net config
---direct do not use a server
---pass pass current ndb environment to remote command
---parallel run in parallel when possible
---script path remote script instead of "ndbnetd"
---local for internal use by servers
-
-Each host needs one net server (ndbnetd). It should be started
-from latest ndb installation, for example at system boot time.
-A "server ping" is used to check that all servers are up (option
---all is added if no server ids are given).
-
-Other actions are mainly for testing. A "server start" tries to
-start servers via "ssh". This does not work if "ssh" is not allowed
-or if the remote command does not get right environment.
-
-Option --direct makes this ndbnet client do the work. It is assumed
-for "server start" and it requires that a local net config exists.
-Option --pass is useful in a homogeneous (NFS) environment.
-
-There are aliases "startserver" for "server start", etc.
-END
- },
- {
- name => "start",
- optspec => [ qw(init_rm nostart stop kill config old home=s clean proxy=s) ],
- argspec => 1,
- short => "start database",
- help => <<END,
-start dbname [options]
-dbname database name
---init_rm destroy existing database files on each node
---nostart for DB nodes only do "ndb -n"
---stop do "stop dbname" first
---kill do "kill dbname" first
---config create run config but start no processes
---old use existing config files
---home dir override home (product dir) from config
---clean passed to startnode
---proxy list generate proxy ports (read the source)
-
-Start a database as follows:
-
-- start mgmt servers on all mgmt nodes
-- start ndb processes on all db nodes
-- send "all start" to first mgmt server (redundant)
-- start processes on all api nodes (if runtype!="manual")
-
-Older database versions (v1.0) are started similarly except that there
-are no management servers.
-
-The --proxy option is used for testing network problems.
-END
- },
- {
- name => "startnode",
- optspec => [ qw(init_rm nostart config old run=s home=s local clean proxy=s) ],
- argspec => 2,
- short => "start database node",
- help => <<END,
-startnode dbname nodeid [options]
-dbname database name
-nodeid node number
---init_rm destroy existing database files (if db node)
---nostart if DB node only do "ndb -n"
---config create run config but start no processes
---old use existing config files
---run cmd run this shell command, default from config file
---home dir override home (product dir) from config
---local node must be local to this ndbnet server
---clean remove old node dir first
---proxy list processed by mgmt nodes, see "start" command
-
-Start the process on one database node. The node can be of any type
-(mgmt/db/api). If already running, does nothing.
-
-The --run option specifies a simple shell command (not pipeline etc).
-Defaults:
-
-- mgmt node => mgmtsrvr -p port -l Ndb.cfg -i config.txt -c config.bin
- where port comes from ndbnet.xml
-- db node => ndb
-- api node => based on ndbnet config, default empty
-
-The node server exits when the command exits (unless runtype is set to
-auto). Command exit status is not available.
-
-Used internally by db "start" command.
-END
- },
- {
- name => "stop",
- optspec => [ qw() ],
- argspec => 1,
- short => "stop database",
- help => <<END,
-stop dbname [options]
-dbname database name
-
-Stop a database as follows (see also "stopnode" command):
-
-- send SIGTERM to api processes, wait for them to exit
-- send "all stop" command to first mgmt server
-- wait for db processes to exit
-- send "quit" to mgmt servers, wait for them to exit
-END
- },
- {
- name => "stopnode",
- optspec => [ qw(local) ],
- argspec => 2,
- short => "stop process on one node",
- help => <<END,
-stopnode dbname nodeid [options]
-dbname database name
-nodeid node number
---local node must be local to this server
-
-Stop process on one database node. Action depends on node type:
-
-- api node: send SIGTERM to the process, wait for it to exit
-- db node: no action, wait for the ndb process to exit
-- mgmt node: send "quit" command to mgmt server, wait for it to exit
-
-Used internally by db "stop" command.
-END
- },
- {
- name => "kill",
- optspec => [ qw() ],
- argspec => 1,
- short => "kill processes on all nodes",
- help => <<END,
-kill dbname [options]
-dbname database name
-
-Send SIGKILL to processes on all nodes and wait for them to exit.
-END
- },
- {
- name => "killnode",
- optspec => [ qw(local) ],
- argspec => 2,
- short => "kill process on one node",
- help => <<END,
-killnode dbname nodeid [options]
-dbname database name
-nodeid node number
---local node must be local to this server
-
-Send SIGKILL to the process on the node and wait for it to exit.
-
-Used internally by db "kill" command.
-END
- },
- {
- name => "statnode",
- optspec => [ qw(local) ],
- argspec => 2,
- short => "get node run status (internal)",
- help => <<END,
-statnode dbname nodeid [options]
-dbname database name
-nodeid node number
---local node must be local to this server
-
-Get node run status (up/down) as a process. Used internally
-and may not produce any output in ndbnet command.
-END
- },
- {
- name => "list",
- optspec => [ qw(quick short) ],
- argspec => sub { 1 },
- short => "list databases",
- help => <<END,
-list [dbname] [options]
-dbname database name, default is to list all
---quick only output config, do not query status
---short do list nodes
-
-List databases and nodes. Internally returns a data structure
-of process and mgmt server status values for each node. Externally
-(in ndbnet command) this is formatted as a listing.
-END
- },
- {
- name => "writenode",
- optspec => [ qw(wait=i local) ],
- argspec => 3,
- short => "write line of text to the process on a node",
- help => <<END,
-writenode dbname nodeid "some text"
-dbname database name
-nodeid node number
-"some text" arbitrary text (quote if spaces)
---wait n wait n seconds for any response
---local node must be local to this server
-
-Write the text and a newline to the standard input of the process
-running on the node. If wait > 0 is specified, prints whatever
-the process wrote to stdout/stderr during that time.
-
-Used internally by "start" and other commands.
-END
- },
-];
-
-# aliases
-# name alias
-# value expansion
-
-$aliastab = [
- {
- name => "h",
- value => "help",
- },
- {
- name => "q",
- value => "quit",
- },
- {
- name => "EOF",
- value => "quit",
- },
- {
- name => "startserver",
- value => "server start",
- },
- {
- name => "ss",
- value => "server start",
- },
- {
- name => "restartserver",
- value => "server restart",
- },
- {
- name => "rss",
- value => "server restart",
- },
- {
- name => "stopserver",
- value => "server stop",
- },
- {
- name => "pingserver",
- value => "server ping",
- },
- {
- name => "ps",
- value => "server ping",
- },
- {
- name => "l",
- value => "list",
- },
-];
-
-1;
-# vim:set sw=4: