commit 4b91e41581fa73f4695c5975837545345be9705d Author: chenlw <874313221@qq.com> Date: Wed Oct 12 09:26:58 2016 +0800 gfs服务 diff --git a/.classpath b/.classpath new file mode 100644 index 00000000..b57aa8a2 --- /dev/null +++ b/.classpath @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 00000000..a4a8b61c --- /dev/null +++ b/.project @@ -0,0 +1,36 @@ + + + jfinal-demo + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.jdt.core.javanature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/WebRoot/META-INF/MANIFEST.MF b/WebRoot/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/WebRoot/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/WebRoot/WEB-INF/classes/com/platform/config/JfinalConfig.class b/WebRoot/WEB-INF/classes/com/platform/config/JfinalConfig.class new file mode 100644 index 00000000..eba4ac82 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/config/JfinalConfig.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/controller/GfsController.class b/WebRoot/WEB-INF/classes/com/platform/controller/GfsController.class new file mode 100644 index 00000000..32869842 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/controller/GfsController.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/controller/HelloController.class b/WebRoot/WEB-INF/classes/com/platform/controller/HelloController.class new file mode 100644 index 00000000..231e51b4 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/controller/HelloController.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/entities/Brick.class b/WebRoot/WEB-INF/classes/com/platform/entities/Brick.class new file mode 100644 index 00000000..eaf587b9 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/entities/Brick.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/entities/FolderNode.class b/WebRoot/WEB-INF/classes/com/platform/entities/FolderNode.class new file mode 100644 index 00000000..66550103 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/entities/FolderNode.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/entities/VolumeEntity.class b/WebRoot/WEB-INF/classes/com/platform/entities/VolumeEntity.class new file mode 100644 index 00000000..6161338f Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/entities/VolumeEntity.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/form/Bean2MapUtils.class b/WebRoot/WEB-INF/classes/com/platform/form/Bean2MapUtils.class new file mode 100644 index 00000000..8ea7def0 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/form/Bean2MapUtils.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/form/baseForm.class b/WebRoot/WEB-INF/classes/com/platform/form/baseForm.class new file mode 100644 index 00000000..43b08383 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/form/baseForm.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/CheckoutMD5.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/CheckoutMD5.class new file mode 100644 index 00000000..38d4a052 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/CheckoutMD5.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/ClusterInfo.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/ClusterInfo.class new file mode 100644 index 00000000..9e62fcae Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/ClusterInfo.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/CopyData.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/CopyData.class new file mode 100644 index 00000000..2d8bf3f2 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/CopyData.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/GetTreeData.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/GetTreeData.class new file mode 100644 index 00000000..db5d3e02 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/GetTreeData.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/RemoveData.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/RemoveData.class new file mode 100644 index 00000000..b7ba1a43 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/RemoveData.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetCluster.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetCluster.class new file mode 100644 index 00000000..47955fd5 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetCluster.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetVolume.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetVolume.class new file mode 100644 index 00000000..7d83de93 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SetVolume.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/ShowData.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/ShowData.class new file mode 100644 index 00000000..c34f2f1d Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/ShowData.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/SizeInfo.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SizeInfo.class new file mode 100644 index 00000000..c5c5e5c5 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/SizeInfo.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/glusterfs/VolumeInfo.class b/WebRoot/WEB-INF/classes/com/platform/glusterfs/VolumeInfo.class new file mode 100644 index 00000000..2cdce2a2 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/glusterfs/VolumeInfo.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/service/VolumeService.class b/WebRoot/WEB-INF/classes/com/platform/service/VolumeService.class new file mode 100644 index 00000000..5b3ac2c7 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/service/VolumeService.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/CacheTreeData.class b/WebRoot/WEB-INF/classes/com/platform/utils/CacheTreeData.class new file mode 100644 index 00000000..b036f310 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/CacheTreeData.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/Constant.class b/WebRoot/WEB-INF/classes/com/platform/utils/Constant.class new file mode 100644 index 00000000..6b14cf0c Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/Constant.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/FileOperateHelper.class b/WebRoot/WEB-INF/classes/com/platform/utils/FileOperateHelper.class new file mode 100644 index 00000000..d3331e86 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/FileOperateHelper.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/GanymedSSH.class b/WebRoot/WEB-INF/classes/com/platform/utils/GanymedSSH.class new file mode 100644 index 00000000..12e2d469 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/GanymedSSH.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/Support.class b/WebRoot/WEB-INF/classes/com/platform/utils/Support.class new file mode 100644 index 00000000..481a57f6 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/Support.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/ThreadVolume.class b/WebRoot/WEB-INF/classes/com/platform/utils/ThreadVolume.class new file mode 100644 index 00000000..013293ef Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/ThreadVolume.class differ diff --git a/WebRoot/WEB-INF/classes/com/platform/utils/getTreeDataByPath.class b/WebRoot/WEB-INF/classes/com/platform/utils/getTreeDataByPath.class new file mode 100644 index 00000000..785a30b0 Binary files /dev/null and b/WebRoot/WEB-INF/classes/com/platform/utils/getTreeDataByPath.class differ diff --git a/WebRoot/WEB-INF/lib/c3p0-0.9.1.2.jar b/WebRoot/WEB-INF/lib/c3p0-0.9.1.2.jar new file mode 100644 index 00000000..0f42d60e Binary files /dev/null and b/WebRoot/WEB-INF/lib/c3p0-0.9.1.2.jar differ diff --git a/WebRoot/WEB-INF/lib/com.fasterxml.jackson.core.jar b/WebRoot/WEB-INF/lib/com.fasterxml.jackson.core.jar new file mode 100644 index 00000000..6899eda2 Binary files /dev/null and b/WebRoot/WEB-INF/lib/com.fasterxml.jackson.core.jar differ diff --git a/WebRoot/WEB-INF/lib/commons-beanutils-1.8.0.jar b/WebRoot/WEB-INF/lib/commons-beanutils-1.8.0.jar new file mode 100644 index 00000000..caf7ae33 Binary files /dev/null and b/WebRoot/WEB-INF/lib/commons-beanutils-1.8.0.jar differ diff --git a/WebRoot/WEB-INF/lib/commons-collections-3.2.1.jar b/WebRoot/WEB-INF/lib/commons-collections-3.2.1.jar new file mode 100644 index 00000000..c35fa1fe Binary files /dev/null and b/WebRoot/WEB-INF/lib/commons-collections-3.2.1.jar differ diff --git a/WebRoot/WEB-INF/lib/commons-lang-2.4.jar b/WebRoot/WEB-INF/lib/commons-lang-2.4.jar new file mode 100644 index 00000000..532939ec Binary files /dev/null and b/WebRoot/WEB-INF/lib/commons-lang-2.4.jar differ diff --git a/WebRoot/WEB-INF/lib/commons-logging-1.1.1.jar b/WebRoot/WEB-INF/lib/commons-logging-1.1.1.jar new file mode 100644 index 00000000..8758a96b Binary files /dev/null and b/WebRoot/WEB-INF/lib/commons-logging-1.1.1.jar differ diff --git a/WebRoot/WEB-INF/lib/commons-logging-1.2.jar b/WebRoot/WEB-INF/lib/commons-logging-1.2.jar new file mode 100644 index 00000000..93a3b9f6 Binary files /dev/null and b/WebRoot/WEB-INF/lib/commons-logging-1.2.jar differ diff --git a/WebRoot/WEB-INF/lib/cos-26Dec2008.jar b/WebRoot/WEB-INF/lib/cos-26Dec2008.jar new file mode 100644 index 00000000..ea39c989 Binary files /dev/null and b/WebRoot/WEB-INF/lib/cos-26Dec2008.jar differ diff --git a/WebRoot/WEB-INF/lib/dom4j-1.6.1.jar b/WebRoot/WEB-INF/lib/dom4j-1.6.1.jar new file mode 100644 index 00000000..c8c4dbb9 Binary files /dev/null and b/WebRoot/WEB-INF/lib/dom4j-1.6.1.jar differ diff --git a/WebRoot/WEB-INF/lib/druid-1.0.5.jar b/WebRoot/WEB-INF/lib/druid-1.0.5.jar new file mode 100644 index 00000000..d26ca552 Binary files /dev/null and b/WebRoot/WEB-INF/lib/druid-1.0.5.jar differ diff --git a/WebRoot/WEB-INF/lib/ezmorph-1.0.6.jar b/WebRoot/WEB-INF/lib/ezmorph-1.0.6.jar new file mode 100644 index 00000000..30fad12d Binary files /dev/null and b/WebRoot/WEB-INF/lib/ezmorph-1.0.6.jar differ diff --git a/WebRoot/WEB-INF/lib/freemarker-2.3.20.jar b/WebRoot/WEB-INF/lib/freemarker-2.3.20.jar new file mode 100644 index 00000000..91390441 Binary files /dev/null and b/WebRoot/WEB-INF/lib/freemarker-2.3.20.jar differ diff --git a/WebRoot/WEB-INF/lib/ganymed-ssh2-build209.jar b/WebRoot/WEB-INF/lib/ganymed-ssh2-build209.jar new file mode 100644 index 00000000..95f233ce Binary files /dev/null and b/WebRoot/WEB-INF/lib/ganymed-ssh2-build209.jar differ diff --git a/WebRoot/WEB-INF/lib/jackson-annotations-2.4.0.jar b/WebRoot/WEB-INF/lib/jackson-annotations-2.4.0.jar new file mode 100644 index 00000000..0b555590 Binary files /dev/null and b/WebRoot/WEB-INF/lib/jackson-annotations-2.4.0.jar differ diff --git a/WebRoot/WEB-INF/lib/jackson-databind-2.4.2.jar b/WebRoot/WEB-INF/lib/jackson-databind-2.4.2.jar new file mode 100644 index 00000000..ea95c53a Binary files /dev/null and b/WebRoot/WEB-INF/lib/jackson-databind-2.4.2.jar differ diff --git a/WebRoot/WEB-INF/lib/jetty-server-8.1.8.jar b/WebRoot/WEB-INF/lib/jetty-server-8.1.8.jar new file mode 100644 index 00000000..314f4ca5 Binary files /dev/null and b/WebRoot/WEB-INF/lib/jetty-server-8.1.8.jar differ diff --git a/WebRoot/WEB-INF/lib/jfinal-1.9-bin.jar b/WebRoot/WEB-INF/lib/jfinal-1.9-bin.jar new file mode 100644 index 00000000..f810ba92 Binary files /dev/null and b/WebRoot/WEB-INF/lib/jfinal-1.9-bin.jar differ diff --git a/WebRoot/WEB-INF/lib/json-lib-2.2.3-jdk15.jar b/WebRoot/WEB-INF/lib/json-lib-2.2.3-jdk15.jar new file mode 100644 index 00000000..8c92fab0 Binary files /dev/null and b/WebRoot/WEB-INF/lib/json-lib-2.2.3-jdk15.jar differ diff --git a/WebRoot/WEB-INF/lib/log4j-1.2.17.jar b/WebRoot/WEB-INF/lib/log4j-1.2.17.jar new file mode 100644 index 00000000..1d425cf7 Binary files /dev/null and b/WebRoot/WEB-INF/lib/log4j-1.2.17.jar differ diff --git a/WebRoot/WEB-INF/lib/logging-interceptor-2.7.2.jar b/WebRoot/WEB-INF/lib/logging-interceptor-2.7.2.jar new file mode 100644 index 00000000..5d404500 Binary files /dev/null and b/WebRoot/WEB-INF/lib/logging-interceptor-2.7.2.jar differ diff --git a/WebRoot/WEB-INF/web.xml b/WebRoot/WEB-INF/web.xml new file mode 100644 index 00000000..342d7a79 --- /dev/null +++ b/WebRoot/WEB-INF/web.xml @@ -0,0 +1,31 @@ + + + jfinal-demo + + index.html + index.htm + index.jsp + default.html + default.htm + default.jsp + + + + + jfinalF + com.jfinal.core.JFinalFilter + + configClass + com.platform.config.JfinalConfig + + + + jfinalF + /* + + + \ No newline at end of file diff --git a/src/com/platform/config/JfinalConfig.java b/src/com/platform/config/JfinalConfig.java new file mode 100644 index 00000000..b2596c98 --- /dev/null +++ b/src/com/platform/config/JfinalConfig.java @@ -0,0 +1,37 @@ +package com.platform.config; + +import com.jfinal.config.Constants; +import com.jfinal.config.Handlers; +import com.jfinal.config.Interceptors; +import com.jfinal.config.JFinalConfig; +import com.jfinal.config.Plugins; +import com.jfinal.config.Routes; +import com.platform.controller.GfsController; +import com.platform.controller.HelloController; + +public class JfinalConfig extends JFinalConfig { + + @Override + public void configConstant(Constants me) { + me.setDevMode(true); + } + + @Override + public void configHandler(Handlers me) { + } + + @Override + public void configInterceptor(Interceptors me) { + } + + @Override + public void configPlugin(Plugins me) { + } + + @Override + public void configRoute(Routes me) { + me.add("/hello", HelloController.class); + me.add("/gfs", GfsController.class); + } + +} diff --git a/src/com/platform/controller/GfsController.java b/src/com/platform/controller/GfsController.java new file mode 100644 index 00000000..7a8a03c0 --- /dev/null +++ b/src/com/platform/controller/GfsController.java @@ -0,0 +1,53 @@ +package com.platform.controller; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.json.JSONObject; + +import com.jfinal.core.Controller; +import com.platform.entities.FolderNode; +import com.platform.entities.VolumeEntity; +import com.platform.utils.CacheTreeData; +import com.platform.utils.getTreeDataByPath; + +public class GfsController extends Controller { + + /** gfs目录树形查询 */ + private getTreeDataByPath getFolder = new getTreeDataByPath(); + + /** + * 首页-"/gfs"下没有匹配到的路径时的请求方法 + */ + public void index() { + renderText("hello gfs !"); + } + + public void getAllvolume(){ + + List volumeList = CacheTreeData.getVolumeList(); + if (null == volumeList) { + JSONObject jsondata = JSONObject.fromObject(new ArrayList()); + renderJson(jsondata.toString()); + } + for (VolumeEntity volume : volumeList) { + if (null != volume.getPath()) { +// 获得 folder 目录 + List list = new ArrayList(); + FolderNode currNode = getFolder(volume.getPath()); + if (null != currNode && null != currNode.getChildNodes()) { + list.addAll(currNode.getChildNodes()); + } + volume.setFolder(list); + } + } + JSONObject jsondata = JSONObject.fromObject(volumeList); + renderJson(jsondata.toString()); + } + + public FolderNode getFolder(String path) { + FolderNode result = getFolder.findByPath(path); + return result; + } + +} diff --git a/src/com/platform/controller/HelloController.java b/src/com/platform/controller/HelloController.java new file mode 100644 index 00000000..3cfad193 --- /dev/null +++ b/src/com/platform/controller/HelloController.java @@ -0,0 +1,48 @@ +package com.platform.controller; + +import java.util.ArrayList; +import java.util.List; +import net.sf.json.JSONObject; +import com.jfinal.core.Controller; +import com.platform.entities.FolderNode; +import com.platform.form.baseForm; + +public class HelloController extends Controller { + + public void index() { + renderText("hello jfinal index !"); + } + + public void tojson() { + renderText("hello jfinal tojson !"); + } + + public void gain() { + baseForm form = new baseForm(); + form.setId("12"); + form.setName("n3"); + + String base = getPara("jsondata"); + System.err.println(base); + if (null != base) { + FolderNode f = new FolderNode(); + f.setIsFolder(2); + f.setName("1"); + f.setPath("/da"); + FolderNode f1 = new FolderNode(); + f1.setIsFolder(2); + f1.setName("1"); + f1.setPath("/da"); + List lis = new ArrayList(); + lis.add(f1); + f.setChildNodes(lis); + JSONObject jsondata = JSONObject.fromObject(f); + renderJson(jsondata.toString()); + } + else { + renderText("hello jfinal gaindata ! "); + } + } + + +} diff --git a/src/com/platform/entities/Brick.java b/src/com/platform/entities/Brick.java new file mode 100644 index 00000000..e6701dab --- /dev/null +++ b/src/com/platform/entities/Brick.java @@ -0,0 +1,110 @@ + +/** + * 文件名 : Brick.java + * 版权 : <版权/公司名> + * 描述 : <描述> + * @author chen + * 版本 : <版本> + * 修改时间: 2016年9月9日 + * 修改内容: <修改内容> + */ +package com.platform.entities; + +/** + * <一句话功能简述> volume 下的 块 对象 + * <功能详细描述> + * @author chen + * @version [版本号,2016年9月9日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ + +public class Brick { + + /** volume总大小 */ + private double availableSize; + + /** volume已使用大小 */ + private double usedSize; + + /** ip */ + private String ip; + + /** 路径 */ + private String path; + + /** + * true 有连接, false: 失去连接 + */ + private boolean status; + + /** + * @return the availableSize + */ + public double getAvailableSize() { + return availableSize; + } + + /** + * @param availableSize the availableSize to set + */ + public void setAvailableSize(double availableSize) { + this.availableSize = availableSize; + } + + /** + * @return the usedSize + */ + public double getUsedSize() { + return usedSize; + } + + /** + * @param usedSize the usedSize to set + */ + public void setUsedSize(double usedSize) { + this.usedSize = usedSize; + } + + /** + * @return the ip + */ + public String getIp() { + return ip; + } + + /** + * @param ip the ip to set + */ + public void setIp(String ip) { + this.ip = ip; + } + + /** + * @return the path + */ + public String getPath() { + return path; + } + + /** + * @param path the path to set + */ + public void setPath(String path) { + this.path = path; + } + + /** + * @return the status + */ + public boolean isStatus() { + return status; + } + + /** + * @param status the status to set + */ + public void setStatus(boolean status) { + this.status = status; + } +} diff --git a/src/com/platform/entities/FolderNode.java b/src/com/platform/entities/FolderNode.java new file mode 100644 index 00000000..5a9a56b7 --- /dev/null +++ b/src/com/platform/entities/FolderNode.java @@ -0,0 +1,65 @@ +package com.platform.entities; + +import java.util.ArrayList; +import java.util.List; + +public class FolderNode { + private String name; + private int isFolder; // 1 is file and other integer is folder show children number + private String path; + private List childNodes = new ArrayList(); + + + public FolderNode() { + // TODO Auto-generated constructor stub + } + + + public FolderNode(String name) { + this.name = name; + } + + public FolderNode(String name, int isFolder) { + this.name = name; + this.isFolder = isFolder; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + /** + * @return the isFolder + */ + public int getIsFolder() { + return isFolder; + } + + /** + * @param isFolder the isFolder to set + */ + public void setIsFolder(int isFolder) { + this.isFolder = isFolder; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public List getChildNodes() { + return childNodes; + } + + public void setChildNodes(List childNodes) { + this.childNodes = childNodes; + } + +} diff --git a/src/com/platform/entities/VolumeEntity.java b/src/com/platform/entities/VolumeEntity.java new file mode 100644 index 00000000..d274af95 --- /dev/null +++ b/src/com/platform/entities/VolumeEntity.java @@ -0,0 +1,164 @@ + +/** + * 文件名 : VolumeEntity.java + * 版权 : <版权/公司名> + * 描述 : <描述> + * @author chen + * 版本 : <版本> + * 修改时间: 2016年9月9日 + * 修改内容: <修改内容> + */ +package com.platform.entities; + +import java.util.ArrayList; +import java.util.List; + +/** + * <一句话功能简述> gfs的 volume 对象 + * <功能详细描述> + * @author chen + * @version [版本号,2016年9月9日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ + +public class VolumeEntity { + + /** volume总大小 */ + private double allSize; + + /** volume已使用大小 */ + private double usedSize; + + /** volume名称 */ + private String name; + + /** 挂载点 */ + private String path; + + /** * exist,正常返回状态Started,Stopped,Created */ + private boolean status; + + private String type; + + /** volume树形目录 */ + private List folder = new ArrayList(); + + /** volume的 块 */ + private List brick = new ArrayList(); + + /** + * @return the allSize + */ + public double getAllSize() { + return allSize; + } + + /** + * @param allSize the allSize to set + */ + public void setAllSize(double allSize) { + this.allSize = allSize; + } + + /** + * @return the usedSize + */ + public double getUsedSize() { + return usedSize; + } + + /** + * @param usedSize the usedSize to set + */ + public void setUsedSize(double usedSize) { + this.usedSize = usedSize; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the path + */ + public String getPath() { + return path; + } + + /** + * @param path the path to set + */ + public void setPath(String path) { + this.path = path; + } + + + /** + * @return the status + */ + public boolean isStatus() { + return status; + } + + /** + * @param status the status to set + */ + public void setStatus(boolean status) { + this.status = status; + } + + /** + * @return the type + */ + public String getType() { + return type; + } + + /** + * @param type the type to set + */ + public void setType(String type) { + this.type = type; + } + + /** + * @return the folder + */ + public List getFolder() { + return folder; + } + + /** + * @param folder the folder to set + */ + public void setFolder(List folder) { + this.folder = folder; + } + + /** + * @return the brick + */ + public List getBrick() { + return brick; + } + + /** + * @param brick the brick to set + */ + public void setBrick(List brick) { + this.brick = brick; + } + + +} diff --git a/src/com/platform/form/Bean2MapUtils.java b/src/com/platform/form/Bean2MapUtils.java new file mode 100644 index 00000000..0f2ffc0a --- /dev/null +++ b/src/com/platform/form/Bean2MapUtils.java @@ -0,0 +1,87 @@ +package com.platform.form; + +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.PropertyDescriptor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +public class Bean2MapUtils { + + /** + * 将一个 Map 对象转化为一个 JavaBean + * @param type 要转化的类型 + * @param map 包含属性值的 map + * @return 转化出来的 JavaBean 对象 + * @throws IntrospectionException + * 如果分析类属性失败 + * @throws IllegalAccessException + * 如果实例化 JavaBean 失败 + * @throws InstantiationException + * 如果实例化 JavaBean 失败 + * @throws InvocationTargetException + * 如果调用属性的 setter 方法失败 + */ + public static Object convertMap(Class type, Map map) + throws IntrospectionException, IllegalAccessException, + InstantiationException, InvocationTargetException { + BeanInfo beanInfo = Introspector.getBeanInfo(type); // 获取类属性 + Object obj = type.newInstance(); // 创建 JavaBean 对象 + + // 给 JavaBean 对象的属性赋值 + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (int i = 0; i< propertyDescriptors.length; i++) { + PropertyDescriptor descriptor = propertyDescriptors[i]; + String propertyName = descriptor.getName(); + try{ + if (map.containsKey(propertyName)) { + // 下面一句可以 try 起来,这样当一个属性赋值失败的时候就不会影响其他属性赋值。 + Object value = map.get(propertyName); + + Object[] args = new Object[1]; + args[0] = value; + + descriptor.getWriteMethod().invoke(obj, args); + } + } + catch(Exception e){ + + } + } + return obj; + } + + /** + * 将一个 JavaBean 对象转化为一个 Map + * @param bean 要转化的JavaBean 对象 + * @return 转化出来的 Map 对象 + * @throws IntrospectionException 如果分析类属性失败 + * @throws IllegalAccessException 如果实例化 JavaBean 失败 + * @throws InvocationTargetException 如果调用属性的 setter 方法失败 + */ + public static Map convertBean(Object bean) + throws IntrospectionException, IllegalAccessException, InvocationTargetException { + Class type = bean.getClass(); + Map returnMap = new HashMap(); + BeanInfo beanInfo = Introspector.getBeanInfo(type); + + PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors(); + for (int i = 0; i< propertyDescriptors.length; i++) { + PropertyDescriptor descriptor = propertyDescriptors[i]; + String propertyName = descriptor.getName(); + if (!propertyName.equals("class")) { + Method readMethod = descriptor.getReadMethod(); + Object result = readMethod.invoke(bean, new Object[0]); + if (result != null) { + returnMap.put(propertyName, result); + } else { + returnMap.put(propertyName, ""); + } + } + } + return returnMap; + } +} diff --git a/src/com/platform/form/baseForm.java b/src/com/platform/form/baseForm.java new file mode 100644 index 00000000..101230a7 --- /dev/null +++ b/src/com/platform/form/baseForm.java @@ -0,0 +1,55 @@ +package com.platform.form; + +public class baseForm { + + private String id; + + private String name; + + private baseForm base; + + /** + * @return the id + */ + public String getId() { + return id; + } + + /** + * @param id the id to set + */ + public void setId(String id) { + this.id = id; + } + + /** + * @return the name + */ + public String getName() { + return name; + } + + /** + * @param name the name to set + */ + public void setName(String name) { + this.name = name; + } + + /** + * @return the base + */ + public baseForm getBase() { + return base; + } + + /** + * @param base the base to set + */ + public void setBase(baseForm base) { + this.base = base; + } + + + +} diff --git a/src/com/platform/glusterfs/CheckoutMD5.java b/src/com/platform/glusterfs/CheckoutMD5.java new file mode 100644 index 00000000..3e682198 --- /dev/null +++ b/src/com/platform/glusterfs/CheckoutMD5.java @@ -0,0 +1,103 @@ +package com.platform.glusterfs; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import com.platform.utils.Constant; + +public class CheckoutMD5 { + public static Logger log = Logger.getLogger(CheckoutMD5.class); + String sourcePath; + String destPath; + String dataName; + // String cmd_crateSourceMD5File="find "+sourcePath+dataName+"/app/ -type f + // -print0 | xargs -0 md5sum | sort >"+deskPath+dataName+"_md5.txt"; + String cmd_getSourceMD5File; + // String cmd_crateDestMD5File="find "+destPath+dataName+"/app/ -type f + // -print0 | xargs -0 md5sum | sort >"+deskPath+dataName+"_md5.txt"; + String cmd_getDestMD5File; + Map source_md5 = new HashMap(); + Map dest_md5 = new HashMap(); + + public CheckoutMD5() { + // TODO Auto-generated constructor stub + } + + public CheckoutMD5(String sourcePath, String destPath, String dataName) { + // TODO Auto-generated constructor stub + this.sourcePath = sourcePath; + this.destPath = destPath; + this.dataName = dataName; + cmd_getSourceMD5File = "find " + sourcePath + dataName + "/app/ -type f -print0 | xargs -0 md5sum | sort "; + cmd_getDestMD5File = "find " + destPath + dataName + "/app/ -type f -print0 | xargs -0 md5sum | sort "; + } + + /** + * 文件夹校验 校验sourcePath和destPath是否完全相同,如果相同,返回1; + * 如果不相同,返回0,如果获取文件MD5出错,返回-1;如何源文件不存在返回-2;目标文件不存在,返回-3; + * + * @param sourcePath + * @param destPath + * @return + * @see [类、类#方法、类#成员] + */ + public int checkoutMD5Folder(String sourcePath, String destPath) { + log.info("start checkout md5 "+sourcePath+" and "+ destPath); + List wrong_files = new ArrayList(); + String source_cmd = "find " + sourcePath + " -type f -print0 | xargs -0 md5sum"; + String dest_cmd = "find " + destPath + " -type f -print0 | xargs -0 md5sum"; + List sourceReStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(source_cmd); + if (sourceReStrings == null || sourceReStrings.size() == 0) { + log.error("get " + sourcePath + " MD5 error!"); + return -1; + } + if(sourceReStrings.get(0).contains(Constant.noSuchFile)){ + log.error(sourcePath+" is not exist!"); + return -2; + } + List destReStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(dest_cmd); + if (destReStrings == null || destReStrings.size() == 0) { + log.error("get " + destReStrings + " MD5 error!"); + return -1; + } + if(destReStrings.get(0).contains(Constant.noSuchFile)){ + log.error(destPath+" is not exist!"); + return -3; + } + Map source_md5 = new HashMap(); + Map dest_md5 = new HashMap(); + for (String line : sourceReStrings) { + String[] lines = line.split(" "); + String key = lines[1].replace(sourcePath, "").trim(); + String value = lines[0].trim(); + source_md5.put(key, value); + } + for (String line : destReStrings) { + String[] lines = line.split(" "); + String key = lines[1].replace(destPath, "").trim(); + String value = lines[0].trim(); + dest_md5.put(key, value); + } + for (Map.Entry mapEntry : source_md5.entrySet()) { + if (!(dest_md5.containsKey(mapEntry.getKey()) + && dest_md5.get(mapEntry.getKey()).equals(mapEntry.getValue()))) { + + log.info(sourcePath + " and " + destPath + " is not same!"); + return 0; + // System.out.println(mapEntry.getKey()); + } + + } + + log.info(sourcePath + " and " + destPath + " is same!"); + return 1; + } + + public static void main(String[] args) { + CheckoutMD5 checkoutMD5 = new CheckoutMD5(); + System.out.println(checkoutMD5.checkoutMD5Folder("/home/v1_copy","/home/ubuntu")); + } +} diff --git a/src/com/platform/glusterfs/ClusterInfo.java b/src/com/platform/glusterfs/ClusterInfo.java new file mode 100644 index 00000000..c73f0310 --- /dev/null +++ b/src/com/platform/glusterfs/ClusterInfo.java @@ -0,0 +1,153 @@ + + +package com.platform.glusterfs; + + + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +import com.platform.utils.Constant; + +import ch.ethz.ssh2.Connection; + +/** + * 获取集群信息 + * @author liliy + * @version [版本号,2016年9月12日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class ClusterInfo { + public static Logger log = Logger.getLogger(ClusterInfo.class); + + /** + * 获取集群节点信息 + * 如果获取不正常,则返回null,如果获取正常,返回map表示节点ip和ip的状态 + * 如果ip在集群中且联通状态为PeerinCluster(Connected) + * 如果ip在集群中且但不连通为PeerinCluster(Disconnected) + * @return + * @throws IOException + * @see [类、类#方法、类#成员] + */ + public Map showClusterInfo() { +// log.info("get cluster info"); + Map peerIps = new HashMap(); + peerIps.put(Constant.hostIp, Constant.peerincluster_connected); + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(Constant.glusterPeerStatus); + if (reStrings == null) { + log.error("1101 command get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1102 command get result is nothing"); + return null; + } + + if (reStrings.get(0).contains("No peers present")) { + return peerIps; + } + + if (!(reStrings.get(0).split(":")[0].contains("Number of Peers"))) { + log.error("1103 get result string wrong"); + return null; + } + + + // System.out.print(reStrings.get(0)); + + int flag = 0; + String ipString = ""; + String state = ""; + for (Iterator it2 = reStrings.iterator(); it2.hasNext();) { + String line = (String) it2.next(); + line=line.replaceAll(" +", " "); + String keyValue[] = line.split(":"); + if (keyValue[0].equals("Hostname")) { + + if (keyValue.length < 2) { + log.error("1105 command get result is wrong"); + continue; + } + + ipString = keyValue[1].replaceAll(" ", ""); + flag = 1; + } else if (flag == 1 && keyValue[0].equals("State")) { + + if (keyValue.length < 2) { + log.error("1106 command get result is wrong"); + continue; + } + + state = keyValue[1].replaceAll(" ", ""); + flag = 0; + peerIps.put(ipString, state); + } + + } + +// for (Map.Entry entry:peerIps.entrySet()){ +// String key=entry.getKey(); +// if(key.equals(Constant.hostIp)){ +// continue; +// } +// String value=entry.getValue(); +// if(Constant.ganymedSSH.otherConns==null){ +// Constant.ganymedSSH.otherConns=new HashMap(); +// } +// if(!Constant.ganymedSSH.otherConns.containsKey(key)){ +// Connection connection=null; +// try { +// connection = Constant.ganymedSSH.getOpenedConnection(key, Constant.rootUser, Constant.rootPasswd, Constant.port); +// } catch (IOException e) { +// // TODO Auto-generated catch block +// e.printStackTrace(); +// } +// Constant.ganymedSSH.otherConns.put(key,connection); +// } +// } + + return peerIps; + } + + /** + * 根据给定的ip获的ip的状态,即是否在集群中并联通 + * 如果ip不在集群中,返回null + * 如果ip在集群中且联通状态为PeerinCluster(Connected) + * 如果ip在集群中且但不连通为PeerinCluster(Disconnected) + * @param peerip + * @return + * @see [类、类#方法、类#成员] + */ + public String getPeerStatus(String peerip){ + Map peerIps=showClusterInfo(); + if(peerIps==null || peerIps.size()==0){ + return null; + } + + if(peerip.equals(Constant.hostIp)){ + return Constant.peerincluster_connected; + } + if(!peerIps.containsKey(peerip)){ + return Constant.peerNotinCluster; + } + return peerIps.get(peerip); + } + + + public static void main(String[] args) { +// PropertyConfigurator.configure("log4j.properties"); + System.out.println(new ClusterInfo().showClusterInfo()); + System.out.println(new ClusterInfo().getPeerStatus("192.168.0.116")); + } +} + + diff --git a/src/com/platform/glusterfs/CopyData.java b/src/com/platform/glusterfs/CopyData.java new file mode 100644 index 00000000..fd774040 --- /dev/null +++ b/src/com/platform/glusterfs/CopyData.java @@ -0,0 +1,143 @@ + +package com.platform.glusterfs; + +import java.util.List; + +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.junit.Test; + +import com.platform.utils.Constant; + + +/** + * <一句话功能简述> 复制数据 + * <功能详细描述> + * @author chen + * @version [版本号,2016年9月8日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ + +public class CopyData { + public static Logger log = Logger.getLogger(CopyData.class); + + public int copyVolumeFiles(String sourceVolumeName, String destVolumeName, String fileName) { + log.info("start copy " + fileName + " from " + sourceVolumeName + " to " + destVolumeName); + int status = -1; + /** + * get mount point of volumeName + */ + + String sourceFolderName = sourceVolumeName; + String destFolderName = destVolumeName; + status = copyFolderFilesAnyway(sourceFolderName, destFolderName, fileName); + return status; + } + + /** + * 将sourceFolderName拷贝到destFolderName + * 如果拷贝正常返回1,如果sourceFolderName不存在返回-2 ,如果destFolderName不存在返回-3 + * @param sourceFolderName + * @param destFolderName + * @return + * @see [类、类#方法、类#成员] + */ + public int copyFolder(String sourceFolderName, String destFolderName) { + createFolders(destFolderName); + int progress=0; + log.info("start copy " + sourceFolderName + " to " + destFolderName); + ShowData showData=new ShowData(); + Map reStrings=showData.showFolderData(destFolderName); + if(reStrings==null){ + log.info("3201 "+destFolderName+" is not exists"); + return -3; + } + + reStrings=showData.showFolderData(sourceFolderName); + if(reStrings==null){ + log.info("3202 "+sourceFolderName+" is not exists"); + return -2; + } + String command = "cp -rp " + sourceFolderName+" "+destFolderName; + + Constant.ganymedSSH.execCmdNoWaitAcquiescent(command); + + log.info("copy " + sourceFolderName + " to " + destFolderName + " running"); + return 1; + } + + /** + * -1 :error; -2: the filename is not exists ;-3 :destFolderName ; 1: right + * not exists + * + * @param folderName + * @param fileName + * @return + */ + public int copyFolderFiles(String sourceFolderName, String destFolderName, String fileName) { + int progress=0; + log.info("start copy " + fileName + " from " + sourceFolderName + " to " + destFolderName); + ShowData showData=new ShowData(); + Map reStrings=showData.showFolderData(destFolderName); + if(reStrings==null){ + log.info("3201 "+destFolderName+" is not exists"); + return -3; + } + + reStrings=showData.showFolderData(sourceFolderName+"/"+fileName); + if(reStrings==null){ + log.info("3202 "+sourceFolderName+"/"+fileName+" is not exists"); + return -2; + } + String command = "cp -rp " + sourceFolderName + "/" + fileName+" "+destFolderName; + /* + * RunCommand runCommand = new RunCommand(); + + List reStrings = runCommand.runCommandWait(command); + */ + Constant.ganymedSSH.execCmdNoWaitAcquiescent(command); + + log.info("copy " + sourceFolderName +"/" + fileName+ " to " + destFolderName + " running"); + return 1; + } + + /** 不管目的路径存在与否,强制拷贝 + * @param sourceFolderName + * @param destFolderName + * @param fileName + * @return + */ + public int copyFolderFilesAnyway(String sourceFolderName, String destFolderName, String fileName) { + createFolders(destFolderName); + int result = copyFolderFiles(sourceFolderName, destFolderName, fileName); + return result; + } + + public int createFolders(String folder){ + log.info("create "+folder); + String splitFolder[]=folder.substring(1).split("/"); + String cmd="mkdir "; + for(String one:splitFolder){ + cmd+="/"+one.replaceAll(" ", ""); + Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + } + return 1; + } + + @Test + public void testcreateFolders() { + + createFolders("/aaa/vvv/ddd/www/rrrr"); + } + + //@Test + public void testCopyFolderFiles() { + + copyFolderFiles("/home", "/home/ubuntu", "system_data"); + } +} + + diff --git a/src/com/platform/glusterfs/GetTreeData.java b/src/com/platform/glusterfs/GetTreeData.java new file mode 100644 index 00000000..d1274d15 --- /dev/null +++ b/src/com/platform/glusterfs/GetTreeData.java @@ -0,0 +1,123 @@ +package com.platform.glusterfs; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.junit.Test; +import com.platform.entities.FolderNode; +import com.platform.utils.Constant; +import com.platform.utils.FileOperateHelper; +import com.platform.utils.GanymedSSH; + +/** + * <一句话功能简述> 获得GFS某个目录下的子目录 + * <功能详细描述> + * @author chen + * @version [版本号,2016年9月8日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class GetTreeData { + ShowData showData = new ShowData(); + + /** + * <一句话功能简述> 获得所以子目录 + * <功能详细描述> + * @param name + * @return + * @see [类、类#方法、类#成员] + */ + public FolderNode getDatas(String name) { + String names[]=name.split("/"); + String only_name=names[names.length-1]; + FolderNode fileNode = new FolderNode(only_name); + fileNode.setPath(name); + Map files = showData.showFolderData(name); + if(files==null || files.size()==0){ + return fileNode; + } + fileNode.setIsFolder(files.size()); + List list = new ArrayList(); + fileNode.setChildNodes(list); + for (Map.Entry entry : files.entrySet()) { + if(entry.getKey().equals("app")){ + continue; + } + int number = Integer.parseInt(entry.getValue()); + if (number == 1) { + fileNode.getChildNodes().add(new FolderNode(entry.getKey(), number)); + } + if (number > 1) { + FolderNode temp=getDatas(name+"/"+entry.getKey()); + fileNode.getChildNodes().add(temp); + } + } + + return fileNode; + } + + + /** + * <一句话功能简述> 获得所以子目录 + * <功能详细描述> + * @param name + * @return + * @see [类、类#方法、类#成员] + */ + public FolderNode getDatasWithShell(String name) { + if(name.endsWith("/")){ + name=name.substring(0, name.length()-1); + } +// String names[]=name.split("/"); +// String only_name=names[names.length-1]; + FolderNode fileNode = new FolderNode(name); + fileNode.setPath(name); + +// String shellComment= new FileOperateHelper().fileReaderAndendline(Constant.fileGetTreeData); + String shellComment= Constant.strGetTreeData; + String sh_path="/getTreedata.sh"; + String cmd="echo -e \""+shellComment+"\" > "+sh_path+" & chmod +x "+sh_path; + Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); +// Map files = showData.showFolderData(name); + List files=Constant.ganymedSSH.execCmdWaitAcquiescent(sh_path+" "+name); + if(files==null){ + return null; + } + if(files.size()==0){ + return fileNode; + } + for(String file:files){ + + } + + return fileNode; + } + @Test + public void test_getTreeData() { + + GetTreeData getTreeData=new GetTreeData(); +// FolderNode fileOrFolder=getTreeData.getDatas("/home/gfs_ftp_point"); + FolderNode fileOrFolder=getTreeData.getDatasWithShell("/home/gfs_ftp_point/"); + System.out.println(fileOrFolder); + } +} +/* +class FileOrFolder { + String name; + int isFolder; // 1 is file and other integer is folder show children number + List children; + + public FileOrFolder(String name) { + // TODO Auto-generated constructor stub + this.name = name; + } + + public FileOrFolder(String name, int isFolder) { + // TODO Auto-generated constructor stub + this.name = name; + this.isFolder = isFolder; + } +} + +*/ diff --git a/src/com/platform/glusterfs/RemoveData.java b/src/com/platform/glusterfs/RemoveData.java new file mode 100644 index 00000000..6f854b26 --- /dev/null +++ b/src/com/platform/glusterfs/RemoveData.java @@ -0,0 +1,56 @@ +package com.platform.glusterfs; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.junit.Test; + +import com.platform.utils.Constant; + + + +public class RemoveData { + + public static Logger log = Logger.getLogger ( RemoveData.class); + + + /** + * -1 :error; 0: the filename is not exists ; 1: right + * @param folderName + * @param fileName + * @return + */ + public int deleteFolder(String folderName){ + log.info("start delete "+folderName); + + ShowData showData=new ShowData(); + Map reStrings=showData.showFolderData(folderName); + + if(reStrings==null){ + log.error("3301 "+folderName+" is not exists"); + return -1; + } + + String command="rm -r "+folderName; + +// int status=runCommand.runCommand(command); + Constant.ganymedSSH.execCmdNoWaitAcquiescent(command); + + log.info("delete "+folderName+" running"); + return 1; + } + + + + + @Test + public void testDeleteFolderFiles() { + PropertyConfigurator.configure("log4j.properties"); + deleteFolder("/home/ubuntu"); + } + +} diff --git a/src/com/platform/glusterfs/SetCluster.java b/src/com/platform/glusterfs/SetCluster.java new file mode 100644 index 00000000..8f260e5a --- /dev/null +++ b/src/com/platform/glusterfs/SetCluster.java @@ -0,0 +1,67 @@ + +package com.platform.glusterfs; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.hamcrest.core.Is; + +import com.platform.utils.Constant; +import com.platform.utils.Support; + +public class SetCluster { + public static Logger log = Logger.getLogger ( SetCluster.class); + + /** + * 向集群中添加节点 + * 返回1表示添加成功;-1表示ip不合法,-2 表示出错,0表示添加失败 + * @param peerip + * @return + * @see [类、类#方法、类#成员] + */ + public int probePeer(String peerip){ + if(!Support.checkIP(peerip)){ + log.error(peerip +"is illegal!" ); + return -1; + } + String cmd="gluster peer probe "+peerip; + List reStrings=Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + if(reStrings==null || reStrings.size()==0){ + log.error("detach error! "); + return -2; + } + if(reStrings.contains(Constant.success)){ + log.info("probe success!"); + return 1; + } + log.info("probe failed!"); + return 0; + } + + /** + * 删除集群中节点 + * 返回1表示删除成功;-1表示ip不合法,-2 表示出错,0表示添加失败 + * @param peerip + * @return + * @see [类、类#方法、类#成员] + */ + public int detachPeer(String peerip){ + if(!Support.checkIP(peerip)){ + log.error(peerip +"is illegal!" ); + return -1; + } + String cmd="gluster peer detach "+peerip; + List reStrings=Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + if(reStrings==null || reStrings.size()==0){ + log.error("detach error! "); + return -2; + } + if(reStrings.contains(Constant.success)){ + log.info("detach success!"); + return 1; + } + log.info("detach failed!"); + return 0; + } +} + diff --git a/src/com/platform/glusterfs/SetVolume.java b/src/com/platform/glusterfs/SetVolume.java new file mode 100644 index 00000000..2d3858de --- /dev/null +++ b/src/com/platform/glusterfs/SetVolume.java @@ -0,0 +1,540 @@ + +/** + * @author 李乾坤 + * 进行volume的一系列操作,如创建、开启停止volume,为volume添加或删除brick + */ +package com.platform.glusterfs; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.junit.Test; + +import com.platform.utils.Constant; + +public class SetVolume { + public static Logger log = Logger.getLogger(SetVolume.class); + + /** + * 创建volume 返回值:创建并挂载成功 1 1:可以创建 ;-1:brick的ip不在集群中或者未连接; -2 -3 + * -4:类型与brick数目不匹配 ; -5 :volumeName 已经存在;-6:挂载点存在且不为空,不能作为挂载点; -7:未知错误 + * + * @param volumeName + * @param count + * @param type + * @param bricks + * @param mountPoint + * @return + * @see [类、类#方法、类#成员] + */ + public int createVolume(String volumeName, int count, String type, List bricks, String mountPoint) { + log.info("Creat new volume"); + + // 判断创建volume的条件是否满足 + int able = isAbleCreateVolume(volumeName, count, type, bricks, mountPoint); + + if (able == 1) { + String command = null; + // 将brics从List变量中提取出来并连接成可以在命令行中使用的格式 + String commandarg = concat(bricks); + + /* + * verify the type + */ + if (type.equals(Constant.distributed)) { + command = "gluster volume create " + volumeName + " " + commandarg + "force"; + } else if (type.equals(Constant.replica) || type.equals(Constant.stripe)) { + command = "gluster volume create " + volumeName + " " + type + " " + count + " " + commandarg + "force"; + } + + // 执行命令 + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + + // 创建成功时返回信息格式:volume create: volumename success: + if (reStrings == null || reStrings.size() == 0) { + log.error("3106 " + command + " run return error"); + return -7; + } + if (reStrings.get(0).contains("volume create: " + volumeName + ": " + "success:")) { + log.info("create volume " + volumeName + " successed!"); + // 创建成功则启动并进行挂载 + if (startVolume(volumeName) == 0) { + log.info("start volume " + volumeName + " successed!"); + + log.info("create "+mountPoint); + new CopyData().createFolders(mountPoint); + + // 进行挂载 + String command3 = "mount -t glusterfs " + Constant.hostIp + ":" + volumeName + " " + mountPoint; + List reStrings3 = Constant.ganymedSSH.execCmdWaitAcquiescent(command3); + + if (reStrings3.size() == 0 || reStrings.get(0).contains("GlusterFS is already mounted")) { + log.info("mount point successed!"); + String addRecord = "echo \"" + volumeName + ":" + mountPoint + "\" >> " + Constant.MountRecord; + Constant.ganymedSSH.execCmdNoWaitAcquiescent(addRecord); + return 1; + } + } + } else { + log.error("3104 volume create failed with error" + reStrings.get(0)); + // System.out.println(reStrings.get(0)); + return -7; + } + return 1; + } else { + log.error("给出的参数不满足创建条件"); + // System.out.println("给出的参数不满足创建条件"); + return able; + } + + } + + /** + * 删除volume 1 表示成功 ;-1表示volume name不存在;-2表示停止volume 失败; + * -3表示删除失败,-4表示/gfsAutoMount/mountPoint.record文件不存在 + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public int deleteVolume(String volumeName) { + int status = 0; + VolumeInfo volumeInfo = new VolumeInfo(); + List volumeNames = volumeInfo.showAllVolumeName(); + if (!volumeNames.contains(volumeName)) { + log.error("3801 " + volumeName + " is not exists !"); + return -1; + } + + List mountPoints = volumeInfo.getVolumeMountPoint(volumeName); + + String cmd = "cat " + Constant.MountRecord; + List mountRecord = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + + if (stopVolume(volumeName) != 0) { + + return -2; + } + + String command = "echo -e \"y\"| gluster volume delete " + volumeName; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + if (reStrings == null || reStrings.size() == 0 + || !(reStrings.get(0).contains("volume delete: " + volumeName + ": success"))) { + log.error("3803 : delete volume " + volumeName + " failed !"); + return -3; + } + log.info("delete " + volumeName + " successed!"); + if (mountRecord.size() != 0 && mountPoints.get(0).contains(Constant.noSuchFile)) { + log.error("3804 : " + Constant.MountRecord + " is not exits"); + return -4; + } + for (String mountPoint : mountPoints) { + command = "umount -l " + mountPoint; + Constant.ganymedSSH.execCmdNoWaitAcquiescent(command); + log.info("umount " + mountPoint + " successed!"); + String oneRecord=volumeName+":"+mountPoint; + if (mountRecord.contains(oneRecord)) { + mountRecord.remove(oneRecord); + } + + } + String newRecords=""; + for(String one:mountRecord){ + newRecords+=one+"\n"; + } + command="echo -ne \""+newRecords+"\" > "+Constant.MountRecord; + Constant.ganymedSSH.execCmdNoWaitAcquiescent(command); + return 1; + } + + /** + * 为指定的volume添加brick,参数中需要指定类型、数量等 返回值:1成功 ;其他失败 + * 过程中需要先检查volume是否存在,还需检查给出的brick数量与类型、count是否相符 + * + * @param volumeName + * @param brickName + * @param count + * @param type + * @return + * @see [类、类#方法、类#成员] + */ + public int addBrickVolume(String volumeName, List brickName, int count, String type) { + // 检查是否满足添加bricks的条件 + int able = isAble(volumeName, count, type, brickName); + if (able != 1) { + return able; + } + + String command = ""; + log.info("add brick to the specified volume"); + + String brick = concat(brickName); + + if (type.equals(Constant.distributed)) + command = "gluster volume add-brick " + volumeName + " " + brick + "force"; + else if (type.equals(Constant.replica)) + command = "gluster volume add-brick " + volumeName + " " + "replica " + count + " " + brick + "force"; + else if (type.equals(Constant.stripe)) + command = "gluster volume add-brick " + volumeName + " " + "stripe " + count + " " + brick + "force"; + + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + + // 添加成功的返回信息是:volume add-brick: success + if (reStrings != null && reStrings.size() > 0 && reStrings.get(0).contains("volume add-brick: success")) { + log.info("添加brick成功!"); + return 1; + } else { + log.error("3205 add brick failed,please check the system"); + // System.out.println("3202 add brick failed,please check the + // system"); + return -5; + } + } + + /** + * 为指定的volume删除brick,参数中需要指定类型、数量等 返回值:1 成功 ;其他 失败 + * 过程中需要先检查volume是否存在,还需检查给出的brick数量与类型、count是否相符 + * + * @param volumeName + * @param brickName + * @param count + * @param type + * @return + * @see [类、类#方法、类#成员] + */ + public int deleteBrickVolume(String volumeName, List brickName, int count, String type) { + int able = isAble(volumeName, count, type, brickName); + + if (able != 1) { + return able; + } + String command = null; + + log.info("delete brick of the specified volume"); + + String brick = concat(brickName); + + if (type.equals(Constant.distributed)) { + command = "echo -e \"y\" | gluster volume remove-brick " + volumeName + " " + brick + " force"; + } else if (type.equals(Constant.replica)) { + command = "echo -e \"y\" | gluster volume remove-brick " + volumeName + " repli " + count + " " + brick + + " force"; + } else if (type.equals(Constant.stripe)) { + command = "echo -e \"y\" | gluster volume remove-brick " + volumeName + " stripe " + count + " " + brick + + " force"; + } + + if (command == null) { + log.error("3305 remove brick failed,please check the system"); + return -5; + } + log.info("即将执行删除命令"); + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + // System.out.println(reStrings); + log.info("删除命令执行完毕"); + + // 删除成功的返回信息是“volume remove-brick: success” + if (reStrings.get(0).contains("volume remove-brick: success")) { + { + log.info("删除brick成功"); + return 1; + } + } else { + log.error("3305 remove brick failed,please check the system"); + + return -5; + } + + } + + /* + * 停止指定volume 参数中需给出volume的名字 返回值: 0 成功 -1 失败 + * 需要先检查volume是否存在,然后判断volume的状态是否已经是停止状态 + */ + public int stopVolume(String volumeName) { + log.info("stop volume"); + + // 首先需要判断volume是否存在,调用其他函数返回所有volume的名字 + boolean volumeExist = false; + + List volume = new VolumeInfo().showAllVolumeName(); + for (String temp : volume) { + if (temp.equals(volumeName)) { + volumeExist = true; + break; + } + } + + if (!volumeExist) { + // volume不存在 + log.error("3501 the volume doesnot exist"); + System.out.println("3501 the volume doesnot exist"); + return -1; + } else { + // volume存在,则需判断volume的状态是否已经为“stop” + if (new VolumeInfo().getVolumeStatus(volumeName).equals("Stopped")) { + log.error("3502 the volume is already stoped"); + System.out.println("3502 the volume is already stoped"); + return 0; + } else { + String command = "echo -e \"y\"| gluster volume stop " + volumeName; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + + // 标记操作结果:operation = 1 操作成功 + // operation = 0 操作失败 + int operation = 0; + for (String temp2 : reStrings) { + if (temp2.contains("volume stop: " + volumeName + ": " + "success")) { + operation = 1; + break; + } + System.out.println("operation: " + operation); + } + + if (operation == 1) { + return 0; + } else { + log.error("3503 stop " + volumeName + " failed"); + System.out.println("3503 stop " + volumeName + " failed"); + return -1; + } + + } + } + } + + /* + * 开启指定volume 参数中需给出volume的名字 返回值: 0 成功 -1 失败 + * 需要先检查volume是否存在,然后判断volume的状态是否已经是开启状态 + */ + public int startVolume(String volumeName) { + log.info("start volume"); + boolean volumeExist = false; + List volume = new VolumeInfo().showAllVolumeName(); + + for (String temp : volume) { + if (temp.equals(volumeName)) { + volumeExist = true; + break; + } + } + + if (volumeExist) { + if (!(new VolumeInfo().getVolumeStatus(volumeName).equals("Started"))) { + String command = "gluster volume start " + volumeName; + + int operation = 0; + + // 执行命令 + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + for (String temp2 : reStrings) { + if (temp2.equals("volume start: " + volumeName + ": " + "success")) { + operation = 1; + } + } + + if (operation == 1) { + return 0; + } else { + log.error("3602 start volume failed"); + System.out.println("3602 start volume failed"); + return -1; + } + } else { + log.error("volume已经开启"); + System.out.println("volume已经开启"); + return -1; + } + } else { + log.error("3601 the volume does not exist"); + // System.out.println("3601 the volume does not exist"); + return -1; + } + } + + // 需要将存于List变量中的brick的位置组装成可以在glusterfs命令行中直接使用的格式 + public String concat(List brickName) { + StringBuffer result = new StringBuffer(); + int len = brickName.size(); + for (int i = 0; i < len; i++) { + result.append(brickName.get(i)); + result.append(" "); + } + return result.toString(); + } + + /* + * 只在创建volume时使用此函数 创建volume时对不同数据卷,brick的数量需要满足和count的关系 + * 首先判断它们是否满足关系,在不满足的关系的情况下是肯定无法完成操作的 1:可以创建 ;-1:brick的ip不在集群中或者未连接; -2 -3 + * -4 :类型与brick数目不匹配 ; -5 :volumeName 已经存在;-6:挂载点存在且不为空,不能作为挂载点; -7:未知错误 + */ + public int isAbleCreateVolume(String volumeName, int count, String type, List bricks, String mountPoint) { + int status = 0; + + int length = bricks.size(); + + if (type.equals(Constant.distributed)) { + if (count != 0) { + log.error("3101 the kind of distributed requires the arg of count to be 0"); + return -2; + } + } + if (type.equals(Constant.stripe)) { + if (length % count != 0) { + log.error("3102 the number of bricks should be the same as or the times of the stripe count"); + return -3; + } + } + if (type.equals(Constant.replica)) { + if ((length % count) != 0) { + log.error( + "3103 the number of bricks should be the same as the replicate count or the times of replicate count"); + return -4; + } + } + + Map peer_status = new ClusterInfo().showClusterInfo(); + peer_status.put(Constant.hostIp, Constant.peerincluster_connected); + for (String brick : bricks) { + brick = brick.split(":")[0]; + if (!(peer_status.containsKey(brick) && peer_status.get(brick).equals(Constant.peerincluster_connected))) { + log.error("3105 birck " + brick + " ip is not in cluster"); + return -1; + } + + } + + List volumeNames = new VolumeInfo().showAllVolumeName(); + if (volumeNames == null) { + log.error("3108 showAllVolumeName return error"); + return -7; + } + if (volumeNames.contains(volumeName)) { + log.error("3106 " + volumeName + " is already exists! "); + return -5; + } + + /* + Map datas = new ShowData().showFolderData(mountPoint); + if (datas != null && datas.size() > 0) { + log.error("3107 " + mountPoint + " is not exists or not empty ! "); + return -6; + } + */ + return 1; + } + + /** + * 添加或删除volume的brick时,首先需要判断volume是否存在,然后需要判断volume类型、count及brick数目 + * + * @param volumeName + * @param count + * @param type + * @param bricks + * @return 1 满足条件,可以添加;-1 :volume name is not exists;-2,-3,-4 类型与brick数量不匹配; + */ + public int isAble(String volumeName, int count, String type, List bricks) { + List volumeNames = new VolumeInfo().showAllVolumeName(); + + if (!volumeNames.contains(volumeName)) { + log.error("3201:" + volumeName + " is not exists! "); + return -1; + } + + int length = bricks.size(); + if (type.equals("distribute")) { + if (count == 0) + return 1; + else { + log.error("3202: the kind of distributed requires the arg of count to be 0"); + // System.out.println(" the kind of distributed requires the + // arg of count to be 0"); + return -2; + } + } + + if (type.equals("stripe")) { + if (length % count == 0) + return 1; + else { + log.error("3203: the number of bricks should be the same as or the times of the stripe count"); + // System.out.println(" the number of bricks should be the + // same as or the times of the stripe count"); + return -3; + + } + } + if (type.equals("replicate")) { + if ((length % count) == 0) + return 1; + else { + log.error( + "3204: the number of bricks should be the same as the replicate count or the times of replicate count"); + + return -4; + } + } + + return 1; + } + + @Test + public void test_deleteVolume(){ + System.out.println(deleteVolume("lili_test1")); + } +// @Test + public void test_createVolume(){ + List bricksToCreate = new ArrayList(); + bricksToCreate.add("192.168.0.110:/lili_test1"); + bricksToCreate.add("192.168.0.116:/lili_test1"); + System.out.println(createVolume("lili_test1", 0, "distributed", bricksToCreate, "/home/lili_test1_point")); + } + public static void main(String[] args) { + SetVolume setVolume = new SetVolume(); + int operation = 0; + // PropertyConfigurator.configure("log4j.properties"); + // TODO Auto-generated method stub + // 测试创建volume的代码 + +// List bricksToCreate = new ArrayList(); +// bricksToCreate.add("192.168.0.110:/v2"); +// bricksToCreate.add("192.168.0.116:/v2"); +// operation = setVolume.createVolume("v2", 0, "distributed", bricksToCreate, "/home/v2_point"); + // operation = setVolume.deleteVolume("v3"); + // + // // 以下是测试添加brick的代码 + // + // List bricksToAdd = new ArrayList(); + // bricksToAdd.add("192.168.191.23:/v3"); + // operation = setVolume.addBrickVolume("v3", bricksToAdd, 0, + // "distribute"); + // System.out.println(operation); + + // 以下代码是测试删除brick的代码 + // List bricksToAdd= new ArrayList(); + // bricksToAdd.add("192.168.191.23:/v3"); + // operation = + // setVolume.deleteBrickVolume("v3",bricksToAdd,0,"distribute"); + // System.out.println(operation); + // 以下是测试start volume的代码 + // String volumeToStart = "testcreate" ; + // int startOperation = startVolume(volumeToStart); + // System.out.println(startOperation); + // 以下是测试stop volume + String volumeToStop = "v3"; + // int startOperation = setVolume.stopVolume(volumeToStop); + // 以下是测试创建volume并完成挂载的代码 + // List bricksToCreate= new ArrayList(); + // bricksToCreate.add("192.168.214.135:/home/create"); + // bricksToCreate.add("192.168.214.138:/home/create"); + // + // int operation = + // createVolume("createAndmount",0,"distribute",bricksToCreate,"/mnt/create"); + // System.out.println(operation); + } +} diff --git a/src/com/platform/glusterfs/ShowData.java b/src/com/platform/glusterfs/ShowData.java new file mode 100644 index 00000000..46466f67 --- /dev/null +++ b/src/com/platform/glusterfs/ShowData.java @@ -0,0 +1,129 @@ +package com.platform.glusterfs; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + + +import org.apache.log4j.PropertyConfigurator; +import org.junit.Test; + +import com.platform.utils.Constant; + + +public class ShowData { + + public static Logger log = Logger.getLogger ( ShowData.class); + + /** + * get the data of volumeName Map s1 is data name and s2 is type file or folder + * <功能详细描述> + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public Map showVolumeFiles(String volumeName){ +// log.info("start show the data"); + Map data_type=new HashMap(); + /** + * get mount point of volumeName + */ + String folderName=volumeName; + + data_type=showFolderData(volumeName); + return data_type; +} + /** + * get the data of folder name + * Map is folder name and type 1 is file and others is folder + + + * @param FolderName + * @return + */ + public Map showFolderData(String folderName){ +// log.info(" start get "+folderName+" data"); + + + Map data_type=new HashMap(); + String command="ls -l "+folderName; + + /* + * RunCommand runCommand=new RunCommand(); List + * reStrings=runCommand.runCommandWait(command); + */ + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + if (reStrings == null) { + log.error("2101 command get result is null"); + return null; + } + if(reStrings.size()==0){ + log.info("2102 the folder is empty"); + return data_type; + } + if(reStrings.get(0).contains("No such file or directory")){ + log.info("2103 the "+folderName+" is not exists"); + return null; + } + /** + * remove first line total number + */ + reStrings.remove(0); + + for(Iterator it2 = reStrings.iterator();it2.hasNext();){ + String line=(String)it2.next(); + line=line.replaceAll(" +", " "); + String keyValue[]=line.split(" "); + if(keyValue.length<9){ + log.error("2104 "+line+" length is short"); + continue; + } + + data_type.put(keyValue[8], keyValue[1]); + + } +// log.info(" get "+folderName+" data successed"); + return data_type; + } + + /** + * 返回folder的大小字节表示 + * -2表示获取大小出错,-1表示folder不存在,其他表示folder的大小 + * @param folderPath + * @return + * @see [类、类#方法、类#成员] + */ + public long getFolderSize(String folderPath) { +// log.info("get " + folderPath + " Size "); + + String command = "du -k -d 0 "+folderPath+" | grep " + folderPath + "|awk \'{print $1}\'"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(command); + if(reStrings==null || reStrings.size()==0){ + log.error("get " + folderPath + " Size error!"); + return -2; + } + if (reStrings.get(0).contains(Constant.noSuchFile)) { + log.error(folderPath+" is not exists"); + return -1; + } + long size = Long.valueOf(reStrings.get(0)); + return size; + } + + + /** + * + * <一句话功能简述> + * <功能详细描述> + * @see [类、类#方法、类#成员] + */ + @Test + public void testShowData(){ + + System.out.println(showFolderData("/home")); + + } +} \ No newline at end of file diff --git a/src/com/platform/glusterfs/SizeInfo.java b/src/com/platform/glusterfs/SizeInfo.java new file mode 100644 index 00000000..8327e4f1 --- /dev/null +++ b/src/com/platform/glusterfs/SizeInfo.java @@ -0,0 +1,93 @@ +package com.platform.glusterfs; + + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +import com.platform.utils.Constant; + +public class SizeInfo { + public static Logger log = Logger.getLogger(ClusterInfo.class); + VolumeInfo volumeInfo = new VolumeInfo(); + + /** + * 获取集群�?��volume size + * 返回值:-1:错�? 0:没有volume long:size大小 + * @return + */ + public long showAllSize() { +// log.info("get AllSize "); + List volumeNames = volumeInfo.showAllVolumeName(); + if (volumeNames == null) { + log.error("1201 showAllVolumeName error"); + return -1; + } + if (volumeNames.size() == 0) { + log.error("1202 It is not exist any volume"); + return 0; + } + List reStrings = null; + long size = 0L; + + for (String str : volumeNames) { + String command = "df |grep " + str + "|awk \'{print $2}\'"; + reStrings = Constant.ganymedSSH.execCmdWait(Constant.hostIp, Constant.rootUser, Constant.rootPasswd, Constant.port, + command); + if (reStrings.isEmpty()) { + log.error("1203 The brick is unmount"); + } else { + size += Long.parseLong(reStrings.get(0)); + } + + } + + return size; + } + /** + * 返回集群已用大小 + * @return + * 返回值:-1:错�? 0:没有volume long:size大小 + */ + public long showUseSize() { + log.info("get UseSize "); + + List volumeNames = volumeInfo.showAllVolumeName(); + List reStrings = null; + long size = 0L; + if (volumeNames == null) { + log.error("1201 showAllVolumeName error"); + return -1; + } + if (volumeNames.size() == 0) { + log.error("1202 It is not exist any volume"); + return 0; + } + + for (String str : volumeNames) { + String command = "df |grep " + str + "|awk \'{print $3}\'"; + reStrings = Constant.ganymedSSH.execCmdWait(Constant.hostIp, Constant.rootUser, Constant.rootPasswd, + Constant.port, command); + if (reStrings.isEmpty()) { + log.error("1202 The brick is unmount"); + } else { + size += Integer.valueOf(reStrings.get(0)); + } + + } + + return size; + } + + public static void main(String[] args) { + PropertyConfigurator.configure("log4j.properties"); + System.out.println(new SizeInfo().showAllSize()); + System.out.println(new SizeInfo().showUseSize()); + } +} \ No newline at end of file diff --git a/src/com/platform/glusterfs/VolumeInfo.java b/src/com/platform/glusterfs/VolumeInfo.java new file mode 100644 index 00000000..7e5fc985 --- /dev/null +++ b/src/com/platform/glusterfs/VolumeInfo.java @@ -0,0 +1,417 @@ + +package com.platform.glusterfs; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.junit.Test; +import org.omg.CosNaming.NamingContextExtPackage.StringNameHelper; + +import com.platform.utils.Constant; +import com.platform.utils.GanymedSSH; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 获取volume信息 <功能详细描述> + * + * @author liliy + * @version [版本号,2016年9月13日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ +public class VolumeInfo { + public static Logger log = Logger.getLogger(VolumeInfo.class); + + /** + * 显示所有volume名称 <功能详细描述> + * + * @return + * @see [类、类#方法、类#成员] + */ + public List showAllVolumeName() { +// log.info(Constant.ganymedSSH+"get volume name"); + List volNames = new ArrayList(); + + /* + * String command = "echo \"" + Constant.rootPasswd + + * "\" |sudo -S gluster volume info|grep ^Volume.Name"; RunCommand + * runCommand = new RunCommand(); List reStrings = + * runCommand.runCommandWait(command); + */ + + List reStrings = Constant.ganymedSSH + .execCmdWaitAcquiescent(Constant.glusterVolumeInfo + "|grep ^Volume.Name"); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1401 get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1402 get result is nothing"); + return null; + } + if (reStrings.get(0).contains(Constant.noVolume)) { + reStrings.clear(); + return reStrings; + } + if (!(reStrings.get(0).split(":")[0].contains("Volume Name"))) { + log.error("1403 get result string wrong"); + return null; + } + + String nameInfo = ""; + for (Iterator it = reStrings.iterator(); it.hasNext();) { + String line = (String) it.next(); + String str[] = line.split(":"); + volNames.add(str[1].replaceAll(" ", "")); + } + return volNames; + + } + + /** + * 给定参数volume的名称获得volume的类型 + * + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public String getVolumeType(String volumeName) { +// log.info("get volume type"); + String volType = ""; + + List reStrings = Constant.ganymedSSH + .execCmdWaitAcquiescent(Constant.glusterVolumeInfo + volumeName + "|grep ^Type"); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1501 get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1502 get result is nothing"); + return null; + } + if (!(reStrings.get(0).split(":")[0].contains("Type"))) { + log.error("1503 get result string wrong"); + return null; + } + + // System.out.println(reStrings); + + for (Iterator it = reStrings.iterator(); it.hasNext();) { + String line = (String) it.next(); + String str[] = line.split(":"); + volType = str[1]; + } + volType = volType.replaceAll(" ", ""); + return volType; + } + + /** + * 获取volumeName的状态 如果出错返回null,如果volumeName不存在则返回Volume volumeName does not + * exist,正常返回状态Started,Stopped,Created + * + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public String getVolumeStatus(String volumeName) { +// log.info("get volume status"); + String volStatus = ""; + String cmd = Constant.glusterVolumeInfo + " " + volumeName + " |grep ^Status"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1701 get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1702 get result is nothing"); + return null; + } + + if (reStrings.get(0).contains("does not exist")) { + log.error("1703 " + reStrings.get(0)); + return reStrings.get(0); + } + if (!(reStrings.get(0).split(":")[0].contains("Status"))) { + log.error("1704 get result string wrong"); + return null; + } + for (Iterator it = reStrings.iterator(); it.hasNext();) { + String line = (String) it.next(); + String str[] = line.split(":"); + volStatus = str[1].replaceAll(" ", ""); + } + + return volStatus; + } + + /** + * 获取volumeName的可用大小 + * volumeName不存在返回-1,获取大小错误返回-2 ,正常返回volumeName的可用大小 + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public Long getVolumeAvailableSize(String volumeName) throws Exception{ +// log.info("get volume availableSize"); + Long allSize = 0L; + + String cmd = Constant.df + " | grep " + volumeName + "|awk '{print $4}'"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1802 get result is error"); + return -2L; + } + if (reStrings.size() == 0) { + log.error("1801 " + volumeName + " is not exists!"); + return -1L; + } + Pattern pattern2 = Pattern.compile("^\\d+$"); + Matcher matcher2 = pattern2.matcher(reStrings.get(0)); + // 如果是数字 + if (matcher2.find()) { + allSize = Long.parseLong(reStrings.get(0)); + } + return allSize; + } + + /** + * 获取volumeName已用空间 + * volumeName不存在返回-1,获取大小错误返回-2 ,正常返回volumeName的已用的大小 + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public Long getVolumeUseSize(String volumeName) throws Exception{ +// log.info("get volume used size"); + Long usedSize = 0L; + if (volumeIsExists(volumeName) == false) { + log.error("1901 " + volumeName + " is not exists!"); + return -1L; + + } + + String cmd = "df | grep " + volumeName + "|awk '{print $3}'"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1901 get result is null"); + return -2L; + } + if (reStrings.size() == 0) { + log.error("1902 " + volumeName + " is not exists!"); + return -1L; + } + Pattern pattern2 = Pattern.compile("^\\d+$"); + Matcher matcher2 = pattern2.matcher(reStrings.get(0)); + // 如果是数字 + if (matcher2.find()) { + usedSize = Long.parseLong(reStrings.get(0)); + } + return usedSize; + } + + /** + * 获取volumeName的bricks + * 返回一个bircks的list ip:path,如果volumeName不存在返回null + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public List getVolumeBricks(String volumeName) { +// log.info("get volume bricks"); + + String cmd = "gluster volume info " + volumeName + " |grep ^Brick'[0-9]\\+' |awk '{print $2}'"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1601 get volume bricks wrong"); + return null; + } + if (reStrings.size()==0) { + log.error("1602 "+volumeName+" is not exists!"); + return null; + } + return reStrings; + } + + /** + * 获取volumeName所有挂载点 + * <功能详细描述> + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public List getVolumeMountPoint(String volumeName) { +// log.info("get volume MountPoint"); + List mountPoints = new ArrayList<>(); + String cmd=Constant.df + "|grep " + volumeName + "|awk '{print $6}'"; + List reStrings = Constant.ganymedSSH.execCmdWaitAcquiescent(cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("11001 get result string wrong"); + return null; + } + if (reStrings.size() == 0) { + log.error("11002 " + volumeName + " is not exists or no mountpoint"); + return null; + } + + for (String mountPoint : reStrings) { + mountPoint = mountPoint.replaceAll(" ", ""); + mountPoints.add(mountPoint); + } + return mountPoints; + } + + public String getOneVolumeMountPoint(String volumeName) { +// log.info("get one volume MountPoint"); + + String mountPoint=null; + + List mountpoints = getVolumeMountPoint(volumeName); + // System.out.println(reStrings); + if (mountpoints == null || mountpoints.size() == 0) { + log.error("11001 get result string wrong"); + return null; + } + + mountPoint=mountpoints.get(0); + return mountPoint; + } + + /** + * 获取volumeName的所有brick中数据占用空间的大小 + * 返回一个map表示bricks和数据大小 + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public Map getVolumebricksDataSize(String volumeName) { + List bricks = getVolumeBricks(volumeName); + Map brick_size = new HashMap<>(); + if (bricks == null) { + return null; + } + for (String brick : bricks) { + String ipAndpath[] = brick.split(":"); + String ip = ipAndpath[0]; + String path = ipAndpath[1]; + String cmd = "du -d 0 " + path + "|awk '{print $1}'"; + List reStrings = Constant.ganymedSSH.execCmdWait(ip, Constant.rootUser, Constant.rootPasswd, + Constant.port, cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1901 get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1902 "+brick+" is not exits!"); + return null; + } + Pattern pattern = Pattern.compile("[0-9]*"); + Matcher isNum = pattern.matcher(reStrings.get(0)); + if (!isNum.matches()) { + log.error("1903 " + reStrings.get(0) + " is unexpect"); + return null; + } + brick_size.put(brick, Double.parseDouble(reStrings.get(0))); + } + return brick_size; + } + + /** + * 获取volumeName的所有brick中可用空间大小 + * 返回一个map表示bricks和可用空间大小 + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public Map getVolumebricksAvailableSize(String volumeName) { + List bricks = getVolumeBricks(volumeName); + Map brick_size = new HashMap<>(); + if (bricks == null) { + return null; + } + for (String brick : bricks) { + String ipAndpath[] = brick.split(":"); + String ip = ipAndpath[0]; + String path = ipAndpath[1]; + String cmd = "df " + path + "|awk '{print $4}'"; + List reStrings = Constant.ganymedSSH.execCmdWait(ip, Constant.rootUser, Constant.rootPasswd, + Constant.port, cmd); + // System.out.println(reStrings); + if (reStrings == null) { + log.error("1901 get result is null"); + return null; + } + if (reStrings.size() == 0) { + log.error("1902 get result is nothing"); + return null; + } + Pattern pattern = Pattern.compile("[0-9]*"); + Matcher isNum = pattern.matcher(reStrings.get(1)); + if (!isNum.matches()) { + log.error("1903 " + reStrings.get(1) + " is unexpect"); + return null; + } + brick_size.put(brick, Double.parseDouble(reStrings.get(1))); + } + return brick_size; + } + + /** + * 判断volumeName是否存在,存在返回true,不存在返回false + * + * @param volumeName + * @return + * @see [类、类#方法、类#成员] + */ + public boolean volumeIsExists(String volumeName) { + List volumes = showAllVolumeName(); + if (volumes == null) { + return false; + } + if (volumes.contains(volumeName)) { + return true; + } + return false; + } + + // @Test + public void test_getVolumebricksDataSize() { + System.out.println(getVolumebricksDataSize("gfs_ftp")); + } + + // @Test + public void test_getVolumebricksAvailableSize() { + System.out.println(getVolumebricksAvailableSize("gfs_ftp")); + } + + // @Test + public void test_getVolumeBricks() { + getVolumeBricks("gfs_ftp"); + } + + @Test + public void test_getVolumeStatus() { + System.out.println(getVolumeStatus("gs_fp")); + } + + // @Test + public void test_getVolumeMountPoint() { + System.out.println(getVolumeMountPoint("gfs_ftp")); + System.out.println(getVolumeMountPoint("v1")); + } +} diff --git a/src/com/platform/service/VolumeService.java b/src/com/platform/service/VolumeService.java new file mode 100644 index 00000000..3dbe3f5a --- /dev/null +++ b/src/com/platform/service/VolumeService.java @@ -0,0 +1,119 @@ +package com.platform.service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.platform.entities.Brick; +import com.platform.entities.FolderNode; +import com.platform.entities.VolumeEntity; +import com.platform.glusterfs.CheckoutMD5; +import com.platform.glusterfs.ClusterInfo; +import com.platform.glusterfs.GetTreeData; +import com.platform.glusterfs.VolumeInfo; +import com.platform.utils.CacheTreeData; + +public class VolumeService { + + public static Logger log = Logger.getLogger(VolumeService.class); + + /** Volume信息查询 */ + private VolumeInfo volumeInfo = new VolumeInfo(); + + private ClusterInfo cluster = new ClusterInfo(); + + /** gfs目录树形展示 */ + private GetTreeData gfsTree = new GetTreeData(); + + public void getVolumeMsg() { + List folderlist = new ArrayList(); + List volumeList = new ArrayList(); + // brick状态 map集合 + Map brickStatusMap = cluster.showClusterInfo(); + + // 查询 volume name + List volumeNameList = volumeInfo.showAllVolumeName(); + if (null != volumeNameList) { + for (String volumeName : volumeNameList) { + try { + VolumeEntity volume = new VolumeEntity(); + volume.setName(volumeName); + List path = volumeInfo + .getVolumeMountPoint(volumeName); + // 默认加载第一个路径 + if (null != path) { + for (String one : path) { + if (!one.contains("df")) { + volume.setPath(one); + } + } + } + if (null == volume.getPath()) { + volume.setPath(""); + } + volume.setAllSize(volumeInfo + .getVolumeAvailableSize(volumeName) + + volumeInfo.getVolumeUseSize(volumeName)); + // 状态Started,Stopped,Created + String status = volumeInfo.getVolumeStatus(volumeName); + if ("Started".equals(status)) { + volume.setStatus(true); + } else { + volume.setStatus(false); + } + volume.setUsedSize(volumeInfo.getVolumeUseSize(volumeName)); + volume.setType(volumeInfo.getVolumeType(volumeName)); + // TODO 查询brick-- + // 返回 ip:path + List brickStrs = volumeInfo + .getVolumeBricks(volumeName); + // brick已用大小: + Map usedSize = volumeInfo + .getVolumebricksDataSize(volumeName); + Map availableSize = volumeInfo + .getVolumebricksAvailableSize(volumeName); + + List brickList = new ArrayList(); + for (String brickIpPath : brickStrs) { + Brick b = new Brick(); + String ipAndpath[] = brickIpPath.split(":"); + String brickip = ipAndpath[0]; + String brickpath = ipAndpath[1]; + // iP , path , + b.setIp(brickip); + if (brickStatusMap == null + || brickStatusMap.size() == 0) { + b.setStatus(false); + } else if (brickStatusMap.containsKey(brickip)) { + b.setStatus(true); + } else { + b.setStatus(false); + } + b.setPath(brickpath); + b.setAvailableSize(availableSize.get(brickIpPath)); + b.setUsedSize(usedSize.get(brickIpPath)); + brickList.add(b); + } + volume.setBrick(brickList); + + // 默认加载第一个路径 + if (null != path && path.size() > 0) { + // 装入 folder: + // 查询 每个 volume 下的 folder + FolderNode foldertmp = gfsTree.getDatas(path.get(0)); + folderlist.add(foldertmp); + } + volumeList.add(volume); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + // 更新folder 目录 + CacheTreeData.setFolders(folderlist); + CacheTreeData.setVolumeList(volumeList); + } + +} diff --git a/src/com/platform/utils/CacheTreeData.java b/src/com/platform/utils/CacheTreeData.java new file mode 100644 index 00000000..d0119a48 --- /dev/null +++ b/src/com/platform/utils/CacheTreeData.java @@ -0,0 +1,39 @@ +package com.platform.utils; + +import java.util.List; +import java.util.Map; + +import com.platform.entities.FolderNode; +import com.platform.entities.VolumeEntity; + +public class CacheTreeData { + + private static List folders = null; + + private static List volumeList = null; + + public static List getFolders() { + return folders; + } + + public synchronized static void setFolders(List folders) { + CacheTreeData.folders = folders; + } + + /** + * @return the volumeList + */ + public static List getVolumeList() { + return volumeList; + } + + /** + * @param volumeList the volumeList to set + */ + public synchronized static void setVolumeList(List volumeList) { + CacheTreeData.volumeList = volumeList; + } + +} + + diff --git a/src/com/platform/utils/Constant.java b/src/com/platform/utils/Constant.java new file mode 100644 index 00000000..33f7e6eb --- /dev/null +++ b/src/com/platform/utils/Constant.java @@ -0,0 +1,50 @@ + +package com.platform.utils; + +import java.util.HashMap; + +public class Constant { + public static String rootUser = "root"; + public static String rootPasswd = "root"; +// public static String hostIp = "192.168.191.23"; + public static String hostIp = ""; + public static int port = 22; + public static String glusterPeerStatus = "gluster peer status"; + public static String glusterVolumeInfo = "gluster volume info "; + public static String df = "df -k "; + public static String peerincluster_connected = "PeerinCluster(Connected)"; + public static String peerincluster_disconnected = "PeerinCluster(Disconnected)"; + public static String peerNotinCluster = "PeerNotinCluster"; + public static String distributed = "distributed"; + public static String replica = "replica"; + public static String stripe = "stripe"; + public static String noVolume = "No volumes present"; + public static String success = "success"; + public static String failed = "failed"; + public static String noSuchFile = "No such file or directory"; + public static GanymedSSH ganymedSSH = null; + public static String fileGetTreeData = "WebContent\\WEB-INF\\config\\getTreedata.sh"; + public static String AutoMountfile="/gfsAutoMount/AutoRun.sh"; + public static String MountRecord="/gfsAutoMount/mountPoint.record"; + public static String strGetTreeData = "function ergodic(){\n " + + "for file in \\`ls \\$1\\`\n do\n if [ \"\\$file\" != \"app\" -a -d \\$1\\\"/\\\"\\$file ]\n " + + "then\n ergodic \\$1\"/\"\\$file\n else\n local path=\\$1\"/\"\\$file\n " + + "echo \\$path \n fi\n done\n}\n\nIFS=\\$\\'\\n\\' " + + "#这个必须要,否则会在文件名中有空格时出错\nINIT_PATH=\".\";\nergodic \\$1\n"; + + /** + * volume 获取的线程休眠时间 + */ + public final static int moveFileMaxNum = 1; + + /** + * volume 获取的线程休眠时间 + */ + public final static int get_volume_sleep_time = 10000; + + /** + * volume 获取的线程休眠时间 + */ + public final static int update_dataInfo_sleep_time = 1500; + +} diff --git a/src/com/platform/utils/FileOperateHelper.java b/src/com/platform/utils/FileOperateHelper.java new file mode 100644 index 00000000..60484610 --- /dev/null +++ b/src/com/platform/utils/FileOperateHelper.java @@ -0,0 +1,99 @@ +package com.platform.utils; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +import org.junit.Test; + +/** + * 文件读写操作帮助类 + * + * @author wuming + * + */ +public class FileOperateHelper { + + /** + * 以追加的方式将信息写入文件 + * + * @param path + * @param message + */ + @SuppressWarnings("resource") + public static void fileWrite(String path, String message) { + if (null == path || "".equals(path)) { + return; + } + try { + path = path+".log"; + File file = new File(path); + if (file.exists()) + file.createNewFile(); + FileOutputStream out = new FileOutputStream(file, true); // 如果追加方式用true + StringBuffer sb = new StringBuffer(); + sb.append(message); + out.write(sb.toString().getBytes("utf-8")); + } catch (IOException e) { + // TODO: handle exception + } + } + + /** + * 文件读取方法 + * @param path + * @return + */ + @SuppressWarnings("resource") + public static String fileReader(String path) { + StringBuffer sb = new StringBuffer(); + String tempString = ""; + try { + File file = new File(path); + if (!file.exists()) + return "当前没有日志信息!"; + FileInputStream fis = new FileInputStream(file); + BufferedReader br = new BufferedReader(new InputStreamReader(fis,"UTF-8")); + while ((tempString = br.readLine()) != null) { + sb.append(tempString).append("\r\n"); + } + } catch (Exception e) { +// Configs.CONSOLE_LOGGER.info(e.getMessage()); + } + return sb.toString(); + } + + /** + * 文件读取方法 + * @param path + * @return + */ + + @SuppressWarnings("resource") + public static String fileReaderAndendline(String path) { + + StringBuffer sb = new StringBuffer(); + String tempString = ""; + try { + File file = new File(path); + if (!file.exists()) + + return ""; + + FileInputStream fis = new FileInputStream(file); + BufferedReader br = new BufferedReader(new InputStreamReader(fis)); + while ((tempString = br.readLine()) != null) { + sb.append(tempString+"\n"); + } + } catch (Exception e) { + // TODO: handle exception + } + return sb.toString(); + } + + + +} diff --git a/src/com/platform/utils/GanymedSSH.java b/src/com/platform/utils/GanymedSSH.java new file mode 100644 index 00000000..36103ce3 --- /dev/null +++ b/src/com/platform/utils/GanymedSSH.java @@ -0,0 +1,291 @@ + +package com.platform.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; + +import ch.ethz.ssh2.Connection; +import ch.ethz.ssh2.Session; +import ch.ethz.ssh2.StreamGobbler; + +import ch.ethz.ssh2.*; + + + +public class GanymedSSH { + public static Logger log = Logger.getLogger(GanymedSSH.class); + Connection conn; + public Map otherConns; + public boolean status = true;// 锟角凤拷锟斤拷锟街达拷锟斤拷锟斤拷锟阶刺� + + public GanymedSSH() { + // TODO Auto-generated constructor stub + + } + + public GanymedSSH(String host, String username, String password, int port) { + // TODO Auto-generated constructor stub + try { + conn = getOpenedConnection(host, username, password, port); + otherConns=new HashMap(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + + public static Connection getOpenedConnection(String host, String username, String password, int port) + throws IOException { + + Connection conns = new Connection(host, port); + conns.connect(); // make sure the connection is opened + boolean isAuthenticated = conns.authenticateWithPassword(username, password); + if (isAuthenticated == false) + throw new IOException("Authentication failed."); + return conns; + } + + public void execCmdNoWaitAcquiescent(String cmd) { +// String host=Constant.hostIp; +// String username=Constant.rootUser; +// String password=Constant.rootPasswd; +// int port=Constant.port; + + Session sess = null; + try { + + sess = conn.openSession(); + // 执锟斤拷cmd + sess.execCommand(cmd); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + sess.close(); + + } + } + + public void execCmdNoWait(String host, String username, String password, int port, String cmd) { + + Session sess = null; + Connection new_conn; + try { + if(Constant.hostIp.equals(host)){ + new_conn=conn; + } + else if(otherConns.containsKey(host) && otherConns.get(host)!=null){ + new_conn=otherConns.get(host); + } + else{ + new_conn = getOpenedConnection(host, username, password, port); + otherConns.put(host, new_conn); + } + sess = new_conn.openSession(); + // 执锟斤拷cmd + sess.execCommand(cmd); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + sess.close(); + + } + } + + public List execCmdWaitAcquiescent(String cmd) { +// String host=Constant.hostIp; +// String username=Constant.rootUser; +// String password=Constant.rootPasswd; +// int port=Constant.port; + List reStrings = new ArrayList(); + + Session sess = null; + try { +// conn = getOpenedConnection(host, username, password, port); + sess = conn.openSession(); + // 执锟斤拷cmd + sess.execCommand(cmd); + + InputStream stdout = new StreamGobbler(sess.getStdout()); + InputStream stderr = new StreamGobbler(sess.getStderr()); + BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(stdout)); + BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr)); + while (true) { + String line = stdoutReader.readLine(); + + if (line != null) { +// System.out.println(line); + reStrings.add(line); + } else { + break; + } + } + + if(reStrings.size()==0){ + while (true) { + String line = stderrReader.readLine(); + + if (line != null) { +// System.out.println(line); + reStrings.add(line); + } else { + break; + } + } + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + if (null != sess) { + sess.close(); + } + + } + return reStrings; + } + + public List execCmdWait(String host, String username, String password, int port, String cmd) { + List reStrings = new ArrayList(); + + Session sess = null; + Connection new_conn; + try { + if(Constant.hostIp.equals(host)){ + new_conn=conn; + } + else if(otherConns.containsKey(host) && otherConns.get(host)!=null){ + new_conn=otherConns.get(host); + } + else{ + new_conn = getOpenedConnection(host, username, password, port); + otherConns.put(host, new_conn); + } + sess = new_conn.openSession(); + // 执锟斤拷cmd + sess.execCommand(cmd); + + InputStream stdout = new StreamGobbler(sess.getStdout()); + InputStream stderr = new StreamGobbler(sess.getStderr()); + BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(stdout)); + BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr)); + while (true) { + String line = stdoutReader.readLine(); + + if (line != null) { +// System.out.println(line); + reStrings.add(line); + } else { + break; + } + } + if(reStrings.size()==0){ + while (true) { + String line = stderrReader.readLine(); + + if (line != null) { +// System.out.println(line); + reStrings.add(line); + } else { + break; + } + } + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + sess.close(); + + } + return reStrings; + } + + public Map execMD5cmd(String cmd) { + Map md5 = new HashMap(); + + + Session sess = null; + try { + + sess = conn.openSession(); + // 执锟斤拷cmd + sess.execCommand(cmd); + + InputStream stdout = new StreamGobbler(sess.getStdout()); + InputStream stderr = new StreamGobbler(sess.getStderr()); + BufferedReader stdoutReader = new BufferedReader(new InputStreamReader(stdout)); + BufferedReader stderrReader = new BufferedReader(new InputStreamReader(stderr)); + while (true) { + String line = stdoutReader.readLine(); + + if (line != null) { + String[] lines = line.split(" "); + String key = lines[1].trim(); + String value = lines[0].trim(); + md5.put(key, value); + } else { + break; + } + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + sess.close(); + + } + return md5; + } + + public String execGetSize(String cmd) { + status = false; + String str_size = "0"; + Session sess = null; + try { + + // 执锟斤拷cmd + sess = conn.openSession(); + sess.execCommand(cmd); + InputStream stdout = new StreamGobbler(sess.getStdout()); + + @SuppressWarnings("resource") + BufferedReader br = new BufferedReader(new InputStreamReader(stdout)); + while (true) { + String line = br.readLine(); + if (line != null) { + // String[] lines=line.split(" "); + // str_size=lines[0]; + + str_size = line; + } else { + break; + } + + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } finally { + sess.close(); + } + status = true; + return str_size; + } + public static void main(String[] args) { + PropertyConfigurator.configure("log4j.properties"); + } + +} diff --git a/src/com/platform/utils/Support.java b/src/com/platform/utils/Support.java new file mode 100644 index 00000000..1b4cdc92 --- /dev/null +++ b/src/com/platform/utils/Support.java @@ -0,0 +1,31 @@ + +/** + * 文件名 : Support.java + * 版权 : <版权/公司名> + * 描述 : <描述> + * @author liliy + * 版本 : <版本> + * 修改时间: 2016年9月12日 + * 修改内容: <修改内容> + */ +package com.platform.utils; + +import java.util.regex.Pattern; + +/** + * <一句话功能简述> + * <功能详细描述> + * @author liliy + * @version [版本号,2016年9月12日] + * @see [相关类/方法] + * @since [产品/模块版本] + */ + +public class Support { + public static boolean checkIP(String str) { + Pattern pattern = Pattern + .compile("^((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]" + + "|[*])\\.){3}(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]|[*])$"); + return pattern.matcher(str).matches(); + } +} diff --git a/src/com/platform/utils/ThreadVolume.java b/src/com/platform/utils/ThreadVolume.java new file mode 100644 index 00000000..c91bac84 --- /dev/null +++ b/src/com/platform/utils/ThreadVolume.java @@ -0,0 +1,161 @@ +package com.platform.utils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + + + +import org.apache.log4j.Logger; + +import com.platform.entities.Brick; +import com.platform.entities.FolderNode; +import com.platform.entities.VolumeEntity; +import com.platform.glusterfs.ClusterInfo; +import com.platform.glusterfs.GetTreeData; +import com.platform.glusterfs.VolumeInfo; +import com.platform.service.VolumeService; + +public class ThreadVolume extends Thread { + + public static Logger log = Logger.getLogger(ThreadVolume.class); + /** + * 挂载点路径 -- 暂时无用的 + */ + private static String pointPath = "/home"; + + /** Volume信息查询 */ + private VolumeInfo volumeInfo = new VolumeInfo(); + + private ClusterInfo cluster = new ClusterInfo(); + + /** gfs目录树形展示 */ + private GetTreeData gfsTree = new GetTreeData(); + + public ThreadVolume() { + // TODO Auto-generated constructor stub + } + + public ThreadVolume(String name) { + setName(name); + } + + public ThreadVolume(String name, String path) { + if (null != path && !"".equals(path.trim())) { + ThreadVolume.pointPath = path; + } + } + + @Override + public void run() { + super.run(); + while (true) { + try { + getVolumeMsg(); + Thread.sleep(Constant.get_volume_sleep_time); + } catch (InterruptedException e) { + log.error(e.getMessage(), e); + } + + } + + } + + public static String getPointPath() { + return pointPath; + } + + public static void setPointPath(String pointPath) { + ThreadVolume.pointPath = pointPath; + } + + public void getVolumeMsg() { + List folderlist = new ArrayList(); + List volumeList = new ArrayList(); + // brick状态 map集合 + Map brickStatusMap = cluster.showClusterInfo(); + + // 查询 volume name + List volumeNameList = volumeInfo.showAllVolumeName(); + if (null != volumeNameList) { + for (String volumeName : volumeNameList) { + try { + VolumeEntity volume = new VolumeEntity(); + volume.setName(volumeName); + List path = volumeInfo + .getVolumeMountPoint(volumeName); + // 默认加载第一个路径 + if (null != path) { + for (String one : path) { + if (!one.contains("df")) { + volume.setPath(one); + } + } + } + if (null == volume.getPath()) { + volume.setPath(""); + } + volume.setAllSize(volumeInfo + .getVolumeAvailableSize(volumeName) + + volumeInfo.getVolumeUseSize(volumeName)); + // 状态Started,Stopped,Created + String status = volumeInfo.getVolumeStatus(volumeName); + if ("Started".equals(status)) { + volume.setStatus(true); + } else { + volume.setStatus(false); + } + volume.setUsedSize(volumeInfo.getVolumeUseSize(volumeName)); + volume.setType(volumeInfo.getVolumeType(volumeName)); + // TODO 查询brick-- + // 返回 ip:path + List brickStrs = volumeInfo + .getVolumeBricks(volumeName); + // brick已用大小: + Map usedSize = volumeInfo + .getVolumebricksDataSize(volumeName); + Map availableSize = volumeInfo + .getVolumebricksAvailableSize(volumeName); + + List brickList = new ArrayList(); + for (String brickIpPath : brickStrs) { + Brick b = new Brick(); + String ipAndpath[] = brickIpPath.split(":"); + String brickip = ipAndpath[0]; + String brickpath = ipAndpath[1]; + // iP , path , + b.setIp(brickip); + if (brickStatusMap == null + || brickStatusMap.size() == 0) { + b.setStatus(false); + } else if (brickStatusMap.containsKey(brickip)) { + b.setStatus(true); + } else { + b.setStatus(false); + } + b.setPath(brickpath); + b.setAvailableSize(availableSize.get(brickIpPath)); + b.setUsedSize(usedSize.get(brickIpPath)); + brickList.add(b); + } + volume.setBrick(brickList); + + // 默认加载第一个路径 + if (null != path && path.size() > 0) { + // 装入 folder: + // 查询 每个 volume 下的 folder + FolderNode foldertmp = gfsTree.getDatas(path.get(0)); + folderlist.add(foldertmp); + } + volumeList.add(volume); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + } + } + // 更新folder 目录 + CacheTreeData.setFolders(folderlist); + CacheTreeData.setVolumeList(volumeList); + } + +} diff --git a/src/com/platform/utils/getTreeDataByPath.java b/src/com/platform/utils/getTreeDataByPath.java new file mode 100644 index 00000000..c9e8ca30 --- /dev/null +++ b/src/com/platform/utils/getTreeDataByPath.java @@ -0,0 +1,49 @@ +package com.platform.utils; + +import java.util.List; + +import com.platform.entities.FolderNode; + +public class getTreeDataByPath { + + /** + * @param path + * @return + */ + public FolderNode findByPath(String path) { + List folderNodelist = CacheTreeData.getFolders(); + if (null == folderNodelist) { + return null; + } + FolderNode folder = null; + for (FolderNode folderNode : folderNodelist) { + folder = getFolder(folderNode, path); + if (null != folder) { + break; + } + } + return folder; + } + + /** + * @param f + * @return + */ + private FolderNode getFolder(FolderNode f, String path){ + FolderNode result = null; + if(path.equals(f.getPath())){ + return f; + } + List folds = f.getChildNodes(); + if (null != folds) { + for (FolderNode folderNode : folds) { + result = getFolder(folderNode, path); + if (null != result) { + break; + } + } + } + return result; + } +} +