Home > Code, TCL > nslookup.tcl

nslookup.tcl

#### nslookup.tcl v1.0.1 #######################################################
################################################################################
## Written by:                                                                ##
##   KuNgFo0  (http://www.eggfaq.com/).                                       ##
##                                                                            ##
## Modified by:                                                               ##
##   Brian Schmidt aka. brianMan.                                             ##
################################################################################

#### Readme / Help #############################################################
################################################################################
## This is a slightly modified version of KuNgFoO's nslookup.tcl v0.5 script. ##
##                                                                            ##
## Script that can do nslookups.                                              ##
##                                                                            ##
## Usage:                                                                     ##
##   To have the .dns command available on a channel you need to set the      ##
##   channel flag +nslookups from the console/partyline .                     ##
##   ``.chanset #channel +nslookups´´                                         ##
##                                                                            ##
## Channel Commands (available only if channel is +nslookups):                ##
##   .dns [ host|ip|nick[ host|ip|nick][ ...]]                                ##
## Example:                                                                   ##
##   ``.dns www.eggfaq.com´´                                                  ##
################################################################################

#### Changelog #################################################################
################################################################################
## v1.0.1                                                                     ##
## * Minor code cleanup                                                       ##
##                                                                            ##
## v1.0.0                                                                     ##
## + Initial release.                                                         ##
## + Added the possibility to control which channels could use the commands   ##
##   with the channel flag ``+/-nslookup´´                                    ##
################################################################################

# Set then next line as the command you want to initate the nslookup
set nslookup_command ".dns"

# Set the flagname used for enabling the channel command
set nslookup_channel_flag "nslookup"

# Set the next line as the flag required to use the command
set nslookup_flag "-"

# Set the next line as the exec command to run
# (Only if you're running an older eggdrop or not using the nslookup module)
set nslookup_exec "nslookup -silent"

bind pub $nslookup_flag|$nslookup_flag $nslookup_command pub_nslookup

proc pub_nslookup {nick uhost hand chan arg} {
    global nslookup_command nslookup_exec botnick nslookup_channel_flag
    if {([channel get $chan $nslookup_channel_flag]) && (![matchattr $hand b]) && ($nick != $botnick)} {
        if {$arg == ""} {
            putserv "PRIVMSG $chan :Usage: $nslookup_command  \[host/ip/nick #2\] ..."
        } else {
            foreach addr [set addrs [split $arg {,;| }]] {
                if {$addr == ""} {
                    continue ; # ignore
                }
                if {[set tmp [getchanhost $addr]] != ""} {
                    set addr [lindex [split $tmp @] end]
                }
                if {![regexp {^[a-zA-Z0-9\.\-]*$} $addr]} {
                    putserv "PRIVMSG $chan :Error: Hostname '$addr' contains illegal characters" ; # vulnerability
                } elseif {[string index $addr 0] == "-"} {
                    putserv "PRIVMSG $chan :Error: Hostnames cannot begin with a - character ($addr)" ; # vulnerability
                } elseif {[info commands dnslookup] != ""} {
                    dnslookup $addr return_nslookup $chan $addr
                } elseif {[catch {exec bash -c "$nslookup_exec '$addr'"} output]} {
                    putserv "PRIVMSG $chan :Could not resolve $addr"
                } else {
                    foreach line [split $output \n] {
                        if {[lindex $line 0] == "Name:"} {
                            set host [lrange $line 1 end]
                        } elseif {([lindex $line 0] == "Address:") || ([lindex $line 0] == "Addresses:")} {
                            set ip [lrange $line 1 end]
                        }
                    }
                    if {([info exists host]) && ([info exists ip])} {
                        return_nslookup $ip $host 1 $chan $addr
                    } else {
                        return_nslookup "" "" 0 $chan $addr
                    }
                }
            }
        }
    }
}

proc return_nslookup {ip host status chan addr} {
    if {$status} {
        if {[string match *$ip* $addr]} {
            putserv "PRIVMSG $chan :$ip -> $host"
        } else {
            putserv "PRIVMSG $chan :$host -> $ip"
        }
    } else {
        putserv "PRIVMSG $chan :Could not resolve $addr"
    }
}

setudef flag $nslookup_channel_flag
putlog "*** LOADED: nslookup.tcl"
Categories: Code, TCL Tags: , , ,
  1. No comments yet.
  1. No trackbacks yet.