diff --git a/Bindings/Client.go b/Bindings/Client.go index c1ad90a..ef88700 100644 --- a/Bindings/Client.go +++ b/Bindings/Client.go @@ -2,11 +2,11 @@ package main import "C" import ( - "encoding/json" - "time" + "encoding/json" + "time" - "github.com/Akilan1999/p2p-rendering-computation/abstractions" - "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" + "github.com/Akilan1999/p2p-rendering-computation/abstractions" + "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" ) // The Client package where data-types @@ -18,20 +18,20 @@ import ( //export StartContainer func StartContainer(IP string) (output *C.char) { - container, err := abstractions.StartContainer(IP) - if err != nil { - return C.CString(err.Error()) - } - return ConvertStructToJSONString(container) + container, err := abstractions.StartContainer(IP) + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(container) } //export RemoveContainer func RemoveContainer(IP string, ID string) (output *C.char) { - err := abstractions.RemoveContainer(IP, ID) - if err != nil { - return C.CString(err.Error()) - } - return C.CString("Success") + err := abstractions.RemoveContainer(IP, ID) + if err != nil { + return C.CString(err.Error()) + } + return C.CString("Success") } // --------------------------------- Plugin Control ---------------------------------------- @@ -77,20 +77,20 @@ func RemoveContainer(IP string, ID string) (output *C.char) { //export GetSpecs func GetSpecs(IP string) (output *C.char) { - specs, err := abstractions.GetSpecs(IP) - if err != nil { - return C.CString(err.Error()) - } - return ConvertStructToJSONString(specs) + specs, err := abstractions.GetSpecs(IP) + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(specs) } //export Init func Init(customConfig string) (output *C.char) { - init, err := abstractions.Init(customConfig) - if err != nil { - return C.CString(err.Error()) - } - return ConvertStructToJSONString(init) + init, err := abstractions.Init(customConfig) + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(init) } @@ -98,81 +98,90 @@ func Init(customConfig string) (output *C.char) { //export ViewIPTable func ViewIPTable() (output *C.char) { - table, err := abstractions.ViewIPTable() - if err != nil { - return C.CString(err.Error()) - } - return ConvertStructToJSONString(table) + table, err := abstractions.ViewIPTable() + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(table) } //export UpdateIPTable func UpdateIPTable() (output *C.char) { - err := abstractions.UpdateIPTable() - if err != nil { - return C.CString(err.Error()) - } - return C.CString("Success") + err := abstractions.UpdateIPTable() + if err != nil { + return C.CString(err.Error()) + } + return C.CString("Success") } //export EscapeFirewall func EscapeFirewall(HostOutsideNATIP string, HostOutsideNATPort string, internalPort string) (output *C.char) { - // Get free port from P2PRC server node - serverPort, err := frp.GetFRPServerPort("http://" + HostOutsideNATIP + ":" + HostOutsideNATPort) + // Get free port from P2PRC server node + serverPort, err := frp.GetFRPServerPort("http://" + HostOutsideNATIP + ":" + HostOutsideNATPort) - if err != nil { - return C.CString(err.Error()) - } + if err != nil { + return C.CString(err.Error()) + } - time.Sleep(5 * time.Second) + time.Sleep(5 * time.Second) - ExposedPort, err := frp.StartFRPClientForServer(HostOutsideNATIP+":"+HostOutsideNATPort, serverPort, internalPort, "") - if err != nil { - return C.CString(err.Error()) - } + ExposedPort, err := frp.StartFRPClientForServer(HostOutsideNATIP+":"+HostOutsideNATPort, serverPort, internalPort, "") + if err != nil { + return C.CString(err.Error()) + } - return C.CString(ExposedPort) + return C.CString(ExposedPort) } //export MapPort func MapPort(Port string, DomainName string, ServerAddress string) *C.char { - Address, err := abstractions.MapPort(Port, DomainName, ServerAddress) - if err != nil { - return C.CString(err.Error()) - } - return C.CString(Address.EntireAddress) + Address, err := abstractions.MapPort(Port, DomainName, ServerAddress) + if err != nil { + return C.CString(err.Error()) + } + return C.CString(Address.EntireAddress) } //export CustomInformation func CustomInformation(CustomInformation string) *C.char { - err := abstractions.AddCustomInformation(CustomInformation) - if err != nil { - return C.CString(err.Error()) - } - return C.CString("Success") + err := abstractions.AddCustomInformation(CustomInformation) + if err != nil { + return C.CString(err.Error()) + } + return C.CString("Success") +} + +//export AddRootNode +func AddRootNode(IP string, Port string) *C.char { + err := abstractions.AddRootNode(IP, Port) + if err != nil { + return C.CString(err.Error()) + } + return C.CString("Success") } // --------------------------------- Controlling Server ---------------------------------------- //export Server func Server() (output *C.char) { - _, err := abstractions.Start() - if err != nil { - return C.CString(err.Error()) - } + _, err := abstractions.Start() + if err != nil { + return C.CString(err.Error()) + } - return ConvertStructToJSONString("") + return ConvertStructToJSONString("") } // --------------------------------- Helper Functions ---------------------------------------- func ConvertStructToJSONString(Struct interface{}) *C.char { - jsonBytes, err := json.Marshal(Struct) - if err != nil { - return C.CString(err.Error()) - } + jsonBytes, err := json.Marshal(Struct) + if err != nil { + return C.CString(err.Error()) + } - // Convert the JSON bytes to a string - return C.CString(string(jsonBytes)) + // Convert the JSON bytes to a string + return C.CString(string(jsonBytes)) } func main() {} diff --git a/Bindings/python/library.py b/Bindings/python/library.py index b211f1e..20bcc40 100644 --- a/Bindings/python/library.py +++ b/Bindings/python/library.py @@ -44,9 +44,9 @@ class Node: Upload: int ServerPort: str BareMetalSSHPort: str - NAT: str + NAT: bool EscapeImplementation: str - ProxyServer: str + ProxyServer: bool UnSafeMode: bool PublicKey: str CustomInformation: str @@ -98,6 +98,21 @@ def ListNodes(): dat: IPAddress = dacite.from_dict(IPAddress,ipTableObject) return dat +# Add a root node to P2RRC and overwrites all other nodes. +# To be only added before the network started and with +# the intention of a fresh protocol. +def AddRootNode(ip="", port="") -> bool: + ip = go_string(c_char_p(ip.encode('utf-8')), len(ip)) + port = go_string(c_char_p(port.encode('utf-8')), len(port)) + + p2prc.AddRootNode.restype = c_char_p + res = p2prc.AddRootNode(ip, port) + if str(res).strip("b'") == "Success": + return True + return False + + + # python function to pass-through custom # information to interpret which can be # interpreted as a DSL. diff --git a/Bindings/python/test.py b/Bindings/python/test.py index d3bc4aa..e094ba4 100644 --- a/Bindings/python/test.py +++ b/Bindings/python/test.py @@ -9,3 +9,6 @@ if __name__ == "__main__": # Add custom information to the network if AddCustomInformation("Test"): print("It worked") + + if AddRootNode("0.0.0.0", "8081"): + print("It worked for adding root node") diff --git a/Docs/Colored-On-Light-Image.png b/Docs/Colored-On-Light-Image.png new file mode 100644 index 0000000..968df7d Binary files /dev/null and b/Docs/Colored-On-Light-Image.png differ diff --git a/Docs/index.html b/Docs/index.html index 2cef8e0..b66adba 100644 --- a/Docs/index.html +++ b/Docs/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + @@ -26,12 +26,12 @@

Table of Contents

@@ -108,8 +109,8 @@
  • 6.3. Current languages supported
  • @@ -126,22 +127,22 @@
  • 10. Client mode
  • -
  • 11. Blog posts +
  • 11. Blog posts
  • -
  • 12. Ideas for future potencial features +
  • 12. Ideas for future potencial features @@ -150,26 +151,26 @@
  • -
    -

    Colored-On-Light-Image.png +

    +

    Colored-On-Light-Image.png

    -
    -

    1. Guide through video

    +
    +

    1. Guide through video

    -
    -

    1.0.1. The video below shows the setup and usage of P2PRC.

    +
    +

    1.0.1. The video below shows the setup and usage of P2PRC.

    -
    +

    maxresdefault.jpg

    -
    @@ -258,7 +259,7 @@ Go API to create and interact with the containers. to install docker GPU

    -
    +
     // Do ensure that the docker command does not need sudo to run
     sudo chmod 666 /var/run/docker.sock
     
    @@ -272,7 +273,7 @@ To set up the internal dependencies and build the entire go code into a single binary

    -
    +
     make
     
    @@ -284,7 +285,7 @@ To set up P2PRC on Windows, simply run this batch file. Make sure you are not in admin mode when running this.

    -
    +
     .\install.bat
     
    @@ -294,7 +295,7 @@ are not in admin mode when running this.

    3.2.4. Add appropriate paths to .bashrc

    -
    +
     export P2PRC=/<PATH>/p2p-rendering-computation
     export PATH=/<PATH>/p2p-rendering-computation:${PATH}
     
    @@ -303,14 +304,14 @@ export PATH=/<PATH>/p2p-rendering-computation:${PATH}

    3.2.5. Test if binary works

    -
    +
     p2prc --help
     
    1. Output:
      -
      +
       NAME:
          p2p-rendering-computation - p2p cli application to create and access VMs in other servers
       
      @@ -372,7 +373,7 @@ GLOBAL OPTIONS:
       

      4.0.1. Start as a server

      -
      +
       p2prc -s 
       
      @@ -380,7 +381,7 @@ p2prc -s

      4.0.2. View server Specification

      -
      +
       p2prc --specs=<ip address>
       
      @@ -392,7 +393,7 @@ p2prc --specs=<ip address> use the --gpu if you know the other machine has a gpu.

      -
      +
       p2prc --touch=<server ip address> -p <number of ports> --gpu
       
      @@ -404,7 +405,7 @@ p2prc --touch=<server ip address> -p <number of ports> --gpu The docker id is present in the output where you create a container

      -
      +
       p2prc --rm=<server ip address> --id=<docker container id> 
       
      @@ -412,7 +413,7 @@ p2prc --rm=<server ip address> --id=<docker container id>

      4.0.5. Adding servers to ip table

      -
      +
       p2prc --as=<server ip address you want to add> 
       
      @@ -420,7 +421,7 @@ p2prc --as=<server ip address you want to add>

      4.0.6. Update ip table

      -
      +
       p2prc --us 
       
      @@ -428,7 +429,7 @@ p2prc --us

      4.0.7. List Servers

      -
      +
       p2prc --ls 
       
      @@ -436,7 +437,7 @@ p2prc --ls

      4.0.8. View Network interfaces

      -
      +
       p2prc --ni
       
      @@ -444,7 +445,7 @@ p2prc --ni

      4.0.9. Viewing Containers created Client side

      -
      +
       p2prc --tc
       
      @@ -452,7 +453,7 @@ p2prc --tc

      4.0.10. Running plugin

      -
      +
       p2prc --plugin <plugin name> --id <container id or group id>
       
      @@ -460,7 +461,7 @@ p2prc --plugin <plugin name> --id <container id or group id>

      4.0.11. Create group

      -
      +
       p2prc --cgroup
       
      @@ -468,7 +469,7 @@ p2prc --cgroup

      4.0.12. Add container to group

      -
      +
       p2prc --group <group id> --id <container id>
       
      @@ -476,7 +477,7 @@ p2prc --group <group id> --id <container id>

      4.0.13. View groups

      -
      +
       p2prc --groups
       
      @@ -484,7 +485,7 @@ p2prc --groups

      4.0.14. View specific group

      -
      +
       p2prc --group <group id>
       
      @@ -492,7 +493,7 @@ p2prc --group <group id>

      4.0.15. Delete container from group

      -
      +
       p2prc --rmcgroup --group <group id> --id <container id> 
       
      @@ -500,7 +501,7 @@ p2prc --rmcgroup --group <group id> --id <container id>

      4.0.16. Delete entire group

      -
      +
       p2prc --rmgroup <group id>
       
      @@ -508,7 +509,7 @@ p2prc --rmgroup <group id>

      4.0.17. Pulling plugin from a remote repo

      -
      +
       p2prc --pp <repo link>
       
      @@ -516,7 +517,7 @@ p2prc --pp <repo link>

      4.0.18. Deleting plugin from the plugin directory

      -
      +
       p2prc --rp <plugin name> 
       
      @@ -524,28 +525,28 @@ p2prc --rp <plugin name>

      4.0.19. Added custom metadata about the current node

      -
      +
       p2prc --amd "custom metadata"
       
      -
      -

      4.0.20. MapPort and link to domain name

      +
      +

      4.0.20. MapPort and link to domain name

      Allows to expose remote ports from a machine in the P2P network.

      -
      +
       p2prc --mp <port no to map> --dn <domain name to link Mapped port against>
       
        -
      1. MapPort in remote machine
        +
      2. MapPort in remote machine

        This is to ensure ports on remote machines on the P2PRC can be easily opened.

        -
        +
         p2prc --mp <port no to map> --dn <domain name to link Mapped port against> --ra <remote server address>
         
        @@ -554,6 +555,19 @@ p2prc --mp <port no to map> --dn <domain name to link Mapped port again
      +
      +

      4.0.21. Add root node

      +
      +

      +Adds a root node to P2RRC and overwrites all other nodes in the ip table. +To be only added before the network is started and with +the intention of a fresh instance. +

      +
      +p2prc --arn --ip <root node ip address> -p <root node port no>
      +
      +
      +

      5. P2P Module Implementation

      @@ -660,7 +674,7 @@ from the TURN server. The flow below describes the workflow.
    2. Call /FRPPort
    3. -
      +
       http://<turn server ip>:<server port no>/FRPport
       
      @@ -749,7 +763,7 @@ p2prc.h p2prc.so Below are a sample set of commands to open the bindings implementation.

      -
      +
       # run
       cd Bindings/
       # list files
      @@ -837,7 +851,7 @@ that convert a go object to JSON string initially and converts it to
       
    4. A Pseudo code to refer to the common function implementation shape could be represented as:
      -
      +
       func <Function name> (output *C.char) {
             <response>,<error> := <P2PRC function name>(<parameters if needed>)
             if <error> != nil {
      @@ -855,8 +869,8 @@ func <Function name> (output *C.char) {
       

      6.3. Current languages supported

      -
      -

      6.3.1. Python

      +
      +

      6.3.1. Python

        @@ -893,8 +907,8 @@ called from other programming languages.
      -
      -

      6.3.2. Haskell

      +
      +

      6.3.2. Haskell

      P2PRC officially supports Haskell bindings and will further support @@ -1006,7 +1020,7 @@ from the TURN server. The flow below describes the workflow.

    5. Call /FRPPort
    6. -
      +
       http://<turn server ip>:<server port no>/FRPport
       
      @@ -1037,12 +1051,12 @@ func main() {
      -
      -

      11. Blog posts

      +
      +

      11. Blog posts

      -
      -

      11.1. Self host within 5 minutes any program

      +
      +

      11.1. Self host within 5 minutes any program

      -
      +

      maxresdefault.jpg

      @@ -1064,8 +1078,8 @@ This is a fun expirement for anyone to try to quickly run a server and quickly do a map port and domain name mapping in a single command.

      -
      -

      11.1.1. 1. Find a program you want to run

      +
      +

      11.1.1. 1. Find a program you want to run

      Let's try to setup a really easy program (Let's do with Linkwarden @@ -1074,7 +1088,7 @@ compose installed on your local machine.

        -
      1. Let's run Linkwarden using docker compose and P2PRC
        +
      2. Let's run Linkwarden using docker compose and P2PRC
      -
      -

      12. Ideas for future potencial features

      +
      +

      12. Ideas for future potencial features

      Consists of personal loideas for the future of P2PRC. At moment only has main contributors writiing to this.

      -
      -

      12.1. To support hetrogenous set of Nodes that cannot run P2PRC

      +
      +

      12.1. To support hetrogenous set of Nodes that cannot run P2PRC

      This stems from a personal issue I have when doing research @@ -1188,8 +1202,8 @@ and would introduce a new layer fault tolerance within a local network nodes.

      -
      -

      12.1.1. Assumptions:

      +
      +

      12.1.1. Assumptions:

      • I have a Morello board that cannot run P2PRC
      • @@ -1202,8 +1216,8 @@ as well look into custom tasks into the hetrogenous hardware.
      -
      -

      12.1.2. Set of interesting possible:

      +
      +

      12.1.2. Set of interesting possible:

      We build a cool set possibilities before and use this to build up the implementation @@ -1220,8 +1234,8 @@ weight hypervisors.

    -
    -

    12.1.3. Implementation

    +
    +

    12.1.3. Implementation

    • To use implementations similar to socat to ensure we can bind address of local @@ -1235,7 +1249,7 @@ other nodes can access the Morello board who have permission access.
    -
    +

    P2PRCRemoteNodes.png

    Figure 1: Implementation idea (To be improved upon)

    @@ -1247,7 +1261,7 @@ other nodes can access the Morello board who have permission access.

    Author: Akilan

    -

    Created: 2025-04-25 Fri 23:17

    +

    Created: 2025-04-28 Mon 23:14

    Validate

    diff --git a/Docs/index.org b/Docs/index.org index ed74e4f..265680e 100644 --- a/Docs/index.org +++ b/Docs/index.org @@ -4,7 +4,7 @@ #+HTML_HEAD: #+attr_html: :width 300px -[[../artwork/p2prc-logos/Colored-On-Light-Image.png]] +[[./Colored-On-Light-Image.png]] * Guide through video *** The video below shows the setup and usage of P2PRC. @@ -356,6 +356,14 @@ p2prc --mp --dn --ra -------------- +*** Add root node +Adds a root node to P2RRC and overwrites all other nodes in the ip table. +To be only added before the network is started and with +the intention of a fresh instance. +#+begin_example +p2prc --arn --ip -p +#+end_example + * P2P Module Implementation :PROPERTIES: :CUSTOM_ID: p2p-module-implementation diff --git a/abstractions/base.go b/abstractions/base.go index f009c56..e32ba6f 100644 --- a/abstractions/base.go +++ b/abstractions/base.go @@ -2,94 +2,108 @@ package abstractions import "C" import ( - "github.com/Akilan1999/p2p-rendering-computation/client" - "github.com/Akilan1999/p2p-rendering-computation/client/clientIPTable" - Config "github.com/Akilan1999/p2p-rendering-computation/config" - "github.com/Akilan1999/p2p-rendering-computation/config/generate" - "github.com/Akilan1999/p2p-rendering-computation/p2p" - "github.com/Akilan1999/p2p-rendering-computation/server" - "github.com/Akilan1999/p2p-rendering-computation/server/docker" - "github.com/gin-gonic/gin" - "os" + "github.com/Akilan1999/p2p-rendering-computation/client" + "github.com/Akilan1999/p2p-rendering-computation/client/clientIPTable" + Config "github.com/Akilan1999/p2p-rendering-computation/config" + "github.com/Akilan1999/p2p-rendering-computation/config/generate" + "github.com/Akilan1999/p2p-rendering-computation/p2p" + "github.com/Akilan1999/p2p-rendering-computation/server" + "github.com/Akilan1999/p2p-rendering-computation/server/docker" + "github.com/gin-gonic/gin" + "os" ) // Init Initialises p2prc func Init(customConfig interface{}) (config *Config.Config, err error) { - // Get config file path - // Checks P2PRC path initially - // - Get PATH if environment varaible - path, err := Config.GetPathP2PRC("P2PRC") - if err != nil { - return - } - // check if the config file exists - if _, err = os.Stat(path + "config.json"); err != nil { - // Initialize with base p2prc config files - // set the config file with default paths - config, err = generate.SetDefaults("P2PRC", false, customConfig, false) - if err != nil { - return - } - } else { - // If the configs are available then use them over generating new ones. - config, err = Config.ConfigInit(nil, nil) - if err != nil { - return - } - } + // Get config file path + // Checks P2PRC path initially + // - Get PATH if environment varaible + path, err := Config.GetPathP2PRC("P2PRC") + if err != nil { + return + } + // check if the config file exists + if _, err = os.Stat(path + "config.json"); err != nil { + // Initialize with base p2prc config files + // set the config file with default paths + config, err = generate.SetDefaults("P2PRC", false, customConfig, false) + if err != nil { + return + } + } else { + // If the configs are available then use them over generating new ones. + config, err = Config.ConfigInit(nil, nil) + if err != nil { + return + } + } - 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 + engine, err := server.Server() + if err != nil { + return nil, err + } + return engine, nil } // MapPort Creates a reverse proxy connection and maps the appropriate port func MapPort(port string, domainName string, serverAddress string) (response *client.ResponseMAPPort, err error) { - response, err = client.MAPPort(port, domainName, serverAddress) - return + response, err = client.MAPPort(port, domainName, serverAddress) + return } // StartContainer Starts docker container on the remote machine func StartContainer(IP string) (container *docker.DockerVM, err error) { - container, err = client.StartContainer(IP, 0, false, "", "") - return + container, err = client.StartContainer(IP, 0, false, "", "") + return } // RemoveContainer Removes docker container based on the IP address and ID // provided func RemoveContainer(IP string, ID string) error { - return client.RemoveContianer(IP, ID) + return client.RemoveContianer(IP, ID) } // GetSpecs Get spec information about the remote server func GetSpecs(IP string) (specs *server.SysInfo, err error) { - specs, err = client.GetSpecs(IP) - return + specs, err = client.GetSpecs(IP) + return } // ViewIPTable View information of nodes in the network func ViewIPTable() (table *p2p.IpAddresses, err error) { - table, err = p2p.ReadIpTable() - return + table, err = p2p.ReadIpTable() + return } // UpdateIPTable Force updates IP tables based on new // new nodes discovered in the network func UpdateIPTable() (err error) { - return clientIPTable.UpdateIpTableListClient() + return clientIPTable.UpdateIpTableListClient() } // AddCustomInformation allows to pass custom information // through the network to which can be listened on // all peers in the network to execute a task. func AddCustomInformation(information string) error { - return clientIPTable.AddCustomInformationToIPTable(information) + return clientIPTable.AddCustomInformationToIPTable(information) +} + +// AddRootNode Adds root node to the network by using defaults except for +// ip address and port no. Supports only IPV4 as of now. +func AddRootNode(rootIP string, portNo string) error { + var rootNode []p2p.IpAddress + + rootNode = append(rootNode, p2p.IpAddress{ + Name: "", + Ipv4: rootIP, + ServerPort: portNo, + NAT: false, + }) + return generate.GenerateIPTableFile(rootNode) } diff --git a/cmd/action.go b/cmd/action.go index 19e8d96..11b059a 100644 --- a/cmd/action.go +++ b/cmd/action.go @@ -2,6 +2,7 @@ package cmd import ( "fmt" + "github.com/Akilan1999/p2p-rendering-computation/abstractions" "github.com/Akilan1999/p2p-rendering-computation/client" "github.com/Akilan1999/p2p-rendering-computation/client/clientIPTable" "github.com/Akilan1999/p2p-rendering-computation/config/generate" @@ -87,11 +88,7 @@ var CliAction = func(ctx *cli.Context) error { // Displays all images available on the server side if ViewImages != "" { imageRes, err := client.ViewContainers(ViewImages) - - if err != nil { - fmt.Print(err) - } - client.PrettyPrint(imageRes) + standardOutput(err, imageRes) } // Function called to stop and remove server from Docker @@ -100,9 +97,7 @@ var CliAction = func(ctx *cli.Context) error { fmt.Println("provide container ID via --ID or --id") } else { err := client.RemoveContianer(RemoveVM, ID) - if err != nil { - fmt.Print(err) - } + standardOutput(err, nil) } } @@ -119,58 +114,40 @@ var CliAction = func(ctx *cli.Context) error { // Calls function to do Api call to start the container on the server side imageRes, err := client.StartContainer(CreateVM, PortsInt, GPU, ContainerName, BaseImage) - if err != nil { - fmt.Print(err) - } - client.PrettyPrint(imageRes) + standardOutput(err, imageRes) } //Call if specs flag is called if Specs != "" { specs, err := client.GetSpecs(Specs) - if err != nil { - return err - } - - // Pretty print - client.PrettyPrint(specs) + standardOutput(err, specs) } //Sets default paths to the config file if SetDefaultConfig { _, err := generate.SetDefaults("P2PRC", false, nil, false) - if err != nil { - fmt.Print(err) - } + standardOutput(err, nil) } //If the network interface flag is called // Then all the network interfaces are displayed if NetworkInterface { err := p2p.ViewNetworkInterface() - if err != nil { - fmt.Print(err) - } + standardOutput(err, nil) } // If the view plugin flag is called then display all // plugins available if ViewPlugin { plugins, err := plugin.DetectPlugins() - if err != nil { - fmt.Print(err) - } - client.PrettyPrint(plugins) + standardOutput(err, plugins) } // If the flag Tracked Container is called or the flag // --tc if TrackedContainers { err, trackedContainers := client.ViewTrackedContainers() - if err != nil { - fmt.Print(err) - } - client.PrettyPrint(trackedContainers) + standardOutput(err, trackedContainers) } //Executing plugin when the plugin flag is called @@ -179,14 +156,11 @@ var CliAction = func(ctx *cli.Context) error { // To execute plugin requires the container ID or group ID provided when being executed if ID != "" { err := plugin.CheckRunPlugin(ExecutePlugin, ID) - if err != nil { - fmt.Println(err) - } else { - fmt.Println("Success") - } - } else { - fmt.Println("provide container ID via --ID or --id") + standardOutput(err, nil) } + //else { + // fmt.Println("provide container ID via --ID or --id") + //} } @@ -194,10 +168,7 @@ var CliAction = func(ctx *cli.Context) error { // Creates new group and outputs JSON file if CreateGroup { group, err := client.CreateGroup() - if err != nil { - return err - } - client.PrettyPrint(group) + standardOutput(err, group) } // Actions to be performed when the @@ -208,26 +179,14 @@ var CliAction = func(ctx *cli.Context) error { // --rmcgroup --id if RemoveContainerGroup && ID != "" { group, err := client.RemoveContainerGroup(ID, Group) - if err != nil { - fmt.Println(err) - } else { - client.PrettyPrint(group) - } + standardOutput(err, group) } else if ID != "" { // Add container to group based on group ID provided // --id group, err := client.AddContainerToGroup(ID, Group) - if err != nil { - fmt.Println(err) - } else { - client.PrettyPrint(group) - } + standardOutput(err, group) } else { // View all information about current group group, err := client.GetGroup(Group) - if err != nil { - fmt.Println(err) - } else { - client.PrettyPrint(group) - } + standardOutput(err, group) } } @@ -236,63 +195,52 @@ var CliAction = func(ctx *cli.Context) error { // --rmgroup if RemoveGroup != "" { err := client.RemoveGroup(RemoveGroup) - if err != nil { - fmt.Println(err) - } else { - fmt.Println("Group Removed") - } + standardOutput(err, nil) } // Execute Function to view all groups if Groups { groups, err := client.ReadGroup() - if err != nil { - fmt.Println(err) - } else { - client.PrettyPrint(groups) - } + standardOutput(err, groups) } //-------------------------------- if PullPlugin != "" { err := plugin.DownloadPlugin(PullPlugin) - if err != nil { - fmt.Println(err) - } else { - fmt.Println("Success") - } + standardOutput(err, nil) } if RemovePlugin != "" { err := plugin.DeletePlugin(RemovePlugin) - if err != nil { - fmt.Println(err) - } else { - fmt.Println("Success") - } + standardOutput(err, nil) } if AddMetaData != "" { err := clientIPTable.AddCustomInformationToIPTable(AddMetaData) - if err != nil { - fmt.Println(err) - } else { - fmt.Println("Success") - } + standardOutput(err, nil) } if MAPPort != "" { address, err := client.MAPPort(MAPPort, DomainName, RemoteAddress) - if err != nil { - return err - } - if err != nil { - fmt.Println(err) - } else { - client.PrettyPrint(address) - } + standardOutput(err, address) + } + + // Action called to add root node to network + if AddRootNode && IP != "" && Ports != "" { + err := abstractions.AddRootNode(IP, Ports) + standardOutput(err, nil) } return nil } + +func standardOutput(err error, i interface{}) { + if err != nil { + fmt.Println(err) + } else if i == nil { + fmt.Println("Success") + } else { + client.PrettyPrint(i) + } +} diff --git a/cmd/flags.go b/cmd/flags.go index 486f9fb..34423b4 100644 --- a/cmd/flags.go +++ b/cmd/flags.go @@ -41,6 +41,8 @@ var ( PullPlugin string RemovePlugin string AddMetaData string + AddRootNode bool + IP string ) var AppConfigFlags = []cli.Flag{ @@ -272,4 +274,18 @@ var AppConfigFlags = []cli.Flag{ EnvVars: []string{"ADDMETADATA"}, Destination: &AddMetaData, }, + &cli.BoolFlag{ + Name: "AddRootNode", + Aliases: []string{"arn"}, + Usage: "Adds initial root node to talk to", + EnvVars: []string{"ADDROOTNODE"}, + Destination: &AddRootNode, + }, + &cli.StringFlag{ + Name: "IPAddress", + Aliases: []string{"ip"}, + Usage: "IP address", + EnvVars: []string{"IP"}, + Destination: &IP, + }, } diff --git a/config/config.go b/config/config.go index 883638b..b05af12 100644 --- a/config/config.go +++ b/config/config.go @@ -29,8 +29,8 @@ type Config struct { ServerPort string ProxyPort string GroupTrackContainersPath string - FRPServerPort string - BehindNAT string + FRPServerPort bool + BehindNAT bool IPTableKey string PublicKeyFile string PrivateKeyFile string diff --git a/config/generate/generate.go b/config/generate/generate.go index b926457..7d8228c 100644 --- a/config/generate/generate.go +++ b/config/generate/generate.go @@ -78,9 +78,9 @@ func SetDefaults(envName string, forceDefault bool, CustomConfig interface{}, No Defaults.GroupTrackContainersPath = defaultPath + "client/trackcontainers/grouptrackcontainers.json" Defaults.ServerPort = "8088" Defaults.ProxyPort = "" - Defaults.FRPServerPort = "True" + Defaults.FRPServerPort = true Defaults.CustomConfig = CustomConfig - Defaults.BehindNAT = "True" + Defaults.BehindNAT = true Defaults.DockerRunLogs = "/tmp/" // Generate a random key to be added to IPTable Defaults.IPTableKey = String(12) diff --git a/config/generate/generateFiles.go b/config/generate/generateFiles.go index c97c22b..9b2081f 100644 --- a/config/generate/generateFiles.go +++ b/config/generate/generateFiles.go @@ -45,9 +45,9 @@ func GenerateIPTableFile(rootNodes []p2p.IpAddress) (err error) { if len(rootNodes) <= 0 { rootnode.Name = "Node1" rootnode.ServerPort = "8078" - rootnode.NAT = "False" + rootnode.NAT = false rootnode.Ipv4 = "217.76.63.222" - rootnode.ProxyServer = "True" + rootnode.ProxyServer = true rootnodes.IpAddress = append(rootnodes.IpAddress, rootnode) } else { diff --git a/p2p/iptable.go b/p2p/iptable.go index 9cdf891..082ece2 100644 --- a/p2p/iptable.go +++ b/p2p/iptable.go @@ -29,9 +29,9 @@ type IpAddress struct { Upload float64 `json:"Upload"` ServerPort string `json:"ServerPort"` BareMetalSSHPort string `json:"BareMetalSSHPort"` - NAT string `json:"NAT"` + NAT bool `json:"NAT"` EscapeImplementation string `json:"EscapeImplementation"` - ProxyServer string `json:"ProxyServer"` + ProxyServer bool `json:"ProxyServer"` UnSafeMode bool `json:"UnSafeMode"` PublicKey string `json:"PublicKey"` CustomInformation string `json:"CustomInformation"` @@ -161,7 +161,7 @@ func (table *IpAddresses) RemoveDuplicates() error { } } - if table.IpAddress[i].NAT == "True" && table.IpAddress[i].EscapeImplementation == "None" { + if table.IpAddress[i].NAT && table.IpAddress[i].EscapeImplementation == "None" { Exists = true } diff --git a/p2p/speedtest.go b/p2p/speedtest.go index 0468b07..e6b80e9 100644 --- a/p2p/speedtest.go +++ b/p2p/speedtest.go @@ -95,7 +95,7 @@ func (ip *IpAddresses) SpeedTestUpdatedIPTable() error { } // Checks if both the IPV4 addresses are the same or the IPV6 address is not // an empty string and IPV6 address are the same - if (ip.IpAddress[k].Ipv4 == targets.IpAddress[i].Ipv4 && targets.IpAddress[i].NAT == "True") || (targets.IpAddress[i].Ipv6 != "" && ip.IpAddress[k].Ipv6 == targets.IpAddress[i].Ipv6) { + if (ip.IpAddress[k].Ipv4 == targets.IpAddress[i].Ipv4 && targets.IpAddress[i].NAT) || (targets.IpAddress[i].Ipv6 != "" && ip.IpAddress[k].Ipv6 == targets.IpAddress[i].Ipv6) { Exists = true break } diff --git a/server/server.go b/server/server.go index 8086d67..0e3ec1c 100644 --- a/server/server.go +++ b/server/server.go @@ -255,7 +255,7 @@ func Server() (*gin.Engine, error) { // TODO check if IPV6 or Proxy port is specified // if not update current entry as proxy address // with appropriate port on IP Table - if config.BehindNAT == "True" { + if config.BehindNAT { if err != nil { return nil, err } @@ -267,7 +267,7 @@ func Server() (*gin.Engine, error) { for i, _ := range table.IpAddress { // Checks if the ping is the lowest and if the following node is acting as a proxy //if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && table.IpAddress[i].ProxyPort != "" { - if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && table.IpAddress[i].NAT != "" { + if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && !table.IpAddress[i].NAT { lowestLatency = table.IpAddress[i].Latency.Milliseconds() lowestLatencyIpAddress = table.IpAddress[i] } @@ -291,8 +291,8 @@ func Server() (*gin.Engine, error) { ProxyIpAddr.Ipv4 = lowestLatencyIpAddress.Ipv4 ProxyIpAddr.ServerPort = proxyPort ProxyIpAddr.Name = config.MachineName - ProxyIpAddr.NAT = "False" - ProxyIpAddr.ProxyServer = "False" + ProxyIpAddr.NAT = false + ProxyIpAddr.ProxyServer = false ProxyIpAddr.EscapeImplementation = "FRP" if config.BareMetal { @@ -314,9 +314,9 @@ func Server() (*gin.Engine, error) { } ProxyIpAddr.ServerPort = config.ServerPort ProxyIpAddr.Name = config.MachineName - ProxyIpAddr.NAT = "False" + ProxyIpAddr.NAT = false if config.ProxyPort != "" { - ProxyIpAddr.ProxyServer = "True" + ProxyIpAddr.ProxyServer = true } ProxyIpAddr.EscapeImplementation = "" if config.BareMetal { @@ -425,9 +425,9 @@ func MapPort(port string, domainName string) (string, string, error) { for i, _ := range table.IpAddress { // Checks if the ping is the lowest and if the following node is acting as a proxy //if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && table.IpAddress[i].ProxyPort != "" { - if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && table.IpAddress[i].NAT != "" { + if table.IpAddress[i].Latency.Milliseconds() < lowestLatency && !table.IpAddress[i].NAT { // Filter based on nodes with proxy enabled - if domainName != "" && table.IpAddress[i].ProxyServer == "True" { + if domainName != "" && table.IpAddress[i].ProxyServer { lowestLatency = table.IpAddress[i].Latency.Milliseconds() lowestLatencyIpAddress = table.IpAddress[i] continue @@ -466,7 +466,7 @@ func MapPort(port string, domainName string) (string, string, error) { ProxyIpAddr.Ipv4 = lowestLatencyIpAddress.Ipv4 ProxyIpAddr.ServerPort = proxyPort ProxyIpAddr.Name = config.MachineName - ProxyIpAddr.NAT = "False" + ProxyIpAddr.NAT = false ProxyIpAddr.EscapeImplementation = "FRP" //ProxyIpAddr.CustomInformationKey = p2p.GenerateHashSHA256(config.IPTableKey)