config.html 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>SmartPing Dashboard</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
  7. <meta name="apple-mobile-web-app-capable" content="yes">
  8. <link href="assets/css/bootstrap.min.css" rel="stylesheet">
  9. <link href="assets/css/bootstrap-responsive.min.css" rel="stylesheet">
  10. <link href="assets/css/font-awesome.css" rel="stylesheet">
  11. <link href="assets/css/style.css" rel="stylesheet">
  12. <link href="assets/css/pages/dashboard.css" rel="stylesheet">
  13. <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements -->
  14. <!--[if lt IE 9]>
  15. <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
  16. <![endif]-->
  17. </head>
  18. <body>
  19. <div class="navbar navbar-fixed-top">
  20. <div class="navbar-inner">
  21. <div class="container">
  22. <span id="cloudbrand" class="brand" style="margin-right: -15px;"></span><a class="brand" href="index.html">SmartPing Dashbord<span id="agentname"></span></a>
  23. <span id="banner_last_ck_time" class="pull-right " style="margin-top: 10px;"></span>
  24. <div class="nav-collapse">
  25. <!--
  26. <ul class="nav pull-right">
  27. <li class="dropdown">
  28. <a target="_blank" href="http://smartping.cn/" >
  29. <i class="icon-comment"></i>
  30. Know About SmartPing.CN ?
  31. </a>
  32. </li>
  33. </ul>
  34. -->
  35. </div>
  36. <!--/.nav-collapse -->
  37. </div>
  38. <!-- /container -->
  39. </div>
  40. <!-- /navbar-inner -->
  41. </div>
  42. <!-- /navbar -->
  43. <div class="subnavbar">
  44. <div class="subnavbar-inner">
  45. <div class="container">
  46. <ul class="mainnav">
  47. <li><a href="index.html"><i class="icon-mail-forward"></i><span>正向Ping</span> </a> </li>
  48. <li><a href="reverse.html"><i class="icon-mail-reply"></i><span>反向Ping</span> </a> </li>
  49. <li ><a href="topology.html"><i class="icon-bar-chart"></i><span>Ping拓扑</span> </a> </li>
  50. <li><a href="mapping.html"><i class="icon-map-marker"></i><span>全国延迟</span> </a> </li>
  51. <li ><a href="tools.html"><i class="icon-wrench"></i><span>检测工具</span> </a> </li>
  52. <li class="active"><a id="cfgUrl" href="config.html"><i class="icon-cog"></i><span>系统配置</span> </a> </li>
  53. </ul>
  54. </div>
  55. <!-- /container -->
  56. </div>
  57. <!-- /subnavbar-inner -->
  58. </div>
  59. <!-- /subnavbar -->
  60. <div class="main localmode" style="margin-top:-20px;">
  61. <div class="main-inner">
  62. <div class="container" id="main">
  63. <div class="row">
  64. <div class="span4">
  65. <div class="widget-header">
  66. <i class="icon-user"></i>
  67. <h3>保存配置 </h3>
  68. <span style="float: right;margin-right: 25px;"><a target="_blank" href="/api/config.json"><i class="icon-file"></i></a></span>
  69. </div> <!-- /widget-header -->
  70. <div class="widget-content">
  71. <div style="text-align: center">
  72. <span>
  73. <b>密码:</b>
  74. <input style="width:120px;" class="password" type="password" id="pass">
  75. <button style="margin: -10px 0 0 0;" type="submit" class="btn btn-primary" onclick="saveconf()">保存</button>
  76. </span>
  77. <div style="text-align: center"><a href="?dcloud"><i class="icon-cloud"></i> 切换到云模式 </a></div>
  78. </div>
  79. </div>
  80. <br/>
  81. <div class="widget-header">
  82. <i class="icon-user"></i>
  83. <h3>基础配置</h3>
  84. </div> <!-- /widget-header -->
  85. <div class="widget-content">
  86. <h4>基础</h4><br>
  87. <div class="control-group" style="float: left;width: 28%;">
  88. <label class="control-label" >接口超时(秒)</label>
  89. <div class="controls">
  90. <input type="text" style="width:100%" id="Timeout" value="" >
  91. </div> <!-- /controls -->
  92. </div> <!-- /control-group -->
  93. <div class="control-group" style="float: left;width: 28%;margin-left: 20px;">
  94. <label class="control-label" for="Refresh">页面刷新(分钟)</label>
  95. <div class="controls">
  96. <input type="text" style="width:100%" id="Refresh" value="" >
  97. </div> <!-- /controls -->
  98. </div> <!-- /control-group -->
  99. <div class="control-group" style="width: 28%;float: left;margin-left: 20px;">
  100. <label class="control-label ttip" for="Archive" data-toggle='tooltip' title='此配置仅针对全国延迟与报警日志数据生效,Ping数据默认保存30天不可修改!' data-placement='bottom'>数据存档(天)</label>
  101. <div class="controls">
  102. <input type="text" style="width:100%" id="Archive" value="" >
  103. </div> <!-- /controls -->
  104. </div> <!-- /control-group -->
  105. <hr style="clear:both;">
  106. <h4>Ping拓扑</h4><br>
  107. <div class="control-group" style="float: left;width: 43%;">
  108. <label class="control-label" for="Tsound">报警声音</label>
  109. <div class="controls">
  110. <input type="text" style="width:97%" id="Tsound" value="">
  111. </div> <!-- /controls -->
  112. </div> <!-- /control-group -->
  113. <div class="control-group" style="width: 20%;float: left;margin-left: 20px;">
  114. <label class="control-label" for="Tline">连线粗细</label>
  115. <div class="controls">
  116. <input type="text" style="width:100%" id="Tline" value="">
  117. </div> <!-- /controls -->
  118. </div> <!-- /control-group -->
  119. <div class="control-group" style="width: 20%;float: left;margin-left: 20px;">
  120. <label class="control-label" for="Tsymbolsize">形状大小</label>
  121. <div class="controls">
  122. <input type="text" style="width:100%" id="Tsymbolsize" value="">
  123. </div> <!-- /controls -->
  124. </div> <!-- /control-group -->
  125. <hr style="clear:both;">
  126. <h4>报警邮件<button style="float: right" onclick="sendMailTest(this)">发送测试邮件</button></h4><br>
  127. <div class="control-group" >
  128. <label class="control-label" for="Tsymbolsize">邮件服务器</label>
  129. <div class="controls">
  130. <input type="text" style="width:97%" id="EmailHost" value="">
  131. </div> <!-- /controls -->
  132. </div> <!-- /control-group -->
  133. <div class="control-group" style="width: 46%;float: left;">
  134. <label class="control-label" for="Tsymbolsize">发件邮件</label>
  135. <div class="controls">
  136. <input type="text" style="width:100%" id="SendEmailAccount" value="">
  137. </div> <!-- /controls -->
  138. </div> <!-- /control-group -->
  139. <div class="control-group" style="width: 46%;float: left;margin-left: 20px;">
  140. <label class="control-label" for="Tsymbolsize">发件邮箱密码</label>
  141. <div class="controls">
  142. <input type="password" style="width:100%" id="SendEmailPassword" value="">
  143. </div> <!-- /controls -->
  144. </div> <!-- /control-group -->
  145. <div class="control-group" >
  146. <label class="control-label" for="Tsymbolsize">收件邮箱列表(分号隔开)</label>
  147. <div class="controls">
  148. <input type="text" style="width:97%" id="RevcEmailList" value="">
  149. </div> <!-- /controls -->
  150. </div> <!-- /control-group -->
  151. <hr style="clear:both;">
  152. <h4>检测工具</h4><br>
  153. <div class="control-group" style="float: left;width: 45%;">
  154. <label class="control-label" for="Toollimit">限定频率(秒)</label>
  155. <div class="controls">
  156. <input type="text" style="width:100%" id="Toollimit" value="">
  157. </div> <!-- /controls -->
  158. </div> <!-- /control-group -->
  159. <hr style="clear:both;">
  160. <h4>授权管理</h4><br>
  161. <div class="control-group" style="width: 96%;">
  162. <label class="control-label" for="Authiplist">用户IP列表(逗号隔开)</label>
  163. <div class="controls">
  164. <input type="text" style="width:100%" id="Authiplist" value="" >
  165. </div> <!-- /controls -->
  166. </div> <!-- /control-group -->
  167. <br/>
  168. </div>
  169. </div>
  170. <div class="span8">
  171. <!-- /widget -->
  172. <div class="widget widget-table action-table">
  173. <div class="widget-header"> <i class="icon-th-list"></i>
  174. <h3>Ping节点测试网络</h3>
  175. </div>
  176. <!-- /widget-header -->
  177. <div class="widget-content">
  178. <table class="table table-striped table-bordered">
  179. <thead>
  180. <tr>
  181. <th> 节点名称(本机) </th>
  182. <th> 节点IP(本机) </th>
  183. <th> SmartPing </th>
  184. <th style="width:60px;"> 正向Ping </th>
  185. <th style="width:60px;text-align: center">Ping拓扑</th>
  186. <!--<th style="width:60px;text-align: center">检测工具</th>-->
  187. <th style="width:15px;"> </th>
  188. </tr>
  189. </thead>
  190. <tbody class="selfagent"></tbody>
  191. <thead>
  192. <tr>
  193. <th> 节点名称 </th>
  194. <th> 节点IP </th>
  195. <th style="width:60px;"> SmartPing </th>
  196. <th style="width:60px;"> 正向Ping </th>
  197. <th style="width:60px;text-align: center">Ping拓扑</th>
  198. <!--<th style="width:60px;text-align: center">检测工具</th>-->
  199. <th style="width:15px;"> </th>
  200. </tr>
  201. </thead>
  202. <tbody class="agentlist"></tbody>
  203. <tfoot>
  204. <tr>
  205. <td colspan="8" style="text-align: center"><input style='margin:4px 3px 0 0;' type='button' class='btn btn-small' value='添加节点' data-toggle="modal" data-target="#agentModal"></td>
  206. </tr>
  207. </tfoot>
  208. </table>
  209. </div>
  210. <!-- /widget-content -->
  211. </div>
  212. <!-- editSelfAgentModal -->
  213. <div class="modal fade" id="editSelfagentModal" tabindex="-1" role="dialog" style="width:480px;">
  214. <div class="modal-dialog" role="document">
  215. <div class="modal-content">
  216. <div class="modal-header">
  217. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  218. <h4 class="modal-title">编辑本机节点</h4>
  219. </div>
  220. <div class="modal-body form-horizontal" >
  221. 节点名称:<input id="editAgentName" type="text" style="width: 150px;"> 节点IP: <input id="editAgentIp" type="text" style="width: 150px;">
  222. </div>
  223. <div class="modal-footer">
  224. <button type="button" class="btn btn-primary" onclick="editSelfagentModal(true)">暂存</button>
  225. </div>
  226. </div>
  227. </div>
  228. </div>
  229. <!-- NewAgentModal -->
  230. <div class="modal fade" id="agentModal" tabindex="-1" role="dialog" style="width:480px;">
  231. <div class="modal-dialog" role="document">
  232. <div class="modal-content">
  233. <div class="modal-header">
  234. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  235. <h4 class="modal-title">新增节点</h4>
  236. </div>
  237. <div class="modal-body form-horizontal" >
  238. 节点名称:<input id="name" type="text" style="width: 150px;">
  239. </div>
  240. <div class="modal-body form-horizontal" >
  241. 节点IP: <input id="host" type="text" style="width: 150px;">
  242. </div>
  243. <div class="modal-body form-horizontal" >
  244. 端口: <input id="port" type="text" style="width: 150px;">
  245. </div>
  246. <div class="modal-body form-horizontal" >
  247. 更换线路地址:<input id="url" type="text" style="width: 150px;">
  248. </div>
  249. <div class="modal-footer">
  250. <button type="button" class="btn btn-primary" onclick="addAgent(null,null)">暂存</button>
  251. </div>
  252. </div>
  253. </div>
  254. </div>
  255. <!-- PingModal -->
  256. <div class="modal fade" id="pingModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="width:500px;">
  257. <div class="modal-dialog" role="document">
  258. <div class="modal-content">
  259. <div class="modal-header">
  260. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  261. <h4 class="modal-title">Ping配置</h4>
  262. </div>
  263. <div class="modal-body">
  264. <table class="table table-striped table-bordered">
  265. <thead>
  266. <tr>
  267. <th> 节点名称 </th>
  268. <th> 节点IP </th>
  269. <th style="text-align: center"> 正向Ping <input type='checkbox' class="allchecked"></th>
  270. </tr>
  271. </thead>
  272. <tbody class="pingModalist"></tbody>
  273. </table>
  274. </div>
  275. <div class="modal-footer">
  276. <button type="button" class="btn btn-primary" onclick="pingcfg(null,true)" >暂存</button>
  277. <input type='hidden' id='pingcfgAddr' value=''/>
  278. </div>
  279. </div>
  280. </div>
  281. </div>
  282. <!-- TopoModal -->
  283. <div class="modal fade" id="topoModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="width:800px;">
  284. <div class="modal-dialog" role="document">
  285. <div class="modal-content">
  286. <div class="modal-header">
  287. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  288. <h4 class="modal-title" id="myModalLabel">拓扑配置</h4>
  289. </div>
  290. <div class="modal-body">
  291. <table class="table table-striped table-bordered">
  292. <thead>
  293. <tr>
  294. <th> 节点名称 </th>
  295. <th> 节点IP </th>
  296. <th style="width:70px;"> 正向拓扑 <input type='checkbox' class="allchecked" style="margin-top: 2px" v="topoCheck" /></th>
  297. <th style="width:450px;"> 报警规则 </th>
  298. </tr>
  299. </thead>
  300. <tbody class="topoModallist"></tbody>
  301. </table>
  302. </div>
  303. <div class="modal-footer">
  304. <button type="button" class="btn btn-primary" onclick="topocfg(null,true)">暂存</button>
  305. <input type='hidden' id='topocfgAddr' value=''/>
  306. </div>
  307. </div>
  308. </div>
  309. </div>
  310. <!-- ToolsModal
  311. <div class="modal fade" id="toolModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="width:800px;">
  312. <div class="modal-dialog" role="document">
  313. <div class="modal-content">
  314. <div class="modal-header">
  315. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  316. <h4 class="modal-title">工具配置</h4>
  317. </div>
  318. <div class="modal-body">
  319. <table class="table table-striped table-bordered">
  320. <thead>
  321. <tr>
  322. <th> 节点名称 </th>
  323. <th> 节点IP </th>
  324. <th style="width:450px;"> 可用工具 </th>
  325. </tr>
  326. </thead>
  327. <tbody class="toolModallist" ></tbody>
  328. </table>
  329. </div>
  330. <div class="modal-footer">
  331. <button type="button" class="btn btn-primary" onclick="toolcfg(null,true)">暂存</button>
  332. <input type='hidden' id='toolscfgAddr' value=''/>
  333. </div>
  334. </div>
  335. </div>
  336. </div>
  337. -->
  338. <!-- /全国延迟测试网络 -->
  339. <div class="widget widget-table action-table">
  340. <div class="widget-header"> <i class="icon-th-list"></i>
  341. <h3>全国延迟测试网络</h3>
  342. </div>
  343. <!-- /widget-header -->
  344. <div class="widget-content chinamaplist" style="padding:10px;"></div>
  345. <!-- /widget -->
  346. </div>
  347. <!-- chinamapModal -->
  348. <div class="modal fade" id="addChinaMapModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="width:550px;">
  349. <div class="modal-dialog" role="document">
  350. <div class="modal-content">
  351. <div class="modal-header">
  352. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  353. <h4 class="modal-title" >新增全国延迟测试节点</h4>
  354. </div>
  355. <div class="modal-body ">
  356. <div style="text-align: center"><select class='provSelect' style='width:70px;'><option value='北京'>北京</option><option value='浙江'>浙江</option><option value='天津'>天津</option><option value='安徽'>安徽</option><option value='上海'>上海</option><option value='福建'>福建</option><option value='重庆'>重庆</option><option value='江西'>江西</option><option value='山东'>山东</option><option value='河南'>河南</option><option value='湖北'>湖北</option><option value='湖南'>湖南</option><option value='广东'>广东</option><option value='海南'>海南</option><option value='山西'>山西</option><option value='青海'>青海</option><option value='江苏'>江苏</option><option value='辽宁'>辽宁</option><option value='吉林'>吉林</option><option value='台湾'>台湾</option><option value='河北'>河北</option><option value='贵州'>贵州</option><option value='四川'>四川</option><option value='云南'>云南</option><option value='陕西'>陕西</option><option value='甘肃'>甘肃</option><option value='黑龙江'>黑龙江</option><option value='香港'>香港</option><option value='澳门'>澳门</option><option value='广西'>广西</option><option value='宁夏'>宁夏</option><option value='新疆'>新疆</option><option value='内蒙古'>内蒙古</option><option value='西藏'>西藏</option></select></div>
  357. <div style="float: left;width: 31%;padding:5px;">
  358. <table class="table table-striped table-bordered">
  359. <thead>
  360. <tr>
  361. <th> 电信 </th>
  362. </tr>
  363. </thead>
  364. <tbody class="add_chinamap_ctcc" ></tbody>
  365. </table>
  366. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('add_chinamap_ctcc')">
  367. </div>
  368. <div style="float: left;width: 31%;padding:5px;">
  369. <table class="table table-striped table-bordered">
  370. <thead>
  371. <tr>
  372. <th> 联通 </th>
  373. </tr>
  374. </thead>
  375. <tbody class="add_chinamap_cucc" ></tbody>
  376. </table>
  377. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('add_chinamap_cucc')">
  378. </div>
  379. <div style="float: left;width: 31%;padding:5px;">
  380. <table class="table table-striped table-bordered">
  381. <thead>
  382. <tr>
  383. <th> 移动 </th>
  384. </tr>
  385. </thead>
  386. <tbody class="add_chinamap_cmcc" ></tbody>
  387. </table>
  388. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('add_chinamap_cmcc')">
  389. </div>
  390. </div>
  391. </div>
  392. <div class="modal-footer">
  393. <button type="button" class="btn btn-primary" onclick="addChinaMap(true)">暂存</button>
  394. </div>
  395. </div>
  396. </div>
  397. <!-- chinamapModal -->
  398. <div class="modal fade" id="chinaMapModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="width:550px;">
  399. <div class="modal-dialog" role="document">
  400. <div class="modal-content">
  401. <div class="modal-header">
  402. <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
  403. <h4 class="modal-title editChinaMapProv" ></h4>
  404. </div>
  405. <div class="modal-body ">
  406. <div style="float: left;width: 31%;padding:5px;">
  407. <table class="table table-striped table-bordered form-horizontal">
  408. <thead>
  409. <tr>
  410. <th> 电信 </th>
  411. </tr>
  412. </thead>
  413. <tbody class="chinamap_ctcc" ></tbody>
  414. </table>
  415. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('chinamap_ctcc')">
  416. </div>
  417. <div style="float: left;width: 31%;padding:5px;">
  418. <table class="table table-striped table-bordered form-horizontal">
  419. <thead>
  420. <tr>
  421. <th> 联通 </th>
  422. </tr>
  423. </thead>
  424. <tbody class="chinamap_cucc" ></tbody>
  425. </table>
  426. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('chinamap_cucc')">
  427. </div>
  428. <div style="float: left;width: 31%;padding:5px;">
  429. <table class="table table-striped table-bordered form-horizontal">
  430. <thead>
  431. <tr>
  432. <th> 移动 </th>
  433. </tr>
  434. </thead>
  435. <tbody class="chinamap_cmcc" ></tbody>
  436. </table>
  437. <input type="button" style="width: 100%;margin-top: -10px;" value=" + " onclick="addChinaMapCell('chinamap_cmcc')">
  438. </div>
  439. </div>
  440. </div>
  441. <div class="modal-footer">
  442. <button type="button" class="btn btn-danger pull-left" onclick="delChinaMap()">删除</button>
  443. <button type="button" class="btn btn-primary" onclick="editChinaMap(null,true)">暂存</button>
  444. </div>
  445. </div>
  446. </div>
  447. </div>
  448. </div>
  449. <hr>
  450. </div>
  451. <!-- /container -->
  452. </div>
  453. <!-- /main-inner -->
  454. </div>
  455. <!-- /main -->
  456. <div class="main cloudmode" style="margin-top:-20px;">
  457. <div class="main-inner">
  458. <div class="container">
  459. <div class="row">
  460. <div class="span3"> &nbsp;</div>
  461. <div class="span6">
  462. <div class="widget-content">
  463. <div id="LastSuccTimeStr" style="text-align: center"></div>
  464. <div class="control-group">
  465. <label class="control-label">云配置地址</label>
  466. <div class="controls">
  467. <div class="input-append">
  468. <input style="width:98%" class="m-wrap" id="Endpoint" value="http://" type="text">
  469. </div>
  470. </div> <!-- /controls -->
  471. </div> <!-- /control-group -->
  472. <div class="row">
  473. <div class="span2" style="width: 44.4%;">
  474. <div class="control-group">
  475. <label class="control-label">节点名称(本机)</label>
  476. <div class="controls">
  477. <input class="cpassword" type="text" style="width:97%" id="CloudSelfName" value="">
  478. </div> <!-- /controls -->
  479. </div> <!-- /control-group -->
  480. </div>
  481. <div class="span2" style="width: 44.4%;">
  482. <div class="control-group">
  483. <label class="control-label">节点IP(本机)</label>
  484. <div class="controls">
  485. <input class="cpassword" type="text" style="width:97%" id="CloudSelfAddr" value="">
  486. </div> <!-- /controls -->
  487. </div> <!-- /control-group -->
  488. </div>
  489. </div>
  490. <div class="control-group">
  491. <label class="control-label">密码</label>
  492. <div class="controls">
  493. <input class="cpassword" type="password" style="width:97%" id="CloudPass" value="">
  494. </div> <!-- /controls -->
  495. </div> <!-- /control-group -->
  496. <button style="width:100%" type="submit" class="btn btn-primary" onclick="savecloudconf()">检测并保存</button>
  497. <div style="text-align: center;margin-top: 10px;"><a href="?local"><i class="icon-home"></i> 切换到本地模式 </a></div>
  498. </div>
  499. </div>
  500. <div class="span3">&nbsp;</div>
  501. </div>
  502. </div>
  503. </div>
  504. </div>
  505. <div class="footer">
  506. <div class="footer-inner">
  507. <div class="container">
  508. <div class="row">
  509. <div class="span12"> &copy; 2017 - 2020 <a target="_blank" href="http://smartping.org" >SmartPing.org</a> <span style="float:right" id="verion"></span></div>
  510. <!-- /span12 -->
  511. </div>
  512. <!-- /row -->
  513. </div>
  514. <!-- /container -->
  515. </div>
  516. <!-- /footer-inner -->
  517. </div>
  518. <!-- /footer -->
  519. <!-- Le javascript
  520. ================================================== -->
  521. <!-- Placed at the end of the document so the pages load faster -->
  522. <script src="assets/js/jquery-1.7.2.min.js"></script>
  523. <script src="assets/js/jquery.cookie.js"></script>
  524. <script src="assets/js/bootstrap.js"></script>
  525. <script src="assets/js/funcs.js"></script>
  526. <script>
  527. var tp = window.location.search;
  528. //console.log(tp)
  529. if(tp=="?cloud" || tp=="?dcloud" ){
  530. $(".localmode").hide();
  531. $(".cloudmode").show();
  532. }
  533. if(tp=="?local"){
  534. $(".localmode").show();
  535. $(".cloudmode").hide();
  536. }
  537. //Ping节点测试网络 - 编辑本机节点
  538. function editSelfagentModal(Save){
  539. if(Save){
  540. editAgentName = $("#editAgentName").val();
  541. editAgentAddr = $("#editAgentIp").val();
  542. config=$.parseJSON(sessionStorage.getItem("config"))
  543. config["Name"]=editAgentName
  544. config["Addr"]=editAgentAddr
  545. sessionStorage.setItem("config",JSON.stringify(config))
  546. delAgent(null,$(".selfAgentAddr").html())
  547. $(".selfAgentName").html(editAgentName)
  548. $(".selfAgentAddr").html(editAgentAddr)
  549. addAgent(editAgentName,editAgentAddr)
  550. config["Network"][editAgentAddr]["Smartping"]=true
  551. sessionStorage.setItem("config",JSON.stringify(config))
  552. $('#editSelfagentModal').modal("hide");
  553. return
  554. }
  555. config=$.parseJSON(sessionStorage.getItem("config"))
  556. $("#editAgentName").val(config["Name"]);
  557. $("#editAgentIp").val(config["Addr"]);
  558. $('#editSelfagentModal').modal();
  559. }
  560. //Ping节点测试网络 - 新增节点
  561. function addAgent(Name,Ip){
  562. if(Name==null && Ip==null){
  563. newAgentName = $("#name").val();
  564. newAgentIp = $("#host").val();
  565. newAgentPort = $("#port").val();
  566. newAgentUrl = $("#url").val();
  567. }else{
  568. newAgentName = Name
  569. newAgentIp = Ip
  570. newAgentPort = 22
  571. newAgentUrl = ""
  572. }
  573. data = {}
  574. data['name'] = newAgentName;
  575. data['host'] = newAgentIp;
  576. data['port'] = newAgentPort;
  577. data['url'] = newAgentUrl;
  578. $.ajax({
  579. dataType: "json",
  580. type: 'POST',
  581. url: "/v1/add",
  582. data: data,
  583. success: function( retdata ) {
  584. if (retdata["errno"]== 0){
  585. //添加新节点
  586. if(Name==null && Ip==null){
  587. $(".agentlist").append("<tr class='agentlist-"+newAgentIp+"'>" +
  588. "<td>"+newAgentName+"</td><td class='Addr'>"+newAgentIp+"</td>" +
  589. "<td style='text-align:center'><input type='checkbox' onclick='checkSP(this)'></td>" +
  590. "<td style='text-align:center'><a class='btn btn-mini' onclick='pingcfg(this,null)' disabled='disabled'>配置</a></td>" +
  591. "<td style='text-align:center'><a class='btn btn-mini' onclick='topocfg(this,false)' disabled='disabled'>配置</a></td>" +
  592. //"<td style='text-align:center'><a class='btn btn-mini' onclick='toolcfg(this,null)' disabled='disabled'>配置</a></td>" +
  593. "<td><i onclick='delAgent(this,null);' class='icon-large icon-trash'></i></td>" +
  594. "</tr>")
  595. }
  596. $("#newAgentName").val("")
  597. $("#newAgentIp").val("")
  598. $('#agentModal').modal('hide');
  599. alert("测试邮件发送成功!")
  600. }else{
  601. alert("测试邮件发送失败 ("+retdata["errmsg"]+")")
  602. }
  603. $(obj).html("添加成功")
  604. },
  605. timeout: 65*1000
  606. }).fail( function( xhr, status ) {
  607. alert("添加错误 (API错误!)")
  608. $(obj).html("添加成功")
  609. });
  610. }
  611. //Ping节点测试网络 - 删除节点
  612. function delAgent(obj,SelfAddr){
  613. if(SelfAddr!=null){
  614. Addr=SelfAddr
  615. }else{
  616. Addr=$(obj).parent().parent().find(".Addr").html()
  617. }
  618. config=$.parseJSON(sessionStorage.getItem("config"))
  619. delete config["Network"][Addr];
  620. $.each(config["Network"], function(iAddr, agentconfig){
  621. $.each(agentconfig["Ping"], function(pingIndex, pingAddr){
  622. if(pingAddr==Addr){
  623. config["Network"][iAddr]["Ping"].splice(pingIndex,1)
  624. return false
  625. }
  626. })
  627. /*
  628. $.each(agentconfig["Tools"]["Icmpping"], function(toolIcmpIndex, toolIcmpAddr){
  629. if(toolIcmpAddr==Addr){
  630. config["Network"][iAddr]["Tools"]["Icmpping"].splice(toolIcmpIndex,1)
  631. return false
  632. }
  633. })
  634. */
  635. $.each(agentconfig["Topology"], function(topoIndex, topoObj){
  636. if(topoObj["Addr"]==Addr){
  637. config["Network"][iAddr]["Topology"].splice(topoIndex,1)
  638. return false
  639. }
  640. })
  641. })
  642. sessionStorage.setItem("config",JSON.stringify(config))
  643. $(obj).parent().parent().remove();
  644. }
  645. //Ping节点测试网络 - 正向PING配置弹窗
  646. function pingcfg(obj,Save){
  647. if($(obj).attr("disabled") == "disabled"){
  648. return
  649. }
  650. $(".allchecked").removeAttr("checked")
  651. config=$.parseJSON(sessionStorage.getItem("config"))
  652. if(Save==true){
  653. nAddr=$("#pingcfgAddr").val()
  654. NewPingList = new Array()
  655. $('.pingModalist tr').each(function(i){
  656. if($(this).children('td').children('input').is(":checked")){
  657. NewPingList.push($(this).find(".pingModalistAddr").html())
  658. }
  659. });
  660. config["Network"][nAddr]["Ping"]=NewPingList;
  661. sessionStorage.setItem("config",JSON.stringify(config))
  662. $('#pingModal').modal("hide")
  663. return
  664. }
  665. Addr=$(obj).parent().parent().find(".Addr").html()
  666. selfconfig=config["Network"][Addr];
  667. $(".pingModalist").html("")
  668. $.each(config["Network"], function(iAddr, agentconfig){
  669. checked=""
  670. $.each(selfconfig["Ping"], function(i, ip){
  671. if(agentconfig["Addr"]==ip){
  672. checked="checked"
  673. return false
  674. }
  675. })
  676. $(".pingModalist").append("<tr>" +
  677. "<td>"+agentconfig["Name"]+"</td>" +
  678. "<td class='pingModalistAddr'>"+agentconfig["Addr"]+"</td>" +
  679. "<td class='form-horizontal' style='text-align: center'><input type='checkbox' style='margin-top: -3px' "+checked+"></td>" +
  680. "</tr>")
  681. })
  682. $("#pingcfgAddr").val(Addr)
  683. $('#pingModal').modal()
  684. }
  685. //Ping节点测试网络 - 拓扑配置弹窗
  686. function topocfg(obj,Save){
  687. if($(obj).attr("disabled") == "disabled"){
  688. return
  689. }
  690. $(".allchecked").removeAttr("checked")
  691. config=$.parseJSON(sessionStorage.getItem("config"))
  692. if(Save==true){
  693. mnAddr=$("#topocfgAddr").val()
  694. NewTopoList = new Array()
  695. $('.topoModallist tr').each(function(i){
  696. //console.log($(this).find(".topoModalListChecked").is(":checked"))
  697. if($(this).find(".topoModalListChecked").is(":checked")){
  698. topoModal = new Map()
  699. topoModal["Name"] = $(this).find(".topoModalListName").html()
  700. topoModal["Addr"] = $(this).find(".topoModalListAddr").html()
  701. topoModal["Thdchecksec"] = $(this).find(".topoModalListThdchecksec").val()
  702. topoModal["Thdoccnum"] = $(this).find(".topoModalListThdoccnum").val()
  703. topoModal["Thdavgdelay"] = $(this).find(".topoModalListThdavgdelay").val()
  704. topoModal["Thdloss"] = $(this).find(".topoModalListThdloss").val()
  705. NewTopoList.push(topoModal)
  706. }
  707. })
  708. config["Network"][mnAddr]["Topology"]=NewTopoList;
  709. sessionStorage.setItem("config",JSON.stringify(config))
  710. $('#topoModal').modal("hide")
  711. return
  712. }
  713. mAddr=$(obj).parent().parent().find(".Addr").html()
  714. $(".topoModallist").html("")
  715. $.each(config["Network"], function(Addr, agentconfig){
  716. var itopocfg= new Map()
  717. itopocfg["Thdchecksec"] = 0
  718. itopocfg["Thdoccnum"] = 0
  719. itopocfg["Thdavgdelay"] = 0
  720. itopocfg["Thdloss"] = 0
  721. checked=""
  722. disabled="disabled"
  723. if(config["Network"].hasOwnProperty(mAddr)){
  724. nodeConfig=config["Network"][mAddr]
  725. $.each(nodeConfig["Topology"], function(i, cf){
  726. if(cf["Addr"]==Addr){
  727. itopocfg = cf
  728. checked="checked"
  729. disabled=""
  730. return false
  731. }
  732. });
  733. }
  734. $(".topoModallist").append("<tr>" +
  735. "<td class='topoModalListName'>"+agentconfig["Name"]+"</td>" +
  736. "<td class='topoModalListAddr'>"+agentconfig["Addr"]+"</td>" +
  737. "<td style='text-align:center'><input class='topoModalListChecked' type='checkbox' "+checked+" onclick='enabledTopo(this)' ></td>" +
  738. "<td class='form-horizontal'>" +
  739. "<div class='controls' style='margin-left:0px;'>" +
  740. "<div class='input-prepend input-append'>" +
  741. "<input class='topoModalListThdchecksec' type='text' style='width:25px' value='"+itopocfg["Thdchecksec"]+"' "+disabled+" >" +
  742. "<span class='add-on'>秒</span>" +
  743. "</div>" +
  744. "内出现" +
  745. "<div class='input-prepend input-append'>" +
  746. "<input class='topoModalListThdoccnum' type='text' style='width:20px' value='"+itopocfg["Thdoccnum"]+"' "+disabled+" >" +
  747. "<span class='add-on'>次</span>" +
  748. "</div>" +
  749. "内延迟大于" +
  750. "<div class='input-prepend input-append'>" +
  751. "<input class='topoModalListThdavgdelay' type='text' value='"+itopocfg["Thdavgdelay"]+"' style='width:25px' "+disabled+" >" +
  752. "<span class='add-on'>ms</span>" +
  753. "</div>" +
  754. "或丢包率大于" +
  755. "<div class='input-prepend input-append'>" +
  756. "<input class='topoModalListThdloss' type='text' value='"+itopocfg["Thdloss"]+"' style='width:20px' "+disabled+" >" +
  757. "<span class='add-on'>%</span>" +
  758. "</div>" +
  759. "</div>" +
  760. "</td>" +
  761. "</tr>")
  762. })
  763. $("#topocfgAddr").val(mAddr)
  764. $('#topoModal').modal()
  765. }
  766. function enabledTopo(obj){
  767. if($(obj).is(":checked")){
  768. $(obj).closest("tr").find(".topoModalListThdchecksec").removeAttr("disabled")
  769. $(obj).closest("tr").find(".topoModalListThdchecksec").val("900")
  770. $(obj).closest("tr").find(".topoModalListThdoccnum").removeAttr("disabled")
  771. $(obj).closest("tr").find(".topoModalListThdoccnum").val("3")
  772. $(obj).closest("tr").find(".topoModalListThdavgdelay").removeAttr("disabled")
  773. $(obj).closest("tr").find(".topoModalListThdavgdelay").val("200")
  774. $(obj).closest("tr").find(".topoModalListThdloss").removeAttr("disabled")
  775. $(obj).closest("tr").find(".topoModalListThdloss").val("30")
  776. }else{
  777. $(obj).closest("tr").find(".topoModalListThdchecksec").attr("disabled","true")
  778. $(obj).closest("tr").find(".topoModalListThdchecksec").val("0")
  779. $(obj).closest("tr").find(".topoModalListThdoccnum").attr("disabled","true")
  780. $(obj).closest("tr").find(".topoModalListThdoccnum").val("0")
  781. $(obj).closest("tr").find(".topoModalListThdavgdelay").attr("disabled","true")
  782. $(obj).closest("tr").find(".topoModalListThdavgdelay").val("0")
  783. $(obj).closest("tr").find(".topoModalListThdloss").attr("disabled","true")
  784. $(obj).closest("tr").find(".topoModalListThdloss").val("0")
  785. }
  786. }
  787. /*/Ping节点测试网络 - 检测工具配置
  788. function toolcfg(obj,Save){
  789. if($(obj).attr("disabled") == "disabled"){
  790. return
  791. }
  792. config=$.parseJSON(sessionStorage.getItem("config"))
  793. if(Save){
  794. nAddr=$("#toolscfgAddr").val()
  795. NewToolsIcmpList = new Array()
  796. $('.toolModallist tr').each(function(i){
  797. if($(this).children('td').children('input').is(":checked")){
  798. NewToolsIcmpList.push($(this).find(".toolModalistAddr").html())
  799. }
  800. });
  801. config["Network"][nAddr]["Tools"]["Icmpping"]=NewToolsIcmpList;
  802. sessionStorage.setItem("config",JSON.stringify(config))
  803. $('#toolModal').modal("hide")
  804. return
  805. }
  806. $(".toolModallist").html("")
  807. Addr=$(obj).parent().parent().find(".Addr").html()
  808. selfconfig=config["Network"][Addr]
  809. $.each(config["Network"], function(iAddr, agentconfig){
  810. checked=""
  811. $.each(selfconfig["Tools"]["Icmpping"], function(i, ip){
  812. if(agentconfig["Addr"]==ip){
  813. checked="checked"
  814. return false
  815. }
  816. })
  817. $(".toolModallist").append("<tr>" +
  818. "<td>"+agentconfig["Name"]+"</td>" +
  819. "<td class='toolModalistAddr'>"+agentconfig["Addr"]+"</td>" +
  820. "<td class='form-horizontal' style='text-align: left'><input type='checkbox' style='margin-top: -3px' "+checked+">ICMP PING</td>" +
  821. "</tr>")
  822. })
  823. $('#toolscfgAddr').val(Addr)
  824. $('#toolModal').modal()
  825. }
  826. */
  827. //发送邮件测试
  828. function sendMailTest(obj){
  829. $(obj).html("测试邮件发送中(最长1分钟,请等待)...")
  830. data = {}
  831. data["EmailHost"] = $("#EmailHost").val();
  832. data["SendEmailAccount"] = $("#SendEmailAccount").val();
  833. data["SendEmailPassword"] = $("#SendEmailPassword").val();
  834. data["RevcEmailList"] = $("#RevcEmailList").val();
  835. $.ajax({
  836. dataType: "json",
  837. type: 'POST',
  838. url: "/api/sendmailtest.json",
  839. data: data,
  840. success: function( retdata ) {
  841. if (retdata["status"]=="true"){
  842. alert("测试邮件发送成功!")
  843. }else{
  844. alert("测试邮件发送失败 ("+retdata["info"]+")")
  845. }
  846. $(obj).html("发送测试邮件")
  847. },
  848. timeout: 65*1000
  849. }).fail( function( xhr, status ) {
  850. alert("测试邮件发送失败 (API错误!)")
  851. $(obj).html("发送测试邮件")
  852. });
  853. }
  854. //全国延迟测试网络-新增节点
  855. function addChinaMap(Save){
  856. if(Save){
  857. nprov=$('.provSelect').attr('value')
  858. cmap=new Map()
  859. cucc=new Array()
  860. $(".add_chinamap_cucc").children('tr').children('td').children('.val').each(function(i,ip){
  861. cucc.push($(ip).val())
  862. })
  863. cmap["cucc"]=cucc
  864. ctcc=new Array()
  865. $(".add_chinamap_ctcc").children('tr').children('td').children('.val').each(function(i,ip){
  866. ctcc.push($(ip).val())
  867. })
  868. cmap["ctcc"]=ctcc
  869. cmcc=new Array()
  870. $(".add_chinamap_cmcc").children('tr').children('td').children('.val').each(function(i,ip){
  871. cmcc.push($(ip).val())
  872. })
  873. cmap["cmcc"]=cmcc
  874. config["Chinamap"][nprov]=cmap
  875. $('#addChinaMapModal').modal("hide")
  876. sessionStorage.setItem("config",JSON.stringify(config))
  877. refreshChinaMap()
  878. return
  879. }
  880. $.each(config["Chinamap"], function(prov, detail){
  881. $(".provSelect option[value='"+prov+"']").remove();
  882. })
  883. $(".add_chinamap_cucc").find("tr").remove()
  884. $(".add_chinamap_ctcc").find("tr").remove()
  885. $(".add_chinamap_cmcc").find("tr").remove()
  886. $('#addChinaMapModal').modal()
  887. }
  888. //全国延迟测试网络-删除节点
  889. function delChinaMap(){
  890. config=$.parseJSON(sessionStorage.getItem("config"))
  891. nprov=$(".editChinaMapProv").html()
  892. delete config["Chinamap"][nprov]
  893. $('#chinaMapModal').modal("hide")
  894. sessionStorage.setItem("config",JSON.stringify(config))
  895. refreshChinaMap()
  896. return
  897. }
  898. //全国延迟测试网络-编辑节点
  899. function editChinaMap(prov,Save){
  900. config=$.parseJSON(sessionStorage.getItem("config"))
  901. if(Save){
  902. nprov=$(".editChinaMapProv").html()
  903. cmap=new Map()
  904. cucc=new Array()
  905. $(".chinamap_cucc").children('tr').children('td').children('.val').each(function(i,ip){
  906. cucc.push($(ip).val())
  907. })
  908. cmap["cucc"]=cucc
  909. ctcc=new Array()
  910. $(".chinamap_ctcc").children('tr').children('td').children('.val').each(function(i,ip){
  911. ctcc.push($(ip).val())
  912. })
  913. cmap["ctcc"]=ctcc
  914. cmcc=new Array()
  915. $(".chinamap_cmcc").children('tr').children('td').children('.val').each(function(i,ip){
  916. cmcc.push($(ip).val())
  917. })
  918. cmap["cmcc"]=cmcc
  919. config["Chinamap"][nprov]=cmap
  920. $('#chinaMapModal').modal("hide")
  921. sessionStorage.setItem("config",JSON.stringify(config))
  922. refreshChinaMap()
  923. return
  924. }
  925. $(".editChinaMapProv").html(prov)
  926. $(".chinamap_cmcc").html("")
  927. $(".chinamap_ctcc").html("")
  928. $(".chinamap_cucc").html("")
  929. detail = config["Chinamap"][prov]
  930. $.each(detail["cmcc"],function(i,cmcc){
  931. $(".chinamap_cmcc").append("<tr><td><input class='val' type='text' style='width: 108px' value='"+cmcc+"'> <input onclick='deletedMapingTr(this);' style='margin-top: -1px;' type='button' value=' - '></td></tr>")
  932. })
  933. $.each(detail["ctcc"],function(i,ctcc){
  934. $(".chinamap_ctcc").append("<tr><td><input class='val' type='text' style='width: 108px' value='"+ctcc+"'> <input onclick='deletedMapingTr(this);' style='margin-top: -1px;' type='button' value=' - '></td></tr>")
  935. })
  936. $.each(detail["cucc"],function(i,cucc){
  937. $(".chinamap_cucc").append("<tr><td><input class='val' type='text' style='width: 108px' value='"+cucc+"'> <input onclick='deletedMapingTr(this);' style='margin-top: -1px;' type='button' value=' - '></td></tr>")
  938. })
  939. $('#chinaMapModal').modal()
  940. }
  941. //全国延迟测试网络-刷新面板
  942. function refreshChinaMap(){
  943. config=$.parseJSON(sessionStorage.getItem("config"))
  944. $(".chinamaplist").html("")
  945. $.each(config["Chinamap"], function(prov, detail){
  946. cmcc=detail["cmcc"].length
  947. ctcc=detail["ctcc"].length
  948. cucc=detail["cucc"].length
  949. text=prov+"(电信"+ctcc+",联通"+cucc+",移动"+cmcc+")"
  950. $(".chinamaplist").append("<input type='button' value='"+text+"' onclick='editChinaMap(\""+prov+"\")' style='margin-right: 10px;width:177px;'>")
  951. })
  952. $(".chinamaplist").append("<input type='button' value=' + ' style='width: 50px;' onclick='addChinaMap(false)'> ")
  953. }
  954. //全国延迟测试网络-添加IP条目
  955. function addChinaMapCell(cell){
  956. $("."+cell).append("<tr><td><input class='val' type='text' style='width: 108px' value=''> <input onclick='deletedMapingTr(this);' style='margin-top: -1px;' type='button' value=' - '></td></tr>")
  957. }
  958. //全国延迟测试网络-删除IP条目
  959. function deletedMapingTr(nowTr){
  960. $(nowTr).parent().parent().remove();
  961. }
  962. //保存配置
  963. function saveconf(){
  964. config=$.parseJSON(sessionStorage.getItem("config"))
  965. //config = {}
  966. config["Name"] = $("#selfAgentName").html();
  967. config["Addr"] = $("#selfAgentAddr").html();
  968. config["Mode"]["Type"]="local"
  969. config["Mode"]["Endpoint"]=""
  970. config["Mode"]["LastSuccTime"]=""
  971. config["Base"]["Timeout"]= parseInt($("#Timeout").val());
  972. config["Base"]["Archive"]= parseInt($("#Archive").val());
  973. config["Base"]["Refresh"]= parseInt($("#Refresh").val());
  974. config["Topology"]["Tsound"] = $("#Tsound").val();
  975. config["Topology"]["Tline"] = $("#Tline").val();
  976. config["Topology"]["Tsymbolsize"] = $("#Tsymbolsize").val();
  977. config["Alert"]["EmailHost"] = $("#EmailHost").val();
  978. config["Alert"]["SendEmailAccount"] = $("#SendEmailAccount").val();
  979. config["Alert"]["SendEmailPassword"] = $("#SendEmailPassword").val();
  980. config["Alert"]["RevcEmailList"] = $("#RevcEmailList").val();
  981. config["Authiplist"] = $("#Authiplist").val();
  982. config["Toollimit"] = parseInt($("#Toollimit").val());
  983. data = {}
  984. data['config'] = JSON.stringify(config)
  985. data['password'] = $(".password").val()
  986. $.ajax({
  987. dataType: "json",
  988. type: 'POST',
  989. url: "/api/saveconfig.json",
  990. data: data,
  991. success: function( retdata ) {
  992. if (retdata["status"]=="true"){
  993. alert("系统配置保存成功!")
  994. window.location.reload();
  995. }else{
  996. alert("系统配置保存失败 ("+retdata["info"]+")")
  997. }
  998. },
  999. timeout: 10*1000
  1000. }).fail( function( xhr, status ) {
  1001. alert("系统配置保存失败 (API错误!)")
  1002. });
  1003. }
  1004. //云模式保存配置
  1005. function savecloudconf(){
  1006. //config = {}
  1007. endpoint = $("#Endpoint").val();
  1008. $.getJSON("/api/proxy.json?g="+endpoint+"",function(config){
  1009. config["Mode"]["Endpoint"] = $("#Endpoint").val();
  1010. config["Mode"]["Type"] = "cloud";
  1011. //config["Mode"]["Status"] = "true";
  1012. config["Addr"] = $("#CloudSelfAddr").val();
  1013. config["Name"] = $("#CloudSelfName").val();
  1014. selfFlag = false
  1015. if(!config.hasOwnProperty("Network")){
  1016. alert("远程配置文件解析错误!")
  1017. return false
  1018. }
  1019. $.each(config["Network"], function(Addr, agentconfig){
  1020. //console.log("1 "+config["Addr"]+config["Name"])
  1021. //console.log("2 "+agentconfig["Addr"]+agentconfig["Name"]+Addr)
  1022. if(agentconfig["Addr"]==config["Addr"] && agentconfig["Name"]==config["Name"]&& Addr==config["Addr"] ){
  1023. selfFlag=true
  1024. return false
  1025. }
  1026. })
  1027. if(!selfFlag){
  1028. alert("配置文件错误,本机节点与Ping节点测试网络信息不匹配!");
  1029. return
  1030. }
  1031. data = {}
  1032. data['config'] = JSON.stringify(config)
  1033. data['password'] = $("#CloudPass").val()
  1034. $.ajax({
  1035. dataType: "json",
  1036. type: 'POST',
  1037. url: "/api/saveconfig.json",
  1038. data: data,
  1039. success: function( retdata ) {
  1040. if (retdata["status"]=="true"){
  1041. alert("系统配置保存成功!")
  1042. window.location.reload();
  1043. }else{
  1044. alert("系统配置保存失败 ("+retdata["info"]+")")
  1045. }
  1046. },
  1047. timeout: 10*1000
  1048. }).fail( function( xhr, status ) {
  1049. alert("系统配置保存失败 (API错误!)")
  1050. });
  1051. }).fail(function (xhr, status) {
  1052. //alert("123")
  1053. alert(xhr.responseText);
  1054. });
  1055. }
  1056. //选择是否为SmartPing
  1057. function checkSP(obj){
  1058. Addr=$(obj).parent().parent().find(".Addr").html()
  1059. config=$.parseJSON(sessionStorage.getItem("config"))
  1060. if($(obj).is(":checked")){
  1061. $(obj).parent().parent().find("a").each(function(i,elm) {
  1062. $(elm).removeAttr("disabled")
  1063. config["Network"][Addr]["Smartping"]=true
  1064. })
  1065. }else{
  1066. $(obj).parent().parent().find("a").each(function(i,elm){
  1067. $(elm).attr("disabled","true")
  1068. config["Network"][Addr]["Smartping"]=false
  1069. config["Network"][Addr]["Ping"]=new Array()
  1070. config["Network"][Addr]["Tools"]=new Object()
  1071. config["Network"][Addr]["Tools"]["Icmpping"]=new Array()
  1072. config["Network"][Addr]["Topology"]=new Array()
  1073. })
  1074. }
  1075. sessionStorage.setItem("config",JSON.stringify(config))
  1076. }
  1077. $(function(){
  1078. $(".ttip").tooltip();
  1079. var config = new Object()
  1080. $.getJSON("/v1/getnode",function(result){
  1081. config=result
  1082. $.each(config["data"], function(Addr, agentconfig){
  1083. $(".agentlist").append("<tr class='agentlist-"+agentconfig["host"]+"'>" +
  1084. "<td>"+agentconfig["name"]+"</td><td class='Addr'>"+agentconfig["host"]+"</td>" +
  1085. "<td style='text-align:center'><input type='checkbox' onclick='checkSP(this)'></td>" +
  1086. "<td style='text-align:center'><a class='btn btn-mini' onclick='pingcfg(this,null)' disabled='disabled'>配置</a></td>" +
  1087. "<td style='text-align:center'><a class='btn btn-mini' onclick='topocfg(this,false)' disabled='disabled'>配置</a></td>" +
  1088. //"<td style='text-align:center'><a class='btn btn-mini' onclick='toolcfg(this,null)' disabled='disabled'>配置</a></td>" +
  1089. "<td><i onclick='delAgent(this,null);' class='icon-large icon-trash'></i></td>" +
  1090. "</tr>")
  1091. })
  1092. });
  1093. $(".allchecked").click(function(){
  1094. var xz = $(this).prop("checked");
  1095. var topoCheck=false
  1096. if($(this).attr("v")=="topoCheck"){
  1097. topoCheck=true
  1098. }
  1099. $(this).parents().children("tbody").children("tr").each(function(i,obj) {
  1100. $(obj).find('input').attr("checked",xz);
  1101. if(topoCheck){
  1102. enabledTopo($(obj).find('input'))
  1103. }
  1104. });
  1105. });
  1106. });
  1107. </script>
  1108. </body>
  1109. </html>