diff --git a/internal/guard/client.go b/internal/guard/client.go index 151e32b..f98ab65 100644 --- a/internal/guard/client.go +++ b/internal/guard/client.go @@ -20,6 +20,7 @@ func ListDevices() ([]Device, error) { if err != nil { return nil, wrapExecError(err) } + rules := listRules() var devices []Device for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { if line == "" { @@ -27,12 +28,31 @@ func ListDevices() ([]Device, error) { } d, err := parseLine(line) if err == nil { + d.Permanent = rules[d.VidPid] == d.Status devices = append(devices, d) } } return devices, nil } +func listRules() map[string]Status { + out, err := exec.Command("usbguard", "list-rules").Output() + if err != nil { + return nil + } + rules := make(map[string]Status) + for _, line := range strings.Split(strings.TrimSpace(string(out)), "\n") { + if line == "" { + continue + } + d, err := parseLine(line) + if err == nil { + rules[d.VidPid] = d.Status + } + } + return rules +} + func AllowDevice(id int, permanent bool) error { return applyPolicy("allow-device", id, permanent) } func BlockDevice(id int, permanent bool) error { return applyPolicy("block-device", id, permanent) } func RejectDevice(id int, permanent bool) error { return applyPolicy("reject-device", id, permanent) } diff --git a/internal/guard/device.go b/internal/guard/device.go index 9e9a6dc..89a99b5 100644 --- a/internal/guard/device.go +++ b/internal/guard/device.go @@ -16,10 +16,11 @@ const ( ) type Device struct { - ID int - Name string - Status Status - VidPid string + ID int + Name string + Status Status + VidPid string + Permanent bool } func (d Device) Title() string { return d.Name } diff --git a/internal/ui/delegate.go b/internal/ui/delegate.go index 169f22f..1ac50ba 100644 --- a/internal/ui/delegate.go +++ b/internal/ui/delegate.go @@ -59,9 +59,13 @@ func (d deviceDelegate) Render(w io.Writer, m list.Model, index int, item list.I descStyle = lipgloss.NewStyle().Foreground(colorMuted).PaddingLeft(2) } + permIndicator := "○ tmp" + if dev.Permanent { + permIndicator = "● perm" + } fmt.Fprintf(w, "%s\n%s", nameStyle.Render(dev.Name), - descStyle.Render(fmt.Sprintf("id:%-3d %s %s", dev.ID, dev.VidPid, string(dev.Status))), + descStyle.Render(fmt.Sprintf("id:%-3d %s %s %s", dev.ID, dev.VidPid, string(dev.Status), permIndicator)), ) }