5748995 [rkeene@sledge /home/rkeene/projects/commander]$ cat -n commander.tcl
   1: #!/usr/bin/tcl -n
   2: 
   3: proc GetHomeDir {username} {
   4: 	catch { set pid [open /etc/passwd r] }
   5: 	if {![info exists pid]} { return "/" }
   6: 	while {![eof $pid]} {
   7: 		gets $pid ln
   8: 		set ln [split $ln :]
   9: 		set utmp [lindex $ln 0]
  10: 		if {$utmp==$username} { close $pid; return [lindex $ln 5] }
  11: 	}
  12: 	close $pid
  13: 	return "/"
  14: }
  15: 
  16: proc ExtractAddr {line} {
  17: 	set tmp [split $line <>]
  18: 	if {[string trim [lindex $tmp 1]]!=""} { return [string trim [lindex $tmp 1]] }
  19: 	return [string trim [lindex $tmp 0]]
  20: }
  21: 
  22: proc ExtractIp {line} {
  23: 	if {[regexp {\[[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\]} $line ret]} {
  24: 		return [lindex [split $ret \[\]] 1]
  25: 	}
  26: 	return "127.0.0.1"
  27: }
  28: 
  29: proc SendEmailReply {msg {subj ""}} {
  30: 	global CmdRespLen CmdAddr SrcAddr
  31: 	if {$subj!=""} {
  32: 		set subj "-s \"$subj\""
  33: 	}
  34: 	if {$msg!=""} {
  35: 		set msg [Shorten $msg $CmdRespLen]
  36: 		set mId [open "|/usr/local/bin/shmail -f $CmdAddr $subj $SrcAddr" w]
  37: 		puts $mId $msg
  38: 		close $mId
  39: 	}
  40: }
  41: 
  42: proc Shorten {msg len} {
  43:         if {[string length $msg]<=$len} { return $msg }
  44:         foreach ch {. { } , * $} { regsub -all "\\$ch\\$ch*" $msg "$ch" msg }
  45:         if {[string length $msg]<=$len} { return $msg }
  46:         regsub -nocase -expanded -all {\m(a|the)\M} $msg {} msg
  47:         foreach ch {. { } , * $} { regsub -all "\\$ch\\$ch*" $msg "$ch" msg }
  48:         if {[string length $msg]<=$len} { return $msg }
  49:         foreach ch {. { } , * $} { regsub -all "\\$ch\\$ch*" $msg "$ch" msg }
  50:         if {[string length $msg]<=$len} { return $msg }
  51:         set omsg $msg
  52:         set msg [join [split $msg {|}] ", "]
  53:         foreach ch {. { } , * $} { regsub -all "\\$ch\\$ch*" $msg "$ch" msg }
  54:         regsub -all {  *,} $msg  {,} msg
  55:         if {[string length $msg]<=$len} { return $msg }
  56:         if {[string length $omsg]<=[string length $msg]} { set msg $omsg }
  57:         set msg [string map {:00 "" " - " "-" "'" ""} $msg]
  58:         if {[string length $msg]<=$len} { return $msg }
  59:         foreach {w r} {to 2 you u gee G thanks thx please pls ate 8} {
  60:                 regsub -nocase -expanded -all "\\m$w\\M" $msg $r msg
  61:         }
  62:         if {[string length $msg]<=$len} { return $msg }
  63:         set msg [string map -nocase {to 2 you u gee G thanks thx please pls ate 8} $msg]
  64:         if {[string length $msg]<=$len} { return $msg }
  65:         foreach word [split $msg] {
  66:                 if {[string length $word]>=4} {
  67:                         regsub -all {[aeoiu]} $word {} word
  68:                 }
  69:                 lappend outmsg $word
  70:         }
  71:         set msg [join $outmsg]
  72:         if {[string length $msg]<=$len} { return $msg }
  73:         set msg [string map {, "" | ""} $msg]
  74:         if {[string length $msg]<=$len} { return $msg }
  75:         return $msg
  76: }
  77: 
  78: 
  79: #catch {
  80: 
  81: 	set NeedUpdate 0
  82: 	set UserName [id user]
  83: 	set HomeDir [GetHomeDir $UserName]
  84: 	if {![file exists ${HomeDir}/.commander/auth]} { return OK }
  85: 	set tmpId [open ${HomeDir}/.commander/auth]
  86: 	gets $tmpId CmdAddrs
  87: 	close $tmpId
  88: 	if {$CmdAddrs==""} { return OK }
  89: 	set CmdAddr [lindex $CmdAddrs 0]
  90: 	set CmdAddrSrc [lindex $CmdAddrs 1]
  91: 	set CmdAddrIp [lindex $CmdAddrs 2]
  92: 	set CmdAllowed [lindex $CmdAddrs 3]
  93: 	set CmdRespLen [lindex $CmdAddrs 4]
  94: 	catch { source ${HomeDir}/.commander/local.tcl }
  95: 	if {![info exists env(HOME)]} { set env(HOME) ${HomeDir} }
  96: 	if {![string is integer -strict $CmdRespLen]} { set CmdRespLen 9999999 }
  97: 
  98: 	while {![eof stdin]} {
  99: 		gets stdin line
 100: 		lappend Lines $line
 101: 	}
 102: 	foreach line $Lines {
 103:                 set ln [split $line " "]
 104: 		switch -- "[string tolower [lindex $ln 0]]" {
 105: 			"received:" {
 106: 				if {![info exists SrcAddrIp]} {
 107: 					set SrcAddrIp [ExtractIp [lrange $ln 1 end]]
 108: 					set Matched 0
 109: 					foreach Chk $CmdAddrIp {
 110: 						if {[string match $Chk $SrcAddrIp]} { set Matched 1; break }
 111: 					}
 112: 					if {!$Matched && $CmdAddrIp!=""} { return OK }
 113: 				}
 114: 			}
 115: 			"from:" {
 116: 				if {![info exists SrcAddr]} {
 117: 					set SrcAddr [ExtractAddr [lrange $ln 1 end]]
 118: 					set Matched 0
 119: 					foreach Chk $CmdAddrSrc {
 120: 						if {[string match $Chk $SrcAddr]} { set Matched 1; break }
 121: 					}
 122: 					if {!$Matched && $CmdAddrSrc!=""} { return OK }
 123: 				}
 124: 				catch { source ${HomeDir}/.commander/vars-[string tolower ${SrcAddr}] }
 125: 			}
 126: 			"subject:" {
 127: 				if {![info exists Subject]} { set Subject [lrange $ln 1 end] }
 128: 				if {[string tolower $Subject]!="cmd"} { return OK }
 129: 			}
 130: 			"to:" {
 131: 				if {![info exists DestAddr]} {
 132: 					set DestAddr [ExtractAddr [lrange $ln 1 end]]
 133: 					if {$DestAddr!=$CmdAddr} { return OK }
 134: 				}
 135: 			}
 136: 			"@" {
 137: 				if {[info exists Subject] && [info exists SrcAddr] && [info exists DestAddr] && [info exists SrcAddrIp]} {
 138: 					set wrk [split $ln]
 139: 					set cmd [lindex $ln 1]
 140: 					set args [join [lrange $ln 2 end]]
 141: 					set Matched 0
 142: 					foreach Chk $CmdAllowed {
 143: 						if {[string match $Chk $cmd]} { set Matched 1; break }
 144: 					}
 145: 					if {!$Matched && $CmdAllowed!=""} { return OK }
 146: 					catch {
 147: 						set outId [open ${HomeDir}/.commander/log a+]
 148: 						puts $outId [list $SrcAddr $SrcAddrIp [clock seconds] [list $cmd $args]]
 149: 						close $outId
 150: 						catch {
 151: 							set res [$cmd $args]
 152: 							set NeedUpdate 1
 153: 						} reserr
 154: 						if {![info exists res] && [info exists reserr]} {
 155: 							set res $reserr
 156: 						}
 157: 						SendEmailReply "$res"
 158: 
 159: 					}
 160: 				}
 161: 			}
 162: 		}
 163: 	}
 164: 
 165: 	set StoreVars [lmatch [info globals] "STORE_*"] 
 166: 	if {$StoreVars!="" && $NeedUpdate} {
 167: 		set sid [open "${HomeDir}/.commander/vars-[string tolower ${SrcAddr}]" w]
 168: 		foreach var $StoreVars {
 169: 			if {[array exists $var]} {
 170: 				foreach idx [array names $var] {
 171: 					set val [subst "\$$var\($idx\)"]
 172: 					puts $sid [list set $var\($idx\) $val]
 173: 				}
 174: 			} else {
 175: 				set val [subst "\$$var"]
 176: 				puts $sid [list set $var $val]
 177: 			}
 178: 		}
 179: 		close $sid
 180: 	}
 181: 
 182: 	return OK
 183: #} err
 184: 
 185: #if {[info exists err]} {
 186: #	if {$err!="OK"} {
 187: #		catch { set errId [open /tmp/CommanderErrorLog.txt a+] }
 188: #		if {[info exists errId]} {
 189: #			puts $errId $err
 190: #			close $errId
 191: #		}
 192: #	}
 193: #}
5748996 [rkeene@sledge /home/rkeene/projects/commander]$

Click here to go back to the directory listing.
Click here to download this file.
last modified: 2002-11-19 23:20:01