[triggers/usb] add UsbDisconnect Trigger
This commit is contained in:
@@ -30,6 +30,7 @@ func GetAllTriggers() []DocumentedTrigger {
|
|||||||
return []DocumentedTrigger{
|
return []DocumentedTrigger{
|
||||||
TimeOut{},
|
TimeOut{},
|
||||||
EthernetDisconnect{},
|
EthernetDisconnect{},
|
||||||
|
UsbDisconnect{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
96
triggers/usb.go
Normal file
96
triggers/usb.go
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
package triggers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"unknown.com/gokill/actions"
|
||||||
|
"unknown.com/gokill/internal"
|
||||||
|
)
|
||||||
|
|
||||||
|
type UsbDisconnect struct {
|
||||||
|
WaitTillConnected bool `json:"waitTillConnected"`
|
||||||
|
DeviceName string `json:"deviceName"`
|
||||||
|
action actions.Action
|
||||||
|
}
|
||||||
|
|
||||||
|
func isUsbConnected(deviceName string) bool {
|
||||||
|
devicePath := "/dev/disk/by-id/" + deviceName
|
||||||
|
|
||||||
|
_, err := os.Open(devicePath)
|
||||||
|
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t UsbDisconnect) Listen() {
|
||||||
|
if t.WaitTillConnected {
|
||||||
|
for !isUsbConnected(t.DeviceName) {
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Sprintln("Device %s detected.", t.DeviceName)
|
||||||
|
fmt.Println("UsbDisconnect Trigger is Armed")
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
if !isUsbConnected(t.DeviceName) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
time.Sleep(1 * time.Second)
|
||||||
|
}
|
||||||
|
|
||||||
|
actions.Fire(t.action)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateUsbDisconnect(config internal.KillSwitchConfig) (UsbDisconnect, error) {
|
||||||
|
result := UsbDisconnect{
|
||||||
|
WaitTillConnected: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
err := json.Unmarshal(config.Options, &result)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return UsbDisconnect{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if result.DeviceName == "" {
|
||||||
|
return UsbDisconnect{}, internal.OptionMissingError{"deviceName"}
|
||||||
|
}
|
||||||
|
|
||||||
|
action, err := actions.NewAction(config.Actions)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return UsbDisconnect{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
result.action = action
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e UsbDisconnect) Create(config internal.KillSwitchConfig) (Trigger, error) {
|
||||||
|
return CreateUsbDisconnect(config)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p UsbDisconnect) GetName() string {
|
||||||
|
return "UsbDisconnect"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p UsbDisconnect) GetDescription() string {
|
||||||
|
return "Triggers when given usb drive is disconnected"
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p UsbDisconnect) GetOptions() []internal.ConfigOption {
|
||||||
|
return []internal.ConfigOption{
|
||||||
|
{"waitTillConnected", "bool", "Only trigger when device was connected before", "true"},
|
||||||
|
{"deviceId", "string", "Name of device under /dev/disk/by-id/", "\"\""},
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user