73 lines
1.8 KiB
Go
73 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"bufio"
|
|
"bytes"
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func main() {
|
|
s := bufio.NewScanner(os.Stdin)
|
|
if len(os.Args) != 1+1 {
|
|
fmt.Fprintf(os.Stderr, "not enough arguments\nusage: %s [ssh user]\n", os.Args[0])
|
|
return
|
|
}
|
|
user := os.Args[1]
|
|
|
|
fmt.Printf("[recorders]\n")
|
|
|
|
for s.Scan() {
|
|
host := s.Text()
|
|
ip := net.ParseIP(host).To16()
|
|
if ip == nil {
|
|
// Not a valid IPv6, skip
|
|
continue
|
|
}
|
|
if !bytes.Equal(ip[8:14], []byte{0, 0, 0, 0, 0, 0}) {
|
|
// First subnet is the recorders subnet
|
|
// Other subnets are "system" hosts
|
|
continue
|
|
}
|
|
hostname, roomType, roomId, webcamName, err := discover(host, user)
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "host %s discovery failed: %v\n", host, err)
|
|
}
|
|
fmt.Printf("%s ansible_host=%s ansible_user=%s room_type=%s room_id=%s webcam_name=%s\n", hostname, host, user, roomType, roomId, webcamName)
|
|
}
|
|
}
|
|
|
|
const script = `
|
|
hostname;
|
|
(cat room_type || echo) | head -n 1;
|
|
(cat room_id || echo) | head -n 1;
|
|
(ls /dev/v4l/by-id/ | grep C920 | grep index0 || echo) | cut -d - -f 1,2 | head -n 1;
|
|
(cat /sys/class/net/en*/address || echo) | head -n 1;
|
|
`
|
|
|
|
func discover(host, user string) (hostname, roomType, roomId, webcamName string, err error) {
|
|
cmd := exec.Command("/usr/bin/ssh", "-o", "ConnectTimeout=3", "-l", user, host, "sh", "-c", script)
|
|
fmt.Fprintf(os.Stderr, "command: %s\n", cmd)
|
|
var out bytes.Buffer
|
|
cmd.Stdout = &out
|
|
err = cmd.Run()
|
|
if err != nil {
|
|
return
|
|
}
|
|
hostname, err = out.ReadString('\n')
|
|
if err != nil {
|
|
return
|
|
}
|
|
hostname = strings.TrimSpace(hostname)
|
|
roomType, _ = out.ReadString('\n')
|
|
roomType = strings.TrimSpace(roomType)
|
|
roomId, _ = out.ReadString('\n')
|
|
roomId = strings.TrimSpace(roomId)
|
|
webcamName, _ = out.ReadString('\n')
|
|
webcamName = strings.TrimSpace(webcamName)
|
|
return
|
|
}
|