diff --git a/client/Iptable.go b/client/Iptable.go index 8df74c6..10d8385 100644 --- a/client/Iptable.go +++ b/client/Iptable.go @@ -12,10 +12,6 @@ import ( "os" ) -type IP struct { - Query string -} - // UpdateIpTable Does the following to update it's IP table func UpdateIpTable(IpAddress string) error { @@ -26,10 +22,23 @@ func UpdateIpTable(IpAddress string) error { client := http.Client{} - resp, err := UploadMultipartFile(client,"http://"+IpAddress+":8088/IpTable","json",config.IPTable) + var resp []byte - if err != nil { + version := p2p.Ip4or6(IpAddress) + if version == "version 6" { + resp, err = UploadMultipartFile(client,"http://["+IpAddress+"]:8088/IpTable","json",config.IPTable) + if err != nil { return err + } + } else { + resp, err = UploadMultipartFile(client,"http://"+IpAddress+":8088/IpTable","json",config.IPTable) + if err != nil { + return err + } + } + + if resp == nil { + return nil } //resp, err := SendPostRequest("http://"+IpAddress+":8088/IpTable", @@ -59,6 +68,7 @@ func UpdateIpTable(IpAddress string) error { // UpdateIpTableListClient updates IP tables (Default 3 hops) based on server information available //on the ip tables func UpdateIpTableListClient() error { + // Ensure that the IP Table has Node pingable err := p2p.LocalSpeedTestIpTable() if err != nil { @@ -69,61 +79,55 @@ func UpdateIpTableListClient() error { // duplication Addresses, err := p2p.ReadIpTable() - var DoNotRead p2p.IpAddresses + //var DoNotRead p2p.IpAddresses // Run loop 3 times for i := 0; i < 3; i++ { // Gets information from IP table - Addresses, err = p2p.ReadIpTable() - if err != nil { - return err - } - - // Appending current machine public IP address as should not be there in IP Table - var PublicIP p2p.IpAddress - ip, err := CurrentPublicIP() - if err != nil { - return err - } - PublicIP.Ipv4 = ip - DoNotRead.IpAddress = append(DoNotRead.IpAddress, PublicIP) + //Addresses, err = p2p.ReadIpTable() + //if err != nil { + // return err + //} + // + //DoNotRead.IpAddress = append(DoNotRead.IpAddress, PublicIP) // Updates IP table based on server IP table for j := range Addresses.IpAddress { - Exists := false + //Exists := false + // + //if PublicIP.Ipv4 == Addresses.IpAddress[j].Ipv4 || (PublicIP.Ipv6 != "" && Addresses.IpAddress[j].Ipv6 == PublicIP.Ipv6){ + // Exists = true + //} + // + //// Check if IP addresses is there in the struct DoNotRead + //for k := range DoNotRead.IpAddress { + // if DoNotRead.IpAddress[k].Ipv4 == Addresses.IpAddress[j].Ipv4 || (DoNotRead.IpAddress[k].Ipv6 != "" && Addresses.IpAddress[j].Ipv6 == DoNotRead.IpAddress[k].Ipv6) { + // Exists = true + // break + // } + //} + // + //// If the struct exists then continues + //if Exists { + // continue + //} - if PublicIP.Ipv4 == Addresses.IpAddress[j].Ipv4 { - Exists = true + if Addresses.IpAddress[j].Ipv6 != "" { + err = UpdateIpTable(Addresses.IpAddress[j].Ipv6) + } else { + err = UpdateIpTable(Addresses.IpAddress[j].Ipv4) } - // Check if IP addresses is there in the struct DoNotRead - for k := range DoNotRead.IpAddress { - if DoNotRead.IpAddress[k].Ipv4 == Addresses.IpAddress[j].Ipv4 { - Exists = true - break - } - } - - // If the struct exists then continues - if Exists { - continue - } - err = UpdateIpTable(Addresses.IpAddress[j].Ipv4) if err != nil { return err } //Appends server1 IP address to variable DoNotRead - DoNotRead.IpAddress = append(DoNotRead.IpAddress, Addresses.IpAddress[j]) + //DoNotRead.IpAddress = append(DoNotRead.IpAddress, Addresses.IpAddress[j]) } } - // Removing duplicates in the IP table - if err := p2p.RemoveDuplicates(); err != nil { - return err - } - return nil } @@ -216,6 +220,10 @@ func UploadMultipartFile(client http.Client, uri, key, path string) ([]byte, err }() resp, err := client.Do(req) + if err != nil { + return nil, err + } + content, err := ioutil.ReadAll(resp.Body) if err != nil { @@ -226,21 +234,3 @@ func UploadMultipartFile(client http.Client, uri, key, path string) ([]byte, err } -// CurrentPublicIP Get Current Public IP address -func CurrentPublicIP() (string,error) { - req, err := http.Get("http://ip-api.com/json/") - if err != nil { - return "",err - } - defer req.Body.Close() - - body, err := ioutil.ReadAll(req.Body) - if err != nil { - return "",err - } - - var ip IP - json.Unmarshal(body, &ip) - - return ip.Query, nil -} \ No newline at end of file diff --git a/client/ServerSpecs.go b/client/ServerSpecs.go index 7b3b8c1..ea31afe 100644 --- a/client/ServerSpecs.go +++ b/client/ServerSpecs.go @@ -3,6 +3,7 @@ package client import ( "encoding/json" "fmt" + "git.sr.ht/~akilan1999/p2p-rendering-computation/p2p" "git.sr.ht/~akilan1999/p2p-rendering-computation/server" "io/ioutil" "net/http" @@ -12,7 +13,13 @@ import ( // and other basic information which helps set a // cluster of computer func GetSpecs(IP string)(*server.SysInfo,error) { - URL := "http://" + IP + ":" + serverPort + "/server_info" + var URL string + version := p2p.Ip4or6(IP) + if version == "version 6" { + URL = "http://[" + IP + "]:" + serverPort + "/server_info" + } else { + URL = "http://" + IP + ":" + serverPort + "/server_info" + } resp, err := http.Get(URL) if err != nil { return nil,err diff --git a/client/container.go b/client/container.go index b64a766..968a1bf 100644 --- a/client/container.go +++ b/client/container.go @@ -3,6 +3,7 @@ package client import ( "encoding/json" "fmt" + "git.sr.ht/~akilan1999/p2p-rendering-computation/p2p" "git.sr.ht/~akilan1999/p2p-rendering-computation/server/docker" "io/ioutil" "net/http" @@ -22,7 +23,14 @@ var client = http.Client{} //Calls URL ex: http://0.0.0.0:8088/startcontainer?ports=0&GPU=false&ContainerName=docker-ubuntu-sshd func StartContainer(IP string, NumPorts int, GPU bool, ContainerName string) (*docker.DockerVM ,error) { // Passes URL with number of TCP ports to allocated and to give GPU access to the docker container - URL := "http://" + IP + ":" + serverPort + "/startcontainer?ports=" + fmt.Sprint(NumPorts) + "&GPU=" + strconv.FormatBool(GPU) + "&ContainerName=" + ContainerName + var URL string + version := p2p.Ip4or6(IP) + if version == "version 6" { + URL = "http://[" + IP + "]:" + serverPort + "/startcontainer?ports=" + fmt.Sprint(NumPorts) + "&GPU=" + strconv.FormatBool(GPU) + "&ContainerName=" + ContainerName + } else { + URL = "http://" + IP + ":" + serverPort + "/startcontainer?ports=" + fmt.Sprint(NumPorts) + "&GPU=" + strconv.FormatBool(GPU) + "&ContainerName=" + ContainerName + } + resp, err := http.Get(URL) if err != nil { return nil,err @@ -48,7 +56,13 @@ func StartContainer(IP string, NumPorts int, GPU bool, ContainerName string) (*d // RemoveContianer Stops and removes container from the server func RemoveContianer(IP string,ID string) error { - URL := "http://" + IP + ":" + serverPort + "/RemoveContainer?id=" + ID + var URL string + version := p2p.Ip4or6(IP) + if version == "version 6" { + URL = "http://[" + IP + "]:" + serverPort + "/RemoveContainer?id=" + ID + } else { + URL = "http://" + IP + ":" + serverPort + "/RemoveContainer?id=" + ID + } resp, err := http.Get(URL) if err != nil { return err @@ -69,7 +83,13 @@ func RemoveContianer(IP string,ID string) error { // ViewContainers This function displays all containers available on server side func ViewContainers(IP string)(*docker.DockerContainers, error){ // Passes URL with route /ShowImages - URL := "http://" + IP + ":" + serverPort + "/ShowImages" + var URL string + version := p2p.Ip4or6(IP) + if version == "version 6" { + URL = "http://[" + IP + "]:" + serverPort + "/ShowImages" + } else { + URL = "http://" + IP + ":" + serverPort + "/ShowImages" + } resp, err := http.Get(URL) if err != nil { return nil,err diff --git a/client/iptable_test.go b/client/iptable_test.go index a536bdf..51e6de1 100644 --- a/client/iptable_test.go +++ b/client/iptable_test.go @@ -1,6 +1,8 @@ package client -import "testing" +import ( + "testing" +) func TestUpdateIpTableListClient(t *testing.T) { err := UpdateIpTableListClient() @@ -8,4 +10,5 @@ func TestUpdateIpTableListClient(t *testing.T) { if err != nil { t.Error(err) } -} \ No newline at end of file +} + diff --git a/config/config.go b/config/config.go index c51d04a..e3cc0be 100644 --- a/config/config.go +++ b/config/config.go @@ -12,6 +12,7 @@ var ( "DockerContainers": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/", "DefaultDockerFile": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/docker-ubuntu-sshd/", "SpeedTestFile":"/etc/p2p-rendering/50.bin", + "NetworkInterface": "wlp0s20f3", } configName = "config" configType = "json" @@ -24,6 +25,7 @@ type Config struct { DockerContainers string DefaultDockerFile string SpeedTestFile string + NetworkInterface string } // Exists reports whether the named file or directory exists. @@ -50,6 +52,7 @@ func SetDefaults() error { defaults["DefaultDockerFile"] = defaultPath + "server/docker/containers/docker-ubuntu-sshd/" defaults["DockerContainers"] = defaultPath + "server/docker/containers/" defaults["SpeedTestFile"] = defaultPath + "p2p/50.bin" + defaults["NetworkInterface"] = "wlp0s20f3" //Paths to search for config file configPaths = append(configPaths, defaultPath) diff --git a/go.sum b/go.sum index 484b2b8..70b1bcb 100644 --- a/go.sum +++ b/go.sum @@ -42,7 +42,6 @@ github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcy github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3 h1:mw6pDQqv38/WGF1cO/jF5t/jyAJ2yi7CmtFLLO5tGFI= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= @@ -161,7 +160,6 @@ github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+ github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -287,7 +285,6 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= @@ -352,7 +349,6 @@ github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -369,12 +365,10 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5 h1:hyz3dwM5QLc1Rfoz4FuWJQG5BN7tc6K1MndAUnGpQr4= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -409,11 +403,9 @@ github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGq github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf h1:Un6PNx5oMK6CCwO3QTUyPiK2mtZnPrpDl5UnZ64eCkw= github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -447,7 +439,6 @@ github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -553,7 +544,6 @@ github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRci github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -617,7 +607,6 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -697,7 +686,6 @@ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -752,7 +740,6 @@ golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -764,7 +751,6 @@ golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fq golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= @@ -812,7 +798,6 @@ golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a h1:CB3a9Nez8M13wwlr/E2YtwoU+qYHKfC+JrDa45RXXoQ= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -856,7 +841,6 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -890,7 +874,6 @@ gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4 gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -910,7 +893,6 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/p2p/ip_table.json b/p2p/ip_table.json index 4bb8d5d..865ad71 100644 --- a/p2p/ip_table.json +++ b/p2p/ip_table.json @@ -1,14 +1,9 @@ { "ip_address": [ { - "ipv4": "0.0.0.0", - "latency": 453359, - "download": 0, - "upload": 0 - }, - { - "ipv4": "127.0.0.1", - "latency": 410267, + "ipv4": "", + "ipv6": "2001:8f8:172d:ee93:7588:ad57:c351:3309", + "latency": 462096, "download": 0, "upload": 0 } diff --git a/p2p/iptable.go b/p2p/iptable.go index ac7e7f9..9467a77 100644 --- a/p2p/iptable.go +++ b/p2p/iptable.go @@ -2,9 +2,12 @@ package p2p import ( "encoding/json" + "errors" "fmt" "git.sr.ht/~akilan1999/p2p-rendering-computation/config" "io/ioutil" + "net" + "net/http" "os" "time" ) @@ -17,11 +20,16 @@ type IpAddresses struct { type IpAddress struct { Ipv4 string `json:"ipv4"` + Ipv6 string `json:"ipv6"` Latency time.Duration `json:"latency"` Download float64 `json:"download"` Upload float64 `json:"upload"` } +type IP struct { + Query string +} + // ReadIpTable Read data from Ip tables from json file func ReadIpTable()(*IpAddresses ,error){ // Get Path from config @@ -49,11 +57,38 @@ func ReadIpTable()(*IpAddresses ,error){ // jsonFile's content into 'users' which we defined above json.Unmarshal(byteValue, &ipAddresses) + var PublicIP IpAddress + + ipv6, err := GetCurrentIPV6() + if err != nil { + return nil, err + } + + ip, err := CurrentPublicIP() + if err != nil { + return nil, err + } + PublicIP.Ipv4 = ip + PublicIP.Ipv6 = ipv6 + + // Updates current machine IP address to the IP table + ipAddresses.IpAddress = append(ipAddresses.IpAddress, PublicIP) + + //before writing to iptable ensures the duplicates are removed + if err = ipAddresses.RemoveDuplicates(); err != nil { + return nil, err + } + return &ipAddresses, nil } // WriteIpTable Write to IP table json file func (i *IpAddresses) WriteIpTable() error { + //before writing to iptable ensures the duplicates are removed + if err := i.RemoveDuplicates(); err != nil { + return err + } + file, err := json.MarshalIndent(i, "", " ") if err != nil { return err @@ -82,8 +117,8 @@ func PrintIpTable() error { } for i := 0; i < len(table.IpAddress); i++ { - fmt.Printf("\nIP Address: %s\nLatency: %s\n-----------" + - "-----------------\n",table.IpAddress[i].Ipv4, + fmt.Printf("\nIP Address: %s\nIPV6: %s\nLatency: %s\n-----------" + + "-----------------\n",table.IpAddress[i].Ipv4,table.IpAddress[i].Ipv6, table.IpAddress[i].Latency) } return nil @@ -91,17 +126,13 @@ func PrintIpTable() error { // RemoveDuplicates This is a temporary fix current functions failing to remove // Duplicate IP addresses from local IP table -func RemoveDuplicates() error { - table, err := ReadIpTable() - if err != nil { - return err - } +func (table *IpAddresses)RemoveDuplicates() error { var NoDuplicates IpAddresses for i, _:= range table.IpAddress { Exists := false for k := range NoDuplicates.IpAddress { - if NoDuplicates.IpAddress[k].Ipv4 == table.IpAddress[i].Ipv4 { + if NoDuplicates.IpAddress[k].Ipv4 == table.IpAddress[i].Ipv4 || (NoDuplicates.IpAddress[k].Ipv6 != "" && NoDuplicates.IpAddress[k].Ipv6 == table.IpAddress[i].Ipv6){ Exists = true break } @@ -113,9 +144,67 @@ func RemoveDuplicates() error { NoDuplicates.IpAddress = append(NoDuplicates.IpAddress, table.IpAddress[i]) } - if err := NoDuplicates.WriteIpTable(); err != nil { - return nil - } + table.IpAddress = NoDuplicates.IpAddress return nil +} + +// CurrentPublicIP Get Current Public IP address +func CurrentPublicIP() (string,error) { + req, err := http.Get("http://ip-api.com/json/") + if err != nil { + return "",err + } + defer req.Body.Close() + + body, err := ioutil.ReadAll(req.Body) + if err != nil { + return "",err + } + + var ip IP + json.Unmarshal(body, &ip) + + return ip.Query, nil +} + +// GetCurrentIPV6 gets the current IPV6 address based on the interface +// specified in the config file +func GetCurrentIPV6()(string,error){ + Config, err := config.ConfigInit() + if err != nil { + return "",err + } + byNameInterface, err := net.InterfaceByName(Config.NetworkInterface) + if err != nil { + return "",err + } + addresses, err := byNameInterface.Addrs() + if err != nil { + return "",err + } + if addresses[1].String() == "" { + return "",errors.New("IPV6 address not detected") + } + IP,_,err := net.ParseCIDR(addresses[1].String()) + if err != nil { + return "",err + } + + return IP.String(), nil +} + +// Ip4or6 Helper function to check if the IP address is IPV4 or +//IPV6 (https://socketloop.com/tutorials/golang-check-if-ip-address-is-version-4-or-6) +func Ip4or6(s string) string { + for i := 0; i < len(s); i++ { + switch s[i] { + case '.': + return "version 4" + case ':': + return "version 6" + } + } + return "unknown" + } \ No newline at end of file diff --git a/p2p/iptable_test.go b/p2p/iptable_test.go index 6d8a9b6..6248012 100644 --- a/p2p/iptable_test.go +++ b/p2p/iptable_test.go @@ -1,6 +1,7 @@ package p2p import ( + "fmt" "testing" ) @@ -20,3 +21,40 @@ func TestReadIpTable(t *testing.T) { t.Fatal(err) } } + +// Testing is a IPV6 address is returned +func TestGetCurrentIPV6(t *testing.T) { + res, err := GetCurrentIPV6() + + if err != nil { + t.Error(err) + } + + fmt.Println(res) +} + +// This test ensures that the duplicate function works as intended +func TestIpAddresses_RemoveDuplicates(t *testing.T) { + var testduplicates IpAddresses + var duplicateaddress1 IpAddress + var duplicateaddress2 IpAddress + + duplicateaddress1.Ipv6="2001:8f8:172d:ee93:7588:ad57:c351:3309" + duplicateaddress1.Ipv4="0.0.0.0" + + duplicateaddress2.Ipv6="2001:8f8:172d:ee93:7588:ad57:c351:3309" + duplicateaddress2.Ipv4="0.0.0.0" + + testduplicates.IpAddress = append(testduplicates.IpAddress, duplicateaddress1) + testduplicates.IpAddress = append(testduplicates.IpAddress, duplicateaddress2) + + err := testduplicates.RemoveDuplicates() + if err != nil { + t.Error(err) + } + + if len(testduplicates.IpAddress) == 2 { + t.Fail() + } + +} diff --git a/p2p/speedtest.go b/p2p/speedtest.go index 76f4e31..6a2f56c 100644 --- a/p2p/speedtest.go +++ b/p2p/speedtest.go @@ -49,7 +49,7 @@ func (ip *IpAddresses)SpeedTest() error{ return nil } -// SpeedTestUpdatedIPTable Called when ip tables from client/server is also passed on +// SpeedTestUpdatedIPTable Called when ip tables from httpclient/server is also passed on func (ip *IpAddresses)SpeedTestUpdatedIPTable() error{ targets, err := ReadIpTable() if err != nil { @@ -63,18 +63,20 @@ func (ip *IpAddresses)SpeedTestUpdatedIPTable() error{ for i, _ := range targets.IpAddress { // To ensure that there are no duplicate IP addresses - Exists := false - for k := range ip.IpAddress { - if ip.IpAddress[k].Ipv4 == targets.IpAddress[i].Ipv4 { - Exists = true - break - } - } - - // If the struct exists then continues - if Exists { - continue - } + //Exists := false + //for k := range ip.IpAddress { + // // Checks if both the IPV4 addresses are the same or the IPV6 address is not + // // an empty string and IPV6 address are the same + // if ip.IpAddress[k].Ipv4 == targets.IpAddress[i].Ipv4 || (targets.IpAddress[i].Ipv6 != "" && ip.IpAddress[k].Ipv6 == targets.IpAddress[i].Ipv6) { + // Exists = true + // break + // } + //} + // + //// If the struct exists then continues + //if Exists { + // continue + //} ip.IpAddress = append(ip.IpAddress, targets.IpAddress[i]) } diff --git a/p2p/testingMetrics.go b/p2p/testingMetrics.go index 1584bfd..94f2f17 100644 --- a/p2p/testingMetrics.go +++ b/p2p/testingMetrics.go @@ -14,7 +14,7 @@ import ( //var dlSizes = [...]int{350, 500, 750, 1000, 1500, 2000, 2500, 3000, 3500, 4000} //var ulSizes = [...]int{100, 300, 500, 800, 1000, 1500, 2500, 3000, 3500, 4000} //kB -var client = http.Client{} +var httpclient = http.Client{} // DownloadTest executes the test to measure download speed //func (s *IpAddress) DownloadTest(savingMode bool) error { @@ -80,7 +80,7 @@ var client = http.Client{} // Download Speed func (s *IpAddress)DownloadSpeed() error { start := time.Now() - resp, err := client.Get("http://" + s.Ipv4 + ":8088/50") + resp, err := httpclient.Get("http://" + s.Ipv4 + ":8088/50") if err != nil { return err } @@ -150,7 +150,14 @@ func mustOpen(f string) *os.File { // PingTest executes test to measure latency func (s *IpAddress) PingTest() error { //pingURL := strings.Split(s.URL, "/upload")[0] + "/latency.txt" - pingURL := "http://" + s.Ipv4 + ":8088/server_info" + var pingURL string + if s.Ipv6 != "" { + pingURL = "http://[" + s.Ipv6 + "]:8088/server_info" + s.Ipv4 = "" + } else { + pingURL = "http://" + s.Ipv4 + ":8088/server_info" + } + l := time.Duration(100000000000) // 10sec for i := 0; i < 3; i++ { sTime := time.Now() diff --git a/p2p/upnp_test.go b/p2p/upnp_test.go deleted file mode 100644 index e347d0a..0000000 --- a/p2p/upnp_test.go +++ /dev/null @@ -1,21 +0,0 @@ -package p2p - -import( - "testing" -) - -func TestAddRemoveUpnp(t *testing.T){ - - // forwarding port 23241 via upnp - err := ForwardPort(23241) - if err != nil { - t.Errorf("Error returned: %q", err) - } - - // unforwarding port 23241 via upnp - err = UnForwardPort(23241) - if err != nil { - t.Errorf("Error returned: %q", err) - } - -} diff --git a/server/server.go b/server/server.go index 7f847ff..8399862 100644 --- a/server/server.go +++ b/server/server.go @@ -43,7 +43,12 @@ func Server() error{ r.POST("/IpTable", func(c *gin.Context) { // Getting IPV4 address of client var ClientHost p2p.IpAddress - ClientHost.Ipv4 = c.ClientIP() + + if p2p.Ip4or6(c.ClientIP()) == "version 6" { + ClientHost.Ipv6 = c.ClientIP() + } else { + ClientHost.Ipv4 = c.ClientIP() + } // Variable to store IP table information var IPTable p2p.IpAddresses @@ -77,12 +82,6 @@ func Server() error{ c.String(http.StatusOK, fmt.Sprint(err)) } - // Called step to remove duplicate IP addresses - err = p2p.RemoveDuplicates() - if err != nil { - c.String(http.StatusOK, fmt.Sprint(err)) - } - // Reads IP addresses from ip table IpAddresses,err := p2p.ReadIpTable() if err != nil { @@ -132,24 +131,6 @@ func Server() error{ c.JSON(http.StatusOK, resp) }) - // Future feature - /*r.GET("/create_vm/:virtualization", func(c *gin.Context) { - virtualization := c.Param("virtualization") - // Runs based on Preallocated VM size - if virtualization == "docker" { - sshinfo,err := docker.RunVM() - if err != nil { - c.String(http.StatusInternalServerError, fmt.Sprintf("error: %s", err)) - } - if sshinfo != nil { - c.JSON(http.StatusOK, sshinfo) - } - - } else { - c.String(200,"virtualization tool not selected") - } - })*/ - // Port running on err := r.Run(":8088") if err != nil {