/* * RHQ Management Platform * Copyright (C) 2005-2008 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ package org.rhq.enterprise.server.support; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import javax.ejb.EJB; import javax.ejb.Stateless; import org.rhq.core.clientapi.agent.support.SupportAgentService; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.authz.Permission; import org.rhq.core.domain.cloud.Server; import org.rhq.core.util.stream.StreamUtil; import org.rhq.enterprise.server.agentclient.AgentClient; import org.rhq.enterprise.server.auth.SubjectManagerLocal; import org.rhq.enterprise.server.authz.RequiredPermission; import org.rhq.enterprise.server.cloud.instance.ServerManagerLocal; import org.rhq.enterprise.server.core.AgentManagerLocal; import org.rhq.enterprise.server.util.LookupUtil; /** * Provides some methods that are useful for supporting managed resources. This includes being * able to take a snapshot report of a managed resource, such as its log files, data files, and anything * the managed resource wants to expose. * * This Support subsystem provides things like snapshot reports that are potentially very sensitive and * gives the user access to far sweeping data, (e.g. they can contain configuration settings, data files * and logs - all of which can contain confidential information). Because of this, most of the methods * in this subsystem will require the user to be an "inventory manager" with {@link Permission#MANAGE_INVENTORY} * permissions. * * @author John Mazzitelli */ @Stateless public class SupportManagerBean implements SupportManagerLocal, SupportManagerRemote { @EJB private AgentManagerLocal agentManager; @EJB private ServerManagerLocal serverManager; @EJB private SubjectManagerLocal subjectManager; @RequiredPermission(Permission.MANAGE_INVENTORY) public InputStream getSnapshotReportStream(Subject subject, int resourceId, String name, String description) throws Exception { AgentClient agentClient = this.agentManager.getAgentClient(subjectManager.getOverlord(), resourceId); SupportAgentService supportService = agentClient.getSupportAgentService(); InputStream snapshotStream = supportService.getSnapshotReport(resourceId, name, description); return snapshotStream; } @RequiredPermission(Permission.MANAGE_INVENTORY) public URL getSnapshotReport(Subject subject, int resourceId, String name, String description) throws Exception { InputStream snapshotStream = getSnapshotReportStream(subject, resourceId, name, description); // TODO: not sure what we should really do with it, for now, put it in the downloads location. // you can retrieve this by going to http://localhost:7080/downloads/support File dir = getDownloadsDir(); File downloadFile = File.createTempFile(name + "-" + resourceId + "-", ".zip", dir); StreamUtil.copy(snapshotStream, new FileOutputStream(downloadFile)); Server thisServer = this.serverManager.getServer(); String addr = thisServer.getAddress(); int port = thisServer.getPort(); return new URL(String.format("http://%s:%d/downloads/support/%s", addr, port, downloadFile.getName())); } private File getDownloadsDir() throws Exception { File dataDir = LookupUtil.getCoreServer().getJBossServerDataDir(); File downloadDir = new File(dataDir, "rhq-downloads/support"); if (!downloadDir.isDirectory()) { downloadDir.mkdirs(); if (!downloadDir.isDirectory()) { throw new FileNotFoundException("Missing downloads directory at [" + downloadDir + "]"); } } return downloadDir; } }