backend/satellite_tools/repo_plugins/yum_src.py | 17
+-
backend/satellite_tools/reposync.py | 69
+++++++---
java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java | 2
java/code/src/com/redhat/rhn/frontend/action/channel/manage/EditChannelAction.java | 2
java/code/src/com/redhat/rhn/manager/channel/CreateChannelCommand.java | 18
++
java/code/src/com/redhat/rhn/manager/channel/UpdateChannelCommand.java | 8
-
java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java | 20
++
java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp | 16
+-
8 files changed, 112 insertions(+), 40 deletions(-)
New commits:
commit f842a5b42266b3ad09929a9b5d524cbd65470bb7
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Thu Jul 30 13:23:47 2009 -0400
adding sync repo option to channel details, and taskomatic task
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 d1e5065..4160ba1 100644
--- a/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
+++ b/java/code/src/com/redhat/rhn/common/conf/ConfigDefaults.java
@@ -145,6 +145,8 @@ public class ConfigDefaults {
public static final String VIRT_DISK = "kickstart.virt_disk_size_gb";
public static final String KICKSTART_NETWORK_INTERFACE =
"kickstart.default_interface";
+ public static final String SPACEWALK_REPO_SYNC_PATH =
"spacewalk_repo_sync_path";
+
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 baa0737..6f913d1 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
@@ -335,6 +335,7 @@ public class EditChannelAction extends RhnAction implements Listable
{
ucc.setAccess((String)form.get("org_sharing"));
ucc.setYumUrl((String) form.getString("yum_repo"));
ucc.setRepoLabel((String) form.getString("repo_label"));
+ ucc.setSyncRepo((Boolean)form.get("sync_repo"));
String parent = (String)form.get("parent");
if (parent == null || parent.equals("")) {
@@ -407,6 +408,7 @@ public class EditChannelAction extends RhnAction implements Listable
{
ccc.setAccess((String)form.get("org_sharing"));
ccc.setYumUrl((String) form.getString("yum_repo"));
ccc.setRepoLabel((String) form.getString("repo_label"));
+ ccc.setSyncRepo((Boolean)form.get("sync_repo"));
String parent = (String)form.get("parent");
if (parent == null || parent.equals("")) {
diff --git a/java/code/src/com/redhat/rhn/manager/channel/CreateChannelCommand.java
b/java/code/src/com/redhat/rhn/manager/channel/CreateChannelCommand.java
index 0ea6469..275dd45 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/CreateChannelCommand.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/CreateChannelCommand.java
@@ -18,12 +18,14 @@ import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelArch;
import com.redhat.rhn.domain.channel.ChannelFactory;
import com.redhat.rhn.domain.role.RoleFactory;
+import com.redhat.rhn.domain.task.TaskFactory;
import com.redhat.rhn.domain.user.User;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelLabelException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelNameException;
import com.redhat.rhn.frontend.xmlrpc.InvalidGPGKeyException;
import com.redhat.rhn.frontend.xmlrpc.InvalidGPGUrlException;
import com.redhat.rhn.frontend.xmlrpc.InvalidParentChannelException;
+import com.redhat.rhn.taskomatic.task.RepoSyncTask;
import org.apache.commons.lang.StringUtils;
@@ -69,6 +71,7 @@ public class CreateChannelCommand {
protected String access = Channel.PRIVATE;
protected String yumUrl;
protected String repoLabel;
+ protected boolean syncRepo = false;
@@ -261,6 +264,7 @@ public class CreateChannelCommand {
c.setMaintainerEmail(maintainerEmail);
c.setMaintainerPhone(maintainerPhone);
c.setSupportPolicy(supportPolicy);
+ c.setYumContentSource(yumUrl, repoLabel);
// handles either parent id or label
setParentChannel(c, user, parentLabel, parentId);
@@ -271,9 +275,11 @@ public class CreateChannelCommand {
ChannelFactory.save(c);
ChannelFactory.refreshNewestPackageCache(c, WEB_CHANNEL_CREATED);
-
- c.setYumContentSource(yumUrl, repoLabel);
+ if (syncRepo && !c.getContentSources().isEmpty()) {
+ TaskFactory.createTask(user.getOrg(), RepoSyncTask.DISPLAY_NAME,
+ c.getContentSources().iterator().next().getId());
+ }
return c;
}
@@ -449,5 +455,13 @@ public class CreateChannelCommand {
public void setRepoLabel(String repoLabelIn) {
this.repoLabel = repoLabelIn;
}
+
+
+ /**
+ * @param syncRepoIn The syncRepo to set.
+ */
+ public void setSyncRepo(boolean syncRepoIn) {
+ this.syncRepo = syncRepoIn;
+ }
}
diff --git a/java/code/src/com/redhat/rhn/manager/channel/UpdateChannelCommand.java
b/java/code/src/com/redhat/rhn/manager/channel/UpdateChannelCommand.java
index 79764aa..80b8e80 100644
--- a/java/code/src/com/redhat/rhn/manager/channel/UpdateChannelCommand.java
+++ b/java/code/src/com/redhat/rhn/manager/channel/UpdateChannelCommand.java
@@ -17,9 +17,11 @@ package com.redhat.rhn.manager.channel;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.channel.ChannelFactory;
+import com.redhat.rhn.domain.task.TaskFactory;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelLabelException;
import com.redhat.rhn.frontend.xmlrpc.InvalidChannelNameException;
import com.redhat.rhn.frontend.xmlrpc.InvalidParentChannelException;
+import com.redhat.rhn.taskomatic.task.RepoSyncTask;
/**
* UpdateChannelCommand - command to create a new channel.
@@ -77,10 +79,12 @@ public class UpdateChannelCommand extends CreateChannelCommand {
c.setMaintainerEmail(maintainerEmail);
c.setMaintainerPhone(maintainerPhone);
c.setSupportPolicy(supportPolicy);
-
-
c.setYumContentSource(yumUrl, repoLabel);
+ if (syncRepo && !c.getContentSources().isEmpty()) {
+ TaskFactory.createTask(user.getOrg(), RepoSyncTask.DISPLAY_NAME,
+ c.getContentSources().iterator().next().getId());
+ }
// need to save before calling stored proc below
ChannelFactory.save(c);
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 ae382a5..fdbe9e4 100644
--- a/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
+++ b/java/code/src/com/redhat/rhn/taskomatic/task/RepoSyncTask.java
@@ -14,6 +14,8 @@
*/
package com.redhat.rhn.taskomatic.task;
+import com.redhat.rhn.common.conf.Config;
+import com.redhat.rhn.common.conf.ConfigDefaults;
import com.redhat.rhn.domain.channel.ChannelFactory;
import com.redhat.rhn.domain.channel.ContentSource;
import com.redhat.rhn.domain.task.Task;
@@ -29,6 +31,7 @@ import java.util.ArrayList;
import java.util.Date;
import java.util.List;
+
/**
* Repo Sync
* Used for syncing repos (like yum repos) to a channel
@@ -59,7 +62,7 @@ public class RepoSyncTask implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
- for (Task task : TaskFactory.listTasks("repo_sync")) {
+ for (Task task : TaskFactory.listTasks(DISPLAY_NAME)) {
ContentSource src = ChannelFactory.lookupContentSource(task.getData());
if (src == null) {
@@ -68,10 +71,16 @@ public class RepoSyncTask implements Job {
}
try {
- Process p = Runtime.getRuntime().exec("");
+
+ Process p = Runtime.getRuntime().exec(
+ (String[]) getSyncCommand(src).toArray());
+ p.waitFor();
}
catch (IOException e) {
-
+ e.printStackTrace();
+ }
+ catch (InterruptedException e) {
+ e.printStackTrace();
}
src.setLastSynced(new Date());
TaskFactory.removeTask(task);
@@ -80,13 +89,16 @@ public class RepoSyncTask implements Job {
private static List<String> getSyncCommand(ContentSource src) {
List<String> cmd = new ArrayList<String>();
- cmd.add("/usr/sbin/spacewalk-repo-sync");
+ cmd.add(Config.get().getString(ConfigDefaults.SPACEWALK_REPO_SYNC_PATH,
+ "/usr/sbin/spacewalk-repo-sync"));
cmd.add("-c");
cmd.add(src.getChannel().getLabel());
cmd.add("-u");
cmd.add(src.getSourceUrl());
cmd.add("-t");
cmd.add(src.getType().getLabel());
+ cmd.add("-l");
+ cmd.add(src.getLabel());
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 adda2fb..ee51f22 100644
--- a/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
+++ b/java/code/webapp/WEB-INF/pages/channel/manage/edit.jsp
@@ -120,6 +120,14 @@
<html:text property="yum_repo" maxlength="512"
size="64" />
</td>
</tr>
+ <tr>
+ <th>
+ <bean:message key="channel.edit.jsp.repolabel"/>:
+ </th>
+ <td>
+ <html:text property="repo_label" maxlength="64"
size="20" />
+ </td>
+ </tr>
<c:if test='${not empty param.cid}'>
<tr>
<th>
@@ -132,14 +140,6 @@
</c:if>
<tr>
<th>
- <bean:message key="channel.edit.jsp.repolabel"/>:
- </th>
- <td>
- <html:text property="repo_label" maxlength="64"
size="20" />
- </td>
- </tr>
- <tr>
- <th>
<bean:message key="channel.edit.jsp.sync"/>:
</th>
<td>
commit a75f22ad634db6631b56582018a81d723a61c257
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Thu Jul 30 13:21:41 2009 -0400
adding logging, cache clearing, and a few fixes to reposync
diff --git a/backend/satellite_tools/repo_plugins/yum_src.py
b/backend/satellite_tools/repo_plugins/yum_src.py
index fb3859f..77c6f57 100644
--- a/backend/satellite_tools/repo_plugins/yum_src.py
+++ b/backend/satellite_tools/repo_plugins/yum_src.py
@@ -14,6 +14,7 @@
# in this software or its documentation.
#
import yum
+import shutil
from yum import config
from reposync import ContentPackage
@@ -21,10 +22,11 @@ class ContentSource:
url = None
name = None
repo = None
-
+ cache_dir = '/var/cache/rhn/reposync/'
def __init__(self, url, name):
self.url = url
self.name = name
+ self._clean_cache(self.cache_dir + name)
def list_packages(self):
""" list packages"""
@@ -33,8 +35,8 @@ class ContentSource:
repo.cache = 0
repo.metadata_expire = 0
repo.baseurl = [self.url]
- repo.basecachedir = '/var/cache/rhn/reposync/'
-# repo.cachedir = '/var/cache/rhn/reposync/'
+ repo.basecachedir = self.cache_dir
+ repo.baseurlSetup()
repo.setup(False)
sack = repo.getPackageSack()
sack.populate(repo, 'metadata', None, 0)
@@ -52,4 +54,11 @@ class ContentSource:
def get_package(self, package):
""" get package """
- return self.repo.getPackage(package.unique_id)
+ check = (self.verify_pkg, (package.unique_id ,1), {})
+ return self.repo.getPackage(package.unique_id, checkfunc=check)
+
+ def verify_pkg(self, fo, pkg, fail):
+ return pkg.verifyLocalPkg()
+
+ def _clean_cache(self, directory):
+ shutil.rmtree(directory, True)
diff --git a/backend/satellite_tools/reposync.py b/backend/satellite_tools/reposync.py
index 0fd24d2..e5074b0 100644
--- a/backend/satellite_tools/reposync.py
+++ b/backend/satellite_tools/reposync.py
@@ -17,7 +17,8 @@ import sys, os
from optparse import OptionParser
from common import rhnLib
from server import rhnPackage, rhnSQL, rhnChannel, rhnPackageUpload
-from common import CFG, initCFG, rhn_rpm
+from common import CFG, initCFG, rhn_rpm, rhnLog, fetchTraceback
+from common.rhn_mpm import InvalidPackageError
from server.importlib.importLib import IncompletePackage
from server.importlib.backendOracle import OracleBackend
from server.importlib.packageImport import ChannelPackageSubscription
@@ -38,15 +39,22 @@ class RepoSync:
rhnSQL.initDB(db_string)
(options, args) = self.process_args()
-
+ quit = False
if not options.url:
+ quit = True
print("--url must be specified")
if not options.type:
+ quit = True
print("--type must be specified")
if not options.channel_label:
+ quit = True
print("--channel must be specified")
if not options.label:
- print("--label must be specified")
+ quit = True
+ print("--label must be specified")
+
+ if quit:
+ sys.exit(1)
self.type = options.type
@@ -55,12 +63,17 @@ class RepoSync:
self.fail = options.fail
self.repo_label = options.label
self.channel = self.load_channel()
-
+ self.log_file = options.logfile
+
if not self.channel or not \
rhnChannel.isCustomChannel(self.channel['id']):
print "Channel does not exist or is not custom"
sys.exit(1)
+
+ if self.log_file:
+ rhnLog.initLOG(self.log_file)
+
self.plugin = self.load_plugin()(self.url, self.channel_label + "-" +
self.repo_label)
self.import_packages(self.plugin.list_packages())
@@ -71,6 +84,7 @@ class RepoSync:
self.parser.add_option('-t', '--type', action='store',
dest='type', help='The type of repo, currently only "yum" is
supported')
self.parser.add_option('-l', '--label', action='store',
dest='label', help='A friendly label to refer to the repo')
self.parser.add_option('-f', '--fail',
action='store_true', dest='fail', default=False , help="If a package
import fails, fail the entire operation")
+ self.parser.add_option('-g', '--logfile', action='store',
dest='logfile', help="The log file to log to. Default is to stderr and
stdout.")
return self.parser.parse_args()
def load_plugin(self):
@@ -82,6 +96,7 @@ class RepoSync:
def import_packages(self, packages):
to_link = []
to_download = []
+ self.print_msg("Repo " + self.url + " has " +
str(len(packages)) + ".")
for pack in packages:
pid = None
if pack.checksums.has_key('md5sum'):
@@ -101,7 +116,7 @@ class RepoSync:
for (index, pack) in enumerate(to_download):
"""download each package"""
try:
- print(str(index) + "/" + str(len(to_download)) + " :
"+ \
+ self.print_msg(str(index+1) + "/" + str(len(to_download)) +
" : "+ \
pack.getNVREA())
path = self.plugin.get_package(pack)
md5 = rhnLib.getFileMD5(filename=path)
@@ -112,9 +127,13 @@ class RepoSync:
self.associate_package(pack, md5)
else:
to_link.append(pack)
+ if self.url.find("file://") < 0:
+ os.remove(path)
+
except KeyboardInterrupt:
raise
except:
+ self.error_msg("ERROR" + fetchTraceback())
if self.fail:
raise
continue
@@ -124,6 +143,7 @@ class RepoSync:
except KeyboardInterrupt:
raise
except:
+ self.error_msg(fetchTraceback())
if self.fail:
raise
continue
@@ -142,9 +162,6 @@ class RepoSync:
relative_path=rel_package_path,
org_id=self.channel['org_id'])
temp_file.close()
- if self.url.find("file://") < 0:
- os.remove(path)
-
def associate_package(self, pack, md5sum):
caller = "server.app.yumreposync"
@@ -154,32 +171,42 @@ class RepoSync:
package['name'] = pack.name
package['version'] = pack.version
package['release'] = pack.release
- if pack.epoch == 0:
- package['epoch'] = ""
- else:
- package['epoch'] = pack.epoch
+ package['epoch'] = pack.epoch
package['arch'] = pack.arch
package['md5sum'] = md5sum
package['channels'] = [{'label':self.channel_label,
'id':self.channel['id']}]
package['org_id'] = self.channel['org_id']
-
try:
- importer = ChannelPackageSubscription(
- [IncompletePackage().populate(package)],
- backend, caller=caller)
- importer.run()
+ self._importer_run(package, caller, backend)
except:
- package['epoch'] = '0'
+ package['epoch'] = ''
+ self._importer_run(package, caller, backend)
+
+ backend.commit()
+
+ def _importer_run(self, package, caller, backend):
importer = ChannelPackageSubscription(
- [IncompletePackage().populate(package)],
+ [IncompletePackage().populate(package)],
backend, caller=caller)
importer.run()
- backend.commit()
+
def load_channel(self):
return rhnChannel.channel_info(self.channel_label)
+
+ def print_msg(self, message):
+ if self.log_file:
+ rhnLog.log_debug(0, message)
+ print message
+
+
+ def error_msg(self, message):
+ if self.log_file:
+ rhnLog.log_debug(0, message)
+ sys.stderr.write(message)
+
class ContentPackage:
#map of checksums. Valid keys are 'md5sum' & 'sha256'
@@ -199,9 +226,11 @@ class ContentPackage:
self.version = version
self.release = release
self.arch = arch
+ self.epoch = epoch
def getNVREA(self):
if self.epoch:
return self.name + '-' + self.version + '-' + self.release +
'-' + self.epoch + '.' + self.arch
else:
return self.name + '-' + self.version + '-' + self.release +
'.' + self.arch
+