├── README.md ├── package.json ├── index.html └── server.js /README.md: -------------------------------------------------------------------------------- 1 | # CloudAtCostAutoAPI 2 | 3 | 调用CAC官方的API执行一些简便的操作。 4 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cloudatcost-auto-restart", 3 | "version": "1.0.0", 4 | "author": "Tua", 5 | "description": "", 6 | "dependencies": { 7 | "express": "4.*", 8 | "request": "*", 9 | "body-parser": "*", 10 | "querystring": "*", 11 | "async": "*", 12 | "ping": "*" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | CloudAtCost接口调用 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |

CloudAtCost接口调用

18 |
19 |
20 |

21 | 该脚本调用CloudAtCost官方API接口执行操作。 22 | 机器网络通了以后,请将IP白名单删除,重新生成一个API KEY。 23 | 更多内容:http://51.ruyo.net/p/1735.html 24 |

25 | 26 |
27 |
28 | API调用参数(请先参考下文,参数的获取方式) 29 | 30 |
31 |
32 | 33 | 34 |
35 | 36 |
37 | 38 | 39 |
40 | 41 |
42 | 43 | 44 |
45 |
46 |
47 | 48 | 49 | 50 |
51 |

实时日志

52 | 53 |

54 | 【反复重启】每1分钟调用一次,IP能PING通后会自动停止。多台实例请多开几个网页即可。关闭网页立即停止。 55 |

56 |

57 | 【删除机器】某些长期处于Pending状态的机器,直接删除。 58 |

59 |

60 | 【一键检查所有异常机器】关机以及无法PING通批量检查。 61 |

62 |
63 |
64 |

创建KEY,添加IP白名单

65 |

66 | Setting -> 创建API KEY -> API ACCECC IP 填写 64.137.170.40 -> 点击UPDATE 67 |

68 | 69 | 70 |

查看Server ID

71 |

72 | 打开主页,单击服务器 [i]图标处,可见Server ID 73 |

74 | 75 |
76 | 77 | 78 | 101 |
102 | 103 | 185 | 186 | 187 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var request = require('request'); 3 | var bodyParser = require('body-parser'); 4 | var fs = require('fs'); 5 | var url = require("url"); 6 | var querystring = require("querystring"); 7 | var ping = require("ping"); 8 | var async = require("async"); 9 | 10 | var app = express(); 11 | app.use(bodyParser.urlencoded({ extended: false })); 12 | 13 | //远程请求地址 14 | var restart_url = 'https://panel.cloudatcost.com/api/v1/powerop.php'; 15 | var delete_url = 'https://panel.cloudatcost.com/api/v1/delete.php'; 16 | var allserver_url = 'https://panel.cloudatcost.com/api/v1/listservers.php'; 17 | var change_mode_url = 'https://panel.cloudatcost.com/api/v1/runmode.php'; 18 | 19 | 20 | app.listen(18080); 21 | 22 | //关闭服务器 23 | function stop_server(key, login, sid, callback) { 24 | request.post({ url: restart_url, form: { key: key, login: login, sid: sid,action:'poweroff' } }, 25 | function (err, res, body) { 26 | if (!err && res.statusCode == 200) { 27 | try 28 | { 29 | var info = JSON.parse(body); 30 | return callback(null, info.status == 'ok'); 31 | }catch(e){ 32 | return callback('未知错误', !1); 33 | } 34 | } 35 | callback(err); 36 | }) 37 | } 38 | 39 | //启动服务器 40 | function start_server(key, login, sid, callback){ 41 | request.post({ url: restart_url, form: { key: key, login: login, sid: sid,action:'poweron' }},function(err, res, body){ 42 | var info = JSON.parse(body); 43 | console.log(info); 44 | return callback(null, info.status == 'ok'); 45 | }); 46 | } 47 | 48 | //PING IP 49 | function check_ping(ip, callback) { 50 | ping.sys.probe(ip, function (isAlive) { 51 | return callback(null, isAlive) 52 | }); 53 | } 54 | 55 | //修改运行模式为普通 56 | function change_mode(key,login,sid,callback){ 57 | request.post({ url: change_mode_url, form: { key: key, login: login, sid: sid,mode:'normal' }},function(err, res, body){ 58 | try{ 59 | var info = JSON.parse(body); 60 | if(info.status === 'ok') 61 | return callback(null, info.status == 'ok'); 62 | else 63 | return callback(info.status == 'ok'); 64 | }catch(e) 65 | { 66 | return callback(e,null); 67 | } 68 | }); 69 | } 70 | 71 | function check_all_servers(login,key, callback){ 72 | request.get(allserver_url + "?login=" + login + "&key=" + key, function (err, res, body) { 73 | console.log(body); 74 | if (!err && res.statusCode == 200) { 75 | var info; 76 | try{ 77 | info = JSON.parse(body); 78 | }catch(e){ 79 | console.log(e); 80 | return cb('error : ' + e,null); 81 | } 82 | var arr = []; 83 | var off = []; 84 | var uping = []; 85 | async.each(info.data,function(server,cb){ 86 | if(server.status == "Powered Off") 87 | { 88 | off.push({sid:server.id,ip:server.ip,status:server.status}); 89 | cb(null); 90 | }else if(server.status == "Powered On") 91 | { 92 | check_ping(server.ip,function (err, isok){ 93 | if(err || !isok) 94 | uping.push({sid:server.id,ip:server.ip,status:'ping error'}); 95 | cb(null) 96 | }); 97 | }else 98 | cb(null); 99 | },function(err) { 100 | callback(err,{pownoff:off,unping:uping}) 101 | }); 102 | }else 103 | callback('cac api request error',null); 104 | }); 105 | 106 | } 107 | 108 | function is_server_finish(key, login, sid, callback) { 109 | request.get(allserver_url + "?login=" + login + "&key=" + key, function (err, res, body) { 110 | console.log(body); 111 | if (!err && res.statusCode == 200) { 112 | try 113 | { 114 | var info = JSON.parse(body); 115 | for (var i in info.data) { 116 | var server = info.data[i]; 117 | if (server.sid == sid){ 118 | callback(null, server.status == "Powered On" ? 1 : server.status == "Powered Off" ? 2 : 0, server.ip); 119 | return; 120 | } 121 | } 122 | }catch(e) 123 | { 124 | console.log(e); 125 | } 126 | return callback('can not find server sid = ' + sid, !!0); 127 | }else 128 | return callback(err); 129 | }); 130 | } 131 | 132 | 133 | function delete_server(key,login,sid,callback){ 134 | request.post({ url: delete_url, form: { key: key, login: login, sid: sid}},function(err, res, body){ 135 | var info = JSON.parse(body); 136 | return callback(null, info.status == 'ok'); 137 | }); 138 | } 139 | 140 | function success_ip(msg){ 141 | fs.appendFile('./log.txt',msg,'utf8',function(err){ 142 | if(err){console.log(err);}}); 143 | } 144 | 145 | app.get("/cac/check", function (req, res) { 146 | var objectUrl = url.parse(req.url); 147 | var objectQuery = querystring.parse(objectUrl.query); 148 | sid = objectQuery.sid; 149 | login = objectQuery.login; 150 | key = objectQuery.key; 151 | is_server_finish(key, login, sid, function (err, flag, ip) { 152 | if (!err && flag > 0) { 153 | //已经关机,发送开机指令 154 | if(flag == 2){ 155 | start_server(key, login, sid, function () { 156 | console.log('SID:' + sid + ' IP:' + ip +' 服务器已关机,已经发送开机指令'); 157 | res.jsonp({ err_code: 1, status: 0, msg: '服务器已经关机,已经发送开机命令' }); 158 | }); 159 | return; 160 | } 161 | check_ping(ip, function (err, isok) { 162 | if (isok){ 163 | console.log('SID:' + sid + ' IP:' + ip +' 服务器网络通了'); 164 | //success_ip(new Date().toLocaleString() + ' ::: ' + IP + '成功PING通'); 165 | res.jsonp({ err_code: 0, status: 1, msg: '服务器网络已经好了,访问:http://ping.chinaz.com/'+ ip + '查看' }); 166 | return; 167 | } 168 | else{ 169 | stop_server(key, login, sid, function () { 170 | console.log('SID:' + sid + ' IP:' + ip +' 服务器重启成功,但是网络不通,已发送关机命令'); 171 | res.jsonp({ err_code: 1, status: 0, msg: '服务器重启成功,但是网络不通,已发送关机命令' }); 172 | return; 173 | }); 174 | } 175 | }) 176 | } 177 | else{ 178 | console.log('SID:' + sid + ' IP:' + ip +' 服务器处于启动中,请骚等......'); 179 | res.jsonp({ err_code: 3, status: 0, msg: '服务器处于启动中,请骚等......' }); 180 | return; 181 | } 182 | }); 183 | }); 184 | 185 | app.get('/cac/delete',function(req,res){ 186 | var objectUrl = url.parse(req.url); 187 | var objectQuery = querystring.parse(objectUrl.query); 188 | sid = objectQuery.sid; 189 | login = objectQuery.login; 190 | key = objectQuery.key; 191 | delete_server(sid,login,key,function(err){ 192 | console.log('SID:' + sid +' 已发送删除命令'); 193 | return res.jsonp({ err_code: 1, status: 0, msg: ' 已发送删除命令' }) 194 | }); 195 | }); 196 | 197 | app.get('/cac/checkall',function(req,res){ 198 | var objectUrl = url.parse(req.url); 199 | var objectQuery = querystring.parse(objectUrl.query); 200 | sid = objectQuery.sid; 201 | login = objectQuery.login; 202 | key = objectQuery.key; 203 | check_all_servers(login,key,function(err,msg){ 204 | return res.jsonp({ err_code: 0, status: 0, msg:msg }) 205 | }); 206 | }) 207 | 208 | app.get('/',function(req,res){ 209 | res.sendfile('index.html'); 210 | }) 211 | 212 | --------------------------------------------------------------------------------