伺服器時間同步平臺化
阿新 • • 發佈:2019-01-08
針對linux伺服器,用平臺一鍵同步時間、檢視記憶體佔用、磁碟佔用,由於採用使用者名稱,密碼登入SSH遠端登入拿取資料,所以不需要安裝客戶端
時間同步介面
平臺根據遠端伺服器的登入名,密碼,ssh登入遠端伺服器,執行ntpdate 172.16.3.3(時間伺服器ip)來同步時間
public String syncDate(String ip) throws IOException, InterruptedException { RemoteShellTool tool = new RemoteShellTool(ip,"utf-8"); tool.loginCentos(); String returnString = tool.exec("ntpdate 172.16.3.2"); if(returnString.indexOf("adjust")<0) { logger.info("syncDate:"+ip+" return "+returnString); return "fail"; } Thread.sleep(1000); return viewDate(ip); }
附其他程式碼:
html
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link href="/css/reset.css" rel="stylesheet"> <link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet"> <link href="/css/layout.css" rel="stylesheet"> <link href="/css/index/applications.css" rel="stylesheet"> <script type="text/javascript" src="/lib/jquery.js"></script> <script type="text/javascript" src="/bootstrap/js/bootstrap.min.js"></script> <script type="text/javascript" src="/bootstrap/js/jquery.bootpag.min.js"></script> <script type="text/javascript" src="/lib/avalon.js"></script> <script type="text/javascript" src="/js/common/util.js"></script> <script type="text/javascript" src="/js/common/common.js"></script> <script type="text/javascript" src="/js/index/vmtime.js"></script> <title>虛擬機器時間管理</title> </head> <body ms-controller="vm"> <!-- HEAD --> <!--HEAD --> <div ms-include-src="'/home/header.html'"></div> <!-- Content --> <div class="container"> <div ms-controller="vmtime"> <div class="tabbable"> <div class="tab-content"> <div class="tab-pane active" id="vms"> <div id="vmsTab-pane"> <br /> <div class="row" id="search1Div"> <div class="col-md-2"> <div class="input-group"> <span class="input-group-addon">環境:</span> <select class="form-control" ms-duplex="envType"> <option value="STRESS" selected>STRESS</option> <option value="ALL">全部</option> <option value="SIT1">SIT1</option> <option value="SIT2">SIT2</option> <option value="UAT">UAT</option> <option value="other">其他</option> </select> </div> </div> <div class="col-md-2" id="search2Div"> <div class="input-group"> <span class="input-group-addon">型別:</span> <select class="form-control" ms-duplex="conType"> <option value="" selected>請選擇</option> <option value=".Net Web">.Net Web</option> <option value="Windows Service">Windows Service</option> <option value="Node">Node</option> <option value="Java App">Java App</option> <option value="Java Web">Java Web</option> <option value="其他">其他</option> </select> </div> </div> <div class="col-md-1"> <button type="button" id="searchBtn" class="btn btn-primary" ms-click="listVmInfosByPage('init')" style="margin: auto;"> 搜 索</button> </div> <div class="col-md-1"> <button type="button" id="allCheckBtn" class="btn btn-info" ms-click="checkAll()" style="margin: auto;">全選</button> </div> <div class="col-md-1"> <button type="button" id="allUncheckBtn" class="btn btn-info" ms-click="uncheckAll()" style="margin: auto;">全不選</button> </div> <div class="col-md-2"> <button type="button" id="allStatusBtn" class="btn btn-success" ms-click="viewAllStatus()" style="margin: auto;">檢視當前時間</button> </div> <div class="col-md-2"> <button type="button" id="allDeployBtn" class="btn btn-warning" ms-click="deployAll()" style="margin: auto;">同步時間伺服器</button> </div> </div> <div> <div id="pageSizeSelect"> <a><span ms-class="{{pagesize1Cls}}" ms-click="changePageSize(pagesize1)">{{pagesize1}}</span></a> | <a><span ms-class="{{pagesize2Cls}}" ms-click="changePageSize(pagesize2)">{{pagesize2}}</span></a> | <a> <spam ms-class="{{pagesize3Cls}}" ms-click="changePageSize(pagesize3)">{{pagesize3}}</spam> </a> </div> </div> <table class="table table-condensed table-hover"> <thead> <tr> <td class="width-50"></td> <td class="width-50">ID</td> <td>名稱</td> <td class="width-125">IP</td> <td class="width-100">作業系統</td> <td class="width-300">當前時間</td> <td class="width-50">檢視</td> <td class="width-50">同步</td> </tr> </thead> <tbody> <tr ms-repeat="vmsList"> <td><label><input type="checkbox" ms-class="check_{{el.name}}"></label></td> <td>{{$index+jpageSize*(jpageIndex-1)+1}}</td> <td>{{el.name}}</td> <td><a ms-href="'/admin/vmdetails.html?vmid='+el.vm.id" target="_blank">{{el.ip}}</a></td> <td>{{el.os}}</td> <td><label ms-class="time_{{el.name}}" /></td> <td> <div ms-class="buttonDiv_view_{{el.name}}"> <i style="color: #009100;" ms-class="glyphicon glyphicon-eye-open icon-white i_view_{{el.name}}" ms-click="postViewStatus(el.name,el.ip,el.os)"></i> </div> <div ms-class="loadDiv_view_{{el.name}} loadDiv" style="display: none"> <img src="/img/load2.jpg" style="width: 16px; height: 16px;" /> </div> </td> <td> <div ms-class="buttonDiv_{{el.name}}"> <i style="color: #000066;" ms-class="glyphicon glyphicon-play icon-white i_{{el.name}}" ms-click="postDeploy(el.name,el.ip,el.os)"> </i> </div> <div ms-class="loadDiv_{{el.name}} loadDiv" style="display: none"> <img src="/img/load2.jpg" style="width: 16px; height: 16px;" /> </div> </td> </tr> </tbody> </table> <div class="text-center"> <p id="pagination"></p> </div> </div> </div> </div> </div> </div> </div> <!--/.container--> <!--FOOTER --> <div ms-include-src="'/home/footer.html'"></div> </body> </html>
js
/** * Created by chenjiazhu on 2017/5/10. */ var vmtime = avalon.define({ $id : 'vmtime', // VM Start pagesize1 : "20", pagesize1Cls : "pageSizeSelected", pagesize2 : "50", pagesize2Cls : "", pagesize3 : "100", pagesize3Cls : "", changePageSize : function(pgsize) { vmtime.jpageSize = pgsize; vmtime.listVmInfosByPage("init"); }, clearsearch : function() { vmtime.conType = ""; vmtime.listVmInfosByPage("init"); }, jpageIndex : 1, jpageSize : 20, envType : "STRESS", conType : "", vmsList : [], listVmInfosByPage : function(tag) { if (tag) { vmtime.jpageIndex = 1; } $.ajax({ type : "post", url : 'listVmInfosByPageByEnvType.action', data : { "pageindex" : vmtime.jpageIndex, "pagesize" : vmtime.jpageSize, "type" : vmtime.conType, "envType" : vmtime.envType }, dataType : "json", success : function(data) { if (tag) { $('#pagination').bootpag({ total : data.pagenum, page : vmtime.jpageIndex }); } if (data.retCode == "1000") { vmtime.vmsList = data.vms; } else { alert(data.retMSG); } $("[class^=time]").html(""); }, error : function(XMLHttpRequest, textStatus, errorThrown) { alert("請求資料異常,狀態碼:" + XMLHttpRequest.status + ",Error:" + errorThrown + ",textStatus:" + textStatus); } }); }, postViewStatus : function(name, ip,os) { $(".loadDiv_view_" + name).show(); $(".buttonDiv_view_" + name).hide(); $.ajax({ type : "post", url : 'viewDate.action', data : { "ip" : ip, "os":os }, dataType : "json", success : function(data) { $(".time_" + name).html(data.retCode); $(".loadDiv_view_" + name).hide(); $(".buttonDiv_view_" + name).show(); }, error : function(XMLHttpRequest, textStatus, errorThrown) { alert("請求資料異常,狀態碼:" + XMLHttpRequest.status + ",Error:" + errorThrown + ",textStatus:" + textStatus); $(".loadDiv_view_" + name).hide(); $(".buttonDiv_view_" + name).show(); } }); }, postDeploy : function(name, ip, os) { $(".loadDiv_" + name).show(); $(".buttonDiv_" + name).hide(); $.ajax({ type : "post", url : 'syncDate.action', data : { "ip" : ip, "os":os }, dataType : "json", success : function(data) { $(".loadDiv_" + name).hide(); $(".buttonDiv_" + name).show(); $(".time_" + name).html(data.retCode); }, error : function(XMLHttpRequest, textStatus, errorThrown) { $(".loadDiv_" + name).hide(); $(".buttonDiv_" + name).show(); alert("請求資料異常,狀態碼:" + XMLHttpRequest.status + ",<br/>" + XMLHttpRequest.readyState + ",<br/>" + XMLHttpRequest.responseText + ",<br/>Error:" + errorThrown + ",<br/>textStatus:" + textStatus); } }); }, viewAllStatus : function() { $("input[type='checkbox']").each(function() { if ($(this).get(0).checked) { var name = $(this).attr("class").substr(6); // alert(name); $(".i_view_" + name).click(); } }); }, deployAll : function() { $("input[type='checkbox']").each(function() { if ($(this).get(0).checked) { var name = $(this).attr("class").substr(6); // alert(name); $(".i_" + name).click(); } }); }, checkAll : function() { $("input[type='checkbox']").each(function() { $(this).attr("checked", "true"); }); }, uncheckAll : function() { $("input[type='checkbox']").each(function() { $(this).removeAttr("checked"); }); }, loadVmTAB : function() { vmtime.listVmInfosByPage("init"); $('#vms').tab('show'); }, // VM END userOps : ops(4), bootpagFuc : function() { $('#pagination').bootpag({ total : 1, maxVisible : 10 }).on('page', function(event, num) { vmtime.jpageIndex = num; vmtime.listVmInfosByPage(); }); } }); /* avalon.ready(function() { appsvm.bootpagFuc(); appsvm.listApp("init"); appsvm.depList = getAllDepartments(); appsvm.envsList = getAllEnvs(); appsvm.applicationsTypeList = getAllAppType(); });*/ avalon.ready(function() { /* if (vmtime.userOps) { vmtime.loadVmTAB(); } else { redirectAdminIndexPage(); }*/ vmtime.bootpagFuc(); vmtime.listVmInfosByPage("init"); // $(".loadDiv").hide(); }); vmtime.$watch("jpageSize", function(newValue) { vmtime.pagesize1Cls = ""; vmtime.pagesize2Cls = ""; vmtime.pagesize3Cls = ""; if (newValue == vmtime.pagesize1) { vmtime.pagesize1Cls = "pageSizeSelected"; } else if (newValue == vmtime.pagesize2) { vmtime.pagesize2Cls = "pageSizeSelected"; } else if (newValue == vmtime.pagesize3) { vmtime.pagesize3Cls = "pageSizeSelected"; } })
工具類
package com.ymt.testplatform.util;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
public class RemoteShellTool {
private Connection conn;
private String ipAddr;
private String charset = Charset.defaultCharset().toString();
private String userName;
private String password;
public RemoteShellTool(String ipAddr, String charset) {
this.ipAddr = ipAddr;
if (charset != null) {
this.charset = charset;
}
}
public RemoteShellTool(String ipAddr, String userName, String password,
String charset) {
this.ipAddr = ipAddr;
this.userName = userName;
this.password = password;
if (charset != null) {
this.charset = charset;
}
}
public boolean login() throws IOException {
conn = new Connection(ipAddr);
conn.connect(); // 連線
return conn.authenticateWithPassword(userName, password); // 認證
}
public boolean loginCentos() throws IOException
{
conn = new Connection(ipAddr);
conn.connect(); // 連線
String [] pass = {"[email protected]","[email protected]","[email protected]","[email protected]","1234qwer"};
for (String pa : pass) {
if(conn.authenticateWithPassword("root", pa))
{
this.userName = "root";
this.password = pa;
return true;
}
}
return false;
}
public boolean login(String userName,String password) throws IOException {
conn = new Connection(ipAddr);
conn.connect(); // 連線
this.userName = userName;
this.password = password;
return conn.authenticateWithPassword(userName, password); // 認證
}
public String exec(String cmds) {
InputStream in = null;
String result = "";
try {
if (this.login()) {
Session session = conn.openSession(); // 開啟一個會話
session.execCommand(cmds);
in = session.getStdout();
result = this.processStdout(in, this.charset);
session.close();
conn.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
return result;
}
public String processStdout(InputStream in, String charset) {
byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
try {
while (in.read(buf) != -1) {
sb.append(new String(buf, charset));
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
/**
* @param args
*/
public static void main(String[] args) {
RemoteShellTool tool = new RemoteShellTool("172.16.103.126", "ftpuser",
"[email protected]", "utf-8");
String result = tool.exec("sh Deploy.sh 172.16.103.121");
System.out.print("result:"+result);
RemoteShellTool tool2 = new RemoteShellTool("172.16.103.121", "ftpuser",
"[email protected]", "utf-8");
String result2 = tool2.exec("sh tools/clientDeploy.sh");
System.out.print("result2:"+result2);
}
}