Răsfoiți Sursa

fix(vpn): ensure Emit() when restarting

Fixes #51
Mustafa Arici 8 ani în urmă
părinte
comite
50f831d884
5 a modificat fișierele cu 34 adăugiri și 21 ștergeri
  1. 6 6
      bindata/bindata.go
  2. 4 4
      net.go
  3. 5 1
      supervisor/supervisor.go
  4. 6 6
      user.go
  5. 13 4
      vpn.go

+ 6 - 6
bindata/bindata.go

@@ -93,7 +93,7 @@ func templateAuthSwaggerJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/auth.swagger.json", size: 2503, mode: os.FileMode(420), modTime: time.Unix(1507733513, 0)}
+	info := bindataFileInfo{name: "template/auth.swagger.json", size: 2503, mode: os.FileMode(420), modTime: time.Unix(1507744914, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -113,7 +113,7 @@ func templateBundleJs() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/bundle.js", size: 298007, mode: os.FileMode(420), modTime: time.Unix(1507733527, 0)}
+	info := bindataFileInfo{name: "template/bundle.js", size: 298007, mode: os.FileMode(420), modTime: time.Unix(1507744926, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -193,7 +193,7 @@ func templateIndexHtml() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/index.html", size: 577, mode: os.FileMode(420), modTime: time.Unix(1507733527, 0)}
+	info := bindataFileInfo{name: "template/index.html", size: 577, mode: os.FileMode(420), modTime: time.Unix(1507744926, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -233,7 +233,7 @@ func templateNetworkSwaggerJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/network.swagger.json", size: 6669, mode: os.FileMode(420), modTime: time.Unix(1507733513, 0)}
+	info := bindataFileInfo{name: "template/network.swagger.json", size: 6669, mode: os.FileMode(420), modTime: time.Unix(1507744914, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -273,7 +273,7 @@ func templateUserSwaggerJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/user.swagger.json", size: 6556, mode: os.FileMode(420), modTime: time.Unix(1507733513, 0)}
+	info := bindataFileInfo{name: "template/user.swagger.json", size: 6556, mode: os.FileMode(420), modTime: time.Unix(1507744914, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }
@@ -293,7 +293,7 @@ func templateVpnSwaggerJson() (*asset, error) {
 		return nil, err
 	}
 
-	info := bindataFileInfo{name: "template/vpn.swagger.json", size: 3334, mode: os.FileMode(420), modTime: time.Unix(1507733513, 0)}
+	info := bindataFileInfo{name: "template/vpn.swagger.json", size: 3334, mode: os.FileMode(420), modTime: time.Unix(1507744914, 0)}
 	a := &asset{bytes: bytes, info: info}
 	return a, nil
 }

+ 4 - 4
net.go

@@ -175,7 +175,7 @@ func CreateNewNetwork(name, cidr string, nettype NetworkType, via string) (*Netw
 	if db.NewRecord(&network) {
 		return nil, fmt.Errorf("can not create network in the db")
 	}
-	Emit()
+	EmitWithRestart()
 	logrus.Infof("network defined: %s (%s)", network.Name, network.CIDR)
 	return &Network{dbNetworkModel: network}, nil
 
@@ -188,7 +188,7 @@ func (n *Network) Delete() error {
 	}
 
 	db.Unscoped().Delete(n.dbNetworkModel)
-	Emit()
+	EmitWithRestart()
 	logrus.Infof("network deleted: %s", n.Name)
 	return nil
 }
@@ -221,7 +221,7 @@ func (n *Network) Associate(username string) error {
 	if userAssoc.Error != nil {
 		return fmt.Errorf("association failed: %v", userAssoc.Error)
 	}
-	Emit()
+	EmitWithRestart()
 	logrus.Infof("user '%s' is associated with the network '%s'", user.GetUsername(), n.Name)
 	return nil
 }
@@ -255,7 +255,7 @@ func (n *Network) Dissociate(username string) error {
 	if userAssoc.Error != nil {
 		return fmt.Errorf("disassociation failed: %v", userAssoc.Error)
 	}
-	Emit()
+	EmitWithRestart()
 	logrus.Infof("user '%s' is dissociated with the network '%s'", user.GetUsername(), n.Name)
 	return nil
 }

+ 5 - 1
supervisor/supervisor.go

@@ -252,8 +252,12 @@ func (p *Process) run(state State) func() {
 			}
 
 			// Process started successfully.
+			if p.cmd.Process == nil {
+				logrus.Debugf("p.cmd.Process was not created")
+				p.transitionTo(FAILED)
+				return
+			}
 			logrus.Debugf("process is started %s PID %d", p.executable, p.cmd.Process.Pid)
-
 			// Process Observer
 			go func() {
 				err := p.cmd.Wait()

+ 6 - 6
user.go

@@ -200,8 +200,8 @@ func CreateNewUser(username, password string, nogw bool, hostid uint32, admin bo
 	}
 	logrus.Infof("user created: %s", username)
 
-	// Emit server config
-	err = Emit()
+	// EmitWithRestart server config
+	err = EmitWithRestart()
 	if err != nil {
 		return nil, err
 	}
@@ -247,7 +247,7 @@ func (u *User) Update(password string, nogw bool, hostid uint32, admin bool) err
 	}
 	db.Save(u.dbUserModel)
 
-	err := Emit()
+	err := EmitWithRestart()
 	if err != nil {
 		return err
 	}
@@ -269,7 +269,7 @@ func (u *User) Delete() error {
 	})
 	db.Unscoped().Delete(u.dbUserModel)
 	logrus.Infof("user deleted: %s", u.GetUsername())
-	err = Emit()
+	err = EmitWithRestart()
 	if err != nil {
 		return err
 	}
@@ -285,7 +285,7 @@ func (u *User) ResetPassword(password string) error {
 		return fmt.Errorf("user password can not be updated %s: %v", u.Username, err)
 	}
 	db.Save(u.dbUserModel)
-	err = Emit()
+	err = EmitWithRestart()
 	if err != nil {
 		return err
 	}
@@ -324,7 +324,7 @@ func (u *User) Renew() error {
 	u.ServerSerialNumber = server.SerialNumber
 
 	db.Save(u.dbUserModel)
-	err = Emit()
+	err = EmitWithRestart()
 	if err != nil {
 		return err
 	}

+ 13 - 4
vpn.go

@@ -267,7 +267,7 @@ func Init(hostname string, port string, proto string, ipblock string, dns string
 		user.HostID = 0
 		db.Save(&user.dbUserModel)
 	}
-	Emit()
+	EmitWithRestart()
 	logrus.Infof("server initialized")
 	return nil
 }
@@ -313,7 +313,7 @@ func Update(ipblock string, dns string) error {
 			db.Save(user.dbUserModel)
 		}
 
-		Emit()
+		EmitWithRestart()
 		logrus.Infof("server updated")
 	}
 	return nil
@@ -327,7 +327,7 @@ func Deinit() error {
 
 	db.Unscoped().Delete(&dbServerModel{})
 	db.Unscoped().Delete(&dbRevokedModel{})
-	Emit()
+	EmitWithRestart()
 	return nil
 }
 
@@ -422,6 +422,7 @@ func StartVPNProc() {
 		logrus.Error("OpenVPN is already started")
 		return
 	}
+	Emit()
 	vpnProc.Start()
 	ensureNatEnabled()
 }
@@ -449,7 +450,6 @@ func StopVPNProc() {
 		return
 	}
 	vpnProc.Stop()
-
 }
 
 // Emit generates all needed files for the OpenVPN server and dumps them to their corresponding paths defined in the config.
@@ -509,7 +509,15 @@ func Emit() error {
 	}
 
 	logrus.Info("configurations emitted to the filesystem")
+	return nil
+}
 
+// EmitWithRestart restarts vpnProc after calling EmitWithRestart().
+func EmitWithRestart() error {
+	err := Emit()
+	if err != nil {
+		return err
+	}
 	if IsInitialized() {
 		for {
 			if vpnProc.Status() == supervisor.RUNNING || vpnProc.Status() == supervisor.STOPPED {
@@ -522,6 +530,7 @@ func Emit() error {
 	}
 
 	return nil
+
 }
 
 func emitToFile(path, content string, mode uint) error {