16 Commits

Author SHA1 Message Date
Akilan Selvacoumar
68228a6013 Merge pull request #45 from Akilan1999/default-docker-container
added fix in if statement to fix simple error when adding ipv6 address
2021-07-10 00:17:01 +04:00
ae2500ed4b added fix in if statement to fix simple error when adding ipv6 address 2021-07-10 00:05:31 +04:00
Akilan Selvacoumar
5be8778652 Merge pull request #44 from Akilan1999/gitignore-iptable
gitignore iptable
2021-07-08 23:27:00 +04:00
6dde485de1 add gitignore for iptable 2021-07-08 23:23:34 +04:00
c0f70e87f4 added .gitignore for iptable 2021-07-08 22:47:51 +04:00
Akilan Selvacoumar
6df72c4abb Create CNAME 2021-07-08 22:25:09 +04:00
Akilan Selvacoumar
26e6fd4ec2 Merge pull request #43 from Akilan1999/addwebsite
added index.html page
2021-07-08 22:22:28 +04:00
aabac388ba added index.html page 2021-07-08 22:21:42 +04:00
Akilan Selvacoumar
655c5de4ec Merge pull request #42 from Akilan1999/update-install-docs
updated installation docs
2021-07-08 20:57:54 +04:00
3e8a99b435 updated installation docs 2021-07-08 20:55:42 +04:00
Akilan Selvacoumar
5e7f540802 Merge pull request #41 from Akilan1999/ipv6-add-fix
fixed ipv6 dectection error
2021-07-08 19:46:09 +04:00
28620b61ad fixed ipv6 dectection error 2021-07-08 19:42:41 +04:00
Akilan Selvacoumar
6f6072f598 Merge pull request #39 from Akilan1999/addcliipv6
Cli for add server accepts ipv4 and ipv6 address
2021-07-06 15:36:28 +04:00
f7bae1100a added possibility to add ipv4 and ipv6 address 2021-07-06 15:34:18 +04:00
a0b63fa2ec uncomitted changes 2021-07-06 15:25:52 +04:00
Akilan Selvacoumar
5b90bf3168 Update Installation.md 2021-06-26 00:38:28 +04:00
13 changed files with 223 additions and 76 deletions

3
.gitignore vendored
View File

@@ -8,3 +8,6 @@ p2p-rendering-computation
p2prc p2prc
config.json config.json
.vscode/ .vscode/
#ignore generated iptables
p2p/iptable/

1
CNAME Normal file
View File

@@ -0,0 +1 @@
p2prc.akilan.io

View File

@@ -2,6 +2,11 @@
Over here we will cover the basic steps to get the server and client side running. Over here we will cover the basic steps to get the server and client side running.
## Alpha release install
https://github.com/Akilan1999/p2p-rendering-computation/releases/tag/v1.0.0-alpha
## Install from Github master branch
### Install Go lang ### Install Go lang
The entire the implementation of this project is done using Go lang. The entire the implementation of this project is done using Go lang.
Thus, we need go lang to compile to code to a binary file. Thus, we need go lang to compile to code to a binary file.
@@ -27,6 +32,19 @@ into a single binary
make install make install
``` ```
### Add appropriate paths to .bashrc
```
export P2PRC=/<PATH>/p2p-rendering-computation
export PATH=/<PATH>/p2p-rendering-computation:${PATH}
```
### Set up configuration file
```
make configfile
```
Open the config file ```config.json``` and add the IPv6 address
if you have one.
### Test if binary works ### Test if binary works
``` ```
p2prc --help p2prc --help
@@ -37,7 +55,7 @@ NAME:
p2p-rendering-computation - p2p cli application to create and access VMs in other servers p2p-rendering-computation - p2p cli application to create and access VMs in other servers
USAGE: USAGE:
p2p-rendering-computation [global options] command [command options] [arguments...] p2prc [global options] command [command options] [arguments...]
VERSION: VERSION:
1.0.0 1.0.0
@@ -46,22 +64,72 @@ COMMANDS:
help, h Shows a list of commands or help for one command help, h Shows a list of commands or help for one command
GLOBAL OPTIONS: GLOBAL OPTIONS:
--Mode value Specifies mode of running (default: "client") [$P2P_MODE] --Server, -s Starts server (default: false) [$SERVER]
--UpdateServerList Update List of Server available based on servers iptables (default: false) [$UPDATE_SERVER_LIST] --UpdateServerList, --us Update List of Server available based on servers iptables (default: false) [$UPDATE_SERVER_LIST]
--ListServers List servers which can render tasks (default: false) [$LIST_SERVERS] --ListServers, --ls List servers which can render tasks (default: false) [$LIST_SERVERS]
--CreateVM value Creates Docker container on the selected server [$CREATE_VM] --AddServer value, --as value Adds server IP address to iptables [$ADD_SERVER]
--RemoveVM value Stop and Remove Docker container [$REMOVE_VM] --ViewImages value, --vi value View images available on the server IP address [$VIEW_IMAGES]
--ID value Docker Container ID [$ID] --CreateVM value, --touch value Creates Docker container on the selected server [$CREATE_VM]
--Ports value Number of ports to open for the Docker Container [$NUM_PORTS] --ContainerName value, --cn value Specifying the container run on the server side [$CONTAINER_NAME]
--GPU Create Docker Containers to access GPU (default: false) [$USE_GPU] --RemoveVM value, --rm value Stop and Remove Docker container [$REMOVE_VM]
--Specs value Specs of the server node [$SPECS] --ID value, --id value Docker Container ID [$ID]
--SetDefaultConfig Sets a default configuration file (default: false) [$SET_DEFAULT_CONFIG] --Ports value, -p value Number of ports to open for the Docker Container [$NUM_PORTS]
--help, -h show help (default: false) --GPU, --gpu Create Docker Containers to access GPU (default: false) [$USE_GPU]
--version, -v print the version (default: false) --Specification value, --specs value Specs of the server node [$SPECS]
--SetDefaultConfig, --dc Sets a default configuration file (default: false) [$SET_DEFAULT_CONFIG]
--NetworkInterfaces, --ni Shows the network interface in your computer (default: false) [$NETWORK_INTERFACE]
--help, -h show help (default: false)
--version, -v print the version (default: false)
``` ```
<br>
--------------
<br>
# Using the Cli commands
### Start as a server
Do ensure you have docker installed for this
```
p2prc -s
```
### View server Speciafication
```
p2prc --specs=<ip address>
```
### Run container
use the ```--gpu``` if you know the other machine has a gpu.
```
p2prc --touch=<server ip address> -p <number of ports> --gpu
```
### Remove container
The docker id is present in the output where you create a container
```
p2prc --rm=<server ip address> --id=<docker container id>
```
### Adding servers to ip table
```
p2prc --as=<server ip address you want to add>
```
### Update ip table
```
p2prc --us
```
### List Servers
```
p2prc --ls
```
### View Network interfaces
```
p2prc --ni
```
#### Note: The steps on how to use the commands will be added later.

View File

@@ -41,12 +41,18 @@ var CliAction = func(ctx *cli.Context) error {
//Create variable of type IpAddress and set IP address //Create variable of type IpAddress and set IP address
// to it // to it
var IpAddr p2p.IpAddress var IpAddr p2p.IpAddress
IpAddr.Ipv4 = AddServer
//Checking if the address is a ipv4
// or ipv6 address
ip4Orip6 := p2p.Ip4or6(AddServer)
if ip4Orip6 == "version 6" {
IpAddr.Ipv6 = AddServer
} else {
IpAddr.Ipv4 = AddServer
}
// Append IP address to variable result which // Append IP address to variable result which
// is a list // is a list
res.IpAddress = append(res.IpAddress, IpAddr) res.IpAddress = append(res.IpAddress, IpAddr)
// Adds the new server IP to the iptable // Adds the new server IP to the iptable
res.WriteIpTable() res.WriteIpTable()

View File

@@ -108,7 +108,6 @@ var AppConfigFlags = []cli.Flag{
EnvVars: []string{"SPECS"}, EnvVars: []string{"SPECS"},
Destination: &Specs, Destination: &Specs,
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "SetDefaultConfig", Name: "SetDefaultConfig",
Aliases: []string{"dc"}, Aliases: []string{"dc"},

View File

@@ -2,6 +2,7 @@ package config
import ( import (
"github.com/spf13/viper" "github.com/spf13/viper"
"io"
"os" "os"
) )
@@ -12,8 +13,6 @@ var (
"DockerContainers": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/", "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/", "DefaultDockerFile": "/home/akilan/Documents/p2prendering/p2p-redering-computation/server/docker/containers/docker-ubuntu-sshd/",
"SpeedTestFile":"/etc/p2p-rendering/50.bin", "SpeedTestFile":"/etc/p2p-rendering/50.bin",
"NetworkInterface": "wlp0s20f3",
"NetworkInterfaceIPV6Index": "1",
} }
configName = "config" configName = "config"
configType = "json" configType = "json"
@@ -26,8 +25,9 @@ type Config struct {
DockerContainers string DockerContainers string
DefaultDockerFile string DefaultDockerFile string
SpeedTestFile string SpeedTestFile string
NetworkInterface string IPV6Address string
NetworkInterfaceIPV6Index int //NetworkInterface string
//NetworkInterfaceIPV6Index int
} }
// Exists reports whether the named file or directory exists. // Exists reports whether the named file or directory exists.
@@ -40,6 +40,30 @@ func fileExists(name string) bool {
return true return true
} }
// Copy the src file to dst. Any existing file will be overwritten and will not
// copy file attributes.
// Source: https://stackoverflow.com/questions/21060945/simple-way-to-copy-a-file
func Copy(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
if err != nil {
return err
}
return out.Close()
}
// SetDefaults This function to be called only during a // SetDefaults This function to be called only during a
// make install // make install
func SetDefaults() error { func SetDefaults() error {
@@ -49,13 +73,21 @@ func SetDefaults() error {
//Setting current directory to default path //Setting current directory to default path
defaultPath = curDir + "/" defaultPath = curDir + "/"
//Create ip_table.json in the json directory
err := Copy("p2p/ip_table.json","p2p/iptable/ip_table.json")
if err != nil {
return err
}
//Setting default paths for the config file //Setting default paths for the config file
defaults["IPTable"] = defaultPath + "p2p/ip_table.json" defaults["IPTable"] = defaultPath + "p2p/iptable/ip_table.json"
defaults["DefaultDockerFile"] = defaultPath + "server/docker/containers/docker-ubuntu-sshd/" defaults["DefaultDockerFile"] = defaultPath + "server/docker/containers/docker-ubuntu-sshd/"
defaults["DockerContainers"] = defaultPath + "server/docker/containers/" defaults["DockerContainers"] = defaultPath + "server/docker/containers/"
defaults["SpeedTestFile"] = defaultPath + "p2p/50.bin" defaults["SpeedTestFile"] = defaultPath + "p2p/50.bin"
defaults["NetworkInterface"] = "wlp0s20f3" defaults["IPV6Address"] = ""
defaults["NetworkInterfaceIPV6Index"] = "2" //defaults["NetworkInterface"] = "wlp0s20f3"
//defaults["NetworkInterfaceIPV6Index"] = "2"
//Paths to search for config file //Paths to search for config file
configPaths = append(configPaths, defaultPath) configPaths = append(configPaths, defaultPath)
@@ -68,7 +100,7 @@ func SetDefaults() error {
} }
//Calling configuration file //Calling configuration file
_, err := ConfigInit() _, err = ConfigInit()
if err != nil { if err != nil {
return err return err
} }

47
index.html Normal file
View File

@@ -0,0 +1,47 @@
<html>
<head>
<title>P2PRC</title>
<style>
body { font-family: sans-serif; }
</style>
</head>
<body>
<img src="Docs/images/p2prclogo.png" alt="P2PRC">
<h1>P2PRC</h1>
<b>A peer to peer network designed for computation</b>
<p>P2PRC is peer to peer to network designed for computation reasons.</p>
<p>This project was developed during my 4th year dissertation at Heriot-Watt university and We are getting the
project to a usable state. </p>
<p> It's purpose is for people to use each others computers rather than servers such as AWS and Azure. </p>
<p><b>Project:</b></p>
<ul>
<li><a href="https://github.com/Akilan1999/p2p-rendering-computation">P2PRC on GitHub</a></li>
<li><a href="https://discord.gg/b4nRGTjYqy">P2PRC Discord Server</a> <font color="red">(join here to chat!)</font></li>
</ul>
<p><b>Community Server to download public network</b></p>
<ul>
<li>
<b>IP Address: 172.104.44.195</a></b>
<p>Use this server to only download part of the p2p network</p>
</li>
</ul>
<p><b>Main developer:</b></p>
<ul>
<li>
<b><a href="https://akilan.io">Akilan Selvacoumar</a></b>
</li>
</ul>
<p><b>Other links:</b></p>
<ul>
<li><a href="https://www.youtube.com/channel/UChy18QB1hBzZ7MniIW_FJvQ">Akilan Selvacoumar on YouTube</a></li>
</ul>
</body></html>

View File

@@ -1,9 +1,9 @@
{ {
"ip_address": [ "ip_address": [
{ {
"ipv4": "", "ipv4": "172.104.44.195",
"ipv6": "2001:8f8:172d:ee93:7588:ad57:c351:3309", "ipv6": "",
"latency": 1213198, "latency": 0,
"download": 0, "download": 0,
"upload": 0 "upload": 0
} }

View File

@@ -2,7 +2,6 @@ package p2p
import ( import (
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"git.sr.ht/~akilan1999/p2p-rendering-computation/config" "git.sr.ht/~akilan1999/p2p-rendering-computation/config"
"io/ioutil" "io/ioutil"
@@ -132,12 +131,11 @@ func (table *IpAddresses)RemoveDuplicates() error {
for i, _:= range table.IpAddress { for i, _:= range table.IpAddress {
Exists := false Exists := false
for k := range NoDuplicates.IpAddress { for k := range NoDuplicates.IpAddress {
if NoDuplicates.IpAddress[k].Ipv4 == table.IpAddress[i].Ipv4 || (NoDuplicates.IpAddress[k].Ipv6 != "" && NoDuplicates.IpAddress[k].Ipv6 == table.IpAddress[i].Ipv6){ if (NoDuplicates.IpAddress[k].Ipv4 != "" && NoDuplicates.IpAddress[k].Ipv4 == table.IpAddress[i].Ipv4) || (NoDuplicates.IpAddress[k].Ipv6 != "" && NoDuplicates.IpAddress[k].Ipv6 == table.IpAddress[i].Ipv6) {
Exists = true Exists = true
break break
} }
} }
if Exists { if Exists {
continue continue
} }
@@ -175,23 +173,25 @@ func GetCurrentIPV6()(string,error){
if err != nil { if err != nil {
return "",err 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[Config.NetworkInterfaceIPV6Index].String())
if err != nil {
return "",err
}
return IP.String(), nil // Fix in future release
//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[Config.NetworkInterfaceIPV6Index].String())
//if err != nil {
// return "",err
//}
return Config.IPV6Address, nil
} }
// ViewNetworkInterface This function is created to view the network interfaces available // ViewNetworkInterface This function is created to view the network interfaces available
@@ -230,6 +230,6 @@ func Ip4or6(s string) string {
return "version 6" return "version 6"
} }
} }
return "unknown" return "version 6"
} }

0
p2p/iptable/.gitkeep Normal file
View File

View File

@@ -65,3 +65,13 @@ func TestViewNetworkInterface(t *testing.T) {
t.Error() t.Error()
} }
} }
func TestIp4or6(t *testing.T) {
// This test ensures that the ipv6 address gets detected
test := "2001:8f8:172d:7e27:4f23:ae4:bce5:e037"
res := Ip4or6(test)
if res != "version 6" {
t.Fail()
}
}

View File

@@ -1,21 +0,0 @@
package main
import (
"fmt"
"github.com/showwin/speedtest-go/speedtest"
)
func main() {
user, _ := speedtest.FetchUserInfo()
serverList, _ := speedtest.FetchServerList(user)
targets, _ := serverList.FindServer([]int{})
for _, s := range targets {
s.PingTest()
s.DownloadTest(false)
s.UploadTest(false)
fmt.Printf("Latency: %s, Download: %f, Upload: %f\n", s.Latency, s.DLSpeed, s.ULSpeed)
}
}

View File

@@ -4,7 +4,7 @@ import (
"testing" "testing"
) )
func TestDocker(t *testing.T) { func TestDockerUbuntuSSHDProvided(t *testing.T) {
// Testing by providing default container name // Testing by providing default container name
_,err := BuildRunContainer(2,"false","docker-ubuntu-sshd") _,err := BuildRunContainer(2,"false","docker-ubuntu-sshd")
@@ -12,13 +12,15 @@ func TestDocker(t *testing.T) {
t.Error(err) t.Error(err)
} }
// Testing if no container name is provided if default is used }
_,err = BuildRunContainer(2,"false","")
func TestDockerDefaultContainer(t *testing.T) {
// Testing by providing without providing default container name
_,err := BuildRunContainer(2,"false","")
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
} }
func TestContainerHorovod(t *testing.T) { func TestContainerHorovod(t *testing.T) {