mirror of
https://github.com/KusakabeShi/EtherGuard-VPN.git
synced 2025-02-05 10:29:12 +01:00
http guest api
This commit is contained in:
parent
c4183ca924
commit
ad196d3f95
4
Makefile
4
Makefile
@ -8,8 +8,6 @@ all: generate-version-and-build
|
|||||||
MAKEFLAGS += --no-print-directory
|
MAKEFLAGS += --no-print-directory
|
||||||
|
|
||||||
generate-version-and-build:
|
generate-version-and-build:
|
||||||
go mod download && \
|
|
||||||
go mod tidy && \
|
|
||||||
@export GIT_CEILING_DIRECTORIES="$(realpath $(CURDIR)/..)" && \
|
@export GIT_CEILING_DIRECTORIES="$(realpath $(CURDIR)/..)" && \
|
||||||
tag="$$(git describe --dirty 2>/dev/null)" && \
|
tag="$$(git describe --dirty 2>/dev/null)" && \
|
||||||
ver="$$(printf 'package main\n\nconst Version = "%s"\n' "$$tag")" && \
|
ver="$$(printf 'package main\n\nconst Version = "%s"\n' "$$tag")" && \
|
||||||
@ -19,6 +17,8 @@ generate-version-and-build:
|
|||||||
@$(MAKE) etherguard-go
|
@$(MAKE) etherguard-go
|
||||||
|
|
||||||
etherguard-go: $(wildcard *.go) $(wildcard */*.go)
|
etherguard-go: $(wildcard *.go) $(wildcard */*.go)
|
||||||
|
go mod download && \
|
||||||
|
go mod tidy && \
|
||||||
go mod vendor && \
|
go mod vendor && \
|
||||||
patch -p0 -i govpp_remove_crcstring_check.patch && \
|
patch -p0 -i govpp_remove_crcstring_check.patch && \
|
||||||
go build -v -o "$@"
|
go build -v -o "$@"
|
||||||
|
@ -24,6 +24,7 @@ type SuperConfig struct {
|
|||||||
ListenPort int
|
ListenPort int
|
||||||
LogLevel LoggerInfo
|
LogLevel LoggerInfo
|
||||||
RePushConfigInterval float64
|
RePushConfigInterval float64
|
||||||
|
statepasswordd string
|
||||||
GraphRecalculateSetting GraphRecalculateSetting
|
GraphRecalculateSetting GraphRecalculateSetting
|
||||||
Peers []PeerInfo
|
Peers []PeerInfo
|
||||||
}
|
}
|
||||||
@ -106,9 +107,7 @@ type HTTP_Peerinfo struct {
|
|||||||
PSKey string
|
PSKey string
|
||||||
Connurl map[string]bool
|
Connurl map[string]bool
|
||||||
}
|
}
|
||||||
type HTTP_Peers struct {
|
type HTTP_Peers map[string]HTTP_Peerinfo
|
||||||
Peers map[string]HTTP_Peerinfo
|
|
||||||
}
|
|
||||||
|
|
||||||
const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||||
|
|
||||||
|
@ -262,20 +262,26 @@ func (device *Device) process_UpdatePeerMsg(content path.UpdatePeerMsg) error {
|
|||||||
if device.LogControl {
|
if device.LogControl {
|
||||||
fmt.Println("Download peerinfo from :" + downloadurl)
|
fmt.Println("Download peerinfo from :" + downloadurl)
|
||||||
}
|
}
|
||||||
resp, err := http.Get(downloadurl)
|
client := http.Client{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}
|
||||||
|
resp, err := client.Get(downloadurl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
allbytes, err := ioutil.ReadAll(resp.Body)
|
allbytes, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := json.Unmarshal(allbytes, &peer_infos); err != nil {
|
if err := json.Unmarshal(allbytes, &peer_infos); err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
for pubkey, peerinfo := range peer_infos.Peers {
|
for pubkey, peerinfo := range peer_infos {
|
||||||
if len(peerinfo.Connurl) == 0 {
|
if len(peerinfo.Connurl) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -421,7 +427,9 @@ func (device *Device) RoutineRecalculateNhTable() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
for {
|
for {
|
||||||
device.graph.RecalculateNhTable(false)
|
if time.Now().After(device.graph.NhTableExpire) {
|
||||||
|
device.graph.RecalculateNhTable(false)
|
||||||
|
}
|
||||||
time.Sleep(device.graph.NodeReportTimeout)
|
time.Sleep(device.graph.NodeReportTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -497,16 +505,22 @@ func (device *Device) process_UpdateNhTableMsg(content path.UpdateNhTableMsg) er
|
|||||||
if device.LogControl {
|
if device.LogControl {
|
||||||
fmt.Println("Download NhTable from :" + downloadurl)
|
fmt.Println("Download NhTable from :" + downloadurl)
|
||||||
}
|
}
|
||||||
resp, err := http.Get(downloadurl)
|
client := http.Client{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
}
|
||||||
|
resp, err := client.Get(downloadurl)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
allbytes, err := ioutil.ReadAll(resp.Body)
|
allbytes, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := json.Unmarshal(allbytes, &NhTable); err != nil {
|
if err := json.Unmarshal(allbytes, &NhTable); err != nil {
|
||||||
|
device.log.Errorf(err.Error())
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
device.graph.SetNHTable(NhTable, content.State_hash)
|
device.graph.SetNHTable(NhTable, content.State_hash)
|
||||||
|
@ -2,8 +2,11 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
@ -23,9 +26,20 @@ var (
|
|||||||
http_PeerInfoStr []byte
|
http_PeerInfoStr []byte
|
||||||
http_PeerState map[string]*PeerState
|
http_PeerState map[string]*PeerState
|
||||||
http_PeerID2Map map[config.Vertex]string
|
http_PeerID2Map map[config.Vertex]string
|
||||||
http_PeerInfos config.HTTP_Peers
|
http_PeerInfos config.HTTP_Peers // nodeID name pubkey, preshared key and more
|
||||||
|
http_peerinfos sync.Map // map[config.Vertex]string // nodeID and name, for guest visiting
|
||||||
|
http_StatePWD string
|
||||||
|
http_StateExpire time.Time
|
||||||
|
http_StateString []byte
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type HttpState struct {
|
||||||
|
PeerInfo map[config.Vertex]string
|
||||||
|
Edges map[config.Vertex]map[config.Vertex]float64
|
||||||
|
NhTable config.NextHopTable
|
||||||
|
Dist config.DistTable
|
||||||
|
}
|
||||||
|
|
||||||
type PeerState struct {
|
type PeerState struct {
|
||||||
NhTableState [32]byte
|
NhTableState [32]byte
|
||||||
PeerInfoState [32]byte
|
PeerInfoState [32]byte
|
||||||
@ -59,6 +73,7 @@ func get_peerinfo(w http.ResponseWriter, r *http.Request) {
|
|||||||
if bytes.Equal(http_PeerInfo_hash[:], []byte(State)) {
|
if bytes.Equal(http_PeerInfo_hash[:], []byte(State)) {
|
||||||
if state := http_PeerState[PubKey]; state != nil {
|
if state := http_PeerState[PubKey]; state != nil {
|
||||||
copy(http_PeerState[PubKey].PeerInfoState[:], State)
|
copy(http_PeerState[PubKey].PeerInfoState[:], State)
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
w.Write([]byte(http_PeerInfoStr))
|
w.Write([]byte(http_PeerInfoStr))
|
||||||
return
|
return
|
||||||
@ -87,6 +102,7 @@ func get_nhtable(w http.ResponseWriter, r *http.Request) {
|
|||||||
if bytes.Equal(http_NhTable_Hash[:], []byte(State)) {
|
if bytes.Equal(http_NhTable_Hash[:], []byte(State)) {
|
||||||
if state := http_PeerState[PubKey]; state != nil {
|
if state := http_PeerState[PubKey]; state != nil {
|
||||||
copy(http_PeerState[PubKey].NhTableState[:], State)
|
copy(http_PeerState[PubKey].NhTableState[:], State)
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
w.WriteHeader(http.StatusOK)
|
w.WriteHeader(http.StatusOK)
|
||||||
w.Write([]byte(http_NhTableStr))
|
w.Write([]byte(http_NhTableStr))
|
||||||
return
|
return
|
||||||
@ -96,6 +112,39 @@ func get_nhtable(w http.ResponseWriter, r *http.Request) {
|
|||||||
w.Write([]byte("Not found"))
|
w.Write([]byte("Not found"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func get_info(w http.ResponseWriter, r *http.Request) {
|
||||||
|
params := r.URL.Query()
|
||||||
|
PwdA, has := params["Password"]
|
||||||
|
if !has {
|
||||||
|
w.WriteHeader(http.StatusNotFound)
|
||||||
|
w.Write([]byte("Not found"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
password := PwdA[0]
|
||||||
|
if password != http_StatePWD {
|
||||||
|
w.WriteHeader(http.StatusUnauthorized)
|
||||||
|
w.Write([]byte("Wrong password"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if time.Now().After(http_StateExpire) {
|
||||||
|
hs := HttpState{
|
||||||
|
PeerInfo: make(map[config.Vertex]string),
|
||||||
|
NhTable: http_graph.GetNHTable(false),
|
||||||
|
Edges: http_graph.GetEdges(),
|
||||||
|
Dist: http_graph.GetDtst(),
|
||||||
|
}
|
||||||
|
http_peerinfos.Range(func(key interface{}, value interface{}) bool {
|
||||||
|
hs.PeerInfo[key.(config.Vertex)] = value.(string)
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
http_StateExpire = time.Now().Add(5 * time.Second)
|
||||||
|
http_StateString, _ = json.Marshal(hs)
|
||||||
|
}
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
w.Write(http_StateString)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func HttpServer(http_port int, apiprefix string) {
|
func HttpServer(http_port int, apiprefix string) {
|
||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
if apiprefix[0] != '/' {
|
if apiprefix[0] != '/' {
|
||||||
|
@ -97,7 +97,7 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
|
|
||||||
http_PeerState = make(map[string]*PeerState)
|
http_PeerState = make(map[string]*PeerState)
|
||||||
http_PeerID2Map = make(map[config.Vertex]string)
|
http_PeerID2Map = make(map[config.Vertex]string)
|
||||||
http_PeerInfos.Peers = make(map[string]config.HTTP_Peerinfo)
|
http_PeerInfos = make(map[string]config.HTTP_Peerinfo)
|
||||||
http_HashSalt = []byte(config.RandomStr(32, "Salt generate failed"))
|
http_HashSalt = []byte(config.RandomStr(32, "Salt generate failed"))
|
||||||
|
|
||||||
super_chains := path.SUPER_Events{
|
super_chains := path.SUPER_Events{
|
||||||
@ -146,7 +146,7 @@ func Super(configPath string, useUAPI bool, printExample bool) (err error) {
|
|||||||
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
return errors.New(fmt.Sprintf("Invalid Node_id at peer %s\n", peerconf.PubKey))
|
||||||
}
|
}
|
||||||
http_PeerID2Map[peerconf.NodeID] = peerconf.PubKey
|
http_PeerID2Map[peerconf.NodeID] = peerconf.PubKey
|
||||||
http_PeerInfos.Peers[peerconf.PubKey] = config.HTTP_Peerinfo{
|
http_PeerInfos[peerconf.PubKey] = config.HTTP_Peerinfo{
|
||||||
NodeID: peerconf.NodeID,
|
NodeID: peerconf.NodeID,
|
||||||
PubKey: peerconf.PubKey,
|
PubKey: peerconf.PubKey,
|
||||||
PSKey: peerconf.PSKey,
|
PSKey: peerconf.PSKey,
|
||||||
@ -217,15 +217,16 @@ func Event_server_event_hendler(graph *path.IG, events path.SUPER_Events) {
|
|||||||
case reg_msg := <-events.Event_server_register:
|
case reg_msg := <-events.Event_server_register:
|
||||||
copy(http_PeerState[http_PeerID2Map[reg_msg.Node_id]].NhTableState[:], reg_msg.NhStateHash[:])
|
copy(http_PeerState[http_PeerID2Map[reg_msg.Node_id]].NhTableState[:], reg_msg.NhStateHash[:])
|
||||||
copy(http_PeerState[http_PeerID2Map[reg_msg.Node_id]].PeerInfoState[:], reg_msg.PeerStateHash[:])
|
copy(http_PeerState[http_PeerID2Map[reg_msg.Node_id]].PeerInfoState[:], reg_msg.PeerStateHash[:])
|
||||||
|
http_peerinfos.Store(reg_msg.Node_id, reg_msg.Name)
|
||||||
PubKey := http_PeerID2Map[reg_msg.Node_id]
|
PubKey := http_PeerID2Map[reg_msg.Node_id]
|
||||||
if peer := http_device4.LookupPeerByStr(PubKey); peer != nil {
|
if peer := http_device4.LookupPeerByStr(PubKey); peer != nil {
|
||||||
if connstr := peer.GetEndpointDstStr(); connstr != "" {
|
if connstr := peer.GetEndpointDstStr(); connstr != "" {
|
||||||
http_PeerInfos.Peers[PubKey].Connurl[connstr] = true
|
http_PeerInfos[PubKey].Connurl[connstr] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if peer := http_device6.LookupPeerByStr(PubKey); peer != nil {
|
if peer := http_device6.LookupPeerByStr(PubKey); peer != nil {
|
||||||
if connstr := peer.GetEndpointDstStr(); connstr != "" {
|
if connstr := peer.GetEndpointDstStr(); connstr != "" {
|
||||||
http_PeerInfos.Peers[PubKey].Connurl[connstr] = true
|
http_PeerInfos[PubKey].Connurl[connstr] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
http_PeerInfoStr, _ = json.Marshal(&http_PeerInfos)
|
http_PeerInfoStr, _ = json.Marshal(&http_PeerInfos)
|
||||||
|
@ -20,9 +20,10 @@ func GetByte(structIn interface{}) (bb []byte, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type RegisterMsg struct {
|
type RegisterMsg struct {
|
||||||
Node_id config.Vertex `struc:"uint32"`
|
Node_id config.Vertex `struc:"uint32"`
|
||||||
PeerStateHash [32]byte
|
PeerStateHash [32]byte
|
||||||
NhStateHash [32]byte
|
NhStateHash [32]byte
|
||||||
|
Name string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *RegisterMsg) ToString() string {
|
func (c *RegisterMsg) ToString() string {
|
||||||
|
24
path/path.go
24
path/path.go
@ -56,7 +56,7 @@ type IG struct {
|
|||||||
dlTable config.DistTable
|
dlTable config.DistTable
|
||||||
NhTable config.NextHopTable
|
NhTable config.NextHopTable
|
||||||
NhTableHash [32]byte
|
NhTableHash [32]byte
|
||||||
nhTableExpire time.Time
|
NhTableExpire time.Time
|
||||||
IsSuperMode bool
|
IsSuperMode bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ func (g *IG) RecalculateNhTable(checkchange bool) (changed bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
g.dlTable, g.NhTable = dist, next
|
g.dlTable, g.NhTable = dist, next
|
||||||
g.nhTableExpire = time.Now().Add(g.NodeReportTimeout)
|
g.NhTableExpire = time.Now().Add(g.NodeReportTimeout)
|
||||||
g.RecalculateTime = time.Now()
|
g.RecalculateTime = time.Now()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
@ -248,16 +248,32 @@ func Path(u, v config.Vertex, next config.NextHopTable) (path []config.Vertex) {
|
|||||||
func (g *IG) SetNHTable(nh config.NextHopTable, table_hash [32]byte) { // set nhTable from supernode
|
func (g *IG) SetNHTable(nh config.NextHopTable, table_hash [32]byte) { // set nhTable from supernode
|
||||||
g.NhTable = nh
|
g.NhTable = nh
|
||||||
g.NhTableHash = table_hash
|
g.NhTableHash = table_hash
|
||||||
g.nhTableExpire = time.Now().Add(g.SuperNodeInfoTimeout)
|
g.NhTableExpire = time.Now().Add(g.SuperNodeInfoTimeout)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *IG) GetNHTable(checkChange bool) config.NextHopTable {
|
func (g *IG) GetNHTable(checkChange bool) config.NextHopTable {
|
||||||
if time.Now().After(g.nhTableExpire) {
|
if time.Now().After(g.NhTableExpire) {
|
||||||
g.RecalculateNhTable(checkChange)
|
g.RecalculateNhTable(checkChange)
|
||||||
}
|
}
|
||||||
return g.NhTable
|
return g.NhTable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *IG) GetDtst() config.DistTable {
|
||||||
|
return g.dlTable
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *IG) GetEdges() (edges map[config.Vertex]map[config.Vertex]float64) {
|
||||||
|
vert := g.Vertices()
|
||||||
|
edges = make(map[config.Vertex]map[config.Vertex]float64, len(vert))
|
||||||
|
for src, _ := range vert {
|
||||||
|
edges[src] = make(map[config.Vertex]float64, len(vert))
|
||||||
|
for dst, _ := range vert {
|
||||||
|
edges[src][dst] = g.Weight(src, dst)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (g *IG) GetBoardcastList(id config.Vertex) (tosend map[config.Vertex]bool) {
|
func (g *IG) GetBoardcastList(id config.Vertex) (tosend map[config.Vertex]bool) {
|
||||||
tosend = make(map[config.Vertex]bool)
|
tosend = make(map[config.Vertex]bool)
|
||||||
for _, element := range g.NhTable[id] {
|
for _, element := range g.NhTable[id] {
|
||||||
|
Loading…
Reference in New Issue
Block a user