backend/satellite_tools/reposync.py | 19
++-
java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java | 2
java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java | 48
++++++----
java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java | 19
+++
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml | 3
java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java | 27
+++++
java/code/src/com/redhat/rhn/manager/download/DownloadManager.java | 17
+++
java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java | 9
+
java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp | 7
+
9 files changed, 119 insertions(+), 32 deletions(-)
New commits:
commit f7a1384f0287e4f02b762e5ec438a28bf5a1efef
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Tue Aug 4 13:57:03 2009 -0400
enhancing logging mechanism for spacewalk-repo-sync
diff --git a/backend/satellite_tools/reposync.py b/backend/satellite_tools/reposync.py
index 80f830e..93e18e1 100644
--- a/backend/satellite_tools/reposync.py
+++ b/backend/satellite_tools/reposync.py
@@ -13,7 +13,7 @@
# granted to use or replicate Red Hat trademarks that are incorporated
# in this software or its documentation.
#
-import sys, os, time
+import sys, os, time, grp
from optparse import OptionParser
from common import rhnLib
from server import rhnPackage, rhnSQL, rhnChannel, rhnPackageUpload
@@ -45,10 +45,13 @@ class RepoSync:
log_filename = 'reposync.log'
if options.channel_label and options.label:
date = time.localtime()
- datestr = '%s.%s.%s-%s:%s:%s' % (date.tm_year, date.tm_mon,
date.tm_mday, date.tm_hour, date.tm_min, date.tm_sec)
+ datestr = '%d.%02d.%02d-%02d:%02d:%02d' % (date.tm_year, date.tm_mon,
date.tm_mday, date.tm_hour, date.tm_min, date.tm_sec)
log_filename = options.channel_label + '-' + options.label +
'-' + datestr + '.log'
rhnLog.initLOG(default_log_location + log_filename)
+ #os.fchown isn't in 2.4 :/
+ os.system("chgrp apache " + default_log_location + log_filename)
+
quit = False
if not options.url:
@@ -64,11 +67,13 @@ class RepoSync:
quit = True
self.error_msg("--label must be specified")
+ self.log_msg("\nSync started: %s" % (time.asctime(time.localtime())))
+ self.log_msg(str(sys.argv))
+
+
if quit:
sys.exit(1)
- self.log_msg(str(sys.argv))
-
self.type = options.type
self.url = options.url
self.channel_label = options.channel_label
@@ -80,10 +85,9 @@ class RepoSync:
print "Channel does not exist or is not custom"
sys.exit(1)
-
-
self.plugin = self.load_plugin()(self.url, self.channel_label + "-" +
self.repo_label)
self.import_packages(self.plugin.list_packages())
+ self.print_msg("Sync complete")
def process_args(self):
self.parser = OptionParser()
@@ -119,7 +123,8 @@ class RepoSync:
pack.version, pack.release, '', pack.arch]):
to_download.append(pack)
-
+ if len(to_download) == 0:
+ self.print_msg("No new packages to download.")
for (index, pack) in enumerate(to_download):
"""download each package"""
try:
diff --git a/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
b/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
index 1002d2f..976b902 100644
--- a/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
+++ b/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
@@ -146,7 +146,7 @@ public class ConfigDefaults {
public static final String KICKSTART_NETWORK_INTERFACE =
"kickstart.default_interface";
public static final String SPACEWALK_REPOSYNC_PATH =
"spacewalk_reposync_path";
- public static final String SPACEWALK_REPOSYNC_LOG_FILE =
"spacewalk_reposync_logfile";
+ public static final String SPACEWALK_REPOSYNC_LOG_PATH =
"spacewalk_reposync_logpath";
private ConfigDefaults() {
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java
b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java
index 257c8ee..bbf9c34 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java
@@ -14,24 +14,6 @@
*/
package com.redhat.rhn.frontend.action.channel.manage;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.struts.action.ActionErrors;
-import org.apache.struts.action.ActionForm;
-import org.apache.struts.action.ActionForward;
-import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.ActionMessage;
-import org.apache.struts.action.ActionMessages;
-import org.apache.struts.action.DynaActionForm;
-
import com.redhat.rhn.common.db.datasource.DataResult;
import com.redhat.rhn.common.localization.LocalizationService;
import com.redhat.rhn.common.security.PermissionException;
@@ -57,9 +39,28 @@ import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.channel.CreateChannelCommand;
import com.redhat.rhn.manager.channel.InvalidGPGFingerprintException;
import com.redhat.rhn.manager.channel.UpdateChannelCommand;
+import com.redhat.rhn.manager.download.DownloadManager;
import com.redhat.rhn.manager.system.SystemManager;
import com.redhat.rhn.manager.user.UserManager;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionForward;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionMessage;
+import org.apache.struts.action.ActionMessages;
+import org.apache.struts.action.DynaActionForm;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
/**
* EditChannelAction
@@ -125,6 +126,7 @@ public class EditChannelAction extends RhnAction implements Listable
{
createSuccessMessage(request, "message.channelupdated",
form.getString("name"));
}
+
//did they enable per user subscriptions?
String sub = (String)form.get("per_user_subscriptions");
@@ -167,6 +169,11 @@ public class EditChannelAction extends RhnAction implements Listable
{
params);
}
+ if (errors.isEmpty() && form.get("sync_repo") != null) {
+ createSuccessMessage(request, "message.syncscheduled",
+ form.getString("name"));
+ }
+
return getStrutsDelegate().forwardParams(
mapping.findForward("success"), params);
}
@@ -597,6 +604,11 @@ public class EditChannelAction extends RhnAction implements Listable
{
cs.getLastSynced());
}
request.setAttribute("last_sync", lastSync);
+ if (ChannelManager.getLatestSyncLogFile(cs) != null) {
+ request.setAttribute("log_url",
+ DownloadManager.getChannelSyncLogDownloadPath(cs,
+ ctx.getLoggedInUser()));
+ }
}
diff --git a/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
b/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
index 3679640..d1a88a3 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java
@@ -22,6 +22,7 @@ import com.redhat.rhn.common.util.MD5Sum;
import com.redhat.rhn.common.util.download.ByteArrayStreamInfo;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
+import com.redhat.rhn.domain.channel.ContentSource;
import com.redhat.rhn.domain.kickstart.KickstartFactory;
import com.redhat.rhn.domain.kickstart.KickstartSession;
import com.redhat.rhn.domain.kickstart.KickstartSessionState;
@@ -35,6 +36,7 @@ import com.redhat.rhn.domain.rhnpackage.PatchSet;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.domain.user.UserFactory;
import com.redhat.rhn.frontend.struts.RhnHelper;
+import com.redhat.rhn.manager.channel.ChannelManager;
import com.redhat.rhn.manager.download.DownloadManager;
import com.redhat.rhn.manager.download.UnknownDownloadTypeException;
@@ -45,7 +47,9 @@ import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileReader;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
@@ -317,6 +321,21 @@ public class DownloadFile extends DownloadAction {
return getStreamForText(patch.getReadme().getBytes(1L,
(int) patch.getReadme().length()));
}
+ else if (type.equals(DownloadManager.DOWNLOAD_TYPE_REPO_LOG)) {
+ ContentSource cs = ChannelFactory.lookupContentSource(fileId);
+ ChannelManager.verifyChannelAdmin(user, fileId);
+ File file = new File(ChannelManager.getLatestSyncLogFile(cs));
+
+ StringBuilder output = new StringBuilder();
+ BufferedReader input = new BufferedReader(new FileReader(file));
+ String line;
+ while ((line = input.readLine()) != null) {
+ output.append(line);
+ output.append("\n");
+ }
+
+ return getStreamForText(output.toString().getBytes());
+ }
}
throw new UnknownDownloadTypeException("The specified download type " +
type +
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
index ab5ce38..63108c2 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
@@ -8252,6 +8252,9 @@ Follow this url to see the full list of inactive systems:
<trans-unit id="message.channelupdated">
<source>Channel <strong>{0}</strong>
updated.</source>
</trans-unit>
+ <trans-unit id="message.syncscheduled">
+ <source>Repository Sync Scheduled.</source>
+ </trans-unit>
<trans-unit id="message.channelsubscribers">
<source>Per-User subscription restrictions may be applied in the
Subscribers tab</source>
</trans-unit>
diff --git a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
index 32ddadb..aec5e6e 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/ChannelManager.java
@@ -35,6 +35,7 @@ import com.redhat.rhn.domain.channel.ChannelFamily;
import com.redhat.rhn.domain.channel.ChannelFamilyFactory;
import com.redhat.rhn.domain.channel.ChannelVersion;
import com.redhat.rhn.domain.channel.ClonedChannel;
+import com.redhat.rhn.domain.channel.ContentSource;
import com.redhat.rhn.domain.channel.DistChannelMap;
import com.redhat.rhn.domain.channel.InvalidChannelRoleException;
import com.redhat.rhn.domain.channel.ProductName;
@@ -2783,4 +2784,30 @@ public class ChannelManager extends BaseManager {
return fileModifiedDate;
}
+
+ /**
+ * get the latest log file for spacewalk-repo-sync
+ * @param cs the channel content source you want the latest log file for
+ * @return the string of the filename (fully qualified)
+ */
+ public static String getLatestSyncLogFile(ContentSource cs) {
+
+ String logPath =
Config.get().getString(ConfigDefaults.SPACEWALK_REPOSYNC_LOG_PATH,
+ "/var/log/rhn/reposync/");
+ String repoLabel = cs.getLabel();
+
+ File dir = new File(logPath);
+ List<String> possibleList = new ArrayList<String>();
+ for (String file : dir.list()) {
+ if (file.contains(cs.getChannel().getLabel() + '-' + repoLabel)) {
+ possibleList.add(file);
+ }
+ }
+ if (possibleList.isEmpty()) {
+ return null;
+ }
+ Collections.sort(possibleList);
+ return logPath + possibleList.get(possibleList.size() - 1);
+ }
+
}
diff --git a/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
b/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
index 8d2dc7c..12e469d 100644
--- a/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
+++ b/java/code/src/com/redhat/rhn/manager/download/DownloadManager.java
@@ -17,6 +17,7 @@ package com.redhat.rhn.manager.download;
import com.redhat.rhn.common.conf.Config;
import com.redhat.rhn.common.conf.ConfigDefaults;
import com.redhat.rhn.common.security.SessionSwap;
+import com.redhat.rhn.domain.channel.ContentSource;
import com.redhat.rhn.domain.rhnpackage.Package;
import com.redhat.rhn.domain.rhnpackage.PackageSource;
import com.redhat.rhn.domain.rhnpackage.Patch;
@@ -43,7 +44,7 @@ public class DownloadManager extends BaseManager {
public static final String DOWNLOAD_TYPE_ISO = "iso";
public static final String DOWNLOAD_TYPE_PATCH_README = "patchreadme";
public static final String DOWNLOAD_TYPE_PATCH_SET_README =
"patchsetreadme";
-
+ public static final String DOWNLOAD_TYPE_REPO_LOG = "repolog";
/**
* Get a download path (part of the url) that is used to download a package.
@@ -96,6 +97,20 @@ public class DownloadManager extends BaseManager {
DownloadManager.DOWNLOAD_TYPE_SOURCE);
}
+ /**
+ * Get a download path that is used to download a repo log file.
+ *
+ * @param src the content source
+ * @param user the user
+ * @return the path/url
+ */
+ public static String getChannelSyncLogDownloadPath(ContentSource src,
+ User user) {
+ return getNonExpiringDownloadPath(src.getId(), src.getLabel(), user,
+ DownloadManager.DOWNLOAD_TYPE_REPO_LOG);
+ }
+
+
/**
* Get the an ISO download Path
diff --git a/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
b/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
index f26278b..57b9f8b 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
@@ -63,6 +63,10 @@ public class RepoSyncTask implements Job {
throws JobExecutionException {
for (Task task : TaskFactory.listTasks(DISPLAY_NAME)) {
+ //workaround in case task is null (which can happen)
+ if (task == null || task.getData() == null) {
+ continue;
+ }
ContentSource src = ChannelFactory.lookupContentSource(task.getData());
if (log.isInfoEnabled()) {
log.info("Syncing repo " + src.getSourceUrl() + " to
channel " +
@@ -76,6 +80,7 @@ public class RepoSyncTask implements Job {
try {
Process p = Runtime.getRuntime().exec(
getSyncCommand(src).toArray(new String[0]));
+ src.setLastSynced(new Date());
p.waitFor();
}
@@ -87,7 +92,6 @@ public class RepoSyncTask implements Job {
log.fatal(e.getMessage());
e.printStackTrace();
}
- src.setLastSynced(new Date());
TaskFactory.removeTask(task);
}
}
@@ -104,9 +108,6 @@ public class RepoSyncTask implements Job {
cmd.add(src.getType().getLabel());
cmd.add("--label");
cmd.add(src.getLabel());
- cmd.add("--logfile");
- cmd.add(Config.get().getString(ConfigDefaults.SPACEWALK_REPOSYNC_LOG_FILE,
- "/var/log/rhn/rhn_reposync.log"));
return cmd;
}
diff --git a/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
b/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
index 022152f..cc1f02a 100644
--- a/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
+++ b/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
@@ -147,7 +147,12 @@
<bean:message key="channel.edit.jsp.lastsynced"/>:
</th>
<td>
- <c:out value='${last_sync}'/>
+ <c:if test='${not empty log_url}'>
+ <a href='${log_url}'><c:out
value='${last_sync}'/></a>
+ </c:if>
+ <c:if test='${empty log_url}'>
+ <c:out value='${last_sync}'/>
+ </c:if>
</td>
</tr>
</c:if>