1
0
Fork 0
mirror of https://github.com/pnx/pinger.git synced 2026-06-16 03:24:54 +02:00
pinger/main.go

70 lines
1.4 KiB
Go

package main
import (
"fmt"
"os"
"os/signal"
"path/filepath"
"syscall"
"time"
"github.com/prometheus-community/pro-bing"
)
// printStats prints statistics from a ping.
func printStats(pinger *probing.Pinger) {
stats := pinger.Statistics()
fmt.Printf("%d packets transmitted, %d packets received, %.2f%% packet loss\n",
stats.PacketsSent, stats.PacketsRecv, stats.PacketLoss)
fmt.Printf("round-trip min/avg/max/stddev = %v/%v/%v/%v\n",
stats.MinRtt, stats.AvgRtt, stats.MaxRtt, stats.StdDevRtt)
}
func eventLoop(pinger *probing.Pinger) {
ticker := time.NewTicker(time.Second * 4)
// Setup signals on term and interrupt.
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
for {
select {
// Got signal. stop pinger and exit goroutine
case <-sig:
pinger.Stop()
return
// Ticker ticks. print stats.
case <-ticker.C:
printStats(pinger)
}
}
}
func main() {
if len(os.Args) < 2 {
fmt.Printf("Usage: %s <ip>\n", filepath.Base(os.Args[0]))
os.Exit(1)
}
// Setup pinger.
pinger, err := probing.NewPinger(os.Args[1])
if err != nil {
fmt.Println("Error:", err)
return
}
pinger.SetPrivileged(true)
pinger.Interval = time.Second * 2
// Enter event loop in another goroutine.
go eventLoop(pinger)
// Run pinger in main thread.
fmt.Println("PING", pinger.Addr())
if err = pinger.Run(); err != nil {
fmt.Println("Error:", err)
return
}
}