package main import ( "fmt" "os" "sync" "github.com/subgraph/fw-daemon/sgfw" "github.com/gotk3/gotk3/glib" "github.com/gotk3/gotk3/gtk" ) var fwswin *gtk.Window = nil var fwsbuilder *builder = nil var swRulesPermanent *gtk.ScrolledWindow = nil var swRulesSession *gtk.ScrolledWindow = nil var swRulesSystem *gtk.ScrolledWindow = nil func failDialog(parent *gtk.Window, format string, args ...interface{}) { d := gtk.MessageDialogNew(parent, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, format, args...) d.Run() os.Exit(1) } func activate(app *gtk.Application) { win := app.GetActiveWindow() if win != nil { win.Present() return } populateWin(app, win) } var repopMutex = &sync.Mutex{} func repopulateWin() { fmt.Println("Refreshing firewall rule list.") repopMutex.Lock() win := fwswin dbus, err := newDbusObject() if err != nil { failDialog(win, "Failed to connect to dbus system bus: %v", err) } child, err := swRulesPermanent.GetChild() if err != nil { failDialog(win, "Unable to clear out permanent rules list display: %v", err) } swRulesPermanent.Remove(child) child, err = swRulesSession.GetChild() if err != nil { failDialog(win, "Unable to clear out session rules list display: %v", err) } swRulesSession.Remove(child) child, err = swRulesSystem.GetChild() if err != nil { failDialog(win, "Unable to clear out session rules list display: %v", err) } swRulesSystem.Remove(child) boxPermanent, _ := gtk.ListBoxNew() swRulesPermanent.Add(boxPermanent) boxSession, _ := gtk.ListBoxNew() swRulesSession.Add(boxSession) boxSystem, _ := gtk.ListBoxNew() swRulesSystem.Add(boxSystem) rlPermanent := newRuleList(dbus, win, boxPermanent) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlPermanent.loadRules(sgfw.RULE_MODE_PERMANENT) rlSession := newRuleList(dbus, win, boxSession) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlSession.loadRules(sgfw.RULE_MODE_SESSION) rlSystem := newRuleList(dbus, win, boxSystem) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlSystem.loadRules(sgfw.RULE_MODE_SYSTEM) loadConfig(win, fwsbuilder, dbus) // app.AddWindow(win) win.ShowAll() repopMutex.Unlock() } func populateWin(app *gtk.Application, win *gtk.Window) { b := newBuilder("Dialog") fwsbuilder = b b.getItems( "window", &win, "swRulesPermanent", &swRulesPermanent, "swRulesSession", &swRulesSession, "swRulesSystem", &swRulesSystem, ) //win.SetIconName("security-high-symbolic") win.SetIconName("security-medium") boxPermanent, _ := gtk.ListBoxNew() swRulesPermanent.Add(boxPermanent) boxSession, _ := gtk.ListBoxNew() swRulesSession.Add(boxSession) boxSystem, _ := gtk.ListBoxNew() swRulesSystem.Add(boxSystem) dbus, err := newDbusObject() if err != nil { failDialog(win, "Failed to connect to dbus system bus: %v", err) } rlPermanent := newRuleList(dbus, win, boxPermanent) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlPermanent.loadRules(sgfw.RULE_MODE_PERMANENT) rlSession := newRuleList(dbus, win, boxSession) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlSession.loadRules(sgfw.RULE_MODE_SESSION) rlSystem := newRuleList(dbus, win, boxSystem) if _, err := dbus.isEnabled(); err != nil { failDialog(win, "Unable is connect to firewall daemon. Is it running?") } rlSystem.loadRules(sgfw.RULE_MODE_SYSTEM) loadConfig(win, b, dbus) app.AddWindow(win) fwswin = win win.ShowAll() } func main() { app, err := gtk.ApplicationNew("com.subgraph.Firewall.settings", glib.APPLICATION_FLAGS_NONE) if err != nil { panic(fmt.Sprintf("gtk.ApplicationNew() failed: %v", err)) } app.Connect("activate", activate) _, err = newDbusServer(); if err != nil { panic(fmt.Sprintf("Error initializing Dbus server: %v", err)) } app.Run(os.Args) }