diff options
12 files changed, 187 insertions, 41 deletions
diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java index 41d76e58..e639f615 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterDataModelManager.java @@ -112,13 +112,13 @@ public class GlusterDataModelManager { servers.add(server); } - public void initializeModel(String securityToken) { + public void initializeModel(String securityToken, String knownServer) { model = new GlusterDataModel("Gluster Data Model"); setSecurityToken(securityToken); Cluster cluster = new Cluster("Home", model); - initializeGlusterServers(cluster); + initializeGlusterServers(cluster, knownServer); initializeVolumes(cluster); initializeAutoDiscoveredServers(cluster); @@ -227,8 +227,8 @@ public class GlusterDataModelManager { volume5.addDisk("server5:sdb"); } - private void initializeGlusterServers(Cluster cluster) { - cluster.setServers(new GlusterServersClient(securityToken).getServers()); + private void initializeGlusterServers(Cluster cluster, String knownServer) { + cluster.setServers(new GlusterServersClient(securityToken).getServers(knownServer)); } private void initializeAutoDiscoveredServers(Cluster cluster) { diff --git a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java index d4809daf..98b8878c 100644 --- a/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java +++ b/src/com.gluster.storage.management.client/src/com/gluster/storage/management/client/GlusterServersClient.java @@ -44,8 +44,10 @@ public class GlusterServersClient extends AbstractClient { return RESOURCE_NAME; } - public List<GlusterServer> getServers() { - GlusterServerListResponse response = (GlusterServerListResponse) fetchResource(GlusterServerListResponse.class); + public List<GlusterServer> getServers(String knownServer) { + MultivaluedMap<String, String> queryParams = new MultivaluedMapImpl(); + queryParams.add(RESTConstants.QUERY_PARAM_KNOWN_SERVER, knownServer); + GlusterServerListResponse response = (GlusterServerListResponse) fetchResource(queryParams, GlusterServerListResponse.class); return response.getServers(); } @@ -76,7 +78,7 @@ public class GlusterServersClient extends AbstractClient { if (usersClient.authenticate("gluster", "gluster").isSuccess()) { GlusterServersClient serverResource = new GlusterServersClient(usersClient.getSecurityToken()); - List<GlusterServer> glusterServers = serverResource.getServers(); + List<GlusterServer> glusterServers = serverResource.getServers("127.0.0.1"); for (GlusterServer server : glusterServers) { System.out.println(server.getName()); } diff --git a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java index d5c1bad3..c25d186a 100644 --- a/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java +++ b/src/com.gluster.storage.management.core/src/com/gluster/storage/management/core/constants/RESTConstants.java @@ -56,6 +56,7 @@ public class RESTConstants { public static final String QUERY_PARAM_TO_TIMESTAMP = "toTimestamp"; public static final String QUERY_PARAM_DOWNLOAD = "download"; public static final String QUERY_PARAM_SERVER_NAME = "serverName"; + public static final String QUERY_PARAM_KNOWN_SERVER = "knownServer"; // Running tasks resource public static final String RESOURCE_PATH_RUNNING_TASKS = "/cluster/runningtasks"; diff --git a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java index c6ffa8d5..7705a631 100644 --- a/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java +++ b/src/com.gluster.storage.management.gui/src/com/gluster/storage/management/gui/login/LoginDialog.java @@ -193,7 +193,7 @@ public class LoginDialog extends Dialog { UsersClient usersClient = new UsersClient(); if (usersClient.authenticate(user, password).isSuccess()) { try { - GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken()); + GlusterDataModelManager.getInstance().initializeModel(usersClient.getSecurityToken(), "127.0.0.1"); super.okPressed(); } catch (Exception e) { setReturnCode(RETURN_CODE_ERROR); diff --git a/src/com.gluster.storage.management.server/.project b/src/com.gluster.storage.management.server/.project index 86d34a3b..259b3726 100644 --- a/src/com.gluster.storage.management.server/.project +++ b/src/com.gluster.storage.management.server/.project @@ -37,6 +37,5 @@ <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.wst.jsdt.core.jsNature</nature> - <nature>org.python.pydev.pythonNature</nature> </natures> </projectDescription> diff --git a/src/com.gluster.storage.management.server/.pydevproject b/src/com.gluster.storage.management.server/.pydevproject deleted file mode 100644 index a9cca037..00000000 --- a/src/com.gluster.storage.management.server/.pydevproject +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?eclipse-pydev version="1.0"?> - -<pydev_project> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property> -<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property> -</pydev_project> diff --git a/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml b/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml index 6d7d1406..7c7d42d3 100644 --- a/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml +++ b/src/com.gluster.storage.management.server/WebContent/WEB-INF/web.xml @@ -64,6 +64,14 @@ <!-- Spring Security --> <filter> + <filter-name>authFailureFilter</filter-name> + <filter-class>com.gluster.storage.management.server.filters.AuthenticationFailureFilter</filter-class> + </filter> + <filter-mapping> + <filter-name>authFailureFilter</filter-name> + <url-pattern>/*</url-pattern> + </filter-mapping> + <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/filters/AuthenticationFailureFilter.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/filters/AuthenticationFailureFilter.java new file mode 100644 index 00000000..5f828f65 --- /dev/null +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/filters/AuthenticationFailureFilter.java @@ -0,0 +1,105 @@ +/******************************************************************************* + * Copyright (c) 2011 Gluster, Inc. <http://www.gluster.com> + * This file is part of Gluster Management Console. + * + * Gluster Management Console is free software; you can redistribute it and/or + * modify it under the terms of the GNU Affero General Public License as published + * by the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Gluster Management Console is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License + * for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see + * <http://www.gnu.org/licenses/>. + *******************************************************************************/ +package com.gluster.storage.management.server.filters; + +import java.io.CharArrayWriter; +import java.io.IOException; +import java.io.PrintWriter; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletResponseWrapper; +import javax.ws.rs.core.Response; + +/** + * @author root + * + */ +public class AuthenticationFailureFilter implements Filter { + + /* + * (non-Javadoc) + * + * @see javax.servlet.Filter#destroy() + */ + @Override + public void destroy() { + // TODO Auto-generated method stub + + } + + public class CharResponseWrapper extends HttpServletResponseWrapper { + private CharArrayWriter output; + + public String toString() { + return output.toString(); + } + + public CharResponseWrapper(HttpServletResponse response) { + super(response); + output = new CharArrayWriter(); + } + + public PrintWriter getWriter() { + return new PrintWriter(output); + } + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, + * javax.servlet.FilterChain) + */ + @Override + public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, + ServletException { + HttpServletRequest request = (HttpServletRequest) req; + if (request.getRequestURI().contains("download")) { + chain.doFilter(req, res); + return; + } + + CharResponseWrapper wrapper = new CharResponseWrapper((HttpServletResponse) res); + chain.doFilter(req, wrapper); + + if(wrapper.getStatus() == Response.Status.UNAUTHORIZED.ordinal()) { + PrintWriter out = res.getWriter(); + out.println("<status><code>1</code><message>Authentication Failed!</message></status>"); + } + } + + /* + * (non-Javadoc) + * + * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) + */ + @Override + public void init(FilterConfig arg0) throws ServletException { + // TODO Auto-generated method stub + + } + +} diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java index 4f2850ee..3092e80d 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/GlusterServersResource.java @@ -32,6 +32,7 @@ import javax.ws.rs.core.MediaType; import org.springframework.stereotype.Component; +import com.gluster.storage.management.core.constants.RESTConstants; import com.gluster.storage.management.core.model.GlusterServer; import com.gluster.storage.management.core.model.GlusterServer.SERVER_STATUS; import com.gluster.storage.management.core.model.Server; @@ -39,21 +40,32 @@ import com.gluster.storage.management.core.model.Status; import com.gluster.storage.management.core.response.GlusterServerListResponse; import com.gluster.storage.management.core.response.GlusterServerResponse; import com.gluster.storage.management.server.utils.GlusterUtil; +import com.gluster.storage.management.server.utils.SshUtil; +import com.sun.jersey.api.core.InjectParam; import com.sun.jersey.spi.resource.Singleton; @Component @Singleton @Path("/cluster/servers") public class GlusterServersResource extends AbstractServersResource { - private GlusterUtil glusterUtil = new GlusterUtil(); + @InjectParam + private GlusterUtil glusterUtil; + public static final String HOSTNAMETAG = "hostname:"; - private List<GlusterServer> getServerDetails() { - List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(); + public void setGlusterUtil(GlusterUtil glusterUtil) { + this.glusterUtil = glusterUtil; + } + + public GlusterUtil getGlusterUtil() { + return glusterUtil; + } + + private List<GlusterServer> getServerDetails(String knownServer) { + List<GlusterServer> glusterServers = glusterUtil.getGlusterServers(knownServer); for (GlusterServer server : glusterServers) { if (server.getStatus() == SERVER_STATUS.ONLINE) { fetchServerDetails(server); - // server.setPreferredNetworkInterface(server.getNetworkInterfaces().get(0)); } } return glusterServers; @@ -61,17 +73,17 @@ public class GlusterServersResource extends AbstractServersResource { @GET @Produces(MediaType.TEXT_XML) - public GlusterServerListResponse getGlusterServers() { - return new GlusterServerListResponse(Status.STATUS_SUCCESS, getServerDetails()); + public GlusterServerListResponse getGlusterServers(@QueryParam(RESTConstants.QUERY_PARAM_KNOWN_SERVER) String knownServer) { + return new GlusterServerListResponse(Status.STATUS_SUCCESS, getServerDetails(knownServer)); } @GET @Path("{serverName}") @Produces(MediaType.TEXT_XML) public GlusterServer getGlusterServer(@PathParam("serverName") String serverName) { + // TODO: Implement logic to fetch details of a single gluster server (peer) GlusterServer server = new GlusterServer(serverName); fetchServerDetails(server); - // server.setPreferredNetworkInterface(server.getNetworkInterfaces().get(0)); server.setStatus(SERVER_STATUS.ONLINE); return server; } @@ -93,8 +105,8 @@ public class GlusterServersResource extends AbstractServersResource { @POST @Produces(MediaType.TEXT_XML) - public GlusterServerResponse addServer(@FormParam("serverName") String serverName) { - Status status = glusterUtil.addServer(serverName); + public GlusterServerResponse addServer(@FormParam("serverName") String serverName, @FormParam("existingServer") String existingServer) { + Status status = glusterUtil.addServer(serverName, existingServer); if (!status.isSuccess()) { return new GlusterServerResponse(status, null); @@ -110,10 +122,13 @@ public class GlusterServersResource extends AbstractServersResource { public static void main(String[] args) { GlusterServersResource glusterServersResource = new GlusterServersResource(); - System.out.println(glusterServersResource.getServerDetails()); + GlusterUtil glusterUtil = new GlusterUtil(); + glusterUtil.setSshUtil(new SshUtil()); + glusterServersResource.setGlusterUtil(glusterUtil); + System.out.println(glusterServersResource.getServerDetails("127.0.0.1").size()); // To add a server - GlusterServerResponse response = glusterServersResource.addServer("my-server"); - System.out.println(response.getData().getName()); +// GlusterServerResponse response = glusterServersResource.addServer("my-server"); +// System.out.println(response.getData().getName()); } } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java index 51134317..5e9c1945 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/resources/UsersResource.java @@ -69,8 +69,9 @@ public class UsersResource { @Path("{user}") @GET @Produces(MediaType.TEXT_XML) - public Status login(@PathParam("user") String user) { + public Status authenticate(@PathParam("user") String user) { // success only if the user passed in query is same as the one passed in security header + // spring security would have already authenticated the user credentials return (SecurityContextHolder.getContext().getAuthentication().getName().equals(user) ? Status.STATUS_SUCCESS : Status.STATUS_FAILURE); } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java index 7299a135..13b8ef28 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/GlusterUtil.java @@ -20,11 +20,13 @@ */ package com.gluster.storage.management.server.utils; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.gluster.storage.management.core.constants.CoreConstants; @@ -56,11 +58,22 @@ public class GlusterUtil { private static final String VOLUME_TRANSPORT_TYPE_PFX = "Transport-type:"; private static final String VOLUME_BRICKS_GROUP_PFX = "Bricks"; private static final String VOLUME_OPTIONS_RECONFIG_PFX = "Options Reconfigured"; - private static final String VOLUME_OPTION_AUTH_ALLOW = "auth.allow:"; + private static final String VOLUME_OPTION_AUTH_ALLOW_PFX = "auth.allow:"; private static final String VOLUME_LOG_LOCATION_PFX = "log file location:"; private static final String VOLUME_TYPE_DISTRIBUTE = "Distribute"; private static final String VOLUME_TYPE_REPLICATE = "Replicate"; private static final ProcessUtil processUtil = new ProcessUtil(); + + @Autowired + private SshUtil sshUtil; + + public void setSshUtil(SshUtil sshUtil) { + this.sshUtil = sshUtil; + } + + public SshUtil getSshUtil() { + return sshUtil; + } /** * Extract value of given token from given line. It is assumed that the token, if present, will be of the following @@ -79,8 +92,8 @@ public class GlusterUtil { return null; } - public List<GlusterServer> getGlusterServers() { - String output = getPeerStatus(); + public List<GlusterServer> getGlusterServers(String knownServer) { + String output = getPeerStatus(knownServer); if (output == null) { return null; } @@ -127,8 +140,8 @@ public class GlusterUtil { return glusterServers; } - public List<String> getGlusterServerNames() { - String output = getPeerStatus(); + public List<String> getGlusterServerNames(String knownServer) { + String output = getPeerStatus(knownServer); if (output == null) { return null; } @@ -143,9 +156,15 @@ public class GlusterUtil { return glusterServerNames; } - private String getPeerStatus() { + /** + * @param knownServer + * A known server on which the gluster command will be executed to fetch peer status + * @return Outout of the "gluster peer status" command + */ + private String getPeerStatus(String knownServer) { String output; - ProcessResult result = processUtil.executeCommand("gluster", "peer", "status"); + //ProcessResult result = processUtil.executeCommand("gluster", "peer", "status"); + ProcessResult result = getSshUtil().executeRemote(knownServer, "gluster peer status"); if (!result.isSuccess()) { output = null; } @@ -153,8 +172,8 @@ public class GlusterUtil { return output; } - public Status addServer(String serverName) { - return new Status(processUtil.executeCommand("gluster", "peer", "probe", serverName)); + public Status addServer(String serverName, String existingServer) { + return new Status(sshUtil.executeRemote(existingServer, "gluster peer probe " + serverName)); } public Status startVolume(String volumeName) { @@ -465,10 +484,10 @@ public class GlusterUtil { public String getLogFileNameForBrickDir(String brickDir) { String logFileName = brickDir; - if (logFileName.startsWith(CoreConstants.FILE_SEPARATOR)) { - logFileName = logFileName.replaceFirst(CoreConstants.FILE_SEPARATOR, ""); + if (logFileName.startsWith(File.separator)) { + logFileName = logFileName.replaceFirst(File.separator, ""); } - logFileName = logFileName.replaceAll(CoreConstants.FILE_SEPARATOR, "-") + ".log"; + logFileName = logFileName.replaceAll(File.separator, "-") + ".log"; return logFileName; } diff --git a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java index 258bdea3..5816533b 100644 --- a/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java +++ b/src/com.gluster.storage.management.server/src/com/gluster/storage/management/server/utils/SshUtil.java @@ -26,6 +26,8 @@ import java.io.UnsupportedEncodingException; import java.util.Arrays; import java.util.Date; +import org.springframework.stereotype.Component; + import ch.ethz.ssh2.ChannelCondition; import ch.ethz.ssh2.Connection; import ch.ethz.ssh2.Session; @@ -39,6 +41,7 @@ import com.gluster.storage.management.core.utils.ProcessResult; /** * */ +@Component public class SshUtil { private LRUCache<String, Connection> sshConnCache = new LRUCache<String, Connection>(10); private static final File PEM_FILE = new File(CoreConstants.USER_HOME + "/" + ".ssh/id_rsa"); |
