Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

Re: Modules that get along with use lib

by chipmunk (Parson)
on Oct 24, 2001 at 20:21 UTC ( #121162=note: print w/replies, xml ) Need Help??

in reply to Modules that get along with use lib

All modules will work fine with use lib. The only thing use lib does is add directories to @INC. It doesn't matter to the module whether it is in one of the "standard" library directories or in a library directory that is specific to your script.

The real question is which modules can simply be 'installed' by copying over the .pm files, and which require actually being compiled on the machine in question.

Some modules use AutoSplit, and so have .al files, in addition to the .pm files. Some modules have XS components and need to be built with a C compiler, and the binary .so (or whatever) files from one machine may not be compatible with another machine. There are other factors that could make it necessary to build and install the module the regular way.

Fortunately, it's ridiculously simple to install a module, in the standard way, into any directory you want:

perl Makefile.PL PREFIX=/path/to/my/lib/directory make make test make install
You could even set up a CGI script to do it!

Replies are listed 'Best First'.
Re: Re: Modules that get along with use lib
by dmmiller2k (Chaplain) on Oct 24, 2001 at 22:09 UTC

    You could even set up a CGI script to do it!

    I do this sort of thing all of the time on FTP-only ISPs. I have a RIDICULOUSLY simple barebones template of a CGI script which I modify to run arbitrary commands and display their output.

    #!/usr/bin/perl -w use strict; use CGI qw(:all); use CGI::Carp qw( fatalsToBrowser ); my $v = `arbitrary command 2>&1`; print join( "\n", header, start_html("Arbitrary Command"), strong(h1("Arbitrary Command:")), pre( $v ), end_html ),"\n";

    Just customize 'arbitrary command' and save the result as, say, 'arbitrary command.cgi' using FTP and Bob's your uncle.


    You can give a man a fish and feed him for a day ...
    Or, you can teach him to fish and feed him for a lifetime
Re: Re: Modules that get along with use lib
by amelinda (Friar) on Oct 24, 2001 at 21:57 UTC
    That won't, sadly, answer this monk's enquiry, since said monk specifically mentioned that he is limited to FTP access. I ran into this myself just the other day (:twitch: is at version 2.36 there).

    On the other hand, the idea of writing a CGI script to do it, could work... insane, twisted, wrong, but it could work.

      I noticed that the monk said only FTP access was allowed. That is specifically why I said it could be done through a CGI script. Here's an example of what I meant.
      #!/usr/local/bin/perl use CGI; my $cgi = new CGI; print $cgi->header('text/plain'); my $source_dir = "/home/me/source"; my $lib_dir = "/home/me/lib"; my $module = $cgi->param('module'); chdir($source_dir) or die "Can't chdir to $source_dir: $!\n"; system("/bin/gunzip $module.tar.gz") and die "Can't gunzip $module.tar +.gz\n"; system("/bin/tar xf $module.tar") and die "Can't untar $module.tar\n"; chdir("$source_dir/$module") or die "Can't chdir to $source_dir/$modul +e: $!\n"; system("/usr/local/bin/perl Makefile.PL PREFIX=$lib_dir") and die "Error running Makefile.PL\n"; system("/usr/bin/make") and die "Error executing make\n"; system("/usr/bin/make test") and die "Error executing make test\n"; system("/usr/bin/make install") and die "Error executing make install. +\n";
      So, all one has to do is upload this script, upload the .tar.gz file to the source directory, and hit the script from the browser with the name of the module in the module parameter. All possible simply with FTP and CGI.

      Obviously, the script needs better error checking and reporting, and it should capture STDERR from the system calls and send it to the browser along with STDOUT. (Calling a single shell script to handle all the unpacking and building might be an improvement.) I've just written this as a quick hack to get the general idea across.

      Update: Please see DrManhattan's important addendum below; using this script as is would be a huge security risk! An improved script would use taint-checking and restrict the module name to a limited set of characters.

        I wouldn't recommend using that script verbatim. Feeding user input to system() is a bad thing, and feeding it in scalar context is extra bad. Using system() with a scalar rather than an array argument sends the command to the system shell (usually /bin/sh) for processing, so metacharacters like ';' and '`' get interpreted. Anyone who finds the script can run arbitrary commands as you simply by putting them in the 'module' parameter. E.g. if someone loads;rm%20-rf%20*;, that script would happily run
        system("/bin/gunzip ;rm -rf *;.tar.gz")


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://121162]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others musing on the Monastery: (13)
As of 2017-01-20 14:38 GMT
Find Nodes?
    Voting Booth?
    Do you watch meteor showers?

    Results (174 votes). Check out past polls.