diff --git a/README.md b/README.md index 8dc122c..f915e68 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,79 @@ -# frpc_spk_build -build frpc to spk package in synology dsm. +# frpc_spk_build 项目说明 +- build frpc to spk package in synology dsm. +- 将frpc打包成群晖的spk安装包,方便分享与传播. +- 集成了frpc版本:0.30.0 +- 群晖的打包除了官方环境的下载与部署之外,本身项目的spk构造也是很烦琐的一下事情,在本项目中我已将所有的构造文件写好,并push到了本项目中,可以直接一键打包. +- 同时,希望本项目对大家日后打其他spk包有参考作用 +- 感谢源项目:https://github.com/fatedier/frp + +# 打包环境构建 +## 1. clone或者下载本项目 +``` +git clone https://github.com/qiusanshiye/frpc_spk_build.git +``` + +## 2. 下载群晖官方打包工具 +``` +cd frpc_spk_build +git clone https://github.com/SynologyOpenSource/pkgscripts-ng.git +``` + +## 3. 部署群晖官方打包环境 +``` +cd pkgscripts-ng +./EnvDeploy -v 6.0 -p x64 +# 我这里部署的是群晖的 x64 架构的6.0版本的DSM环境 +# 注意:这里需要python环境,我这里用的是python2.7。其他版本未测试。 +``` +待部署完成后,目录结构会是这样: +``` +# tree -L 1 +. +├── build_env # 新增的目录,群晖的chroot打包签名环境 +├── gofrpc_build.sh +├── LICENSE +├── pkgscripts-ng # 第2步中下载的打包工具 +├── README.md +├── result_spk # 这个建议先手动创建,在打包之后会输出到这个目录 +├── source # 项目文件构造 +└── toolkit_tarballs # 新增的目录,群晖的打包环境镜像 +``` + +## 4. 生成spk签名证书 +``` +gpg --gen-key +cp -rf ~/.gnupg ./build_env/ds.x64-6.0/root/ +``` + +## 5. 开始一键打包 +- 先更新frpc最新版本 +> 在这里下载最新的frp包,解压后拷贝frpc到 ./source/gofrpc/bin/arch/目录下 +> 当前我已集成了frpc的0.30.0版本的程序 + +- 再更新想要打包的spk的版本号 +``` +vim source/gofrpc/INFO.sh +# 修改字段 version="1.0.1" +``` + +- 开始一键打包 +``` +./gofrpc_build.sh +# 没有出错的情况下会看到以下日志输出: +# [SUCCESS] PkgCreate.py -v 6.0 -p x64 -c gofrpc finished. +# 最终输出的spk路径:./build_env/ds.x64-6.0/image/packages/gofrpc-1.0.1.spk +# 也可以在这里找到: ./result_spk/gofrpc-1.0.1/ +# 接下就可以上群晖套件中心手动安装试试啦 +``` + +## 6. 环境部署与打包过程中可能会遇到的问题 +- 提示没有权限 +> 非root用户执行上述各步时,请使用 sudo 执行 + +- 群晖镜像无法下载或者太慢 +> 建议屏蔽工具中的下载逻辑:打开 pkgscripts-ng/EnvDeploy, 注释:urllib.request.urlretrieve(url, dest, reporthook=reporthook) 这一行(大概在86行) +> 在上述的第3步中执行EnvDeploy命令时,会输出下载链接,我们可以把用迅雷下载,完后拷贝到 toolkit_tarballs 目录。 +> 再次执行3步EnvDeploy命令即可. + +- 其他问题 +> 请移步[这里](http://blog.5941188.com/archives/%E7%BE%A4%E6%99%96%E5%A5%97%E4%BB%B6%E6%89%93%E5%8C%85) diff --git a/gofrpc_build.sh b/gofrpc_build.sh new file mode 100755 index 0000000..1b15fd8 --- /dev/null +++ b/gofrpc_build.sh @@ -0,0 +1,45 @@ +#!/bin/sh + +[ $# -lt 1 ] && { + echo "usage: $0 arch"; + echo -e "\tsupport list: monaco rtd1296 x64"; + #exit 1; +} + +SCRIPTPATH="${0%/*}" +cd ${SCRIPTPATH} +CURPATH="$(pwd)" + +APPNAME="gofrpc" + +PLATVER="6.0" +PLATFORM="${1:-x64}" + +### 实际编译环境 工程目录 +APPBUILDPATH="${CURPATH}/build_env/ds.${PLATFORM}-${PLATVER}/source" +[ -d "${APPBUILDPATH}" ] || { echo "invalid arch:${PLATFORM}"; exit 2; } +REALBUILDPATH="${APPBUILDPATH}/${APPNAME}" +mkdir -p ${REALBUILDPATH} 2>/dev/null + +### 可见编译环境 工程目录 +APPSRCPATH="${CURPATH}/source" +PROJTEMPLATE="${APPNAME}" + +### 编译脚本 +BUILDTOOLPATH="${CURPATH}/pkgscripts-ng" + +### 编译输出 +BUILDOUTPATH="${CURPATH}/build_env/ds.${PLATFORM}-${PLATVER}/image/packages" + +## 工程拷贝 +rm -rf ${REALBUILDPATH}/* +#cp -rf ${APPSRCPATH}/gofrpc_bin/${PLATFORM}/frpc ${APPSRCPATH}/${PROJTEMPLATE}/bin/ +#cp -rf ${APPSRCPATH}/gofrpc_bin/${PLATFORM}/frpc.ini ${APPSRCPATH}/${PROJTEMPLATE}/bin/ + +## build +rm -rf ${BUILDOUTPATH}/${APPNAME}*.spk +cd ${BUILDTOOLPATH} +python3 PkgCreate.py -v ${PLATVER} -p ${PLATFORM} -c ${APPNAME} #--print-log + +# list +ls -lhrt ${BUILDOUTPATH}/ diff --git a/source/gofrpc/INFO.sh b/source/gofrpc/INFO.sh new file mode 100755 index 0000000..efc7c73 --- /dev/null +++ b/source/gofrpc/INFO.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Copyright (c) 2000-2016 Synology Inc. All rights reserved. + +source /pkgscripts-ng/include/pkg_util.sh + +package="gofrpc" +version="1.0.1" +displayname="gofrpc" +dsmuidir="ui" +dsmappname="SYNO.SDS.gofrpc" +distributor="jie800@163.com" +maintainer="秋三十爷" +maintainer_url="http://blog.5941188.com" +helpurl="https://github.com/fatedier/frp" +arch="noarch" +#arch="$(pkg_get_unified_platform)" +firmware="6.0-5914" +os_min_ver="6.0-5914" +support_conf_folder="yes" +description="内网穿透神器--frpc,个人整合为spk包,自适应arm,arm64,x86,x64四个平台,支持网页配置,及提供了一些配置模板,供大家食用。当前frpc版本:0.30.0" +#silent_install="yes" +silent_upgrade="yes" +silent_uninstall="yes" +thirdparty="yes" +adminprotocol="http" +adminurl="static/#" +adminport="8760" +[ "$(caller)" != "0 NULL" ] && return 0 +pkg_dump_info diff --git a/source/gofrpc/PACKAGE_ICON.PNG b/source/gofrpc/PACKAGE_ICON.PNG new file mode 100644 index 0000000..4b8a610 Binary files /dev/null and b/source/gofrpc/PACKAGE_ICON.PNG differ diff --git a/source/gofrpc/PACKAGE_ICON_256.PNG b/source/gofrpc/PACKAGE_ICON_256.PNG new file mode 100644 index 0000000..afe2363 Binary files /dev/null and b/source/gofrpc/PACKAGE_ICON_256.PNG differ diff --git a/source/gofrpc/SynoBuildConf/build b/source/gofrpc/SynoBuildConf/build new file mode 100644 index 0000000..def4109 --- /dev/null +++ b/source/gofrpc/SynoBuildConf/build @@ -0,0 +1,3 @@ +#!/bin/bash + +echo "skip owapp make" diff --git a/source/gofrpc/SynoBuildConf/install b/source/gofrpc/SynoBuildConf/install new file mode 100644 index 0000000..40c5fcb --- /dev/null +++ b/source/gofrpc/SynoBuildConf/install @@ -0,0 +1,60 @@ +#!/bin/bash +# Copyright (C) 2000-2016 Synology Inc. All rights reserved. + +### Use PKG_DIR as working directory. +pkgname="gofrpc" +PKG_DIR="/tmp/_${pkgname}_spk" +rm -rf $PKG_DIR +mkdir -p $PKG_DIR + +### get spk packing functions +source /pkgscripts-ng/include/pkg_util.sh + +create_inner_tarball() { + local inner_tarball_dir=/tmp/_inner_tarball + + ### clear destination directory + rm -rf $inner_tarball_dir && mkdir -p $inner_tarball_dir + + ### install needed file into PKG_DIR + #make install DESTDIR="$inner_tarball_dir" + echo "==> create_inner_tarball.curpath: $(pwd)" + #cp -rf ${pkgname} ${inner_tarball_dir} || { echo "cp -rf ${pkgname} ${inner_tarball_dir} failed"; exit 1; } + cp -rf ./bin ${inner_tarball_dir}/ + cp -rf ./ui ${inner_tarball_dir}/ + cp -rf ./start.sh ${inner_tarball_dir}/ + cp -rf ./stop.sh ${inner_tarball_dir}/ + cp -rf ./config ${inner_tarball_dir}/ui/ + + ### create package.txz: $1=source_dir, $2=dest_dir + pkg_make_inner_tarball $inner_tarball_dir "${PKG_DIR}" || echo "pkg_make_inner_tarball $inner_tarball_dir ${PKG_DIR}" +} + +create_spk(){ + local scripts_dir=$PKG_DIR/scripts + local conf_dir=$PKG_DIR/conf + + ### Copy Package Center scripts to PKG_DIR + mkdir -p $scripts_dir || echo "mkdir -p \$scripts_dir failed" + mkdir -p $conf_dir || echo "mkdir -p \$conf_dir failed" + cp -av scripts/* $scripts_dir || echo "cp -av scripts/* \$scripts_dir failed" + cp -av conf/* $conf_dir || echo "cp -av conf/* \$conf_dir failed" + + ### Copy package icon + echo "==> create_spk.curpath: $(pwd)" + cp -av PACKAGE_ICON*.PNG $PKG_DIR || echo " cp -av PACKAGE_ICON*.PNG \$PKG_DIR failed" + + ### Generate INFO file + ./INFO.sh > INFO || echo "export info failed." + cp INFO $PKG_DIR/INFO || echo "cp INFO \$PKG_DIR/INFO failed" + + ### Create the final spk. + # pkg_make_spk + # Please put the result spk into /image/packages + # spk name functions: pkg_get_spk_name pkg_get_spk_unified_name pkg_get_spk_family_name + mkdir -p /image/packages || echo "mkdir -p /image/packages failed." + pkg_make_spk ${PKG_DIR} "/image/packages" $(pkg_get_spk_family_name) || echo "pkg_make_spk \${PKG_DIR} failed" +} + +create_inner_tarball +create_spk diff --git a/source/gofrpc/bin/arch/frpc_arm b/source/gofrpc/bin/arch/frpc_arm new file mode 100755 index 0000000..49ccd68 Binary files /dev/null and b/source/gofrpc/bin/arch/frpc_arm differ diff --git a/source/gofrpc/bin/arch/frpc_arm64 b/source/gofrpc/bin/arch/frpc_arm64 new file mode 100755 index 0000000..f8ca362 Binary files /dev/null and b/source/gofrpc/bin/arch/frpc_arm64 differ diff --git a/source/gofrpc/bin/arch/frpc_x64 b/source/gofrpc/bin/arch/frpc_x64 new file mode 100755 index 0000000..193ae59 Binary files /dev/null and b/source/gofrpc/bin/arch/frpc_x64 differ diff --git a/source/gofrpc/bin/arch/frpc_x86 b/source/gofrpc/bin/arch/frpc_x86 new file mode 100755 index 0000000..769f8db Binary files /dev/null and b/source/gofrpc/bin/arch/frpc_x86 differ diff --git a/source/gofrpc/bin/frpc.ini b/source/gofrpc/bin/frpc.ini new file mode 100644 index 0000000..8fa7cda --- /dev/null +++ b/source/gofrpc/bin/frpc.ini @@ -0,0 +1,24 @@ +[common] +admin_addr = 0.0.0.0 +admin_port = 8760 +server_addr = 47.111.117.185 +server_port = 2680 +token = 64590757cf05 + +#[template_ssh] +#type = tcp +#local_ip = 127.0.0.1 +#local_port = 22 +#remote_port = 50341 +# +#[template_web] +#type = http +#local_ip = 127.0.0.1 +#local_port = 5000 +#custom_domains = template.nas.config +# +#[template_frpc_web] +#type = http +#local_ip = 127.0.0.1 +#local_port = 8760 +#custom_domains = template.self.web.config diff --git a/source/gofrpc/bin/frpc_monitor b/source/gofrpc/bin/frpc_monitor new file mode 100644 index 0000000..d0b8d32 --- /dev/null +++ b/source/gofrpc/bin/frpc_monitor @@ -0,0 +1,47 @@ +#!/bin/sh + +SCRIPTPATH="${0%/*}" +cd "${SCRIPTPATH}/.." +APPPATH="$(pwd)" +APPNAME="frpc" +ARCHBINPATH="${APPPATH}/bin/arch" +BINPATH="${APPPATH}/bin/${APPNAME}" + +_arch_select() { + ${BINPATH} -v && return 0 + ls -1 ${ARCHBINPATH}/ | while read archbin + do + ${ARCHBINPATH}/${archbin} -v && { + ln -sf ${ARCHBINPATH}/${archbin} ${BINPATH} + break + } + done + [ -f ${BINPATHA} ] || return 2 +} + +_start() { + CONFPATH="${APPPATH}/bin/frpc.ini" + "${BINPATH}" -c "${CONFPATH}" >/dev/null & +} + +_stop() { + kill -9 "$(pidof ${APPNAME})" + kill -11 "$(pidof ${APPNAME})" +} + +_monitor() { + pidof "${APPNAME}" 2>/dev/null + if [ $? -ne 0 ] ; then + _stop + _start + fi +} + +## main start +inter=5 +_arch_select || exit 2 +while [ 1 -eq 1 ] +do + _monitor + sleep "${inter}" +done diff --git a/source/gofrpc/conf/PKG_DEPS b/source/gofrpc/conf/PKG_DEPS new file mode 100644 index 0000000..e69de29 diff --git a/source/gofrpc/conf/privilege b/source/gofrpc/conf/privilege new file mode 100644 index 0000000..903c301 --- /dev/null +++ b/source/gofrpc/conf/privilege @@ -0,0 +1,11 @@ +{ + "defaults":{ + "run-as": "package" + }, + "username": "ufrpc", + "ctrl-script": [{ + "action": "stop", + "run-as": "package" + }] +} + diff --git a/source/gofrpc/conf/resource b/source/gofrpc/conf/resource new file mode 100644 index 0000000..311847d --- /dev/null +++ b/source/gofrpc/conf/resource @@ -0,0 +1,2 @@ +{} + diff --git a/source/gofrpc/config b/source/gofrpc/config new file mode 100644 index 0000000..2d23a81 --- /dev/null +++ b/source/gofrpc/config @@ -0,0 +1,14 @@ +{ + ".url": { + "SYNO.SDS.gofrpc": { + "type": "url", + "allUsers": true, + "title": "frpc-群晖内网穿透", + "desc": "内网穿透神器,开源frpc,个人整合为spk包,供大家使用。", + "icon": "images/icon_{0}.png", + "protocol": "http", + "url": "/static/#", + "port": "8760" + } + } +} diff --git a/source/gofrpc/scripts/postinst b/source/gofrpc/scripts/postinst new file mode 100755 index 0000000..aea2061 --- /dev/null +++ b/source/gofrpc/scripts/postinst @@ -0,0 +1,7 @@ +#!/bin/sh + +# This script is run after the package files are transferred to @appstore. +# You can change the file permission and ownership in this script. + + +exit 0 diff --git a/source/gofrpc/scripts/postuninst b/source/gofrpc/scripts/postuninst new file mode 100755 index 0000000..8c725e5 --- /dev/null +++ b/source/gofrpc/scripts/postuninst @@ -0,0 +1,6 @@ +#!/bin/sh + +# This script is run after the package is removed from the system + + +exit 0 diff --git a/source/gofrpc/scripts/postupgrade b/source/gofrpc/scripts/postupgrade new file mode 100755 index 0000000..e4339e6 --- /dev/null +++ b/source/gofrpc/scripts/postupgrade @@ -0,0 +1,7 @@ +#!/bin/sh + +# Package Center will call this script after installing the new version of your package. + + +exit 0 + diff --git a/source/gofrpc/scripts/preinst b/source/gofrpc/scripts/preinst new file mode 100755 index 0000000..cdf8cbc --- /dev/null +++ b/source/gofrpc/scripts/preinst @@ -0,0 +1,7 @@ +#!/bin/sh + +# This script is run before the package files are transferred to @appstore. +# You can check if the installation requirements meet the DSM or package version, or if some services are enabled in this script. + + +exit 0 diff --git a/source/gofrpc/scripts/preuninst b/source/gofrpc/scripts/preuninst new file mode 100755 index 0000000..000cfc3 --- /dev/null +++ b/source/gofrpc/scripts/preuninst @@ -0,0 +1,5 @@ +#!/bin/sh + +# This script is run before the package is removed. + +exit 0 diff --git a/source/gofrpc/scripts/preupgrade b/source/gofrpc/scripts/preupgrade new file mode 100755 index 0000000..4c7686b --- /dev/null +++ b/source/gofrpc/scripts/preupgrade @@ -0,0 +1,6 @@ +#!/bin/sh + +# Package Center will call this script before uninstalling the old version of your package + +exit 0 + diff --git a/source/gofrpc/scripts/start-stop-status b/source/gofrpc/scripts/start-stop-status new file mode 100755 index 0000000..99651e5 --- /dev/null +++ b/source/gofrpc/scripts/start-stop-status @@ -0,0 +1,30 @@ +#!/bin/sh + +# This script is used to start and stop a package, detect running status, and generate the log file. +# Parameters used by the script are listed in below: start, stop, status + +PRIVATE_LOCATION="/var/packages/${SYNOPKG_PKGNAME}/target" +START_FILE="./start.sh" +STOP_FILE="./stop.sh" + + +case $1 in + start) + cd ${PRIVATE_LOCATION} + /bin/sh ${START_FILE} + ;; + stop) + cd ${PRIVATE_LOCATION} + (/bin/sh ${STOP_FILE} &) + ;; + status) + cd ${PRIVATE_LOCATION} + ret=$(ps -ef | grep frpc | grep -v 'grep') + if [ -n "${ret}" ]; then + exit 0 + else + exit 1 + fi + ;; +esac + diff --git a/source/gofrpc/start.sh b/source/gofrpc/start.sh new file mode 100755 index 0000000..1c98306 --- /dev/null +++ b/source/gofrpc/start.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +SCRIPTPATH="${0%/*}" +cd ${SCRIPTPATH} +APPPATH="$(pwd)" +APPNAME="frpc_" # char:_ should be set +MONINAME="frpc_monitor" + +_start() { + owpid="$(ps -ef | grep ${APPNAME} | grep -v 'grep' | awk '{print $2}')" + if [ -z "${owpid}" ]; then + MONIPATH="${APPPATH}/bin/${MONINAME}" + /bin/sh ${MONIPATH} > /dev/null 2>&1 & + fi +} + +_start +exit 0 diff --git a/source/gofrpc/stop.sh b/source/gofrpc/stop.sh new file mode 100755 index 0000000..ee30f4e --- /dev/null +++ b/source/gofrpc/stop.sh @@ -0,0 +1,14 @@ +#!/bin/sh + +SCRIPTPATH="${0%/*}" +cd ${SCRIPTPATH} +APPPATH="$(pwd)" +APPNAME="frpc" + +_stop() { + ps -ef | grep ${APPNAME}| grep -v 'stop' | grep -v 'grep' | awk '{print $2}' | xargs kill -9 +} + +_stop +_stop +exit 0 diff --git a/source/gofrpc/ui/images/icon_128.png b/source/gofrpc/ui/images/icon_128.png new file mode 100644 index 0000000..7986af7 Binary files /dev/null and b/source/gofrpc/ui/images/icon_128.png differ diff --git a/source/gofrpc/ui/images/icon_16.png b/source/gofrpc/ui/images/icon_16.png new file mode 100644 index 0000000..79f6778 Binary files /dev/null and b/source/gofrpc/ui/images/icon_16.png differ diff --git a/source/gofrpc/ui/images/icon_24.png b/source/gofrpc/ui/images/icon_24.png new file mode 100644 index 0000000..f9e6251 Binary files /dev/null and b/source/gofrpc/ui/images/icon_24.png differ diff --git a/source/gofrpc/ui/images/icon_256.png b/source/gofrpc/ui/images/icon_256.png new file mode 100644 index 0000000..afe2363 Binary files /dev/null and b/source/gofrpc/ui/images/icon_256.png differ diff --git a/source/gofrpc/ui/images/icon_32.png b/source/gofrpc/ui/images/icon_32.png new file mode 100644 index 0000000..1305688 Binary files /dev/null and b/source/gofrpc/ui/images/icon_32.png differ diff --git a/source/gofrpc/ui/images/icon_48.png b/source/gofrpc/ui/images/icon_48.png new file mode 100644 index 0000000..66e1af6 Binary files /dev/null and b/source/gofrpc/ui/images/icon_48.png differ diff --git a/source/gofrpc/ui/images/icon_64.png b/source/gofrpc/ui/images/icon_64.png new file mode 100644 index 0000000..e47994c Binary files /dev/null and b/source/gofrpc/ui/images/icon_64.png differ diff --git a/source/gofrpc/ui/images/icon_72.png b/source/gofrpc/ui/images/icon_72.png new file mode 100644 index 0000000..4b8a610 Binary files /dev/null and b/source/gofrpc/ui/images/icon_72.png differ