/** * 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.taskomatic.task; import com.redhat.rhn.common.util.MethodUtil; import com.redhat.rhn.common.validator.ValidatorError; import com.redhat.rhn.domain.kickstart.KickstartData; import com.redhat.rhn.domain.kickstart.KickstartFactory; import com.redhat.rhn.domain.kickstart.KickstartableTree; import com.redhat.rhn.frontend.xmlrpc.util.XMLRPCInvoker; import com.redhat.rhn.manager.kickstart.KickstartEditCommand; import com.redhat.rhn.manager.kickstart.cobbler.CobblerDistroSyncCommand; import com.redhat.rhn.manager.kickstart.cobbler.CobblerProfileEditCommand; import com.redhat.rhn.manager.kickstart.cobbler.CobblerProfileSyncCommand; import com.redhat.rhn.manager.kickstart.cobbler.CobblerXMLRPCHelper; import org.apache.commons.lang.StringUtils; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import redstone.xmlrpc.XmlRpcFault; /** * CobblerSyncTask * synces cobbler * @version $Rev$ */ public class CobblerSyncTask extends RhnJavaJob { private static final AtomicLong LAST_UPDATED = new AtomicLong(); private long errorCount; private long distroWarnCount; /** * Default constructor */ public CobblerSyncTask() { errorCount = 0; distroWarnCount = 0; } /** * {@inheritDoc} */ public void execute(JobExecutionContext ctxIn) throws JobExecutionException { try { XMLRPCInvoker invoker = (XMLRPCInvoker) MethodUtil.getClassFromConfig(CobblerXMLRPCHelper.class.getName()); Double mtime = null; try { mtime = (Double) invoker.invokeMethod("last_modified_time", new ArrayList()); } catch (XmlRpcFault e) { log.error("Error calling cobbler.", e); } CobblerDistroSyncCommand distSync = new CobblerDistroSyncCommand(); ValidatorError ve = distSync.syncNullDistros(); if (ve != null && distroWarnCount < 1) { TaskHelper.sendErrorEmail(log, ve.getMessage()); distroWarnCount++; } // if we need to update a profile's kickstart tree, do that now List<KickstartData> profiles = KickstartFactory .lookupKickstartDataByUpdateable(); for (KickstartData profile : profiles) { KickstartableTree tree = KickstartFactory.getNewestTree( profile.getRealUpdateType(), profile.getChannel() .getId(), profile.getOrg()); if (tree != null && !tree.equals(profile.getTree())) { KickstartEditCommand cmd = new KickstartEditCommand( profile, null); cmd.updateKickstartableTree(profile.getChannel() .getId(), profile.getOrg().getId(), tree .getId(), tree.getDefaultDownloadLocation()); if (StringUtils.isNotEmpty(profile.getCobblerId())) { CobblerProfileEditCommand cpec = new CobblerProfileEditCommand( profile); cpec.store(); } } } log.debug("mtime: " + mtime.longValue() + ", last modified: " + LAST_UPDATED.get()); //If we got an mtime from cobbler and that mtime is before our last update // Then don't update anything if (mtime.longValue() < CobblerSyncTask.LAST_UPDATED.get()) { log.debug("Cobbler mtime is less than last change, skipping"); return; } log.debug("Syncing distros and profiles."); ve = distSync.store(); if (ve != null) { TaskHelper.sendErrorEmail(log, ve.getMessage()); } CobblerProfileSyncCommand profSync = new CobblerProfileSyncCommand(); profSync.store(); LAST_UPDATED.set((new Date()).getTime() / 1000 + 1); } catch (RuntimeException re) { log.error( "RuntimeExceptionError trying to sync to cobbler: " + re.getMessage(), re); // Only throw up one error. Otherwise if say cobblerd is shutoff you can // possibly generate 1 stacktrace email per minute which is quite spammy. if (errorCount < 1) { errorCount++; log.error("re-throwing exception since we havent yet."); throw re; } log.error("Not re-throwing any more errors."); } } }