From 57c9df6cfd38ccc1d3ce5ec8a152096646711430 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jorge=20D=C3=ADez=20de=20la=20Fuente?= <buker@stuker.es>
Date: Thu, 7 Jul 2022 00:23:36 +0200
Subject: [PATCH] restapi second release

---
 relaycfg/cfg.go          | 21 +++++++++++++++++++--
 relaylib/relaystatus.go  |  4 ++--
 restapi/restapi.go       | 33 +++++++++++++++++++++++++++------
 sub/startcmd/startcmd.go | 12 +++++-------
 4 files changed, 53 insertions(+), 17 deletions(-)

diff --git a/relaycfg/cfg.go b/relaycfg/cfg.go
index e92a77b..7af7c81 100644
--- a/relaycfg/cfg.go
+++ b/relaycfg/cfg.go
@@ -7,6 +7,7 @@ package relaycfg
 import (
 	"errors"
 	"fmt"
+	"os"
 	"time"
 
 	"github.com/wireleap/common/api/duration"
@@ -34,6 +35,8 @@ type C struct {
 	// NetUsage is the allocated bandwith per time period.
 	// NetUsage is disabled if UsageCap.Duration is 0.
 	NetUsage NetUsage `json:"network_usage,omitempty"`
+	// RestApi configures the API REST services
+	RestApi RestApi `json:"rest_api,omitempty"`
 	// Contracts is the map of service contracts used by this wireleap-relay.
 	Contracts map[texturl.URL]*relayentry.T `json:"contracts,omitempty"`
 	// AutoUpgrade sets whether this relay should attempt auto-upgrades.
@@ -42,6 +45,16 @@ type C struct {
 	DangerZone DangerZone `json:"danger_zone,omitempty"`
 }
 
+// RestApi
+type RestApi struct {
+	// Socket enabling
+	Socket bool `json:"socket_enabled"`
+	// Socket Umask
+	Umask os.FileMode `json:"socket_umask"`
+	// Address:Port
+	Address string `json:"tcp_addr"`
+}
+
 // Network usage soft-cap
 // Soft-cap per contract defined in relayentry.T
 type NetUsage struct {
@@ -65,8 +78,12 @@ func Defaults() C {
 		AutoSubmitInterval: duration.T(time.Minute * 5),
 		Timeout:            duration.T(time.Second * 5),
 		BufSize:            4096,
-		Contracts:          map[texturl.URL]*relayentry.T{},
-		AutoUpgrade:        true,
+		RestApi: RestApi{
+			Socket:    true,
+			Umask:     0600,
+		},
+		Contracts:   map[texturl.URL]*relayentry.T{},
+		AutoUpgrade: true,
 	}
 }
 
diff --git a/relaylib/relaystatus.go b/relaylib/relaystatus.go
index e9119bf..9a06047 100644
--- a/relaylib/relaystatus.go
+++ b/relaylib/relaystatus.go
@@ -52,8 +52,8 @@ type RelayStatus struct {
 }
 
 type RelayFlags struct {
-	Enrolled      bool
-	NetCapReached bool
+	Enrolled      bool `json:"enrolled"`
+	NetCapReached bool `json:"network_cap_reached"`
 	/**
 		ToDo: More flags to define the current status
 		- Failed heartbeats
diff --git a/restapi/restapi.go b/restapi/restapi.go
index 524bb99..918bd8f 100644
--- a/restapi/restapi.go
+++ b/restapi/restapi.go
@@ -12,6 +12,7 @@ import (
 	"github.com/wireleap/common/api/provide"
 	"github.com/wireleap/common/api/status"
 	"github.com/wireleap/relay/contractmanager"
+	"github.com/wireleap/relay/relaycfg"
 )
 
 type T struct {
@@ -44,18 +45,18 @@ func New(manager *contractmanager.Manager) (t *T) {
 	return
 }
 
-func UnixServer(p string, fm os.FileMode, t *T) error {
-	if err := os.RemoveAll(p); err != nil {
+func UnixServer(path string, fm os.FileMode, t *T) error {
+	if err := os.RemoveAll(path); err != nil {
 		return err
 	}
 
-	l, err := net.Listen("unix", p)
+	l, err := net.Listen("unix", path)
 	if err != nil {
 		return err
 	}
 	defer l.Close()
 
-	if err := os.Chmod(p, fm); err != nil {
+	if err := os.Chmod(path, fm); err != nil {
 		return err
 	}
 
@@ -63,8 +64,8 @@ func UnixServer(p string, fm os.FileMode, t *T) error {
 	return h.Serve(l)
 }
 
-func TCPServer(port string, t *T) error {
-	l, err := net.Listen("tcp", ":"+port)
+func TCPServer(addr string, t *T) error {
+	l, err := net.Listen("tcp", addr)
 	if err != nil {
 		return err
 	}
@@ -72,3 +73,23 @@ func TCPServer(port string, t *T) error {
 	h := &http.Server{Handler: t.mux}
 	return h.Serve(l)
 }
+
+func Run(cfg relaycfg.C, path string, t *T) {
+	if len(cfg.RestApi.Address) > 0 {
+		go func() {
+			log.Println("Launching TCP Server")
+			if err := TCPServer(cfg.RestApi.Address, t); err != nil {
+				log.Print(err)
+			}
+		}()
+	}
+
+	if cfg.RestApi.Socket {
+		go func() {
+			log.Println("Launching UnixSocket Server")
+			if err := UnixServer(path, cfg.RestApi.Umask, t); err != nil {
+				log.Print(err)
+			}
+		}()
+	}
+}
diff --git a/sub/startcmd/startcmd.go b/sub/startcmd/startcmd.go
index 3b0ef5b..8b07f96 100644
--- a/sub/startcmd/startcmd.go
+++ b/sub/startcmd/startcmd.go
@@ -212,7 +212,10 @@ func serverun(fm fsdir.T) {
 		r.Manager.Stop()
 
 		fm.Del(filenames.Pid)
-		fm.Del(filenames.Socket)
+
+		if c.RestApi.Socket {
+			fm.Del(filenames.Socket)
+		}
 		return true
 	}
 
@@ -220,12 +223,7 @@ func serverun(fm fsdir.T) {
 
 	// Launch API REST goroutine
 	api := restapi.New(r.Manager)
-	go func() {
-		log.Println("Launching UnixSocket Server")
-		if err := restapi.UnixServer(fm.Path(filenames.Socket), 0660, api); err != nil {
-			log.Print(err)
-		}
-	}()
+	restapi.Run(c, fm.Path(filenames.Socket), api) // Launches go routines
 
 	// check limit on open files (includes tcp connections)
 	var rlim syscall.Rlimit