From 05638868acdb89bb5d4183d1afd431b44b8241fe Mon Sep 17 00:00:00 2001 From: Larry Date: Sun, 7 Feb 2021 19:30:23 -0500 Subject: [PATCH] Add server deletion --- go.sum | 9 ++++++++- manager.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- server.go | 43 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 95 insertions(+), 5 deletions(-) diff --git a/go.sum b/go.sum index 1ebd85a..2ede2ba 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,17 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= +github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4 h1:nwOc1YaOrYJ37sEBrtWZrdqzK22hiJs3GpDmP3sR2Yw= github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= +github.com/mdlayher/genetlink v1.0.0 h1:OoHN1OdyEIkScEmRgxLEe2M9U8ClMytqA5niynLtfj0= github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= +github.com/mdlayher/netlink v1.1.0 h1:mpdLgm+brq10nI9zM1BpX1kpDbh3NLl3RSnVq6ZSkfg= github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= +github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws= github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -17,6 +22,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -30,12 +36,13 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.zx2c4.com/wireguard v0.0.20200121 h1:vcswa5Q6f+sylDfjqyrVNNrjsFUUbPsgAQTBCAg/Qf8= golang.zx2c4.com/wireguard v0.0.20200121/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20201118 h1:QL8y2C7uO8T6z1GY+UX/hSeWiYEBurQkXjOTRFtCvXU= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200609130330-bd2cb7843e1b h1:l4mBVCYinjzZuR5DtxHuBD6wyd4348TGiavJ5vLrhEc= golang.zx2c4.com/wireguard/wgctrl v0.0.0-20200609130330-bd2cb7843e1b/go.mod h1:UdS9frhv65KTfwxME1xE8+rHYoFpbm36gOud1GhBe9c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= diff --git a/manager.go b/manager.go index 8a4f91d..0515f85 100644 --- a/manager.go +++ b/manager.go @@ -30,6 +30,11 @@ func AllocateIP(subnet net.IPNet, taken []net.IPAddr) net.IPAddr { } } +func Save() error { + out, _ := yaml.Marshal(servers) + return ioutil.WriteFile(os.Args[2], out, 0644) +} + func AddServer(serverType string, metadata map[string]string) (Server, error) { var ipRange net.IPNet var found bool @@ -79,8 +84,8 @@ func AddServer(serverType string, metadata map[string]string) (Server, error) { servers = append(servers, server) - out, _ := yaml.Marshal(servers) - err = ioutil.WriteFile(os.Args[2], out, 0644) + err = Save() + if err != nil { return Server{}, err } @@ -105,3 +110,42 @@ func AddServer(serverType string, metadata map[string]string) (Server, error) { return server, nil } + +func DeleteServer(ip IPAddr) error { + index := -1 + for i, server := range servers { + if server.IP.String() == ip.String() { + index = i + } + } + if index == -1 { + return errors.New("server not found") + } + + servers = append(servers[:index], servers[index+1:]...) + newPeers := make([]wgtypes.PeerConfig, len(servers)) + + for i := 0; i < len(servers); i++ { + key, _ := wgtypes.ParseKey(servers[i].PrivateKey) + + newPeers[i] = wgtypes.PeerConfig{ + PublicKey: key.PublicKey(), + AllowedIPs: []net.IPNet{ + { + IP: servers[i].IP.IP, + Mask: []byte{255, 255, 255, 255}, // = /32 + }, + }, + } + } + + err := wgClient.ConfigureDevice(config.Interface, wgtypes.Config{ + Peers: newPeers, + }) + + if err != nil { + return err + } + + return Save() +} diff --git a/server.go b/server.go index 29be974..0aac39b 100644 --- a/server.go +++ b/server.go @@ -4,15 +4,20 @@ import ( "encoding/hex" "encoding/json" "log" + "net" "net/http" "strings" ) -type ServerRequest struct { +type ServerCreationRequest struct { Type string Metadata map[string]string } +type ServerDeletionRequest struct { + IP string +} + func list(res http.ResponseWriter, _ *http.Request) { serverData, _ := json.Marshal(servers) res.Header().Add("Content-Type", "application/json") @@ -25,7 +30,7 @@ func add(res http.ResponseWriter, req *http.Request) { return } - var reqData ServerRequest + var reqData ServerCreationRequest err := json.NewDecoder(req.Body).Decode(&reqData) if err != nil { http.Error(res, "invalid post body", http.StatusBadRequest) @@ -45,6 +50,39 @@ func add(res http.ResponseWriter, req *http.Request) { _, _ = res.Write(jsonServer) } +func remove(res http.ResponseWriter, req *http.Request) { + if req.Method != "POST" { + http.Error(res, "method not allowed", http.StatusMethodNotAllowed) + return + } + + var reqData ServerDeletionRequest + err := json.NewDecoder(req.Body).Decode(&reqData) + if err != nil { + http.Error(res, "invalid post body", http.StatusBadRequest) + return + } + + err = DeleteServer(IPAddr{ + &net.IPAddr{ + IP: net.ParseIP(reqData.IP), + Zone: "", + }, + }) + + if err != nil { + http.Error(res, "invalid ip address", http.StatusBadRequest) + + return + } + + jsonResponse, _ := json.Marshal(map[string]bool { + "deleted": true, + }) + res.Header().Add("Content-Type", "application/json") + _, _ = res.Write(jsonResponse) +} + func auth(next http.Handler) http.Handler { return http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { token := strings.TrimPrefix(req.Header.Get("Authorization"), "Bearer ") @@ -62,6 +100,7 @@ func auth(next http.Handler) http.Handler { func StartServer() { http.Handle("/list", auth(http.HandlerFunc(list))) http.Handle("/add", auth(http.HandlerFunc(add))) + http.Handle("/remove", auth(http.HandlerFunc(remove))) log.Printf("starting listener on %s", config.Listen)