NAME

GRID::Machine::Core - Module loaded when bootstraping the remote Perl server

DESCRIPTION

The creation of a GRID::Machine object through a call to GRID::Machine->new implies the loading of a Remote Module called GRID::Machine::Core which is delivered with the GRID::Machine distribution. Another module that is being included at construction time is GRID::Machine::RIOHandle.

One of the final goals of the GRID::Machine::Core remote module is to provide homonymous methods per each of the Perl CORE:: functions. At present time only a few are supported.

The following functions defined in the Remote Module GRID::Machine::Core are loaded via the include mechanism on the remote machine. Therefore, they work as methods of the GRID::Machine object on the local machine. They perform the same operations than their Perl aliases:

Function getcwd

Function chdir

Function umask

Function mkdir

Function system

Executes system on the remote machine. See an example:

$ cat -n examples/transfer2.pl 
   1  #!/usr/local/bin/perl -w
   2  use strict;
   3  use GRID::Machine qw(is_operative);
   4  use Data::Dumper;
   5  
   6  my $host = shift || $ENV{GRID_REMOTE_MACHINE};
   7  
   8  my $machine = GRID::Machine->new( 
   9        host => $host,
  10        cleanup => 1,
  11        sendstdout => 1,
  12        startdir => '/tmp/perl5lib',
  13        prefix => '/tmp/perl5lib/',
  14     );
  15  
  16  my $dir = $machine->getcwd->result;
  17  print "$dir\n";
  18  
  19  $machine->modput('Parse::Eyapp::') or die "can't send module\n";
  20  
  21  print $machine->system('tree');
  22  my $r =  $machine->system('doesnotexist');
  23  print Dumper $r;

Observe the overloading of bool at line 19. modput returns a GRID::Machine::Result object which is evaluated in a Boolean context as a call to the result getter.

When executed produces an output like:

$ perl -w examples/transfer2.pl 
/tmp/perl5lib
.
`---- Parse
    `---- Eyapp
        |---- Base.pm
        |---- Cleaner.pm
        |---- Driver.pm
        |---- Grammar.pm
        |---- Lalr.pm
        |---- Node.pm
        |---- Options.pm
        |---- Output.pm
        |---- Parse.pm
        |---- Scope.pm
        |---- TokenGen.pm
        |---- Treeregexp.pm
        |---- _TreeregexpSupport.pm
        |---- Unify.pm
        `---- YATW.pm

2 directories, 15 files
$VAR1 = bless( {
                 'stderr' => 'Can\'t exec "doesnotexist":',
                 'errmsg' => '',
                 'type' => 'RETURNED',
                 'stdout' => '',
                 'errcode' => -1,
                 'results' => [ -1 ]
               }, 'GRID::Machine::Result' );

Function qx

Similar to backtick quotes. The result depends on the context. In a list context returns a list with the lines of the output. In a scalar context reurns a string with the output. The value of $" on the local machine decides the register separator used. See an example:

$ cat -n transfer3.pl
   1  #!/usr/local/bin/perl -w
   2  use strict;
   3  use GRID::Machine qw(is_operative);
   4  use Data::Dumper;
   5
   6  my $host = shift || 'casiano@remote.machine.es';
   7
   8  my $machine = GRID::Machine->new( host => $host );
   9  my $DOC = << "DOC";
  10  one. two. three.
  11  four. five. six.
  12  seven.
  13  DOC
  14
  15  # List context: returns  a list with the lines
  16  {
  17    local $/ = '.';
  18    my @a = $machine->qx("echo '$DOC'");
  19    local $"= ",";
  20    print "@a";
  21  }
  22
  23  # scalar context: returns a string with the output
  24  my $a = $machine->qx("echo '$DOC'");
  25  print $a;

When executed produces the following output:

$ transfer3.pl
one., two., three.,
four., five., six.,
seven.,

one. two. three.
four. five. six.
seven.

Function glob

Function tar

Is equivalent to:

system('tar', $options, ,'-f', $file)

Where $options is a string containing the options. Returns the error code from tar. Example:

$m->tar($dist, '-xz')->ok or warn "$host: Can't extract files from $dist\n";

Function version

Syntax:

$machine->version('Some::Module')

Returns the VERSION of the module if the given module is installed on the remote machine and has a VERSION number.

See an example of use:

$ cat version.pl
#!/usr/bin/perl -w
use strict;
use GRID::Machine;
use Data::Dumper;

my $host = $ENV{GRID_REMOTE_MACHINE} ||shift;

my $machine = GRID::Machine->new(host => $host,);

print Dumper($machine->version('Data::Dumper'));
print Dumper($machine->version('Does::Not::Exist::Yet'));

When executed the program produces an output similar to this:

$ version.pl
$VAR1 = bless( {
                 'stderr' => '',
                 'errmsg' => '',
                 'type' => 'RETURNED',
                 'stdout' => '',
                 'errcode' => 0,
                 'results' => [ '2.121_08' ]
               }, 'GRID::Machine::Result' );
$VAR1 = bless( {
                 'stderr' => 'Can\'t locate Does/Not/Exist/Yet.pm in @INC \
                              (@INC contains: /etc/perl /usr/local/lib/perl/5.8.8 ...
                              BEGIN failed--compilation aborted.
                             ',
                 'errmsg' => '',
                 'type' => 'RETURNED',
                 'stdout' => '',
                 'errcode' => 0,
                 'results' => [ '' ]
               }, 'GRID::Machine::Result' );

Function installed

Syntax:

$machine->installed('Some::Module')

Returns TRUE if the given module is installed on the remote machine. Is equivalent to:

system("$^X -M$module -e 0")

File Status Methods

Methods that are equivalent to the tests function

-r -w -e -x -z -s -f -d  -t -T -B -M -A -C

are provided. Since hyphens aren't legal in Perl identifiers the hyphen has been substituted by an underscore. See an example:

$ cat -n copyandmkdir.pl
   1  #!/usr/local/bin/perl -w
   2  use strict;
   3  use GRID::Machine;
   4
   5  my $host = 'remote.machine.es';
   6  my $dir = shift || "somedir";
   7  my $file = shift || $0; # By default copy this program
   8
   9  my $machine = GRID::Machine->new(
  10    host => $host,
  11    uses => [qw(Sys::Hostname)],
  12  );
  13
  14  my $r;
  15  $r = $machine->mkdir($dir, 0777) unless $machine->_w($dir);
  16  die "Can't make dir\n" unless $r->ok;
  17  $machine->chdir($dir)->ok or die "Can't change dir\n";
  18  $machine->put([$file]) or die "Can't copy file\n";
  19  print "HOST: ",$machine->eval(" hostname ")->result,"\n",
  20        "DIR: ",$machine->getcwd->result,"\n",
  21        "FILE: ",$machine->glob('*')->result,"\n";

When this program runs we get an output similar to this:

$ copyandmkdir.pl
HOST: orion
DIR: /home/casiano/somedir
FILE: copyandmkdir.pl

AUTHOR

Casiano Rodriguez Leon <casiano@ull.es>

ACKNOWLEDGMENTS

This work has been supported by CEE (FEDER) and the Spanish Ministry of Educacion y Ciencia through Plan Nacional I+D+I number TIN2005-08818-C04-04 (ULL::OPLINK project http://www.oplink.ull.es/). Support from Gobierno de Canarias was through GC02210601 (Grupos Consolidados). The University of La Laguna has also supported my work in many ways and for many years.

I wish to thank Paul Evans for his IPC::PerlSSH module: it was the source of inspiration for this module. To Alex White, Dmitri Kargapolov, Eric Busto and Erik Welch for their contributions. To the Perl Monks, and the Perl Community for generously sharing their knowledge. Finally, thanks to Juana, Coro and my students at La Laguna.

LICENCE AND COPYRIGHT

Copyright (c) 2007 Casiano Rodriguez-Leon (casiano@ull.es). All rights reserved.

These modules are free software; you can redistribute it and/or modify it under the same terms as Perl itself. See perlartistic.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.