From 60cb088ed1287e4bdef12616c0c23fd9a4f69534 Mon Sep 17 00:00:00 2001 From: LoveesYe <109154433+LoveesYe@users.noreply.github.com> Date: Tue, 26 Jul 2022 22:50:49 +0200 Subject: [PATCH] Add files via upload --- web/api.php | 16 +++ web/config.php | 22 ++++ web/index.php | 91 ++++++++++++++++ web/master.sh | 249 ++++++++++++++++++++++++++++++++++++++++++++ web/monitor.php | 135 ++++++++++++++++++++++++ web/nginx伪静态.txt | 5 + web/update.php | 30 ++++++ web/version.json | 1 + 8 files changed, 549 insertions(+) create mode 100644 web/api.php create mode 100644 web/config.php create mode 100644 web/index.php create mode 100644 web/master.sh create mode 100644 web/monitor.php create mode 100644 web/nginx伪静态.txt create mode 100644 web/update.php create mode 100644 web/version.json diff --git a/web/api.php b/web/api.php new file mode 100644 index 0000000..67db44d --- /dev/null +++ b/web/api.php @@ -0,0 +1,16 @@ +0){ + foreach($param as $target){ + $result[] = node_monitor_local('1', $target); + } +} +$data = ['msg'=>$result]; +echo json_encode($data); \ No newline at end of file diff --git a/web/config.php b/web/config.php new file mode 100644 index 0000000..8e6ec70 --- /dev/null +++ b/web/config.php @@ -0,0 +1,22 @@ + [ + ['node_id'=>'1', 'type'=>'local'], //本地节点 + // ['node_id'=>'2', 'type'=>'remote', 'api'=>'http://www.example.com/api.php'], //远程节点,需填写监控接口地址 + ], + + //国外组 + 'group_2' => [ + ['node_id'=>'1', 'type'=>'local'], //本地节点 + // ['node_id'=>'2', 'type'=>'remote', 'api'=>'http://www.example.com/api.php'], //远程节点,需填写监控接口地址 + ], +]; \ No newline at end of file diff --git a/web/index.php b/web/index.php new file mode 100644 index 0000000..d0e2c00 --- /dev/null +++ b/web/index.php @@ -0,0 +1,91 @@ +time(), 'rnd'=>$param['rnd']]; + echo generate_output2($data); +} +elseif(strpos($url, '/auth2') !== false && $method=='POST'){ + $param = parse_input2(); + $data = ['nodes'=>99999, 'machine_code'=>$param['machine_code'], 'end_at'=>time()+3600*24*100*3650]; + echo generate_output2($data); +} +elseif(strpos($url, '/common/timestamp') !== false && $method=='POST'){ + $param = parse_input(); + $data = ['now'=>time(), 'rnd'=>$param['rnd']]; + echo generate_output($data); +} +elseif(strpos($url, '/auth') !== false && $method=='POST'){ + $param = parse_input(); + $data = ['nodes'=>99999, 'machine_code'=>$param['machine_code'], 'end_at'=>time()+3600*24*100*365]; + echo generate_output($data); +} +elseif(strpos($url, '/check') !== false && $method=='POST'){ + require 'config.php'; + require 'monitor.php'; + $post = file_get_contents('php://input'); + $param = json_decode($post, true); + $result = node_monitor_all($param); + $data = ['msg'=>$result]; + echo json_encode($data); +} +elseif(strpos($url, '/common/datetime') !== false && $method=='GET'){ + return date('Y-m-d H:i:s'); +} +elseif(strpos($url, '/master/upgrades') !== false){ + $version_data = file_get_contents('version.json'); + if(!$version_data) exit(json_encode(['code'=>-1, 'data'=>[], 'ip'=>$_SERVER['REMOTE_ADDR'], 'msg'=>'版本信息文件不存在'])); + $version_info = json_decode($version_data, true); + if(!$version_info) exit(json_encode(['code'=>-1, 'data'=>[], 'ip'=>$_SERVER['REMOTE_ADDR'], 'msg'=>'解析版本信息文件失败'])); + $data = ['code'=>0, 'count'=>1, 'data'=>[$version_info], 'ip'=>$_SERVER['REMOTE_ADDR']]; + echo json_encode($data); +} + + +function parse_input2(){ + $post = file_get_contents('php://input'); + $de_text = text_decrypt($post, get_aes_key()); + $param = json_decode($de_text, true); + return $param; +} +function generate_output2($data){ + $json = json_encode($data); + $cipher = text_encrypt($json, get_aes_key()); + $data = ['code'=>0, 'data'=>$cipher, 'msg'=>'']; + return json_encode($data); +} +function get_aes_key(){ + $key = trim($_GET['key']); + $aes_key = substr(md5($key.KEY_APPEND), 0, 16); + return $aes_key; +} +function parse_input(){ + $post = file_get_contents('php://input'); + $param = json_decode(text_decrypt($post, AES_KEY), true); + return $param; +} +function generate_output($data){ + $cipher = text_encrypt(json_encode($data), AES_KEY); + $data = ['code'=>0, 'data'=>$cipher, 'msg'=>'']; + return json_encode($data); +} +function text_encrypt($data, $key){ + return openssl_encrypt($data, 'aes-128-cbc', $key, 0, $key); +} +function text_decrypt($data, $key){ + return openssl_decrypt($data, 'aes-128-cbc', $key, 0, $key); +} diff --git a/web/master.sh b/web/master.sh new file mode 100644 index 0000000..72c6985 --- /dev/null +++ b/web/master.sh @@ -0,0 +1,249 @@ +#!/bin/bash + +set -o errexit + +#判断系统版本 +check_sys(){ + local checkType=$1 + local value=$2 + + local release='' + local systemPackage='' + local packageSupport='' + + if [[ "$release" == "" ]] || [[ "$systemPackage" == "" ]] || [[ "$packageSupport" == "" ]];then + + if [[ -f /etc/redhat-release ]];then + release="centos" + systemPackage="yum" + packageSupport=true + + elif cat /etc/issue | grep -q -E -i "debian";then + release="debian" + systemPackage="apt" + packageSupport=true + + elif cat /etc/issue | grep -q -E -i "ubuntu";then + release="ubuntu" + systemPackage="apt" + packageSupport=true + + elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat";then + release="centos" + systemPackage="yum" + packageSupport=true + + elif cat /proc/version | grep -q -E -i "debian";then + release="debian" + systemPackage="apt" + packageSupport=true + + elif cat /proc/version | grep -q -E -i "ubuntu";then + release="ubuntu" + systemPackage="apt" + packageSupport=true + + elif cat /proc/version | grep -q -E -i "centos|red hat|redhat";then + release="centos" + systemPackage="yum" + packageSupport=true + + else + release="other" + systemPackage="other" + packageSupport=false + fi + fi + + echo -e "release=$release\nsystemPackage=$systemPackage\npackageSupport=$packageSupport\n" > /tmp/ezhttp_sys_check_result + + if [[ $checkType == "sysRelease" ]]; then + if [ "$value" == "$release" ];then + return 0 + else + return 1 + fi + + elif [[ $checkType == "packageManager" ]]; then + if [ "$value" == "$systemPackage" ];then + return 0 + else + return 1 + fi + + elif [[ $checkType == "packageSupport" ]]; then + if $packageSupport;then + return 0 + else + return 1 + fi + fi +} + +# 安装依赖 +install_depend() { + if check_sys sysRelease ubuntu;then + apt-get update + apt-get -y install wget python-minimal + elif check_sys sysRelease centos;then + yum install -y wget python + fi +} + +get_sys_ver() { +cat > /tmp/sys_ver.py <",sys_ver) +if sys_ver.startswith("centos-7"): + sys_ver = "centos-7" +if sys_ver.startswith("centos-6"): + sys_ver = "centos-6" +print sys_ver +EOF +echo `python /tmp/sys_ver.py` +} + +download(){ + local url1=$1 + local url2=$2 + local filename=$3 + + # 检查文件是否存在 + # if [[ -f $filename ]]; then + # echo "$filename 文件已经存在,忽略" + # return + # fi + + speed1=`curl -m 5 -L -s -w '%{speed_download}' "$url1" -o /dev/null || true` + speed1=${speed1%%.*} + speed2=`curl -m 5 -L -s -w '%{speed_download}' "$url2" -o /dev/null || true` + speed2=${speed2%%.*} + echo "speed1:"$speed1 + echo "speed2:"$speed2 + url="$url1\n$url2" + if [[ $speed2 -gt $speed1 ]]; then + url="$url2\n$url1" + fi + echo -e $url | while read l;do + echo "using url:"$l + wget --dns-timeout=5 --connect-timeout=5 --read-timeout=10 --tries=2 "$l" -O $filename && break + done + + +} + +sync_time(){ + echo "start to sync time and add sync command to cronjob..." + + if check_sys sysRelease ubuntu || check_sys sysRelease debian;then + apt-get -y update + apt-get -y install ntpdate wget + /usr/sbin/ntpdate -u pool.ntp.org || true + ! grep -q "/usr/sbin/ntpdate -u pool.ntp.org" /var/spool/cron/crontabs/root > /dev/null 2>&1 && echo '*/10 * * * * /usr/sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1 || (date_str=`curl update.cdnfly.cn/common/datetime` && timedatectl set-ntp false && echo $date_str && timedatectl set-time "$date_str" )' >> /var/spool/cron/crontabs/root + service cron restart + elif check_sys sysRelease centos; then + yum -y install ntpdate wget + /usr/sbin/ntpdate -u pool.ntp.org || true + ! grep -q "/usr/sbin/ntpdate -u pool.ntp.org" /var/spool/cron/root > /dev/null 2>&1 && echo '*/10 * * * * /usr/sbin/ntpdate -u pool.ntp.org > /dev/null 2>&1 || (date_str=`curl update.cdnfly.cn/common/datetime` && timedatectl set-ntp false && echo $date_str && timedatectl set-time "$date_str" )' >> /var/spool/cron/root + service crond restart + fi + + # 时区 + rm -f /etc/localtime + ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime + + if /sbin/hwclock -w;then + return + fi + + +} + +need_sys() { + SYS_VER=`python -c "import platform;import re;sys_ver = platform.platform();sys_ver = re.sub(r'.*-with-(.*)-.*','\g<1>',sys_ver);print sys_ver;"` + if [[ $SYS_VER =~ "Ubuntu-16.04" ]];then + echo "$sys_ver" + elif [[ $SYS_VER =~ "centos-7" ]]; then + SYS_VER="centos-7" + echo $SYS_VER + else + echo "目前只支持ubuntu-16.04和Centos-7" + exit 1 + fi +} + +install_depend +need_sys +sync_time + +# 解析命令行参数 +TEMP=`getopt -o h --long help,ver:,no-mysql,only-mysql,no-es,only-es,master-ip:,es-ip:,es-dir:,es-pwd:,mysql-ip:,ignore-ntp -- "$@"` +if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi +eval set -- "$TEMP" + +while true ; do + case "$1" in + -h|--help) help ; exit 1 ;; + --ver) VER=$2 ; shift 2 ;; + --) shift ; break ;; + *) break ;; + esac +done + +if [[ $VER == "" ]]; then + # 获取最新版本 + echo "获取最新版..." + latest_version=`curl -s 'http://auth.fikkey.com/master/upgrades?latest=1' | grep -Po 'v\d+\.\d+.\d+' || true` + if [[ "$latest_version" == "" ]]; then + echo "获取最新版失败,请先登录官网填入主控IP" + exit 1 + fi + + echo "最新版本为$latest_version" + dir_name="cdnfly-master-$latest_version" + tar_gz_name="$dir_name-$(get_sys_ver).tar.gz" + +else + # 安装指定版本 + if [[ ! `echo "$VER" | grep -P "^v\d+\.\d+\.\d+$"` ]]; then + echo "指定的版本格式不正确,应该类似为v4.0.1" + exit 1 + fi + + dir_name="cdnfly-master-$VER" + tar_gz_name="$dir_name-$(get_sys_ver).tar.gz" + echo "安装指定版本$VER" +fi + +cd /opt/ +download "https://github.com/LoveesYe/cdnflydadao/raw/main/master/$tar_gz_name" "https://github.com/LoveesYe/cdnflydadao/raw/main/master/$tar_gz_name" "$tar_gz_name" + +tar xf $tar_gz_name +rm -rf cdnfly +mv $dir_name cdnfly + +# 开始安装 +cd /opt/cdnfly/master +sed -i "s/https:\/\/dl2.cdnfly.cn\//http:\/\/auth.cdnfly.cn\//g" install.sh +sed -i "s/https:\/\/us.centos.bz\//http:\/\/auth.cdnfly.cn\//g" install.sh +sed -i "s/http:\/\/auth.cdnfly.cn\/cdnfly\/elasticsearch-7.6.1-x86_64.rpm/https:\/\/artifacts.elastic.co\/downloads\/elasticsearch\/elasticsearch-7.6.1-x86_64.rpm/g" install.sh +sed -i "s/http:\/\/auth.cdnfly.cn\/cdnfly\/elasticsearch-7.6.1-amd64.deb/https:\/\/artifacts.elastic.co\/downloads\/elasticsearch\/elasticsearch-7.6.1-amd64.deb/g" install.sh +chmod +x install.sh +./install.sh $@ + +if [ -f /opt/cdnfly/master/view/upgrade.so ]; then + wget https://github.com/LoveesYe/cdnflydadao/raw/main/cdnfly/api.py -O /opt/venv/lib/python2.7/site-packages/requests/api.py + supervisorctl -c /opt/cdnfly/master/conf/supervisord.conf reload + + source /opt/venv/bin/activate + cd /opt/cdnfly/master/view + ret=`python -c "import util;print util.get_auth_code()" || true` + [[ $ret == "(True, None)" ]] && echo "已获取到授权" || echo "未授权,请先购买" + deactivate + + echo "安装主控成功!" +fi + diff --git a/web/monitor.php b/web/monitor.php new file mode 100644 index 0000000..a38595b --- /dev/null +++ b/web/monitor.php @@ -0,0 +1,135 @@ + 0 && count($target_group_1) > 0){ + foreach($monitor_config['group_1'] as $node){ + if($node['type'] == 'local'){ + foreach($target_group_1 as $target){ + $result[] = node_monitor_local($node['node_id'], $target); + } + }elseif($node['type'] == 'remote'){ + $result = array_merge($result, node_monitor_remote($node['node_id'], $node['api'], $target_group_1)); + } + } + } + if(count($monitor_config['group_2']) > 0 && count($target_group_2) > 0){ + foreach($monitor_config['group_2'] as $node){ + if($node['type'] == 'local'){ + foreach($target_group_2 as $target){ + $result[] = node_monitor_local($node['node_id'], $target); + } + }elseif($node['type'] == 'remote'){ + $result = array_merge($result, node_monitor_remote($node['node_id'], $node['api'], $target_group_2)); + } + } + } + return $result; +} + +//批量执行远程监控 +function node_monitor_remote($node_id, $apiurl, $targets){ + $json = json_encode($targets); + $data = send_request($apiurl, $json); + $arr = json_decode($data, true); + if(!$arr || !isset($arr['msg'])) return []; + $result = []; + foreach($arr['msg'] as $target){ + $target['node_id'] = $node_id; + $result[] = $target; + } + return $result; +} + +//单个执行本地监控 +function node_monitor_local($node_id, $target){ + $status = false; + if($target['type'] == 'http'){ + $status = check_http($target['target'], $target['port'], $target['path'], $target['host'], $target['timeout']); + }elseif($target['type'] == 'ping'){ + $status = check_ping($target['target'], $target['port'], $target['timeout']); + }else{ //tcp + $status = check_tcp($target['target'], $target['port'], $target['timeout']); + } + return ['node_id'=>$node_id, 'success'=>$status?1:0, 'target'=>$target['target']]; +} + +function check_http($target, $port, $path, $host = '', $timeout = 3){ + if($timeout > 3) $timeout = 3; + if(!$port) $port = 80; + if(!$path) $path = '/'; + if($port == 80){ + $url = 'http://'.$target.$path; + }else{ + $url = 'http://'.$target.':'.$port.$path; + } + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + $httpheader[] = "Accept: */*"; + $httpheader[] = "Accept-Language: zh-CN,zh;q=0.8"; + $httpheader[] = "Connection: close"; + if(!empty($host)){ + $httpheader[] = "Host: ".$host; + } + curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); + curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); + curl_exec($ch); + $errno = curl_errno($ch); + if($errno) { + curl_close($ch); + return false; + } + $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + if($httpcode>=200 && $httpcode<400){ + return true; + } + return false; +} + +function check_tcp($target, $port, $timeout = 3){ + if($timeout > 3) $timeout = 3; + if(!$port) $port = 80; + $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); + socket_set_nonblock($sock); + socket_connect($sock, $target, $port); + socket_set_block($sock); + $status = socket_select($r = array($sock), $w = array($sock), $f = array($sock), $timeout); + return $status === 1; +} + +function check_ping($target, $port, $timeout = 2){ + if(!function_exists('exec') || PHP_OS == 'WINNT') return check_tcp($target, $port, $timeout); + if($timeout > 2) $timeout = 2; + exec('ping -c 1 -w '.$timeout.' '.$target.' > /dev/null', $output, $return_var); + if($return_var === 0) return true; + return false; +} + +function send_request($url, $json){ + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_POST, true); + curl_setopt($ch, CURLOPT_POSTFIELDS, $json); + curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json; charset=utf-8']); + $ret = curl_exec($ch); + curl_close($ch); + return $ret; +} \ No newline at end of file diff --git a/web/nginx伪静态.txt b/web/nginx伪静态.txt new file mode 100644 index 0000000..d64dcc8 --- /dev/null +++ b/web/nginx伪静态.txt @@ -0,0 +1,5 @@ +location / { + if (!-e $request_filename){ + rewrite ^(.*)$ /index.php/$1 last; break; + } +} \ No newline at end of file diff --git a/web/update.php b/web/update.php new file mode 100644 index 0000000..710f5a8 --- /dev/null +++ b/web/update.php @@ -0,0 +1,30 @@ +