initial release of jing-go

This commit is contained in:
Daniel Ashton
2020-09-26 15:36:22 +02:00
parent 6110412ae7
commit 1163a41a9d
3 changed files with 146 additions and 0 deletions

139
jing.go Normal file
View File

@@ -0,0 +1,139 @@
package main
import (
"bufio"
"fmt"
//"io/ioutil"
"encoding/json"
"log"
"os"
"github.com/go-ping/ping"
"github.com/pborman/getopt/v2"
)
var (
target = "127.0.0.1"
target_list = ""
sleep = 100
privilege = false
count = 3
timeout = 3000000000
json_out = false
target_str = ""
)
func init() {
getopt.FlagLong(&target, "target", 't', "the target host to ping")
getopt.FlagLong(&target_list, "target_list", 'T', "define targetlist with hosts to ping")
getopt.FlagLong(&sleep, "sleep", 's', "sleep between packets")
getopt.FlagLong(&count, "count", 'c', "how many packets to send")
getopt.FlagLong(&privilege, "privilege", 'r', "admin/root privileges available")
getopt.FlagLong(&json_out, "json-output", 'J', "prefer json output")
// getopt.FlagLong(&timeout,"")
}
type ping_args struct {
Target string
Target_list string
Timeout int
Count int
Privilege bool
}
type ping_result struct {
Target string
Sent int
Recv int
Alive bool
}
func pingme(target string, count int, timeout int) {
var alive bool
pinger, err := ping.NewPinger(target)
if err != nil {
panic(err)
}
// fix this with time import and milliseconds
pinger.Timeout = 3000000000
pinger.Count = 3
pinger.OnFinish = func(stats *ping.Statistics) {
if stats.PacketsRecv > 0 {
alive = true
} else {
alive = false
}
if json_out == false {
fmt.Printf("%s (%s) %d/%d (Sent/Recv) Alive: %t\n", stats.Addr, stats.IPAddr, stats.PacketsSent, stats.PacketsRecv, alive)
} else {
p_result := ping_result{
Target: target,
Sent: stats.PacketsSent,
Recv: stats.PacketsRecv,
Alive: alive,
}
json_result, err := json.Marshal(p_result)
if err != nil {
log.Fatalf("Unable to encode")
}
fmt.Println(string(json_result))
}
}
//pinger.SetPrivileged(true)
err = pinger.Run()
if err != nil {
fmt.Printf("Failed to ping target host :%s", err)
}
}
func main() {
getopt.Parse()
p_args := ping_args{
Target: target,
Target_list: target_list,
Timeout: timeout,
Count: count,
Privilege: privilege}
var json_data []byte
json_data, err := json.Marshal(p_args)
if err != nil {
log.Println(err)
}
if json_out == true {
fmt.Println(string(json_data))
}
if target_list != "" {
buf, err := os.Open(target_list)
if err != nil {
log.Fatal(err)
}
snl := bufio.NewScanner(buf)
for snl.Scan() {
pingme(snl.Text(), 3, 3000000000)
}
} else {
pingme(target, 3, 3000000000)
}
if json_out == false {
fmt.Printf("Done\n")
}
}