diff --git a/security/client.go b/security/client.go index de634eb9..88d8f658 100644 --- a/security/client.go +++ b/security/client.go @@ -1,58 +1,14 @@ package security -import ( - "io/ioutil" - "os/exec" - "regexp" - //"runtime" - //"strings" -) - -const fwGlobalState = "/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate" -const fwStealthMode = "/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode" - -// https://github.com/yelinaung/wifi-name/blob/master/wifi-name.go -const osxCmd = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" -const osxArgs = "-I" +import () func Fetch() map[string]string { data := make(map[string]string) - data["Wifi"] = WifiName() + data["Wifi Network"] = WifiName() + data["Wifi Encryption"] = WifiEncryption() + data["Firewall Enabled"] = FirewallState() + data["Firewall Stealth"] = FirewallStealthState() return data } - -func WifiName() string { - cmd := exec.Command(osxCmd, osxArgs) - - stdout, err := cmd.StdoutPipe() - panicIf(err) - - // start the command after having set up the pipe - if err := cmd.Start(); err != nil { - panic(err) - } - - var str string - - if b, err := ioutil.ReadAll(stdout); err == nil { - str += (string(b) + "\n") - } - - r := regexp.MustCompile(`s*SSID: (.+)s*`) - - name := r.FindAllStringSubmatch(str, -1) - - if len(name) <= 1 { - return "" - } else { - return name[1][1] - } -} - -func panicIf(err error) { - if err != nil { - panic(err) - } -} diff --git a/security/firewall.go b/security/firewall.go new file mode 100644 index 00000000..384746f5 --- /dev/null +++ b/security/firewall.go @@ -0,0 +1,59 @@ +package security + +import ( + "io/ioutil" + "os/exec" + "strings" +) + +const osxFirewallCmd = "/usr/libexec/ApplicationFirewall/socketfilterfw" + +func FirewallState() string { + cmd := exec.Command(osxFirewallCmd, "--getglobalstate") + + stdout, err := cmd.StdoutPipe() + if err != nil { + return firewallIcon("err") + } + + if err := cmd.Start(); err != nil { + return firewallIcon("err") + } + + var str string + if b, err := ioutil.ReadAll(stdout); err == nil { + str += string(b) + } + + return firewallIcon(str) +} + +func FirewallStealthState() string { + cmd := exec.Command(osxFirewallCmd, "--getstealthmode") + + stdout, err := cmd.StdoutPipe() + if err != nil { + return firewallIcon("err") + } + + if err := cmd.Start(); err != nil { + return firewallIcon("err") + } + + var str string + if b, err := ioutil.ReadAll(stdout); err == nil { + str += string(b) + } + + return firewallIcon(str) +} + +func firewallIcon(str string) string { + icon := "[red]off[white]" + + if strings.Contains(str, "enabled") { + icon = "[green]on[white]" + } + + return icon +} diff --git a/security/widget.go b/security/widget.go index 27668da5..203a7ed2 100644 --- a/security/widget.go +++ b/security/widget.go @@ -2,6 +2,7 @@ package security import ( "fmt" + "sort" "time" "github.com/rivo/tview" @@ -16,9 +17,9 @@ type Widget struct { func NewWidget() *Widget { widget := Widget{ BaseWidget: wtf.BaseWidget{ - Name: "Weather", + Name: "Security", RefreshedAt: time.Now(), - RefreshInterval: 5, + RefreshInterval: 300, }, } @@ -33,7 +34,7 @@ func NewWidget() *Widget { func (widget *Widget) Refresh() { data := Fetch() - widget.View.SetTitle(" 🐼 Security") + widget.View.SetTitle(" 🦂 Security ") widget.RefreshedAt = time.Now() widget.View.Clear() @@ -56,8 +57,16 @@ func (widget *Widget) addView() { func (widget *Widget) contentFrom(data map[string]string) string { str := "\n" - for key, val := range data { - str = str + fmt.Sprintf("%8s: %8s\n", key, val) + // Sort the map keys in alphabetical order + var keys []string + for key, _ := range data { + keys = append(keys, key) + } + sort.Strings(keys) + + for _, key := range keys { + val := data[key] + str = str + fmt.Sprintf(" %16s: %s\n", key, val) } return str diff --git a/security/wifi.go b/security/wifi.go new file mode 100644 index 00000000..390db42e --- /dev/null +++ b/security/wifi.go @@ -0,0 +1,71 @@ +package security + +import ( + "io/ioutil" + "os/exec" + "regexp" +) + +// https://github.com/yelinaung/wifi-name/blob/master/wifi-name.go +const osxWifiCmd = "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport" + +/* -------------------- Exported Functions -------------------- */ + +func WifiEncryption() string { + cmd := exec.Command(osxWifiCmd, "-I") + + stdout, err := cmd.StdoutPipe() + if err != nil { + return "" + } + + if err := cmd.Start(); err != nil { + return "" + } + + var str string + if b, err := ioutil.ReadAll(stdout); err == nil { + str += (string(b) + "\n") + } + + name := findMatch(`s*auth: (.+)s*`, str) + return matchStr(name) +} + +func WifiName() string { + cmd := exec.Command(osxWifiCmd, "-I") + + stdout, err := cmd.StdoutPipe() + if err != nil { + return "" + } + + if err := cmd.Start(); err != nil { + return "" + } + + var str string + if b, err := ioutil.ReadAll(stdout); err == nil { + str += (string(b) + "\n") + } + + name := findMatch(`s*SSID: (.+)s*`, str) + return matchStr(name) +} + +/* -------------------- Unexported Functions -------------------- */ + +func findMatch(pattern string, data string) [][]string { + r := regexp.MustCompile(pattern) + + name := r.FindAllStringSubmatch(data, -1) + return name +} + +func matchStr(data [][]string) string { + if len(data) <= 1 { + return "" + } else { + return data[1][1] + } +} diff --git a/weather/widget.go b/weather/widget.go index f7e3b3bf..e19d02ea 100644 --- a/weather/widget.go +++ b/weather/widget.go @@ -68,7 +68,7 @@ func (widget *Widget) contentFrom(data *owm.CurrentWeatherData) string { str = str + strings.Join(descs, ",") + "\n\n" - str = str + fmt.Sprintf("%10s: %4.1f° C\n\n", "Current", data.Main.Temp) + str = str + fmt.Sprintf("%10s: %4.1f° C\n", "Current", data.Main.Temp) str = str + fmt.Sprintf("%10s: %4.1f° C\n", "High", data.Main.TempMax) str = str + fmt.Sprintf("%10s: %4.1f° C\n", "Low", data.Main.TempMin) str = str + "\n\n\n\n" @@ -88,7 +88,7 @@ func icon(data *owm.CurrentWeatherData) string { case "clear": icon = "☀️" case "clear sky": - icon = "☀️" + icon = "☀️ " case "cloudy": icon = "⛅️" case "few clouds":