From 6863b1386b59f53ea63671a42e9cf60b11be56fe Mon Sep 17 00:00:00 2001 From: Akilan Date: Sun, 19 Jan 2025 01:02:45 +0000 Subject: [PATCH] converted entire docs to org mode --- Docs/.gitignore | 73 ++ Docs/{ => DocsDeprecated}/Abstractions.md | 0 Docs/{ => DocsDeprecated}/Abstractions.org | 0 Docs/{ => DocsDeprecated}/Bindings.md | 0 Docs/{ => DocsDeprecated}/Bindings.org | 0 .../{ => DocsDeprecated}/CliImplementation.md | 0 .../CliImplementation.org | 0 Docs/{ => DocsDeprecated}/Client.md | 0 Docs/{ => DocsDeprecated}/Client.org | 0 .../ClientArchitecture.md | 0 .../ClientArchitecture.org | 0 .../ClientImplementation.md | 0 .../ClientImplementation.org | 0 .../ConfigImplementation.md | 0 .../ConfigImplementation.org | 0 .../DesignArchtectureIntro.md | 0 .../DesignArchtectureIntro.org | 0 .../DomainNameMappingsImplementation.md | 0 .../DomainNameMappingsImplementation.org | 0 Docs/{ => DocsDeprecated}/Implementation.md | 0 Docs/{ => DocsDeprecated}/Implementation.org | 0 Docs/{ => DocsDeprecated}/Installation.md | 0 Docs/{ => DocsDeprecated}/Installation.org | 0 Docs/{ => DocsDeprecated}/Introduction.md | 0 Docs/{ => DocsDeprecated}/Introduction.org | 0 Docs/{ => DocsDeprecated}/NAT-Traveral.md | 0 Docs/{ => DocsDeprecated}/NAT-Traveral.org | 0 Docs/{ => DocsDeprecated}/P2P-testing.md | 0 Docs/{ => DocsDeprecated}/P2P-testing.org | 0 Docs/{ => DocsDeprecated}/P2P.md | 0 Docs/{ => DocsDeprecated}/P2P.org | 0 Docs/{ => DocsDeprecated}/P2PArchitecture.md | 0 Docs/{ => DocsDeprecated}/P2PArchitecture.org | 0 .../{ => DocsDeprecated}/P2PImplementation.md | 0 .../P2PImplementation.org | 0 .../PluginImplementation.md | 0 .../PluginImplementation.org | 0 README.md => Docs/DocsDeprecated/README.md | 0 Docs/{ => DocsDeprecated}/README.org | 0 .../ServerArchitecture.md | 0 .../ServerArchitecture.md.org | 0 .../ServerImplementation.md | 0 .../ServerImplementation.md.org | 0 Docs/{ => DocsDeprecated}/Virtualization | 0 Docs/DocsDeprecated/docs.org | 800 ++++++++++++++++++ Docs/README.md | 21 - Docs/docs.org | 800 ++++++++++++++++++ README.md.pdf | Bin 0 -> 148458 bytes README.md.tex | 202 +++++ README.md.org => README.org | 64 +- 50 files changed, 1886 insertions(+), 74 deletions(-) create mode 100644 Docs/.gitignore rename Docs/{ => DocsDeprecated}/Abstractions.md (100%) rename Docs/{ => DocsDeprecated}/Abstractions.org (100%) rename Docs/{ => DocsDeprecated}/Bindings.md (100%) rename Docs/{ => DocsDeprecated}/Bindings.org (100%) rename Docs/{ => DocsDeprecated}/CliImplementation.md (100%) rename Docs/{ => DocsDeprecated}/CliImplementation.org (100%) rename Docs/{ => DocsDeprecated}/Client.md (100%) rename Docs/{ => DocsDeprecated}/Client.org (100%) rename Docs/{ => DocsDeprecated}/ClientArchitecture.md (100%) rename Docs/{ => DocsDeprecated}/ClientArchitecture.org (100%) rename Docs/{ => DocsDeprecated}/ClientImplementation.md (100%) rename Docs/{ => DocsDeprecated}/ClientImplementation.org (100%) rename Docs/{ => DocsDeprecated}/ConfigImplementation.md (100%) rename Docs/{ => DocsDeprecated}/ConfigImplementation.org (100%) rename Docs/{ => DocsDeprecated}/DesignArchtectureIntro.md (100%) rename Docs/{ => DocsDeprecated}/DesignArchtectureIntro.org (100%) rename Docs/{ => DocsDeprecated}/DomainNameMappingsImplementation.md (100%) rename Docs/{ => DocsDeprecated}/DomainNameMappingsImplementation.org (100%) rename Docs/{ => DocsDeprecated}/Implementation.md (100%) rename Docs/{ => DocsDeprecated}/Implementation.org (100%) rename Docs/{ => DocsDeprecated}/Installation.md (100%) rename Docs/{ => DocsDeprecated}/Installation.org (100%) rename Docs/{ => DocsDeprecated}/Introduction.md (100%) rename Docs/{ => DocsDeprecated}/Introduction.org (100%) rename Docs/{ => DocsDeprecated}/NAT-Traveral.md (100%) rename Docs/{ => DocsDeprecated}/NAT-Traveral.org (100%) rename Docs/{ => DocsDeprecated}/P2P-testing.md (100%) rename Docs/{ => DocsDeprecated}/P2P-testing.org (100%) rename Docs/{ => DocsDeprecated}/P2P.md (100%) rename Docs/{ => DocsDeprecated}/P2P.org (100%) rename Docs/{ => DocsDeprecated}/P2PArchitecture.md (100%) rename Docs/{ => DocsDeprecated}/P2PArchitecture.org (100%) rename Docs/{ => DocsDeprecated}/P2PImplementation.md (100%) rename Docs/{ => DocsDeprecated}/P2PImplementation.org (100%) rename Docs/{ => DocsDeprecated}/PluginImplementation.md (100%) rename Docs/{ => DocsDeprecated}/PluginImplementation.org (100%) rename README.md => Docs/DocsDeprecated/README.md (100%) rename Docs/{ => DocsDeprecated}/README.org (100%) rename Docs/{ => DocsDeprecated}/ServerArchitecture.md (100%) rename Docs/{ => DocsDeprecated}/ServerArchitecture.md.org (100%) rename Docs/{ => DocsDeprecated}/ServerImplementation.md (100%) rename Docs/{ => DocsDeprecated}/ServerImplementation.md.org (100%) rename Docs/{ => DocsDeprecated}/Virtualization (100%) create mode 100644 Docs/DocsDeprecated/docs.org delete mode 100644 Docs/README.md create mode 100644 Docs/docs.org create mode 100644 README.md.pdf create mode 100644 README.md.tex rename README.md.org => README.org (71%) diff --git a/Docs/.gitignore b/Docs/.gitignore new file mode 100644 index 0000000..e70658e --- /dev/null +++ b/Docs/.gitignore @@ -0,0 +1,73 @@ +# Don't bother tracking a bunch of stuff when building and installing +# Org from the master git repository. + +# ...by ignoring everything created by 'make', 'make doc', `make info' +# `make html_manual', `make release' + +*.aux +*.bak +*.cp +*.cps +*.diff +*.dvi +*.elc +*.fn +*.fns +*.html +*.info +*.ky +*.kys +*.log +*.patch +*.pdf +*.pg +*.pgs +*.ps +*.toc +*.tex +*.tp +*.vr +*.vrs +orgcard_letter.tex +orgcard.txt +org +org-loaddefs.el +org-version.el +doc/org-version.inc +org-*.tar* +orgplus-*.tar* +org-*.zip +version.mk +manual +org_dual_license.texi +ORGWEBPAGE/Changes.txt +local*.mk +.gitattributes +mk/x11idle + +# texi2pdf --tidy + +doc/*.t2d + +# aspell word and replacement lists +.aspell.org.pws +.aspell.org.prepl + +# allow tmp and test directories that will not be tracked + +test +t +auto +tmp +TODO + +# and collateral damage from Emacs + +*~ +.DS_Store +*# +.#* + +# +# Local variables: +# End: diff --git a/Docs/Abstractions.md b/Docs/DocsDeprecated/Abstractions.md similarity index 100% rename from Docs/Abstractions.md rename to Docs/DocsDeprecated/Abstractions.md diff --git a/Docs/Abstractions.org b/Docs/DocsDeprecated/Abstractions.org similarity index 100% rename from Docs/Abstractions.org rename to Docs/DocsDeprecated/Abstractions.org diff --git a/Docs/Bindings.md b/Docs/DocsDeprecated/Bindings.md similarity index 100% rename from Docs/Bindings.md rename to Docs/DocsDeprecated/Bindings.md diff --git a/Docs/Bindings.org b/Docs/DocsDeprecated/Bindings.org similarity index 100% rename from Docs/Bindings.org rename to Docs/DocsDeprecated/Bindings.org diff --git a/Docs/CliImplementation.md b/Docs/DocsDeprecated/CliImplementation.md similarity index 100% rename from Docs/CliImplementation.md rename to Docs/DocsDeprecated/CliImplementation.md diff --git a/Docs/CliImplementation.org b/Docs/DocsDeprecated/CliImplementation.org similarity index 100% rename from Docs/CliImplementation.org rename to Docs/DocsDeprecated/CliImplementation.org diff --git a/Docs/Client.md b/Docs/DocsDeprecated/Client.md similarity index 100% rename from Docs/Client.md rename to Docs/DocsDeprecated/Client.md diff --git a/Docs/Client.org b/Docs/DocsDeprecated/Client.org similarity index 100% rename from Docs/Client.org rename to Docs/DocsDeprecated/Client.org diff --git a/Docs/ClientArchitecture.md b/Docs/DocsDeprecated/ClientArchitecture.md similarity index 100% rename from Docs/ClientArchitecture.md rename to Docs/DocsDeprecated/ClientArchitecture.md diff --git a/Docs/ClientArchitecture.org b/Docs/DocsDeprecated/ClientArchitecture.org similarity index 100% rename from Docs/ClientArchitecture.org rename to Docs/DocsDeprecated/ClientArchitecture.org diff --git a/Docs/ClientImplementation.md b/Docs/DocsDeprecated/ClientImplementation.md similarity index 100% rename from Docs/ClientImplementation.md rename to Docs/DocsDeprecated/ClientImplementation.md diff --git a/Docs/ClientImplementation.org b/Docs/DocsDeprecated/ClientImplementation.org similarity index 100% rename from Docs/ClientImplementation.org rename to Docs/DocsDeprecated/ClientImplementation.org diff --git a/Docs/ConfigImplementation.md b/Docs/DocsDeprecated/ConfigImplementation.md similarity index 100% rename from Docs/ConfigImplementation.md rename to Docs/DocsDeprecated/ConfigImplementation.md diff --git a/Docs/ConfigImplementation.org b/Docs/DocsDeprecated/ConfigImplementation.org similarity index 100% rename from Docs/ConfigImplementation.org rename to Docs/DocsDeprecated/ConfigImplementation.org diff --git a/Docs/DesignArchtectureIntro.md b/Docs/DocsDeprecated/DesignArchtectureIntro.md similarity index 100% rename from Docs/DesignArchtectureIntro.md rename to Docs/DocsDeprecated/DesignArchtectureIntro.md diff --git a/Docs/DesignArchtectureIntro.org b/Docs/DocsDeprecated/DesignArchtectureIntro.org similarity index 100% rename from Docs/DesignArchtectureIntro.org rename to Docs/DocsDeprecated/DesignArchtectureIntro.org diff --git a/Docs/DomainNameMappingsImplementation.md b/Docs/DocsDeprecated/DomainNameMappingsImplementation.md similarity index 100% rename from Docs/DomainNameMappingsImplementation.md rename to Docs/DocsDeprecated/DomainNameMappingsImplementation.md diff --git a/Docs/DomainNameMappingsImplementation.org b/Docs/DocsDeprecated/DomainNameMappingsImplementation.org similarity index 100% rename from Docs/DomainNameMappingsImplementation.org rename to Docs/DocsDeprecated/DomainNameMappingsImplementation.org diff --git a/Docs/Implementation.md b/Docs/DocsDeprecated/Implementation.md similarity index 100% rename from Docs/Implementation.md rename to Docs/DocsDeprecated/Implementation.md diff --git a/Docs/Implementation.org b/Docs/DocsDeprecated/Implementation.org similarity index 100% rename from Docs/Implementation.org rename to Docs/DocsDeprecated/Implementation.org diff --git a/Docs/Installation.md b/Docs/DocsDeprecated/Installation.md similarity index 100% rename from Docs/Installation.md rename to Docs/DocsDeprecated/Installation.md diff --git a/Docs/Installation.org b/Docs/DocsDeprecated/Installation.org similarity index 100% rename from Docs/Installation.org rename to Docs/DocsDeprecated/Installation.org diff --git a/Docs/Introduction.md b/Docs/DocsDeprecated/Introduction.md similarity index 100% rename from Docs/Introduction.md rename to Docs/DocsDeprecated/Introduction.md diff --git a/Docs/Introduction.org b/Docs/DocsDeprecated/Introduction.org similarity index 100% rename from Docs/Introduction.org rename to Docs/DocsDeprecated/Introduction.org diff --git a/Docs/NAT-Traveral.md b/Docs/DocsDeprecated/NAT-Traveral.md similarity index 100% rename from Docs/NAT-Traveral.md rename to Docs/DocsDeprecated/NAT-Traveral.md diff --git a/Docs/NAT-Traveral.org b/Docs/DocsDeprecated/NAT-Traveral.org similarity index 100% rename from Docs/NAT-Traveral.org rename to Docs/DocsDeprecated/NAT-Traveral.org diff --git a/Docs/P2P-testing.md b/Docs/DocsDeprecated/P2P-testing.md similarity index 100% rename from Docs/P2P-testing.md rename to Docs/DocsDeprecated/P2P-testing.md diff --git a/Docs/P2P-testing.org b/Docs/DocsDeprecated/P2P-testing.org similarity index 100% rename from Docs/P2P-testing.org rename to Docs/DocsDeprecated/P2P-testing.org diff --git a/Docs/P2P.md b/Docs/DocsDeprecated/P2P.md similarity index 100% rename from Docs/P2P.md rename to Docs/DocsDeprecated/P2P.md diff --git a/Docs/P2P.org b/Docs/DocsDeprecated/P2P.org similarity index 100% rename from Docs/P2P.org rename to Docs/DocsDeprecated/P2P.org diff --git a/Docs/P2PArchitecture.md b/Docs/DocsDeprecated/P2PArchitecture.md similarity index 100% rename from Docs/P2PArchitecture.md rename to Docs/DocsDeprecated/P2PArchitecture.md diff --git a/Docs/P2PArchitecture.org b/Docs/DocsDeprecated/P2PArchitecture.org similarity index 100% rename from Docs/P2PArchitecture.org rename to Docs/DocsDeprecated/P2PArchitecture.org diff --git a/Docs/P2PImplementation.md b/Docs/DocsDeprecated/P2PImplementation.md similarity index 100% rename from Docs/P2PImplementation.md rename to Docs/DocsDeprecated/P2PImplementation.md diff --git a/Docs/P2PImplementation.org b/Docs/DocsDeprecated/P2PImplementation.org similarity index 100% rename from Docs/P2PImplementation.org rename to Docs/DocsDeprecated/P2PImplementation.org diff --git a/Docs/PluginImplementation.md b/Docs/DocsDeprecated/PluginImplementation.md similarity index 100% rename from Docs/PluginImplementation.md rename to Docs/DocsDeprecated/PluginImplementation.md diff --git a/Docs/PluginImplementation.org b/Docs/DocsDeprecated/PluginImplementation.org similarity index 100% rename from Docs/PluginImplementation.org rename to Docs/DocsDeprecated/PluginImplementation.org diff --git a/README.md b/Docs/DocsDeprecated/README.md similarity index 100% rename from README.md rename to Docs/DocsDeprecated/README.md diff --git a/Docs/README.org b/Docs/DocsDeprecated/README.org similarity index 100% rename from Docs/README.org rename to Docs/DocsDeprecated/README.org diff --git a/Docs/ServerArchitecture.md b/Docs/DocsDeprecated/ServerArchitecture.md similarity index 100% rename from Docs/ServerArchitecture.md rename to Docs/DocsDeprecated/ServerArchitecture.md diff --git a/Docs/ServerArchitecture.md.org b/Docs/DocsDeprecated/ServerArchitecture.md.org similarity index 100% rename from Docs/ServerArchitecture.md.org rename to Docs/DocsDeprecated/ServerArchitecture.md.org diff --git a/Docs/ServerImplementation.md b/Docs/DocsDeprecated/ServerImplementation.md similarity index 100% rename from Docs/ServerImplementation.md rename to Docs/DocsDeprecated/ServerImplementation.md diff --git a/Docs/ServerImplementation.md.org b/Docs/DocsDeprecated/ServerImplementation.md.org similarity index 100% rename from Docs/ServerImplementation.md.org rename to Docs/DocsDeprecated/ServerImplementation.md.org diff --git a/Docs/Virtualization b/Docs/DocsDeprecated/Virtualization similarity index 100% rename from Docs/Virtualization rename to Docs/DocsDeprecated/Virtualization diff --git a/Docs/DocsDeprecated/docs.org b/Docs/DocsDeprecated/docs.org new file mode 100644 index 0000000..47b2386 --- /dev/null +++ b/Docs/DocsDeprecated/docs.org @@ -0,0 +1,800 @@ +yes* Chapter 1: Introduction +:PROPERTIES: +:CUSTOM_ID: chapter-1-introduction +:END: + +** Abstract +:PROPERTIES: +:CUSTOM_ID: abstract +:END: +This project focuses on creating a framework on running heavy tasks that +a regular computer cannot run easily such as graphically demanding video +games, rendering 3D animations , protein folding simulations. In this +project the major focus will not be on the financial incentive part. A +peer to peer network will be created to help run tasks decentrally, +increasing bandwidth for running tasks. To ensure the tasks in the peer +to peer network do not corrupt the server 0S (Operating System), they +will be executed in a virtual environment in the server. + +The main aim of this project was to create a custom peer to peer +network. The user acting as the client has total flexibility on how to +batch the tasks and the user acting as the server has complete +flexibility on tracking the container's usages and killing the +containers at any point of time. + +** Motivation +:PROPERTIES: +:CUSTOM_ID: motivation +:END: +Many of the users rely on our PC / Laptop or servers that belong to a +server farm to run heavy tasks and with the demand of high creativity +requires higher computing power. Buying a powerful computer every few +years to run a bunch of heavy tasks which are not executed as frequently +to reap the benefits can be inefficient utilization of hardware. On the +other end, renting servers to run these heavy tasks can be really +useful. Ethically speaking this is leading to monopolisation of +computing power similar to what is happening in the web server area. By +using peer to peer principles it is possible to remove the +monopolisation factor and increase the bandwidth between the client and +server. + +* Installation +:PROPERTIES: +:CUSTOM_ID: installation +:END: + +Over here we will cover the basic steps to get the server and client +side running. + +** Latest release install +:PROPERTIES: +:CUSTOM_ID: latest-release-install +:END: +https://github.com/Akilan1999/p2p-rendering-computation/releases + +** Install from Github master branch +:PROPERTIES: +:CUSTOM_ID: install-from-github-master-branch +:END: +*** Install Go lang +:PROPERTIES: +:CUSTOM_ID: install-go-lang +:END: +The entire the implementation of this project is done using Go lang. +Thus, we need go lang to compile to code to a binary file. +[[https://golang.org/doc/install][Instructions to install Go lang]] + +*** Install Docker +:PROPERTIES: +:CUSTOM_ID: install-docker +:END: +In this project the choice of virtualization is Docker due to it's wide +usage in the developer community. In the server module we use the Docker +Go API to create and interact with the containers. + +[[https://docs.docker.com/get-docker/][Instructions to install docker]] + +[[https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker][Instructions +to install docker GPU]] + +#+begin_example +// Do ensure that the docker command does not need sudo to run +sudo chmod 666 /var/run/docker.sock +#+end_example + +*** Build Project and install project +:PROPERTIES: +:CUSTOM_ID: build-project-and-install-project +:END: +To set up the internal dependencies and build the entire go code into a +single binary + +#+begin_example +make install +#+end_example + +**** For Windows +:PROPERTIES: +:CUSTOM_ID: for-windows +:END: +To set up P2PRC on Windows, simply run this batch file. *Make sure you +are not in admin mode when running this.* + +#+begin_example +.\install.bat +#+end_example + +*** Add appropriate paths to =.bashrc= +:PROPERTIES: +:CUSTOM_ID: add-appropriate-paths-to-.bashrc +:END: +#+begin_example +export P2PRC=//p2p-rendering-computation +export PATH=//p2p-rendering-computation:${PATH} +#+end_example + +*** Set up configuration file +:PROPERTIES: +:CUSTOM_ID: set-up-configuration-file +:END: +#+begin_example +make configfile +#+end_example + +Open the config file =config.json= and add the IPv6 address if you have +one. + +*** Test if binary works +:PROPERTIES: +:CUSTOM_ID: test-if-binary-works +:END: +#+begin_example +p2prc --help +#+end_example + +**** Output: +:PROPERTIES: +:CUSTOM_ID: output +:END: +#+begin_example +NAME: + p2p-rendering-computation - p2p cli application to create and access VMs in other servers + +USAGE: + p2prc [global options] command [command options] [arguments...] + +VERSION: + + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --Server, -s Starts server (default: false) [$SERVER] + --UpdateServerList, --us Update List of Server available based on servers iptables (default: false) [$UPDATE_SERVER_LIST] + --ListServers, --ls List servers which can render tasks (default: false) [$LIST_SERVERS] + --AddServer value, --as value Adds server IP address to iptables [$ADD_SERVER] + --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] + --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] + --ID value, --id value Docker Container ID [$ID] + --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] + --Specification value, --specs value Specs of the server node [$SPECS] + --SetDefaultConfig, --dc Sets a default configuration file (default: false) [$SET_DEFAULT_CONFIG] + --NetworkInterfaces, --ni Shows the network interface in your computer (default: false) [$NETWORK_INTERFACE] + --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] + --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) + --version, -v print the version (default: false) +#+end_example + +-------------- + +* Using basic commands +:PROPERTIES: +:CUSTOM_ID: using-basic-commands +:END: +*** Start as a server +:PROPERTIES: +:CUSTOM_ID: start-as-a-server +:END: +Do ensure you have Docker installed for this + +#+begin_example +p2prc -s +#+end_example + +*** View server Specification +:PROPERTIES: +:CUSTOM_ID: view-server-specification +:END: +#+begin_example +p2prc --specs= +#+end_example + +*** Run container +:PROPERTIES: +:CUSTOM_ID: run-container +:END: +use the =--gpu= if you know the other machine has a gpu. + +#+begin_example +p2prc --touch= -p --gpu +#+end_example + +*** Remove container +:PROPERTIES: +:CUSTOM_ID: remove-container +:END: +The docker id is present in the output where you create a container + +#+begin_example +p2prc --rm= --id= +#+end_example + +*** Adding servers to ip table +:PROPERTIES: +:CUSTOM_ID: adding-servers-to-ip-table +:END: +#+begin_example +p2prc --as= +#+end_example + +*** Update ip table +:PROPERTIES: +:CUSTOM_ID: update-ip-table +:END: +#+begin_example +p2prc --us +#+end_example + +*** List Servers +:PROPERTIES: +:CUSTOM_ID: list-servers +:END: +#+begin_example +p2prc --ls +#+end_example + +*** View Network interfaces +:PROPERTIES: +:CUSTOM_ID: view-network-interfaces +:END: +#+begin_example +p2prc --ni +#+end_example + +*** Viewing Containers created Client side +:PROPERTIES: +:CUSTOM_ID: viewing-containers-created-client-side +:END: +#+begin_example +p2prc --tc +#+end_example + +[[file:ClientImplementation.md#tracking-containers][read more on +tracking containers]] + +*** Running plugin +:PROPERTIES: +:CUSTOM_ID: running-plugin +:END: +#+begin_example +p2prc --plugin --id +#+end_example + +*** Create group +:PROPERTIES: +:CUSTOM_ID: create-group +:END: +#+begin_example +p2prc --cgroup +#+end_example + +*** Add container to group +:PROPERTIES: +:CUSTOM_ID: add-container-to-group +:END: +#+begin_example +p2prc --group --id +#+end_example + +*** View groups +:PROPERTIES: +:CUSTOM_ID: view-groups +:END: +#+begin_example +p2prc --groups +#+end_example + +*** View specific group +:PROPERTIES: +:CUSTOM_ID: view-specific-group +:END: +#+begin_example +p2prc --group +#+end_example + +*** Delete container from group +:PROPERTIES: +:CUSTOM_ID: delete-container-from-group +:END: +#+begin_example +p2prc --rmcgroup --group --id +#+end_example + +*** Delete entire group +:PROPERTIES: +:CUSTOM_ID: delete-entire-group +:END: +#+begin_example +p2prc --rmgroup +#+end_example + +[[file:ClientImplementation.md#Grouping-Containers][read more on +grouping containers]] ### Extending usecase of P2PRC (Requires a go +compiler to run) + +#+begin_example +p2prc --gen --mod +#+end_example + +[[file:GenerateImplementation.md][read more about the generate module]] + +*** Pulling plugin from a remote repo +:PROPERTIES: +:CUSTOM_ID: pulling-plugin-from-a-remote-repo +:END: +#+begin_example +p2prc --pp +#+end_example + +*** Deleting plugin from the plugin directory +:PROPERTIES: +:CUSTOM_ID: deleting-plugin-from-the-plugin-directory +:END: +#+begin_example +p2prc --rp +#+end_example + +*** Added custom metadata about the current node +:PROPERTIES: +:CUSTOM_ID: added-custom-metadata-about-the-current-node +:END: +#+begin_example +p2prc --amd "custom metadata" +#+end_example + +-------------- + +* Using Plugins +:PROPERTIES: +:CUSTOM_ID: using-plugins +:END: +This feature is still Under Development: +[[file:PluginImplementation.md][Read more on the implementation]] + +**** Dependencies +:PROPERTIES: +:CUSTOM_ID: dependencies +:END: +- Ansible: + - Debian/ubuntu: =sudo apt install ansible= + - Others: + [[https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/install/][Installation + link]] + +**** Run Test Cases +:PROPERTIES: +:CUSTOM_ID: run-test-cases +:END: +- Generate Test Case Ansible file + - =make testcases= +- Enter inside plugin directory and run tests. + +#+begin_quote +[!NOTE] That docker needs to installed and needs to run without sudo. +Refer the section [[#install-docker][Install Docker]]. - =cd plugin= - +=go test .= + +#+end_quote + +* P2P Module Implementation +:PROPERTIES: +:CUSTOM_ID: p2p-module-implementation +:END: +The P2P module (i.e Peer to Peer Module) is responsible for storing the +IP table and interacting with the IP table. In the following +implementation of the P2P module ,the IP table stores information about +servers available in the network. The other functionality the P2P module +takes care of is doing the appropriate speed tests to the servers in the +IP table. This is for informing the users about nodes which are close by +and nodes which have quicker uploads and downloads speeds. The module is +responsible to ensure that there are no duplicate server IPs in the IP +table and to remove all server IPs which are not pingable. + +#+caption: UML diagram of P2P module +[[file:images/p2pmoduleArch.png]] + +The peer to peer implementation was built from scratch. This is because +other peer to peer libraries were on the implementation of the +Distributed hash table. At the current moment all those heavy features +are not needed because the objective is to search and list all possible +servers available. The limitation being that to be a part of the network +the user has to know at least 1 server. The advantage of building from +scratch makes the module super light and possibility for custom +functions and structs. The sub topics below will mention the +implementations of each functionality in depth. + +** IP Table +:PROPERTIES: +:CUSTOM_ID: ip-table +:END: +The ip table file is a json as the format with a list of servers ip +addresses, latencies, downloads and uploads speeds. The functions +implemented include read file, write file and remove duplicate IP +addresses. The remove duplicate IP address function exists because +sometimes servers IP tables can have the same ip addresses as what the +client has. The path of the IP table json file is received from the +configuration module. + +#+begin_src json +{ + "ip_address": [ + { + "ipv4": "", + "latency": "", + "download": "", + "upload": "" + "port no": "", + } + ] +} +#+end_src + +*** Latency +:PROPERTIES: +:CUSTOM_ID: latency +:END: +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. + +** NAT Traversal +:PROPERTIES: +:CUSTOM_ID: nat-traversal +:END: +P2PRC currently supports TURN for NAT traversal. + +** TURN +:PROPERTIES: +:CUSTOM_ID: turn +:END: +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 +:PROPERTIES: +:CUSTOM_ID: client-mode +:END: +- Call =/FRPPort= + +#+begin_example +http://:/FRPport +#+end_example + +- Call the TURN server in the following manner. The following is a + sample code snippet below. + +#+begin_src go +import ( + "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" +) + +func main() { + serverPort, err := frp.GetFRPServerPort("http://" + + ":" + 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(, serverPort, ) + if err != nil { + return nil, err + } +} +#+end_src + +* Language Bindings +:PROPERTIES: +:CUSTOM_ID: language-bindings +:END: +[[https://en.wikipedia.org/wiki/Language_binding][Language bindings]] +refers to wrappers to bridge 2 programming languages. This is used in +P2PRC to extend calling P2PRC functions in other programming languages. +Currently this is done by generating =.so= and =.h= from the Go +compiler. + +** How to build shared object files +:PROPERTIES: +:CUSTOM_ID: how-to-build-shared-object-files +:END: +**** The easier way +:PROPERTIES: +:CUSTOM_ID: the-easier-way +:END: +#+begin_src sh +# Run +make sharedObjects +#+end_src + +**** Or the direct way +:PROPERTIES: +:CUSTOM_ID: or-the-direct-way +:END: +#+begin_src sh +# Run +cd Bindings && go build -buildmode=c-shared -o p2prc.so +#+end_src + +**** If successfully built: +:PROPERTIES: +:CUSTOM_ID: if-successfully-built +:END: +#+begin_src sh +# Enter into the Bindings directory +cd Bindings +# List files +ls +# Find files +p2prc.h p2prc.so +#+end_src + +** Workings under the hood +:PROPERTIES: +:CUSTOM_ID: workings-under-the-hood +:END: +Below are a sample set of commands to open the bindings implementation. + +#+begin_example +# run +cd Bindings/ +# list files +ls +# search for file +Client.go +#+end_example + +*** In Client go +:PROPERTIES: +:CUSTOM_ID: in-client-go +:END: +There a few things to notice which are different from your standard Go +programs: + +**** 1. We import "C" which means [[https://pkg.go.dev/cmd/cgo][Cgo]] is required. +:PROPERTIES: +:CUSTOM_ID: we-import-c-which-means-cgo-is-required. +:END: +#+begin_src go +import "C" +#+end_src + +**** 2. All functions which are required to be called from other programming languages have comment such as. +:PROPERTIES: +:CUSTOM_ID: all-functions-which-are-required-to-be-called-from-other-programming-languages-have-comment-such-as. +:END: +#+begin_src go +//export + +// ------------ Example ---------------- +// The function below allows to externally +// to call the P2PRC function to start containers +// in a specific node in the know list of nodes +// in the p2p network. +// Note: the comment "//export StartContainer". + +//export StartContainer +func StartContainer(IP string) (output *C.char) { + container, err := client.StartContainer(IP, 0, false, "", "") + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(container) + } +#+end_src + +**** 3. While looking through the file (If 2 files are compared it is pretty trivial to notice a common structure). +:PROPERTIES: +:CUSTOM_ID: while-looking-through-the-file-if-2-files-are-compared-it-is-pretty-trivial-to-notice-a-common-structure. +:END: +#+begin_src go +// --------- Example ------------ + +//export StartContainer +func StartContainer(IP string) (output *C.char) { + container, err := client.StartContainer(IP, 0, false, "", "") + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(container) +} + +//export ViewPlugin +func ViewPlugin() (output *C.char) { + plugins, err := plugin.DetectPlugins() + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(plugins) +} +#+end_src + +**** It is easy to notice that: +:PROPERTIES: +:CUSTOM_ID: it-is-easy-to-notice-that +:END: +- =ConvertStructToJSONString()=: This is a helper function + that convert a go object to JSON string initially and converts it to + =CString=. +- =(output *C.char)=: This is the return type for most of the functions. + +**** A Pseudo code to refer to the common function implementation shape could be represented as: +:PROPERTIES: +:CUSTOM_ID: a-pseudo-code-to-refer-to-the-common-function-implementation-shape-could-be-represented-as +:END: +#+begin_example +func (output *C.char) { + , := () + if != nil { + return C.CString(.Error()) + } + return ConvertStructToJSONString() +} +#+end_example + +** Current languages supported +:PROPERTIES: +:CUSTOM_ID: current-languages-supported +:END: +- Python + +*** Build sample python program +:PROPERTIES: +:CUSTOM_ID: build-sample-python-program +:END: +The easier way + +#+begin_src sh +# Run +make python +# Expected ouput +Output is in the Directory Bindings/python/export/ +# Run +cd Bindings/python/export/ +# list files +ls +# Expected output +SharedObjects/ p2prc.py +#+end_src + +Above shows a generated folder which consists of a folder called +"SharedObjects/" which consists of =p2prc.so= and =p2prc.h= files. +=p2prc.py= refers to a sample python script calling P2PRC go functions. +To start an any project to extend P2PRC with python, This generated +folder can copied and created as a new git repo for P2PRC extensions +scripted or used a reference point as proof of concept that P2PRC can be +called from other programming languages. + + +* Config Implementation +:PROPERTIES: +:CUSTOM_ID: config-implementation +:END: +The configuration module is responsible to store basic information of +absolute paths of files being called in the Go code. In a full-fledged +Cli the configuration file can be found in the directory /etc/ and from +there points to location such as where the IP table file is located. In +the future implementation the config file will have information such as +number of hops and other parameters to tweak and to improve the +effectiveness of the peer to peer network. The configuration module was +implemented using the library Viper. The Viper library automates +features such as searching in default paths to find out if the +configuration file is present. If the configuration file is not present +in the default paths then it auto generates the configuration file. The +configurations file can be in any format. In this project the +configuration file was generated using JSON format. + +#+begin_src json +{ + "MachineName": "pc-74-120.customer.ask4.lan", + "IPTable": "/Users/akilan/Documents/p2p-rendering-computation/p2p/iptable/ip_table.json", + "DockerContainers": "/Users/akilan/Documents/p2p-rendering-computation/server/docker/containers/", + "DefaultDockerFile": "/Users/akilan/Documents/p2p-rendering-computation/server/docker/containers/docker-ubuntu-sshd/", + "SpeedTestFile": "/Users/akilan/Documents/p2p-rendering-computation/p2p/50.bin", + "IPV6Address": "", + "PluginPath": "/Users/akilan/Documents/p2p-rendering-computation/plugin/deploy", + "TrackContainersPath": "/Users/akilan/Documents/p2p-rendering-computation/client/trackcontainers/trackcontainers.json", + "ServerPort": "8088", + "GroupTrackContainersPath": "/Users/akilan/Documents/p2p-rendering-computation/client/trackcontainers/grouptrackcontainers.json", + "FRPServerPort": "True", + "BehindNAT": "True", + "CustomConfig": null +} +#+end_src + +* Abstractions +:PROPERTIES: +:CUSTOM_ID: abstractions +:END: + +The Abstractions package consists of black-boxed functions for P2PRC. + +** Functions +:PROPERTIES: +:CUSTOM_ID: functions +:END: +- =Init()=: 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. +- =MapPort()=: On the local machine the port you want to export + to world. +- =StartContainer()=: The machine on the p2p network where + you want to spin up a docker container. +- =RemoveContainer(,)=: Terminate container + based on the IP address and container name. +- =GetSpecs()=: Get specs of a machine on the network based + on the IP address. +- =ViewIPTable()=: View the IP table which about nodes in the network. +- =UpdateIPTable()=: Force update IP table to learn about new nodes + faster. + +* NAT Traversal +:PROPERTIES: +:CUSTOM_ID: nat-traversal +:END: +P2PRC currently supports TURN for NAT traversal. + +** TURN +:PROPERTIES: +:CUSTOM_ID: turn +:END: +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 +:PROPERTIES: +:CUSTOM_ID: client-mode +:END: +- Call =/FRPPort= + +#+begin_example +http://:/FRPport +#+end_example + +- Call the TURN server in the following manner. The following is a + sample code snippet below. + +#+begin_src go +import ( + "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" +) + +func main() { + serverPort, err := frp.GetFRPServerPort("http://" + + ":" + 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(, serverPort, ) + if err != nil { + return nil, err + } +} +#+end_src diff --git a/Docs/README.md b/Docs/README.md deleted file mode 100644 index 9c85313..0000000 --- a/Docs/README.md +++ /dev/null @@ -1,21 +0,0 @@ - -# Table of contents -1. [Introduction](Introduction.md) -2. [Installation](Installation.md) -3. [Abstractions](Abstractions.md) - -4. [Implementation](Implementation.md) - 1. [Client Module](ClientImplementation.md) - 2. [P2P Module](P2PImplementation.md) - 3. [Server Module](ServerImplementation.md) - 4. [Config Module](ConfigImplementation.md) - 5. [Cli Module](CliImplementation.md) - 6. [Plugin Module](PluginImplementation.md) - 7. [Language bindings](Bindings.md) - 8. [Domain name mappings](Bindings.md) -5. Language bindings - 1. [Haskell](haskell/) - diff --git a/Docs/docs.org b/Docs/docs.org new file mode 100644 index 0000000..47b2386 --- /dev/null +++ b/Docs/docs.org @@ -0,0 +1,800 @@ +yes* Chapter 1: Introduction +:PROPERTIES: +:CUSTOM_ID: chapter-1-introduction +:END: + +** Abstract +:PROPERTIES: +:CUSTOM_ID: abstract +:END: +This project focuses on creating a framework on running heavy tasks that +a regular computer cannot run easily such as graphically demanding video +games, rendering 3D animations , protein folding simulations. In this +project the major focus will not be on the financial incentive part. A +peer to peer network will be created to help run tasks decentrally, +increasing bandwidth for running tasks. To ensure the tasks in the peer +to peer network do not corrupt the server 0S (Operating System), they +will be executed in a virtual environment in the server. + +The main aim of this project was to create a custom peer to peer +network. The user acting as the client has total flexibility on how to +batch the tasks and the user acting as the server has complete +flexibility on tracking the container's usages and killing the +containers at any point of time. + +** Motivation +:PROPERTIES: +:CUSTOM_ID: motivation +:END: +Many of the users rely on our PC / Laptop or servers that belong to a +server farm to run heavy tasks and with the demand of high creativity +requires higher computing power. Buying a powerful computer every few +years to run a bunch of heavy tasks which are not executed as frequently +to reap the benefits can be inefficient utilization of hardware. On the +other end, renting servers to run these heavy tasks can be really +useful. Ethically speaking this is leading to monopolisation of +computing power similar to what is happening in the web server area. By +using peer to peer principles it is possible to remove the +monopolisation factor and increase the bandwidth between the client and +server. + +* Installation +:PROPERTIES: +:CUSTOM_ID: installation +:END: + +Over here we will cover the basic steps to get the server and client +side running. + +** Latest release install +:PROPERTIES: +:CUSTOM_ID: latest-release-install +:END: +https://github.com/Akilan1999/p2p-rendering-computation/releases + +** Install from Github master branch +:PROPERTIES: +:CUSTOM_ID: install-from-github-master-branch +:END: +*** Install Go lang +:PROPERTIES: +:CUSTOM_ID: install-go-lang +:END: +The entire the implementation of this project is done using Go lang. +Thus, we need go lang to compile to code to a binary file. +[[https://golang.org/doc/install][Instructions to install Go lang]] + +*** Install Docker +:PROPERTIES: +:CUSTOM_ID: install-docker +:END: +In this project the choice of virtualization is Docker due to it's wide +usage in the developer community. In the server module we use the Docker +Go API to create and interact with the containers. + +[[https://docs.docker.com/get-docker/][Instructions to install docker]] + +[[https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker][Instructions +to install docker GPU]] + +#+begin_example +// Do ensure that the docker command does not need sudo to run +sudo chmod 666 /var/run/docker.sock +#+end_example + +*** Build Project and install project +:PROPERTIES: +:CUSTOM_ID: build-project-and-install-project +:END: +To set up the internal dependencies and build the entire go code into a +single binary + +#+begin_example +make install +#+end_example + +**** For Windows +:PROPERTIES: +:CUSTOM_ID: for-windows +:END: +To set up P2PRC on Windows, simply run this batch file. *Make sure you +are not in admin mode when running this.* + +#+begin_example +.\install.bat +#+end_example + +*** Add appropriate paths to =.bashrc= +:PROPERTIES: +:CUSTOM_ID: add-appropriate-paths-to-.bashrc +:END: +#+begin_example +export P2PRC=//p2p-rendering-computation +export PATH=//p2p-rendering-computation:${PATH} +#+end_example + +*** Set up configuration file +:PROPERTIES: +:CUSTOM_ID: set-up-configuration-file +:END: +#+begin_example +make configfile +#+end_example + +Open the config file =config.json= and add the IPv6 address if you have +one. + +*** Test if binary works +:PROPERTIES: +:CUSTOM_ID: test-if-binary-works +:END: +#+begin_example +p2prc --help +#+end_example + +**** Output: +:PROPERTIES: +:CUSTOM_ID: output +:END: +#+begin_example +NAME: + p2p-rendering-computation - p2p cli application to create and access VMs in other servers + +USAGE: + p2prc [global options] command [command options] [arguments...] + +VERSION: + + +COMMANDS: + help, h Shows a list of commands or help for one command + +GLOBAL OPTIONS: + --Server, -s Starts server (default: false) [$SERVER] + --UpdateServerList, --us Update List of Server available based on servers iptables (default: false) [$UPDATE_SERVER_LIST] + --ListServers, --ls List servers which can render tasks (default: false) [$LIST_SERVERS] + --AddServer value, --as value Adds server IP address to iptables [$ADD_SERVER] + --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] + --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] + --ID value, --id value Docker Container ID [$ID] + --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] + --Specification value, --specs value Specs of the server node [$SPECS] + --SetDefaultConfig, --dc Sets a default configuration file (default: false) [$SET_DEFAULT_CONFIG] + --NetworkInterfaces, --ni Shows the network interface in your computer (default: false) [$NETWORK_INTERFACE] + --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] + --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) + --version, -v print the version (default: false) +#+end_example + +-------------- + +* Using basic commands +:PROPERTIES: +:CUSTOM_ID: using-basic-commands +:END: +*** Start as a server +:PROPERTIES: +:CUSTOM_ID: start-as-a-server +:END: +Do ensure you have Docker installed for this + +#+begin_example +p2prc -s +#+end_example + +*** View server Specification +:PROPERTIES: +:CUSTOM_ID: view-server-specification +:END: +#+begin_example +p2prc --specs= +#+end_example + +*** Run container +:PROPERTIES: +:CUSTOM_ID: run-container +:END: +use the =--gpu= if you know the other machine has a gpu. + +#+begin_example +p2prc --touch= -p --gpu +#+end_example + +*** Remove container +:PROPERTIES: +:CUSTOM_ID: remove-container +:END: +The docker id is present in the output where you create a container + +#+begin_example +p2prc --rm= --id= +#+end_example + +*** Adding servers to ip table +:PROPERTIES: +:CUSTOM_ID: adding-servers-to-ip-table +:END: +#+begin_example +p2prc --as= +#+end_example + +*** Update ip table +:PROPERTIES: +:CUSTOM_ID: update-ip-table +:END: +#+begin_example +p2prc --us +#+end_example + +*** List Servers +:PROPERTIES: +:CUSTOM_ID: list-servers +:END: +#+begin_example +p2prc --ls +#+end_example + +*** View Network interfaces +:PROPERTIES: +:CUSTOM_ID: view-network-interfaces +:END: +#+begin_example +p2prc --ni +#+end_example + +*** Viewing Containers created Client side +:PROPERTIES: +:CUSTOM_ID: viewing-containers-created-client-side +:END: +#+begin_example +p2prc --tc +#+end_example + +[[file:ClientImplementation.md#tracking-containers][read more on +tracking containers]] + +*** Running plugin +:PROPERTIES: +:CUSTOM_ID: running-plugin +:END: +#+begin_example +p2prc --plugin --id +#+end_example + +*** Create group +:PROPERTIES: +:CUSTOM_ID: create-group +:END: +#+begin_example +p2prc --cgroup +#+end_example + +*** Add container to group +:PROPERTIES: +:CUSTOM_ID: add-container-to-group +:END: +#+begin_example +p2prc --group --id +#+end_example + +*** View groups +:PROPERTIES: +:CUSTOM_ID: view-groups +:END: +#+begin_example +p2prc --groups +#+end_example + +*** View specific group +:PROPERTIES: +:CUSTOM_ID: view-specific-group +:END: +#+begin_example +p2prc --group +#+end_example + +*** Delete container from group +:PROPERTIES: +:CUSTOM_ID: delete-container-from-group +:END: +#+begin_example +p2prc --rmcgroup --group --id +#+end_example + +*** Delete entire group +:PROPERTIES: +:CUSTOM_ID: delete-entire-group +:END: +#+begin_example +p2prc --rmgroup +#+end_example + +[[file:ClientImplementation.md#Grouping-Containers][read more on +grouping containers]] ### Extending usecase of P2PRC (Requires a go +compiler to run) + +#+begin_example +p2prc --gen --mod +#+end_example + +[[file:GenerateImplementation.md][read more about the generate module]] + +*** Pulling plugin from a remote repo +:PROPERTIES: +:CUSTOM_ID: pulling-plugin-from-a-remote-repo +:END: +#+begin_example +p2prc --pp +#+end_example + +*** Deleting plugin from the plugin directory +:PROPERTIES: +:CUSTOM_ID: deleting-plugin-from-the-plugin-directory +:END: +#+begin_example +p2prc --rp +#+end_example + +*** Added custom metadata about the current node +:PROPERTIES: +:CUSTOM_ID: added-custom-metadata-about-the-current-node +:END: +#+begin_example +p2prc --amd "custom metadata" +#+end_example + +-------------- + +* Using Plugins +:PROPERTIES: +:CUSTOM_ID: using-plugins +:END: +This feature is still Under Development: +[[file:PluginImplementation.md][Read more on the implementation]] + +**** Dependencies +:PROPERTIES: +:CUSTOM_ID: dependencies +:END: +- Ansible: + - Debian/ubuntu: =sudo apt install ansible= + - Others: + [[https://ansible-tips-and-tricks.readthedocs.io/en/latest/ansible/install/][Installation + link]] + +**** Run Test Cases +:PROPERTIES: +:CUSTOM_ID: run-test-cases +:END: +- Generate Test Case Ansible file + - =make testcases= +- Enter inside plugin directory and run tests. + +#+begin_quote +[!NOTE] That docker needs to installed and needs to run without sudo. +Refer the section [[#install-docker][Install Docker]]. - =cd plugin= - +=go test .= + +#+end_quote + +* P2P Module Implementation +:PROPERTIES: +:CUSTOM_ID: p2p-module-implementation +:END: +The P2P module (i.e Peer to Peer Module) is responsible for storing the +IP table and interacting with the IP table. In the following +implementation of the P2P module ,the IP table stores information about +servers available in the network. The other functionality the P2P module +takes care of is doing the appropriate speed tests to the servers in the +IP table. This is for informing the users about nodes which are close by +and nodes which have quicker uploads and downloads speeds. The module is +responsible to ensure that there are no duplicate server IPs in the IP +table and to remove all server IPs which are not pingable. + +#+caption: UML diagram of P2P module +[[file:images/p2pmoduleArch.png]] + +The peer to peer implementation was built from scratch. This is because +other peer to peer libraries were on the implementation of the +Distributed hash table. At the current moment all those heavy features +are not needed because the objective is to search and list all possible +servers available. The limitation being that to be a part of the network +the user has to know at least 1 server. The advantage of building from +scratch makes the module super light and possibility for custom +functions and structs. The sub topics below will mention the +implementations of each functionality in depth. + +** IP Table +:PROPERTIES: +:CUSTOM_ID: ip-table +:END: +The ip table file is a json as the format with a list of servers ip +addresses, latencies, downloads and uploads speeds. The functions +implemented include read file, write file and remove duplicate IP +addresses. The remove duplicate IP address function exists because +sometimes servers IP tables can have the same ip addresses as what the +client has. The path of the IP table json file is received from the +configuration module. + +#+begin_src json +{ + "ip_address": [ + { + "ipv4": "", + "latency": "", + "download": "", + "upload": "" + "port no": "", + } + ] +} +#+end_src + +*** Latency +:PROPERTIES: +:CUSTOM_ID: latency +:END: +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. + +** NAT Traversal +:PROPERTIES: +:CUSTOM_ID: nat-traversal +:END: +P2PRC currently supports TURN for NAT traversal. + +** TURN +:PROPERTIES: +:CUSTOM_ID: turn +:END: +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 +:PROPERTIES: +:CUSTOM_ID: client-mode +:END: +- Call =/FRPPort= + +#+begin_example +http://:/FRPport +#+end_example + +- Call the TURN server in the following manner. The following is a + sample code snippet below. + +#+begin_src go +import ( + "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" +) + +func main() { + serverPort, err := frp.GetFRPServerPort("http://" + + ":" + 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(, serverPort, ) + if err != nil { + return nil, err + } +} +#+end_src + +* Language Bindings +:PROPERTIES: +:CUSTOM_ID: language-bindings +:END: +[[https://en.wikipedia.org/wiki/Language_binding][Language bindings]] +refers to wrappers to bridge 2 programming languages. This is used in +P2PRC to extend calling P2PRC functions in other programming languages. +Currently this is done by generating =.so= and =.h= from the Go +compiler. + +** How to build shared object files +:PROPERTIES: +:CUSTOM_ID: how-to-build-shared-object-files +:END: +**** The easier way +:PROPERTIES: +:CUSTOM_ID: the-easier-way +:END: +#+begin_src sh +# Run +make sharedObjects +#+end_src + +**** Or the direct way +:PROPERTIES: +:CUSTOM_ID: or-the-direct-way +:END: +#+begin_src sh +# Run +cd Bindings && go build -buildmode=c-shared -o p2prc.so +#+end_src + +**** If successfully built: +:PROPERTIES: +:CUSTOM_ID: if-successfully-built +:END: +#+begin_src sh +# Enter into the Bindings directory +cd Bindings +# List files +ls +# Find files +p2prc.h p2prc.so +#+end_src + +** Workings under the hood +:PROPERTIES: +:CUSTOM_ID: workings-under-the-hood +:END: +Below are a sample set of commands to open the bindings implementation. + +#+begin_example +# run +cd Bindings/ +# list files +ls +# search for file +Client.go +#+end_example + +*** In Client go +:PROPERTIES: +:CUSTOM_ID: in-client-go +:END: +There a few things to notice which are different from your standard Go +programs: + +**** 1. We import "C" which means [[https://pkg.go.dev/cmd/cgo][Cgo]] is required. +:PROPERTIES: +:CUSTOM_ID: we-import-c-which-means-cgo-is-required. +:END: +#+begin_src go +import "C" +#+end_src + +**** 2. All functions which are required to be called from other programming languages have comment such as. +:PROPERTIES: +:CUSTOM_ID: all-functions-which-are-required-to-be-called-from-other-programming-languages-have-comment-such-as. +:END: +#+begin_src go +//export + +// ------------ Example ---------------- +// The function below allows to externally +// to call the P2PRC function to start containers +// in a specific node in the know list of nodes +// in the p2p network. +// Note: the comment "//export StartContainer". + +//export StartContainer +func StartContainer(IP string) (output *C.char) { + container, err := client.StartContainer(IP, 0, false, "", "") + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(container) + } +#+end_src + +**** 3. While looking through the file (If 2 files are compared it is pretty trivial to notice a common structure). +:PROPERTIES: +:CUSTOM_ID: while-looking-through-the-file-if-2-files-are-compared-it-is-pretty-trivial-to-notice-a-common-structure. +:END: +#+begin_src go +// --------- Example ------------ + +//export StartContainer +func StartContainer(IP string) (output *C.char) { + container, err := client.StartContainer(IP, 0, false, "", "") + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(container) +} + +//export ViewPlugin +func ViewPlugin() (output *C.char) { + plugins, err := plugin.DetectPlugins() + if err != nil { + return C.CString(err.Error()) + } + return ConvertStructToJSONString(plugins) +} +#+end_src + +**** It is easy to notice that: +:PROPERTIES: +:CUSTOM_ID: it-is-easy-to-notice-that +:END: +- =ConvertStructToJSONString()=: This is a helper function + that convert a go object to JSON string initially and converts it to + =CString=. +- =(output *C.char)=: This is the return type for most of the functions. + +**** A Pseudo code to refer to the common function implementation shape could be represented as: +:PROPERTIES: +:CUSTOM_ID: a-pseudo-code-to-refer-to-the-common-function-implementation-shape-could-be-represented-as +:END: +#+begin_example +func (output *C.char) { + , := () + if != nil { + return C.CString(.Error()) + } + return ConvertStructToJSONString() +} +#+end_example + +** Current languages supported +:PROPERTIES: +:CUSTOM_ID: current-languages-supported +:END: +- Python + +*** Build sample python program +:PROPERTIES: +:CUSTOM_ID: build-sample-python-program +:END: +The easier way + +#+begin_src sh +# Run +make python +# Expected ouput +Output is in the Directory Bindings/python/export/ +# Run +cd Bindings/python/export/ +# list files +ls +# Expected output +SharedObjects/ p2prc.py +#+end_src + +Above shows a generated folder which consists of a folder called +"SharedObjects/" which consists of =p2prc.so= and =p2prc.h= files. +=p2prc.py= refers to a sample python script calling P2PRC go functions. +To start an any project to extend P2PRC with python, This generated +folder can copied and created as a new git repo for P2PRC extensions +scripted or used a reference point as proof of concept that P2PRC can be +called from other programming languages. + + +* Config Implementation +:PROPERTIES: +:CUSTOM_ID: config-implementation +:END: +The configuration module is responsible to store basic information of +absolute paths of files being called in the Go code. In a full-fledged +Cli the configuration file can be found in the directory /etc/ and from +there points to location such as where the IP table file is located. In +the future implementation the config file will have information such as +number of hops and other parameters to tweak and to improve the +effectiveness of the peer to peer network. The configuration module was +implemented using the library Viper. The Viper library automates +features such as searching in default paths to find out if the +configuration file is present. If the configuration file is not present +in the default paths then it auto generates the configuration file. The +configurations file can be in any format. In this project the +configuration file was generated using JSON format. + +#+begin_src json +{ + "MachineName": "pc-74-120.customer.ask4.lan", + "IPTable": "/Users/akilan/Documents/p2p-rendering-computation/p2p/iptable/ip_table.json", + "DockerContainers": "/Users/akilan/Documents/p2p-rendering-computation/server/docker/containers/", + "DefaultDockerFile": "/Users/akilan/Documents/p2p-rendering-computation/server/docker/containers/docker-ubuntu-sshd/", + "SpeedTestFile": "/Users/akilan/Documents/p2p-rendering-computation/p2p/50.bin", + "IPV6Address": "", + "PluginPath": "/Users/akilan/Documents/p2p-rendering-computation/plugin/deploy", + "TrackContainersPath": "/Users/akilan/Documents/p2p-rendering-computation/client/trackcontainers/trackcontainers.json", + "ServerPort": "8088", + "GroupTrackContainersPath": "/Users/akilan/Documents/p2p-rendering-computation/client/trackcontainers/grouptrackcontainers.json", + "FRPServerPort": "True", + "BehindNAT": "True", + "CustomConfig": null +} +#+end_src + +* Abstractions +:PROPERTIES: +:CUSTOM_ID: abstractions +:END: + +The Abstractions package consists of black-boxed functions for P2PRC. + +** Functions +:PROPERTIES: +:CUSTOM_ID: functions +:END: +- =Init()=: 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. +- =MapPort()=: On the local machine the port you want to export + to world. +- =StartContainer()=: The machine on the p2p network where + you want to spin up a docker container. +- =RemoveContainer(,)=: Terminate container + based on the IP address and container name. +- =GetSpecs()=: Get specs of a machine on the network based + on the IP address. +- =ViewIPTable()=: View the IP table which about nodes in the network. +- =UpdateIPTable()=: Force update IP table to learn about new nodes + faster. + +* NAT Traversal +:PROPERTIES: +:CUSTOM_ID: nat-traversal +:END: +P2PRC currently supports TURN for NAT traversal. + +** TURN +:PROPERTIES: +:CUSTOM_ID: turn +:END: +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 +:PROPERTIES: +:CUSTOM_ID: client-mode +:END: +- Call =/FRPPort= + +#+begin_example +http://:/FRPport +#+end_example + +- Call the TURN server in the following manner. The following is a + sample code snippet below. + +#+begin_src go +import ( + "github.com/Akilan1999/p2p-rendering-computation/p2p/frp" +) + +func main() { + serverPort, err := frp.GetFRPServerPort("http://" + + ":" + 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(, serverPort, ) + if err != nil { + return nil, err + } +} +#+end_src diff --git a/README.md.pdf b/README.md.pdf new file mode 100644 index 0000000000000000000000000000000000000000..52be7cdf20a9140726ceaadcc96be273ede81f94 GIT binary patch literal 148458 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 P&A|dkNhzWD4etK|k^5-3 literal 0 HcmV?d00001 diff --git a/README.md.tex b/README.md.tex new file mode 100644 index 0000000..9f63174 --- /dev/null +++ b/README.md.tex @@ -0,0 +1,202 @@ +% Created 2025-01-19 Sun 00:17 +% Intended LaTeX compiler: pdflatex +\documentclass[11pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{wrapfig} +\usepackage{rotating} +\usepackage[normalem]{ulem} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{capt-of} +\usepackage{hyperref} +\author{Akilan} +\date{\today} +\title{} +\hypersetup{ + pdfauthor={Akilan}, + pdftitle={}, + pdfkeywords={}, + pdfsubject={}, + pdfcreator={Emacs 29.1 (Org mode 9.6.6)}, + pdflang={English}} +\begin{document} + +\tableofcontents + +\begin{center} +\includegraphics[width=.9\linewidth]{/Users/akilan/.cache/org-persist/3a/9e0d0c-d34d-4242-92ac-49f332af6af0-8b003edff282ad2da5830ec63041260a.png} +\end{center}]] + +The main aim of this project was to create a custom peer to peer +network. The user acting as the client has total flexibility on how to +batch the tasks and the user acting as the server has complete +flexibility on tracking the container's usages and killing the +containers at any point of time. + +\subsection{Latest tutorial} +\label{sec:org9129ee1} +\href{https://www.youtube.com/watch?v=OMwCpedu5cs\%22}{\includegraphics[width=.9\linewidth]{/Users/akilan/.cache/org-persist/17/01b895-4c8f-4c97-8b7a-76bde31f87cd-8dfdb3583a175929dac0d44b86acf5b3.jpg}} + +\section{Table of contents in the Docs folder} +\label{sec:org881a67e} +\begin{enumerate} +\item \href{Docs/Introduction.org}{Introduction} +\item \href{Docs/Installation.org}{Installation} +\item \href{Docs/Abstractions.org}{Abstractions} +\item \href{Docs/Implementation.org}{Implementation} +\begin{enumerate} +\item \href{Docs/ClientImplementation.org}{Client Module} +\item \href{Docs/P2PImplementation.org}{P2P Module} +\item \href{Docs/ServerImplementation.org}{Server Module} +\item \href{Docs/ConfigImplementation.org}{Config Module} +\item \href{Docs/CliImplementation.org}{Cli Module} +\item \href{Docs/PluginImplementation.org}{Plugin Module} +\end{enumerate} +\item Language bindings +\begin{enumerate} +\item \href{Docs/haskell/}{Haskell} +\end{enumerate} +\end{enumerate} + +\subsection{Introduction} +\label{sec:org00598fd} +This project aims to create a peer to peer (p2p) network, where a user +can use the p2p network to act as a client (i.e sending tasks) or the +server (i.e executing the tasks). A prototype application will be +developed, which comes bundled with a p2p module and possible to execute +docker containers or virtual environments across selected nodes. + +\subsubsection{Objectives} +\label{sec:org385b937} +\begin{itemize} +\item Background review on peer to peer network, virtual environments, +decentralized rendering tools and tools to batch any sort of tasks. +\item Creating p2p network +\item Server to create a containerised environment +\item The client node to run tasks on Server containerised node +\end{itemize} + +\href{Docs/Introduction.md}{Read more on the introduction} + +\subsection{Extend your application with P2PRC} +\label{sec:orgcab50f2} +\begin{verbatim} +package main + +import ( + "fmt" + "github.com/Akilan1999/p2p-rendering-computation/abstractions" +) + +func main() { + _, err := abstractions.Init(nil) + if err != nil { + fmt.Println(err) + return + } + + // start p2prc + _, err = abstractions.Start() + if err != nil { + fmt.Println(err) + return + } + + // Run server till termination + for { + + } +} +\end{verbatim} + +\subsubsection{Export once this is added export P2PRC as environment paths} +\label{sec:orgd4e7f7c} +\begin{verbatim} +export P2PRC= +export PATH=:${PATH} +\end{verbatim} + +\href{Docs/Abstractions.md}{Read more} \ldots{} + +\subsection{Installation from source} +\label{sec:org6f12be0} +\begin{enumerate} +\item Ensure the Go compiler is installed + +\begin{verbatim} +go version +\end{verbatim} + +\item Ensure docker is installed (Should run without sudo) + +\begin{verbatim} +docker ps +\end{verbatim} + +\item Clone this repository + +\begin{verbatim} +git clone https://github.com/Akilan1999/p2p-rendering-computation +\end{verbatim} + +\item Install and build the project + +\begin{verbatim} +make install +\end{verbatim} + +\item If you look closely you will get outputs such as: +\texttt{// Add them to your .bashrc file export P2PRC=//p2p-rendering-computation export PATH=//p2p-rendering-computation:\$\{PATH\}} + +\setcounter{enumi}{4} +\item Test if it works + +\begin{verbatim} +p2prc -h +\end{verbatim} + +or + +\begin{verbatim} +./p2prc -h +\end{verbatim} + +\href{Docs/Installation.md}{Read more on the installation and +usage} +\end{enumerate} + +\subsection{Design Architecture} +\label{sec:org2e297a7} +The design architecture was inspired and based on the linux kernel +design. The project is segmented into various modules. Each module is +responsible for certain tasks in the project. The modules are highly +dependent on each other hence the entire codebase can be considered as a +huge monolithic chuck which acts as its own library + +\href{Docs/DesignArchtectureIntro.md}{Read more on the Design +Architecture} + +\subsection{Implementation} +\label{sec:orgd4b0943} +The programming language used for this project was Golang. The reason Go +lang was chosen was because it is a compiled language. The entire +codebase is just a single binary file. When distributing to other linux +distributing the only requirement would be the binary file to run the +code. It is easy to write independant modules and be monolithic at the +sametime using Go. Using Go.mod makes it very easy to handle external +libraries and modularise code. The go.mod name for the project is +git.sr.ht/\textasciitilde{}akilan1999/p2p-rendering-computation. + +\href{Docs/Implementation.md}{Read more on the Implementation} + +\subsection{Find out more} +\label{sec:orge8fec0a} +As we are working on the open source project p2prc (i.e p2p network +designed for computation).If you are interested in participating as a +contributor or just providing feedback on new features to build or even +just curious about new features added to the project. We have decided to +create a discord group. +\end{document} \ No newline at end of file diff --git a/README.md.org b/README.org similarity index 71% rename from README.md.org rename to README.org index ef97cb8..34b1188 100644 --- a/README.md.org +++ b/README.org @@ -1,31 +1,4 @@ -#+begin_quote -Haskell bindings supported!: -[[https://p2prc.akilan.io/Docs/haskell/P2PRC.html][Bindings -documentaton]] - -#+end_quote - -#+begin_quote -Fixing documentation to latest changes. If you have any -questions setting up P2PRC either -[[https://github.com/Akilan1999/p2p-rendering-computation/issues/new/choose][create -an issue]] or send me an email (me AT akilan dot io). Currently HEAD is -always intended to stay on a working state. It is recommended to always -use HEAD in your go.mod file. - -#+end_quote - -#+begin_html -

-#+end_html - -#+begin_html -

-#+end_html - -#+begin_html - -#+end_html +https://raw.githubusercontent.com/Akilan1999/p2p-rendering-computation/master/Docs/images/p2prclogo.png]] The main aim of this project was to create a custom peer to peer network. The user acting as the client has total flexibility on how to @@ -39,32 +12,20 @@ containers at any point of time. :END: [[https://www.youtube.com/watch?v=OMwCpedu5cs%22][https://i.ytimg.com/vi/OMwCpedu5cs/hqdefault.jpg]] -** Table of contents in the current README -:PROPERTIES: -:CUSTOM_ID: table-of-contents-in-the-current-readme -:END: -1. [[#Introduction][Introduction]] -2. [[#extend-your-application-with-p2prc][Installation]] -3. [[#Design-Architecture][Design Architecture]] -4. [[#Implementation][Implementation]] -5. [[#Find-out-more][Find out more]] - * Table of contents in the Docs folder :PROPERTIES: :CUSTOM_ID: table-of-contents-in-the-docs-folder :END: -1. [[file:Docs/Introduction.md][Introduction]] -2. [[file:Docs/Installation.md][Installation]] -3. [[file:Docs/Abstractions.md][Abstractions]] -4. [[file:Docs/Implementation.md][Implementation]] - 1. [[file:Docs/ClientImplementation.md][Client Module]] - 2. [[file:Docs/P2PImplementation.md][P2P Module]] - 3. [[file:Docs/ServerImplementation.md][Server Module]] - 4. [[file:Docs/ConfigImplementation.md][Config Module]] - 5. [[file:Docs/CliImplementation.md][Cli Module]] - 6. [[file:Docs/PluginImplementation.md][Plugin Module]] - 7. [[file:Docs/Bindings.md][Language bindings]] - 8. [[file:Docs/Bindings.md][Domain name mappings]] +1. [[file:Docs/Introduction.org][Introduction]] +2. [[file:Docs/Installation.org][Installation]] +3. [[file:Docs/Abstractions.org][Abstractions]] +4. [[file:Docs/Implementation.org][Implementation]] + 1. [[file:Docs/ClientImplementation.org][Client Module]] + 2. [[file:Docs/P2PImplementation.org][P2P Module]] + 3. [[file:Docs/ServerImplementation.org][Server Module]] + 4. [[file:Docs/ConfigImplementation.org][Config Module]] + 5. [[file:Docs/CliImplementation.org][Cli Module]] + 6. [[file:Docs/PluginImplementation.org][Plugin Module]] 5. Language bindings 1. [[file:Docs/haskell/][Haskell]] @@ -217,6 +178,3 @@ designed for computation).If you are interested in participating as a contributor or just providing feedback on new features to build or even just curious about new features added to the project. We have decided to create a discord group. -[[https://discord.gg/b4nRGTjYqy][https://discordapp.com/api/guilds/854397492795277322/widget.png?style=banner2]] - -[[https://github.com/Gaurav-Gosain][https://api.star-history.com/svg?repos=Akilan1999/p2p-rendering-computation&type=Date]]