diff --git a/.github/workflows/publish-docker.yml b/.github/workflows/publish-docker.yml
index 427a2a87..91aae3f2 100644
--- a/.github/workflows/publish-docker.yml
+++ b/.github/workflows/publish-docker.yml
@@ -13,7 +13,8 @@ jobs:
docker:
runs-on: ubuntu-latest
steps:
- - name: Set tag
+ -
+ name: Set tag
run: |
if [[ -n "${{ github.event.inputs.tag }}" ]]; then
TAG=${{ github.event.inputs.tag }}
@@ -23,21 +24,54 @@ jobs:
TAG="${{ github.base_ref }}"
fi
echo "TAG=${TAG}" >> $GITHUB_ENV
- - name: Checkout
+ -
+ name: Checkout
uses: actions/checkout@v2
- - name: Set up QEMU
+ -
+ name: Set up QEMU
uses: docker/setup-qemu-action@v1
- - name: Set up Docker Buildx
+ -
+ name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- - name: Login to DockerHub
+ -
+ name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Build and push latest
+ -
+ name: Build x86 and export to Docker
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ load: true
+ platforms: linux/amd64
+ tags: ${{ env.TAG }}
+ -
+ name: Test x86
+ run: |
+ docker run --rm ${{ env.TAG }}&
+ sleep 10
+ kill %1
+ -
+ name: Build arm and export to Docker
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ load: true
+ platforms: linux/arm64
+ tags: ${{ env.TAG }}
+ -
+ name: Test arm
+ run: |
+ docker run --rm ${{ env.TAG }}&
+ sleep 10
+ kill %1
+ -
+ name: Build and push
uses: docker/build-push-action@v2
with:
context: .
platforms: linux/amd64, linux/arm64
push: true
- tags: gravitl/netmaker:${{ env.TAG }}
+ tags: ${{ github.repository }}:${{ env.TAG }}
diff --git a/.github/workflows/test-artifacts.yml b/.github/workflows/test-artifacts.yml
new file mode 100644
index 00000000..fa60d107
--- /dev/null
+++ b/.github/workflows/test-artifacts.yml
@@ -0,0 +1,51 @@
+name: Build artifacts for deployment testing
+
+on:
+ push:
+ branches:
+ - 'testing'
+ workflow_dispatch:
+
+jobs:
+ docker:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v1
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v1
+ - name: Login to DockerHub
+ uses: docker/login-action@v1
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ - name: Build and Push test
+ uses: docker/build-push-action@v2
+ with:
+ context: .
+ platforms: linux/amd64
+ push: true
+ tags: ghcr.io/${{ github.repository }}:testing
+ netclient:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: build client
+ run: |
+ cd netclient
+ go build -ldflags="-X 'main.version=testing'" .
+ curl -H 'Authorization: Bearer ${{ secrets.NUSAK_MASTERKEY }}' \
+ -H 'Content-Type: multipart/form-data' --form upload='./netclient' \
+ -X POST https://dashboard.nusak.ca/api/file/netclient
+ #deploy:
+ #runs-on: ubuntu-latest
+ #steps:
+ #- name: Deploy Testing Server and Client(s)
+ # run: |
+ # curl -X POST https://api.github.com/mattkasun/terraform-test/dispatches \
+ # -H 'Accept: application/vnd.github.everest-preview+json' \
+ # -u ${{ secrets.ACCESS_TOKEN }}
diff --git a/Dockerfile b/Dockerfile
index 8d915775..49d64a52 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,26 +1,19 @@
#first stage - builder
-FROM gravitl/builder as builder
-
+FROM golang:1.15-alpine as builder
+ARG version
+RUN apk add build-base
WORKDIR /app
-
COPY . .
-
ENV GO111MODULE=auto
-
-RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=1 /usr/local/go/bin/go build -ldflags="-w -s" -o netmaker main.go
-
+RUN GOOS=linux CGO_ENABLED=1 go build -ldflags="-s -X 'main.version=$version'" -o netmaker main.go
FROM alpine:3.13.6
# add a c lib
RUN apk add gcompat iptables
# set the working directory
WORKDIR /root/
-
RUN mkdir -p /etc/netclient/config
-
COPY --from=builder /app/netmaker .
COPY --from=builder /app/config config
-
EXPOSE 8081
EXPOSE 50051
-
ENTRYPOINT ["./netmaker"]
diff --git a/README.md b/README.md
index 08b82a03..33eacd29 100644
--- a/README.md
+++ b/README.md
@@ -39,14 +39,14 @@
**For production-grade installations, visit the [Install Docs](https://netmaker.readthedocs.io/en/master/install.html).**
**For an HA install using helm on k8s, visit the [Helm Repo](https://github.com/gravitl/netmaker-helm/).**
1. Get a cloud VM with Ubuntu 20.04 and a public IP.
-2. Open ports 443, 53, and 51821-51830/udp on the VM firewall and in cloud security settings.
+2. Open ports 443, 80, 53, and 51821-51830/udp on the VM firewall and in cloud security settings.
3. Run the script **(see below for optional configurations)**:
`sudo wget -qO - https://raw.githubusercontent.com/gravitl/netmaker/master/scripts/nm-quick.sh | bash`

-Upon completion, the logs will display the instructions to connect various devices. These can also be retrived from the UI under "Acess Keys."
+Upon completion, the logs will display the instructions to connect various devices. These can also be retrived from the UI under "Access Keys."
After installing Netmaker, check out the [Walkthrough](https://itnext.io/getting-started-with-netmaker-a-wireguard-virtual-networking-platform-3d563fbd87f0) and [Getting Started](https://netmaker.readthedocs.io/en/master/getting-started.html) guides to learn more about configuring networks. Or, check out some of our other [Tutorials](https://gravitl.com/resources) for different use cases, including Kubernetes.
@@ -88,6 +88,17 @@ After installing Netmaker, check out the [Walkthrough](https://itnext.io/getting
- [Learning Resources](https://gravitl.com/resources)
+# Community Projects
+
+- [Netmaker + Traefik Proxy](https://github.com/bsherman/netmaker-traefik)
+
+- [OpenWRT Netclient Packager](https://github.com/sbilly/netmaker-openwrt)
+
+- [Golang GUI](https://github.com/mattkasun/netmaker-gui)
+
+- [CoreDNS Plugin](https://github.com/SekoiaLab/netmaker-coredns)
+
+
## Disclaimer
[WireGuard](https://wireguard.com/) is a registered trademark of Jason A. Donenfeld.
diff --git a/scripts/netclient-install.ps1 b/scripts/netclient-install.ps1
index f5de174a..9d8411ea 100644
--- a/scripts/netclient-install.ps1
+++ b/scripts/netclient-install.ps1
@@ -11,57 +11,65 @@ new-module -name netclient-install -scriptblock {
Function Netclient-Install() {
param ($version='latest', $token)
+ if($token -eq $null -or $token -eq ""){
+ Quit "-token required"
+ }
- if($token -eq $null -or $token -eq ""){
- Quit "-token required"
- }
+ $software = "WireGuard";
+ $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayName -eq $software }) -ne $null
- $software = "WireGuard";
- $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayName -eq $software }) -ne $null
+ If(-Not $installed) {
+ Write-Host "'$software' is NOT installed. installing...";
+ $url = "https://download.wireguard.com/windows-client/wireguard-installer.exe"
+ $outpath = "$env:userprofile\Downloads\wireguard-installer.exe"
+ Invoke-WebRequest -Uri $url -OutFile $outpath
+ $args = @("Comma","Separated","Arguments")
+ Start-Process -Filepath "$env:userprofile\Downloads\wireguard-installer.exe" -ArgumentList $args -Wait
+ $software = "WireGuard";
+ $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayName -eq $software }) -ne $null
+ If(-Not $installed) {
+ Quit "Could not install WireGuard"
+ } else {
+ Write-Host "'$software' is installed."
+ }
+ } else {
+ Write-Host "'$software' is installed."
+ }
+ $outpath = "";
+ if (Test-Path -Path "C:\ProgramData\Netclient\bin\netclient.exe") {
+ $outpath = "C:\ProgramData\Netclient\bin\netclient.exe";
+ } else {
+ $outpath = "$env:userprofile\Downloads\netclient.exe"
+ Write-Host "'netclient.exe' is NOT installed. installing...";
+ Write-Host "https://github.com/gravitl/netmaker/releases/download/$version/netclient.exe";
+ $url = "https://github.com/gravitl/netmaker/releases/download/$version/netclient.exe"
+ Invoke-WebRequest -Uri $url -OutFile $outpath
+ $loc = Get-Location
+ Copy-Item -Path "$env:userprofile\Downloads\netclient.exe" -Destination "$loc\netclient.exe"
+ }
+ $runNum = "one","two"
+ foreach ($run in $runNum) {
- If(-Not $installed) {
- Write-Host "'$software' is NOT installed. installing...";
- $url = "https://download.wireguard.com/windows-client/wireguard-installer.exe"
- $outpath = "$env:userprofile\Downloads\wireguard-installer.exe"
- Invoke-WebRequest -Uri $url -OutFile $outpath
- $args = @("Comma","Separated","Arguments")
- Start-Process -Filepath "$env:userprofile\Downloads\wireguard-installer.exe" -ArgumentList $args -Wait
- $software = "WireGuard";
- $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayName -eq $software }) -ne $null
- If(-Not $installed) {
- Quit "Could not install WireGuard"
- } else {
- Write-Host "'$software' is installed."
- }
- } else {
- Write-Host "'$software' is installed."
- }
- $outpath = "";
- if (Test-Path -Path "C:\ProgramData\Netclient\bin\netclient.exe") {
- $outpath = "C:\ProgramData\Netclient\bin\netclient.exe";
- } else {
- $outpath = "$env:userprofile\Downloads\netclient.exe"
- Write-Host "'netclient.exe' is NOT installed. installing...";
- Write-Host "https://github.com/gravitl/netmaker/releases/download/$version/netclient.exe";
- $url = "https://github.com/gravitl/netmaker/releases/download/$version/netclient.exe"
- Invoke-WebRequest -Uri $url -OutFile $outpath
- $loc = Get-Location
- Copy-Item -Path "$env:userprofile\Downloads\netclient.exe" -Destination "$loc\netclient.exe"
- }
- $NetArgs = @("join","-t",$token)
- Start-Process -Filepath $outpath -ArgumentList $NetArgs -Wait
- Add-MpPreference -ExclusionPath "C:\ProgramData\Netclient"
+ $NetArgs = @("join","-t",$token)
+ Start-Process -Filepath $outpath -ArgumentList $NetArgs -Wait
+ Add-MpPreference -ExclusionPath "C:\ProgramData\Netclient"
- if ((Get-Command "netclient.exe" -ErrorAction SilentlyContinue) -eq $null) {
- if (-not (Test-Path -Path "C:\ProgramData\Netclient\bin\netclient.exe")) {
- New-Item -Path "C:\ProgramData\Netclient" -Name "bin" -ItemType "directory"
- Move-Item -Path "$env:userprofile\Downloads\netclient.exe" -Destination "C:\ProgramData\Netclient\bin\netclient.exe"
- $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
- $newpath = "$oldpath;C:\ProgramData\Netclient\bin"
- Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath
- $env:Path += ";C:\ProgramData\Netclient\bin"
- }
- }
- Write-Host "'netclient' is installed."
+ if ((Get-Command "netclient.exe" -ErrorAction SilentlyContinue) -eq $null) {
+ if (-not (Test-Path -Path "C:\ProgramData\Netclient\bin\netclient.exe")) {
+ New-Item -Path "C:\ProgramData\Netclient" -Name "bin" -ItemType "directory"
+ Move-Item -Path "$env:userprofile\Downloads\netclient.exe" -Destination "C:\ProgramData\Netclient\bin\netclient.exe"
+ $oldpath = (Get-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH).path
+ $newpath = "$oldpath;C:\ProgramData\Netclient\bin"
+ Set-ItemProperty -Path 'Registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment' -Name PATH -Value $newPath
+ $env:Path += ";C:\ProgramData\Netclient\bin"
+ }
+ }
+ if($run -eq "one"){
+ Write-Host "re-running setup to confirm all components are installed."
+ Start-Sleep -s 1
+ }
+ }
+ Write-Host "'netclient' is installed."
}
}
+
diff --git a/scripts/netclient-install.sh b/scripts/netclient-install.sh
index 1fdb051e..5e58e1ff 100755
--- a/scripts/netclient-install.sh
+++ b/scripts/netclient-install.sh
@@ -10,15 +10,30 @@ echo "checking dependencies..."
OS=$(uname)
if [ -f /etc/debian_version ]; then
+ dependencies="wireguard wireguard-tools"
+ update_cmd='apt update'
install_cmd='apt-get install -y'
elif [ -f /etc/alpine-release ]; then
+ dependencies="wireguard"
+ update_cmd='apk update'
install_cmd='apk --update add'
elif [ -f /etc/centos-release ]; then
+ dependencies="wireguard"
+ update_cmd='yum update'
install_cmd='yum install -y'
elif [ -f /etc/fedora-release ]; then
+ dependencies="wireguard"
+ update_cmd='dnf update'
install_cmd='dnf install -y'
elif [ "${OS}" = "FreeBSD" ]; then
+ dependencies="wireguard"
+ update_cmd='pkg update'
install_cmd='pkg install -y'
+elif [ -f /etc/openwrt_release ]; then
+ dependencies="wireguard-tools"
+ OS="OpenWRT"
+ update_cmd='opkg update'
+ install_cmd='opkg install'
else
install_cmd=''
fi
@@ -27,7 +42,7 @@ if [ -z "${install_cmd}" ]; then
echo "OS unsupported for automatic dependency install"
exit 1
fi
-dependencies="wireguard"
+
set -- $dependencies
while [ -n "$1" ]; do
echo $1
@@ -50,15 +65,23 @@ while [ -n "$1" ]; do
fi
fi
else
- is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed")
- if [ "${is_installed}" = "install ok installed" ]; then
+ if [ "${OS}" = "OpenWRT" ]; then
+ is_installed=$(opkg list-installed $1 | grep $1)
+ else
+ is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed")
+ fi
+ if [ "${is_installed}" != "" ]; then
echo " " $1 is installed
else
echo " " $1 is not installed. Attempting install.
${install_cmd} $1
sleep 5
- is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed")
- if [ "${is_installed}" = "install ok installed" ]; then
+ if [ "${OS}" = "OpenWRT" ]; then
+ is_installed=$(opkg list-installed $1 | grep $1)
+ else
+ is_installed=$(dpkg-query -W --showformat='${Status}\n' $1 | grep "install ok installed")
+ fi
+ if [ "${is_installed}" != "" ]; then
echo " " $1 is installed
elif [ -x "$(command -v $1)" ]; then
echo " " $1 is installed
@@ -105,7 +128,7 @@ case $(uname | tr '[:upper:]' '[:lower:]') in
dist=netclient-arm64
;;
armv7l)
- dist=netclient-armv7
+ dist=netclient-arm7
;;
arm*)
dist=netclient-$CPU_ARCH
@@ -155,18 +178,23 @@ esac
echo "Binary = $dist"
url="https://github.com/gravitl/netmaker/releases/download/$VERSION/$dist"
+curl_opts='-nv'
+if [ "${OS}" = "OpenWRT" ]; then
+ curl_opts='-q'
+fi
+
if curl --output /dev/null --silent --head --fail "$url"; then
echo "Downloading $dist $VERSION"
- wget -nv -O netclient $url
+ wget $curl_opts -O netclient $url
else
echo "Downloading $dist latest"
- wget -nv -O netclient https://github.com/gravitl/netmaker/releases/download/latest/$dist
+ wget $curl_opts -O netclient https://github.com/gravitl/netmaker/releases/download/latest/$dist
fi
chmod +x netclient
EXTRA_ARGS=""
-if [ "${OS}" = "FreeBSD" ]; then
+if [ "${OS}" = "FreeBSD" ] || [ "${OS}" = "OpenWRT" ]; then
EXTRA_ARGS="--daemon=off"
fi
@@ -201,6 +229,58 @@ END_OF_FILE
sudo chmod +x /usr/local/etc/rc.d/netclient
sudo /usr/local/etc/rc.d/netclient enable
sudo /usr/local/etc/rc.d/netclient start
-else
+
+elif [ "${OS}" = "OpenWRT" ]; then
+ mv ./netclient /etc/netclient/netclient
+ cat << 'END_OF_FILE' > ./netclient.service.tmp
+#!/bin/sh /etc/rc.common
+
+EXTRA_COMMANDS="status"
+EXTRA_HELP=" status Check service is running"
+START=99
+
+LOG_FILE="/tmp/netclient.logs"
+
+start() {
+ if [ ! -f "${LOG_FILE}" ];then
+ touch "${LOG_FILE}"
+ fi
+ local PID=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}')
+ if [ "${PID}" ];then
+ echo "service is running"
+ return
+ fi
+ bash -c "while [ 1 ]; do /etc/netclient/netclient checkin -n all >> ${LOG_FILE} 2>&1;sleep 15;\
+ if [ $(ls -l ${LOG_FILE}|awk '{print $5}') -gt 10240000 ];then tar zcf "${LOG_FILE}.tar" -C / "tmp/netclient.logs" && > $LOG_FILE;fi;done &"
+ echo "start"
+}
+
+stop() {
+ pids=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}')
+ for i in "${pids[@]}"
+ do
+ if [ "${i}" ];then
+ kill "${i}"
+ fi
+ done
+ echo "stop"
+}
+
+status() {
+ local PID=$(ps|grep "netclient checkin -n all"|grep -v grep|awk '{print $1}')
+ if [ "${PID}" ];then
+ echo -e "netclient[${PID}] is running \n"
+ else
+ echo -e "netclient is not running \n"
+ fi
+}
+
+END_OF_FILE
+ mv ./netclient.service.tmp /etc/init.d/netclient
+ chmod +x /etc/init.d/netclient
+ /etc/init.d/netclient enable
+ /etc/init.d/netclient start
+else
rm -f netclient
fi
+
diff --git a/scripts/nm-quick.sh b/scripts/nm-quick.sh
index d4e4d19a..507e6258 100755
--- a/scripts/nm-quick.sh
+++ b/scripts/nm-quick.sh
@@ -28,7 +28,7 @@ fi
echo "checking dependencies..."
declare -A osInfo;
-osInfo[/etc/debian_version]="apt-get install -y"
+osInfo[/etc/debian_version]="apt-get install -y"u
osInfo[/etc/alpine-release]="apk --update add"
osInfo[/etc/centos-release]="yum install -y"
osInfo[/etc/fedora-release]="dnf install -y"
@@ -40,8 +40,20 @@ do
fi
done
+if [ -f /etc/debian_version ]; then
+ apt update
+elif [ -f /etc/alpine-release ]; then
+ apk update
+elif [ -f /etc/centos-release ]; then
+ yum update
+elif [ -f /etc/fedora-release ]; then
+ dnf update
+fi
+
dependencies=("docker.io" "docker-compose" "wireguard" "jq")
+
+
for dependency in ${dependencies[@]}; do
is_installed=$(dpkg-query -W --showformat='${Status}\n' ${dependency} | grep "install ok installed")