/** * 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.manager.system; import com.redhat.rhn.common.client.ClientCertificate; import com.redhat.rhn.common.client.InvalidCertificateException; import com.redhat.rhn.common.conf.Config; import com.redhat.rhn.common.conf.ConfigDefaults; import com.redhat.rhn.common.db.datasource.CallableMode; import com.redhat.rhn.common.db.datasource.DataResult; import com.redhat.rhn.common.db.datasource.ModeFactory; import com.redhat.rhn.common.db.datasource.SelectMode; import com.redhat.rhn.common.db.datasource.WriteMode; import com.redhat.rhn.common.hibernate.HibernateFactory; import com.redhat.rhn.common.hibernate.LookupException; import com.redhat.rhn.common.localization.LocalizationService; import com.redhat.rhn.common.security.PermissionException; import com.redhat.rhn.common.validator.ValidatorError; import com.redhat.rhn.common.validator.ValidatorResult; import com.redhat.rhn.common.validator.ValidatorWarning; import com.redhat.rhn.domain.channel.Channel; import com.redhat.rhn.domain.channel.ChannelFamily; import com.redhat.rhn.domain.entitlement.Entitlement; import com.redhat.rhn.domain.errata.Errata; import com.redhat.rhn.domain.org.Org; import com.redhat.rhn.domain.rhnpackage.PackageFactory; import com.redhat.rhn.domain.role.RoleFactory; import com.redhat.rhn.domain.server.CPU; import com.redhat.rhn.domain.server.InstalledPackage; import com.redhat.rhn.domain.server.Note; import com.redhat.rhn.domain.server.ProxyInfo; import com.redhat.rhn.domain.server.Server; import com.redhat.rhn.domain.server.ServerFactory; import com.redhat.rhn.domain.server.ServerGroup; import com.redhat.rhn.domain.server.ServerLock; import com.redhat.rhn.domain.server.VirtualInstance; import com.redhat.rhn.domain.server.VirtualInstanceFactory; import com.redhat.rhn.domain.server.VirtualInstanceState; import com.redhat.rhn.domain.user.User; import com.redhat.rhn.domain.user.UserFactory; import com.redhat.rhn.frontend.dto.ActivationKeyDto; import com.redhat.rhn.frontend.dto.CustomDataKeyOverview; import com.redhat.rhn.frontend.dto.ErrataOverview; import com.redhat.rhn.frontend.dto.EssentialServerDto; import com.redhat.rhn.frontend.dto.HardwareDeviceDto; import com.redhat.rhn.frontend.dto.NetworkDto; import com.redhat.rhn.frontend.dto.OrgProxyServer; import com.redhat.rhn.frontend.dto.PackageListItem; import com.redhat.rhn.frontend.dto.ServerPath; import com.redhat.rhn.frontend.dto.SnapshotTagDto; import com.redhat.rhn.frontend.dto.SystemCurrency; import com.redhat.rhn.frontend.dto.SystemEventDto; import com.redhat.rhn.frontend.dto.SystemGroupOverview; import com.redhat.rhn.frontend.dto.SystemOverview; import com.redhat.rhn.frontend.dto.SystemPendingEventDto; import com.redhat.rhn.frontend.dto.VirtualSystemOverview; import com.redhat.rhn.frontend.dto.kickstart.KickstartSessionDto; import com.redhat.rhn.frontend.listview.PageControl; import com.redhat.rhn.frontend.xmlrpc.InvalidProxyVersionException; import com.redhat.rhn.frontend.xmlrpc.ProxySystemIsSatelliteException; import com.redhat.rhn.manager.BaseManager; import com.redhat.rhn.manager.action.ActionManager; import com.redhat.rhn.manager.channel.ChannelManager; import com.redhat.rhn.manager.channel.MultipleChannelsWithPackageException; import com.redhat.rhn.manager.entitlement.EntitlementManager; import com.redhat.rhn.manager.errata.ErrataManager; import com.redhat.rhn.manager.kickstart.cobbler.CobblerSystemRemoveCommand; import com.redhat.rhn.manager.rhnset.RhnSetDecl; import com.redhat.rhn.manager.user.UserManager; import org.apache.commons.lang.BooleanUtils; import org.apache.log4j.Logger; import org.hibernate.Session; import java.net.IDN; import java.sql.Date; import java.sql.Types; import java.util.ArrayList; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; /** * SystemManager */ public class SystemManager extends BaseManager { private static Logger log = Logger.getLogger(SystemManager.class); public static final String CAP_CONFIGFILES_UPLOAD = "configfiles.upload"; public static final String CAP_CONFIGFILES_DIFF = "configfiles.diff"; public static final String CAP_CONFIGFILES_MTIME_UPLOAD = "configfiles.mtime_upload"; public static final String CAP_CONFIGFILES_DEPLOY = "configfiles.deploy"; public static final String CAP_PACKAGES_VERIFY = "packages.verify"; public static final String CAP_CONFIGFILES_BASE64_ENC = "configfiles.base64_enc"; private SystemManager() { } /** * Takes a snapshot for a server by calling the snapshot_server stored proc. * @param server The server to snapshot * @param reason The reason for the snapshotting. */ public static void snapshotServer(Server server, String reason) { if (!Config.get().getBoolean(ConfigDefaults.TAKE_SNAPSHOTS)) { return; } // If the server is null or doesn't have the snapshotting feature, don't bother. if (server == null || !serverHasFeature(server.getId(), "ftr_snapshotting")) { return; } CallableMode m = ModeFactory.getCallableMode("System_queries", "snapshot_server"); Map<String, Object> in = new HashMap<String, Object>(); in.put("server_id", server.getId()); in.put("reason", reason); m.execute(in, new HashMap<String, Integer>()); } /** * Gets the list of channels that this server could subscribe to given it's base * channel. * @param sid The id of the server in question * @param uid The id of the user asking * @param cid The id of the base channel for the server * @return Returns a list of subscribable (child) channels for this server. */ public static DataResult<Map<String, Object>> subscribableChannels(Long sid, Long uid, Long cid) { SelectMode m = ModeFactory.getMode("Channel_queries", "subscribable_channels", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", sid); params.put("user_id", uid); params.put("base_channel_id", cid); return m.execute(params); } /** * Gets the list of channel ids that this server could subscribe to * according to it's base channel. * @param sid The id of the server in question * @param uid The id of the user asking * @param cid The id of the base channel for the server * @return Returns a list of subscribable (child) channel ids for this server. */ public static Set<Long> subscribableChannelIds(Long sid, Long uid, Long cid) { Iterator<Map<String, Object>> subscribableChannelIter = subscribableChannels(sid, uid, cid).iterator(); Set<Long> subscribableChannelIdSet = new HashSet<Long>(); while (subscribableChannelIter.hasNext()) { Map<String, Object> row = subscribableChannelIter.next(); subscribableChannelIdSet.add((Long) row.get("id")); } return subscribableChannelIdSet; } /** * Gets the list of channels that this server is subscribed to * @param sid The id of the server in question * @return Returns a list of subscribed channels for this server. */ public static DataResult<Map<String, Object>> systemChannelSubscriptions(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "system_channel_subscriptions"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * @param user * Currently logged in user. * @param sid * System id * @return true if the system requires a reboot i.e: because kernel updates. */ public static boolean requiresReboot(User user, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "has_errata_with_keyword_applied_since_last_reboot"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("sid", sid); params.put("keyword", "reboot_suggested"); DataResult dr = m.execute(params); return !dr.isEmpty(); } /** * Returns list of systems requiring a reboot i.e: because kernel updates, * visible to user, sorted by name. * * @param user * Currently logged in user. * @param pc * PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> requiringRebootList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "having_errata_with_keyword_applied_since_last_reboot"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); params.put("keyword", "reboot_suggested"); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns a list of systems with extra packages installed. * * @param user User to check the systems for * @param pc Page control * * @return list of SystemOverviews. */ public static DataResult<SystemOverview> getExtraPackagesSystems(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "extra_packages_systems_count"); Map<String, Object> params = new HashMap<String, Object>(); params.put("userid", user.getId()); params.put("orgid", user.getOrg().getId()); return makeDataResult(params, new HashMap<String, Object>(), pc, m, SystemOverview.class); } /** * Returns the list of extra packages for a system. * @param serverId Server ID in question * @return List of extra packages */ public static DataResult<PackageListItem> listExtraPackages(Long serverId) { SelectMode m = ModeFactory.getMode("Package_queries", "extra_packages_for_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("serverid", serverId); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, null, m, PackageListItem.class); } /** * Gets the latest upgradable packages for a system * @param sid The id for the system we want packages for * @return Returns a list of the latest upgradable packages for a system */ public static DataResult<Map<String, Object>> latestUpgradablePackages(Long sid) { SelectMode m = ModeFactory.getMode("Package_queries", "system_upgradable_package_list_no_errata_info", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * Get all installable packages for a given system. * @param sid The id for the system we want packages for * @return Return a list of all installable packages for a system. */ public static DataResult<Map<String, Object>> allInstallablePackages(Long sid) { SelectMode m = ModeFactory.getMode("Package_queries", "system_all_available_packages", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * Gets the latest installable packages for a system * @param sid The id for the system we want packages for * @return Returns a list of latest installable packages for a system. */ public static DataResult<Map<String, Object>> latestInstallablePackages(Long sid) { SelectMode m = ModeFactory.getMode("Package_queries", "system_latest_available_packages", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * Gets the installed packages on a system * @param sid The system in question * @param expanded If true, also adds EVR, Arch and package name to the result. * @return Returns a list of packages for a system */ public static DataResult<Map<String, Object>> installedPackages(Long sid, boolean expanded) { String suffix = expanded ? "_expanded" : ""; SelectMode m = ModeFactory.getMode("System_queries", "system_installed_packages" + suffix, Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); DataResult<Map<String, Object>> pkgs = m.execute(params); for (Map<String, Object> pkg : pkgs) { if (pkg.get("arch") == null) { pkg.put("arch", LocalizationService.getInstance().getMessage("Unknown")); } if (pkg.get("installtime") == null) { pkg.remove("installtime"); } } return pkgs; } /** * Gets packages from a channel for a system * @param sid server id * @param cid channel id * @return list of packages installed on a system from a channel */ public static DataResult<Map<String, Object>> packagesFromChannel(Long sid, Long cid) { SelectMode m = ModeFactory.getMode("Package_queries", "system_packages_from_channel", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("cid", cid); return m.execute(params); } /** * Deletes a server * @param user The user doing the deleting. * @param sid The id of the system to be deleted */ public static void deleteServer(User user, Long sid) { /* * Looking up the server here rather than being passed in a Server object, allows * us to call lookupByIdAndUser which will ensure the user has access to this * server. */ Server server = lookupByIdAndUser(sid, user); CobblerSystemRemoveCommand rc = new CobblerSystemRemoveCommand(user, server); rc.store(); if (server.isVirtualGuest()) { VirtualInstance virtInstance = server.getVirtualInstance(); virtInstance.deleteGuestSystem(); } else { if (server.getGuests() != null) { removeAllServerEntitlements(server.getId()); // Remove guest associations to the host system we're now deleting: for (Iterator<VirtualInstance> it = server.getGuests().iterator(); it .hasNext();) { VirtualInstance vi = it.next(); server.removeGuest(vi); } } ServerFactory.delete(server); } } /** * Adds a server to a server group * @param server The server to add * @param serverGroup The group to add the server to */ public static void addServerToServerGroup(Server server, ServerGroup serverGroup) { ServerFactory.addServerToGroup(server, serverGroup); snapshotServer(server, "Group membership alteration"); } /** * Removes a server from a group * @param server The server to remove * @param serverGroup The group to remove the server from */ public static void removeServerFromServerGroup(Server server, ServerGroup serverGroup) { ServerFactory.removeServerFromGroup(server.getId(), serverGroup.getId()); snapshotServer(server, "Group membership alteration"); } /** * Returns a list of available server groups for a given server * @param server The server in question * @param user The user requesting the information * @return Returns a list of system groups available for this server/user */ public static DataResult<Map<String, Object>> availableSystemGroups(Server server, User user) { SelectMode m = ModeFactory.getMode("SystemGroup_queries", "visible_to_system", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", server.getId()); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); return m.execute(params); } /** * Returns a list of server groups for a given server * @param sid The server id in question * @return Returns a list of system groups for this server */ public static DataResult<Map<String, Object>> listSystemGroups(Long sid) { SelectMode m = ModeFactory.getMode("SystemGroup_queries", "groups_a_system_is_in_unsafe", Map.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * Returns list of all notes for a system. * @param s The server in question * @return list of SystemNotes. */ public static DataResult<Map<String, Object>> systemNotes(Server s) { SelectMode m = ModeFactory.getMode("System_queries", "server_notes"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", s.getId()); return m.execute(params); } /** * Returns list of all systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "visible_to_user"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all physical systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> physicalList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "visible_to_user_physical_list"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all systems and their errata type counts * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemCurrency> systemCurrencyList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "system_currency"); Map<String, Object> params = new HashMap<String, Object>(); params.put("uid", user.getId()); return m.execute(params); } /** * Returns list of all systems visible to user. * This is meant to be fast and only gets the id, name, and last checkin * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemListShort(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "xmlrpc_visible_to_user", SystemOverview.class); Map<String, Long> params = new HashMap<String, Long>(); params.put("user_id", user.getId()); Map<String, Long> elabParams = new HashMap<String, Long>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all systems visible to user that are inactive. * This is meant to be fast and only gets the id, name, and last checkin * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemListShortInactive(User user, PageControl pc) { return systemListShortInactive(user, new Integer(Config.get().getInt(ConfigDefaults .SYSTEM_CHECKIN_THRESHOLD)), pc); } /** * Returns list of all systems visible to user that are inactive. * This is meant to be fast and only gets the id, name, and last checkin * @param user Currently logged in user. * @param inactiveThreshold number of days before we consider systems inactive * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemListShortInactive( User user, int inactiveThreshold, PageControl pc) { SelectMode m = ModeFactory.getMode( "System_queries", "xmlrpc_visible_to_user_inactive", SystemOverview.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("checkin_threshold", inactiveThreshold); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all systems visible to user that are active. * This is meant to be fast and only gets the id, name, and last checkin * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemListShortActive(User user, PageControl pc) { SelectMode m = ModeFactory.getMode( "System_queries", "xmlrpc_visible_to_user_active", SystemOverview.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("checkin_threshold", new Integer(Config.get().getInt(ConfigDefaults .SYSTEM_CHECKIN_THRESHOLD))); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all systems that are visible to user * but not in the given server group. * @param user Currently logged in user. * @param sg a ServerGroup * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult <SystemOverview> systemsNotInGroup(User user, ServerGroup sg, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "target_systems_for_group"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sgid", sg.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns a list of all systems visible to user with pending errata. * @param user Current logged in user. * @param pc PageControl * @return list of SystemOverviews */ public static DataResult<SystemOverview> mostCriticalSystems(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "most_critical_systems"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of all systems visible to user. * @param user Currently logged in user. * @param feature The String label of the feature we want to get a list of systems for. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemsWithFeature(User user, String feature, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "systems_with_feature"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("feature", feature); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of out of date systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> outOfDateList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "out_of_date"); Map<String, Long> params = new HashMap<String, Long>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); Map<String, Long> elabParams = new HashMap<String, Long>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of unentitled systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> unentitledList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "unentitled"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of ungrouped systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> ungroupedList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "ungrouped"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of inactive systems visible to user, sorted by name. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> inactiveList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "inactive"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); params.put("checkin_threshold", new Integer(Config.get().getInt(ConfigDefaults .SYSTEM_CHECKIN_THRESHOLD))); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of inactive systems visible to user, sorted by name. * @param user Currently logged in user. * @param pc PageControl * @param inactiveDays number of days the systems should have been inactive for * @return list of SystemOverviews. */ public static DataResult<SystemOverview> inactiveList(User user, PageControl pc, int inactiveDays) { SelectMode m = ModeFactory.getMode("System_queries", "inactive"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); params.put("checkin_threshold", inactiveDays); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns a list of systems recently registered by the user * @param user Currently logged in user. * @param pc PageControl * @param threshold maximum amount of days ago the system, 0 returns all systems * was registered for it to appear in the list * @return list of SystemOverviews */ public static DataResult<SystemOverview> registeredList(User user, PageControl pc, int threshold) { SelectMode m; Map<String, Object> params = new HashMap<String, Object>(); if (threshold == 0) { m = ModeFactory.getMode("System_queries", "all_systems_by_registration"); } else { m = ModeFactory.getMode("System_queries", "recently_registered"); params.put("threshold", new Integer(threshold)); } params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of inactive systems visible to user, sorted by the systems' last * checkin time instead of by name. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> inactiveListSortbyCheckinTime(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "inactive_order_by_checkin_time"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("user_id", user.getId()); params.put("checkin_threshold", new Integer(Config.get().getInt(ConfigDefaults .SYSTEM_CHECKIN_THRESHOLD))); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of proxy systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> proxyList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "proxy_servers"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of virtual host systems visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<VirtualSystemOverview> virtualSystemsList( User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "virtual_servers"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, VirtualSystemOverview.class); } /** * Returns list of virtual guest systems running 'under' the given system. * @param user Currently logged in user. * @param sid The id of the system we are looking at * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<VirtualSystemOverview> virtualGuestsForHostList( User user, Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "virtual_guests_for_host"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, VirtualSystemOverview.class); } /** * Returns list of virtual systems in the given set * @param user Currently logged in user. * @param setLabel The label of the set of virtual systems * (rhnSet.elem = rhnVirtualInstance.id) * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<VirtualSystemOverview> virtualSystemsInSet( User user, String setLabel, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "virtual_systems_in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", setLabel); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, VirtualSystemOverview.class); } /** * Returns list of system groups visible to user. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemGroupOverviews. */ public static DataResult<SystemGroupOverview> groupList(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("SystemGroup_queries", "visible_to_user"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("org_id", user.getOrg().getId()); elabParams.put("user_id", user.getId()); return makeDataResult(params, elabParams, pc, m, SystemGroupOverview.class); } /** * Returns list of systems in the specified group. * @param sgid System Group Id * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemsInGroup(Long sgid, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "systems_in_group"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sgid", sgid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemOverview.class); } /** * Returns list of systems in the specified group. * This is meant to be fast and only return id, name, and last_checkin * @param sgid System Group Id * @return list of SystemOverviews. */ public static DataResult<SystemOverview> systemsInGroupShort(Long sgid) { SelectMode m = ModeFactory.getMode("System_queries", "xmlrpc_systems_in_group"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sgid", sgid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, null, m, SystemOverview.class); } /** * Returns the number of actions associated with a system * @param sid The system's id * @return number of actions */ public static int countActions(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "actions_count"); Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, params, null, m); return ((Long) dr.get(0).get("count")).intValue(); } /** * Returns the number of package actions associated with a system * @param sid The system's id * @return number of package actions */ public static int countPackageActions(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "package_actions_count"); Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, params, null, m); return ((Long) dr.get(0).get("count")).intValue(); } /** * Returns a list of unscheduled relevent errata for a system * @param user The user * @param sid The system's id * @param pc PageControl * @return a list of ErrataOverviews */ public static DataResult<Errata> unscheduledErrata(User user, Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("Errata_queries", "unscheduled_relevant_to_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, Errata.class); } /** * Returns whether a system has unscheduled relevant errata * @param user The user * @param sid The system's id * @return boolean of if system has unscheduled errata */ public static boolean hasUnscheduledErrata(User user, Long sid) { SelectMode m = ModeFactory.getMode("Errata_queries", "count_unscheduled_relevant_to_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, null, null, m); return ((Long) dr.get(0).get("count")).intValue() > 0; } /** * Returns Kickstart sessions associated with a server * @param user The logged in user * @param sid The server id * @return a list of KickStartSessions */ public static DataResult<KickstartSessionDto> lookupKickstartSession(User user, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "lookup_kickstart"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", user.getOrg().getId()); params.put("sid", sid); return makeDataResult(params, params, null, m, KickstartSessionDto.class); } /** * Returns whether or not a server is kickstarting * @param user The logged in user * @param sid The server id * @return boolean of if a server is kickstarting */ public static boolean isKickstarting(User user, Long sid) { Iterator<KickstartSessionDto> i = lookupKickstartSession(user, sid).iterator(); while (i.hasNext()) { KickstartSessionDto next = i.next(); if (!(next.getState().equals("complete") || next.getState().equals("failed"))) { return true; } } return false; } /** * Returns a list of errata relevant to a system * @param user The user * @param sid System Id * @return a list of ErrataOverviews */ public static DataResult<ErrataOverview> relevantErrata(User user, Long sid) { SelectMode m = ModeFactory.getMode("Errata_queries", "relevant_to_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("sid", sid); elabParams.put("user_id", user.getId()); return makeDataResultNoPagination(params, elabParams, m, ErrataOverview.class); } /** * Returns a list of errata relevant to a system * @param user The user * @param sid System Id * @param types of errata types (strings) to include * @return a list of ErrataOverviews */ public static DataResult<ErrataOverview> relevantErrata(User user, Long sid, List<String> types) { SelectMode m = ModeFactory.getMode("Errata_queries", "relevant_to_system_by_types"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("sid", sid); elabParams.put("user_id", user.getId()); DataResult<ErrataOverview> dr = m.execute(params, types); dr.setElaborationParams(elabParams); return dr; } /** * Returns a list of errata relevant to a system * @param user The user * @param sid System Id * @param type of errata to include * @param synopsis to filter by * @return a list of ErrataOverviews */ public static DataResult<ErrataOverview> relevantCurrencyErrata(User user, Long sid, String type, String synopsis) { SelectMode m = ModeFactory.getMode("Errata_queries", "security_relevant_to_system_by_synopsis"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); params.put("type", type); params.put("synopsis", synopsis); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("sid", sid); elabParams.put("user_id", user.getId()); DataResult<ErrataOverview> dr = m.execute(params); dr.setElaborationParams(elabParams); return dr; } /** * Returns a list of errata relevant to a system by type * @param user The user * @param sid System Id * @param type Type * @return a list of ErrataOverviews */ public static DataResult<ErrataOverview> relevantErrataByType(User user, Long sid, String type) { SelectMode m = ModeFactory.getMode("Errata_queries", "relevant_to_system_by_type"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); params.put("type", type); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("sid", sid); elabParams.put("user_id", user.getId()); return makeDataResultNoPagination(params, elabParams, m, ErrataOverview.class); } /** * Returns a count of the number of critical errata that are present on the system. * * @param user user making the request * @param sid identifies the server * @return number of critical errata on the system */ public static int countCriticalErrataForSystem(User user, Long sid) { SelectMode m = ModeFactory.getMode("Errata_queries", "count_critical_errata_for_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, null, null, m); return ((Long) dr.get(0).get("count")).intValue(); } /** * Returns a count of the number of non-critical errata that are present on the system. * * @param user user making the request * @param sid identifies the server * @return number of non-critical errata on the system */ public static int countNoncriticalErrataForSystem(User user, Long sid) { SelectMode m = ModeFactory.getMode("Errata_queries", "count_noncritical_errata_for_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("sid", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, null, null, m); return ((Long) dr.get(0).get("count")).intValue(); } /** * Returns a list of errata in a specified set * @param user The user * @param label The label for the errata set * @param pc PageControl * @return a list of ErrataOverviews */ public static DataResult errataInSet(User user, String label, PageControl pc) { SelectMode m = ModeFactory.getMode("Errata_queries", "in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", label); Map<String, Object> elabParams = new HashMap<String, Object>(); elabParams.put("user_id", user.getId()); DataResult dr = m.execute(params); dr.setElaborationParams(elabParams); return dr; } /** * Looks up a server by its Id * @param sid The server's id * @param userIn who wants to lookup the Server * @return a server object associated with the given Id */ public static Server lookupByIdAndUser(Long sid, User userIn) { Server server = ServerFactory.lookupByIdAndOrg(sid, userIn.getOrg()); ensureAvailableToUser(userIn, sid); return server; } /** * Returns a List of hydrated server objects from server ids. * @param serverIds the list of server ids to hyrdrate * @param userIn the user who wants to lookup the server * @return a List of hydrated server objects. */ public static List<Server> hydrateServerFromIds(Collection<Long> serverIds, User userIn) { List<Server> servers = new ArrayList<Server>(serverIds.size()); for (Long id : serverIds) { servers.add(lookupByIdAndUser(id, userIn)); } return servers; } /** * Looks up a server by its Id * @param sid The server's id * @param org who wants to lookup the Server * @return a server object associated with the given Id */ public static Server lookupByIdAndOrg(Long sid, Org org) { Server server = ServerFactory.lookupByIdAndOrg(sid, org); return server; } /** * Looks up a Server by it's client certificate. * @param cert ClientCertificate of the server. * @return the Server which matches the client certificate. * @throws InvalidCertificateException thrown if certificate is invalid. */ public static Server lookupByCert(ClientCertificate cert) throws InvalidCertificateException { return ServerFactory.lookupByCert(cert); } /** * Returns the list of activation keys used when the system was * registered. * @param serverIn the server to query for * @return list of ActivationKeyDto containing the token id and name */ public static DataResult<ActivationKeyDto> getActivationKeys(Server serverIn) { SelectMode m = ModeFactory.getMode("General_queries", "activation_keys_for_server"); Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", serverIn.getId()); return makeDataResult(params, Collections.EMPTY_MAP, null, m, ActivationKeyDto.class); } /** * Returns list of inactive systems visible to user, sorted by name. * @param user Currently logged in user. * @param pc PageControl * @return list of SystemOverviews. */ public static DataResult<SystemOverview> getSystemEntitlements(User user, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "system_entitlement_list"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); return makeDataResult(params, Collections.EMPTY_MAP, pc, m, SystemOverview.class); } /** * Returns the entitlements for the given server id. * @param sid Server id * @return entitlements - ArrayList of entitlements */ public static List<Entitlement> getServerEntitlements(Long sid) { List<Entitlement> entitlements = new ArrayList<Entitlement>(); SelectMode m = ModeFactory.getMode("General_queries", "system_entitlements"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); DataResult<Map<String, Object>> dr = makeDataResult(params, null, null, m); if (dr.isEmpty()) { return null; } Iterator<Map<String, Object>> iter = dr.iterator(); while (iter.hasNext()) { Map<String, Object> map = iter.next(); String ent = (String) map.get("label"); entitlements.add(EntitlementManager.getByName(ent)); } return entitlements; } /** * Used to test if the server has a specific entitlement. * We should almost always check for features with serverHasFeature instead. * @param sid Server id * @param ent Entitlement to look for * @return true if the server has the specified entitlement */ public static boolean hasEntitlement(Long sid, Entitlement ent) { List<Entitlement> entitlements = getServerEntitlements(sid); return entitlements != null && entitlements.contains(ent); } /** * Used to test if the server has a specific feature. * We should almost always check for features with serverHasFeature instead. * @param sid Server id * @param feat Feature to look for * @return true if the server has the specified feature */ public static boolean serverHasFeature(Long sid, String feat) { SelectMode m = ModeFactory.getMode("General_queries", "system_has_feature"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("feature", feat); DataResult dr = makeDataResult(params, null, null, m); return !dr.isEmpty(); } /** * Return <code>true</code> the given server has virtualization entitlements, * <code>false</code> otherwise. * @param sid Server ID to lookup. * @param org Org id of user performing this query. * @return <code>true</code> if the server has virtualization entitlements, * <code>false</code> otherwise. */ public static boolean serverHasVirtuaizationEntitlement(Long sid, Org org) { Server s = SystemManager.lookupByIdAndOrg(sid, org); return s.hasVirtualizationEntitlement(); } /** * Returns true if server has capability. * @param sid Server id * @param capability capability * @return true if server has capability */ public static boolean clientCapable(Long sid, String capability) { SelectMode m = ModeFactory.getMode("System_queries", "lookup_capability"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("name", capability); DataResult dr = makeDataResult(params, params, null, m); return !dr.isEmpty(); } /** * Returns a list of Servers which are compatible with the given server. * @param user User owner * @param server Server whose profiles we want. * @return a list of Servers which are compatible with the given server. */ public static List<Map<String, Object>> compatibleWithServer(User user, Server server) { return ServerFactory.compatibleWithServer(user, server); } /** * Subscribes the given server to the given channel. * @param user Current user * @param server Server to be subscribed * @param channel Channel to subscribe to. * @return the modified server if there were * any changes modifications made * to the Server during the call. * Make sure the caller uses the * returned server. */ public static Server subscribeServerToChannel(User user, Server server, Channel channel) { return subscribeServerToChannel(user, server, channel, false); } /** * Subscribes the given server to the given channel. * @param user Current user * @param server Server to be subscribed * @param channel Channel to subscribe to. * @param flush flushes the hibernate session. * @return the modified server if there were * any changes modifications made * to the Server during the call. * Make sure the caller uses the * returned server. */ public static Server subscribeServerToChannel(User user, Server server, Channel channel, boolean flush) { // do not allow non-satellite or non-proxy servers to // be subscribed to satellite or proxy channels respectively. if (channel.isSatellite()) { if (!server.isSatellite()) { return server; } } else if (channel.isProxy()) { if (!server.isProxy()) { return server; } } if (user != null && !ChannelManager.verifyChannelSubscribe(user, channel.getId())) { //Throw an exception with a nice error message so the user //knows what went wrong. LocalizationService ls = LocalizationService.getInstance(); PermissionException pex = new PermissionException("User does not have" + " permission to subscribe this server to this channel."); pex.setLocalizedTitle(ls.getMessage("permission.jsp.title.subscribechannel")); pex.setLocalizedSummary( ls.getMessage("permission.jsp.summary.subscribechannel")); throw pex; } if (!verifyArchCompatibility(server, channel)) { throw new IncompatibleArchException( server.getServerArch(), channel.getChannelArch()); } log.debug("calling subscribe_server_to_channel"); CallableMode m = ModeFactory.getCallableMode("Channel_queries", "subscribe_server_to_channel"); Map<String, Object> in = new HashMap<String, Object>(); in.put("server_id", server.getId()); if (user != null) { in.put("user_id", user.getId()); } else { in.put("user_id", null); } in.put("channel_id", channel.getId()); m.execute(in, new HashMap<String, Integer>()); /* * This is f-ing hokey, but we need to be sure to refresh the * server object since * we modified it outside of hibernate :-/ * This will update the server.channels set. */ log.debug("returning with a flush? " + flush); if (flush) { return (Server) HibernateFactory.reload(server); } HibernateFactory.getSession().refresh(server); return server; } /** * Returns true if the given server has a compatible architecture with the * given channel architecture. False if the server or channel is null or * they are not compatible. * @param server Server architecture to be verified. * @param channel Channel to check * @return true if compatible; false if null or not compatible. */ public static boolean verifyArchCompatibility(Server server, Channel channel) { if (server == null || channel == null) { return false; } return channel.getChannelArch().isCompatible(server.getServerArch()); } /** * Unsubscribe given server from the given channel. * @param user The user performing the operation * @param server The server to be unsubscribed * @param channel The channel to unsubscribe from */ public static void unsubscribeServerFromChannel(User user, Server server, Channel channel) { unsubscribeServerFromChannel(user, server, channel, false); } /** * Unsubscribe given server from the given channel. * @param user The user performing the operation * @param sid The id of the server to be unsubscribed * @param cid The id of the channel from which the server will be unsubscribed */ public static void unsubscribeServerFromChannel(User user, Long sid, Long cid) { if (ChannelManager.verifyChannelSubscribe(user, cid)) { unsubscribeServerFromChannel(sid, cid); } } /** * Unsubscribe given server from the given channel. * @param user The user performing the operation * @param server The server to be unsubscribed * @param channel The channel to unsubscribe from * @param flush flushes the hibernate session. Make sure you * reload the server & channel after method call * if you set this to true.. */ public static void unsubscribeServerFromChannel(User user, Server server, Channel channel, boolean flush) { if (!isAvailableToUser(user, server.getId())) { //Throw an exception with a nice error message so the user //knows what went wrong. LocalizationService ls = LocalizationService.getInstance(); PermissionException pex = new PermissionException("User does not have" + " permission to unsubscribe this server from this channel."); pex.setLocalizedTitle(ls.getMessage("permission.jsp.title.subscribechannel")); pex.setLocalizedSummary( ls.getMessage("permission.jsp.summary.subscribechannel")); throw pex; } unsubscribeServerFromChannel(server, channel, flush); } /** * Unsubscribe given server from the given channel. If you use this method, * YOU BETTER KNOW WHAT YOU'RE DOING!!! (Use the version that takes a user as well if * you're unsure. better safe than sorry). * @param server server to be unsubscribed * @param channel the channel to unsubscribe from * @return the modified server if there were * any changes modifications made * to the Server during the call. * Make sure the caller uses the * returned server. */ public static Server unsubscribeServerFromChannel(Server server, Channel channel) { return unsubscribeServerFromChannel(server, channel, false); } /** * Unsubscribe given server from the given channel. If you use this method, * YOU BETTER KNOW WHAT YOU'RE DOING!!! (Use the version that takes a user as well if * you're unsure. better safe than sorry). * @param server server to be unsubscribed * @param channel the channel to unsubscribe from * @param flush flushes the hibernate session. Make sure you * reload the server & channel after method call * if you set this to true.. * @return the modified server if there were * any changes modifications made * to the Server during the call. * Make sure the caller uses the * returned server. */ public static Server unsubscribeServerFromChannel(Server server, Channel channel, boolean flush) { if (channel == null) { //nothing to do ;) return server; } unsubscribeServerFromChannel(server.getId(), channel.getId()); /* * This is f-ing hokey, but we need to be sure to refresh the * server object since we modified it outside of hibernate :-/ * This will update the server.channels set. */ if (flush) { return (Server)HibernateFactory.reload(server); } HibernateFactory.getSession().refresh(server); return server; } /** * Unsubscribes a server from a channel without any check. Please use other * overloaded versions of this method if unsure. * @param sid the server id * @param cid the channel id */ public static void unsubscribeServerFromChannel(Long sid, Long cid) { CallableMode m = ModeFactory.getCallableMode("Channel_queries", "unsubscribe_server_from_channel"); Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", sid); params.put("channel_id", cid); m.execute(params, new HashMap<String, Integer>()); } /** * Deactivates the given proxy. * Make sure you either reload the server after this call,, * or use the returned Server object * @param server ProxyServer to be deactivated. * @return deproxified server. */ public static Server deactivateProxy(Server server) { ServerFactory.deproxify(server); Set<Channel> channels = server.getChannels(); for (Iterator<Channel> itr = channels.iterator(); itr.hasNext();) { Channel c = itr.next(); ChannelFamily cf = c.getChannelFamily(); if (cf.getLabel().equals("rhn-proxy")) { SystemManager.unsubscribeServerFromChannel(server, c); } } return server; } private static int executeWriteMode(String catalog, String mode, Map<String, Object> params) { WriteMode m = ModeFactory.getWriteMode(catalog, mode); return m.executeUpdate(params); } /** * Creates the client certificate (systemid) file for the given Server. * @param server Server whose client certificate is sought. * @return the client certificate (systemid) file for the given Server. * @throws InstantiationException thrown if error occurs creating the * client certificate. */ public static ClientCertificate createClientCertificate(Server server) throws InstantiationException { ClientCertificate cert = new ClientCertificate(); // add members to this cert User user = UserManager.findResponsibleUser(server.getOrg(), RoleFactory.ORG_ADMIN); cert.addMember("username", user.getLogin()); cert.addMember("os_release", server.getRelease()); cert.addMember("operating_system", server.getOs()); cert.addMember("architecture", server.getServerArch().getLabel()); cert.addMember("system_id", "ID-" + server.getId().toString()); cert.addMember("type", "REAL"); String[] fields = {"system_id", "os_release", "operating_system", "architecture", "username", "type"}; cert.addMember("fields", fields); try { //Could throw InvalidCertificateException in any fields are invalid cert.addMember("checksum", cert.genSignature(server.getSecret())); } catch (InvalidCertificateException e) { throw new InstantiationException("Couldn't generate signature"); } return cert; } /** * Store the server back to the db * @param serverIn The server to save */ public static void storeServer(Server serverIn) { ServerFactory.save(serverIn); } /** * Activates the given proxy for the given version. * @param server proxy server to activate. * @param version Proxy version. * @throws ProxySystemIsSatelliteException thrown if system is a satellite. * @throws InvalidProxyVersionException thrown if version is invalid. */ public static void activateProxy(Server server, String version) throws ProxySystemIsSatelliteException, InvalidProxyVersionException { if (server.isSatellite()) { throw new ProxySystemIsSatelliteException(); } ProxyInfo info = new ProxyInfo(); info.setServer(server); info.setVersion(null, version, "1"); server.setProxyInfo(info); if (Config.get().getBoolean(ConfigDefaults.WEB_SUBSCRIBE_PROXY_CHANNEL)) { Channel proxyChannel = ChannelManager.getProxyChannelByVersion( version, server); if (proxyChannel != null) { subscribeServerToChannel(null, server, proxyChannel); } } } /** * Entitles the given server to the given Entitlement. * @param server Server to be entitled. * @param ent Level of Entitlement. * @return ValidatorResult of errors and warnings. */ public static ValidatorResult entitleServer(Server server, Entitlement ent) { log.debug("Entitling: " + ent.getLabel()); return entitleServer(server.getOrg(), server.getId(), ent); } /** * Entitles the given server to the given Entitlement. * @param orgIn Org who wants to entitle the server. * @param sid server id to be entitled. * @param ent Level of Entitlement. * @return ValidatorResult of errors and warnings. */ public static ValidatorResult entitleServer(Org orgIn, Long sid, Entitlement ent) { Server server = ServerFactory.lookupByIdAndOrg(sid, orgIn); ValidatorResult result = new ValidatorResult(); if (hasEntitlement(sid, ent)) { log.debug("server already entitled."); result.addError(new ValidatorError("system.entitle.alreadyentitled", ent.getHumanReadableLabel())); return result; } if (EntitlementManager.VIRTUALIZATION.equals(ent)) { if (server.isVirtualGuest()) { result.addError(new ValidatorError("system.entitle.guestcantvirt")); return result; } if (!hasEntitlement(sid, EntitlementManager.VIRTUALIZATION)) { log.debug("setting up system for virt."); ValidatorResult virtSetupResults = setupSystemForVirtualization(orgIn, sid); result.append(virtSetupResults); if (virtSetupResults.getErrors().size() > 0) { log.debug("error trying to setup virt ent: " + virtSetupResults.getMessage()); return result; } } } Map<String, Object> in = new HashMap<String, Object>(); in.put("sid", sid); in.put("entitlement", ent.getLabel()); CallableMode m = ModeFactory.getCallableMode( "System_queries", "entitle_server"); m.execute(in, new HashMap<String, Integer>()); log.debug("done. returning null"); return result; } // Need to do some extra logic here // 1) Subscribe system to rhel-i386-server-vt-5 channel // 2) Subscribe system to rhn-tools-rhel-i386-server-5 // 3) Schedule package install of rhn-virtualization-host // Return a map with errors and warnings: // warnings -> list of ValidationWarnings // errors -> list of ValidationErrors private static ValidatorResult setupSystemForVirtualization(Org orgIn, Long sid) { Server server = ServerFactory.lookupById(sid); User user = UserFactory.findRandomOrgAdmin(orgIn); ValidatorResult result = new ValidatorResult(); // If this is a Satellite if (!ConfigDefaults.get().isSpacewalk()) { // just install libvirt for RHEL6 base channel Channel base = server.getBaseChannel(); if (base != null && base.isCloned()) { base = base.getOriginal(); } if ((base != null) && base.isRhelChannel() && !base.isReleaseXChannel(5)) { // do some actions for EL6/EL7/... } else { // otherwise subscribe to the virt channel if possible subscribeToVirtChannel(server, user, result); } } // Before we start looking to subscribe to a 'tools' channel for // rhn-virtualization-host, check if the server already has a package by this // name installed and leave it be if so. InstalledPackage rhnVirtHost = PackageFactory.lookupByNameAndServer( ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME, server); if (rhnVirtHost != null) { // System already has the package, we can stop here. log.debug("System already has " + ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME + " installed."); return result; } scheduleVirtualizationHostPackageInstall(server, user, result); return result; } /** * Schedule installation of rhn-virtualization-host package. * * Implies that we locate a child channel with this package and automatically * subscribe the system to it if possible. If multiple child channels have the package * and the server is not already subscribed to one, we report the discrepancy and * instruct the user to deal with this manually. * * @param server Server to schedule install for. * @param user User performing the operation. * @param result Validation result we'll be returning for the UI to render. */ private static void scheduleVirtualizationHostPackageInstall(Server server, User user, ValidatorResult result) { // Now subscribe to a child channel with rhn-virtualization-host (RHN Tools in the // case of Satellite) and schedule it for installation, or warn if we cannot find // a child with the package: Channel toolsChannel = null; try { toolsChannel = ChannelManager.subscribeToChildChannelWithPackageName( user, server, ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME); // If this is a Satellite and no RHN Tools channel is available // report the error if (!ConfigDefaults.get().isSpacewalk() && toolsChannel == null) { log.warn("no tools channel found"); result.addError(new ValidatorError("system.entitle.notoolschannel")); } // If Spacewalk and no channel has the rhn-virtualization-host package, // warn but allow the operation to proceed. else if (toolsChannel == null) { result.addWarning(new ValidatorWarning("system.entitle.novirtpackage", ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME)); } else { List<Map<String, Object>> packageResults = ChannelManager.listLatestPackagesEqual( toolsChannel.getId(), ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME); if (packageResults.size() > 0) { Map<String, Object> row = packageResults.get(0); Long nameId = (Long) row.get("name_id"); Long evrId = (Long) row.get("evr_id"); Long archId = (Long) row.get("package_arch_id"); ActionManager.schedulePackageInstall( user, server, nameId, evrId, archId); } else { result.addError(new ValidatorError("system.entitle.novirtpackage", ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME)); } } } catch (MultipleChannelsWithPackageException e) { log.warn("Found multiple child channels with package: " + ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME); result.addWarning(new ValidatorWarning( "system.entitle.multiplechannelswithpackagepleaseinstall", ChannelManager.RHN_VIRT_HOST_PACKAGE_NAME)); } } /** * Subscribe the system to the Red Hat Virtualization channel if necessary. * * This method should only ever be called in Satellite. * * @param server Server to schedule install for. * @param user User performing the operation. * @param result Validation result we'll be returning for the UI to render. */ private static void subscribeToVirtChannel(Server server, User user, ValidatorResult result) { Channel virtChannel = ChannelManager.subscribeToChildChannelByOSProduct( user, server, ChannelManager.VT_OS_PRODUCT); log.debug("virtChannel search by OS product found: " + virtChannel); // Otherwise, try just searching by package name: (libvirt in this case) if (virtChannel == null) { log.debug("Couldnt find a virt channel by OS/Product mappings, " + "trying package"); try { virtChannel = ChannelManager.subscribeToChildChannelWithPackageName( user, server, ChannelManager.VIRT_CHANNEL_PACKAGE_NAME); // If we couldn't find a virt channel, warn the user but continue: if (virtChannel == null) { log.warn("no virt channel"); result.addError(new ValidatorError( "system.entitle.novirtchannel")); } } catch (MultipleChannelsWithPackageException e) { log.warn("Found multiple child channels with package: " + ChannelManager.VIRT_CHANNEL_PACKAGE_NAME); result.addWarning(new ValidatorWarning( "system.entitle.multiplechannelswithpackage", ChannelManager.VIRT_CHANNEL_PACKAGE_NAME)); } } } /** * Removes all the entitlements related to a server.. * @param sid server id to be unentitled. */ public static void removeAllServerEntitlements(Long sid) { Map<String, Object> in = new HashMap<String, Object>(); in.put("sid", sid); CallableMode m = ModeFactory.getCallableMode( "System_queries", "unentitle_server"); m.execute(in, new HashMap<String, Integer>()); } /** * Removes a specific level of entitlement from the given Server. * @param sid server id to be unentitled. * @param ent Level of Entitlement. */ public static void removeServerEntitlement(Long sid, Entitlement ent) { if (!hasEntitlement(sid, ent)) { if (log.isDebugEnabled()) { log.debug("server doesnt have entitlement: " + ent); } return; } Map<String, Object> in = new HashMap<String, Object>(); in.put("sid", sid); in.put("entitlement", ent.getLabel()); CallableMode m = ModeFactory.getCallableMode( "System_queries", "remove_server_entitlement"); m.execute(in, new HashMap<String, Integer>()); } /** * Tests whether or not a given server can be entitled with a specific entitlement * @param server The server in question * @param ent The entitlement to test * @return Returns true or false depending on whether or not the server can be * entitled to the passed in entitlement. */ public static boolean canEntitleServer(Server server, Entitlement ent) { return canEntitleServer(server.getId(), ent); } /** * Tests whether or not a given server can be entitled with a specific entitlement * @param serverId The Id of the server in question * @param ent The entitlement to test * @return Returns true or false depending on whether or not the server can be * entitled to the passed in entitlement. */ public static boolean canEntitleServer(Long serverId, Entitlement ent) { if (log.isDebugEnabled()) { log.debug("canEntitleServer.serverId: " + serverId + " ent: " + ent.getHumanReadableLabel()); } Map<String, Object> in = new HashMap<String, Object>(); in.put("sid", serverId); in.put("entitlement", ent.getLabel()); Map<String, Integer> out = new HashMap<String, Integer>(); out.put("retval", new Integer(Types.NUMERIC)); CallableMode m = ModeFactory.getCallableMode("System_queries", "can_entitle_server"); Map<String, Object> result = m.execute(in, out); boolean retval = BooleanUtils. toBoolean(((Long) result.get("retval")).intValue()); log.debug("canEntitleServer.returning: " + retval); return retval; } /** * Returns a DataResult containing the systems subscribed to a particular channel. * but returns a DataResult of SystemOverview objects instead of maps * @param channel The channel in question * @param user The user making the call * @return Returns a DataResult of maps containing the ids and names of systems * subscribed to a channel. */ public static DataResult<Map<String, Object>> systemsSubscribedToChannelDto( Channel channel, User user) { Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("cid", channel.getId()); params.put("org_id", user.getOrg().getId()); SelectMode m = ModeFactory.getMode("System_queries", "systems_subscribed_to_channel", SystemOverview.class); return m.execute(params); } /** * Returns the number of systems subscribed to the given channel. * * @param channelId identifies the channel * @param user user making the request * @return number of systems subscribed to the channel */ public static int countSystemsSubscribedToChannel(Long channelId, User user) { Map<String, Long> params = new HashMap<String, Long>(2); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("cid", channelId); SelectMode m = ModeFactory.getMode("System_queries", "count_systems_subscribed_to_channel"); DataResult<Map<String, Object>> dr = makeDataResult(params, params, null, m); Map<String, Object> result = dr.get(0); Long count = (Long) result.get("count"); return count.intValue(); } /** * Returns a DataResult containing the systems subscribed to a particular channel. * @param channel The channel in question * @param user The user making the call * @return Returns a DataResult of maps containing the ids and names of systems * subscribed to a channel. */ public static DataResult<Map<String, Object>> systemsSubscribedToChannel( Channel channel, User user) { Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("cid", channel.getId()); params.put("org_id", user.getOrg().getId()); SelectMode m = ModeFactory.getMode("System_queries", "systems_subscribed_to_channel", Map.class); return m.execute(params); } /** * Return the list of systems subscribed to the given channel in the current set. * Each entry in the result will be of type EssentialServerDto as per the query. * * @param cid Channel * @param user User requesting the list * @param setLabel Set label * @return List of systems */ public static DataResult<EssentialServerDto> systemsSubscribedToChannelInSet( Long cid, User user, String setLabel) { Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("cid", cid); params.put("org_id", user.getOrg().getId()); params.put("set_label", setLabel); SelectMode m = ModeFactory.getMode( "System_queries", "systems_subscribed_to_channel_in_set"); return m.execute(params); } /** * Returns a DataResult containing maps representing the channels a particular system * is subscribed to. * @param server The server in question. * @return Returns a DataResult of maps representing the channels a particular system * is subscribed to. */ public static DataResult<Map<String, Object>> channelsForServer(Server server) { Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", server.getId()); SelectMode m = ModeFactory.getMode("Channel_queries", "system_channels", Map.class); return m.execute(params); } /** * Unlocks a server if the user has permissions on the server * @param user User who is attempting to unlock the server * @param server Server that is attempting to be unlocked */ public static void unlockServer(User user, Server server) { if (!isAvailableToUser(user, server.getId())) { LocalizationService ls = LocalizationService.getInstance(); LookupException e = new LookupException( "Could not find server " + server.getId() + " for user " + user.getId()); e.setLocalizedTitle(ls.getMessage("lookup.jsp.title.system")); e.setLocalizedReason1(ls.getMessage("lookup.jsp.reason1.system")); e.setLocalizedReason2(ls.getMessage("lookup.jsp.reason2.system")); throw e; } HibernateFactory.getSession().delete(server.getLock()); server.setLock(null); } /** * Locks a server if the user has permissions on the server * @param locker User who is attempting to lock the server * @param server Server that is attempting to be locked * @param reason String representing the reason the server was locked */ public static void lockServer(User locker, Server server, String reason) { if (!isAvailableToUser(locker, server.getId())) { LocalizationService ls = LocalizationService.getInstance(); LookupException e = new LookupException( "Could not find server " + server.getId() + " for user " + locker.getId()); e.setLocalizedTitle(ls.getMessage("lookup.jsp.title.system")); e.setLocalizedReason1(ls.getMessage("lookup.jsp.reason1.system")); e.setLocalizedReason2(ls.getMessage("lookup.jsp.reason2.system")); throw e; } ServerLock sl = new ServerLock(locker, server, reason); server.setLock(sl); } /** * Checks if the user has permissions to see the Server * @param user User being checked * @param sid ID of the Server being checked * @return true if the user can see the server, false otherwise */ public static boolean isAvailableToUser(User user, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "is_available_to_user"); Map<String, Object> params = new HashMap<String, Object>(); params.put("uid", user.getId()); params.put("sid", sid); return m.execute(params).size() >= 1; } /** * Checks if the System is a virtual host * @param oid id of the Org that the server is in * @param sid ID of the Server being checked * @return true if the system is a virtual host, false otherwise */ public static boolean isVirtualHost(Long oid, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "is_virtual_host_in_org"); Map<String, Object> params = new HashMap<String, Object>(); params.put("oid", oid); params.put("sid", sid); DataResult result = m.execute(params); return !result.isEmpty(); } /** * Checks if the user has permissions to see the Server * @param user User being checked * @param sid ID of the Server being checked */ public static void ensureAvailableToUser(User user, Long sid) { if (!isAvailableToUser(user, sid)) { LocalizationService ls = LocalizationService.getInstance(); LookupException e = new LookupException("Could not find server " + sid + " for user " + user.getId()); e.setLocalizedTitle(ls.getMessage("lookup.jsp.title.system")); e.setLocalizedReason1(ls.getMessage("lookup.jsp.reason1.system")); e.setLocalizedReason2(ls.getMessage("lookup.jsp.reason2.system")); throw e; } } /** * Return systems in the current set without a base channel. * @param user User requesting the query. * @return List of systems. */ public static DataResult<EssentialServerDto> systemsWithoutBaseChannelsInSet( User user) { SelectMode m = ModeFactory.getMode("System_queries", "systems_in_set_with_no_base_channel"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); return m.execute(params); } /** * Validates that the proposed number of virtual CPUs is valid for the * given virtual instance. * * @param guestId ID of a virtual instance. * @param proposedVcpuSetting Requested number of virtual CPUs for the guest. * @return ValidatorResult containing both error and warning messages. */ public static ValidatorResult validateVcpuSetting(Long guestId, int proposedVcpuSetting) { ValidatorResult result = new ValidatorResult(); VirtualInstanceFactory viFactory = VirtualInstanceFactory.getInstance(); VirtualInstance guest = viFactory.lookupById(guestId); Server host = guest.getHostSystem(); // Technically the limit is 32 for 32-bit architectures and 64 for 64-bit, // but the kernel is currently set to only accept 32 in either case. This may // need to change down the road. if (0 > proposedVcpuSetting || proposedVcpuSetting > 32) { result.addError(new ValidatorError( "systems.details.virt.vcpu.limit.msg", new Object [] {"32", guest.getName()})); } if (result.getErrors().isEmpty()) { // Warn the user if the proposed vCPUs exceeds the physical CPUs on the // host: CPU hostCpu = host.getCpu(); if (hostCpu != null && hostCpu.getNrCPU() != null) { if (proposedVcpuSetting > hostCpu.getNrCPU().intValue()) { result.addWarning(new ValidatorWarning( "systems.details.virt.vcpu.exceeds.host.cpus", new Object [] {host.getCpu().getNrCPU(), guest.getName()})); } } // Warn the user if the proposed vCPUs is an increase for this guest. // If the new value exceeds the setting the guest was started with, a // reboot will be required for the setting to take effect. VirtualInstanceState running = VirtualInstanceFactory.getInstance(). getRunningState(); if (guest.getState() != null && guest.getState().getId().equals(running.getId())) { Integer currentGuestCpus = guest.getNumberOfCPUs(); if (currentGuestCpus != null && proposedVcpuSetting > currentGuestCpus.intValue()) { result.addWarning(new ValidatorWarning( "systems.details.virt.vcpu.increase.warning", new Object [] {new Integer(proposedVcpuSetting), guest.getName()})); } } } return result; } /** * Validates the amount requested amount of memory can be allocated to each * of the guest systems in the list. Assumes all guests are on the same host. * * @param guestIds List of longs representing IDs of virtual instances. * @param proposedMemory Requested amount of memory for each guest. (in Mb) * @return ValidatorResult containing both error and warning messages. */ public static ValidatorResult validateGuestMemorySetting(List<Long> guestIds, int proposedMemory) { ValidatorResult result = new ValidatorResult(); VirtualInstanceFactory viFactory = VirtualInstanceFactory.getInstance(); if (guestIds.isEmpty()) { return result; } // Grab the host from the first guest in the list: Long firstGuestId = guestIds.get(0); Server host = (viFactory.lookupById(firstGuestId)). getHostSystem(); VirtualInstanceState running = VirtualInstanceFactory.getInstance(). getRunningState(); log.debug("Adding guest memory:"); List<ValidatorWarning> warnings = new LinkedList<ValidatorWarning>(); for (Iterator<VirtualInstance> it = host.getGuests().iterator(); it.hasNext();) { VirtualInstance guest = it.next(); // if the guest we're examining isn't running, don't count it's memory // when determining if the host has enough free: if (guest.getState() != null && guest.getState().getId().equals(running.getId())) { if (guest.getTotalMemory() != null) { log.debug(" " + guest.getName() + " = " + (guest.getTotalMemory().longValue() / 1024) + "MB"); if (guestIds.contains(guest.getId())) { // Warn the user that a change to max memory will require a reboot // for the settings to take effect: warnings.add(new ValidatorWarning( "systems.details.virt.memory.warning", new Object [] {guest.getName()})); } } else { // Not much we can do for calculations if we don't have reliable data, // continue on to other guests: log.warn("No total memory set for guest: " + guest.getName()); } } } // Warn the user to verify the system has enough free memory: // NOTE: Once upon a time we tried to do this automagically but the // code was removed due to uncertainty in terms of rebooting guests // if increasing past the allocation they were booted with, missing // hardware refreshes for the host, etc. warnings.add(new ValidatorWarning("systems.details.virt.memory.check.host")); if (!warnings.isEmpty()) { for (Iterator<ValidatorWarning> itr = warnings.iterator(); itr.hasNext();) { result.addWarning(itr.next()); } } return result; } /** * Return the system names and IDs that are selected in the SSM for the given user, * which also have been subscribed to the given channel. * * @param user User. * @param channelId Channel ID. * @return List of maps containing the system name and ID. */ public static List<Map<String, Object>> getSsmSystemsSubscribedToChannel(User user, Long channelId) { SelectMode m = ModeFactory.getMode("System_queries", "systems_in_set_with_channel"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("channel_id", channelId); return m.execute(params); } /** * lists systems with the given installed NVR * @param user the user doing the search * @param name the name of the package * @param version package version * @param release package release * @return list of systemOverview objects */ public static List<SystemOverview> listSystemsWithPackage(User user, String name, String version, String release) { SelectMode m = ModeFactory.getMode("System_queries", "systems_with_package_nvr"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("version", version); params.put("release", release); params.put("name", name); DataResult<SystemOverview> toReturn = m.execute(params); toReturn.elaborate(); return toReturn; } /** * lists systems with the given installed package id * @param user the user doing the search * @param id the id of the package * @return list of systemOverview objects */ public static DataResult<SystemOverview> listSystemsWithPackage(User user, Long id) { SelectMode m = ModeFactory.getMode("System_queries", "systems_with_package"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("pid", id); DataResult<SystemOverview> toReturn = m.execute(params); return toReturn; } /** * lists systems that can upgrade to the package id * @param user the user doing the search * @param id the id of the package * @return list of systemOverview objects */ public static DataResult<SystemOverview> listPotentialSystemsForPackage(User user, Long id) { SelectMode m = ModeFactory.getMode("System_queries", "potential_systems_for_package"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("pid", id); DataResult<SystemOverview> toReturn = m.execute(params); return toReturn; } /** * lists systems with the given needed/upgrade package id * @param user the user doing the search * @param id the id of the package * @return list of systemOverview objects */ public static List<SystemOverview> listSystemsWithNeededPackage(User user, Long id) { SelectMode m = ModeFactory.getMode("System_queries", "systems_with_needed_package"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("pid", id); DataResult<SystemOverview> toReturn = m.execute(params); //toReturn.elaborate(); return toReturn; } /** * List all virtual hosts for a user * @param user the user in question * @return list of SystemOverview objects */ public static List<SystemOverview> listVirtualHosts(User user) { SelectMode m = ModeFactory.getMode("System_queries", "virtual_hosts_for_user"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); DataResult<SystemOverview> toReturn = m.execute(params); toReturn.elaborate(); return toReturn; } /** * Returns the number of systems subscribed to the channel that are * <strong>not</strong> in the given org. * * @param orgId identifies the filter org * @param cid identifies the channel * @return count of systems */ public static int countSubscribedToChannelWithoutOrg(Long orgId, Long cid) { SelectMode m = ModeFactory.getMode("System_queries", "count_systems_subscribed_to_channel_not_in_org"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", orgId); params.put("cid", cid); DataResult<Map<String, Object>> dr = m.execute(params); Map<String, Object> result = dr.get(0); Long count = (Long) result.get("count"); return count.intValue(); } /** * List of servers subscribed to shared channels via org trust. * @param orgA The first org in the trust. * @param orgB The second org in the trust. * @return (system.id, system.org_id, system.name) */ public static DataResult<Map<String, Object>> subscribedInOrgTrust(long orgA, long orgB) { SelectMode m = ModeFactory.getMode("System_queries", "systems_subscribed_by_orgtrust"); Map<String, Object> params = new HashMap<String, Object>(); params.put("orgA", orgA); params.put("orgB", orgB); return m.execute(params); } /** * List of distinct servers subscribed to shared channels via org trust. * @param orgA The first org in the trust. * @param orgB The second org in the trust. * @return (system.id) */ public static DataResult<Map<String, Object>> sidsInOrgTrust(long orgA, long orgB) { SelectMode m = ModeFactory.getMode("System_queries", "sids_subscribed_by_orgtrust"); Map<String, Object> params = new HashMap<String, Object>(); params.put("orgA", orgA); params.put("orgB", orgB); return m.execute(params); } /** * gets the number of systems subscribed to a channel * @param user the user checking * @param cid the channel id * @return list of systems */ public static Long subscribedToChannelSize(User user, Long cid) { SelectMode m = ModeFactory.getMode("System_queries", "systems_subscribed_to_channel_size"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("org_id", user.getOrg().getId()); params.put("cid", cid); DataResult<Map<String, Object>> toReturn = m.execute(params); return (Long) toReturn.get(0).get("count"); } /** * List all virtual hosts for a user * @param user the user in question * @return list of SystemOverview objects */ public static DataResult<CustomDataKeyOverview> listDataKeys(User user) { SelectMode m = ModeFactory.getMode("System_queries", "custom_vals", CustomDataKeyOverview.class); Map<String, Object> params = new HashMap<String, Object>(); params.put("uid", user.getId()); params.put("org_id", user.getOrg().getId()); DataResult<CustomDataKeyOverview> toReturn = m.execute(params); return toReturn; } /** * Looks up a hardware device by the hardware device id * @param hwId the hardware device id * @return the HardwareDeviceDto */ public static HardwareDeviceDto getHardwareDeviceById(Long hwId) { HardwareDeviceDto hwDto = null; SelectMode m = ModeFactory.getMode("System_queries", "hardware_device_by_id"); Map<String, Object> params = new HashMap<String, Object>(); params.put("hw_id", hwId); DataResult<HardwareDeviceDto> dr = m.execute(params); if (dr != null && !dr.isEmpty()) { hwDto = dr.get(0); } return hwDto; } /** * Returns a mapping of servers in the SSM to the user-selected packages to remove * that actually exist on those servers. * * @param user identifies the user making the request * @param packageSetLabel identifies the RhnSet used to store the packages selected * by the user (this is needed for the query). This must be * established by the caller prior to calling this method * @param shortened whether or not to include the full elaborator, or a shortened * one that is much much faster, but doesn't provide a displayed * string for the package (only the id combo) * @return description of server information as well as a list of relevant packages */ public static DataResult<Map<String, Object>> ssmSystemPackagesToRemove(User user, String packageSetLabel, boolean shortened) { SelectMode m; if (shortened) { m = ModeFactory.getMode("System_queries", "system_set_remove_or_verify_packages_conf_short"); } else { m = ModeFactory.getMode("System_queries", "system_set_remove_or_verify_packages_conf"); } Map<String, Object> params = new HashMap<String, Object>(3); params.put("user_id", user.getId()); params.put("set_label", RhnSetDecl.SYSTEMS.getLabel()); params.put("package_set_label", packageSetLabel); DataResult<Map<String, Object>> result = makeDataResult(params, params, null, m); return result; } /** * Returns a mapping of servers in the SSM to user-selected packages to upgrade * that actually exist on those servers * * @param user identifies the user making the request * @param packageSetLabel identifies the RhnSet used to store the packages selected * by the user (this is needed for the query). This must be * established by the caller prior to calling this method * @return description of server information as well as a list of all relevant packages */ public static DataResult ssmSystemPackagesToUpgrade(User user, String packageSetLabel) { SelectMode m = ModeFactory.getMode("System_queries", "ssm_package_upgrades_conf"); Map<String, Object> params = new HashMap<String, Object>(3); params.put("user_id", user.getId()); params.put("set_label", RhnSetDecl.SYSTEMS.getLabel()); params.put("package_set_label", packageSetLabel); DataResult result = makeDataResult(params, params, null, m); return result; } /** * Deletes the indicates note, assuming the user has the proper permissions to the * server. * * @param user user making the request * @param serverId identifies server the note resides on * @param noteId identifies the note being deleted */ public static void deleteNote(User user, Long serverId, Long noteId) { Server server = lookupByIdAndUser(serverId, user); Session session = HibernateFactory.getSession(); Note doomed = (Note) session.get(Note.class, noteId); boolean deletedOnServer = server.getNotes().remove(doomed); if (deletedOnServer) { session.delete(doomed); } } /** * Deletes all notes on the given server, assuming the user has the proper permissions * to the server. * * @param user user making the request * @param serverId identifies the server on which to delete its notes */ public static void deleteNotes(User user, Long serverId) { Server server = lookupByIdAndUser(serverId, user); Session session = HibernateFactory.getSession(); for (Object doomed : server.getNotes()) { session.delete(doomed); } server.getNotes().clear(); } /** * Is the package with nameId, archId, and evrId available in the * provided server's subscribed channels * @param server the server * @param nameId the name id * @param archId the arch id * @param evrId the evr id * @return true if available, false otherwise */ public static boolean hasPackageAvailable(Server server, Long nameId, Long archId, Long evrId) { Map<String, Object> params = new HashMap<String, Object>(); params.put("server_id", server.getId()); params.put("eid", evrId); params.put("nid", nameId); String mode = "has_package_available"; if (archId == null) { mode = "has_package_available_no_arch"; } else { params.put("aid", archId); } SelectMode m = ModeFactory.getMode("System_queries", mode); DataResult toReturn = m.execute(params); return toReturn.size() > 0; } /** * Gets the list of proxies that the given system connects * through in order to reach the server. * @param sid The id of the server in question * @return Returns a list of ServerPath objects. */ public static DataResult<ServerPath> getConnectionPath(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "proxy_path_for_server"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); return m.execute(params); } /** * List all of the installed packages with the given name * @param packageName the package name * @param server the server * @return list of maps with name_id, evr_id and arch_id */ public static List<Map<String, Long>> listInstalledPackage( String packageName, Server server) { SelectMode m = ModeFactory.getMode("System_queries", "list_installed_packages_for_name"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", server.getId()); params.put("name", packageName); return m.execute(params); } /** * returns a List proxies available in the given org * @param org needed for org information * @return list of proxies for org */ public static DataResult<OrgProxyServer> listProxies(Org org) { DataResult<OrgProxyServer> retval = null; SelectMode mode = ModeFactory.getMode("System_queries", "org_proxy_servers"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", org.getId()); retval = mode.execute(params); return retval; } /** * list systems that can be subscribed to a particular child channel * @param user the user * @param chan the child channle * @return list of SystemOverview objects */ public static List<SystemOverview> listTargetSystemForChannel(User user, Channel chan) { DataResult<SystemOverview> retval = null; SelectMode mode = ModeFactory.getMode("System_queries", "target_systems_for_channel"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("cid", chan.getId()); params.put("org_id", user.getOrg().getId()); retval = mode.execute(params); retval.setElaborationParams(new HashMap<String, Object>()); return retval; } /** * Get a list of SystemOverview objects for the systems in an rhnset * @param user the user doing the lookup * @param setLabel the label of the set * @return List of SystemOverview objects */ public static List<SystemOverview> inSet(User user, String setLabel) { return inSet(user, setLabel, false); } /** * Get a list of SystemOverview objects for the systems in an rhnset with option * to elaborate the result * @param user the user doing the lookup * @param setLabel the label of the set * @param elaborate elaborate results * @return List of SystemOverview objects */ public static List<SystemOverview> inSet(User user, String setLabel, boolean elaborate) { DataResult<SystemOverview> retval = null; SelectMode mode = ModeFactory.getMode("System_queries", "in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", setLabel); retval = mode.execute(params); retval.setElaborationParams(new HashMap<String, Object>()); if (elaborate) { retval.elaborate(); } return retval; } /** * Find a system by it's name (must be an exact string match) * @param user the user doing the search * @param name the name of the system * @return the SystemOverview objects with the matching name */ public static List<SystemOverview> listSystemsByName(User user, String name) { SelectMode mode = ModeFactory.getMode("System_queries", "find_by_name"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("name", name); Map<String, Object> elabParams = new HashMap<String, Object>(); DataResult<SystemOverview> result = makeDataResult(params, elabParams, null, mode, SystemOverview.class); result.elaborate(); return result; } private static DataResult<SystemOverview> listDuplicates(User user, String query, String key) { SelectMode mode = ModeFactory.getMode("System_queries", query); Map<String, Object> params = new HashMap<String, Object>(); params.put("uid", user.getId()); params.put("key", key); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, null, mode, SystemOverview.class); } private static List<DuplicateSystemGrouping> listDuplicates(User user, String query, List<String> ignored, Long inactiveHours) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.HOUR, (0 - inactiveHours.intValue())); SelectMode ipMode = ModeFactory.getMode("System_queries", query); Date d = new Date(cal.getTimeInMillis()); Map<String, Object> params = new HashMap<String, Object>(); params.put("uid", user.getId()); params.put("inactive_date", d); DataResult<NetworkDto> nets; if (ignored.isEmpty()) { nets = ipMode.execute(params); } else { nets = ipMode.execute(params, ignored); } List<DuplicateSystemGrouping> nodes = new ArrayList<DuplicateSystemGrouping>(); for (NetworkDto net : nets) { boolean found = false; for (DuplicateSystemGrouping node : nodes) { if (node.addIfMatch(net)) { found = true; break; } } if (!found) { nodes.add(new DuplicateSystemGrouping(net)); } } return nodes; } /** * List duplicate systems by ip address * @param user the user doing the search * @param inactiveHours the number of hours a system hasn't checked in * to consider it inactive * @return List of DuplicateSystemGrouping objects */ public static List<DuplicateSystemGrouping> listDuplicatesByIP(User user, long inactiveHours) { List<String> ignoreIps = new ArrayList<String>(); ignoreIps.add("127.0.0.1"); ignoreIps.add("127.0.0.01"); ignoreIps.add("0"); return listDuplicates(user, "duplicate_system_ids_ip", ignoreIps, inactiveHours); } /** * List duplicate systems by ip address * @param user the user doing the search * @param ip ip address of the system * @return List of DuplicateSystemGrouping objects */ public static List<SystemOverview> listDuplicatesByIP(User user, String ip) { return listDuplicates(user, "duplicate_system_ids_ip_key", ip); } /** * List duplicate systems by ipv6 address * @param user the user doing the search * @param inactiveHours the number of hours a system hasn't checked in * to consider it inactive * @return List of DuplicateSystemGrouping objects */ public static List<DuplicateSystemGrouping> listDuplicatesByIPv6(User user, long inactiveHours) { List<String> ignoreIps = new ArrayList<String>(); ignoreIps.add("::1"); return listDuplicates(user, "duplicate_system_ids_ipv6", ignoreIps, inactiveHours); } /** * List duplicate systems by ipv6 address * @param user the user doing the search * @param ip ip address of the system * @return List of DuplicateSystemGrouping objects */ public static List<SystemOverview> listDuplicatesByIPv6(User user, String ip) { return listDuplicates(user, "duplicate_system_ids_ipv6_key", ip); } /** * List duplicate systems by mac address * @param user the user doing the search * @param inactiveHours the number of hours a system hasn't checked in * to consider it inactive * @return List of DuplicateSystemGrouping objects */ public static List<DuplicateSystemGrouping> listDuplicatesByMac(User user, Long inactiveHours) { List<String> ignoreMacs = new ArrayList<String>(); ignoreMacs.add("00:00:00:00:00:00"); ignoreMacs.add("fe:ff:ff:ff:ff:ff"); return listDuplicates(user, "duplicate_system_ids_mac", ignoreMacs, inactiveHours); } /** * List duplicate systems by mac address * @param user the user doing the search * @param mac the mac address of the system * @return List of DuplicateSystemGrouping objects */ public static List<SystemOverview> listDuplicatesByMac(User user, String mac) { return listDuplicates(user, "duplicate_system_ids_mac_key", mac); } /** * List duplicate systems by hostname * @param user the user doing the search * @param inactiveHours the number of hours a system hasn't checked in * to consider it inactive * @return List of DuplicateSystemBucket objects */ public static List<DuplicateSystemGrouping> listDuplicatesByHostname(User user, Long inactiveHours) { List<DuplicateSystemGrouping> duplicateSystems = listDuplicates(user, "duplicate_system_ids_hostname", new ArrayList<String>(), inactiveHours); ListIterator<DuplicateSystemGrouping> litr = duplicateSystems.listIterator(); while (litr.hasNext()) { DuplicateSystemGrouping element = litr.next(); element.setKey(IDN.toUnicode(element.getKey())); } return duplicateSystems; } /** * List duplicate systems by hostName * @param user the user doing the search * @param hostName host name of the system * @return List of DuplicateSystemGrouping objects */ public static List<SystemOverview> listDuplicatesByHostname(User user, String hostName) { return listDuplicates(user, "duplicate_system_ids_hostname_key", hostName); } /** * Return a note by ID and Server ID * @param user User to use to do the lookups * @param nid note ID * @param sid server ID * @return Note object */ public static Note lookupNoteByIdAndSystem(User user, Long nid, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "note_by_id_and_server"); Note n = new Note(); Map<String, Object> params = new HashMap<String, Object>(); params.put("nid", nid); params.put("sid", sid); DataResult<Map<String, Object>> dr = m.execute(params); for (Map<String, Object> map : dr) { n.setCreator(UserManager.lookupUser(user, (Long)map.get("creator"))); n.setId((Long)map.get("id")); n.setServer(lookupByIdAndUser((Long)map.get("server_id"), user)); n.setSubject((String)map.get("subject")); n.setNote((String)map.get("note")); n.setModified(Date.valueOf((String)map.get("modified"))); } return n; } /** * Lookup all the custom info keys not assigned to this server * @param orgId The org ID that the server belongs to * @param sid The ID of the server * @return DataResult of keys */ public static DataResult<Map<String, Object>> lookupKeysSansValueForServer(Long orgId, Long sid) { SelectMode m = ModeFactory.getMode("CustomInfo_queries", "custom_info_keys_sans_value_for_system"); Map<String, Object> inParams = new HashMap<String, Object>(); inParams.put("org_id", orgId); inParams.put("sid", sid); return m.execute(inParams); } /** * @param sid server id * @param pc pageContext * @return Returns history events for a system */ public static DataResult<SystemEventDto> systemEventHistory(Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "system_events_history"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemEventDto.class); } /** * @param sid server id * @param pc pageContext * @return Returns system snapshot list */ public static DataResult<Map<String, Object>> systemSnapshots(Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("General_queries", "system_snapshots"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m); } /** * @param sid server id * @param ssid snapshot id * @param pc pageContext * @return Returns system vs. snapshot packages comparision list */ public static DataResult<Map<String, Object>> systemSnapshotPackages(Long sid, Long ssid, PageControl pc) { SelectMode m = ModeFactory.getMode("Package_queries", "compare_packages_to_snapshot"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("ss_id", ssid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m); } /** * @param sid server id * @param ssid snapshot id * @param pc pageContext * @return Returns system vs. snapshot groups comparision list */ public static DataResult<Map<String, Object>> systemSnapshotGroups(Long sid, Long ssid, PageControl pc) { SelectMode m = ModeFactory.getMode("SystemGroup_queries", "snapshot_group_diff"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("ss_id", ssid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m); } /** * @param sid server id * @param ssid snapshot id * @param pc pageContext * @return Returns system vs. snapshot channels comparision list */ public static DataResult<Map<String, Object>> systemSnapshotChannels(Long sid, Long ssid, PageControl pc) { SelectMode m = ModeFactory.getMode("Channel_queries", "snapshot_channel_diff"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("ss_id", ssid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m); } /** * @param sid server id * @return Count of pending actions on system */ public static Long countPendingActions(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "system_events_history_count_pending"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); DataResult<Map<String, Object>> toReturn = m.execute(params); return (Long) toReturn.get(0).get("count"); } /** * @param sid server id * @param pc pageContext * @return Returns pending actions for a system */ public static DataResult<SystemPendingEventDto> systemPendingEvents(Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "system_events_pending"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SystemPendingEventDto.class); } /** * @param sid server id * @param pc pageControl * @return Returns snapshot tags for a system */ public static DataResult <SnapshotTagDto> snapshotTagsForSystem(Long sid, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "tags_for_system"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SnapshotTagDto.class); } /** * @param sid server id * @param ssId snapshot ID * @param pc pageControl * @return Returns snapshot tags for a system */ public static DataResult <SnapshotTagDto> snapshotTagsForSystemAndSnapshot(Long sid, Long ssId, PageControl pc) { SelectMode m = ModeFactory.getMode("System_queries", "tags_for_system_and_snapshot"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("ss_id", ssId); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SnapshotTagDto.class); } /** * @param user user * @param pc PageControl * @param setLabel Set Label * @param sid Server ID * @return SnapshotTags in RHNSet */ public static DataResult <SnapshotTagDto> snapshotTagsInSet(User user, PageControl pc, String setLabel, Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "snapshot_tags_in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); params.put("user_id", user.getId()); params.put("set_label", setLabel); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m, SnapshotTagDto.class); } /** * @param orgId organization ID * @param sid server id * @param ssId snapshot ID * @param pc pageControl * @return Returns unservable packages for a system */ public static DataResult<Map<String, Object>> systemSnapshotUnservablePackages( Long orgId, Long sid, Long ssId, PageControl pc) { SelectMode m = ModeFactory.getMode("Package_queries", "snapshot_unservable_package_list"); Map<String, Object> params = new HashMap<String, Object>(); params.put("org_id", orgId); params.put("sid", sid); params.put("ss_id", ssId); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, pc, m); } /** * @param uid user id * @param tid tag id * @return ssm systems with tag */ public static DataResult systemsInSetWithTag(Long uid, Long tid) { SelectMode m = ModeFactory.getMode("System_queries", "systems_in_set_with_tag"); Map params = new HashMap(); params.put("user_id", uid); params.put("tag_id", tid); return m.execute(params); } /** * Returns ids and names for systems in a given set with at least one of the * specified entitlements. * @param user the requesting user * @param setLabel the set label * @param entitlements the entitlement labels * @return a list of SystemOverview objects */ @SuppressWarnings("unchecked") public static List<SystemOverview> entitledInSet(User user, String setLabel, List<String> entitlements) { SelectMode mode = ModeFactory.getMode("System_queries", "entitled_systems_in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", setLabel); DataResult<SystemOverview> result = mode.execute(params, entitlements); result.setElaborationParams(new HashMap<String, Object>()); return result; } /** * Sets the custom info values for the systems in the set * @param user the requesting user * @param setLabel the set label * @param keyLabel the label of the custom value key * @param value the value to set for the custom value */ public static void bulkSetCustomValue(User user, String setLabel, String keyLabel, String value) { CallableMode mode = ModeFactory.getCallableMode("System_queries", "bulk_set_custom_values"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", setLabel); params.put("key_label", keyLabel); params.put("value", value); mode.execute(params, new HashMap<String, Integer>()); } /** * Removes the custom info values from the systems in the set * @param user the requesting user * @param setLabel the set label * @param keyId the id of the custom value key * @return number of rows deleted */ public static int bulkRemoveCustomValue(User user, String setLabel, Long keyId) { WriteMode mode = ModeFactory.getWriteMode("System_queries", "bulk_remove_custom_values"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("set_label", setLabel); params.put("key_id", keyId); return mode.executeUpdate(params); } /** * Get a list of all tags that are applicable to entitled systems in the set * @param user The user to check the system set for * @return Maps of id, name, tagged_systems, and date_tag_created */ public static DataResult<Map<String, Object>> listTagsForSystemsInSet(User user) { SelectMode mode = ModeFactory.getMode("General_queries", "tags_for_entitled_in_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); return mode.execute(params); } /** * Set the vaules for the user system prefrence for all systems in the system set * @param user The user * @param preference The name of the preference to set * @param value The value to set * @param defaultIn The default value for the preference */ public static void setUserSystemPreferenceBulk(User user, String preference, Boolean value, Boolean defaultIn) { CallableMode mode = ModeFactory.getCallableMode("System_queries", "reset_user_system_preference_bulk"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("pref", preference); mode.execute(params, new HashMap<String, Integer>()); // preference values have a default, only insert if not default if (value != defaultIn) { mode = ModeFactory.getCallableMode("System_queries", "set_user_system_preference_bulk"); params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("pref", preference); params.put("value", value ? 1 : 0); mode.execute(params, new HashMap<String, Integer>()); } } private static List<Long> errataIdsReleventToSystemSet(User user) { SelectMode mode = ModeFactory.getMode("System_queries", "unscheduled_relevant_to_system_set"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); List<Map<String, Object>> results = mode.execute(params); List<Long> ret = new ArrayList<Long>(); for (Map<String, Object> result : results) { ret.add((Long) result.get("id")); } return ret; } /** * Set auto_update for all systems in the system set * @param user The user * @param value True if the servers should audo update */ public static void setAutoUpdateBulk(User user, Boolean value) { if (value) { // schedule all existing applicable errata List<SystemOverview> systems = inSet(user, "system_list"); List<Long> sids = new ArrayList<Long>(); for (SystemOverview system : systems) { sids.add(system.getId()); } List<Long> eids = errataIdsReleventToSystemSet(user); java.util.Date earliest = new java.util.Date(); ErrataManager.applyErrata(user, eids, earliest, sids); } CallableMode mode = ModeFactory.getCallableMode("System_queries", "set_auto_update_bulk"); Map<String, Object> params = new HashMap<String, Object>(); params.put("user_id", user.getId()); params.put("value", value ? "Y" : "N"); mode.execute(params, new HashMap<String, Integer>()); } /** * Returns list of client systems that connect through a proxy * @param sid System Id of the proxy to check. * @return list of SystemOverviews. */ public static DataResult<SystemOverview> listClientsThroughProxy(Long sid) { SelectMode m = ModeFactory.getMode("System_queries", "clients_through_proxy"); Map<String, Object> params = new HashMap<String, Object>(); params.put("sid", sid); Map<String, Object> elabParams = new HashMap<String, Object>(); return makeDataResult(params, elabParams, null, m, SystemOverview.class); } }