#!/usr/local/bin/perl
# This program is designed to be called via HTTP requests from programs, and
# simply passes on parameters to a specified command-line program
package virtual_server;
require './virtual-server-lib.pl';
&ReadParse();
&can_remote() || &error($text{'remote_ecannot'});
use subs qw(exit);
if (!$in{'program'}) {
# Tell the user what needs to be done
print "Content-type: text/plain\n\n";
print "This CGI is designed to be invoked by other programs wanting\n";
print "to perform some Virtualmin action programatically, such as\n";
print "creating or modifying domains and users.\n\n";
print "You must supply at least the CGI parameter 'program', which\n";
print "specifies which of the Virtualmin command-line scripts to\n";
print "run. You must also supply appropriate parameters to the\n";
print "program, similar to those that it accepts on the Unix command\n";
print "line. For example, the change the password for a server, you\n";
print "would request a URL like :\n\n";
print "http://yourserver:10000/virtual-server/remote.cgi?program=modify-domain&domain=foo.com&pass=somenewpassword\n\n";
print "All output from the command will be returned to the caller.\n";
exit;
}
# Build the arg list
$in{'program'} =~ /^[a-z0-9\.-]+$/i || &error($text{'remote_eprogram'});
$cmd = "$module_root_directory/$in{'program'}.pl";
-x $cmd || &error(&text('remote_eprogram2', "$cmd"));
@args = ( );
foreach $i (keys %in) {
next if ($i eq "program");
if ($in{$i} eq "") {
push(@args, "--".$i);
}
else {
foreach $v (split(/\0/, $in{$i})) {
push(@args, "--".$i, $v);
}
}
}
# Setup handler if script calls exit
sub exit
{
print "\n";
print "Exit status: $_[0]\n";
CORE::exit(0);
}
# Run the script within this same Perl process
print "Content-type: text/plain\n\n";
@ARGV = @args;
do $cmd;
print "\n";
print "Exit status: 0\n";
#&open_execute_command(OUT, "$cmd 2>&1", 1);
#while() {
# print $_;
# }
#close(OUT);
#print "\n";
#print "Exit status: $?\n";