Compare commits
5 Commits
v2.0.0
...
untracked-
| Author | SHA1 | Date | |
|---|---|---|---|
| d2d1b5bc9f | |||
| 888ad8acb7 | |||
| e5d4381fd9 | |||
| c7be50d3b7 | |||
| 1c06d5b882 |
11
.gitignore
vendored
11
.gitignore
vendored
@@ -11,16 +11,23 @@ config.json
|
|||||||
|
|
||||||
#ignore generated iptables
|
#ignore generated iptables
|
||||||
p2p/iptable/
|
p2p/iptable/
|
||||||
|
!p2p/iptable/.gitkeep
|
||||||
#ignore plugins added
|
#ignore plugins added
|
||||||
plugin/deploy/
|
plugin/deploy/
|
||||||
|
!plugin/deploy/.gitkeep
|
||||||
#ignore track container file
|
#ignore track container file
|
||||||
client/trackcontainers/
|
client/trackcontainers/
|
||||||
|
!client/trackcontainers/.gitkeep
|
||||||
# Test generated files
|
# Test generated files
|
||||||
generate/p2prctest
|
generate/p2prctest
|
||||||
|
!generate/p2prctest/.gitkeep
|
||||||
generate/Test
|
generate/Test
|
||||||
|
!generate/Test/.gitkeep
|
||||||
|
|
||||||
#ignore windows exe files
|
#ignore windows exe files
|
||||||
*.exe
|
*.exe
|
||||||
dist/
|
dist/
|
||||||
|
|
||||||
# ignore docker image files
|
#MACOS .idea file
|
||||||
server/docker/containers/
|
.DS_Store
|
||||||
|
.gitkeep
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
# Abstractions
|
|
||||||
The Abstractions package consists of black-boxed functions for P2PRC.
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
- ```Init(<Project name>)```: Initializes P2PRC with all the needed configurations.
|
|
||||||
- ```Start()```: Starts p2prc as a server and makes it possible to extend by adding other routes and functionality to P2PRC.
|
|
||||||
116
Docs/GenerateImplementation.md
Normal file
116
Docs/GenerateImplementation.md
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
# Generate Module
|
||||||
|
P2PRC is a great layer of abstraction. This means that in many cases it is not an end product but rather
|
||||||
|
a tool that customized as an end product. An example would be writing your own billing module to monetize
|
||||||
|
the computation power available. The generate module copies the current with the appropriate git histories
|
||||||
|
and keeps only the go files which would be useful to edit. To use the generate module the user will need
|
||||||
|
to have a go compiler present in his computer. Due to the introduction of this module there will 2 releases:
|
||||||
|
|
||||||
|
- Regular Release (Consists of only the build binary and cli command cannot access the generate module)
|
||||||
|
- Developer Release (Consists of important Go files and the cli can access the generate module)
|
||||||
|
|
||||||
|
## How does this work ?
|
||||||
|
|
||||||
|
### [Struct information](https://github.com/Akilan1999/p2p-rendering-computation/blob/9d69aed8ce0fe5273aaff2828f7d51c3d5ac2ce4/generate/generate.go#L19)
|
||||||
|
- ### ```Generate.go```:
|
||||||
|
This file creates a local copy of P2PRC from where the CLI was called from.
|
||||||
|
This go file also does various stuff like instruction of file should be ignored when copying and
|
||||||
|
which of should not be. Now let's understand this. Below is a sample code which does the following:
|
||||||
|
|
||||||
|
```go
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
// Action performed:
|
||||||
|
// - Ensuring main.go file exists
|
||||||
|
// - Skipping all .go files apart from the ones listed above
|
||||||
|
// - Skipping .idea/ directory
|
||||||
|
// - Skipping Makefile file
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
Options.Skip = func(src string) (bool, error) {
|
||||||
|
switch {
|
||||||
|
case strings.HasSuffix(src, "main.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, ".go"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, ".idea"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, "Makefile"):
|
||||||
|
return true, nil
|
||||||
|
default:
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Doing the copy
|
||||||
|
err = copy.Copy("<P2PRC folder you want to copy from>", "<PATH to the directory>", Options)
|
||||||
|
```
|
||||||
|
|
||||||
|
Unfortunately currently this will have to be manually edited in the ```Generate.go``` file. When using the generate
|
||||||
|
module the user also creates their own Go module which is the modified version of P2PRC. This means
|
||||||
|
if the 1 modified package is using another modified package then the appropriate import have to be modified
|
||||||
|
in the file where the import is called:
|
||||||
|
|
||||||
|
Ex:
|
||||||
|
```go
|
||||||
|
//Sample Project module name = Test
|
||||||
|
//Package names:
|
||||||
|
//- Test/Genius
|
||||||
|
//- Test/GeGeGenuis
|
||||||
|
//
|
||||||
|
// When we call the generate function with the new project with the module name = MicDrop
|
||||||
|
// The new package name would be:
|
||||||
|
// - MicDrop/Genius
|
||||||
|
// - MicDrop/GeGeGenuis
|
||||||
|
|
||||||
|
// Test/Genius code depends on the package Test/GeGeGenuis
|
||||||
|
import (
|
||||||
|
"Test/GeGeGenuis"
|
||||||
|
)
|
||||||
|
|
||||||
|
// When we create a new module with the copy of the
|
||||||
|
// existing project we need change:
|
||||||
|
import (
|
||||||
|
"MicDrop/GeGeGenuis"
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
To do this we have built functions which can modify import names in the Go file provided.
|
||||||
|
To customize the use case of your generate module you would need to manually add your own
|
||||||
|
imports which are supposed to be replaced and in which files they are supposed to be replaced
|
||||||
|
in.
|
||||||
|
|
||||||
|
```go
|
||||||
|
// 1.0 - Test/Genius.go -> GeGeGenuis module
|
||||||
|
// a is struct of type NewProject
|
||||||
|
a.FileNameAST = "<path to project to copy from>/Test/Genius.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err := a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports("Test/GeGeGenuis", "MicDrop/GeGeGenuis")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Higher order of execution of ```Generate.go```:
|
||||||
|
1. Copy entire P2PRC project and ignores files which are not meant to be copied
|
||||||
|
2. The folder name will be based on the new project name and the module name based on the new
|
||||||
|
module name provided.
|
||||||
|
3. Modifies the appropriate imports in the project as instructed in the code.
|
||||||
|
4. Creates a commit with the new changes in the new project.
|
||||||
|
|
||||||
|
|
||||||
|
- ### ``` modifyGenerate.go```:
|
||||||
|
This a really simple implementation where we replace the imports
|
||||||
|
in certain files as instructed from ```generate.go```. To do we create an AST (i.e Abstract Syntax tree)
|
||||||
|
from new file we want to change the imports in. AST create a tree structure of expression. To change the
|
||||||
|
import we can just traverse to the appropriate expression and change the value of that expression in
|
||||||
|
the case of modifying imports. This approach is more simple than using templates.
|
||||||
|
|
||||||
|
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
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.
|
||||||
|
|
||||||
## Latest release install
|
## Alpha release install
|
||||||
https://github.com/Akilan1999/p2p-rendering-computation/releases
|
https://github.com/Akilan1999/p2p-rendering-computation/releases/tag/v1.0.0-alpha
|
||||||
|
|
||||||
## Install from Github master branch
|
## Install from Github master branch
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ USAGE:
|
|||||||
p2prc [global options] command [command options] [arguments...]
|
p2prc [global options] command [command options] [arguments...]
|
||||||
|
|
||||||
VERSION:
|
VERSION:
|
||||||
<version no>
|
1.0.0
|
||||||
|
|
||||||
COMMANDS:
|
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
|
||||||
@@ -78,7 +78,7 @@ GLOBAL OPTIONS:
|
|||||||
--ViewImages value, --vi value View images available on the server IP address [$VIEW_IMAGES]
|
--ViewImages value, --vi value View images available on the server IP address [$VIEW_IMAGES]
|
||||||
--CreateVM value, --touch value Creates Docker container on the selected server [$CREATE_VM]
|
--CreateVM value, --touch value Creates Docker container on the selected server [$CREATE_VM]
|
||||||
--ContainerName value, --cn value Specifying the container run on the server side [$CONTAINER_NAME]
|
--ContainerName value, --cn value Specifying the container run on the server side [$CONTAINER_NAME]
|
||||||
--RemoveVM value, --rm value Stop and Remove Docker container (IP:port) accompanied by container ID via --ID or --id [$REMOVE_VM]
|
--RemoveVM value, --rm value Stop and Remove Docker container [$REMOVE_VM]
|
||||||
--ID value, --id value Docker Container ID [$ID]
|
--ID value, --id value Docker Container ID [$ID]
|
||||||
--Ports value, -p value Number of ports to open for the Docker Container [$NUM_PORTS]
|
--Ports value, -p value Number of ports to open for the Docker Container [$NUM_PORTS]
|
||||||
--GPU, --gpu Create Docker Containers to access GPU (default: false) [$USE_GPU]
|
--GPU, --gpu Create Docker Containers to access GPU (default: false) [$USE_GPU]
|
||||||
@@ -86,20 +86,10 @@ GLOBAL OPTIONS:
|
|||||||
--SetDefaultConfig, --dc Sets a default configuration file (default: false) [$SET_DEFAULT_CONFIG]
|
--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]
|
--NetworkInterfaces, --ni Shows the network interface in your computer (default: false) [$NETWORK_INTERFACE]
|
||||||
--ViewPlugins, --vp Shows plugins available to be executed (default: false) [$VIEW_PLUGIN]
|
--ViewPlugins, --vp Shows plugins available to be executed (default: false) [$VIEW_PLUGIN]
|
||||||
--TrackedContainers, --tc View (currently running) containers which have been created from the client side (default: false) [$TRACKED_CONTAINERS]
|
--TrackedContainers, --tc View containers which have been created from the client side (default: false) [$TRACKED_CONTAINERS]
|
||||||
--ExecutePlugin value, --plugin value Plugin which needs to be executed [$EXECUTE_PLUGIN]
|
--ExecutePlugin value, --plugin value Plugin which needs to be executed [$EXECUTE_PLUGIN]
|
||||||
--CreateGroup, --cgroup Creates a new group (default: false) [$CREATE_GROUP]
|
|
||||||
--Group value, --group value group flag with argument group ID [$GROUP]
|
|
||||||
--Groups, --groups View all groups (default: false) [$GROUPS]
|
|
||||||
--RemoveContainerGroup, --rmcgroup Remove specific container in the group (default: false) [$REMOVE_CONTAINER_GROUP]
|
|
||||||
--RemoveGroup value, --rmgroup value Removes the entire group [$REMOVE_GROUP]
|
|
||||||
--Generate value, --gen value Generates a new copy of P2PRC which can be modified based on your needs [$GENERATE]
|
|
||||||
--ModuleName value, --mod value New go project module name [$MODULENAME]
|
|
||||||
--PullPlugin value, --pp value Pulls plugin from git repos [$PULLPLUGIN]
|
|
||||||
--RemovePlugin value, --rp value Removes plugin [$REMOVEPLUGIN]
|
|
||||||
--help, -h show help (default: false)
|
--help, -h show help (default: false)
|
||||||
--version, -v print the version (default: false)
|
--version, -v print the version (default: false)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
@@ -220,6 +210,12 @@ This feature is still Under Development:
|
|||||||
- Debian/ubuntu: ```sudo apt install ansible```
|
- Debian/ubuntu: ```sudo apt install ansible```
|
||||||
- Others: [Installation link](https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/install/)
|
- Others: [Installation link](https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/install/)
|
||||||
|
|
||||||
|
#### Set ansible host_key_checking to false
|
||||||
|
- On linux
|
||||||
|
- ```sudo nano /etc/ansible/ansible.cfg```: Open the following file. If this file is not found then where
|
||||||
|
ever the file ```ansible.cfg``` is located.
|
||||||
|
- Add or uncomment ```host_key_checking = False```
|
||||||
|
|
||||||
#### Run Test Cases
|
#### Run Test Cases
|
||||||
- Generate Test Case Ansible file
|
- Generate Test Case Ansible file
|
||||||
- ```make testcases```
|
- ```make testcases```
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
# NAT Traversal
|
|
||||||
P2PRC currently supports TURN for NAT traversal.
|
|
||||||
|
|
||||||
## TURN
|
|
||||||
The current TURN implementation used is FRP. The TURN server is also required when
|
|
||||||
a P2PRC node is acting as a Server. The TURN server is determined based on the Node
|
|
||||||
with the least amount of latency based on the Nodes available on the IPTable.
|
|
||||||
Once a TURN server is determined there are 2 actions performed. The first one is
|
|
||||||
```/FRPPort``` to the TURN server to receive a port which is used to generate the external
|
|
||||||
port from the TURN server. The flow below describes the workflow.
|
|
||||||
|
|
||||||
### Client mode
|
|
||||||
- Call ```/FRPPort```
|
|
||||||
```
|
|
||||||
http://<turn server ip>:<server port no>/FRPport
|
|
||||||
```
|
|
||||||
- Call the TURN server in the following manner. The following is a sample code snippet below.
|
|
||||||
```go
|
|
||||||
import (
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/p2p/frp"
|
|
||||||
)
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
serverPort, err := frp.GetFRPServerPort("http://" + <lowestLatencyIpAddress.Ipv4> + ":" + lowestLatencyIpAddress.ServerPort)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
// Create 1 second delay to allow FRP server to start
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
// Starts FRP as a client with
|
|
||||||
proxyPort, err := frp.StartFRPClientForServer(<lowestLatencyIpAddress.Ipv4>, serverPort, <the port you want to expose externally>)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
@@ -19,8 +19,10 @@ In this repository the P2P module has been designed from sratch at the point of
|
|||||||
|
|
||||||
|
|
||||||
## Responsibility
|
## Responsibility
|
||||||
|
- To perform speed test to determine best node to connect
|
||||||
- To ensure the IP table has nodes which are pingable
|
- To ensure the IP table has nodes which are pingable
|
||||||
- Taking to nodes behind NAT. [More about the implementation](NAT-Traversal)...
|
- Using techniques such as [UPNP](https://en.wikipedia.org/wiki/Universal_Plug_and_Play). Still under development
|
||||||
|
- Port Forwarding (To be introducted in a future release)
|
||||||
|
|
||||||
|
|
||||||
## Note:
|
## Note:
|
||||||
|
|||||||
@@ -23,12 +23,27 @@ path of the IP table json file is received from the configuration module.
|
|||||||
"latency": "<latency>",
|
"latency": "<latency>",
|
||||||
"download": "<download>",
|
"download": "<download>",
|
||||||
"upload": "<upload>"
|
"upload": "<upload>"
|
||||||
"port no": "<server port no>",
|
"port no": "<server port no>"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Speed Test
|
||||||
|
The speed test functions populate the fields which are latency, download, upload speed. Before the
|
||||||
|
speed test begins for each server IP address. The p2p module ensures that each server IP address
|
||||||
|
is pingable. If the server IP address is not pingable then it removes that IP address from the struct.
|
||||||
|
|
||||||
### Latency
|
### Latency
|
||||||
The latency is measured in milliseconds. The route /server_info is called from the
|
The latency is measured in milliseconds. The route /server_info is called from the
|
||||||
server and time it takes to provide a json response is recorded.
|
server and time it takes to provide a json response is recorded.
|
||||||
|
|
||||||
|
### Download speed
|
||||||
|
The download speed is measured as (<file size>/<time taken to
|
||||||
|
download>)*8. This gives the result in megabits per second. The file downloaded is a 50 mb
|
||||||
|
auto generated file.
|
||||||
|
|
||||||
|
### Upload speed
|
||||||
|
The upload speed is measured as (<file size>/<time taken to upload>)*8. This
|
||||||
|
gives the results in megabits per second. The file uploaded is a 50 mb auto generated file.
|
||||||
|
The route /upload is called from the server side to upload the file.
|
||||||
|
|||||||
35
Docs/Problems.md
Normal file
35
Docs/Problems.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Problems in implementation
|
||||||
|
|
||||||
|
### Number of Devices in the network:
|
||||||
|
The current implementation has the major flaw which is that
|
||||||
|
the server has to be in port 8088 to detected in the public
|
||||||
|
network. As we know most personal networks have a single IP
|
||||||
|
address. This means we cannot have duplicate ports. A fix can
|
||||||
|
be to mention the open port on the IP table file.
|
||||||
|
(Ex: Possible feild to be added)
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"ip_address": [
|
||||||
|
{
|
||||||
|
"ipv4": "localhost",
|
||||||
|
"latency": 14981051,
|
||||||
|
"download": 8142.122540206258,
|
||||||
|
"upload": 3578.766512629995,
|
||||||
|
"port": 8088
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Broadcast of container specs
|
||||||
|
At the moment the container specs are not broadcasted rather
|
||||||
|
just the machines specs and this module has yet to be tested
|
||||||
|
rigorously.
|
||||||
|
|
||||||
|
### Intergration with GPU
|
||||||
|
Certain machines have GPUs present in them which provide a
|
||||||
|
huge advantage for those who want to do rendering and certain
|
||||||
|
sort of computation. The Aim is to only allow it to be compatible
|
||||||
|
with Nvidia. But an better idea would be to provide compatability
|
||||||
|
with multiple GPU providers.
|
||||||
|
|
||||||
@@ -2,11 +2,10 @@
|
|||||||
# Table of contents
|
# Table of contents
|
||||||
1. [Introduction](Introduction.md)
|
1. [Introduction](Introduction.md)
|
||||||
2. [Installation](Installation.md)
|
2. [Installation](Installation.md)
|
||||||
3. [Abstractions](Abstractions.md)
|
3. [Design Architecture](DesignArchtectureIntro.md)
|
||||||
<!-- 3. [Design Architecture](DesignArchtectureIntro.md)
|
|
||||||
1. [Client Module](ClientArchitecture.md)
|
1. [Client Module](ClientArchitecture.md)
|
||||||
2. [P2P Module](P2PArchitecture.md)
|
2. [P2P Module](P2PArchitecture.md)
|
||||||
3. [Server Module](ServerArchitecture.md) -->
|
3. [Server Module](ServerArchitecture.md)
|
||||||
4. [Implementation](Implementation.md)
|
4. [Implementation](Implementation.md)
|
||||||
1. [Client Module](ClientImplementation.md)
|
1. [Client Module](ClientImplementation.md)
|
||||||
2. [P2P Module](P2PImplementation.md)
|
2. [P2P Module](P2PImplementation.md)
|
||||||
@@ -14,5 +13,6 @@
|
|||||||
4. [Config Module](ConfigImplementation.md)
|
4. [Config Module](ConfigImplementation.md)
|
||||||
5. [Cli Module](CliImplementation.md)
|
5. [Cli Module](CliImplementation.md)
|
||||||
6. [Plugin Module](PluginImplementation.md)
|
6. [Plugin Module](PluginImplementation.md)
|
||||||
<!-- 5. [Problems](https://github.com/Akilan1999/p2p-rendering-computation/issues) -->
|
7. [Generate Module](GenerateImplementation.md)
|
||||||
|
5. [Problems](https://github.com/Akilan1999/p2p-rendering-computation/issues)
|
||||||
|
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -45,28 +45,6 @@ This project aims to create a peer to peer (p2p) network, where a user can use t
|
|||||||
|
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
## Extend your application with P2PRC
|
|
||||||
```go
|
|
||||||
package main
|
|
||||||
|
|
||||||
import "github.com/Akilan1999/p2p-rendering-computation/abstractions"
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// Initialize with base p2prc config files
|
|
||||||
err := abstractions.Init("TEST")
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// start p2prc
|
|
||||||
_, err = abstractions.Start()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
[Read more](Docs/Abstractions.md) ...
|
|
||||||
|
|
||||||
## Installation from source
|
## Installation from source
|
||||||
1. Ensure the Go compiler is installed
|
1. Ensure the Go compiler is installed
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
package abstractions
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config"
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config/generate"
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/server"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Init Initialises p2prc
|
|
||||||
func Init(name string, customConfig interface{}) (config *config.Config, err error) {
|
|
||||||
// set the config file with default paths
|
|
||||||
config, err = generate.SetDefaults(name, false, customConfig, false)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Start p2prc in a server mode
|
|
||||||
func Start() (*gin.Engine, error) {
|
|
||||||
engine, err := server.Server()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return engine, nil
|
|
||||||
}
|
|
||||||
BIN
artwork/p2prc-logos/.DS_Store
vendored
BIN
artwork/p2prc-logos/.DS_Store
vendored
Binary file not shown.
@@ -206,7 +206,7 @@ func (grp *Group) AddGroupToFile() error {
|
|||||||
// result to Groups
|
// result to Groups
|
||||||
func ReadGroup() (*Groups, error) {
|
func ReadGroup() (*Groups, error) {
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -234,7 +234,7 @@ func (grp *Groups) WriteGroup() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func AddTrackContainer(d *docker.DockerVM, ipAddress string) error {
|
|||||||
return errors.New("d is nil")
|
return errors.New("d is nil")
|
||||||
}
|
}
|
||||||
//Get config information to derive paths for track containers json file
|
//Get config information to derive paths for track containers json file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -81,7 +81,7 @@ func AddTrackContainer(d *docker.DockerVM, ipAddress string) error {
|
|||||||
// RemoveTrackedContainer This function removos tracked container from the trackcontainer JSON file
|
// RemoveTrackedContainer This function removos tracked container from the trackcontainer JSON file
|
||||||
func RemoveTrackedContainer(id string) error {
|
func RemoveTrackedContainer(id string) error {
|
||||||
//Get config information to derive paths for track containers json file
|
//Get config information to derive paths for track containers json file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -118,7 +118,7 @@ func RemoveTrackedContainer(id string) error {
|
|||||||
|
|
||||||
// ViewTrackedContainers View Containers currently tracked
|
// ViewTrackedContainers View Containers currently tracked
|
||||||
func ViewTrackedContainers() (error, *TrackContainers) {
|
func ViewTrackedContainers() (error, *TrackContainers) {
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err, nil
|
return err, nil
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ func (TC *TrackContainer) ModifyContainerInformation() error {
|
|||||||
// WriteContainers Write information back to the config file
|
// WriteContainers Write information back to the config file
|
||||||
func (TC *TrackContainers) WriteContainers() error {
|
func (TC *TrackContainers) WriteContainers() error {
|
||||||
// Initialize config file
|
// Initialize config file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
// write modified information to the tracked json file
|
// write modified information to the tracked json file
|
||||||
data, err := json.MarshalIndent(TC, "", "\t")
|
data, err := json.MarshalIndent(TC, "", "\t")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ var mu sync.Mutex
|
|||||||
// UpdateIpTable Does the following to update it's IP table
|
// UpdateIpTable Does the following to update it's IP table
|
||||||
func UpdateIpTable(IpAddress string, serverPort string, wg *sync.WaitGroup) error {
|
func UpdateIpTable(IpAddress string, serverPort string, wg *sync.WaitGroup) error {
|
||||||
|
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -78,7 +78,7 @@ func UpdateIpTable(IpAddress string, serverPort string, wg *sync.WaitGroup) erro
|
|||||||
// on the ip tables
|
// on the ip tables
|
||||||
func UpdateIpTableListClient() error {
|
func UpdateIpTableListClient() error {
|
||||||
// Get config information
|
// Get config information
|
||||||
Config, err := config.ConfigInit(nil, nil)
|
Config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{}
|
|
||||||
@@ -4,7 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/client"
|
"github.com/Akilan1999/p2p-rendering-computation/client"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/client/clientIPTable"
|
"github.com/Akilan1999/p2p-rendering-computation/client/clientIPTable"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config/generate"
|
"github.com/Akilan1999/p2p-rendering-computation/config"
|
||||||
|
"github.com/Akilan1999/p2p-rendering-computation/generate"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/p2p"
|
"github.com/Akilan1999/p2p-rendering-computation/p2p"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/plugin"
|
"github.com/Akilan1999/p2p-rendering-computation/plugin"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/server"
|
"github.com/Akilan1999/p2p-rendering-computation/server"
|
||||||
@@ -13,14 +14,11 @@ import (
|
|||||||
|
|
||||||
var CliAction = func(ctx *cli.Context) error {
|
var CliAction = func(ctx *cli.Context) error {
|
||||||
if Server {
|
if Server {
|
||||||
_, err := server.Server()
|
err := server.Server()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
}
|
}
|
||||||
//server.Rpc()
|
//server.Rpc()
|
||||||
for {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//Listing servers and also updates IP tables (Default 3 hops)
|
//Listing servers and also updates IP tables (Default 3 hops)
|
||||||
@@ -95,16 +93,12 @@ var CliAction = func(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Function called to stop and remove server from Docker
|
// Function called to stop and remove server from Docker
|
||||||
if RemoveVM != "" {
|
if RemoveVM != "" && ID != "" {
|
||||||
if ID == "" {
|
|
||||||
fmt.Println("provide container ID via --ID or --id")
|
|
||||||
} else {
|
|
||||||
err := client.RemoveContianer(RemoveVM, ID)
|
err := client.RemoveContianer(RemoveVM, ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
//Call function to create Docker container
|
//Call function to create Docker container
|
||||||
if CreateVM != "" {
|
if CreateVM != "" {
|
||||||
@@ -138,7 +132,7 @@ var CliAction = func(ctx *cli.Context) error {
|
|||||||
|
|
||||||
//Sets default paths to the config file
|
//Sets default paths to the config file
|
||||||
if SetDefaultConfig {
|
if SetDefaultConfig {
|
||||||
_, err := generate.SetDefaults("P2PRC", false, nil, false)
|
err := config.SetDefaults()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
}
|
}
|
||||||
@@ -185,7 +179,7 @@ var CliAction = func(ctx *cli.Context) error {
|
|||||||
fmt.Println("Success")
|
fmt.Println("Success")
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
fmt.Println("provide container ID via --ID or --id")
|
fmt.Println("provide container ID")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -253,6 +247,39 @@ var CliAction = func(ctx *cli.Context) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Starts server as a reverse proxy so that
|
||||||
|
// nodes can connect to each other behind NAT
|
||||||
|
//if FRPProxy {
|
||||||
|
// err := frp.StartFRPProxyFromRandom()
|
||||||
|
// if err != nil {
|
||||||
|
// fmt.Println(err)
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
// -- REMOVE ON REGULAR RELEASE --
|
||||||
|
// when flag --gen is called an extension
|
||||||
|
// of the project is created to repurpose
|
||||||
|
// the project for custom purpose
|
||||||
|
if Generate != "" {
|
||||||
|
var err error
|
||||||
|
// If the module name is provided
|
||||||
|
if Modulename != "" {
|
||||||
|
err = generate.GenerateNewProject(Generate, Modulename)
|
||||||
|
} else {
|
||||||
|
err = generate.GenerateNewProject(Generate, Generate)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
} else {
|
||||||
|
fmt.Println("Created new folder: " + Generate)
|
||||||
|
fmt.Println("1. Enter inside " + Generate + " directory")
|
||||||
|
fmt.Println("2. git remote add " + Generate + " <PATH to the github repo>")
|
||||||
|
fmt.Println("3. git push " + Generate + " <PATH to the github repo>")
|
||||||
|
fmt.Println("4. go mod tidy")
|
||||||
|
fmt.Println("5. sh install.sh " + Generate)
|
||||||
|
fmt.Println("6. ./" + Generate + " -h (This is to test if the binary is working)")
|
||||||
|
}
|
||||||
|
}
|
||||||
//--------------------------------
|
//--------------------------------
|
||||||
|
|
||||||
if PullPlugin != "" {
|
if PullPlugin != "" {
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ var AppConfigFlags = []cli.Flag{
|
|||||||
&cli.StringFlag{
|
&cli.StringFlag{
|
||||||
Name: "RemoveVM",
|
Name: "RemoveVM",
|
||||||
Aliases: []string{"rm"},
|
Aliases: []string{"rm"},
|
||||||
Usage: "Stop and Remove Docker container (IP:port) accompanied by container ID via --ID or --id",
|
Usage: "Stop and Remove Docker container",
|
||||||
EnvVars: []string{"REMOVE_VM"},
|
EnvVars: []string{"REMOVE_VM"},
|
||||||
Destination: &RemoveVM,
|
Destination: &RemoveVM,
|
||||||
},
|
},
|
||||||
@@ -148,7 +148,7 @@ var AppConfigFlags = []cli.Flag{
|
|||||||
&cli.BoolFlag{
|
&cli.BoolFlag{
|
||||||
Name: "TrackedContainers",
|
Name: "TrackedContainers",
|
||||||
Aliases: []string{"tc"},
|
Aliases: []string{"tc"},
|
||||||
Usage: "View (currently running) containers which have " +
|
Usage: "View containers which have " +
|
||||||
"been created from the client side ",
|
"been created from the client side ",
|
||||||
EnvVars: []string{"TRACKED_CONTAINERS"},
|
EnvVars: []string{"TRACKED_CONTAINERS"},
|
||||||
Destination: &TrackedContainers,
|
Destination: &TrackedContainers,
|
||||||
|
|||||||
236
config/config.go
236
config/config.go
@@ -1,13 +1,13 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"github.com/spf13/viper"
|
||||||
"io/ioutil"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
//defaultPath string
|
defaultPath string
|
||||||
defaults = map[string]interface{}{}
|
defaults = map[string]interface{}{}
|
||||||
configName = "config"
|
configName = "config"
|
||||||
configType = "json"
|
configType = "json"
|
||||||
@@ -29,23 +29,46 @@ type Config struct {
|
|||||||
GroupTrackContainersPath string
|
GroupTrackContainersPath string
|
||||||
FRPServerPort string
|
FRPServerPort string
|
||||||
BehindNAT string
|
BehindNAT string
|
||||||
CustomConfig interface{}
|
|
||||||
//NetworkInterface string
|
//NetworkInterface string
|
||||||
//NetworkInterfaceIPV6Index int
|
//NetworkInterfaceIPV6Index int
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPathP2PRC Getting P2PRC Directory from environment variable
|
// Exists reports whether the named file or directory exists.
|
||||||
func GetPathP2PRC(Envname string) (string, error) {
|
func fileExists(name string) bool {
|
||||||
if Envname != "" {
|
if _, err := os.Stat(name); err != nil {
|
||||||
err := SetEnvName(Envname)
|
if os.IsNotExist(err) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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 {
|
if err != nil {
|
||||||
return "", err
|
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()
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetPathP2PRC Getting P2PRC Directory from environment variable
|
||||||
|
func GetPathP2PRC() (string, error) {
|
||||||
curDir := os.Getenv(defaultEnvName)
|
curDir := os.Getenv(defaultEnvName)
|
||||||
if curDir == "" {
|
|
||||||
return curDir, nil
|
|
||||||
}
|
|
||||||
return curDir + "/", nil
|
return curDir + "/", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,98 +82,115 @@ func SetEnvName(EnvName string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetEnvName() string {
|
// GetCurrentPath Getting P2PRC Directory from environment variable
|
||||||
return defaultEnvName
|
func GetCurrentPath() (string, error) {
|
||||||
|
curDir := os.Getenv("PWD")
|
||||||
|
return curDir + "/", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigInit Pass environment name as an optional parameter
|
// SetDefaults This function to be called only during a
|
||||||
func ConfigInit(defaultsParameter map[string]interface{}, CustomConfig interface{}, envNameOptional ...string) (*Config, error) {
|
// make install
|
||||||
if len(envNameOptional) > 0 {
|
func SetDefaults() error {
|
||||||
defaultEnvName = envNameOptional[0]
|
//Setting current directory to default path
|
||||||
}
|
defaultPath, err := GetPathP2PRC()
|
||||||
//
|
|
||||||
////Setting current directory to default path
|
|
||||||
//defaultPath, err := GetPathP2PRC(defaultEnvName)
|
|
||||||
//if err != nil {
|
|
||||||
// return nil, err
|
|
||||||
//}
|
|
||||||
////Paths to search for config file
|
|
||||||
//configPaths = append(configPaths, defaultPath)
|
|
||||||
//
|
|
||||||
////Add all possible configurations paths
|
|
||||||
//for _, v := range configPaths {
|
|
||||||
// viper.AddConfigPath(v)
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
////Read config file
|
|
||||||
//if err := viper.ReadInConfig(); err != nil {
|
|
||||||
// // If the error thrown is config file not found
|
|
||||||
// //Sets default configuration to viper
|
|
||||||
// for k, v := range defaults {
|
|
||||||
// viper.SetDefault(k, v)
|
|
||||||
// }
|
|
||||||
// viper.SetConfigName(configName)
|
|
||||||
// viper.SetConfigFile(configFile)
|
|
||||||
// viper.SetConfigType(configType)
|
|
||||||
//
|
|
||||||
// if err = viper.WriteConfig(); err != nil {
|
|
||||||
// return nil, err
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//// Adds configuration to the struct
|
|
||||||
//var config Config
|
|
||||||
//if err := viper.Unmarshal(&config); err != nil {
|
|
||||||
// return nil, err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
//return &config, nil
|
|
||||||
|
|
||||||
defaultPath, err := GetPathP2PRC(defaultEnvName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open our jsonFile
|
|
||||||
jsonFile, err := os.Open(defaultPath + configFile)
|
|
||||||
// if we os.Open returns an error then handle it
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// defer the closing of our jsonFile so that we can parse it later on
|
|
||||||
defer jsonFile.Close()
|
|
||||||
|
|
||||||
byteValue, _ := ioutil.ReadAll(jsonFile)
|
|
||||||
|
|
||||||
var config Config
|
|
||||||
json.Unmarshal(byteValue, &config)
|
|
||||||
|
|
||||||
if CustomConfig != nil {
|
|
||||||
// Convert Custom Config to byte
|
|
||||||
customConfigByte, err := json.Marshal(config.CustomConfig)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Again map the byte to the CustomConfig interface
|
|
||||||
json.Unmarshal(customConfigByte, &CustomConfig)
|
|
||||||
}
|
|
||||||
|
|
||||||
return &config, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) WriteConfig() error {
|
|
||||||
//Getting Current Directory from environment variable
|
|
||||||
//curDir := os.Getenv("REMOTEGAMING")
|
|
||||||
|
|
||||||
defaultPath, err := GetPathP2PRC(defaultEnvName)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
file, _ := json.MarshalIndent(c, "", " ")
|
//Creates ip_table.json in the json directory
|
||||||
|
err = Copy("p2p/ip_table.json", "p2p/iptable/ip_table.json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
_ = ioutil.WriteFile(defaultPath+"config.json", file, 0644)
|
//Creates a copy of trackcontainers.json in the appropriate directory
|
||||||
|
err = Copy("client/trackcontainers.json", "client/trackcontainers/trackcontainers.json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//Creates a copy of trackcontainers.json in the appropriate directory
|
||||||
|
err = Copy("client/grouptrackcontainers.json", "client/trackcontainers/grouptrackcontainers.json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//Setting default paths for the config file
|
||||||
|
defaults["IPTable"] = defaultPath + "p2p/iptable/ip_table.json"
|
||||||
|
defaults["DefaultDockerFile"] = defaultPath + "server/docker/containers/docker-ubuntu-sshd/"
|
||||||
|
defaults["DockerContainers"] = defaultPath + "server/docker/containers/"
|
||||||
|
defaults["SpeedTestFile"] = defaultPath + "p2p/50.bin"
|
||||||
|
defaults["IPV6Address"] = ""
|
||||||
|
defaults["PluginPath"] = defaultPath + "plugin/deploy"
|
||||||
|
defaults["TrackContainersPath"] = defaultPath + "client/trackcontainers/trackcontainers.json"
|
||||||
|
defaults["GroupTrackContainersPath"] = defaultPath + "client/trackcontainers/grouptrackcontainers.json"
|
||||||
|
defaults["ServerPort"] = "8088"
|
||||||
|
defaults["FRPServerPort"] = "0"
|
||||||
|
defaults["BehindNAT"] = "True"
|
||||||
|
// Random name generator
|
||||||
|
hostname, err := os.Hostname()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defaults["MachineName"] = hostname
|
||||||
|
//defaults["NetworkInterface"] = "wlp0s20f3"
|
||||||
|
//defaults["NetworkInterfaceIPV6Index"] = "2"
|
||||||
|
|
||||||
|
//Paths to search for config file
|
||||||
|
configPaths = append(configPaths, defaultPath)
|
||||||
|
|
||||||
|
if fileExists(defaultPath + "config.json") {
|
||||||
|
err := os.Remove(defaultPath + "config.json")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Calling configuration file
|
||||||
|
_, err = ConfigInit()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ConfigInit() (*Config, error) {
|
||||||
|
|
||||||
|
//Setting current directory to default path
|
||||||
|
defaultPath, err := GetPathP2PRC()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//Paths to search for config file
|
||||||
|
configPaths = append(configPaths, defaultPath)
|
||||||
|
|
||||||
|
//Add all possible configurations paths
|
||||||
|
for _, v := range configPaths {
|
||||||
|
viper.AddConfigPath(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
//Read config file
|
||||||
|
if err := viper.ReadInConfig(); err != nil {
|
||||||
|
// If the error thrown is config file not found
|
||||||
|
//Sets default configuration to viper
|
||||||
|
for k, v := range defaults {
|
||||||
|
viper.SetDefault(k, v)
|
||||||
|
}
|
||||||
|
viper.SetConfigName(configName)
|
||||||
|
viper.SetConfigFile(configFile)
|
||||||
|
viper.SetConfigType(configType)
|
||||||
|
|
||||||
|
if err = viper.WriteConfig(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Adds configuration to the struct
|
||||||
|
var config Config
|
||||||
|
if err := viper.Unmarshal(&config); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &config, nil
|
||||||
|
}
|
||||||
|
|||||||
63
config/config_test.go
Normal file
63
config/config_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestConfigInit(t *testing.T) {
|
||||||
|
_,err := ConfigInit()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSetDefaults(t *testing.T) {
|
||||||
|
err := SetDefaults()
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetCurrentPath(t *testing.T) {
|
||||||
|
path, err := GetCurrentPath()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
fmt.Println(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetPathP2PRC(t *testing.T) {
|
||||||
|
path, err := GetPathP2PRC()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
fmt.Println(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSetEnvName(t *testing.T) {
|
||||||
|
// Create an Env variable TEST with the value "lol"
|
||||||
|
err := os.Setenv("TEST", "lol")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Sets the environment variable as the default to read
|
||||||
|
// for P2PRC
|
||||||
|
err = SetEnvName("TEST")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Checks if the output for the default read is "lol"
|
||||||
|
path, err := GetPathP2PRC()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
fmt.Println(path)
|
||||||
|
}
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
// func TestConfigInit(t *testing.T) {
|
|
||||||
// _, err := config.ConfigInit(nil)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Error(err)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// func TestSetDefaults(t *testing.T) {
|
|
||||||
// _, err := SetDefaults("", false)
|
|
||||||
// if err != nil {
|
|
||||||
// t.Error(err)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
func TestGetCurrentPath(t *testing.T) {
|
|
||||||
path, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
fmt.Println(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGetPathP2PRC(t *testing.T) {
|
|
||||||
path, err := config.GetPathP2PRC("")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
fmt.Println(path)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSetEnvName(t *testing.T) {
|
|
||||||
// Create an Env variable TEST with the value "lol"
|
|
||||||
err := os.Setenv("TEST", "lol")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
// Sets the environment variable as the default to read
|
|
||||||
// for P2PRC
|
|
||||||
err = config.SetEnvName("TEST")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Checks if the output for the default read is "lol"
|
|
||||||
path, err := config.GetPathP2PRC("")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Error(err)
|
|
||||||
}
|
|
||||||
fmt.Println(path)
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
defaults = map[string]interface{}{}
|
|
||||||
configPaths []string
|
|
||||||
defaultEnvName = "P2PRC"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GetPathP2PRC Getting P2PRC Directory from environment variable
|
|
||||||
func GetPathP2PRC() (string, error) {
|
|
||||||
curDir := os.Getenv(defaultEnvName)
|
|
||||||
return curDir + "/", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetEnvName Sets the environment name
|
|
||||||
// This is to ensure that the Path of your project is detected from
|
|
||||||
// your environment variable
|
|
||||||
// This is useful when extending the use case of P2PRC
|
|
||||||
func SetEnvName(EnvName string) error {
|
|
||||||
if EnvName != "" {
|
|
||||||
defaultEnvName = EnvName
|
|
||||||
}
|
|
||||||
// Handling error to be implemented only if needed
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetCurrentPath Getting P2PRC Directory from environment variable
|
|
||||||
func GetCurrentPath() (string, error) {
|
|
||||||
curDir := os.Getenv("PWD")
|
|
||||||
return curDir + "/", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetDefaults This function to be called only during a
|
|
||||||
// make install
|
|
||||||
func SetDefaults(envName string, forceDefault bool, CustomConfig interface{}, NoBoilerPlate bool, ConfigUpdate ...*config.Config) (*config.Config, error) {
|
|
||||||
//Setting current directory to default path
|
|
||||||
defaultPath, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set Env name
|
|
||||||
err = config.SetEnvName(envName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
////Creates ip_table.json in the json directory
|
|
||||||
//err = Copy("p2p/ip_table.json", "p2p/iptable/ip_table.json")
|
|
||||||
//if err != nil {
|
|
||||||
// return err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
////Creates a copy of trackcontainers.json in the appropriate directory
|
|
||||||
//err = Copy("client/trackcontainers.json", "client/trackcontainers/trackcontainers.json")
|
|
||||||
//if err != nil {
|
|
||||||
// return err
|
|
||||||
//}
|
|
||||||
//
|
|
||||||
////Creates a copy of trackcontainers.json in the appropriate directory
|
|
||||||
//err = Copy("client/grouptrackcontainers.json", "client/trackcontainers/grouptrackcontainers.json")
|
|
||||||
//if err != nil {
|
|
||||||
// return err
|
|
||||||
//}
|
|
||||||
|
|
||||||
var Defaults config.Config
|
|
||||||
|
|
||||||
if len(ConfigUpdate) == 0 {
|
|
||||||
//Setting default paths for the config file
|
|
||||||
Defaults.IPTable = defaultPath + "p2p/iptable/ip_table.json"
|
|
||||||
Defaults.DefaultDockerFile = defaultPath + "server/docker/containers/docker-ubuntu-sshd/"
|
|
||||||
Defaults.DockerContainers = defaultPath + "server/docker/containers/"
|
|
||||||
Defaults.SpeedTestFile = defaultPath + "p2p/50.bin"
|
|
||||||
Defaults.IPV6Address = ""
|
|
||||||
Defaults.PluginPath = defaultPath + "plugin/deploy"
|
|
||||||
Defaults.TrackContainersPath = defaultPath + "client/trackcontainers/trackcontainers.json"
|
|
||||||
Defaults.GroupTrackContainersPath = defaultPath + "client/trackcontainers/grouptrackcontainers.json"
|
|
||||||
Defaults.ServerPort = "8088"
|
|
||||||
Defaults.FRPServerPort = "True"
|
|
||||||
Defaults.CustomConfig = CustomConfig
|
|
||||||
Defaults.BehindNAT = "True"
|
|
||||||
// Random name generator
|
|
||||||
hostname, err := os.Hostname()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
Defaults.MachineName = hostname
|
|
||||||
} else {
|
|
||||||
Defaults = *ConfigUpdate[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
//defaults["NetworkInterface"] = "wlp0s20f3"
|
|
||||||
//defaults["NetworkInterfaceIPV6Index"] = "2"
|
|
||||||
|
|
||||||
//Paths to search for config file
|
|
||||||
configPaths = append(configPaths, defaultPath)
|
|
||||||
|
|
||||||
if fileExists(defaultPath+"config.json") && forceDefault {
|
|
||||||
err := os.Remove(defaultPath + "config.json")
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write defaults to the config file
|
|
||||||
err = Defaults.WriteConfig()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
//Calling configuration file
|
|
||||||
Config, err := config.ConfigInit(defaults, nil, envName)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if !NoBoilerPlate {
|
|
||||||
err = GenerateFiles()
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Config, nil
|
|
||||||
}
|
|
||||||
@@ -1,163 +0,0 @@
|
|||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/p2p"
|
|
||||||
"github.com/go-git/go-git/v5"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// GenerateFiles Generates all the files needed to setup P2PRC
|
|
||||||
func GenerateFiles(rootNodes ...p2p.IpAddress) (err error) {
|
|
||||||
err = GenerateIPTableFile(rootNodes)
|
|
||||||
err = GenerateDockerFiles()
|
|
||||||
err = GeneratePluginDirectory()
|
|
||||||
err = GenerateClientTrackContainers()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateIPTableFile Generates the IPTable file with the appropirate root node
|
|
||||||
func GenerateIPTableFile(rootNodes []p2p.IpAddress) (err error) {
|
|
||||||
var rootnodes p2p.IpAddresses
|
|
||||||
var rootnode p2p.IpAddress
|
|
||||||
|
|
||||||
err = CreateIPTableFolderStructure()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// If root node addresses are not provided as optional parameters
|
|
||||||
if len(rootNodes) <= 0 {
|
|
||||||
rootnode.Name = "Node1"
|
|
||||||
rootnode.ServerPort = "8088"
|
|
||||||
rootnode.NAT = "False"
|
|
||||||
rootnode.Ipv4 = "64.227.168.102"
|
|
||||||
|
|
||||||
rootnodes.IpAddress = append(rootnodes.IpAddress, rootnode)
|
|
||||||
} else {
|
|
||||||
// if root nodes are provided then override them as the optional parameter
|
|
||||||
for i := range rootNodes {
|
|
||||||
rootnodes.IpAddress = append(rootnodes.IpAddress, rootNodes[i])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
err = rootnodes.WriteIpTable()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// CreateIPTableFolderStructure Create folder structure for IPTable
|
|
||||||
func CreateIPTableFolderStructure() (err error) {
|
|
||||||
path, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "p2p"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"p2p", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "p2p/iptable"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"p2p/iptable", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "p2p/iptable/ip_table.json"); os.IsNotExist(err) {
|
|
||||||
_, err = os.Create(path + "p2p/iptable/ip_table.json")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateDockerFiles Generate default docker files
|
|
||||||
func GenerateDockerFiles() (err error) {
|
|
||||||
path, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "server"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"server", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "server/docker"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"server/docker", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "server/docker/containers"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"server/docker/containers", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "server/docker/containers"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"server/docker/containers", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "server/docker/containers/docker-ubuntu-sshd"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"server/docker/containers/docker-ubuntu-sshd", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clone base docker image
|
|
||||||
_, err = git.PlainClone(path+"server/docker/containers/docker-ubuntu-sshd", false, &git.CloneOptions{
|
|
||||||
URL: "https://github.com/Akilan1999/docker-ubuntu-sshd",
|
|
||||||
Progress: os.Stdout,
|
|
||||||
})
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// GeneratePluginDirectory Generates plugin directory structure
|
|
||||||
func GeneratePluginDirectory() (err error) {
|
|
||||||
path, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "plugin"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"plugin", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "plugin/deploy"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"plugin/deploy", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func GenerateClientTrackContainers() (err error) {
|
|
||||||
path, err := GetCurrentPath()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if _, err = os.Stat(path + "client"); os.IsNotExist(err) {
|
|
||||||
if err = os.Mkdir(path+"client", os.ModePerm); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = os.Stat(path + "client/trackcontainers.json"); os.IsNotExist(err) {
|
|
||||||
_, err = os.Create(path + "client/trackcontainers.json")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if _, err = os.Stat(path + "client/grouptrackcontainers.json"); os.IsNotExist(err) {
|
|
||||||
_, err = os.Create(path + "client/grouptrackcontainers.json")
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/config"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
type CustomConfig struct {
|
|
||||||
Test string
|
|
||||||
}
|
|
||||||
|
|
||||||
// Test case to generate defaults with custom data-structure
|
|
||||||
func TestSetDefaults(t *testing.T) {
|
|
||||||
setDefaults, err := SetDefaults("", true, &CustomConfig{Test: "lol"}, true)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Fail()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(setDefaults)
|
|
||||||
|
|
||||||
var c CustomConfig
|
|
||||||
|
|
||||||
_, err = config.ConfigInit(nil, &c)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
t.Fail()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(c)
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
package generate
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"os"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Exists reports whether the named file or directory exists.
|
|
||||||
func fileExists(name string) bool {
|
|
||||||
if _, err := os.Stat(name); err != nil {
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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()
|
|
||||||
}
|
|
||||||
386
generate/generate.go
Normal file
386
generate/generate.go
Normal file
@@ -0,0 +1,386 @@
|
|||||||
|
// Package generate The purpose of this package is to ensure that we can extend the use-case of P2PRC.
|
||||||
|
// We will create a project directory with the template to extend the use-case of P2PRC
|
||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/Akilan1999/p2p-rendering-computation/config"
|
||||||
|
"github.com/otiai10/copy"
|
||||||
|
"go/ast"
|
||||||
|
"go/token"
|
||||||
|
modfile "golang.org/x/mod/modfile"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewProject Struct information required when creating a new project
|
||||||
|
type NewProject struct {
|
||||||
|
Name string
|
||||||
|
Module string
|
||||||
|
NewDir string
|
||||||
|
P2PRCPath string
|
||||||
|
CurrentModule string
|
||||||
|
Option *copy.Options
|
||||||
|
Token *token.FileSet
|
||||||
|
AST *ast.File
|
||||||
|
FileNameAST string
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenerateNewProject creates a new copy of the P2PRC
|
||||||
|
// project for custom modification
|
||||||
|
func GenerateNewProject(name string, module string) error {
|
||||||
|
// Create new variable of type NewProject
|
||||||
|
var newProject NewProject
|
||||||
|
//Setting module name to the new project
|
||||||
|
newProject.Module = module
|
||||||
|
// Get path of the current directory
|
||||||
|
curDir, err := config.GetCurrentPath()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Folder name of the new generated project
|
||||||
|
newProject.NewDir = curDir + name + "/"
|
||||||
|
// Create a new folder based on name entered
|
||||||
|
err = CreateFolder(name, curDir)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// get path of P2PRC
|
||||||
|
P2PRCPATH, err := config.GetPathP2PRC()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Assign P2PRC path to the newly generated project
|
||||||
|
newProject.P2PRCPath = P2PRCPATH
|
||||||
|
// Steps:
|
||||||
|
// - copy all files from P2PRC
|
||||||
|
// - remove go.mod and go.sum and create new ones
|
||||||
|
|
||||||
|
// Files we require to skip
|
||||||
|
|
||||||
|
var Options copy.Options
|
||||||
|
|
||||||
|
// IF YOU ARE RELEASING AN EXTENSION OF P2PRC
|
||||||
|
// MODIFY HERE (AN EXTENSION FROM YOUR EXTENSION :P)
|
||||||
|
// Skip or have the appropriate files and directories not needed
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
// Action performed:
|
||||||
|
// - Ensuring main.go file exists
|
||||||
|
// - Ensuring generate.go file exists
|
||||||
|
// - Ensuring modifyGenerate.go file exists
|
||||||
|
// - Ensuring generate_test.go file exists
|
||||||
|
// - Ensuring server/server.go file exists
|
||||||
|
// - Ensuring server/gopsutil.go file exists
|
||||||
|
// - Ensuring server/gpu.go file exists
|
||||||
|
// - Ensuring cmd/action.go file exists
|
||||||
|
// - Ensuring cmd/flags.go file exists
|
||||||
|
// - Skipping all .go files apart from the ones listed above
|
||||||
|
// - Skipping go.mod file
|
||||||
|
// - Skipping go.sum file
|
||||||
|
// - Skipping .idea/ directory
|
||||||
|
// - Skipping Makefile file
|
||||||
|
// - Skipping <Project Name>/ directory
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
Options.Skip = func(src string) (bool, error) {
|
||||||
|
switch {
|
||||||
|
case strings.HasSuffix(src, "main.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "generate.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "modifyGenerate.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "generate_test.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "server/server.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "server/gopsutil.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "server/gpu.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "cmd/action.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "cmd/flags.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "config/config.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, "config/config_test.go"):
|
||||||
|
return false, nil
|
||||||
|
case strings.HasSuffix(src, ".go"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, "go.mod"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, "go.sum"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, ".idea"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, "Makefile"):
|
||||||
|
return true, nil
|
||||||
|
case strings.HasSuffix(src, name):
|
||||||
|
return true, nil
|
||||||
|
default:
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Storing type option in the struct new project
|
||||||
|
newProject.Option = &Options
|
||||||
|
|
||||||
|
// Copies all files from P2PRC to the new project created
|
||||||
|
err = copy.Copy(newProject.P2PRCPath, newProject.NewDir, *newProject.Option)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Creating a new go.mod file in the appropriate directory
|
||||||
|
err = newProject.CreateGoMod()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get current project mod name
|
||||||
|
err = newProject.GetCurrentGoModule()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Change the appropriate imports
|
||||||
|
err = newProject.ChangeImportFiles()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add changes inside the new project
|
||||||
|
err = newProject.GitAdd()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// commit changes inside the new project
|
||||||
|
err = newProject.GitCommit()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Creates go.sum file
|
||||||
|
//err = newProject.CreateGoModTidy()
|
||||||
|
//if err != nil {
|
||||||
|
// return err
|
||||||
|
//}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateFolder Creates a new folder based on the name and path provided
|
||||||
|
func CreateFolder(name string, path string) error {
|
||||||
|
//Create a folder/directory at a full qualified path
|
||||||
|
err := os.Mkdir(path+name, 0755)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateGoMod Creates a new go module for the new project created
|
||||||
|
func (a *NewProject) CreateGoMod() error {
|
||||||
|
// Create new go.mod in the appropriate directory
|
||||||
|
cmd := exec.Command("go", "mod", "init", a.Module)
|
||||||
|
cmd.Dir = a.NewDir
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *NewProject) CreateGoModTidy() error {
|
||||||
|
// Installs all the appropriate dependencies and creates go.sum
|
||||||
|
cmd := exec.Command("go", "mod", "tidy")
|
||||||
|
cmd.Dir = a.NewDir
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeImportFiles Changes Appropriate imports in the appropriate file
|
||||||
|
func (a *NewProject) ChangeImportFiles() error {
|
||||||
|
// IF YOU ARE RELEASING AN EXTENSION OF P2PRC
|
||||||
|
// MODIFY HERE (AN EXTENSION FROM YOUR EXTENSION :P)
|
||||||
|
//----------------------------------------------------------------
|
||||||
|
// Action performed:
|
||||||
|
// Files we would need to modify the imports in
|
||||||
|
// - generate/generate.go -> config module
|
||||||
|
// - generate/generate_test.go -> config module
|
||||||
|
// - cmd/action.go -> config module, server module, generate module
|
||||||
|
// - cmd/flags.go -> config module, server module, generate module
|
||||||
|
// - server/server.go -> config module
|
||||||
|
// - main.go -> cmd module
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 1.0 - generate/generate.go -> config module
|
||||||
|
a.FileNameAST = a.NewDir + "generate/generate.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err := a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/config", a.Module+"/config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 1.1 - generate/generate_test.go -> config module
|
||||||
|
a.FileNameAST = a.NewDir + "generate/generate_test.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err = a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/config", a.Module+"/config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 2.0 - cmd/action.go -> config module, server module, generate module
|
||||||
|
a.FileNameAST = a.NewDir + "cmd/action.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err = a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/config", a.Module+"/config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/server", a.Module+"/server")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/generate", a.Module+"/generate")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 2.1 - cmd/flags.go -> config module, server module, generate module
|
||||||
|
a.FileNameAST = a.NewDir + "cmd/flags.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err = a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/config", a.Module+"/config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/server", a.Module+"/server")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/generate", a.Module+"/generate")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 3.0 - server/server.go -> config module
|
||||||
|
a.FileNameAST = a.NewDir + "server/server.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err = a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/config", a.Module+"/config")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
// 4.0 - server/server.go -> config module
|
||||||
|
a.FileNameAST = a.NewDir + "main.go"
|
||||||
|
// Get AST information of the file
|
||||||
|
err = a.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Change the appropriate Go file
|
||||||
|
err = a.ChangeImports(a.CurrentModule+"/cmd", a.Module+"/cmd")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Writes the change to the appropriate file
|
||||||
|
err = a.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//-----------------------------------------------------------------
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetCurrentGoModule Gets the current go module name
|
||||||
|
func (a *NewProject) GetCurrentGoModule() error {
|
||||||
|
goModBytes, err := ioutil.ReadFile(a.P2PRCPath + "go.mod")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
modName := modfile.ModulePath(goModBytes)
|
||||||
|
fmt.Fprintf(os.Stdout, "modName=%+v\n", modName)
|
||||||
|
|
||||||
|
// Set current module to struct of file NewProject
|
||||||
|
a.CurrentModule = modName
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *NewProject) GitAdd() error {
|
||||||
|
// Installs all the appropriate dependencies and creates go.sum
|
||||||
|
cmd := exec.Command("git", "add", ".")
|
||||||
|
cmd.Dir = a.NewDir
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *NewProject) GitCommit() error {
|
||||||
|
// Installs all the appropriate dependencies and creates go.sum
|
||||||
|
cmd := exec.Command("git", "commit", "-m=removed appropriate go files")
|
||||||
|
cmd.Dir = a.NewDir
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
112
generate/generate_test.go
Normal file
112
generate/generate_test.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/Akilan1999/p2p-rendering-computation/config"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Tests the create folder function creates a folder
|
||||||
|
// This test will create a folder in the temporary
|
||||||
|
// directory
|
||||||
|
func TestCreateFolder(t *testing.T) {
|
||||||
|
err := CreateFolder("test", "/tmp/")
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing if a new project is created successfully
|
||||||
|
func TestGenerateNewProject(t *testing.T) {
|
||||||
|
// Checking if a new project is created successfully
|
||||||
|
err := GenerateNewProject("p2prctest", "p2prctest")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing AST function to ensure imports are
|
||||||
|
// working as intended
|
||||||
|
func TestChangingImportAST(t *testing.T) {
|
||||||
|
// Create a new variable of type NewProject
|
||||||
|
var np NewProject
|
||||||
|
// Get current directory
|
||||||
|
path, err := config.GetCurrentPath()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Create testcase scenario
|
||||||
|
err = config.Copy(path+"testcaseAST.go", path+"/Test/testcaseAST.go")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Sets new directory to the folder test
|
||||||
|
np.NewDir = path + "Test/"
|
||||||
|
// Sets file name to be opened and modified in the AST
|
||||||
|
np.FileNameAST = path + "Test/" + "testcaseAST.go"
|
||||||
|
// Call the Read AST function
|
||||||
|
err = np.GetASTGoFile()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Change an import
|
||||||
|
err = np.ChangeImports("fmt", "lolol")
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Write those saved changes
|
||||||
|
err = np.WriteGoAst()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing the if Go Mod is created
|
||||||
|
func TestNewProject_CreateGoMod(t *testing.T) {
|
||||||
|
// Create a new variable of type NewProject
|
||||||
|
var np NewProject
|
||||||
|
path, err := config.GetCurrentPath()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Set new project name as Test
|
||||||
|
np.Name = "Test"
|
||||||
|
// Set new project module as github.com/Test
|
||||||
|
np.Module = "github.com/Test"
|
||||||
|
// Set Path of the new project
|
||||||
|
np.NewDir = path + "Test/"
|
||||||
|
// Creating a go.mod file
|
||||||
|
err = np.CreateGoMod()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Testing if the current go module is returned
|
||||||
|
func TestNewProject_GetCurrentGoModule(t *testing.T) {
|
||||||
|
// Create a new variable of type NewProject
|
||||||
|
var np NewProject
|
||||||
|
path, err := config.GetPathP2PRC()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
// Set Current project path
|
||||||
|
np.P2PRCPath = path
|
||||||
|
// Get module name
|
||||||
|
err = np.GetCurrentGoModule()
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
t.Error(err)
|
||||||
|
}
|
||||||
|
fmt.Println(np.CurrentModule)
|
||||||
|
}
|
||||||
49
generate/modifyGenerate.go
Normal file
49
generate/modifyGenerate.go
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"go/parser"
|
||||||
|
"go/printer"
|
||||||
|
"go/token"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// GetASTGoFile Gets AST of the Go file provided
|
||||||
|
func (np *NewProject)GetASTGoFile() error{
|
||||||
|
fset := token.NewFileSet()
|
||||||
|
node, err := parser.ParseFile(fset, np.FileNameAST, nil, parser.ParseComments)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
//Write Token information to the struct
|
||||||
|
np.Token = fset
|
||||||
|
// Write AST information the struct
|
||||||
|
np.AST = node
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ChangeImports Changes import of the AST
|
||||||
|
func (np *NewProject)ChangeImports(CurrentImport string,ChangedImport string) error {
|
||||||
|
// Iterating through the loop and changing the appropriate import
|
||||||
|
for i, spec := range np.AST.Imports {
|
||||||
|
// If the current import is found then change it
|
||||||
|
if spec.Path.Value == "\"" + CurrentImport + "\"" {
|
||||||
|
np.AST.Imports[i].Path.Value = "\"" + ChangedImport + "\""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WriteGoAst Write changed imports back to the AST
|
||||||
|
func (np *NewProject)WriteGoAst() error {
|
||||||
|
// write new AST to file
|
||||||
|
f, err := os.Create(np.FileNameAST)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
if err := printer.Fprint(f, np.Token, np.AST); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
9
generate/testcaseAST.go
Normal file
9
generate/testcaseAST.go
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package generate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCaseAST() {
|
||||||
|
fmt.Println("lol")
|
||||||
|
}
|
||||||
3
go.mod
3
go.mod
@@ -12,6 +12,7 @@ require (
|
|||||||
github.com/gin-gonic/gin v1.6.3
|
github.com/gin-gonic/gin v1.6.3
|
||||||
github.com/go-git/go-git/v5 v5.4.2
|
github.com/go-git/go-git/v5 v5.4.2
|
||||||
github.com/google/uuid v1.3.0
|
github.com/google/uuid v1.3.0
|
||||||
|
github.com/goombaio/namegenerator v0.0.0-20181006234301-989e774b106e
|
||||||
github.com/lithammer/shortuuid v3.0.0+incompatible
|
github.com/lithammer/shortuuid v3.0.0+incompatible
|
||||||
github.com/moby/sys/mount v0.2.0 // indirect
|
github.com/moby/sys/mount v0.2.0 // indirect
|
||||||
github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf // indirect
|
github.com/moby/term v0.0.0-20201110203204-bea5bbe245bf // indirect
|
||||||
@@ -19,9 +20,11 @@ require (
|
|||||||
github.com/otiai10/copy v1.6.0
|
github.com/otiai10/copy v1.6.0
|
||||||
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
|
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2
|
||||||
github.com/shirou/gopsutil/v3 v3.22.10
|
github.com/shirou/gopsutil/v3 v3.22.10
|
||||||
|
github.com/spf13/viper v1.7.0
|
||||||
github.com/urfave/cli/v2 v2.3.0
|
github.com/urfave/cli/v2 v2.3.0
|
||||||
gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40 // indirect
|
gitlab.com/NebulousLabs/fastrand v0.0.0-20181126182046-603482d69e40 // indirect
|
||||||
gitlab.com/NebulousLabs/go-upnp v0.0.0-20181011194642-3a71999ed0d3
|
gitlab.com/NebulousLabs/go-upnp v0.0.0-20181011194642-3a71999ed0d3
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
gotest.tools/v3 v3.0.3 // indirect
|
gotest.tools/v3 v3.0.3 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
15
go.sum
15
go.sum
@@ -65,6 +65,7 @@ github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZ
|
|||||||
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
|
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c h1:/IBSNwUN8+eKzUzbJPqhK839ygXJ82sde8x3ogr6R28=
|
||||||
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||||
|
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
|
||||||
@@ -284,6 +285,7 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjr
|
|||||||
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
|
||||||
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
|
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
|
||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
|
github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
|
||||||
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||||
@@ -449,6 +451,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+
|
|||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
|
||||||
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
|
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
|
||||||
|
github.com/goombaio/namegenerator v0.0.0-20181006234301-989e774b106e h1:XmA6L9IPRdUr28a+SK/oMchGgQy159wvzXA5tJ7l+40=
|
||||||
|
github.com/goombaio/namegenerator v0.0.0-20181006234301-989e774b106e/go.mod h1:AFIo+02s+12CEg8Gzz9kzhCbmbq6JcKNrhHffCGA9z4=
|
||||||
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
|
||||||
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||||
@@ -482,6 +486,7 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b
|
|||||||
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
|
||||||
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
|
||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
|
||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
|
||||||
@@ -553,6 +558,7 @@ github.com/lithammer/shortuuid v3.0.0+incompatible/go.mod h1:FR74pbAuElzOUuenUHT
|
|||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
||||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
|
github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
|
||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||||
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
|
||||||
@@ -583,6 +589,7 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI
|
|||||||
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
|
||||||
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
|
||||||
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
|
github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE=
|
||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||||
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
|
github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
|
||||||
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
|
github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
|
||||||
@@ -667,6 +674,7 @@ github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT9
|
|||||||
github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E=
|
github.com/otiai10/mint v1.3.2 h1:VYWnrP5fXmz1MXvjuUvcBrXSjGE6xjON+axB/UrpO3E=
|
||||||
github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
github.com/otiai10/mint v1.3.2/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
|
||||||
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
|
||||||
|
github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc=
|
||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
|
||||||
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
|
github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc=
|
||||||
@@ -762,19 +770,24 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9
|
|||||||
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
|
||||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
|
||||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||||
|
github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc=
|
||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
|
||||||
|
github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8=
|
||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||||
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
|
||||||
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
|
||||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
|
||||||
|
github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
|
||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||||
|
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
|
||||||
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
|
||||||
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
|
||||||
|
github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
|
||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
|
||||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
|
||||||
github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
@@ -794,6 +807,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
|||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
|
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
|
||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
|
||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
|
||||||
@@ -927,6 +941,7 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|||||||
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY=
|
||||||
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
|||||||
5
main.go
5
main.go
@@ -1,11 +1,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"log"
|
|
||||||
"os"
|
|
||||||
|
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/cmd"
|
"github.com/Akilan1999/p2p-rendering-computation/cmd"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
// VERSION specifies the version of the platform
|
// VERSION specifies the version of the platform
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
package frp
|
package frp
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/Akilan1999/p2p-rendering-computation/server/docker"
|
"github.com/Akilan1999/p2p-rendering-computation/server/docker"
|
||||||
"github.com/fatedier/frp/client"
|
"github.com/fatedier/frp/client"
|
||||||
"github.com/fatedier/frp/pkg/config"
|
"github.com/fatedier/frp/pkg/config"
|
||||||
|
"github.com/phayes/freeport"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
"github.com/phayes/freeport"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client This struct stores
|
// Client This struct stores
|
||||||
@@ -29,10 +30,7 @@ type ClientMapping struct {
|
|||||||
|
|
||||||
// StartFRPClientForServer Starts Server using FRP server
|
// StartFRPClientForServer Starts Server using FRP server
|
||||||
// returns back a port
|
// returns back a port
|
||||||
// remote port is a custom external port a user would want
|
func StartFRPClientForServer(ipaddress string, port string, localport string) (string, error) {
|
||||||
// to open. This under the assumption the user knows the
|
|
||||||
// exact port available in server doing the TURN connection.
|
|
||||||
func StartFRPClientForServer(ipaddress string, port string, localport string, remoteport string) (string, error) {
|
|
||||||
// Setup server information
|
// Setup server information
|
||||||
var s Server
|
var s Server
|
||||||
s.address = ipaddress
|
s.address = ipaddress
|
||||||
@@ -54,24 +52,12 @@ func StartFRPClientForServer(ipaddress string, port string, localport string, re
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
var OpenPorts []int
|
|
||||||
// if the remote port is
|
|
||||||
// not empty then set the remote port to that.
|
|
||||||
if remoteport != "" {
|
|
||||||
// converts localport to int
|
|
||||||
portIntRemote, err := strconv.Atoi(remoteport)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
OpenPorts = append(OpenPorts, portIntRemote)
|
|
||||||
} else {
|
|
||||||
//random port
|
//random port
|
||||||
//randPort := rangeIn(10000, 99999)
|
//randPort := rangeIn(10000, 99999)
|
||||||
OpenPorts, err = freeport.GetFreePorts(1)
|
OpenPorts, err := freeport.GetFreePorts(1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
}
|
|
||||||
c.ClientMappings = []ClientMapping{
|
c.ClientMappings = []ClientMapping{
|
||||||
{
|
{
|
||||||
LocalIP: "localhost",
|
LocalIP: "localhost",
|
||||||
@@ -111,6 +97,7 @@ func StartFRPCDockerContainer(ipaddress string, port string, Docker *docker.Dock
|
|||||||
|
|
||||||
// set client mapping
|
// set client mapping
|
||||||
//var clientMappings []ClientMapping
|
//var clientMappings []ClientMapping
|
||||||
|
fmt.Println(len(Docker.Ports.PortSet))
|
||||||
for i, _ := range Docker.Ports.PortSet {
|
for i, _ := range Docker.Ports.PortSet {
|
||||||
portMap := Docker.Ports.PortSet[i].ExternalPort
|
portMap := Docker.Ports.PortSet[i].ExternalPort
|
||||||
|
|
||||||
@@ -122,7 +109,7 @@ func StartFRPCDockerContainer(ipaddress string, port string, Docker *docker.Dock
|
|||||||
//delay to allow the FRP server to start
|
//delay to allow the FRP server to start
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
|
|
||||||
proxyPort, err := StartFRPClientForServer(ipaddress, serverPort, strconv.Itoa(portMap), "")
|
proxyPort, err := StartFRPClientForServer(ipaddress, serverPort, strconv.Itoa(portMap))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ type IpAddress struct {
|
|||||||
ServerPort string `json:"ServerPort"`
|
ServerPort string `json:"ServerPort"`
|
||||||
NAT string `json:"NAT"`
|
NAT string `json:"NAT"`
|
||||||
EscapeImplementation string `json:"EscapeImplementation"`
|
EscapeImplementation string `json:"EscapeImplementation"`
|
||||||
CustomInformation []byte
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type IP struct {
|
type IP struct {
|
||||||
@@ -37,7 +36,7 @@ type IP struct {
|
|||||||
// ReadIpTable Read data from Ip tables from json file
|
// ReadIpTable Read data from Ip tables from json file
|
||||||
func ReadIpTable() (*IpAddresses, error) {
|
func ReadIpTable() (*IpAddresses, error) {
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -102,7 +101,7 @@ func (i *IpAddresses) WriteIpTable() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -190,7 +189,7 @@ func CurrentPublicIP() (string, error) {
|
|||||||
// GetCurrentIPV6 gets the current IPV6 address based on the interface
|
// GetCurrentIPV6 gets the current IPV6 address based on the interface
|
||||||
// specified in the config file
|
// specified in the config file
|
||||||
func GetCurrentIPV6() (string, error) {
|
func GetCurrentIPV6() (string, error) {
|
||||||
Config, err := config.ConfigInit(nil, nil)
|
Config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ func (s *IpAddress) UploadSpeed() error {
|
|||||||
|
|
||||||
// Get upload file path from config file
|
// Get upload file path from config file
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ func DownloadPlugin(pluginurl string) error {
|
|||||||
// Replaces / with _
|
// Replaces / with _
|
||||||
folder := strings.Replace(path, "/", "_", -1)
|
folder := strings.Replace(path, "/", "_", -1)
|
||||||
// Reads plugin path from the config path
|
// Reads plugin path from the config path
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -44,7 +44,7 @@ func DownloadPlugin(pluginurl string) error {
|
|||||||
// DeletePlugin The following function deletes a plugin based on
|
// DeletePlugin The following function deletes a plugin based on
|
||||||
// the plugin name provided.
|
// the plugin name provided.
|
||||||
func DeletePlugin(pluginname string) error {
|
func DeletePlugin(pluginname string) error {
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ type Host struct {
|
|||||||
|
|
||||||
// DetectPlugins Detects all the plugins available
|
// DetectPlugins Detects all the plugins available
|
||||||
func DetectPlugins() (*Plugins, error) {
|
func DetectPlugins() (*Plugins, error) {
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -141,7 +141,7 @@ func RunPlugin(pluginName string, IPAddresses []*ExecuteIP) (*Plugin, error) {
|
|||||||
plugindetected = plugin
|
plugindetected = plugin
|
||||||
plugindetected.Execute = IPAddresses
|
plugindetected.Execute = IPAddresses
|
||||||
// Get Execute plugin path from config file
|
// Get Execute plugin path from config file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ func TestExecuteIP_ModifyHost(t *testing.T) {
|
|||||||
var testip ExecuteIP
|
var testip ExecuteIP
|
||||||
|
|
||||||
// Get plugin path from config file
|
// Get plugin path from config file
|
||||||
Config, err := config.ConfigInit(nil, nil)
|
Config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
t.Fail()
|
t.Fail()
|
||||||
|
|||||||
BIN
server/.DS_Store
vendored
BIN
server/.DS_Store
vendored
Binary file not shown.
BIN
server/docker/.DS_Store
vendored
BIN
server/docker/.DS_Store
vendored
Binary file not shown.
7
server/docker/containers/README
Normal file
7
server/docker/containers/README
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
Containers
|
||||||
|
===========
|
||||||
|
|
||||||
|
Structure
|
||||||
|
|_ Containers
|
||||||
|
|_ <name> (To ensure the name is the same as the tag name)
|
||||||
|
|_ DockerFile
|
||||||
43
server/docker/containers/cpuhorovod/Dockerfile
Normal file
43
server/docker/containers/cpuhorovod/Dockerfile
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
from horovod/horovod-cpu
|
||||||
|
# Switch to root user to install additional software
|
||||||
|
USER 0
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure we don't get notifications we can't answer during building.
|
||||||
|
env DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
run apt-get -q -y update; apt-get -q -y upgrade
|
||||||
|
run apt install net-tools
|
||||||
|
|
||||||
|
# Prepare scripts and configs
|
||||||
|
add ./scripts/start /start
|
||||||
|
|
||||||
|
|
||||||
|
# Set root password
|
||||||
|
run echo 'root:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Create user and it's password
|
||||||
|
run useradd -m -G sudo master && \
|
||||||
|
echo 'master:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Apply root password
|
||||||
|
run chpasswd -c SHA512 < /root/passwdfile && \
|
||||||
|
rm /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Port 22 is used for ssh
|
||||||
|
expose 22
|
||||||
|
|
||||||
|
|
||||||
|
# Assign /data as static volume.
|
||||||
|
volume ["/data"]
|
||||||
|
|
||||||
|
|
||||||
|
# Fix all permissions
|
||||||
|
run chmod +x /start
|
||||||
|
|
||||||
|
|
||||||
|
# Starting sshd
|
||||||
|
cmd ["/start"]
|
||||||
1
server/docker/containers/cpuhorovod/description.txt
Normal file
1
server/docker/containers/cpuhorovod/description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Running official horovod dockerfile cpu version
|
||||||
11
server/docker/containers/cpuhorovod/scripts/start
Normal file
11
server/docker/containers/cpuhorovod/scripts/start
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# docker-ubuntu-sshd /start script
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Run OpenSSH server in daemon mode
|
||||||
|
/usr/sbin/sshd -D
|
||||||
61
server/docker/containers/docker-ubuntu-sshd-x11/Dockerfile
Normal file
61
server/docker/containers/docker-ubuntu-sshd-x11/Dockerfile
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# This is base image of Ubuntu LTS with SSHD service.
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# Require: Docker (http://www.docker.io/)
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Base system is the latest LTS version of Ubuntu.
|
||||||
|
# from consol/ubuntu-xfce-vnc
|
||||||
|
|
||||||
|
# due to dependency issues vnc is still work in progress
|
||||||
|
from ubuntu:20.04
|
||||||
|
|
||||||
|
# Switch to root user to install additional software
|
||||||
|
USER 0
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure we don't get notifications we can't answer during building.
|
||||||
|
env DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
|
||||||
|
# Prepare scripts and configs
|
||||||
|
add ./scripts/start /start
|
||||||
|
|
||||||
|
|
||||||
|
# Download and install everything from the repos.
|
||||||
|
run apt-get -q -y update; apt-get -q -y upgrade && \
|
||||||
|
apt-get -q -y install sudo openssh-server && \
|
||||||
|
mkdir /var/run/sshd
|
||||||
|
|
||||||
|
|
||||||
|
# Set root password
|
||||||
|
run echo 'root:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Create user and it's password
|
||||||
|
run useradd -m -G sudo master && \
|
||||||
|
echo 'master:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Apply root password
|
||||||
|
run chpasswd -c SHA512 < /root/passwdfile && \
|
||||||
|
rm /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Port 22 is used for ssh
|
||||||
|
expose 22
|
||||||
|
|
||||||
|
|
||||||
|
# Assign /data as static volume.
|
||||||
|
volume ["/data"]
|
||||||
|
|
||||||
|
|
||||||
|
# Fix all permissions
|
||||||
|
run chmod +x /start
|
||||||
|
|
||||||
|
|
||||||
|
# Starting sshd
|
||||||
|
cmd ["/start"]
|
||||||
72
server/docker/containers/docker-ubuntu-sshd-x11/README.md
Normal file
72
server/docker/containers/docker-ubuntu-sshd-x11/README.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
Ubuntu LTS with SSH (Docker)
|
||||||
|
=========
|
||||||
|
|
||||||
|
A Docker file to build a [docker.io] base container with Ubuntu LTS and a sshd service
|
||||||
|
[docker.io]: http://docker.io
|
||||||
|
Nice and easy way to get any server up and running using docker
|
||||||
|
|
||||||
|
|
||||||
|
Instructions
|
||||||
|
-----------
|
||||||
|
- Install Docker first.
|
||||||
|
Read [installation instructions] (http://docs.docker.io/en/latest/installation/).
|
||||||
|
|
||||||
|
|
||||||
|
- Clone this repository:
|
||||||
|
|
||||||
|
`$ git clone https://github.com/art567/docker-ubuntu-sshd.git`
|
||||||
|
|
||||||
|
|
||||||
|
- Enter local directory:
|
||||||
|
|
||||||
|
`$ cd docker-ubuntu-sshd`
|
||||||
|
|
||||||
|
- Change passwords in Dockerfile:
|
||||||
|
|
||||||
|
`$ vi Dockerfile`
|
||||||
|
|
||||||
|
- Build the container:
|
||||||
|
|
||||||
|
`$ sudo docker build -t art567/ubuntu .`
|
||||||
|
|
||||||
|
|
||||||
|
- Run the container:
|
||||||
|
|
||||||
|
`$ sudo docker run -d=true --name=ubuntu --restart=always -p=2222:22 -v=/opt/data:/data art567/ubuntu /start`
|
||||||
|
|
||||||
|
|
||||||
|
- Your container will start and bind ssh to 2222 port.
|
||||||
|
|
||||||
|
|
||||||
|
- Find your local IP Address:
|
||||||
|
|
||||||
|
`$ ifconfig`
|
||||||
|
|
||||||
|
|
||||||
|
- Connect to the SSH server:
|
||||||
|
|
||||||
|
`$ ssh root@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
- If you don't want to deal with root:
|
||||||
|
|
||||||
|
`$ ssh master@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
**VERY IMPORTANT!!!**
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**Don't forget to change passwords in Dockerfile before building image!**
|
||||||
|
|
||||||
|
|
||||||
|
Versions
|
||||||
|
-----------
|
||||||
|
Some branches represents Ubuntu versions.
|
||||||
|
|
||||||
|
Branch `master` is always represented by latest Ubuntu LTS
|
||||||
|
|
||||||
|
For example:
|
||||||
|
- 12.04 - Ubuntu 12.04 LTS
|
||||||
|
- 14.04 - Ubuntu 14.04 LTS
|
||||||
|
- 16.04 - Ubuntu 16.04 LTS
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Simple Ubuntu 20.04 image
|
||||||
16
server/docker/containers/docker-ubuntu-sshd-x11/ports.json
Normal file
16
server/docker/containers/docker-ubuntu-sshd-x11/ports.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"Port": [
|
||||||
|
{
|
||||||
|
"PortName": "SSH",
|
||||||
|
"InternalPort": 22,
|
||||||
|
"Type": "tcp",
|
||||||
|
"Description": "SSH Port"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"PortName": "VNC",
|
||||||
|
"InternalPort": 5900,
|
||||||
|
"Type": "tcp",
|
||||||
|
"Description": "VNC port"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# docker-ubuntu-sshd /start script
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Run OpenSSH server in daemon mode
|
||||||
|
/usr/sbin/sshd -D
|
||||||
|
|
||||||
|
# Running x11 server with password
|
||||||
|
|
||||||
61
server/docker/containers/docker-ubuntu-sshd/Dockerfile
Normal file
61
server/docker/containers/docker-ubuntu-sshd/Dockerfile
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# This is base image of Ubuntu LTS with SSHD service.
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# Require: Docker (http://www.docker.io/)
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Base system is the latest LTS version of Ubuntu.
|
||||||
|
# from consol/ubuntu-xfce-vnc
|
||||||
|
|
||||||
|
# due to dependency issues vnc is still work in progress
|
||||||
|
from ubuntu:20.04
|
||||||
|
|
||||||
|
# Switch to root user to install additional software
|
||||||
|
USER 0
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure we don't get notifications we can't answer during building.
|
||||||
|
env DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
|
||||||
|
# Prepare scripts and configs
|
||||||
|
add ./scripts/start /start
|
||||||
|
|
||||||
|
|
||||||
|
# Download and install everything from the repos.
|
||||||
|
run apt-get -q -y update; apt-get -q -y upgrade && \
|
||||||
|
apt-get -q -y install sudo openssh-server && \
|
||||||
|
mkdir /var/run/sshd
|
||||||
|
|
||||||
|
|
||||||
|
# Set root password
|
||||||
|
run echo 'root:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Create user and it's password
|
||||||
|
run useradd -m -G sudo master && \
|
||||||
|
echo 'master:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Apply root password
|
||||||
|
run chpasswd -c SHA512 < /root/passwdfile && \
|
||||||
|
rm /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Port 22 is used for ssh
|
||||||
|
expose 22
|
||||||
|
|
||||||
|
|
||||||
|
# Assign /data as static volume.
|
||||||
|
volume ["/data"]
|
||||||
|
|
||||||
|
|
||||||
|
# Fix all permissions
|
||||||
|
run chmod +x /start
|
||||||
|
|
||||||
|
|
||||||
|
# Starting sshd
|
||||||
|
cmd ["/start"]
|
||||||
72
server/docker/containers/docker-ubuntu-sshd/README.md
Normal file
72
server/docker/containers/docker-ubuntu-sshd/README.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
Ubuntu LTS with SSH (Docker)
|
||||||
|
=========
|
||||||
|
|
||||||
|
A Docker file to build a [docker.io] base container with Ubuntu LTS and a sshd service
|
||||||
|
[docker.io]: http://docker.io
|
||||||
|
Nice and easy way to get any server up and running using docker
|
||||||
|
|
||||||
|
|
||||||
|
Instructions
|
||||||
|
-----------
|
||||||
|
- Install Docker first.
|
||||||
|
Read [installation instructions] (http://docs.docker.io/en/latest/installation/).
|
||||||
|
|
||||||
|
|
||||||
|
- Clone this repository:
|
||||||
|
|
||||||
|
`$ git clone https://github.com/art567/docker-ubuntu-sshd.git`
|
||||||
|
|
||||||
|
|
||||||
|
- Enter local directory:
|
||||||
|
|
||||||
|
`$ cd docker-ubuntu-sshd`
|
||||||
|
|
||||||
|
- Change passwords in Dockerfile:
|
||||||
|
|
||||||
|
`$ vi Dockerfile`
|
||||||
|
|
||||||
|
- Build the container:
|
||||||
|
|
||||||
|
`$ sudo docker build -t art567/ubuntu .`
|
||||||
|
|
||||||
|
|
||||||
|
- Run the container:
|
||||||
|
|
||||||
|
`$ sudo docker run -d=true --name=ubuntu --restart=always -p=2222:22 -v=/opt/data:/data art567/ubuntu /start`
|
||||||
|
|
||||||
|
|
||||||
|
- Your container will start and bind ssh to 2222 port.
|
||||||
|
|
||||||
|
|
||||||
|
- Find your local IP Address:
|
||||||
|
|
||||||
|
`$ ifconfig`
|
||||||
|
|
||||||
|
|
||||||
|
- Connect to the SSH server:
|
||||||
|
|
||||||
|
`$ ssh root@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
- If you don't want to deal with root:
|
||||||
|
|
||||||
|
`$ ssh master@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
**VERY IMPORTANT!!!**
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**Don't forget to change passwords in Dockerfile before building image!**
|
||||||
|
|
||||||
|
|
||||||
|
Versions
|
||||||
|
-----------
|
||||||
|
Some branches represents Ubuntu versions.
|
||||||
|
|
||||||
|
Branch `master` is always represented by latest Ubuntu LTS
|
||||||
|
|
||||||
|
For example:
|
||||||
|
- 12.04 - Ubuntu 12.04 LTS
|
||||||
|
- 14.04 - Ubuntu 14.04 LTS
|
||||||
|
- 16.04 - Ubuntu 16.04 LTS
|
||||||
|
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Simple Ubuntu 20.04 image
|
||||||
22
server/docker/containers/docker-ubuntu-sshd/ports.json
Normal file
22
server/docker/containers/docker-ubuntu-sshd/ports.json
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"Port": [
|
||||||
|
{
|
||||||
|
"PortName": "SSH",
|
||||||
|
"InternalPort": 22,
|
||||||
|
"Type": "tcp",
|
||||||
|
"Description": "SSH Port"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"PortName": "NoVNC",
|
||||||
|
"InternalPort": 5901,
|
||||||
|
"Type": "tcp",
|
||||||
|
"Description": "NoVNC port"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"PortName": "NoVNC",
|
||||||
|
"InternalPort": 6081,
|
||||||
|
"Type": "tcp",
|
||||||
|
"Description": "NoVNC port"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
11
server/docker/containers/docker-ubuntu-sshd/scripts/start
Normal file
11
server/docker/containers/docker-ubuntu-sshd/scripts/start
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# docker-ubuntu-sshd /start script
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Run OpenSSH server in daemon mode
|
||||||
|
/usr/sbin/sshd -D
|
||||||
41
server/docker/containers/gpuhorovod/Dockerfile
Normal file
41
server/docker/containers/gpuhorovod/Dockerfile
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
from horovod/horovod
|
||||||
|
# Switch to root user to install additional software
|
||||||
|
USER 0
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure we don't get notifications we can't answer during building.
|
||||||
|
env DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
|
||||||
|
# Prepare scripts and configs
|
||||||
|
add ./scripts/start /start
|
||||||
|
|
||||||
|
|
||||||
|
# Set root password
|
||||||
|
run echo 'root:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Create user and it's password
|
||||||
|
run useradd -m -G sudo master && \
|
||||||
|
echo 'master:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Apply root password
|
||||||
|
run chpasswd -c SHA512 < /root/passwdfile && \
|
||||||
|
rm /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Port 22 is used for ssh
|
||||||
|
expose 22
|
||||||
|
|
||||||
|
|
||||||
|
# Assign /data as static volume.
|
||||||
|
volume ["/data"]
|
||||||
|
|
||||||
|
|
||||||
|
# Fix all permissions
|
||||||
|
run chmod +x /start
|
||||||
|
|
||||||
|
|
||||||
|
# Starting sshd
|
||||||
|
cmd ["/start"]
|
||||||
1
server/docker/containers/gpuhorovod/description.txt
Normal file
1
server/docker/containers/gpuhorovod/description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Running official horovod dockerfile cpu version
|
||||||
11
server/docker/containers/gpuhorovod/scripts/start
Normal file
11
server/docker/containers/gpuhorovod/scripts/start
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# docker-ubuntu-sshd /start script
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Run OpenSSH server in daemon mode
|
||||||
|
/usr/sbin/sshd -D
|
||||||
61
server/docker/containers/ubuntuvnc/Dockerfile
Normal file
61
server/docker/containers/ubuntuvnc/Dockerfile
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# This is base image of Ubuntu LTS with SSHD service.
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# Require: Docker (http://www.docker.io/)
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Base system is the latest LTS version of Ubuntu.
|
||||||
|
# from consol/ubuntu-xfce-vnc
|
||||||
|
|
||||||
|
# due to dependency issues vnc is still work in progress
|
||||||
|
from dorowu/ubuntu-desktop-lxde-vnc
|
||||||
|
|
||||||
|
# Switch to root user to install additional software
|
||||||
|
USER 0
|
||||||
|
|
||||||
|
|
||||||
|
# Make sure we don't get notifications we can't answer during building.
|
||||||
|
env DEBIAN_FRONTEND noninteractive
|
||||||
|
|
||||||
|
|
||||||
|
# Prepare scripts and configs
|
||||||
|
add ./scripts/start /start
|
||||||
|
|
||||||
|
|
||||||
|
# Download and install everything from the repos.
|
||||||
|
run apt-get -q -y update; apt-get -q -y upgrade && \
|
||||||
|
apt-get -q -y install sudo openssh-server && \
|
||||||
|
mkdir /var/run/sshd
|
||||||
|
|
||||||
|
|
||||||
|
# Set root password
|
||||||
|
run echo 'root:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Create user and it's password
|
||||||
|
run useradd -m -G sudo master && \
|
||||||
|
echo 'master:password' >> /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Apply root password
|
||||||
|
run chpasswd -c SHA512 < /root/passwdfile && \
|
||||||
|
rm /root/passwdfile
|
||||||
|
|
||||||
|
|
||||||
|
# Port 22 is used for ssh
|
||||||
|
expose 22
|
||||||
|
|
||||||
|
|
||||||
|
# Assign /data as static volume.
|
||||||
|
volume ["/data"]
|
||||||
|
|
||||||
|
|
||||||
|
# Fix all permissions
|
||||||
|
run chmod +x /start
|
||||||
|
|
||||||
|
|
||||||
|
# Starting sshd
|
||||||
|
cmd ["/start"]
|
||||||
72
server/docker/containers/ubuntuvnc/README.md
Normal file
72
server/docker/containers/ubuntuvnc/README.md
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
Ubuntu LTS with SSH (Docker)
|
||||||
|
=========
|
||||||
|
|
||||||
|
A Docker file to build a [docker.io] base container with Ubuntu LTS and a sshd service
|
||||||
|
[docker.io]: http://docker.io
|
||||||
|
Nice and easy way to get any server up and running using docker
|
||||||
|
|
||||||
|
|
||||||
|
Instructions
|
||||||
|
-----------
|
||||||
|
- Install Docker first.
|
||||||
|
Read [installation instructions] (http://docs.docker.io/en/latest/installation/).
|
||||||
|
|
||||||
|
|
||||||
|
- Clone this repository:
|
||||||
|
|
||||||
|
`$ git clone https://github.com/art567/docker-ubuntu-sshd.git`
|
||||||
|
|
||||||
|
|
||||||
|
- Enter local directory:
|
||||||
|
|
||||||
|
`$ cd docker-ubuntu-sshd`
|
||||||
|
|
||||||
|
- Change passwords in Dockerfile:
|
||||||
|
|
||||||
|
`$ vi Dockerfile`
|
||||||
|
|
||||||
|
- Build the container:
|
||||||
|
|
||||||
|
`$ sudo docker build -t art567/ubuntu .`
|
||||||
|
|
||||||
|
|
||||||
|
- Run the container:
|
||||||
|
|
||||||
|
`$ sudo docker run -d=true --name=ubuntu --restart=always -p=2222:22 -v=/opt/data:/data art567/ubuntu /start`
|
||||||
|
|
||||||
|
|
||||||
|
- Your container will start and bind ssh to 2222 port.
|
||||||
|
|
||||||
|
|
||||||
|
- Find your local IP Address:
|
||||||
|
|
||||||
|
`$ ifconfig`
|
||||||
|
|
||||||
|
|
||||||
|
- Connect to the SSH server:
|
||||||
|
|
||||||
|
`$ ssh root@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
- If you don't want to deal with root:
|
||||||
|
|
||||||
|
`$ ssh master@<ip-address> -p 2222`
|
||||||
|
|
||||||
|
|
||||||
|
**VERY IMPORTANT!!!**
|
||||||
|
-----------
|
||||||
|
|
||||||
|
**Don't forget to change passwords in Dockerfile before building image!**
|
||||||
|
|
||||||
|
|
||||||
|
Versions
|
||||||
|
-----------
|
||||||
|
Some branches represents Ubuntu versions.
|
||||||
|
|
||||||
|
Branch `master` is always represented by latest Ubuntu LTS
|
||||||
|
|
||||||
|
For example:
|
||||||
|
- 12.04 - Ubuntu 12.04 LTS
|
||||||
|
- 14.04 - Ubuntu 14.04 LTS
|
||||||
|
- 16.04 - Ubuntu 16.04 LTS
|
||||||
|
|
||||||
1
server/docker/containers/ubuntuvnc/description.txt
Normal file
1
server/docker/containers/ubuntuvnc/description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Simple Ubuntu 20.04 image
|
||||||
11
server/docker/containers/ubuntuvnc/scripts/start
Normal file
11
server/docker/containers/ubuntuvnc/scripts/start
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# docker-ubuntu-sshd /start script
|
||||||
|
#
|
||||||
|
# Authors: Art567
|
||||||
|
# Updated: Sep 20th, 2015
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
# Run OpenSSH server in daemon mode
|
||||||
|
/usr/sbin/sshd -D
|
||||||
@@ -84,7 +84,7 @@ func BuildRunContainer(NumPorts int, GPU string, ContainerName string) (*DockerV
|
|||||||
//Default parameters
|
//Default parameters
|
||||||
RespDocker.TagName = "p2p-ubuntu"
|
RespDocker.TagName = "p2p-ubuntu"
|
||||||
// Get Path from config
|
// Get Path from config
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -330,7 +330,7 @@ func StopAndRemoveContainer(containername string) error {
|
|||||||
// ViewAllContainers returns all containers runnable and which can be built
|
// ViewAllContainers returns all containers runnable and which can be built
|
||||||
func ViewAllContainers() (*DockerContainers, error) {
|
func ViewAllContainers() (*DockerContainers, error) {
|
||||||
// Traverse the deploy path as per given in the config file
|
// Traverse the deploy path as per given in the config file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ type SysInfo struct {
|
|||||||
GPU *Query `xml: GpuInfo`
|
GPU *Query `xml: GpuInfo`
|
||||||
}
|
}
|
||||||
|
|
||||||
func ServerInfo() *SysInfo {
|
func ServerInfo() interface{} {
|
||||||
hostStat, _ := host.Info()
|
hostStat, _ := host.Info()
|
||||||
cpuStat, _ := cpu.Info()
|
cpuStat, _ := cpu.Info()
|
||||||
vmStat, _ := mem.VirtualMemory()
|
vmStat, _ := mem.VirtualMemory()
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Server() (*gin.Engine, error) {
|
func Server() error {
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
|
||||||
//Get Server port based on the config file
|
//Get Server port based on the config file
|
||||||
config, err := config.ConfigInit(nil, nil)
|
config, err := config.ConfigInit()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// update IPTable with new port and ip address and update ip table
|
// update IPTable with new port and ip address and update ip table
|
||||||
@@ -172,7 +172,7 @@ func Server() (*gin.Engine, error) {
|
|||||||
if config.BehindNAT == "True" {
|
if config.BehindNAT == "True" {
|
||||||
table, err := p2p.ReadIpTable()
|
table, err := p2p.ReadIpTable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
var lowestLatency int64
|
var lowestLatency int64
|
||||||
@@ -192,14 +192,14 @@ func Server() (*gin.Engine, error) {
|
|||||||
if lowestLatency != 10000000 {
|
if lowestLatency != 10000000 {
|
||||||
serverPort, err := frp.GetFRPServerPort("http://" + lowestLatencyIpAddress.Ipv4 + ":" + lowestLatencyIpAddress.ServerPort)
|
serverPort, err := frp.GetFRPServerPort("http://" + lowestLatencyIpAddress.Ipv4 + ":" + lowestLatencyIpAddress.ServerPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
// Create 3 second delay to allow FRP server to start
|
// Create 3 second delay to allow FRP server to start
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
// Starts FRP as a client with
|
// Starts FRP as a client with
|
||||||
proxyPort, err := frp.StartFRPClientForServer(lowestLatencyIpAddress.Ipv4, serverPort, config.ServerPort, "")
|
proxyPort, err := frp.StartFRPClientForServer(lowestLatencyIpAddress.Ipv4, serverPort, config.ServerPort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// updating with the current proxy address
|
// updating with the current proxy address
|
||||||
@@ -220,7 +220,10 @@ func Server() (*gin.Engine, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Run gin server on the specified port
|
// Run gin server on the specified port
|
||||||
go r.Run(":" + config.ServerPort)
|
err = r.Run(":" + config.ServerPort)
|
||||||
|
if err != nil {
|
||||||
return r, nil
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user