Webmin - Perl - Rückgabewerte von Shell zu Webmin


LeDoc

New Member
hallo.
ich habe schon öfter hier in dem forum herumgestöbert und hilfreiche sachen gefunden und da ich mit meinem problem"chen" nicht weiterkomme, hoffe ich, dass mir hier weitergeholfen werden kann.

das problem im einzelnen:
ich versuche mich derzeit mit perl/cgi unter webmin eigene module zu entwickeln, bin aber in perl noch nicht so wirklich bewandert.
leider finde ich im web auch wenig tutorials zum entwickeln von modulen unter webmin und das handbuch zu webmin, was zwar >800 seiten stark ist, hilft mir leider auch wenig weiter.
(vlt. weiss jemand ja an dieser stelle eine gute tutorialseite dazu).

also.....
ich möchte gerne mit einem selbst erstellten modul diverse server starten, stoppen, restarten etc. können.
ich weiss, dass geht auch prima mit selbst erstellten commands, was ich auch schon hinbekommen habe, aber ich bräuchte letztendlich doch das ganze in modulform.

starten, stoppen etc klappt auch schon, allerdings hätte ich gerne die rückgabewerte, die man normalerweise von der shell erhällt auch in webmin angezeigt (quasi wie bei den selbsterstellten commands).
ist bestimmt recht einfach, allerdings komme ich nicht drauf :)

hier mal mein beispielcode für das starten eines servers:
Code:
#Funktion zum Starten von Apache2
sub start_apache2
	{
	$cmd = system("/etc/init.d/apache2 start");
	print $cmd;
	}

mit "return" und danach "print" in der "main" komme ich auch nicht weiter...

weiss jemand abhilfe?
das wäre klasse...

vielen dank im voraus,
Doc
 
Die Funktion "system()" gibt den Return-Code des ausgeführten Programms zurück. D.h. wenn der Aufruf "0" zurückgibt, dann war das ein Erfolg! (Dein Programm sollte daher "0" ausgeben)
Bedenke: in deiner gezeigten Variante wird noch ein weiter Shell-Interpreter gestartet. Ein bessere Alternative wäre:

Code:
system('/bin/sh', '/etc/init.d/apache2', 'start');

Das startet nur eine Shell, die dein Skript ausführt.

Noch besser wäre, das Shell-Skript (/etc/init.d/apache2) direkt in Perl-Code umzuschreiben. Daemonisierung kann auch Perl.

Achja: Wenn du ein Programm ausführen möchtest, und deren Ausgabe weiterverarbeiten musst, dann solltest du die Funktion "open()" zum Ausführen verwenden. ("perldoc -f open" zeigt dir, wie es geht)
 
Last edited by a moderator:
guten morgen und vielen dank, terx.

habe das problem nun so gelöst:
Code:
#Funktion zum Starten von Apache2
sub stop_apache2
	{
	&clean_environment();
	$out = &backquote_logged("/etc/init.d/apache2 stop 2>&1");
	&reset_environment();
	print "<div align=center><pre>$out</pre></div>";
	}

habe nunmehr auch herausgefunden, dass die systemvariable $? auch den rückgabewert enthällt.
habe dann bezüglich einer statusabfrage vom server das ganze so geregelt.

als bsp. hier mal eine prüfung, ob in der htmlseite das wort "works" von "It works" vorkommt:
Code:
sub online_check
		{
		#Überprüfung der Seite, ob das wort "works" darin gefunden werden kann
		$check_site = &backquote_logged("lwp-request http://dynamic1245/ | grep -c 'works'");
		print $text{'search_string1'};
		if (!$?) {
			print "Server ist online...<p>";
			} else {
			print "Server ist offline...<p>";
			}
		}


nun aber eine andere frage...
hab schon laaaaaaange nix mehr mit html gemacht und schon gar nicht mit formularen...hehe

ich denke, dass ich das megaumständlich gemacht habe, was das aufrufen der subroutinen angeht.
habe nämlich für jede routine eine eigene .cgi angelegt und rufe die dann via form auf.

das ganze sieht dann so aus:

Code:
#!/usr/bin/perl
# list.cgi
# Testen von Modulerstellungen
require './foobar-lib.pl','./ui-lib.pl','./shell-lib.pl';
&ReadParse();

# Titel der Seite, welcher aus der /lang/en bei "index_titel" entnommen wird

&ui_print_header(undef, $text{'index_title'}, "", undef,
		 $module_info{'usermin'} ? 0 : 1, 1,
		 undef, undef, undef,
	"onLoad='window.scroll(0, 10000); document.forms[0].cmd.focus()'");

print "<p>\n";

#Webmin Tabelle initiieren
print &ui_table_start($text{'table_index'}, "width=100%", 4);

#$pwd = &get_current_dir();
#print $pwd,"<p><p>";

#TESTUMGEBUNG
print &ui_form_start("server_check.cgi", "form-data");
print "<p>\n";
print "<H1><a href='server_check.cgi'>Apache Test</a></H1>";
print "<p>\n";
print &ui_form_end();


#Server Starten
print "$text{'index_desc'}<br>\n";
print &ui_form_start("server_start.cgi", "form-data");

print "<p>\n";
print "<p>\n";
print "<input type=submit name=testbutton ",
		"value='$text{'start_button'}' ";
print "<p>\n";
print &ui_form_end();

#Server Stoppen
print &ui_form_start("server_stop.cgi", "form-data");
print "<p>\n";
print "<input type=submit name=testbutton ",
		"value='$text{'stop_button'}' ";
print "<p>\n";
print &ui_form_end();

#Server prüfen
print &ui_form_start("server_check.cgi", "form-data");
print "<p>\n";
print "<input type=submit name=testbutton ",
		"value='$text{'check_button'}' ";
print "<p>\n";
print &ui_form_end();

#Server prüfen
print &ui_form_start("site_check.cgi", "form-data");
print "<p>\n";
print "<input type=submit name=testbutton ",
		"value='$text{'site_check_button'}' ";
print "<p>\n";
print &ui_form_end();
		
ui_table_end();

&footer("", $text{'index_return'});

exit();

bin mir eigentlich sicher, dass dies suboptimal ist, auch wenn es funktioniert.
hat jemand tipps&tricks, wie ich das optimieren könnte?

ich danke herzlichst im voraus.
gruss,
Doc



[EDIT:]
dann hätte ich da noch eine frage...
was genau kommt in die "config"-datei, welche im moduleverzeichniss liegen sollte/kann/muss?
ich wollte o.g. funktion so umwandeln, dass es auf eine variable in der config zugreift, um dort die serverseite auszulesen, welche sich öfter ändern könnte.
habe halt in der config dies hier angelegt:
server_page1=http://dyn7169/

und den code wie folgt angepasst:
Code:
sub online_check
		{
		#Überprüfung der Seite, ob das wort "works" darin gefunden werden kann
		$check_site = &backquote_logged("lwp-request [COLOR="Red"]$config{'server_page1'}[/COLOR] | grep -c $text{'search_string1'}");
		print $ENV;
		if (!$?) {
			print "Server ist online...<p>";
			} else {
			print "Server ist offline...<p>";
			}
		}

leider tut sich bei mir nichts...
was mache ich falsch?

fragen über fragen... hehehe
wie schon erwähnt... kenne micht nicht wirklich mit perl aus.
komme eher aus dem java sektor :)


[NOCH EIN EDIT:]
hmmmpf... habe durch einen dummen zufall das problem mit der config gefunden...
das module schaut in der /etc/webmin/modulename/ nach der config und nicht, wie ich annahm im modulverzeichniss unter /usr/share/webmin/modulname.

ich hätte das ja lieber im modulverzeichniss gehabt.
ist das standard oder kann man das ändern?
bzw. sollte man das überhaupt ändern?
 
Last edited by a moderator:
Code:
$check_site = &backquote_logged("lwp-request ".$config{'server_page1'}." | grep -c ".$text{'search_string1'}."");

Versuch es mal so, sonst fällt mir dazu jetzt auch nichts ein. Du solltest anfangen, dich mit Perl intensiver auseinander zu setzen, was du vielleicht brauchst geht schon ein wenig tiefer rein. (Ausführen von Programmen, Rückgabewerte, Dämonen und Zombies (die einen dein Freund, die anderen dein Feind))
 
mein o.g. funktioniert ja nun, nachdem ich das mit der config herausgefunden habe.
wüsste halt im moment nicht, warum die config im moduledirectory übergangen wird.

würde mich schon gern intensiv mit perl befassen, aber dazu fehlt mir leider die zeit. :(
gibts denn ne gute tutorialseite, wo man perl auch im bezug auf webmin erlernen könnte?
denn das handbuch von webmin setzt schon gute perlkenntnisse vorraus, wie mir scheint.


demons kenne ich noch von java :)

und hast du vlt. auch noch verbesserungsvorschläge zu dem formularteil?
kann mir irgendwie nicht vorstellen, dass man für jede buttonfunktion eine eigene .cgi anlegen muss.
 
Perl in Bezug auf Webmin lernen, wird es wohl nicht geben, dafür ist Perl zu umfassend und Webmin zu speziell.

Ein gutes Buch finde ich z.B. "Perl für Dummies", womit ich auch angefangen habe. Die Perl-eigenen Dokumentationen (man perl) sind ein gutes Nachschlagewerk zu speziellen Dingen, vor allem die Prozesssteuerung. Von O'Reilly gibts auch gute Bücher, da kann ich dir das "Perl Cookbook" als weiterführende Lektüre empfehlen
 
vielen dank.
werd mal sehen, was ich davon brauche.
für perl selbst gibt es ja auch ganz brauchbare onlinetutorials.

webmin selbst benutzt ja interne methoden und systemvariablen, und wenn man da mehr einblick hätte, war das klasse.

aber wie heisst es so schön...
learning by doing ;)
 

Back
Top