⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netjig.tcl

📁 This a good VPN source
💻 TCL
字号:
# $Id: netjig.tcl,v 1.49 2004/10/12 03:51:47 mcr Exp $global thepromptset theprompt {([a-zA-Z0-9]*):.*# }global managednetsset managednets {north south northpublic southpublic east west public admin}proc netjigdebug {msg} {    global env    if {[info exists env(NETJIGVERBOSE)]} {        puts stderr $msg    }}proc netjigcmddebug {msg} {    global env    if {[info exists env(NETJIGTESTDEBUG)]} {	if {$env(NETJIGTESTDEBUG) == "netjig"} {	    puts -nonewline stderr $msg	}    }}proc sendnjcmd {netjig cmd} {    global expect_out(buffer)    # expect -i $netjig "OK netjig>"    expect {    	-i $netjig	eof	{ puts stderr "EOF in sendnjcmd" }	timeout	{ puts stderr "timeout in sendnjcmd" }	"OK netjig>"    }    set ncmd [join $cmd]    netjigcmddebug "Sending $ncmd\n"    send -i $netjig "$ncmd\n"    #    exp_internal 1    expect {	-i $netjig	-re {OK ([0-9]*) LINES} {	    netjigcmddebug "There are $expect_out(1,string) lines of output\n"	    return $expect_out(1,string)	}	-re {FAIL ([0-9]*) LINES} {	    set lines $expect_out(1,string)	    puts "Command failed with output $lines!"	    exp_internal 1	    expect -i $netjig -re "netjig>"	    exit	}	timeout {	    puts "Timeout while talking to netjig for $cmd"	    puts stderr "Timeout while talking to netjig for $cmd"	    exit	}	    	eof {	    puts "EOF while talking to netjig for $cmd"	    puts stderr "EOF while talking to netjig for $cmd"	    exit	}	        }    netjigcmddebug "There are $expect_out(1,string) lines of output\n"    return $expect_out(1,string)}proc newswitch {netjig args} {    global env    global expect_out(buffer)    set lines [sendnjcmd $netjig "NEWSWITCH $args"]#    exp_internal 1    while {$lines > 0} {	expect {		-i $netjig		eof	{ puts stderr "EOF in newswitch" }		timeout	{ puts stderr "timeout in newswitch" }		-re {([^\r\n]*)=([^\r\n]*)}	}	set var   $expect_out(1,string)	set value $expect_out(2,string)	netjigcmddebug "Setting $var to $value|\n"	set env($var) $value	set lines [expr $lines - 1]    }}proc njcmd {netjig cmdline} {    global env    global expect_out(buffer)    set lines [sendnjcmd $netjig "$cmdline"]    while {$lines > 0} {	expect {		-i $netjig		timeout	{ puts stderr "timeout in njcmd" }		eof	{ puts stderr "EOF in njcmd" }		-re {([^\r\n]*)\n}	}	set lines [expr $lines - 1]    }}    proc playnjscript {netjig scriptname} {    set initscript [open $scriptname r]    while {[gets $initscript line] >= 0} {	# skip empty lines.	if {[string length [string trimright $line]] == 0} {	    continue;	}		njcmd $netjig $line    }}proc netjigsetup {netjig} {    global env    # set the packet replay rate, if necessary.    if {[info exists env(PACKETRATE)]} {	netjigdebug "setting PACKETRATE: $env(PACKETRATE)"	njcmd $netjig "setrate $env(PACKETRATE)"    }}proc expectprompt {umlid msg} {    global theprompt    trace variable expect_out(buffer) w log_by_tracing    expect {	-i $umlid	-re $theprompt {}	-re {^\<.\>.*\n}   { exp_continue }	-re {([^\r\n]*)\n} { exp_continue }	eof {	    puts "Cannot find prompt $msg (eof)"	    puts stderr "Can not find prompt $msg (eof)"	    shutdownumls	    exit;	}	timeout { 	    puts "Cannot find prompt $msg (timeout)"	    puts stderr "Can not find prompt $msg (timeout)"	    # this ought to be pointless:	    send -i $umlid "\n echo prompt missing \n"	    exit	}    }}proc playscript {umlid scriptname} {    global theprompt    trace variable expect_out(buffer) w log_by_tracing#    exp_internal 1    set initscript [open $scriptname r]    while {[gets $initscript line] >= 0} {	# skip empty lines.	if {[string length [string trimright $line]] == 0} {	    continue;	}		if {[string match [string index [string trimleft $line] 0] \#] == 0} {	    expectprompt $umlid "in playscript $scriptname"	    # eat any additional previous output	    expect -i $umlid -gl "*"	    send -i $umlid -- "$line\r"	}    }    close $initscript}proc record {netjig network recordfile} {    sendnjcmd $netjig "RECORDFILE --switchname=$network --recordfile=$recordfile\n"}proc setupplay {netjig network playfile} {    sendnjcmd $netjig "PLAYFILE --switchname=$network --playfile=$playfile\n"}proc waitplay {netjig} {    set timeout 900    sendnjcmd $netjig "WAITPLAY\n"}proc log_by_tracing {array element op} {    uplevel {	global consoleout	set id $expect_out(spawn_id)#	puts stderr "\n***** Tracing out ID: $id *******\n"	if {[ info exists consoleout($id) ]} {	    puts -nonewline $consoleout($id) $expect_out(buffer)	}    }}proc shutdown {umlname} {    system "uml_mconsole $umlname halt"}proc shutdownumls {} {    global umlid    global managed_hosts    foreach host $managed_hosts {	shutdown $host    }    foreach host $umlid(extra_hosts) {	shutdown $host    }}proc startuml {umlname} {    global umlid    global consoleout    if {[info exists umlid($umlname,consolefile)]} {	set console [open $umlid($umlname,consolefile) w]	puts $console "Starting UML $umlid($umlname,program)"    } else {	set console [open "OUTPUT/$umlname-console-default.txt" w]    }    netjigdebug "Starting UML $umlid($umlname,program) for $umlname"    set umlid($umlname,pid) [spawn $umlid($umlname,program) single]    set umlid($umlname,spawnid) $spawn_id    if {[info exists umlid($umlname,consolefile)]} {	puts $console "spawn $umlid($umlname,program) single"	netjigdebug "Capturing console output to $umlid($umlname,consolefile)"    }     set consoleout($umlid($umlname,spawnid)) $console}proc loginuml {umlname} {    global umlid    global theprompt        trace variable expect_out(buffer) w log_by_tracing    expect {    	-i $umlid($umlname,spawnid)	timeout	{ puts stderr "timeout in logginuml" }	eof	{ 	          puts stderr "EOF in loginuml"     	          shutdownumls	}	-exact "normal startup):"    }    netjigdebug "\nLogging in to $umlname"    send -i $umlid($umlname,spawnid) -- "root\r"}proc inituml {umlname} {    global umlid    global env    global theprompt        expectprompt $umlid($umlname,spawnid) "before loading module ($umlname)"    send -i $umlid($umlname,spawnid) -- "echo Starting loading module\r"    expectprompt $umlid($umlname,spawnid) "for bash exec ($umlname)"    send -i $umlid($umlname,spawnid) -- "exec bash --noediting\r"    expectprompt $umlid($umlname,spawnid) "for ulimit ($umlname)"    send -i $umlid($umlname,spawnid) -- "ulimit -c unlimited\r"    if {[info exists env(KLIPS_MODULE)]} {	puts stderr "Loading module into $umlname"	trace variable expect_out(buffer) w log_by_tracing	set expect_out(spawn_id) $umlid($umlname,spawnid)	set expect_out(buffer) ""	expectprompt $umlid($umlname,spawnid) "before recording memory level ($umlname)"	send -i $umlid($umlname,spawnid) -- "cat /proc/meminfo >/tmp/proc_meminfo-no-ipsec-mod-01\r" 	expectprompt $umlid($umlname,spawnid) "for insmod ($umlname)"	send -i $umlid($umlname,spawnid) -- "insmod /ipsec.o\r"    }     expectprompt $umlid($umlname,spawnid) "for post-insmod ($umlname)"    send -i $umlid($umlname,spawnid) -- "echo Finished loading module\r"    expectprompt $umlid($umlname,spawnid) "for klogd ($umlname)"    send -i $umlid($umlname,spawnid) -- "klogd -c 4 -x -f /tmp/klog.log\r"    if {[info exists umlid($umlname,initscript)]} {	playscript $umlid($umlname,spawnid) $umlid($umlname,initscript)	netjigdebug "$umlname Initialization done"    }}proc runXuml {umlname pass} {    global umlid    global env    global theprompt    # upcase host name    set uphost [string toupper $umlname]    set scriptname run${pass}script        set varname $uphost    append varname _RUN${pass}_SCRIPT    set_from_env $umlname $scriptname $varname    if {[info exists umlid($umlname,$scriptname)]} {	if {[info exists env(UML_GETTY)]} {	    send -i $umlid($umlname,spawnid) -- "echo You have 3600 seconds. >/dev/ttys/1\r"	    send -i $umlid($umlname,spawnid) -- "echo I would run $umlid($umlname,$scriptname) now >/dev/ttys/1\r"	    send -i $umlid($umlname,spawnid) -- "rm /etc/nologin\r"	    send -i $umlid($umlname,spawnid) -- "/sbin/getty ttys/1 38400\r"	    set timeout 3600	    expectprompt $umlid($umlname,spawnid) "UML_getty for $umlname"	} 	if {[file exists $umlid($umlname,$scriptname)]} {	    playscript $umlid($umlname,spawnid) $umlid($umlname,$scriptname)	    netjigdebug "$umlname run script($pass) $umlid($umlname,$scriptname) done"	    return 1	} else {	    puts stderr "runXuml($umlname,$pass): $umlid($umlname,$scriptname) does not exist."	    return 0	}    } else {	netjigdebug "$umlname no run script for pass $pass"	return 0    }}proc runuml {umlname} {    global umlid    global env    global theprompt    runXuml $umlname ""}proc run2uml {umlname} {    global umlid    global env    global theprompt    runXuml $umlname 2}proc initdns {umlname} {    global umlid    global env    global theprompt    expectprompt $umlid($umlname,spawnid) "for bash exec ($umlname)"    send -i $umlid($umlname,spawnid) -- "exec bash --noediting\r"    expectprompt $umlid($umlname,spawnid) "before sucking in profile ($umlname)"    send -i $umlid($umlname,spawnid) -- "source \$HOME/.profile\r"    expectprompt $umlid($umlname,spawnid) "before starting bind ($umlname)"    send -i $umlid($umlname,spawnid) -- "named\r"    expectprompt $umlid($umlname,spawnid) "after starting bind ($umlname)"    send -i $umlid($umlname,spawnid) -- "inetd\r"    expectprompt $umlid($umlname,spawnid) "after starting inetd ($umlname)"}proc killdns {umlname} {    global umlid        trace variable expect_out(buffer) w log_by_tracing    #exp_internal 1    netjigdebug "Sending halt to $umlname!"    send   -i $umlid($umlname,spawnid)     "halt -p -f\r"    netjigdebug "Waiting for final message"    expect {	-i $umlid($umlname,spawnid)	timeout	{ puts stderr "timeout in killdns" }	eof	{ puts stderr "EOF in killdns" }	-exact "Power down."     }    expect -i $umlid($umlname,spawnid) -gl "*"}proc killuml {umlname} {    global umlid    trace variable expect_out(buffer) w log_by_tracing    if {[info exists umlid($umlname,finalscript)]} {	playscript $umlid($umlname,spawnid) $umlid($umlname,finalscript)	netjigdebug "Finalscript done"    }     netjigdebug "Sending halt to $umlname!"    # absorb anything there.    expectprompt $umlid($umlname,spawnid) "for ipsec setup stop ($umlname)"    send   -i $umlid($umlname,spawnid)     "ipsec setup stop\r"    expectprompt $umlid($umlname,spawnid) "for klogd dump ($umlname)"    send -i $umlid($umlname,spawnid) "kill `cat /var/run/klogd.pid`; cat /tmp/klog.log\r"    expectprompt $umlid($umlname,spawnid) "for halt ($umlname)"    send   -i $umlid($umlname,spawnid)     "halt -p -f\r"    netjigdebug "Waiting for final message"    expect {	-i $umlid($umlname,spawnid)	timeout	{ puts stderr "timeout in killuml" }	eof	{ puts stderr "EOF in killuml" }	-exact "Power down."     }    expect -i $umlid($umlname,spawnid) -gl "*"}proc process_extra_host {optarg} {   global umlid   # format of arg is host=program[, ]host=program.   set hostlist [split $optarg ", "]   foreach hosttype $hostlist {       set h       [split $hosttype =]       set host    [lindex $h 0]       set program [lindex $h 1]       set umlid($host,program) $program       lappend umlid(extra_hosts) $host   }}proc set_from_env {host param varname} {    global umlid    global env        netjigdebug "Looking for $varname..."    if {[info exists env($varname)]} {	netjigdebug "found it: $env($varname)"	set umlid($host,$param) $env($varname)    }}# For each host, the following variables are examined:# ${HOST}_INIT_SCRIPT     the script to initialize the host with# ${HOST}_RUN_SCRIPT      the script to run the host with# ${HOST}_FINAL_SCRIPT    the script to run the host with# ${HOST}_START   the program to invoke the UML# REF_${HOST}_CONSOLE_OUTPUT      where to redirect the console output toproc process_host {host} {    global umlid    global env    # upcase me    set uphost [string toupper $host]    set varname $uphost    append varname _INIT_SCRIPT    set_from_env $host initscript $varname	    set varname $uphost    append varname _RUN_SCRIPT    set_from_env $host runscript $varname    set varname $uphost    append varname _RUN2_SCRIPT    set_from_env $host run2script $varname    set varname $uphost    append varname _FINAL_SCRIPT    set_from_env $host finalscript $varname        set varname $uphost    append varname _START    set_from_env $host program $varname        set varname REF_    append varname $uphost    append varname _CONSOLE_RAW    set_from_env $host consolefile $varname}    # {NORTH,SOUTH,EAST,WEST}_PLAY denotes a pcap file to play on that network# {NORTH,SOUTH,EAST,WEST}_REC  denotes a pcap file to reocrd into from that network## sets umlid(net$net,play) and umlid(net$net,record)#proc calc_net {net} {    global umlid    global env    if {[info exists umlid(net$net,play)]} {	set umlid(someplay) 1    }}proc process_net {net} {    global umlid    global env    # upcase me    set upnet [string toupper $net]    set umlid(net$net,arp) 0    set varname $upnet    append varname _PLAY    set_from_env net$net play $varname	    set varname $upnet    append varname _REC    set_from_env net$net record $varname    set varname $upnet    append varname _ARPREPLY    set_from_env net$net arp $varname    calc_net $net}match_max -d 10000# $Id: netjig.tcl,v 1.49 2004/10/12 03:51:47 mcr Exp $## $Log: netjig.tcl,v $# Revision 1.49  2004/10/12 03:51:47  mcr# 	make sure that UMLs run with core dumping enabled.## Revision 1.48  2004/05/05 17:55:20  mcr# 	fixed problem with getty not licking multiuser boot.## Revision 1.47  2004/05/04 20:05:35  mcr# 	use ttys/1 rather than tty1.## Revision 1.46  2004/05/04 19:51:46  mcr# 	make sure to send \r after each command.## Revision 1.45  2004/05/04 19:17:59  mcr# 	don't try getty unless we have a run command.## Revision 1.44  2004/05/04 18:06:04  mcr# 	if UML_GETTY is set, then start a getty before running each# 	runuml command.## Revision 1.43  2004/03/21 04:36:16  mcr# 	1) local switches now reads testparams.sh file.# 	2) $arpreply is totally deprecated.## Revision 1.42  2004/02/15 20:37:08  mcr# 	changed method by which we ask for --arpreply. We can't guess# 	it, as it doesn't work in all cases like that.## Revision 1.41  2004/02/15 00:12:00  mcr# 	--arpreply calculation was failing for situation# 	where the options were specified as arguments.# 	split process_net -> process_net/calc_net.## Revision 1.40  2004/02/15 00:02:06  mcr# 	debugging for ARPreply settings.## Revision 1.39  2004/02/05 02:15:51  mcr# 	added RCS ids.##

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -