Add IP field, ping service, status endpoint and UI; update README
This commit is contained in:
81
internal/ping/ping.go
Normal file
81
internal/ping/ping.go
Normal file
@ -0,0 +1,81 @@
|
||||
package ping
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"time"
|
||||
)
|
||||
|
||||
// PingService bietet Funktionen zum Überprüfen des Online-Status von PCs
|
||||
type PingService struct{}
|
||||
|
||||
// NewPingService erstellt eine neue Instanz des Ping-Services
|
||||
func NewPingService() *PingService {
|
||||
return &PingService{}
|
||||
}
|
||||
|
||||
// IsOnline überprüft, ob ein PC online ist
|
||||
func (ps *PingService) IsOnline(ip string) bool {
|
||||
if ip == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
// Verwende system-spezifischen Ping-Befehl
|
||||
switch runtime.GOOS {
|
||||
case "windows":
|
||||
return ps.pingWindows(ip)
|
||||
case "linux", "darwin":
|
||||
return ps.pingUnix(ip)
|
||||
default:
|
||||
return ps.pingGeneric(ip)
|
||||
}
|
||||
}
|
||||
|
||||
// pingWindows führt einen Ping unter Windows aus
|
||||
func (ps *PingService) pingWindows(ip string) bool {
|
||||
cmd := exec.Command("ping", "-n", "1", "-w", "1000", ip)
|
||||
err := cmd.Run()
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// pingUnix führt einen Ping unter Unix-Systemen aus
|
||||
func (ps *PingService) pingUnix(ip string) bool {
|
||||
cmd := exec.Command("ping", "-c", "1", "-W", "1", ip)
|
||||
err := cmd.Run()
|
||||
return err == nil
|
||||
}
|
||||
|
||||
// pingGeneric ist eine plattformunabhängige Alternative
|
||||
func (ps *PingService) pingGeneric(ip string) bool {
|
||||
// Versuche TCP-Verbindung auf Port 80 (HTTP)
|
||||
conn, err := net.DialTimeout("tcp", fmt.Sprintf("%s:80", ip), 2*time.Second)
|
||||
if err != nil {
|
||||
// Versuche TCP-Verbindung auf Port 22 (SSH)
|
||||
conn, err = net.DialTimeout("tcp", fmt.Sprintf("%s:22", ip), 2*time.Second)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
}
|
||||
defer conn.Close()
|
||||
return true
|
||||
}
|
||||
|
||||
// CheckAllPCs überprüft den Online-Status aller PCs
|
||||
func (ps *PingService) CheckAllPCs(pcs []interface{}) map[int]bool {
|
||||
results := make(map[int]bool)
|
||||
|
||||
for _, pc := range pcs {
|
||||
// Type assertion für PC-Interface
|
||||
if pcMap, ok := pc.(map[string]interface{}); ok {
|
||||
if id, ok := pcMap["id"].(float64); ok {
|
||||
if ip, ok := pcMap["ip"].(string); ok {
|
||||
results[int(id)] = ps.IsOnline(ip)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return results
|
||||
}
|
||||
Reference in New Issue
Block a user