package main import ( "errors" "fmt" "github.com/godbus/dbus" "github.com/gotk3/gotk3/glib" "github.com/subgraph/fw-daemon/sgfw" ) type dbusObject struct { dbus.BusObject } type dbusObjectP struct { dbus.BusObject } type dbusServer struct { conn *dbus.Conn run bool } func newDbusObject() (*dbusObject, error) { conn, err := dbus.SystemBus() if err != nil { return nil, err } return &dbusObject{conn.Object("com.subgraph.Firewall", "/com/subgraph/Firewall")}, nil } func newDbusObjectPrompt() (*dbusObjectP, error) { conn, err := dbus.SystemBus() if err != nil { return nil, err } return &dbusObjectP{conn.Object("com.subgraph.fwprompt.EventNotifier", "/com/subgraph/fwprompt/EventNotifier")}, nil } func (ob *dbusObject) isEnabled() (bool, error) { var flag bool if err := ob.Call("com.subgraph.Firewall.IsEnabled", 0).Store(&flag); err != nil { return false, err } return flag, nil } func (ob *dbusObject) listRules() ([]sgfw.DbusRule, error) { rules := []sgfw.DbusRule{} err := ob.Call("com.subgraph.Firewall.ListRules", 0).Store(&rules) if err != nil { return nil, err } return rules, nil } func (ob *dbusObject) deleteRule(id uint32) { ob.Call("com.subgraph.Firewall.DeleteRule", 0, id) } func (ob *dbusObject) updateRule(rule *sgfw.DbusRule) { ob.Call("com.subgraph.Firewall.UpdateRule", 0, rule) } func (ob *dbusObject) getConfig() (map[string]interface{}, error) { res := make(map[string]dbus.Variant) if err := ob.Call("com.subgraph.Firewall.GetConfig", 0).Store(&res); err != nil { return nil, err } config := make(map[string]interface{}) for k, v := range res { config[k] = v.Value() } return config, nil } func (ob *dbusObject) setConfig(key string, val interface{}) { ob.Call("com.subgraph.Firewall.SetConfig", 0, key, dbus.MakeVariant(val)) } func newDbusServer() (*dbusServer, error) { conn, err := dbus.SystemBus() if err != nil { return nil, err } reply, err := conn.RequestName("com.subgraph.fwprompt.EventNotifier", dbus.NameFlagDoNotQueue) if err != nil { return nil, err } if reply != dbus.RequestNameReplyPrimaryOwner { return nil, errors.New("Bus name is already owned") } ds := &dbusServer{} if err := conn.Export(ds, "/com/subgraph/fwprompt/EventNotifier", "com.subgraph.fwprompt.EventNotifier"); err != nil { return nil, err } ds.conn = conn ds.run = true return ds, nil } func (ds *dbusServer) Alert(data string) *dbus.Error { fmt.Println("Received Dbus update alert: ", data) glib.IdleAdd(repopulateWin) return nil } func (ob *dbusObjectP) alertRule(data string) { ob.Call("com.subgraph.fwprompt.EventNotifier.Alert", 0, data) }