#!/depot/path/tclsh

package require cgi

cgi_eval {
    source example.tcl

    cgi_input

    cgi_title "Kill runaway CGI processes"

    cgi_body {
	if {0==[catch {cgi_import PidList}]} {
	    catch {cgi_import Refresh;set PidList {}}
	    cgi_import Sig
	    h4 "If this were not a demo, the following commands would be executed:"
	    foreach pid $PidList {
		# to undemoize this and allow processes to be killed,
		# change h5 to exec and remove the quotes
		if [catch {h5 "kill -$Sig $pid"} msg] {
		    h4 "$msg"
		}
	    }
	}

	cgi_form kill {
	    set ps /bin/ps
	    if [file exists /usr/ucb/ps] {
		set ps /usr/ucb/ps
	    }

	    set f [open "|$ps -auxww" r]
	    table border=2 {
		table_row {
		    table_data {puts kill}
		    table_data {cgi_preformatted {puts [gets $f]}}
		}
		while {-1 != [gets $f buf]} {
		    if [regexp "$argv0" $buf] continue
		    if ![regexp "^nobody" $buf] continue
		    table_row {
			table_data {
			    scan $buf "%*s %d" pid
			    cgi_checkbox PidList=$pid
			}
			table_data {
			    cgi_preformatted {puts $buf}
			}
		    }
		}
		
	    }

	    submit_button "=Send signal to selected processes"
	    submit_button "Refresh=Refresh listing"
	    reset_button

	    br; radio_button "Sig=TERM" checked; puts "SIGTERM: terminate gracefully"
	    br; radio_button "Sig=KILL";	 puts "SIGKILL: terminate ungracefully"
	    br; radio_button "Sig=STOP";	 puts "SIGSTOP: suspend"
	    br; radio_button "Sig=CONT";	 puts "SIGCONT: continue"

	    p "SIGSTOP and SIGCONT are particularly useful if the
	    processes aren't yours and the owner isn't around to ask.
	    Suspend them and let the owner decide later whether to
	    continue or kill them."
	}
    }
}
