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: #} |