/**
* Copyright (c) 2009--2015 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.frontend.action.systems.sdc;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.redhat.rhn.common.db.datasource.DataResult;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.domain.action.Action;
import com.redhat.rhn.domain.action.ActionFactory;
import com.redhat.rhn.domain.server.Server;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserServerPreferenceId;
import com.redhat.rhn.frontend.struts.RequestContext;
import com.redhat.rhn.frontend.struts.RhnAction;
import com.redhat.rhn.frontend.struts.RhnHelper;
import com.redhat.rhn.manager.action.ActionManager;
import com.redhat.rhn.manager.rhnpackage.PackageManager;
import com.redhat.rhn.manager.system.SystemManager;
import com.redhat.rhn.manager.user.UserManager;
/**
* SystemOverviewAction
* @version $Rev$
*/
public class SystemOverviewAction extends RhnAction {
public static final String[] SERVER_PREFERENCES = {UserServerPreferenceId
.INCLUDE_IN_DAILY_SUMMARY,
UserServerPreferenceId
.RECEIVE_NOTIFICATIONS};
/** {@inheritDoc} */
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
RequestContext rctx = new RequestContext(request);
Long sid = rctx.getRequiredParam("sid");
User user = rctx.getCurrentUser();
Server s = SystemManager.lookupByIdAndUser(sid, user);
/* Here we htmlify the description stored in the database such that end line's
* are represented correctly
*/
String description = null;
if (s.getDescription() != null) {
description = StringEscapeUtils.escapeHtml(s.getDescription())
.replaceAll("\\n", "<br/>");
}
// System Channels
Map baseChannel = new HashMap();
List childChannels = new ArrayList();
DataResult channelList = SystemManager.systemChannelSubscriptions(sid);
for (Iterator i = channelList.iterator(); i.hasNext();) {
Map ch = (HashMap) i.next();
if (s.getBaseChannel() != null &&
ch.get("id").equals(s.getBaseChannel().getId())) {
baseChannel.put("id", ch.get("id"));
baseChannel.put("name", ch.get("name"));
}
else {
childChannels.add(ch);
}
}
// Errata Counts
int criticalErrataCount = SystemManager.countCriticalErrataForSystem(user, sid);
int nonCriticalErrataCount =
SystemManager.countNoncriticalErrataForSystem(user, sid);
// Upgradable Packages
int upgradablePackagesCount = PackageManager.countUpgradable(sid);
boolean hasUpdates =
criticalErrataCount + nonCriticalErrataCount + upgradablePackagesCount > 0;
// Reboot needed after certain types of updates
boolean rebootRequired = SystemManager.requiresReboot(user, sid);
if (!processLock(user, s, rctx)) {
request.setAttribute("serverLock", s.getLock());
}
processPing(user, s, rctx);
proccessSatApplet(user, s, rctx);
SdcHelper.ssmCheck(request, sid, user);
request.setAttribute("rebootRequired", Boolean.valueOf(rebootRequired));
request.setAttribute("unentitled", Boolean.valueOf(s.getEntitlements().isEmpty()));
request.setAttribute("systemInactive", Boolean.valueOf(s.isInactive()));
request.setAttribute("criticalErrataCount", criticalErrataCount);
request.setAttribute("nonCriticalErrataCount", nonCriticalErrataCount);
request.setAttribute("upgradablePackagesCount", upgradablePackagesCount);
request.setAttribute("hasUpdates", hasUpdates);
request.setAttribute("baseChannel", baseChannel);
request.setAttribute("childChannels", childChannels);
request.setAttribute("description", description);
request.setAttribute("prefs", findUserServerPreferences(user, s));
request.setAttribute("system", s);
request.setAttribute("hasLocation",
!(s.getLocation() == null || s.getLocation().isEmpty()));
request.setAttribute("activationKey", SystemManager.getActivationKeys(s));
return mapping.findForward(RhnHelper.DEFAULT_FORWARD);
}
protected List findUserServerPreferences(User user, Server s) {
List serverPreferenceList = new ArrayList();
if (user.getEmailNotify() == 0) {
serverPreferenceList.add("sdc.details.overview.notifications.disabled");
return serverPreferenceList;
}
for (int j = 0; j < SERVER_PREFERENCES.length; ++j) {
if (UserManager.lookupUserServerPreferenceValue(user,
s,
SERVER_PREFERENCES[j])) {
serverPreferenceList.add(SERVER_PREFERENCES[j]);
}
}
return serverPreferenceList;
}
/**
* @return true if the server was unlocked, false otherwise
*/
protected boolean processLock(User user, Server s, RequestContext rctx) {
Long lockValue = rctx.getParamAsLong("lock");
LocalizationService ls = LocalizationService.getInstance();
if (lockValue != null) {
if (lockValue.longValue() == 1) {
if (s.getLock() == null) {
SystemManager.lockServer(user,
s,
ls.getMessage
("sdc.details.overview.lock.reason"));
createSuccessMessage(rctx.getRequest(),
"sdc.details.overview.locked.alert",
s.getName());
}
}
else if (lockValue.longValue() == 0) {
if (s.getLock() != null) {
SystemManager.unlockServer(user, s);
createSuccessMessage(rctx.getRequest(),
"sdc.details.overview.unlocked.alert",
s.getName());
return true;
}
}
}
return false;
}
protected void processPing(User user, Server s, RequestContext rctx) {
Long pingValue = rctx.getParamAsLong("ping");
if (pingValue != null && pingValue.longValue() == 1) {
s.getPushClient().setLastPingTime(new Date(System.currentTimeMillis()));
s.getPushClient().setNextActionTime(null);
SystemManager.storeServer(s);
createSuccessMessage(rctx.getRequest(),
"sdc.details.overview.osa.status.pinged",
s.getName());
}
}
protected void proccessSatApplet(User user, Server s, RequestContext rctx) {
Long appValue = rctx.getParamAsLong("applet");
if (appValue != null && appValue.longValue() == 1) {
Action a = ActionManager.createBaseAction(user,
s,
ActionFactory
.TYPE_RHN_APPLET_USE_SATELLITE);
ActionManager.storeAction(a);
createSuccessMessage(rctx.getRequest(),
"sdc.details.overview.applet.scheduled",
"/rhn/systems/details/history/Event.do?sid=" +
s.getId() +
"&aid=" +
a.getId());
}
}
}