From 6907585cf10bf56cc1d1124a6a909956c31e4139 Mon Sep 17 00:00:00 2001 From: Pascal Rigaux Date: Tue, 7 Aug 2001 19:42:58 +0000 Subject: add interactive_http --- perl-install/Makefile | 2 +- perl-install/Makefile.drakxtools | 16 ++-- perl-install/interactive_http.pm | 3 +- perl-install/standalone/interactive_http/Makefile | 16 ++++ .../interactive_http/interactive_http.cgi | 92 ++++++++++++++++++++++ .../standalone/interactive_http/miniserv.conf | 13 +++ .../standalone/interactive_http/miniserv.init | 51 ++++++++++++ .../standalone/interactive_http/miniserv.pam | 5 ++ .../standalone/interactive_http/miniserv.pl | 16 ++-- .../standalone/interactive_http/miniserv.users | 1 + 10 files changed, 200 insertions(+), 15 deletions(-) create mode 100644 perl-install/standalone/interactive_http/Makefile create mode 100755 perl-install/standalone/interactive_http/interactive_http.cgi create mode 100644 perl-install/standalone/interactive_http/miniserv.conf create mode 100644 perl-install/standalone/interactive_http/miniserv.init create mode 100644 perl-install/standalone/interactive_http/miniserv.pam create mode 100644 perl-install/standalone/interactive_http/miniserv.users (limited to 'perl-install') diff --git a/perl-install/Makefile b/perl-install/Makefile index 9e628f419..5810ebbe1 100644 --- a/perl-install/Makefile +++ b/perl-install/Makefile @@ -17,7 +17,7 @@ tar-drakxtools: clean cd .. ; rm -rf drakxtools ; cp -af perl-install drakxtools ; cp -af tools/ddcprobe tools/serial_probe drakxtools cd ../drakxtools ; perl -pi -e 's/^C_RPM.*/C_RPM=0/; s/^C_DRAKX.*/C_DRAKX=0/' c/Makefile cd ../drakxtools ; rm -rf install* pkgs.pm help.pm ftp.pm t.pm */CVS ; mv Makefile.drakxtools Makefile ; mv -f standalone/* . - cd .. ; tar cfj drakxtools.tar.bz2 --exclude CVS $(patsubst %,drakxtools/%,Makefile Makefile.config Newt c ddcprobe serial_probe share/po sbus_probing resize_fat share/diskdrake.rc share/wizard.rc $(STANDALONEPMS) icons pixmaps network *.pm) + cd .. ; tar cfj drakxtools.tar.bz2 --exclude CVS $(patsubst %,drakxtools/%,Makefile Makefile.config Newt c ddcprobe serial_probe share/po sbus_probing resize_fat share/diskdrake.rc share/wizard.rc $(STANDALONEPMS) icons pixmaps network interactive_http *.pm) cd .. ; rm -rf drakxtools $(DIRS): diff --git a/perl-install/Makefile.drakxtools b/perl-install/Makefile.drakxtools index c11afdd58..4ee04aade 100644 --- a/perl-install/Makefile.drakxtools +++ b/perl-install/Makefile.drakxtools @@ -1,6 +1,8 @@ include Makefile.config -DIRS = ddcprobe serial_probe share/po Newt c resize_fat +INLIBDEST_DIRS = Newt c resize_fat sbus_probing +HAVEINST_DIRS = share/po interactive_http +DIRS = $(INLIBDEST_DIRS) ddcprobe serial_probe NAME = libDrakX PREFIX = LIBDIR = $(PREFIX)/usr/lib @@ -21,11 +23,11 @@ $(DIRS): install -d auto rm standalone ; ln -s . standalone rm -f share/po/DrakX.pot # force rebuild of po's - $(MAKE) -C $@ + [ ! -e $@/Makefile ] || $(MAKE) -C $@ install: - install -d $(BINDEST) $(ETCDEST) $(SBINDEST) $(DATADIR) $(LIBDEST) $(NETLIBDEST) $(BINX11DEST) $(LIBX11DEST) $(PIXDIR) $(DIRS:%=$(LIBDEST)/%) - install -d $(LIBDEST)/sbus_probing + install -d $(BINDEST) $(ETCDEST) $(SBINDEST) $(DATADIR) $(LIBDEST) $(NETLIBDEST) $(BINX11DEST) $(LIBX11DEST) $(PIXDIR) + install -d $(INLIBDEST_DIRS:%=$(LIBDEST)/%) install $(STANDALONEPMS) $(SBINDEST) install -s ddcprobe/ddcxinfos serial_probe/serial_probe $(SBINDEST) ln -s ../../$(patsubst $(PREFIX)/usr%,%,$(SBINDEST))/XFdrake $(BINX11DEST)/Xdrakres @@ -35,12 +37,16 @@ install: install -m 644 pixmaps/* $(PIXDIR) install -m 644 share/diskdrake.rc $(ETCDEST) install -m 644 share/wizard.rc $(ETCDEST) + install -m 644 $(patsubst %,Newt/%.pm,Newt) $(LIBDEST)/Newt install -m 644 $(patsubst %,c/%.pm,stuff) $(LIBDEST)/c install -m 644 $(patsubst %,sbus_probing/%.pm,main) $(LIBDEST)/sbus_probing install -m 644 $(patsubst %,resize_fat/%.pm,main any boot_sector c_rewritten dir_entry directory fat info_sector io) $(LIBDEST)/resize_fat + find $(LIBDEST) -name "*.pm" | xargs perl -pi -e '$$_ = "\n" if /\s*use\s+(diagnostics|vars|strict)/' - $(MAKE) -C share/po install DATADIR=$(DATADIR) NAME=$(NAME) + for i in $(HAVEINST_DIRS); do \ + $(MAKE) -C $$i install PREFIX=$(PREFIX) DATADIR=$(DATADIR) NAME=$(NAME) ; \ + done cp -rfL auto icons $(LIBDEST) diff --git a/perl-install/interactive_http.pm b/perl-install/interactive_http.pm index 2bf8ab616..a30b882f5 100644 --- a/perl-install/interactive_http.pm +++ b/perl-install/interactive_http.pm @@ -11,6 +11,7 @@ use interactive; use common; use log; +my $script_name = $ENV{INTERACTIVE_HTTP}; my $no_header; my $uid; my $pipe_r = "/tmp/interactive_http_r"; @@ -63,7 +64,7 @@ sub ask_from_entries_refW { # print $q->img({ -src => "/icons/$o->{icon}" }) if $o->{icon}; print @{$common->{messages}}; - print $q->start_form(-name => 'form', -action => '/cgi-bin/interactive_http', -method => 'get'); + print $q->start_form(-name => 'form', -action => $script_name, -method => 'post'); print "\n"; diff --git a/perl-install/standalone/interactive_http/Makefile b/perl-install/standalone/interactive_http/Makefile new file mode 100644 index 000000000..535d06d99 --- /dev/null +++ b/perl-install/standalone/interactive_http/Makefile @@ -0,0 +1,16 @@ +NAME=libDrakX +FNAME=$(NAME)/drakxtools_http +PREFIX= +DATADIR=$(PREFIX)/usr/share + +all: + +install: + install -D miniserv.init $(PREFIX)/etc/init.d/drakxtools_http + install -D -m 644 miniserv.conf $(PREFIX)/etc/drakxtools_http.conf + install -D -m 644 miniserv.pam $(PREFIX)/etc/pam.d/miniserv + + install -d $(DATADIR)/$(FNAME)/www + install -m 644 miniserv.pl miniserv.pem miniserv.users $(DATADIR)/$(FNAME) + install -m 644 index.html $(DATADIR)/$(FNAME)/www + install interactive_http.cgi $(DATADIR)/$(FNAME)/www diff --git a/perl-install/standalone/interactive_http/interactive_http.cgi b/perl-install/standalone/interactive_http/interactive_http.cgi new file mode 100755 index 000000000..cb184300a --- /dev/null +++ b/perl-install/standalone/interactive_http/interactive_http.cgi @@ -0,0 +1,92 @@ +#!/usr/bin/perl + +use lib qw(/usr/lib/libDrakX); +use CGI; +use common; +use c; + +my $q = CGI->new; +$| = 1; + +my $script_name = $q->url(-relative => 1); + +# name inversed (must be in sync with interactive_http.html) +my $pipe_r = "/tmp/interactive_http_w"; +my $pipe_w = "/tmp/interactive_http_r"; + +if ($q->param('state') eq 'new') { + force_exit_dead_prog(); + mkfifo($pipe_r); mkfifo($pipe_w); + + spawn_server($q->param('prog')); + first_step(); + +} elsif ($q->param('state') eq 'next_step') { + next_step(); +} else { + error("booh..."); +} + +sub read_ { + local *F; + open F, "<$pipe_r" or error("Failed to connect to the prog"); + my $t; + print $t while sysread F, $t, 1; +} +sub write_ { + local *F; + open F, ">$pipe_w" or die; + my $q = CGI->new; + $q->save(\*F); +} + +sub first_step { read_() } +sub next_step { write_(); read_() } + + +sub force_exit_dead_prog { + -p $pipe_w or return; + { + local *F; + sysopen F, $pipe_w, 1 | c::O_NONBLOCK() or return; + syswrite F, "force_exit_dead_prog=1\n"; + } + + my $cnt = 10; + while (-p $pipe_w) { + sleep 1; + $cnt-- or error("Dead prog failed to exit"); + } +} + +sub spawn_server { + my ($prog) = @_; + + fork and return; + + $ENV{INTERACTIVE_HTTP} = $script_name; + + open STDIN, "/dev/null"; #tmp/log"; + open STDERR, ">&STDOUT"; + + c::setsid(); + exec $prog or die "prog $prog not found\n"; +} + +sub error { + my $msg = join '', @_; + + print $q->header(), $q->start_html(); + print $q->h1(_("Error")), @_; + print $q->end_html(), "\n"; + exit 0; +} + +sub mkfifo { + my ($f) = @_; + -p $f and return; + unlink $f; + syscall_('mknod', $f, c::S_IFIFO() | 0600, 0) or die "mkfifo failed"; + chmod 0666, $f; +} diff --git a/perl-install/standalone/interactive_http/miniserv.conf b/perl-install/standalone/interactive_http/miniserv.conf new file mode 100644 index 000000000..99f6a5172 --- /dev/null +++ b/perl-install/standalone/interactive_http/miniserv.conf @@ -0,0 +1,13 @@ +ssl=1 +log=1 +port=10001 +listen=10001 +forkcgis=1 +realm=Drakxtools Server + +addtype_cgi=internal/cgi +logfile=/var/log/drakxtools_http.log +pidfile=/var/run/drakxtools_http.pid +root=/usr/share/libDrakX/drakxtools_http/www +keyfile=/usr/share/libDrakX/drakxtools_http/miniserv.pem +userfile=/usr/share/libDrakX/drakxtools_http/miniserv.users diff --git a/perl-install/standalone/interactive_http/miniserv.init b/perl-install/standalone/interactive_http/miniserv.init new file mode 100644 index 000000000..39c724dc7 --- /dev/null +++ b/perl-install/standalone/interactive_http/miniserv.init @@ -0,0 +1,51 @@ +#!/bin/sh +# chkconfig: 235 99 00 +# description: Start or stop the miniserv administration server + +name=drakxtools_http +server=/usr/share/libDrakX/$name/miniserv.pl + +case "$1" in +'start') + echo -n "Starting $name: " + perl $server /etc/$name.conf + touch /var/lock/subsys/drakxtools_http + echo $name + ;; +'stop') + echo -n "Shutting down $name: " + kill `cat /var/run/$name.pid` + rm -f /var/lock/subsys/drakxtools_http + echo $name + ;; +'status') + if [ -s /var/run/$name.pid ]; then + pid=`cat /var/run/$name.pid` + kill -0 $pid >/dev/null 2>&1 + if [ "$?" = "0" ]; then + echo "$name (pid $pid) is running" + else + echo "$name is stopped" + fi + else + echo "$name is stopped" + fi + ;; +'restart') + $0 stop + $0 start + ;; +'reload') + $0 stop + $0 start + ;; +'condrestart') + if [ -f /var/lock/subsys/drakxtools_http ]; then + $0 restart + fi + ;; +*) + echo "Usage: $0 {start|stop|restart|status|reload|condrestart}" + ;; +esac +exit 0 diff --git a/perl-install/standalone/interactive_http/miniserv.pam b/perl-install/standalone/interactive_http/miniserv.pam new file mode 100644 index 000000000..37eae44e0 --- /dev/null +++ b/perl-install/standalone/interactive_http/miniserv.pam @@ -0,0 +1,5 @@ +#%PAM-1.0 +auth required /lib/security/pam_stack.so service=system-auth +account required /lib/security/pam_stack.so service=system-auth +password required /lib/security/pam_stack.so service=system-auth +session required /lib/security/pam_stack.so service=system-auth diff --git a/perl-install/standalone/interactive_http/miniserv.pl b/perl-install/standalone/interactive_http/miniserv.pl index f866ee81a..b11ce26e2 100644 --- a/perl-install/standalone/interactive_http/miniserv.pl +++ b/perl-install/standalone/interactive_http/miniserv.pl @@ -58,7 +58,7 @@ if ($config{'syslog'}) { eval "use Authen::PAM"; if (!$@) { # check if the PAM authentication can be used by opening a handle - if (! ref($pamh = new Authen::PAM("webmin", "root", \&pam_conv_func))) { + if (! ref($pamh = new Authen::PAM("miniserv", "root", \&pam_conv_func))) { print STDERR "PAM module available, but error during init !\n"; print STDERR "Disabling PAM functions.\n"; } @@ -159,7 +159,7 @@ if ($use_ssl) { # Setup syslog support if possible and if requested if ($use_syslog) { - eval { openlog("webmin", "cons,pid,ndelay", "daemon") }; + eval { openlog("miniserv", "cons,pid,ndelay", "daemon") }; $use_syslog = 0 if ($@); } @@ -268,7 +268,7 @@ die "Failed to bind port $config{port} : $!" if ($i == 5); listen(MAIN, SOMAXCONN); if ($config{'listen'}) { - # Open the socket that allows other webmin servers to find this one + # Open the socket that allows other miniserv servers to find this one $proto = getprotobyname('udp'); if (socket(LISTEN, PF_INET, SOCK_DGRAM, $proto)) { setsockopt(LISTEN, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)); @@ -507,7 +507,7 @@ while(1) { } if ($config{'listen'} && vec($rmask, fileno(LISTEN), 1)) { - # Got UDP packet from another webmin server + # Got UDP packet from another miniserv server local $rcvbuf; local $from = recv(LISTEN, $rcvbuf, 1024, 0); next if (!$from); @@ -710,7 +710,7 @@ if (@deny && &ip_match($acptip, $localip, @deny) || if ($use_libwrap) { # Check address with TCP-wrappers - if (!hosts_ctl("webmin", STRING_UNKNOWN, $acptip, STRING_UNKNOWN)) { + if (!hosts_ctl("miniserv", STRING_UNKNOWN, $acptip, STRING_UNKNOWN)) { &http_error(403, "Access denied for $acptip"); return 0; } @@ -739,8 +739,8 @@ if (%users) { $blocked = 0; # Session authentication is never used for connections by - # another webmin server - if ($header{'user-agent'} =~ /webmin/i) { + # another miniserv server + if ($header{'user-agent'} =~ /miniserv/i) { $config{'session'} = 0; } @@ -1783,7 +1783,7 @@ return 0 if (!$_[0] || !$users{$_[0]}); if ($users{$_[0]} eq 'x' && $use_pam) { $pam_username = $_[0]; $pam_password = $_[1]; - local $pamh = new Authen::PAM("webmin", $pam_username, \&pam_conv_func); + local $pamh = new Authen::PAM("miniserv", $pam_username, \&pam_conv_func); if (!ref($pamh)) { print STDERR "PAM init failed : $pamh\n"; return 0; diff --git a/perl-install/standalone/interactive_http/miniserv.users b/perl-install/standalone/interactive_http/miniserv.users new file mode 100644 index 000000000..f7338497a --- /dev/null +++ b/perl-install/standalone/interactive_http/miniserv.users @@ -0,0 +1 @@ +root:x:0 -- cgit v1.2.1