main.go (1267B)
1 package main 2 3 import ( 4 "bytes" 5 "context" 6 "flag" 7 "fmt" 8 "github.com/rubiojr/go-usbmon" 9 "os" 10 "os/exec" 11 ) 12 13 const ShellToUse = "/bin/sh" 14 15 func Shellout(command string) (string, string, error) { 16 var stdout bytes.Buffer 17 var stderr bytes.Buffer 18 cmd := exec.Command(ShellToUse, "-c", command) 19 cmd.Stdout = &stdout 20 cmd.Stderr = &stderr 21 err := cmd.Run() 22 return stdout.String(), stderr.String(), err 23 } 24 25 func main() { 26 27 command := "xscreensaver" 28 29 help := flag.Bool("help", false, "Help menu") 30 flag.Parse() 31 if *help { 32 fmt.Println("Usage: usb-ks {COMMAND}\nExecute the specified command on USB device changes (default: xscreensaver)") 33 return 34 } 35 36 if len(os.Args) == 2 { 37 command = os.Args[1] 38 } 39 if len(os.Args) > 2 { 40 fmt.Println("Too many arguments.\nUsage: usb-ks {COMMAND}") 41 os.Exit(1) 42 } 43 44 filter := &usbmon.ActionFilter{Action: usbmon.ActionAll} 45 devs, err := usbmon.ListenFiltered(context.Background(), filter) 46 47 if err != nil { 48 panic(err) 49 } 50 51 for range devs { 52 53 stdout, stderr, err := Shellout(command) 54 55 if err != nil { 56 panic(err) 57 } 58 59 stdoutStr := string(stdout) 60 stderrStr := string(stderr) 61 62 if len(stdoutStr) != 0 { 63 fmt.Println("Stdout: " + stdoutStr) 64 } 65 66 if len(stderr) != 0 { 67 fmt.Println("Stderr: " + stderrStr) 68 } 69 } 70 }