Here is the source code:
REBOL [
File: %nettools.r
Date: 12-July-2006
Title: "Network Tools"
Version: 1.1
Author: "François Jouen"
Rights: {Copyright © EPHE 2006}
Purpose: {Collection of network tools}
license: 'BSD
]
; some useful information
host_address: system/network/host-address
host_name: system/network/host
Get_Os: does [
switch system/version/4 [
3 [os: "Windows" countos: "n"]
2 [os: "MacOSX" countos: "c"]
4 [os: "Linux" countos: "c"]
5 [os: "BeOS" countos: "c"]
7 [os: "NetBSD" countos: "c"]
9 [os: "OpenBSD" countos: "c"]
10 [os: "SunSolaris" countos: "c"]
]
]
Update-Panel: func [pnl] [
pnl/pane/offset: 0x0
show [pnl]
]
Set_TimeOut: func [newto] [
oldto: system/schemes/default/timeout
system/schemes/default/timeout: newto
]
Restore_TimeOut: does [system/schemes/default/timeout: oldto ]
Get_OS
; main window
MainWin: layout [
origin 0x0
space 0x0
at 5x15 osinfo: info os 100 center
at 5x45 b1: btn 100 "Host" [p1/pane: HostView update-panel p1]
at 5x70 b2: btn 100 "DNS" [p1/pane: NetView update-panel p1]
at 5x95 b3: btn 100 "Netstat" [p1/pane: NetStatView update-panel p1]
at 5x120 b4: btn 100 "Ping" [p1/pane: PingView update-panel p1]
at 5x145 b5: btn 100 "Finger" [p1/pane: FingerView update-panel p1]
at 5x170 b6: btn 100 "Whois" [p1/pane: WhoisView update-panel p1]
at 5x195 b7: btn 100 "Port Scan" [p1/pane: ScanView update-panel p1]
at 5x220 bq: btn 100 "Quit" [Quit]
at 120x5 p1: box 520x250 silver frame white
]
; useful routines to access network interfaces associated to the hostview layout
Get_Interfaces: func [] [
i: 0
cnx: open tcp://
data: get-modes cnx 'interfaces
close cnx
ni: length? data
ni_info/text: join "Network Interfaces [" [ni"]"]
clear ni_choice/data
for i 1 ni 1 [append ni_choice/data i]
show [ni_info ni_choice]
return ni
]
Get_Informations: func [number][
card: pick data number
nic_name/text: card/name
nic_adress/text: card/addr
nic_subnet/text: card/netmask
either found? find card/flags 'broadcast [nic_badress/text: card/broadcast] [nic_badress/text: "None"]
either found? find card/flags 'multicast [nic_multi/text: "Yes" ] [nic_multi/text: "No"]
either found? find card/flags 'point-to-point [nic_ppp/text: card/dest-addr ] [nic_ppp/text: "None"]
show [nic_name nic_adress nic_subnet nic_badress nic_multi nic_ppp]
]
; information about this computer
HostView: layout [
backcolor silver
across
origin 0x0
at 5x5 info1: info 150 to-string host_address info2: info host_name
at 5x30 ni_info: lbl 225 left "Network Interfaces " ni_choice: rotary 120 silver ""
[nc: to-integer face/text if nc > 0 [Get_Informations nc]]
at 5x60 lbl 225 "Name" left nic_name: field 120
at 5x90 lbl 225 "Address" left nic_adress: field 120
at 5x120 lbl 225 "Subnet" left nic_subnet: field 120
at 5x150 lbl 225 "Broadcast" left nic_badress: field 120
at 5x180 lbl 225 "Multicast" nic_multi: field 120
at 5x210 lbl 225 "Point to point" nic_ppp: field 120
]
; exploring the network via DNS
Explore_Net: does [
if error? try [
clear dresult/text
dresult/line-list: none
;save default timeout
Set_TimeOut 1.0
;get the network base address
ipx: to-tuple dinfo1/text
adr: ipx and 255.255.255.0
start: now/time/precise
append dresult/text join "Starting exploration " newline
show dresult
for i 1 255 1 [
adr: adr + 0.0.0.1
str: join "dns://" adr
machine: read to-url str
pg/text: adr pg2/data: i / 255
; just for the mac osx version. the delay is not necessary for linux or windows oses
if os = "MacOSX" [wait 0.01]
; alive?
if not none? machine [append dresult/text join adr [": " machine newline ] ]
show [pg pg2 dresult ]
]
end: now/time/precise
append dresult/text join "Network scanned in " end - start
show dresult
;restore default timeout
Restore_TimeOut]
[Alert "Error! Please use a valid IP Address!"]
]
NetView: layout [
backcolor silver
across
origin 0x0
space 5x0
at 5x5 lbl 100 left "IP Address" dinfo1: field 175 to-string host_address
drep1: info 175 right btn "Get" [drep1/text: "" str: "dns://" drep1/text: read to-url str show drep1]
at 5x30 lbl 100 left "Domain Name" dinfo2: field 175 "www.rebol.net"
drep2: info 175 right btn "Get" [drep2/text: "" adr: dinfo2/text str: str: join "dns://" adr
drep2/text: read to-url str show drep2]
space 0X0
at 5x55 dresult: area 490x145 sl: slider 16x145 [scroll-para dresult sl]
at 5x205 pg: info 150 pad 5 pg2: progress 225x25 pad 5 btn "Explore the Network" [Explore_Net]
]
; whois tools
WhoisView: layout [
backcolor silver
across
origin 0x0
space 5x0
at 5x5 lbl 120 left "Domain Name" winfo1: field 355 "rebol.com"
at 5x30 lbl 120 left "Whois Server"
slist: Choice 250 silver "whois.internic.net" "whois.networksolutions.com" "whois.arin.net"
btn 100 "Whois" [
clear wresult/text
wresult/line-list: none
show wresult
str: join "whois://" [winfo1/text "@" slist/text]
if error? try [rep: read to-url str append wresult/text rep] [append wresult/text "Error in connection "]
show wresult
]
space 0x0
at 5x65 wresult: area 490x170 wrap wsl: slider 16x170 [scroll-para wresult wsl]
]
;Finger Tools
FingerView: layout [
backcolor silver
across
origin 0x0
space 0x0
at 5x5 lbl 50 left "User" finfo1: field 150 "fjouen" txt "@" finfo2: field 200 to-string host_address
pad 5 btn "Finger" [
clear fresult/text
fresult/line-list: none
show fresult
wait 0.01
str: join "finger://" [finfo1/text "@" finfo2/text]
if error? try [rep: read to-url str append fresult/text rep] [append fresult/text "Error in connection "]
show fresult
]
at 5x40 fresult: area 490x170 wrap fsl: slider 16x170 [scroll-para fresult fsl]
]
; scan ports
ScanView: layout [
backcolor silver
across
origin 0x0
space 0x0
at 5x5 lbl 150 left "Internet Address" sinfo1: field 215 center to-string host_address
at 5x30 lbl 150 left "Starting Port" sinfo2: field center 70 "1"
lbl left "Ending Port" sinfo3: field center 70 "1024" ; for standard port use
pad 5 btn "Scan" [
clear sresult/text
sresult/line-list: none
append sresult/text join "Port Scanning host: " [sinfo1/text newline]
show sresult
Set_TimeOut 0.1
sstart: to-integer sinfo2/text
send: to-integer sinfo3/text
count: (send - sstart) + 1
for n 1 count 1 [
spg1/text: join "Port " n
spg2/data: n / count
if error? try [close open to-url join "tcp://" [sinfo1/text " :" n ]
append sresult/text join "Open TCP Port: "[n newline]]
[]
show [spg1 spg2 sresult]
if os = "MacOSX" [wait 0.01]
]
;restore default timeout
Restore_TimeOut
append sresult/text "Port Scanning is done"
show sresult
]
at 5x60 sresult: area 490x150 wrap ssl: slider 16x150 [scroll-para sresult ssl]
at 5x215 spg1: info 150 pad 5 spg2: progress 350x25
]
;ping tools
; makes ping to the host
ping: does [
buffer: copy ""
clear presult/text
presult/line-list: none
append presult/text join "Connecting host " [pinfo1/text newline]
show presult
commande: join "ping " ["-" countos " " pinfo2/text " " pinfo1/text]
if os = "MacOSX" [wait 0.01]
; call external call
call/output commande buffer
append presult/text buffer
; for Unices OS
n: to-integer length? buffer
if n = 0 [append presult/text "Network Error"]
show presult
]
PingView: layout [
backcolor silver
across
origin 0x0
space 5x0
at 5x5 lbl left "Host" pinfo1: field 150 to-string host_address
10x40 lbl "Counts" left pinfo2: field 50 "2"
btn "Ping" [ping]
space 0X0
at 5x40 presult: area 490x180 wrap psl: slider 16x180 [scroll-para presult psl]
]
; Netstat tools
NetStat: does [
buffer: copy ""
clear nsresult/text
nsresult/line-list: none
append nsresult/text join "Be patient! Connecting host " newline
show nsresult
switch option [
1 [commande: "netstat -a"]
2 [commande: "netstat -r"]
3 [commande: "netstat -s"]
]
if os = "MacOSX" [wait 0.01]
; call external call
call/output commande buffer
append nsresult/text buffer
show nsresult
]
NetStatView: layout [
backcolor silver
across
origin 0x0
space 5x0
at 5x5 lbl "Display "
nsrot: text-list 300x50 "All Information" "Routing Tables" "Protocol Statistics" [option: to-integer face/cnt]
btn "Statistics" [NetStat]
space 0x0
at 5x60 nsresult: area 490x180 nssl: slider 16x180 [scroll-para nsresult nssl]
]
option: 1
deflag-face nsresult tabbed
p1/pane: hostview
update-panel p1
tmp: Get_Interfaces
if tmp > 0 [Get_Informations 1]
view center-face MainWin
No comments:
Post a Comment