java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.java | 2
java/code/src/com/redhat/rhn/frontend/action/common/DownloadFile.java | 50 +++++++++-
java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java | 11 ++
java/code/src/com/redhat/rhn/manager/kickstart/KickstartUrlHelper.java | 15 +++
4 files changed, 75 insertions(+), 3 deletions(-)
New commits:
commit a01d9ae46e86a94cb50eea0dc0e062f94bf4c86d
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Tue Aug 18 16:28:38 2009 -0400
adding config option for disabling the ability to access child channel repo through
kickstart
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 86a440d..f57ccc6 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
@@ -231,7 +231,8 @@ public class DownloadFile extends DownloadAction {
}
- if (map.containsKey("child")) {
+ if (map.containsKey("child") &&
+ !Config.get().getBoolean("ks_restrict_child_channels"))
{
Channel child = ChannelFactory.lookupByLabel(map.get("child"));
if (child == null || !child.getParentChannel().equals(tree.getChannel())) {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
diff --git a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
index 59cad99..b19e112 100644
--- a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
+++ b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
@@ -311,8 +311,9 @@ public class KickstartFormatter {
}
}
}
-
- if (ksdata.isRhel5OrGreater()) {
+
+ if (ksdata.isRhel5OrGreater() &&
+ !Config.get().getBoolean("ks_restrict_child_channels")) {
for (Channel child : ksdata.getChildChannels()) {
KickstartUrlHelper helper = new KickstartUrlHelper(ksdata);
commands.append(String.format("repo --name=%s --baseurl=%s",
commit 2d15e1fbba94f047b4ac2a1db13123e12ab81747
Author: Justin Sherrill <jsherril(a)redhat.com>
Date: Tue Aug 18 16:10:50 2009 -0400
adding support for child channel repos during kickstart
diff --git a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.java
b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.java
index 3324e5c..d61b29a 100644
--- a/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.java
+++ b/java/code/src/com/redhat/rhn/domain/kickstart/KickstartData.java
@@ -335,7 +335,7 @@ public class KickstartData {
/**
* @return the childChannels
*/
- public Set getChildChannels() {
+ public Set<Channel> getChildChannels() {
return childChannels;
}
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 d1a88a3..86a440d 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
@@ -82,6 +82,7 @@ public class DownloadFile extends DownloadAction {
private static final String USERID = "userid";
private static final String FILEID = "fileid";
private static final String FILENAME = "filename";
+ private static final String CHILD = "child";
private static final String TREE = "tree";
private static final String PATH = "path";
private static final String SESSION = "session";
@@ -139,6 +140,7 @@ public class DownloadFile extends DownloadAction {
* /ks/dist/tree-label/path/to/file.rpm
* /ks/dist/org/#/tree-label/path/to/file
* /ks/dist/session/HEX/tree-label/path/to/file.rpm
+ * /ks/dist/tree-label/child/child-chan-label/path/to/file.rpm
*
* @param url the url to parse
* @return a map with the following params:
@@ -146,6 +148,7 @@ public class DownloadFile extends DownloadAction {
* path (req)
* session (opt)
* orgId (opt)
+ * child (opt)
*/
public static Map<String, String> parseDistUrl(String url) {
Map<String, String> ret = new HashMap<String, String>();
@@ -165,6 +168,11 @@ public class DownloadFile extends DownloadAction {
ret.put("session", split[3]);
labelPos = 4;
}
+ else if (split[2].equals("child")) {
+ ret.put("child", split[3]);
+ labelPos = 4;
+ }
+
ret.put("label", split[labelPos]);
String path = "";
for (int i = labelPos + 1; i < split.length; i++) {
@@ -223,6 +231,25 @@ public class DownloadFile extends DownloadAction {
}
+ if (map.containsKey("child")) {
+ Channel child = ChannelFactory.lookupByLabel(map.get("child"));
+ if (child == null || !child.getParentChannel().equals(tree.getChannel())) {
+ response.sendError(HttpServletResponse.SC_NOT_FOUND);
+ return mapping.findForward("error");
+ }
+ else {
+ HashMap params = new HashMap();
+ params.put(TYPE, DownloadManager.DOWNLOAD_TYPE_KICKSTART);
+ params.put(TREE, tree);
+ params.put(CHILD, child);
+ params.put(FILENAME, path);
+ request.setAttribute(PARAMS, params);
+ return null;
+ }
+
+ }
+
+
if (tree == null) {
log.error("Tree not found.");
response.sendError(HttpServletResponse.SC_NOT_FOUND);
@@ -343,6 +370,7 @@ public class DownloadFile extends DownloadAction {
}
+
private StreamInfo getStreamInfoKickstart(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response,
String path) throws Exception {
@@ -359,6 +387,8 @@ public class DownloadFile extends DownloadAction {
KickstartSessionState newState = null;
KickstartableTree tree = (KickstartableTree) params.get(TREE);
Package rpmPackage;
+ Channel child = (Channel) params.get(CHILD);
+
if (tree.getBasePath().indexOf(kickstartMount) == 0) {
log.debug("Trimming mount because tree is" +
" explicitly rooted to the mount point");
@@ -378,6 +408,10 @@ public class DownloadFile extends DownloadAction {
log.debug("RPM filename: " + fileName);
}
Channel channel = tree.getChannel();
+ if (child != null) {
+ channel = child;
+ }
+
rpmPackage = ChannelFactory.lookupPackageByFilename(channel, fileName);
if (rpmPackage != null) {
diskPath = Config.get().getString(ConfigDefaults.MOUNT_POINT) +
"/" +
@@ -398,7 +432,20 @@ public class DownloadFile extends DownloadAction {
// check for dir pings, virt manager or install, bz #345721
if (diskPath == null) {
// my $dp = File::Spec->catfile($kickstart_mount, $tree->base_path,
$path);
- diskPath = kickstartMount + "/" + tree.getBasePath() + path;
+
+ if (child == null) {
+ diskPath = kickstartMount + "/" + tree.getBasePath() + path;
+ }
+ else {
+ String[] split = StringUtils.split(path, '/');
+ if (split[0].equals("repodata")) {
+ split[0] = child.getLabel();
+ }
+ diskPath = "/var/cache/" +
+ Config.get().getString("repomd_path_prefix",
"rhn/repodata/") + "/" +
+ StringUtils.join(split, '/');
+ }
+
if (log.isDebugEnabled()) {
log.debug("DirCheck path: " + diskPath);
}
diff --git a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
index af1f624..59cad99 100644
--- a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
+++ b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartFormatter.java
@@ -312,6 +312,14 @@ public class KickstartFormatter {
}
}
+ if (ksdata.isRhel5OrGreater()) {
+ for (Channel child : ksdata.getChildChannels()) {
+ KickstartUrlHelper helper = new KickstartUrlHelper(ksdata);
+ commands.append(String.format("repo --name=%s --baseurl=%s",
+ child.getLabel(), helper.getKickstartChildRepoUrl(child) +
NEWLINE));
+ }
+ }
+
return commands.toString();
}
diff --git a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartUrlHelper.java
b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartUrlHelper.java
index e7b0659..b8ebb6e 100644
--- a/java/code/src/com/redhat/rhn/manager/kickstart/KickstartUrlHelper.java
+++ b/java/code/src/com/redhat/rhn/manager/kickstart/KickstartUrlHelper.java
@@ -16,6 +16,7 @@ package com.redhat.rhn.manager.kickstart;
import com.redhat.rhn.common.conf.ConfigDefaults;
import com.redhat.rhn.common.security.SessionSwap;
+import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.domain.common.CommonFactory;
import com.redhat.rhn.domain.common.TinyUrl;
import com.redhat.rhn.domain.kickstart.KickstartData;
@@ -211,6 +212,20 @@ public class KickstartUrlHelper {
}
/**
+ * get a kickstart repo url for a child channel
+ * @param child the child channel
+ * @return string that represents the repo url
+ */
+ public String getKickstartChildRepoUrl(Channel child) {
+ StringBuffer url = new StringBuffer();
+ url.append(protocol + host + "/ks/dist/");
+ url.append("child/" + child.getLabel() + "/");
+ url.append(ksData.getTree().getLabel());
+ return url.toString();
+ }
+
+
+ /**
* Get the media path for the KickstartableTree. Example:
* /ks/dist/ks-rhel-i386-as-4-u2
*