1. 程式人生 > >伺服器時間同步平臺化

伺服器時間同步平臺化

針對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);  
  
    }  
  
}