mirror of
https://github.com/xubiaolin/docker-zerotier-planet.git
synced 2025-01-22 12:48:14 -05:00
重构代码,不用编译 (#108)
* 重构 * 重构 * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * tmp * xx * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * no sense * t * finish image build * fix * addmenu * addmenu * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * fix * finishscript --------- Co-authored-by: ubuntu <ubuntu@localhost.localdomain> Co-authored-by: xubiaolin <xubiaolin2014> Co-authored-by: root <root@localhost.localdomain>
This commit is contained in:
parent
39ce9bfff6
commit
cfa3ae2054
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,2 +1 @@
|
||||
.idea
|
||||
patch/patch.json
|
||||
|
95
Dockerfile
95
Dockerfile
@ -1,53 +1,70 @@
|
||||
FROM alpine:3.17 as builder
|
||||
|
||||
ARG ZT_PORT
|
||||
FROM alpine:3.14 as builder
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
WORKDIR /app
|
||||
ADD . /app
|
||||
ADD ./entrypoint.sh /app/entrypoint.sh
|
||||
ADD ./http_server.js /app/http_server.js
|
||||
|
||||
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
|
||||
# init tool
|
||||
RUN set -x\
|
||||
&& apk update\
|
||||
&& mkdir -p /usr/include/nlohmann/ && cd /usr/include/nlohmann/ && wget https://ghproxy.markxu.online/https://github.com/nlohmann/json/releases/download/v3.10.5/json.hpp \
|
||||
&& apk add --no-cache git python3 npm make g++ zerotier-one linux-headers\
|
||||
&& mkdir /app -p && cd /app && git clone --progress https://ghproxy.markxu.online/https://github.com/key-networks/ztncui.git\
|
||||
&& apk add --no-cache git python3 npm make g++ linux-headers curl pkgconfig openssl-dev jq build-base gcc \
|
||||
&& echo "env prepare success!"
|
||||
|
||||
# make zerotier-one
|
||||
RUN set -x\
|
||||
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y\
|
||||
&& source "$HOME/.cargo/env"\
|
||||
&& git clone https://github.com/zerotier/ZeroTierOne.git\
|
||||
&& cd ZeroTierOne\
|
||||
&& make ZT_SYMLINK=1 \
|
||||
&& make\
|
||||
&& make install\
|
||||
&& echo "make success!"\
|
||||
; zerotier-one -d \
|
||||
; sleep 5s && ps -ef |grep zerotier-one |grep -v grep |awk '{print $1}' |xargs kill -9\
|
||||
&& echo "zerotier-one init success!"
|
||||
|
||||
|
||||
#make ztncui
|
||||
RUN set -x \
|
||||
&& mkdir /app -p \
|
||||
&& cd /app \
|
||||
&& git clone --progress https://ghproxy.markxu.online/https://github.com/key-networks/ztncui.git\
|
||||
&& cd /app/ztncui/src \
|
||||
&& cp /app/patch/binding.gyp .\
|
||||
&& echo "开始配置npm环境"\
|
||||
&& npm install -g --progress --verbose node-gyp --registry=https://registry.npmmirror.com\
|
||||
&& npm install --registry=https://registry.npmmirror.com\
|
||||
&& echo 'HTTP_PORT=3443' >.env \
|
||||
&& echo 'NODE_ENV=production' >>.env \
|
||||
&& echo 'HTTP_ALL_INTERFACES=true' >>.env \
|
||||
&& echo "ZT_ADDR=localhost:${ZT_PORT}" >>.env\
|
||||
&& echo "${ZT_PORT}" >/app/zerotier-one.port \
|
||||
&& cp -v etc/default.passwd etc/passwd
|
||||
&& npm config set registry https://registry.npmmirror.com\
|
||||
&& npm install -g node-gyp\
|
||||
&& npm install
|
||||
|
||||
RUN cd /app && git clone --progress https://ghproxy.markxu.online/https://github.com/zerotier/ZeroTierOne.git --depth 1\
|
||||
&& zerotier-one -d && sleep 5s && ps -ef |grep zerotier-one |grep -v grep |awk '{print $1}' |xargs kill -9 \
|
||||
&& cd /var/lib/zerotier-one && zerotier-idtool initmoon identity.public >moon.json\
|
||||
&& cd /app/patch && python3 patch.py \
|
||||
&& cd /var/lib/zerotier-one && zerotier-idtool genmoon moon.json && mkdir moons.d && cp ./*.moon ./moons.d \
|
||||
&& cd /app/ZeroTierOne/attic/world/ && sh build.sh \
|
||||
&& sleep 5s \
|
||||
&& cd /app/ZeroTierOne/attic/world/ && ./mkworld \
|
||||
&& mkdir /app/bin -p && cp world.bin /app/bin/planet \
|
||||
&& TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret) \
|
||||
&& echo "ZT_TOKEN=$TOKEN">> /app/ztncui/src/.env
|
||||
FROM alpine:3.14
|
||||
|
||||
FROM alpine:3.17
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=builder /app/ztncui /app/ztncui
|
||||
COPY --from=builder /app/bin /app/bin
|
||||
COPY --from=builder /app/zerotier-one.port /app/zerotier-one.port
|
||||
COPY --from=builder /var/lib/zerotier-one /var/lib/zerotier-one
|
||||
ENV IP_ADDR4=''
|
||||
ENV IP_ADDR6=''
|
||||
|
||||
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
|
||||
&& apk update\
|
||||
&& apk add --no-cache npm zerotier-one
|
||||
ENV ZT_PORT=9994
|
||||
ENV API_PORT=3443
|
||||
ENV FILE_SERVER_PORT=3000
|
||||
|
||||
VOLUME [ "/app","/var/lib/zerotier-one" ]
|
||||
ENV GH_MIRROR="https://ghproxy.markxu.online/"
|
||||
ENV FILE_KEY=''
|
||||
ENV TZ=Asia/Shanghai
|
||||
|
||||
CMD /bin/sh -c "cd /var/lib/zerotier-one && ./zerotier-one -p`cat /app/zerotier-one.port` -d; cd /app/ztncui/src;npm start"
|
||||
COPY --from=builder /app/ztncui /bak/ztncui
|
||||
COPY --from=builder /var/lib/zerotier-one /bak/zerotier-one
|
||||
|
||||
COPY --from=builder /app/ZeroTierOne/zerotier-one /usr/sbin/zerotier-one
|
||||
COPY --from=builder /app/entrypoint.sh /app/entrypoint.sh
|
||||
COPY --from=builder /app/http_server.js /app/http_server.js
|
||||
|
||||
RUN set -x ;sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \
|
||||
&& apk update \
|
||||
&& apk add --no-cache npm curl jq\
|
||||
&& mkdir /app/config -p
|
||||
|
||||
|
||||
VOLUME [ "/app/dist","/app/ztncui","/var/lib/zerotier-one","/app/config"]
|
||||
|
||||
CMD ["/bin/sh","/app/entrypoint.sh"]
|
||||
|
@ -3,11 +3,10 @@
|
||||
imageName="zerotier-planet"
|
||||
|
||||
function install() {
|
||||
read -p "请输入zerotier-planet要使用的端口号,例如9994(数字): " port
|
||||
|
||||
# 确保端口号是数字
|
||||
while ! [[ "$port" =~ ^[0-9]+$ ]]; do
|
||||
read -p "端口号必须是数字,请重新输入端口号: " port
|
||||
read -p "请输入zerotier-planet要使用的端口号,例如9994: " ZT_PORT
|
||||
#port必须是数字
|
||||
while [[ ! "$ZT_PORT" =~ ^[0-9]+$ ]]; do
|
||||
read -p "端口号必须是数字,请重新输入: " ZT_PORT
|
||||
done
|
||||
|
||||
read -p "是否自动获取公网IP地址?(y/n)" use_auto_ip
|
||||
|
106
entrypoint.sh
Executable file
106
entrypoint.sh
Executable file
@ -0,0 +1,106 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -x
|
||||
|
||||
function start() {
|
||||
echo "start ztncui and zerotier"
|
||||
cd /var/lib/zerotier-one && ./zerotier-one -p$(cat /app/config/zerotier-one.port) -d || exit 1
|
||||
nohup node /app/http_server.js &> /app/server.log &
|
||||
cd /app/ztncui/src && npm start || exit 1
|
||||
}
|
||||
|
||||
function check_ztncui() {
|
||||
mkdir -p /app/ztncui
|
||||
if [ "$(ls -A /app/ztncui)" ]; then
|
||||
echo "${API_PORT}" >/app/config/ztncui.port
|
||||
echo "/app/ztncui is not empty, start directly"
|
||||
else
|
||||
echo "/app/ztncui is empty, init data"
|
||||
cp -r /bak/ztncui/* /app/ztncui/
|
||||
|
||||
echo "config ztncui"
|
||||
mkdir -p /app/config
|
||||
echo "${API_PORT}" >/app/config/ztncui.port
|
||||
cd /app/ztncui/src
|
||||
echo "HTTP_PORT=${API_PORT}" >.env &&
|
||||
echo 'NODE_ENV=production' >>.env &&
|
||||
echo 'HTTP_ALL_INTERFACES=true' >>.env &&
|
||||
echo "ZT_ADDR=localhost:${ZT_PORT}" >>.env && echo "${ZT_PORT}" >/app/config/zerotier-one.port &&
|
||||
cp -v etc/default.passwd etc/passwd && TOKEN=$(cat /var/lib/zerotier-one/authtoken.secret) &&
|
||||
echo "ZT_TOKEN=$TOKEN" >>.env &&
|
||||
echo "make ztncui success!"
|
||||
fi
|
||||
}
|
||||
|
||||
function check_zerotier() {
|
||||
mkdir -p /var/lib/zerotier-one
|
||||
if [ "$(ls -A /var/lib/zerotier-one)" ]; then
|
||||
echo "/var/lib/zerotier-one is not empty, start directly"
|
||||
else
|
||||
mkdir -p /app/config
|
||||
echo "/var/lib/zerotier-one is empty, init data"
|
||||
echo "${ZT_PORT}" >/app/config/zerotier-one.port
|
||||
cp -r /bak/zerotier-one/* /var/lib/zerotier-one/
|
||||
|
||||
cd /var/lib/zerotier-one
|
||||
echo "start mkmoonworld"
|
||||
|
||||
./zerotier-idtool initmoon identity.public >moon.json
|
||||
|
||||
if [ -z "$IP_ADDR4" ]; then IP_ADDR4=$(curl -s https://ipv4.icanhazip.com/); fi
|
||||
if [ -z "$IP_ADDR6" ]; then IP_ADDR6=$(curl -s https://ipv6.icanhazip.com/); fi
|
||||
|
||||
echo "IP_ADDR4=$IP_ADDR4"
|
||||
echo "IP_ADDR6=$IP_ADDR6"
|
||||
|
||||
ZT_PORT=$(cat /app/config/zerotier-one.port)
|
||||
API_PORT=$(cat /app/config/ztncui.port)
|
||||
|
||||
echo "ZT_PORT=$ZT_PORT"
|
||||
echo "API_PORT=$API_PORT"
|
||||
|
||||
if [ -z "$IP_ADDR4" ]; then stableEndpoints="[\"$IP_ADDR6/${ZT_PORT}\"]"; fi
|
||||
if [ -z "$IP_ADDR6" ]; then stableEndpoints="[\"$IP_ADDR4/${ZT_PORT}\"]"; fi
|
||||
if [ -n "$IP_ADDR4" ] && [ -n "$IP_ADDR6" ]; then stableEndpoints="[\"$IP_ADDR4/${ZT_PORT}\",\"$IP_ADDR6/${ZT_PORT}\"]"; fi
|
||||
if [ -z "$IP_ADDR4" ] && [ -z "$IP_ADDR6" ]; then
|
||||
echo "IP_ADDR4 and IP_ADDR6 are both empty!"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "$IP_ADDR4">/app/config/ip_addr4
|
||||
echo "$IP_ADDR6">/app/config/ip_addr6
|
||||
|
||||
echo "stableEndpoints=$stableEndpoints"
|
||||
|
||||
jq --argjson newEndpoints "$stableEndpoints" '.roots[0].stableEndpoints = $newEndpoints' moon.json >temp.json && mv temp.json moon.json
|
||||
./zerotier-idtool genmoon moon.json && mkdir -p moons.d && cp ./*.moon ./moons.d
|
||||
|
||||
wget "${GH_MIRROR}https://github.com/kaaass/ZeroTierOne/releases/download/mkmoonworld-1.0/mkmoonworld-x86_64"
|
||||
chmod +x ./mkmoonworld-x86_64
|
||||
./mkmoonworld-x86_64 moon.json
|
||||
|
||||
mkdir -p /app/dist/
|
||||
mv world.bin /app/dist/planet
|
||||
cp *.moon /app/dist/
|
||||
echo -e "mkmoonworld success!\n"
|
||||
fi
|
||||
}
|
||||
|
||||
function check_file_server(){
|
||||
if [ ! -f "/app/config/file_server.port" ]; then
|
||||
echo "file_server.port is not exist, generate it"
|
||||
echo "${FILE_SERVER_PORT}" >/app/config/file_server.port
|
||||
echo "${FILE_SERVER_PORT}"
|
||||
else
|
||||
echo "file_server.port is exist, read it"
|
||||
FILE_SERVER_PORT=$(cat /app/config/file_server.port)
|
||||
echo "${FILE_SERVER_PORT}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
check_file_server
|
||||
check_ztncui
|
||||
check_zerotier
|
||||
|
||||
start
|
71
http_server.js
Normal file
71
http_server.js
Normal file
@ -0,0 +1,71 @@
|
||||
const http = require('http');
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
const url = require('url');
|
||||
const crypto = require('crypto');
|
||||
const port = process.env.FILE_SERVER_PORT;
|
||||
|
||||
const SECRET_KEY = process.env.SECRET_KEY || crypto.randomBytes(8).toString('hex');
|
||||
const APP_PATH='/app'
|
||||
const DIST_PATH = '/app/dist'
|
||||
|
||||
// write to file
|
||||
const secretKeyPath = '/app/config/file_server.key';
|
||||
fs.writeFile(secretKeyPath, SECRET_KEY, (err) => {
|
||||
if (err) {
|
||||
console.error('Error writing SECRET_KEY to file:', err);
|
||||
} else {
|
||||
console.log(`SECRET_KEY written to ${secretKeyPath}`);
|
||||
}
|
||||
});
|
||||
|
||||
const server = http.createServer((req, res) => {
|
||||
const parsedUrl = url.parse(req.url, true);
|
||||
|
||||
// check key
|
||||
const key = parsedUrl.query.key;
|
||||
if (!key || key !== SECRET_KEY) {
|
||||
res.writeHead(401, { 'Content-Type': 'text/plain' });
|
||||
return res.end('Unauthorized');
|
||||
}
|
||||
|
||||
let filePath = path.join(DIST_PATH, parsedUrl.pathname);
|
||||
let extname = String(path.extname(filePath)).toLowerCase();
|
||||
let mimeTypes = {
|
||||
'.html': 'text/html',
|
||||
'.js': 'text/javascript',
|
||||
'.css': 'text/css',
|
||||
'.json': 'application/json',
|
||||
'.png': 'image/png',
|
||||
'.jpg': 'image/jpg',
|
||||
'.gif': 'image/gif',
|
||||
'.svg': 'image/svg+xml',
|
||||
'.wav': 'audio/wav',
|
||||
'.mp4': 'video/mp4',
|
||||
'.woff': 'application/font-woff',
|
||||
'.ttf': 'application/font-ttf',
|
||||
'.eot': 'application/vnd.ms-fontobject',
|
||||
'.otf': 'application/font-otf',
|
||||
'.wasm': 'application/wasm'
|
||||
};
|
||||
let contentType = mimeTypes[extname] || 'application/octet-stream';
|
||||
|
||||
fs.readFile(filePath, (err, content) => {
|
||||
if (err) {
|
||||
if (err.code == 'ENOENT') {
|
||||
res.writeHead(404, { 'Content-Type': 'text/html' });
|
||||
res.end("404 - File Not Found");
|
||||
} else {
|
||||
res.writeHead(500);
|
||||
res.end(`Server Error: ${err.code}`);
|
||||
}
|
||||
} else {
|
||||
res.writeHead(200, { 'Content-Type': contentType });
|
||||
res.end(content, 'utf-8');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
server.listen(port, () => {
|
||||
console.log(`Server running at http://localhost:${port}/`);
|
||||
});
|
249
install.sh
Executable file
249
install.sh
Executable file
@ -0,0 +1,249 @@
|
||||
#!/bin/bash
|
||||
|
||||
function install(){
|
||||
echo "开始安装,如果你已经安装了,将会删除旧的数据,10s后开始安装..."
|
||||
sleep 10
|
||||
|
||||
#安装lsof工具
|
||||
if [ ! -f "/usr/bin/lsof" ]; then
|
||||
echo "开始安装lsof工具..."
|
||||
#debian
|
||||
if [ -f "/usr/bin/apt" ]; then
|
||||
apt update
|
||||
apt install -y lsof
|
||||
fi
|
||||
#centos
|
||||
if [ -f "/usr/bin/yum" ]; then
|
||||
yum install -y lsof
|
||||
fi
|
||||
fi
|
||||
|
||||
docker rm -f myztplanet
|
||||
rm -f /data/zerotier
|
||||
|
||||
ZT_PORT=9994
|
||||
API_PORT=3443
|
||||
FILE_PORT=3000
|
||||
|
||||
read -p "请输入zerotier-planet要使用的端口号,例如9994: " ZT_PORT
|
||||
while [[ ! "$ZT_PORT" =~ ^[0-9]+$ ]]; do
|
||||
read -p "端口号必须是数字,请重新输入: " ZT_PORT
|
||||
done
|
||||
|
||||
if [ $(lsof -i:${ZT_PORT} | wc -l) -gt 0 ]; then
|
||||
echo "端口${ZT_PORT}已被占用,请重新输入"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
read -p "请输入zerotier-planet的API端口号,例如3443: " API_PORT
|
||||
while [[ ! "$API_PORT" =~ ^[0-9]+$ ]]; do
|
||||
read -p "端口号必须是数字,请重新输入: " API_PORT
|
||||
done
|
||||
|
||||
if [ $(lsof -i:${API_PORT} | wc -l) -gt 0 ]; then
|
||||
echo "端口${API_PORT}已被占用,请重新输入"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
read -p "请输入zerotier-planet的FILE端口号,例如3000: " FILE_PORT
|
||||
while [[ ! "$FILE_PORT" =~ ^[0-9]+$ ]]; do
|
||||
read -p "端口号必须是数字,请重新输入: " FILE_PORT
|
||||
done
|
||||
|
||||
if [ $(lsof -i:${FILE_PORT} | wc -l) -gt 0 ]; then
|
||||
echo "端口${FILE_PORT}已被占用,请重新输入"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
read -p "是否自动获取公网IP地址?(y/n)" use_auto_ip
|
||||
use_auto_ip=${use_auto_ip:-y}
|
||||
if [[ "$use_auto_ip" =~ ^[Yy]$ ]]; then
|
||||
ipv4=$(curl -s https://ipv4.icanhazip.com/)
|
||||
ipv6=$(curl -s https://ipv6.icanhazip.com/)
|
||||
echo "获取到的IPv4地址为: $ipv4"
|
||||
echo "获取到的IPv6地址为: $ipv6"
|
||||
|
||||
read -p "是否使用上面获取到的IP地址?(y/n)" use_auto_ip_result
|
||||
use_auto_ip_result=${use_auto_ip_result:-y}
|
||||
if [[ "$use_auto_ip_result" =~ ^[Nn]$ ]]; then
|
||||
read -p "请输入IPv4地址: " ipv4
|
||||
read -p "请输入IPv6地址(可留空): " ipv6
|
||||
fi
|
||||
else
|
||||
read -p "请输入IPv4地址: " ipv4
|
||||
read -p "请输入IPv6地址(可留空): " ipv6
|
||||
fi
|
||||
|
||||
#汇总信息
|
||||
echo "---------------------------"
|
||||
echo "使用的端口号为:${ZT_PORT}"
|
||||
echo "API端口号为:${API_PORT}"
|
||||
echo "FILE端口号为:${FILE_PORT}"
|
||||
echo "IPv4地址为:${ipv4}"
|
||||
echo "IPv6地址为:${ipv6}"
|
||||
echo "---------------------------"
|
||||
|
||||
docker run -d --name myztplanet\
|
||||
-p ${ZT_PORT}:${ZT_PORT} \
|
||||
-p ${ZT_PORT}:${ZT_PORT}/udp \
|
||||
-p ${API_PORT}:${API_PORT}\
|
||||
-p ${FILE_PORT}:${FILE_PORT} \
|
||||
-e ZT_PORT=${ZT_PORT} \
|
||||
-e API_PORT=${API_PORT} \
|
||||
-e FILE_SERVER_PORT=${FILE_PORT} \
|
||||
-v /data/zerotier/dist:/app/dist \
|
||||
-v /data/zerotier/ztncui:/app/ztncui\
|
||||
-v /data/zerotier/one:/var/lib/zerotier-one\
|
||||
-v /data/zerotier/config:/app/config\
|
||||
xubiaolin/zerotier-planet:latest
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "安装失败"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
sleep 10
|
||||
|
||||
KEY=$(docker exec -it myztplanet sh -c 'cat /app/config/file_server.key')
|
||||
MOON_NAME=$(docker exec -it myztplanet sh -c 'ls /app/dist |grep moon')
|
||||
|
||||
ipv4=$(echo $ipv4 | tr -d '\r')
|
||||
FILE_PORT=$(echo $FILE_PORT | tr -d '\r')
|
||||
KEY=$(echo $KEY | tr -d '\r')
|
||||
MOON_NAME=$(echo $MOON_NAME | tr -d '\r')
|
||||
|
||||
echo "安装完成"
|
||||
echo "---------------------------"
|
||||
echo "请访问 http://${ipv4}:${API_PORT} 进行配置"
|
||||
echo "默认用户名:admin"
|
||||
echo "默认密码:password"
|
||||
echo "请及时修改密码"
|
||||
echo "---------------------------"
|
||||
|
||||
echo "moon配置和planet配置在 /data/zerotier/dist 目录下"
|
||||
echo -e "moons 文件下载: http://${ipv4}:${FILE_PORT}/${MOON_NAME}?key=${KEY} "
|
||||
echo -e "planet文件下载: http://${ipv4}:${FILE_PORT}/planet?key=${KEY} "
|
||||
|
||||
echo "---------------------------"
|
||||
echo "请放行以下端口请:${ZT_PORT}/tcp,${ZT_PORT}/udp,${API_PORT}/tcp,${FILE_PORT}/tcp"
|
||||
echo "---------------------------"
|
||||
}
|
||||
|
||||
function info(){
|
||||
docker inspect myztplanet >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "容器myztplanet不存在,请先安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ipv4=$(docker exec -it myztplanet sh -c 'cat /app/config/ip_addr4' | tr -d '\r')
|
||||
ipv6=$(docker exec -it myztplanet sh -c 'cat /app/config/ip_addr6' | tr -d '\r')
|
||||
API_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/ztncui.port' | tr -d '\r')
|
||||
FILE_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/file_server.port' | tr -d '\r')
|
||||
MOON_NAME=$(docker exec -it myztplanet sh -c 'ls /app/dist |grep moon' | tr -d '\r')
|
||||
ZT_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/zerotier-one.port' | tr -d '\r')
|
||||
KEY=$(docker exec -it myztplanet sh -c 'cat /app/config/file_server.key' |tr -d '\r')
|
||||
|
||||
echo "---------------------------"
|
||||
echo "以下端口的tcp和udp协议请放行:${ZT_PORT},${API_PORT},${FILE_PORT}"
|
||||
echo "---------------------------"
|
||||
echo "请访问 http://${ipv4}:${API_PORT} 进行配置"
|
||||
echo "默认用户名:admin"
|
||||
echo "默认密码:password"
|
||||
echo "请及时修改密码"
|
||||
echo "---------------------------"
|
||||
echo "moon配置和planet配置在 /data/zerotier/dist 目录下"
|
||||
echo ""
|
||||
echo "planet文件下载: http://${ipv4}:${FILE_PORT}/planet?key=${KEY} "
|
||||
echo "moon文件下载: http://${ipv4}:${FILE_PORT}/${MOON_NAME}?key=${KEY} "
|
||||
|
||||
}
|
||||
|
||||
function uninstall(){
|
||||
echo "开始卸载..."
|
||||
|
||||
docker stop myztplanet
|
||||
docker rm myztplanet
|
||||
docker rmi xubiaolin/zerotier-planet:latest
|
||||
|
||||
#是否删除数据,默认不删除
|
||||
read -p "是否删除数据?(y/n)" delete_data
|
||||
delete_data=${delete_data:-n}
|
||||
if [[ "$delete_data" =~ ^[Yy]$ ]]; then
|
||||
rm -rf /data/zerotier
|
||||
fi
|
||||
|
||||
echo "卸载完成"
|
||||
}
|
||||
|
||||
function update(){
|
||||
docker inspect myztplanet >/dev/null 2>&1
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "容器myztplanet不存在,请先安装"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "如果用与生产环境,请先备份数据,不建议直接更新,10s后开始更新..."
|
||||
sleep 10
|
||||
|
||||
echo "开始更新..."
|
||||
|
||||
if [ ! -d "/data/zerotier" ]; then
|
||||
echo "目录/data/zerotier不存在,无法更新"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
ipv4=$(docker exec -it myztplanet sh -c 'cat /app/config/ip_addr4' | tr -d '\r')
|
||||
ipv6=$(docker exec -it myztplanet sh -c 'cat /app/config/ip_addr6' | tr -d '\r')
|
||||
API_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/ztncui.port' | tr -d '\r')
|
||||
FILE_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/file_server.port' | tr -d '\r')
|
||||
ZT_PORT=$(docker exec -it myztplanet sh -c 'cat /app/config/zerotier-one.port' | tr -d '\r')
|
||||
|
||||
echo "---------------------------"
|
||||
echo "ipv4地址为:${ipv4}"
|
||||
echo "ipv6地址为:${ipv6}"
|
||||
echo "API端口号为:${API_PORT}"
|
||||
echo "FILE端口号为:${FILE_PORT}"
|
||||
echo "ZT端口号为:${ZT_PORT}"
|
||||
|
||||
docker stop myztplanet
|
||||
docker pull xubiaolin/zerotier-planet:latest
|
||||
docker rm myztplanet
|
||||
|
||||
docker run -d --name myztplanet\
|
||||
-p ${ZT_PORT}:${ZT_PORT} \
|
||||
-p ${ZT_PORT}:${ZT_PORT}/udp \
|
||||
-p ${API_PORT}:${API_PORT}\
|
||||
-p ${FILE_PORT}:${FILE_PORT} \
|
||||
-e ZT_PORT=${ZT_PORT} \
|
||||
-e API_PORT=${API_PORT} \
|
||||
-e FILE_SERVER_PORT=${FILE_PORT} \
|
||||
-v /data/zerotier/dist:/app/dist \
|
||||
-v /data/zerotier/ztncui:/app/ztncui\
|
||||
-v /data/zerotier/one:/var/lib/zerotier-one\
|
||||
-v /data/config:/app/config\
|
||||
xubiaolin/zerotier-planet:latest
|
||||
}
|
||||
|
||||
function menu(){
|
||||
echo "欢迎使用zerotier-planet脚本,请选择需要执行的操作:"
|
||||
echo "1. 安装"
|
||||
echo "2. 卸载"
|
||||
echo "3. 更新"
|
||||
echo "4. 查看信息"
|
||||
echo "5. 退出"
|
||||
read -p "请输入数字:" num
|
||||
case "$num" in
|
||||
[1] ) install;;
|
||||
[2] ) uninstall;;
|
||||
[3] ) update;;
|
||||
[4] ) info;;
|
||||
[5] ) exit;;
|
||||
*) echo "请输入正确数字 [1-5]";;
|
||||
esac
|
||||
}
|
||||
|
||||
menu
|
@ -1,6 +0,0 @@
|
||||
{
|
||||
"targets": [{
|
||||
"target_name": "binding",
|
||||
"sources": [ "/usr/bin/node" ]
|
||||
}]
|
||||
}
|
@ -1,119 +0,0 @@
|
||||
/*
|
||||
* ZeroTier One - Network Virtualization Everywhere
|
||||
* Copyright (C) 2011-2016 ZeroTier, Inc. https://www.zerotier.com/
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This utility makes the World from the configuration specified below.
|
||||
* It probably won't be much use to anyone outside ZeroTier, Inc. except
|
||||
* for testing and experimentation purposes.
|
||||
*
|
||||
* If you want to make your own World you must edit this file.
|
||||
*
|
||||
* When run, it expects two files in the current directory:
|
||||
*
|
||||
* previous.c25519 - key pair to sign this world (key from previous world)
|
||||
* current.c25519 - key pair whose public key should be embedded in this world
|
||||
*
|
||||
* If these files do not exist, they are both created with the same key pair
|
||||
* and a self-signed initial World is born.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
|
||||
#include <node/Constants.hpp>
|
||||
#include <node/World.hpp>
|
||||
#include <node/C25519.hpp>
|
||||
#include <node/Identity.hpp>
|
||||
#include <node/InetAddress.hpp>
|
||||
#include <osdep/OSUtils.hpp>
|
||||
|
||||
using namespace ZeroTier;
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
std::string previous,current;
|
||||
if ((!OSUtils::readFile("previous.c25519",previous))||(!OSUtils::readFile("current.c25519",current))) {
|
||||
C25519::Pair np(C25519::generate());
|
||||
previous = std::string();
|
||||
previous.append((const char *)np.pub.data,ZT_C25519_PUBLIC_KEY_LEN);
|
||||
previous.append((const char *)np.priv.data,ZT_C25519_PRIVATE_KEY_LEN);
|
||||
current = previous;
|
||||
OSUtils::writeFile("previous.c25519",previous);
|
||||
OSUtils::writeFile("current.c25519",current);
|
||||
fprintf(stderr,"INFO: created initial world keys: previous.c25519 and current.c25519 (both initially the same)" ZT_EOL_S);
|
||||
}
|
||||
|
||||
if ((previous.length() != (ZT_C25519_PUBLIC_KEY_LEN + ZT_C25519_PRIVATE_KEY_LEN))||(current.length() != (ZT_C25519_PUBLIC_KEY_LEN + ZT_C25519_PRIVATE_KEY_LEN))) {
|
||||
fprintf(stderr,"FATAL: previous.c25519 or current.c25519 empty or invalid" ZT_EOL_S);
|
||||
return 1;
|
||||
}
|
||||
C25519::Pair previousKP;
|
||||
memcpy(previousKP.pub.data,previous.data(),ZT_C25519_PUBLIC_KEY_LEN);
|
||||
memcpy(previousKP.priv.data,previous.data() + ZT_C25519_PUBLIC_KEY_LEN,ZT_C25519_PRIVATE_KEY_LEN);
|
||||
C25519::Pair currentKP;
|
||||
memcpy(currentKP.pub.data,current.data(),ZT_C25519_PUBLIC_KEY_LEN);
|
||||
memcpy(currentKP.priv.data,current.data() + ZT_C25519_PUBLIC_KEY_LEN,ZT_C25519_PRIVATE_KEY_LEN);
|
||||
|
||||
// =========================================================================
|
||||
// EDIT BELOW HERE
|
||||
|
||||
std::vector<World::Root> roots;
|
||||
|
||||
const uint64_t id = ZT_WORLD_ID_EARTH;
|
||||
const uint64_t ts = 1567191349589ULL; // August 30th, 2019
|
||||
|
||||
//__PATCH_REPLACE__
|
||||
|
||||
// END WORLD DEFINITION
|
||||
// =========================================================================
|
||||
|
||||
fprintf(stderr,"INFO: generating and signing id==%llu ts==%llu" ZT_EOL_S,(unsigned long long)id,(unsigned long long)ts);
|
||||
|
||||
World nw = World::make(World::TYPE_PLANET,id,ts,currentKP.pub,roots,previousKP);
|
||||
|
||||
Buffer<ZT_WORLD_MAX_SERIALIZED_LENGTH> outtmp;
|
||||
nw.serialize(outtmp,false);
|
||||
World testw;
|
||||
testw.deserialize(outtmp,0);
|
||||
if (testw != nw) {
|
||||
fprintf(stderr,"FATAL: serialization test failed!" ZT_EOL_S);
|
||||
return 1;
|
||||
}
|
||||
|
||||
OSUtils::writeFile("world.bin",std::string((const char *)outtmp.data(),outtmp.size()));
|
||||
fprintf(stderr,"INFO: world.bin written with %u bytes of binary world data." ZT_EOL_S,outtmp.size());
|
||||
|
||||
fprintf(stdout,ZT_EOL_S);
|
||||
fprintf(stdout,"#define ZT_DEFAULT_WORLD_LENGTH %u" ZT_EOL_S,outtmp.size());
|
||||
fprintf(stdout,"static const unsigned char ZT_DEFAULT_WORLD[ZT_DEFAULT_WORLD_LENGTH] = {");
|
||||
for(unsigned int i=0;i<outtmp.size();++i) {
|
||||
const unsigned char *d = (const unsigned char *)outtmp.data();
|
||||
if (i > 0)
|
||||
fprintf(stdout,",");
|
||||
fprintf(stdout,"0x%.2x",(unsigned int)d[i]);
|
||||
}
|
||||
fprintf(stdout,"};" ZT_EOL_S);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1 +0,0 @@
|
||||
{"stableEndpoints":["175.29.122.43/9994"]}
|
@ -1,51 +0,0 @@
|
||||
import os
|
||||
import json
|
||||
from re import M
|
||||
|
||||
|
||||
def get_moon():
|
||||
with open("/var/lib/zerotier-one/moon.json", "r") as f:
|
||||
moon = json.load(f)
|
||||
return moon
|
||||
|
||||
|
||||
def get_patch():
|
||||
with open("/app/patch/patch.json", "r") as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def patch():
|
||||
moon = get_moon()
|
||||
patch = get_patch()
|
||||
|
||||
identity = moon["roots"][0]["identity"]
|
||||
moon["roots"][0]["stableEndpoints"] = patch["stableEndpoints"]
|
||||
|
||||
# 修改moon
|
||||
with open("/var/lib/zerotier-one/moon.json", "w") as f:
|
||||
f.write(json.dumps(moon,sort_keys=True, indent=2))
|
||||
|
||||
print("修改后的moon")
|
||||
print(moon)
|
||||
|
||||
# 修改world
|
||||
moon["roots"][0]["stableEndpoints"] = get_patch()["stableEndpoints"]
|
||||
text = f"""// Los Angeles
|
||||
roots.push_back(World::Root());
|
||||
roots.back().identity = Identity("{identity}");
|
||||
"""
|
||||
|
||||
for i in get_patch()["stableEndpoints"]:
|
||||
text += f'\n roots.back().stableEndpoints.push_back(InetAddress("{i}"));'
|
||||
|
||||
# 生成文件
|
||||
with open("/app/patch/mkworld.cpp", "r") as cpp:
|
||||
world = "".join(cpp.readlines())
|
||||
world = world.replace("//__PATCH_REPLACE__", text)
|
||||
|
||||
with open("/app/ZeroTierOne/attic/world/mkworld.cpp", "w") as cpp:
|
||||
cpp.write(world)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
patch()
|
Loading…
Reference in New Issue
Block a user