From f274ec2beaf060cc8bfe4f5eb6f2ce3b5c6aa1f3 Mon Sep 17 00:00:00 2001
From: Ruben Pollan <meskio@sindominio.net>
Date: Wed, 9 Jan 2019 12:49:33 +0100
Subject: [PATCH] [feat] use firewall status to check if the vpn is in failed
 status

If openvpn is off, but the firewall is up, we are in a fail-close status
and we should report it properly.

- Resolves: #97
---
 standalone/launcher.go       | 10 ++++++++++
 standalone/launcher_linux.go |  5 +++++
 standalone/vpn.go            |  3 +++
 3 files changed, 18 insertions(+)

diff --git a/standalone/launcher.go b/standalone/launcher.go
index 03178c51..0a95dd14 100644
--- a/standalone/launcher.go
+++ b/standalone/launcher.go
@@ -68,6 +68,16 @@ func (l *launcher) firewallStop() error {
 	return l.send("/firewall/stop", nil)
 }
 
+func (l *launcher) firewallIsUp() bool {
+	res, err := http.Post(helperAddr+"/firewall/isup", "", nil)
+	if err != nil {
+		return false
+	}
+	defer res.Body.Close()
+
+	return res.StatusCode == http.StatusOK
+}
+
 func (l *launcher) send(path string, body []byte) error {
 	var reader io.Reader
 	if body != nil {
diff --git a/standalone/launcher_linux.go b/standalone/launcher_linux.go
index a434ecd4..5266fa1f 100644
--- a/standalone/launcher_linux.go
+++ b/standalone/launcher_linux.go
@@ -75,6 +75,11 @@ func (l *launcher) firewallStop() error {
 	return runBitmaskRoot("firewall", "stop")
 }
 
+func (l *launcher) firewallIsUp() bool {
+	err := runBitmaskRoot("firewall", "isup")
+	return err == nil
+}
+
 func (l *launcher) openvpnRunner(arg ...string) {
 	running := false
 	runOpenvpn := func(arg []string) {
diff --git a/standalone/vpn.go b/standalone/vpn.go
index e3ecca47..0ff090cf 100644
--- a/standalone/vpn.go
+++ b/standalone/vpn.go
@@ -88,6 +88,9 @@ func (b *Bitmask) GetStatus() (string, error) {
 	if err != nil {
 		status = Off
 	}
+	if status == Off && b.launch.firewallIsUp() {
+		return Failed, nil
+	}
 	return status, nil
 }
 
-- 
GitLab