auto.sh 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #!/bin/base
  2. PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  3. export PATH
  4. #宝塔代码路径
  5. panel_path="/www/server/panel"
  6. bt_path=''
  7. #php的路径
  8. php_path=''
  9. #当前项目路径
  10. root_path=$(pwd);
  11. #脚本当前使用的 php 版本;
  12. version=''
  13. _php=0.0
  14. #获取项目类型
  15. projct=''
  16. #各项目可用的 php 版本
  17. declare -A projct_allow_phps=(
  18. ["mer"]="71 72 73 74"
  19. ["mul"]="71 72 73 74"
  20. ["pro"]="80"
  21. )
  22. #各项目的label
  23. declare -A crmeb_label=(
  24. ["mer"]="10"
  25. ["mul"]="3"
  26. ["pro"]="42"
  27. )
  28. api='http://authorize.crmeb.net/api/auth_cert_query'
  29. #获取宝塔的调用地址
  30. function get_bt_parot(){
  31. port=$(head -n +1 "$panel_path"'/data/port.pl')
  32. bt_path='https://0.0.0.0:'$port
  33. }
  34. ##
  35. #获取 php 版本
  36. ##
  37. function get_php_version(){
  38. # 允许 PHP 的版本
  39. phps_string="${projct_allow_phps[$projct]}"
  40. echo
  41. echo -e "\033[0;32m | -------------------------------------------- \033[0m"
  42. echo -e "\033[0;32m | 如果需要指定PHP版本请输入 "$phps_string" \033[0m"
  43. echo -e "\033[0;32m | 不指定 PHP 版本号将直接获取命令行 PHP 版本号 \033[0m"
  44. echo -e "\033[0;32m | -------------------------------------------- \033[0m"
  45. echo -e "\033[0;32m | 是否需要指定PHP版本,不指定直接回车 ? \033[0m"
  46. read u_php
  47. if [ ! $u_php ] ; then
  48. is_success "未指定 PHP 版本号将直接获取命令行 PHP 版本号"
  49. #获取当前服务器命令行的 php 版本
  50. _php=$(php -v | head -n 1 | cut -d " " -f 2|cut -d "." -f 1,2);
  51. u_php="${_php//./}"
  52. is_success "您当前的命令行PHP 版本为:$u_php"
  53. else
  54. is_success "指定 PHP 版本为 $u_php"
  55. fi
  56. IFS=" " read -r -a allow_phps <<< "$phps_string"
  57. for element in "${allow_phps[@]}"
  58. do
  59. # 检查当前元素是否与在循序的 php 版本中
  60. [ "$element" = "$u_php" ] && version=$u_php
  61. done
  62. if [ ! $version ]; then
  63. is_error "PHP 版本为:$u_php,暂不支持该版本"
  64. fi
  65. php_path='/www/server/php/'$version
  66. }
  67. ##
  68. #检查 php 扩展
  69. ##
  70. function check_php_extension(){
  71. [ ! $php_path ] && is_error '未获取到 PHP 版本号,停止执行'
  72. need_extensions=('swoole' 'swoole_loader' 'fileinfo' 'redis' 'zip')
  73. install=false
  74. for extension in "${need_extensions[@]}";
  75. do
  76. if php -m | grep -q "^$extension$" ; then
  77. is_success "$extension 扩展存在"
  78. else
  79. if [ $extension == 'swoole_loader' ] ; then
  80. install=true
  81. else
  82. is_error "$extension扩展不存在,请在宝塔界面操作安装;参考文档:https://doc.crmeb.com/mer/mer2/7314"
  83. fi
  84. fi
  85. done
  86. [ $install == 'true' ] && install_swoole_laoder
  87. }
  88. ##
  89. # 安装 swoole_loader
  90. ##
  91. function install_swoole_laoder(){
  92. echo '需要安装 swoole_loader,开始处理'
  93. echo '>>>>>>>>>>>>>>>>>>>>>>'
  94. #sleep 3
  95. if [ $version == 'false' ]; then
  96. get_php_version
  97. fi
  98. # 使用php-config命令获取PHP的配置信息
  99. php_config=$(/www/server/php/$version/bin/php-config --configure-options)
  100. # 在配置信息中搜索线程安全选项
  101. if grep -q -- '--enable-maintainer-zts' <<< "$php_config"; then
  102. name='swoole_loader'$version'_zts.so';
  103. name1='swoole_loader'$version'.so';
  104. else
  105. name='swoole_loader'$version'.so';
  106. name1='swoole_loader'$version'_zts.so';
  107. fi
  108. mv_swoole_loader $name
  109. if php -m | grep -q "swoole_loader" ; then
  110. is_success "$extension 扩展已安装成功"
  111. else
  112. echo "swoole_loader安装失败,开始尝试重新安装"
  113. echo '>>>>>>>>>>>>>>>>>>>>>>'
  114. mv_swoole_loader $name1
  115. ! php -m | grep -q "swoole_loader" && is_error '重新安装尝试失败,请尝试其他方法'
  116. fi
  117. is_success '操作完成'
  118. }
  119. ##
  120. # 获取swooel—loader 原文件地址
  121. ##
  122. function get_loader_path(){
  123. if [ $projct == 'mer' ] ; then
  124. #swoole_loader存放地址
  125. swoole_loader_path=$root_path'/install/swoole-loader'
  126. else
  127. #swoole_loader存放地址
  128. swoole_loader_path=$root_path'/help/swoole_loader'
  129. fi
  130. }
  131. ##
  132. # 移动扩展
  133. ##
  134. function mv_swoole_loader(){
  135. get_loader_path
  136. swoole_loader_name=$1
  137. swoole_loader_fiel=$swoole_loader_path"/$swoole_loader_name"
  138. [ ! -f $swoole_loader_fiel ] && is_error "$swoole_loader_fiel,文件不存在,请讲当前脚本放置项目代码根目录,在重新执行。"
  139. ext_name=$(ls $php_path"/lib/php/extensions")
  140. if [ ! -f $php_path"/lib/php/extensions/$ext_name/$swoole_loader_name" ]; then
  141. /bin/cp $swoole_loader_fiel $php_path"/lib/php/extensions/"$ext_name
  142. fi
  143. sed -i '/swoole_loader/d' $php_path/etc/php.ini
  144. if [ -f $php_path/etc/php-cli.ini ]; then
  145. sed -i '/swoole_loader/d' $php_path/etc/php-cli.ini
  146. fi
  147. echo -e "\nextension = $swoole_loader_name\n" >>$php_path/etc/php.ini
  148. if [ -f $php_path/etc/php-cli.ini ]; then
  149. echo -e "\nextension = $swoole_loader_name\n" >>$php_path/etc/php-cli.ini
  150. fi
  151. service php-fpm-$version reload
  152. }
  153. ##
  154. # 替换加密文件
  155. ##
  156. function change_encypt(){
  157. [ ! $php_path ] && is_error '未获取到 PHP 版本号,停止执行'
  158. is_success '开始处理加密文件'
  159. echo '尝试关闭 swoole'
  160. php$version think swoole stop
  161. if [ $projct == 'mer' ] ;then
  162. encypt_name="compiled$version.zip"
  163. encypt=$root_path/install/compiled/$encypt_name
  164. [ ! -f $encypt ] && is_error "加密文件不存在:$encypt"
  165. cp -f $encypt "$root_path/crmeb"
  166. unzip -q -o $root_path/crmeb/$encypt_name -d $root_path/crmeb && mv $root_path/crmeb/crmeb.php $root_path/config
  167. is_success '加密文件已替换,尝试重启 swoole'
  168. [ ! -d $root_path'/runtime' ] && mkdir $root_path'/runtime'
  169. php$version think swoole restart
  170. else
  171. encypt=$root_path/help/$_php
  172. [ ! -d $encypt ] && is_error "没有符合版本的加密文件【$_php】"
  173. cp -Rf "$encypt"/* $root_path
  174. php$version think swoole
  175. fi
  176. }
  177. function is_success(){
  178. echo -e "\033[0;32m | $1 \033[0m"
  179. }
  180. function is_error(){
  181. echo -e "\033[0;31m -------------------------------------------- \033[0m"
  182. echo -e "\033[0;31m |错误|:$1 \033[0m"
  183. echo -e "\033[0;31m -------------------------------------------- \033[0m"
  184. exit 0 ;
  185. }
  186. ##
  187. # 获取当前项目所属产品
  188. ##
  189. function __init(){
  190. [ ! -f "$panel_path"'/data/port.pl' ] && is_error "当前脚本仅限于在宝塔环境中使用"
  191. if [ ! -f "./.version" ];then
  192. echo -e "\033[0;31m
  193. 未读取到.version文件;
  194. 检查是否目录错误:请将此脚本移动到项目目录下,例如:/www/wwwroot/crmeb.net;
  195. 是否删除了.version文件:请将源码中的.version文件复制到项目根目录即可;
  196. 重新执行脚本,命令:bash auto.sh;
  197. \033[0m"
  198. exit 0
  199. fi
  200. code_version=$(head -n +1 ./.version)
  201. string=${code_version##*=} # 去掉等号及其前面的内容
  202. # 判断版本类型
  203. if [[ $string == *"CRMEB-PRO-S"* ]]; then
  204. projct="pro"
  205. elif [[ $string == *"CRMEB-MER-M"* ]]; then
  206. projct="mul"
  207. elif [[ $string == *"CRMEB-MER"* ]]; then
  208. projct="mer"
  209. else
  210. is_error "无法确定 CRMEB 项目类型或未安装指定版本"
  211. fi
  212. is_success "获取当前项目为:"$projct
  213. }
  214. ##
  215. # swoole_loader安装
  216. ##
  217. function swoole_loader(){
  218. __init
  219. get_php_version
  220. check_php_extension
  221. is_success "完成"
  222. exit 0;
  223. }
  224. ##
  225. # 加密文件替换
  226. ##
  227. function encypt(){
  228. __init
  229. get_php_version
  230. change_encypt
  231. exit 0;
  232. }
  233. ##
  234. # 授权域名失败检测
  235. ##
  236. function auth(){
  237. __init
  238. echo
  239. echo -e "\033[0;32m | -------------------------------------------- \033[0m"
  240. echo -e "\033[0;32m | 请输入授权域名,例如:crmeb.net \033[0m"
  241. echo -e "\033[0;32m | 如果当前文件夹【目录名】就是【授权域名】直接回车 ? \033[0m"
  242. if [ ! -f "$root_path/cert_public.pam" ] ; then
  243. echo "-----BEGIN PUBLIC KEY-----
  244. MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu8tEgg4uBv72HX7/24YNJIuCs
  245. pcYHOemMx2wyh72Ke9uRs36pQaSF7IvrVjXc1AL5GeFzQRGi80hcNu46tTPSNKlt
  246. cakkPgFkanVNjkTkhdxrcOUSEce1WxdMSaM7rZFm3CfK0vGWQSVUZvIgUxjlCcqS
  247. EyMvmfS9o4kGAVlBLQIDAQAB
  248. -----END PUBLIC KEY-----
  249. " >> $root_path/cert_public.pam
  250. fi
  251. read host
  252. [ ! $host ] && host=$(basename "$(pwd)")
  253. label="${crmeb_label[$projct]}"
  254. [ ! $label ] && is_error "未找到对应项目label,请检查版本信息"
  255. param="domain_name=$host&label=$label"
  256. [ -f "$root_path/crmeb_cert_key.json" ] && rm -f "$root_path/crmeb_cert_key.json"
  257. request $api 'POST' "$param" 'crmeb_cert_key.json'
  258. exit 0
  259. }
  260. ##
  261. # 发起请求
  262. ##
  263. function request(){
  264. url=$1
  265. methon=$2
  266. param=$3
  267. fiel_name=$4
  268. curl -s -X $methon -d $param $url > $fiel_name
  269. python_script=$(cat <<EOF
  270. import json
  271. # 读取 JSON 文件
  272. with open('$fiel_name', 'r') as f:
  273. data = json.load(f)
  274. # 获取 data 字段下的内容
  275. data_content = data['data']
  276. if data_content['status'] == -1 :
  277. msg = data_content['msg']
  278. else:
  279. auto_content = data_content['auto_content']
  280. auth_code = data_content['auth_code']
  281. msg = auto_content + ',' + auth_code
  282. # 输出处理结果
  283. print(msg)
  284. EOF
  285. )
  286. _command=python
  287. if python3 --version &> /dev/null; then
  288. _command=python3
  289. fi
  290. msg=$($_command -c "$python_script")
  291. if [ $msg == '您尚未提交授权申请!' ]; then
  292. is_error "$msg:$url"
  293. else
  294. echo $msg > cert_crmeb.key
  295. is_success "已重新获取证书"
  296. fi
  297. }
  298. #------------------------------------------------------------------------------------------------------------------------------------#
  299. while getopts "sek" arg;
  300. do
  301. case $arg in
  302. s )
  303. swoole_loader
  304. ;;
  305. e )
  306. encypt
  307. ;;
  308. k )
  309. auth
  310. ;;
  311. ? )
  312. echo -e "\033[0;32m
  313. 执行需请携带参数 例:/bin/bash auto.sh -s
  314. -e 检查替换加密文件
  315. -s 检查安装swoole_loader
  316. -k 授权失败验证
  317. \033[0m"
  318. exit 0;
  319. ;;
  320. esac
  321. done
  322. echo "
  323. +----------------------------------------------------------------------
  324. | 此脚本仅适用于:宝塔面板所安装的PHP 7.1,7.2,7.3,7.4 8.0版本
  325. +----------------------------------------------------------------------
  326. | 脚本执行目录:请将脚本放在需要运行的项目根目录,例如:/www/wwwroot/crmeb.com
  327. +----------------------------------------------------------------------
  328. | 远程下载执行: wget -O auto.sh https://mer.crmeb.net/auto.sh && /bin/bash auto.sh -s
  329. +----------------------------------------------------------------------
  330. | 执行需请携带参数 ,例:/bin/bash auto.sh -k(授权失败验证)
  331. | -e 检查替换加密文件
  332. | -s 检查安装swoole_loader
  333. | -k 授权失败验证
  334. +----------------------------------------------------------------------
  335. "