branding/img/rhn-listicon-cfg_symlink.gif
|binary
client/tools/rhncfg/config_common/file_utils.py
| 48 +++-
client/tools/rhncfg/config_common/transactions.py
| 23 +-
java/code/src/com/redhat/rhn/common/db/datasource/xml/config_queries.xml
| 9
java/code/src/com/redhat/rhn/domain/config/ConfigFileCount.java
| 21 +
java/code/src/com/redhat/rhn/domain/config/ConfigFileType.java
| 13 +
java/code/src/com/redhat/rhn/domain/config/ConfigRevision.java
| 8
java/code/src/com/redhat/rhn/frontend/action/configuration/ConfigActionHelper.java
| 78 +++----
java/code/src/com/redhat/rhn/frontend/action/configuration/sdc/OverviewAction.java
| 80 +++----
java/code/src/com/redhat/rhn/frontend/configuration/tags/ConfigFileTag.java
| 15 +
java/code/src/com/redhat/rhn/frontend/dto/ConfigChannelDto.java
| 26 ++
java/code/src/com/redhat/rhn/frontend/strings/java/StringResource_en_US.xml
| 109 +++++++---
java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
| 19 +
java/code/src/com/redhat/rhn/manager/configuration/ChannelSummary.java
| 18 +
java/code/src/com/redhat/rhn/manager/configuration/ConfigurationManager.java
| 75 ++++--
java/code/src/com/redhat/rhn/manager/configuration/test/ConfigurationManagerTest.java
| 6
java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
| 36 ++-
java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/summary.jspf
| 25 +-
java/code/webapp/WEB-INF/pages/common/fragments/configuration/sdc/configfile_rows.jspf
| 8
java/code/webapp/WEB-INF/pages/configuration/files/comparecopy.jsp
| 6
java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
| 7
java/code/webapp/WEB-INF/pages/configuration/ssm/difffiles.jsp
| 6
schema/spacewalk/common/data/rhnConfigFileType.sql
| 1
schema/spacewalk/upgrade/spacewalk-schema-0.6-to-spacewalk-schema-0.7/150-rhnConfigFileType_symlinks.sql
| 6
24 files changed, 456 insertions(+), 187 deletions(-)
New commits:
commit 517ef0936fdff840796aa3624b2556f9c964c6a8
Author: Joshua Roys <joshua.roys(a)gtri.gatech.edu>
Date: Fri Aug 28 11:35:09 2009 -0400
Add symlink capability to config management
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 75d72d3..99028dd 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
@@ -7220,7 +7220,7 @@ Follow this url to see the full list of inactive systems:
<source>{0} file and {2} symlinks</source>
</trans-unit>
<trans-unit id="config.files_1_dirs_1_symlinks_0">
- <source>{0} file and {2} directory</source>
+ <source>{0} file and {1} directory</source>
</trans-unit>
<trans-unit id="config.files_1_dirs_1_symlinks_1">
<source>{0} file and {1} directory and {2} symlink</source>
@@ -7229,7 +7229,7 @@ Follow this url to see the full list of inactive systems:
<source>{0} file and {1} directory and {2} symlinks</source>
</trans-unit>
<trans-unit id="config.files_1_dirs_2_symlinks_0">
- <source>{0} file and {2} directories</source>
+ <source>{0} file and {1} directories</source>
</trans-unit>
<trans-unit id="config.files_1_dirs_2_symlinks_1">
<source>{0} file and {1} directories and {2} symlink</source>
@@ -7248,7 +7248,7 @@ Follow this url to see the full list of inactive systems:
<source>{0} files and {2} symlinks</source>
</trans-unit>
<trans-unit id="config.files_2_dirs_1_symlinks_0">
- <source>{0} files and {2} directory</source>
+ <source>{0} files and {1} directory</source>
</trans-unit>
<trans-unit id="config.files_2_dirs_1_symlinks_1">
<source>{0} files and {1} directory and {2} symlink</source>
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
index 66a6fd4..f8cf93a 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
@@ -6,14 +6,33 @@
<tr>
<th><bean:message key="addfiles.jsp.type-name" /></th>
<td>
- <html:radio property="filetype" value="file"
/><bean:message
+ <html:radio property="filetype" value="file"
styleId="file_radio" /><bean:message
key="addfiles.jsp.type.text" /> <br />
<html:radio
- property="filetype" value="directory" /><bean:message
+ property="filetype" value="directory"
styleId="dir_radio" /><bean:message
key="addfiles.jsp.type.directory" /><br />
- <html:radio property="filetype" value="symlink"
/><bean:message
+ <html:radio property="filetype" value="symlink"
styleId="symlink_radio" /><bean:message
key="addfiles.jsp.type.symlink" /><br />
- <bean:message key="filedetails.jsp.tip.symlink" />
+ <script type="text/javascript">
+ function enableAllInputs(event) {
+ $('cffUid').disabled = "";
+ $('cffGid').disabled = "";
+ $('cffPermissions').disabled = "";
+ $('cffMacroStart').disabled = "";
+ $('cffMacroEnd').disabled = "";
+ }
+
+ Event.observe('file_radio', 'focus', enableAllInputs);
+ Event.observe('dir_radio', 'focus', enableAllInputs);
+ Event.observe('symlink_radio', 'focus', function(event) {
+ $('cffUid').disabled = "disabled";
+ $('cffGid').disabled = "disabled";
+ $('cffPermissions').disabled = "disabled";
+ $('cffMacroStart').disabled = "disabled";
+ $('cffMacroEnd').disabled = "disabled";
+ });
+ </script>
+ <span class="small-text"><bean:message
key="filedetails.jsp.tip.symlink" /></span>
</td>
</tr>
<tr>
@@ -26,11 +45,11 @@
<table>
<tr>
<td><bean:message key="filedetails.properties.jspf.uid"
/></td>
- <td><html:text property="cffUid" size="6"
/></td>
+ <td><html:text property="cffUid" size="6"
styleId="cffUid" /></td>
</tr>
<tr>
<td><bean:message key="filedetails.properties.jspf.gid"
/></td>
- <td><html:text property="cffGid" size="6"
/></td>
+ <td><html:text property="cffGid" size="6"
styleId="cffGid" /></td>
</tr>
<tr>
<td colspan="2"><span
class="small-text"><bean:message
@@ -41,7 +60,7 @@
</tr>
<tr>
<th><bean:message key="filedetails.properties.jspf.permissions"
/></th>
- <td><html:text property="cffPermissions" maxlength="4"
size="4" /><br />
+ <td><html:text property="cffPermissions" maxlength="4"
size="4" styleId="cffPermissions" /><br />
<span class="small-text"><bean:message
key="filedetails.jsp.tip.permissions" /></span></td>
</tr>
@@ -54,9 +73,9 @@
<th><bean:message key="filedetails.add_details.jspf.macro"
/></th>
<td nowrap="nowrap">
<bean:message key="filedetails.add_details.jspf.macro.start" />
- <html:text property="cffMacroStart" size="3" />
+ <html:text property="cffMacroStart" size="3"
styleId="cffMacroStart" />
<bean:message key="filedetails.add_details.jspf.macro.end"
/>
- <html:text property="cffMacroEnd" size="3"
/><br />
+ <html:text property="cffMacroEnd" size="3"
styleId="cffMacroEnd" /><br />
<span class="small-text">
<bean:message key="filedetails.jsp.tip.macros"
arg0="/rhn/help/reference/index.jsp" />
</span>
commit 1a550326469302cabdca28c263e9e00de877402f
Author: Joshua Roys <joshua.roys(a)gtri.gatech.edu>
Date: Tue Aug 4 14:38:54 2009 -0400
Add symlink capability to config management
diff --git a/branding/img/rhn-listicon-cfg_symlink.gif
b/branding/img/rhn-listicon-cfg_symlink.gif
new file mode 100644
index 0000000..24df4c8
Binary files /dev/null and b/branding/img/rhn-listicon-cfg_symlink.gif differ
diff --git a/client/tools/rhncfg/config_common/file_utils.py
b/client/tools/rhncfg/config_common/file_utils.py
index cbaa1c0..c34c605 100644
--- a/client/tools/rhncfg/config_common/file_utils.py
+++ b/client/tools/rhncfg/config_common/file_utils.py
@@ -55,19 +55,25 @@ class FileProcessor:
if file_struct.get('filetype') == 'directory':
return directory, []
- (fullpath, dirs_created, fh) = maketemp(prefix=".rhn-cfg-tmp",
- directory=directory)
-
- try:
- fh.write(contents)
- except Exception:
- if fh:
- fh.close() # don't leak fds...
- raise
+ if file_struct.get('filetype') == 'symlink':
+ (dirname, filename) = os.path.split(file_struct['path'])
+ temppath = ".rhn-cfg-tmp_%s_%s_%.8f" % (filename, os.getpid(),
time.time())
+ os.symlink(contents, temppath)
+ return temppath, []
else:
- fh.close()
+ (fullpath, dirs_created, fh) = maketemp(prefix=".rhn-cfg-tmp",
+ directory=directory)
- return fullpath, dirs_created
+ try:
+ fh.write(contents)
+ except Exception:
+ if fh:
+ fh.close() # don't leak fds...
+ raise
+ else:
+ fh.close()
+
+ return fullpath, dirs_created
def diff(self, file_struct):
@@ -75,9 +81,25 @@ class FileProcessor:
temp_file, temp_dirs = self.process(file_struct)
path = file_struct['path']
+ result = None
+
+ if file_struct['filetype'] == 'symlink':
+ try:
+ curlink = os.readlink(path)
+ newlink = os.readlink(temp_file)
+ if curlink == newlink:
+ result = ''
+ else:
+ result = "Link targets differ"
+ except OSError, e:
+ if e.errno == 22:
+ result = "Deployed symlink is no longer a symlink!"
+ else:
+ raise e
+ else:
+ pipe = os.popen("/usr/bin/diff -u %s %s" % (path, temp_file))
+ result = pipe.read()
- pipe = os.popen("/usr/bin/diff -u %s %s" % (path, temp_file))
- result = pipe.read()
os.unlink(temp_file)
return result
diff --git a/client/tools/rhncfg/config_common/transactions.py
b/client/tools/rhncfg/config_common/transactions.py
index 9b00e07..089dd0b 100644
--- a/client/tools/rhncfg/config_common/transactions.py
+++ b/client/tools/rhncfg/config_common/transactions.py
@@ -25,7 +25,7 @@ import string
from config_common import file_utils, utils, cfg_exceptions
from config_common.rhn_log import log_debug
-from selinux import setfilecon
+from selinux import lsetfilecon
class TargetNotFile(Exception): pass
class DuplicateDeployment(Exception): pass
@@ -134,20 +134,21 @@ class DeployTransaction:
gid = 0
try:
- os.chown(temp_file_path, uid, gid)
+ if file_info['filetype'] != 'symlink':
+ os.chown(temp_file_path, uid, gid)
- mode = '600'
- if file_info.has_key('filemode'):
- mode = file_info['filemode']
+ mode = '600'
+ if file_info.has_key('filemode'):
+ mode = file_info['filemode']
- mode = string.atoi(str(mode), 8)
- os.chmod(temp_file_path, mode)
+ mode = string.atoi(str(mode), 8)
+ os.chmod(temp_file_path, mode)
if file_info.has_key('selinux_ctx'):
sectx = file_info.get('selinux_ctx')
if sectx is not None and sectx is not "":
log_debug(1, "selinux context: " + sectx);
- if setfilecon(temp_file_path, sectx) < 0:
+ if lsetfilecon(temp_file_path, sectx) < 0:
raise Exception("failed to set selinux context on %s" %
dest_path)
except OSError, e:
@@ -177,6 +178,8 @@ class DeployTransaction:
# assume file
if file_info.get('filetype') == 'directory':
self.dirs.append(file_info)
+ elif file_info.get('filetype') == 'symlink':
+ self.files.append(file_info)
else:
self._chown_chmod_chcon(processed_file_path, dest_path, file_info,
strict_ownership=strict_ownership)
@@ -197,6 +200,8 @@ class DeployTransaction:
# assume file
if file_info.get('filetype') == 'directory':
self.dirs.append(file_info)
+ elif file_info.get('filetype') == 'symlink':
+ self.files.append(file_info)
else:
self.files.append(file_info)
@@ -297,7 +302,7 @@ class DeployTransaction:
return
else:
log_debug(4, "done with directory creation, moving on to files")
-
+
# 1.
for dep_file in self.files:
path = dep_file['path']
diff --git a/java/code/src/com/redhat/rhn/common/db/datasource/xml/config_queries.xml
b/java/code/src/com/redhat/rhn/common/db/datasource/xml/config_queries.xml
index dc5c208..bc769f1 100644
--- a/java/code/src/com/redhat/rhn/common/db/datasource/xml/config_queries.xml
+++ b/java/code/src/com/redhat/rhn/common/db/datasource/xml/config_queries.xml
@@ -1948,6 +1948,15 @@ SELECT CC.id AS ID,
INNER JOIN rhnConfigFileType CFT ON CFT.ID = CR.CONFIG_FILE_TYPE_ID
WHERE CF.config_channel_id = CC.id
AND CF.latest_config_revision_id IS NOT NULL
+ AND CFT.LABEL = 'symlink'
+ ), 0) AS symlinks_only_count,
+ NVL( (
+ SELECT COUNT(CF.id)
+ FROM rhnConfigFile CF
+ INNER JOIN rhnConfigRevision CR ON CR.id = CF.latest_config_revision_id
+ INNER JOIN rhnConfigFileType CFT ON CFT.ID = CR.CONFIG_FILE_TYPE_ID
+ WHERE CF.config_channel_id = CC.id
+ AND CF.latest_config_revision_id IS NOT NULL
AND CFT.LABEL = 'directory'
), 0) AS dirs_only_count
FROM rhnConfigChannel CC
diff --git a/java/code/src/com/redhat/rhn/domain/config/ConfigFileCount.java
b/java/code/src/com/redhat/rhn/domain/config/ConfigFileCount.java
index 71c5158..433bc46 100644
--- a/java/code/src/com/redhat/rhn/domain/config/ConfigFileCount.java
+++ b/java/code/src/com/redhat/rhn/domain/config/ConfigFileCount.java
@@ -26,17 +26,20 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
public class ConfigFileCount {
private long files;
private long directories;
+ private long symlinks;
/**
* Creates a new instance of this class
* @param files the files to set
* @param directories dirs to set
+ * @param symlinks symlinks to set
* @return a new ConfigFileCount object using the params passed in
*/
- public static ConfigFileCount create(long files, long directories) {
+ public static ConfigFileCount create(long files, long directories, long symlinks) {
ConfigFileCount cf = new ConfigFileCount();
cf.setFiles(files);
cf.setDirectories(directories);
+ cf.setSymlinks(symlinks);
return cf;
}
/**
@@ -67,6 +70,20 @@ public class ConfigFileCount {
private void setFiles(long numFiles) {
this.files = numFiles;
}
+ /**
+ *
+ * @return the number of symlinks
+ */
+ public long getSymlinks() {
+ return symlinks;
+ }
+ /**
+ *
+ * @param numLinks the number of symlinks to set
+ */
+ private void setSymlinks(long numLinks) {
+ this.symlinks = numLinks;
+ }
/**
*
@@ -80,6 +97,7 @@ public class ConfigFileCount {
return new EqualsBuilder().
append(files, that.files).
append(directories, that.directories).
+ append(symlinks, that.symlinks).
isEquals();
}
@@ -92,6 +110,7 @@ public class ConfigFileCount {
return new HashCodeBuilder().
append(files).
append(directories).
+ append(symlinks).
toHashCode();
}
}
diff --git a/java/code/src/com/redhat/rhn/domain/config/ConfigFileType.java
b/java/code/src/com/redhat/rhn/domain/config/ConfigFileType.java
index be3eba5..87668d1 100644
--- a/java/code/src/com/redhat/rhn/domain/config/ConfigFileType.java
+++ b/java/code/src/com/redhat/rhn/domain/config/ConfigFileType.java
@@ -50,8 +50,17 @@ public class ConfigFileType implements Serializable {
public static final String FILE = "file";
public static final String DIR = "directory";
+ public static final String SYMLINK = "symlink";
private static final Map POSSIBLE_TYPES = new TreeMap(String.
CASE_INSENSITIVE_ORDER);
+
+ /**
+ * @return symlink config file type
+ */
+ public static ConfigFileType symlink() {
+ return lookup(SYMLINK);
+ }
+
/**
*
* @return dir config file type
@@ -80,11 +89,15 @@ public class ConfigFileType implements Serializable {
lookupConfigFileTypeByLabel(FILE);
ConfigFileType dir = ConfigurationFactory.
lookupConfigFileTypeByLabel(DIR);
+ ConfigFileType symlink = ConfigurationFactory.
+ lookupConfigFileTypeByLabel(SYMLINK);
POSSIBLE_TYPES.put(DIR, dir);
POSSIBLE_TYPES.put("dir", dir);
POSSIBLE_TYPES.put("folder", dir);
POSSIBLE_TYPES.put(FILE, file);
+
+ POSSIBLE_TYPES.put(SYMLINK, symlink);
}
if (!POSSIBLE_TYPES.containsKey(type)) {
diff --git a/java/code/src/com/redhat/rhn/domain/config/ConfigRevision.java
b/java/code/src/com/redhat/rhn/domain/config/ConfigRevision.java
index b0dd550..f47ffeb 100644
--- a/java/code/src/com/redhat/rhn/domain/config/ConfigRevision.java
+++ b/java/code/src/com/redhat/rhn/domain/config/ConfigRevision.java
@@ -217,4 +217,12 @@ public class ConfigRevision extends BaseDomainHelper {
public boolean isDirectory() {
return (configFileType != null &&
configFileType.getLabel().equals("directory"));
}
+
+ /**
+ * Is this revision a symlink?
+ * @return true if file-type is 'symlink'
+ */
+ public boolean isSymlink() {
+ return (configFileType != null &&
configFileType.getLabel().equals("symlink"));
+ }
}
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/configuration/ConfigActionHelper.java
b/java/code/src/com/redhat/rhn/frontend/action/configuration/ConfigActionHelper.java
index b685450..d036df5 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/configuration/ConfigActionHelper.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/configuration/ConfigActionHelper.java
@@ -251,9 +251,9 @@ public abstract class ConfigActionHelper {
/**
* Makes messages that look like
- * 1 file and 5 directories
- * 2 files and 1 directory
- * No files or directories
+ * 1 file and 5 directories and 0 symlinks
+ * 2 files and 1 directory and 0 symlinks
+ * No files or directories or symlinks
* Very standard i18nized counts messages
* used in various places in config management.
* @param count the ConfigFileCount object,
@@ -268,64 +268,66 @@ public abstract class ConfigActionHelper {
/**
* Makes messages that look like
- * 1 file and 5 directories
- * 2 files and 1 directory
- * No files or directories
+ * 1 file and 5 directories and 0 symlinks
+ * 2 files and 1 directory and 0 symlinks
+ * No files or directories and 0 symlinks
* Very standard i18nized counts messages
* used in various places in config management.
- * @param count the ConfigFileCount object,
+ * @param count the ConfigFileCount object,
* that stores info on the number of files and directories
* @param url the url to wrap the messages if so desired
* @param includeEmptyFilesAndDirs force the inclusion of both
* the file and directory information
- * even if their count is 0.
+ * even if their count is 0.
* for example:
* if this param == true
- * return "0 files and 1 directory"
+ * return "0 files and 1 directory and 0
symlinks"
* else
- * return "1 directory"
+ * return "1 directory"
* @return the properly formatted File & Directories helper messages ..
*/
public static String makeFileCountsMessage(ConfigFileCount count,
String url,
boolean includeEmptyFilesAndDirs) {
- long fileCount = count.getFiles(), dirCount = count.getDirectories();
+ long fileCount = count.getFiles(), dirCount = count.getDirectories(),
+ symlinkCount = count.getSymlinks();
int fileSuffix = getSuffix(fileCount);
int dirSuffix = getSuffix(dirCount);
-
- if (includeEmptyFilesAndDirs) {
- if (fileSuffix != NONE && dirSuffix == NONE) {
- dirSuffix = PLURAL;
- }
- else if (fileSuffix == NONE && dirSuffix != NONE) {
- fileSuffix = PLURAL;
- }
- }
-
+ int symlinkSuffix = getSuffix(symlinkCount);
+
LocalizationService service = LocalizationService.getInstance();
- String key = "config." + "files_" + fileSuffix +
"_dirs_" + dirSuffix;
- if (fileSuffix == NONE && dirSuffix == NONE) {
+ String key = "config." + "files_" + fileSuffix +
"_dirs_" + dirSuffix +
+ "_symlinks_" + symlinkSuffix;
+
+ if (fileSuffix == NONE && dirSuffix == NONE && symlinkSuffix ==
NONE) {
if (url != null) {
key += "_url";
return service.getMessage(key, new Object[] {url});
}
return service.getMessage(key);
}
- String message = null;
- if (fileSuffix == NONE) {
- message = service.getMessage(key, new Object[] {String.valueOf(dirCount)});
- }
- else if (dirSuffix == NONE) {
- message = service.getMessage(key,
- new Object[] {String.valueOf(fileCount)});
- }
- else {
- message = service.getMessage(key,
- new Object[] {String.valueOf(fileCount),
- String.valueOf(dirCount)
- });
+
+ /* now we know there is at least one file/dir/symlink
+ * so all we need to do is make all NONEs into PLURALs
+ */
+ if (includeEmptyFilesAndDirs) {
+ if (fileSuffix == NONE) {
+ fileSuffix = PLURAL;
+ }
+ if (symlinkSuffix == NONE) {
+ symlinkSuffix = PLURAL;
+ }
+ if (dirSuffix == NONE) {
+ dirSuffix = PLURAL;
+ }
}
- if (url != null) {
+
+ String message = service.getMessage(key, new Object[] {
+ String.valueOf(fileCount),
+ String.valueOf(dirCount),
+ String.valueOf(symlinkCount)
+ });
+ if (url != null) {
HtmlTag a = new HtmlTag("a");
a.setAttribute("href", url);
a.addBody(message);
@@ -333,7 +335,7 @@ public abstract class ConfigActionHelper {
}
return message;
}
-
+
private static int getSuffix(long i) {
if (i == 1) {
return SINGULAR;
diff --git
a/java/code/src/com/redhat/rhn/frontend/action/configuration/sdc/OverviewAction.java
b/java/code/src/com/redhat/rhn/frontend/action/configuration/sdc/OverviewAction.java
index fa5afab..9403841 100644
--- a/java/code/src/com/redhat/rhn/frontend/action/configuration/sdc/OverviewAction.java
+++ b/java/code/src/com/redhat/rhn/frontend/action/configuration/sdc/OverviewAction.java
@@ -268,29 +268,27 @@ public class OverviewAction extends RhnAction {
return NONE;
}
-
+
private void setupDiffActionMessage(HttpServletRequest request,
- ConfigFileCount total,
- ConfigFileCount successful,
- ConfigFileCount differing,
- String url) {
-
- int filesSuffix = getSuffix(total.getFiles());
+ ConfigFileCount total,
+ ConfigFileCount successful,
+ ConfigFileCount differing,
+ String url) {
+
+ int filesSuffix = getSuffix(total.getFiles() + total.getSymlinks());
int dirsSuffix = getSuffix(total.getDirectories());
-
- String messageKey = DIFF_ACTION_MESSAGE_PREFIX +
- filesSuffix + "_dirs_" + dirsSuffix;
-
+
+ String messageKey = DIFF_ACTION_MESSAGE_PREFIX +
+ filesSuffix + "_dirs_" + dirsSuffix;
List params = new ArrayList();
// setup the params
if (filesSuffix == PLURAL) {
- params.add(String.valueOf(successful.getFiles()));
- params.add(String.valueOf(total.getFiles()));
+ params.add(String.valueOf(successful.getFiles() +
successful.getSymlinks()));
+ params.add(String.valueOf(total.getFiles() + total.getSymlinks()));
}
else if (filesSuffix == SINGULAR) {
- params.add(String.valueOf(successful.getFiles()));
-
+ params.add(String.valueOf(successful.getFiles() +
successful.getSymlinks()));
}
if (dirsSuffix == PLURAL) {
@@ -299,50 +297,46 @@ public class OverviewAction extends RhnAction {
}
else if (dirsSuffix == SINGULAR) {
params.add(String.valueOf(successful.getDirectories()));
-
- }
-
+ }
+
params.add(url);
LocalizationService service = LocalizationService.getInstance();
if (params.isEmpty()) {
- request.setAttribute(DIFF_ACTION_MESSAGE,
- service.getMessage(messageKey));
- }
- request.setAttribute(DIFF_ACTION_MESSAGE,
- service.getMessage(messageKey,
- params.toArray()));
-
- if (successful.getFiles() > 0) {
+ request.setAttribute(DIFF_ACTION_MESSAGE,
+ service.getMessage(messageKey));
+ }
+ request.setAttribute(DIFF_ACTION_MESSAGE,
+ service.getMessage(messageKey,
+ params.toArray()));
+
+ if (successful.getFiles() + successful.getSymlinks() > 0) {
String diffActionKey;
- if (differing.getFiles() == 0) {
+ if (differing.getFiles() + differing.getSymlinks() == 0) {
diffActionKey = DIFF_DETAIL_MESSAGE_PREFIX + "0";
- request.setAttribute(DIFF_DETAILS_MESSAGE,
+ request.setAttribute(DIFF_DETAILS_MESSAGE,
service.getMessage(diffActionKey));
-
- }
+ }
else {
- diffActionKey = DIFF_DETAIL_MESSAGE_PREFIX +
- getSuffix(successful.getFiles());
- if (successful.getFiles() == 1) {
- request.setAttribute(DIFF_DETAILS_MESSAGE,
- service.getMessage(diffActionKey));
+ diffActionKey = DIFF_DETAIL_MESSAGE_PREFIX +
+ getSuffix(successful.getFiles() + successful.getSymlinks());
+ if (successful.getFiles() + successful.getSymlinks() == 1) {
+ request.setAttribute(DIFF_DETAILS_MESSAGE,
+ service.getMessage(diffActionKey));
}
else {
Object [] keyParams = new Object[] {
- String.valueOf(differing.getFiles()),
- String.valueOf(successful.getFiles())
- };
- request.setAttribute(DIFF_DETAILS_MESSAGE,
+ String.valueOf(differing.getFiles() + differing.getSymlinks()),
+ String.valueOf(successful.getFiles() +
successful.getSymlinks())
+ };
+ request.setAttribute(DIFF_DETAILS_MESSAGE,
service.getMessage(diffActionKey, keyParams));
}
}
-
+
}
}
-
-
-
+
private String makeTimeMessage(Action action,
User loggedInUser,
Server server) {
diff --git a/java/code/src/com/redhat/rhn/frontend/configuration/tags/ConfigFileTag.java
b/java/code/src/com/redhat/rhn/frontend/configuration/tags/ConfigFileTag.java
index 19ce6b1..278c967 100644
--- a/java/code/src/com/redhat/rhn/frontend/configuration/tags/ConfigFileTag.java
+++ b/java/code/src/com/redhat/rhn/frontend/configuration/tags/ConfigFileTag.java
@@ -40,10 +40,12 @@ public class ConfigFileTag extends TagSupport {
public static final String DIR_ALT_KEY = "config.common.dirAlt";
public static final String FILE_ALT_KEY = "config.common.fileAlt";
+ public static final String SYMLINK_ALT_KEY = "config.common.symlinkAlt";
public static final String DIR_LIST_ICON =
"/img/rhn-listicon-cfg_folder.gif";
public static final String FILE_LIST_ICON =
"/img/rhn-listicon-cfg_file.gif";
+ public static final String SYMLINK_LIST_ICON =
"/img/rhn-listicon-cfg_symlink.gif";
public static final String DIR_HEADER_ICON = "/img/folder-config.png";
@@ -145,6 +147,9 @@ public class ConfigFileTag extends TagSupport {
"folder".equalsIgnoreCase(type)) {
ConfigTagHelper.writeIcon(DIR_LIST_ICON, DIR_ALT_KEY, pageContext);
}
+ else if ("symlink".equalsIgnoreCase(type)) {
+ ConfigTagHelper.writeIcon(SYMLINK_LIST_ICON, SYMLINK_ALT_KEY,
pageContext);
+ }
else {
ConfigTagHelper.writeIcon(FILE_LIST_ICON,
FILE_ALT_KEY, pageContext);
@@ -239,7 +244,7 @@ public class ConfigFileTag extends TagSupport {
}
/**
- * Returns the Header icon image path for given config file type (file|dir)
+ * Returns the Header icon image path for given config file type (file|dir|symlink)
* This method is public static because
* EL functions defined in a TLD file,
* need to be public static methods..
@@ -254,12 +259,15 @@ public class ConfigFileTag extends TagSupport {
"folder".equalsIgnoreCase(type)) {
return DIR_LIST_ICON;
}
+ else if ("symlink".equalsIgnoreCase(type)) {
+ return SYMLINK_LIST_ICON;
+ }
return FILE_LIST_ICON;
}
/**
- * Returns the Header alt key for a given config file type (file|dir)
+ * Returns the Header alt key for a given config file type (file|dir|symlink)
* This method is public static because
* EL functions defined in a TLD file,
* need to be public static methods..
@@ -272,6 +280,9 @@ public class ConfigFileTag extends TagSupport {
"folder".equalsIgnoreCase(type)) {
return DIR_ALT_KEY;
}
+ else if ("symlink".equalsIgnoreCase(type)) {
+ return SYMLINK_ALT_KEY;
+ }
return FILE_ALT_KEY;
}
}
diff --git a/java/code/src/com/redhat/rhn/frontend/dto/ConfigChannelDto.java
b/java/code/src/com/redhat/rhn/frontend/dto/ConfigChannelDto.java
index 550d28e..b3cbebc 100644
--- a/java/code/src/com/redhat/rhn/frontend/dto/ConfigChannelDto.java
+++ b/java/code/src/com/redhat/rhn/frontend/dto/ConfigChannelDto.java
@@ -40,6 +40,7 @@ public class ConfigChannelDto extends BaseDto {
private Integer position;
private Integer filesOnlyCount;
private Integer dirsOnlyCount;
+ private Integer symlinksOnlyCount;
//These three are when dealing with a single revision
private Integer configRevision;
@@ -157,6 +158,10 @@ public class ConfigChannelDto extends BaseDto {
if (dirsOnlyCount != null) {
totalFiles += dirsOnlyCount.intValue();
}
+
+ if (symlinksOnlyCount != null) {
+ totalFiles += symlinksOnlyCount.intValue();
+ }
fileCount = new Integer(totalFiles);
}
return fileCount;
@@ -376,6 +381,20 @@ public class ConfigChannelDto extends BaseDto {
}
/**
+ * @return the symlinksOnlyCount
+ */
+ public Integer getSymlinksOnlyCount() {
+ return symlinksOnlyCount;
+ }
+
+ /**
+ * @param count the symlinksOnlyCount
+ */
+ public void setSymlinksOnlyCount(Integer count) {
+ this.symlinksOnlyCount = count;
+ }
+
+ /**
* Returns a i18ned string
* holding info on the Number of Files & Directories
* this is used in Config Channel Subscriptions page
@@ -383,14 +402,17 @@ public class ConfigChannelDto extends BaseDto {
*
*/
public String getFilesAndDirsDisplayString() {
- int files = 0, dirs = 0;
+ int files = 0, dirs = 0, symlinks = 0;
if (filesOnlyCount != null) {
files = filesOnlyCount.intValue();
}
if (dirsOnlyCount != null) {
dirs = dirsOnlyCount.intValue();
}
- ConfigFileCount count = ConfigFileCount.create(files, dirs);
+ if (symlinksOnlyCount != null) {
+ symlinks = symlinksOnlyCount.intValue();
+ }
+ ConfigFileCount count = ConfigFileCount.create(files, dirs, symlinks);
return ConfigActionHelper.makeFileCountsMessage(count, null);
}
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 86ef72c..75d72d3 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
@@ -7174,41 +7174,98 @@ Follow this url to see the full list of inactive systems:
</trans-unit>
</group>
<group>
- <context-group name="config_counts">
- <context context-type="sourcefile">Every Caller of
ConfigActionHelper.makeFileCountsMessage</context>
- </context-group>
- <trans-unit id="config.files_0_dirs_0_url">
- <source>No files or directories. <a href="{0}">
Add</a></source>
- </trans-unit>
- <trans-unit id="config.files_0_dirs_0">
- <source>No files or directories.</source>
- </trans-unit>
-
- <trans-unit id="config.files_1_dirs_0">
+ <context-group name="config_counts">
+ <context context-type="sourcefile">Every Caller of
ConfigActionHelper.makeFileCountsMessage</context>
+ </context-group>
+
+ <trans-unit id="config.files_0_dirs_0_symlinks_0_url">
+ <source>No files, directories or symlinks. <a
href="{0}"> Add</a></source>
+ </trans-unit>
+
+ <trans-unit id="config.files_0_dirs_0_symlinks_0">
+ <source>No files, directories or symlinks.</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_0_symlinks_1">
+ <source>{2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_0_symlinks_2">
+ <source>{2} symlinks</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_1_symlinks_0">
+ <source>{1} directory</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_1_symlinks_1">
+ <source>{1} directory and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_1_symlinks_2">
+ <source>{1} directory and {2} symlinks</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_2_symlinks_0">
+ <source>{1} directories</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_2_symlinks_1">
+ <source>{1} directories and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_0_dirs_2_symlinks_2">
+ <source>{1} directories and {2} symlinks</source>
+ </trans-unit>
+
+ <trans-unit id="config.files_1_dirs_0_symlinks_0">
<source>{0} file</source>
- </trans-unit>
- <trans-unit id="config.files_2_dirs_0">
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_0_symlinks_1">
+ <source>{0} file and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_0_symlinks_2">
+ <source>{0} file and {2} symlinks</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_1_symlinks_0">
+ <source>{0} file and {2} directory</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_1_symlinks_1">
+ <source>{0} file and {1} directory and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_1_symlinks_2">
+ <source>{0} file and {1} directory and {2} symlinks</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_2_symlinks_0">
+ <source>{0} file and {2} directories</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_2_symlinks_1">
+ <source>{0} file and {1} directories and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_1_dirs_2_symlinks_2">
+ <source>{0} file and {1} directories and {2} symlinks</source>
+ </trans-unit>
+
+ <trans-unit id="config.files_2_dirs_0_symlinks_0">
<source>{0} files</source>
- </trans-unit>
- <trans-unit id="config.files_0_dirs_1">
- <source>{0} directory</source>
- </trans-unit>
- <trans-unit id="config.files__0_dirs_2">
- <source>{0} directories</source>
</trans-unit>
- <trans-unit id="config.files_1_dirs_1">
- <source>{0} file and {1} directory</source>
+ <trans-unit id="config.files_2_dirs_0_symlinks_1">
+ <source>{0} files and {2} symlink</source>
+ </trans-unit>
+ <trans-unit id="config.files_2_dirs_0_symlinks_2">
+ <source>{0} files and {2} symlinks</source>
+ </trans-unit>
+ <trans-unit id="config.files_2_dirs_1_symlinks_0">
+ <source>{0} files and {2} directory</source>
+ </trans-unit>
+ <trans-unit id="config.files_2_dirs_1_symlinks_1">
+ <source>{0} files and {1} directory and {2} symlink</source>
</trans-unit>
- <trans-unit id="config.files_2_dirs_1">
- <source>{0} files and {1} directory</source>
+ <trans-unit id="config.files_2_dirs_1_symlinks_2">
+ <source>{0} files and {1} directory and {2} symlinks</source>
</trans-unit>
- <trans-unit id="config.files_2_dirs_2">
+ <trans-unit id="config.files_2_dirs_2_symlinks_0">
<source>{0} files and {1} directories</source>
</trans-unit>
- <trans-unit id="config.files_1_dirs_2">
- <source>{0} file and {1} directories</source>
+ <trans-unit id="config.files_2_dirs_2_symlinks_1">
+ <source>{0} files and {1} directories and {2} symlink</source>
</trans-unit>
- </group>
+ <trans-unit id="config.files_2_dirs_2_symlinks_2">
+ <source>{0} files and {1} directories and {2} symlinks</source>
+ </trans-unit>
+ </group>
<group>
<context-group name="config_channel_counts">
diff --git a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
index f00d191..86a1734 100644
--- a/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
+++ b/java/code/src/com/redhat/rhn/frontend/strings/jsp/StringResource_en_US.xml
@@ -12327,6 +12327,9 @@ the <strong>Red Hat Enterprise Linux System
Administration Guide.</stro
<trans-unit id="config.common.fileAlt">
<source>file</source>
</trans-unit>
+ <trans-unit id="config.common.symlinkAlt">
+ <source>symlink</source>
+ </trans-unit>
<trans-unit id="config.common.dirAlt">
<source>directory</source>
</trans-unit>
@@ -12754,10 +12757,10 @@ the <strong>Red Hat Enterprise Linux System
Administration Guide.</stro
</trans-unit>
<trans-unit id="channelOverview.jsp.numfiles">
-<source>{0} files, {1} directories</source>
+<source>{0} files, {1} directories, {2} symlinks</source>
<context-group name="ctx">
<context
context-type="sourcefile">/rhn/configuration/ChannelOverview.do</context>
- <context context-type="paramnotes">"36 files, 2
directories"</context>
+ <context context-type="paramnotes">"36 files, 2 directories, 0
symlinks"</context>
</context-group>
</trans-unit>
<trans-unit id="channelOverview.jsp.numfiles-total">
@@ -13348,6 +13351,12 @@ but are not subscribed to
_@@PRODUCT_NAME@(a)Config_.</context>
<context
context-type="sourcefile">/rhn/configuration/ChannelAddFiles.do</context>
</context-group>
</trans-unit>
+ <trans-unit id="addfiles.jsp.type.symlink">
+<source>Symbolic link</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/configuration/ChannelAddFiles.do</context>
+ </context-group>
+ </trans-unit>
<!-- channel deploy -->
<trans-unit id="deployconfirm.jsp.confirmbutton">
@@ -13954,6 +13963,12 @@ centrally-managed configuration channel, {2}; below is a list of
systems you may
<context
context-type="sourcefile">/rhn/configuration/FileDetails.do</context>
</context-group>
</trans-unit>
+ <trans-unit id="filedetails.jsp.tip.symlink">
+<source><strong>Tip:</strong> Enter the target of the
symlink as the file contents</source>
+ <context-group name="ctx">
+ <context
context-type="sourcefile">/rhn/configuration/FileDetails.do</context>
+ </context-group>
+ </trans-unit>
<!-- form error messages -->
<trans-unit id="config-file-form.error.user-invalid">
<source>User must be a valid Linux user name or user id, of 32 characters or
less.</source>
diff --git a/java/code/src/com/redhat/rhn/manager/configuration/ChannelSummary.java
b/java/code/src/com/redhat/rhn/manager/configuration/ChannelSummary.java
index 69e4da3..509c065 100644
--- a/java/code/src/com/redhat/rhn/manager/configuration/ChannelSummary.java
+++ b/java/code/src/com/redhat/rhn/manager/configuration/ChannelSummary.java
@@ -32,6 +32,7 @@ public class ChannelSummary {
private int numFiles;
private int numDirs;
+ private int numSymlinks;
private int numSystems;
private ConfigRevision mostRecentMod;
private String recentFileDate;
@@ -126,7 +127,22 @@ public class ChannelSummary {
this.numFiles = files;
}
-
+ /**
+ * How many symlinks are contained in this channel?
+ * @return number of symlinks contained in this channel
+ */
+ public int getNumSymlinks() {
+ return numSymlinks;
+ }
+
+ /**
+ * Set num-symlinks contained in this channel
+ * @param symlinks how many symlinks are contained in this channel
+ */
+ public void setNumSymlinks(int symlinks) {
+ this.numSymlinks = symlinks;
+ }
+
/**
* How many systems are subscribed to this channel?
* @return num of systems subscribed
diff --git a/java/code/src/com/redhat/rhn/manager/configuration/ConfigurationManager.java
b/java/code/src/com/redhat/rhn/manager/configuration/ConfigurationManager.java
index 9d8647b..4d7a5cf 100644
--- a/java/code/src/com/redhat/rhn/manager/configuration/ConfigurationManager.java
+++ b/java/code/src/com/redhat/rhn/manager/configuration/ConfigurationManager.java
@@ -868,7 +868,26 @@ public class ConfigurationManager extends BaseManager {
Long count = (Long)row.get("total_file_size");
return count.intValue();
}
-
+
+ /**
+ * Return the number of Symlinks in this config-channel
+ * @param user user making the request
+ * @param channel channel of interest
+ * @return number of symlinks in this channel
+ */
+ public int getSymlinkCount(User user, ConfigChannel channel) {
+ if (!accessToChannel(user.getId(), channel.getId())) {
+ throw new IllegalArgumentException(
+ "User [" + user.getId() +
+ "] has no access to channel [" + channel.getId() +
"]");
+ }
+ Map params = new HashMap();
+ params.put("ccid", channel.getId());
+ params.put("filetype", "symlink");
+ params.put("user_id", user.getId());
+ return doCountFiles(params);
+ }
+
/**
* Return the number of Directories in this config-channel
* @param user user making the request
@@ -1010,6 +1029,7 @@ public class ConfigurationManager extends BaseManager {
summary.setNumSystems(getSystemCount(user, channel));
summary.setNumDirs(getDirCount(user, channel));
summary.setNumFiles(getFileCount(user, channel));
+ summary.setNumSymlinks(getSymlinkCount(user, channel));
DataResult dr = getFileInfo(user, channel);
if (dr != null && dr.size() > 0) {
@@ -1623,30 +1643,31 @@ public class ConfigurationManager extends BaseManager {
return
processCountedFilePathQueries("count_locally_managed_file_paths",
params);
}
-
+
private ConfigFileCount processCountedFilePathQueries(String query, Map params) {
- SelectMode m = ModeFactory.getMode("config_queries",
- query);
+ SelectMode m = ModeFactory.getMode("config_queries", query);
List results = m.execute(params);
- long files = 0, dirs = 0;
+ long files = 0, dirs = 0, symlinks = 0;
+
for (Iterator itr = results.iterator(); itr.hasNext();) {
- Map map = (Map) itr.next();
- Long count = (Long) map.get("count");
+ Map map = (Map)itr.next();
+ Long count = (Long)map.get("count");
String fileType = (String)map.get("file_type");
- if (ConfigFileType.file().getLabel().
- equals(fileType)) {
+
+ if (ConfigFileType.file().getLabel().equals(fileType)) {
files = count.longValue();
- }
+ }
+ else if (ConfigFileType.symlink().getLabel().equals(fileType)) {
+ symlinks = count.longValue();
+ }
else {
dirs = count.longValue();
- }
+ }
}
-
- return ConfigFileCount.create(files, dirs);
+
+ return ConfigFileCount.create(files, dirs, symlinks);
}
-
-
-
+
/**
* Returns the sum of files, and directories
* that are present in the all the centrally managed channels
@@ -1711,22 +1732,26 @@ public class ConfigurationManager extends BaseManager {
List pathList = m.execute(params);
Set files = new HashSet();
Set dirs = new HashSet();
+ Set symlinks = new HashSet();
for (Iterator itr = pathList.iterator(); itr.hasNext();) {
Map map = (Map) itr.next();
String path = (String) map.get("path");
String fileType = (String)map.get("file_type");
- if (ConfigFileType.file().getLabel().
- equals(fileType)) {
- if (!dirs.contains(path)) {
- files.add(path);
+ if (ConfigFileType.file().getLabel().equals(fileType)) {
+ if (!dirs.contains(path) && !symlinks.contains(path)) {
+ files.add(path);
+ }
+ }
+ else if (ConfigFileType.symlink().getLabel().equals(fileType)) {
+ if (!dirs.contains(path) && !files.contains(path)) {
+ symlinks.add(path);
}
- }
- else if (!files.contains(path)) {
- dirs.add(path);
+ }
+ else if (!files.contains(path) && !symlinks.contains(path)) {
+ dirs.add(path);
}
}
- return ConfigFileCount.create(files.size(),
- dirs.size());
+ return ConfigFileCount.create(files.size(), dirs.size(), symlinks.size());
}
diff --git
a/java/code/src/com/redhat/rhn/manager/configuration/test/ConfigurationManagerTest.java
b/java/code/src/com/redhat/rhn/manager/configuration/test/ConfigurationManagerTest.java
index ec999e3..a0a29bd 100644
---
a/java/code/src/com/redhat/rhn/manager/configuration/test/ConfigurationManagerTest.java
+++
b/java/code/src/com/redhat/rhn/manager/configuration/test/ConfigurationManagerTest.java
@@ -75,7 +75,7 @@ public class ConfigurationManagerTest extends RhnBaseTestCase {
private PageControl pc;
private ConfigurationManager cm;
private static final ConfigFileCount EXPECTED_COUNT =
- ConfigFileCount.create(3, 1);
+ ConfigFileCount.create(3, 1, 0);
protected void setUp() throws Exception {
super.setUp();
@@ -725,7 +725,7 @@ public class ConfigurationManagerTest extends RhnBaseTestCase {
ConfigFileCount expected = ConfigFileCount.create(
EXPECTED_COUNT.getFiles() + 1,
- EXPECTED_COUNT.getDirectories());
+ EXPECTED_COUNT.getDirectories(), 0);
assertEquals(expected, actual);
}
@@ -778,7 +778,7 @@ public class ConfigurationManagerTest extends RhnBaseTestCase {
actual = cm.countCentrallyDeployablePaths(s, user);
ConfigFileCount expected = ConfigFileCount.create(
EXPECTED_COUNT.getFiles() - 1,
- EXPECTED_COUNT.getDirectories());
+ EXPECTED_COUNT.getDirectories(), 0);
assertEquals(expected, actual);
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
index 0bbaad9..66a6fd4 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/create.jspf
@@ -11,6 +11,9 @@
<html:radio
property="filetype" value="directory" /><bean:message
key="addfiles.jsp.type.directory" /><br />
+ <html:radio property="filetype" value="symlink"
/><bean:message
+ key="addfiles.jsp.type.symlink" /><br />
+ <bean:message key="filedetails.jsp.tip.symlink" />
</td>
</tr>
<tr>
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/summary.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/summary.jspf
index 6736ab4..06dbe47 100644
--- a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/summary.jspf
+++ b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/channel/summary.jspf
@@ -4,13 +4,13 @@
<tr>
<th><bean:message key="channelOverview.jsp.numfiles-header"
/></th>
<c:choose>
- <c:when test="${summary.numFiles + summary.numDirs > 0}">
+ <c:when test="${summary.numFiles + summary.numDirs + summary.numSymlinks >
0}">
<td><bean:message key="channelOverview.jsp.numfiles"
- arg0="${summary.numFiles}" arg1="${summary.numDirs}" />
+ arg0="${summary.numFiles}" arg1="${summary.numDirs}"
arg2="${summary.numSymlinks}" />
<br />(<a
href="/rhn/configuration/ChannelFiles.do?ccid=${channel.id}"><bean:message
key="channelOverview.jsp.numfiles-total"
- arg0="${summary.numFiles + summary.numDirs}" /></a>)</td>
+ arg0="${summary.numFiles + summary.numDirs + summary.numSymlinks}"
/></a>)</td>
</c:when>
<c:otherwise>
<td><bean:message key="channelOverview.jsp.numfiles-none"
/></td>
@@ -61,13 +61,18 @@
<tr>
<th><bean:message key="channelOverview.jsp.recentfile-header"
/></th>
<td><c:choose>
- <c:when test="${summary.numFiles + summary.numDirs > 0}">
- <c:if
test="${summary.mostRecentMod.configFile.latestConfigRevision.directory}">
- <img alt='<bean:message key="config.common.dirAlt" />'
src="/img/rhn-listicon-cfg_folder.gif" />
- </c:if>
- <c:if test="${!
summary.mostRecentMod.configFile.latestConfigRevision.directory}">
- <img alt='<bean:message key="config.common.fileAlt" />'
src="/img/rhn-listicon-cfg_file.gif" />
- </c:if>
+ <c:when test="${summary.numFiles + summary.numDirs + summary.numSymlinks >
0}">
+ <c:choose>
+ <c:when
test="${summary.mostRecentMod.configFile.latestConfigRevision.directory}">
+ <img alt='<bean:message key="config.common.dirAlt" />'
src="/img/rhn-listicon-cfg_folder.gif" />
+ </c:when>
+ <c:when
test="${summary.mostRecentMod.configFile.latestConfigRevision.symlink}">
+ <img alt='<bean:message key="config.common.symlinkAlt"
/>' src="/img/rhn-listicon-cfg_symlink.gif" />
+ </c:when>
+ <c:otherwise>
+ <img alt='<bean:message key="config.common.fileAlt" />'
src="/img/rhn-listicon-cfg_file.gif" />
+ </c:otherwise>
+ </c:choose>
<a
href="/rhn/configuration/file/FileDetails.do?cfid=${summary.mostRecentMod.configFile.id}">
<c:out value="${summary.mostRecentMod.configFile.configFileName.path}"
/>
</a><br />
diff --git
a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/sdc/configfile_rows.jspf
b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/sdc/configfile_rows.jspf
index 1c361c7..43fbc23 100644
---
a/java/code/webapp/WEB-INF/pages/common/fragments/configuration/sdc/configfile_rows.jspf
+++
b/java/code/webapp/WEB-INF/pages/common/fragments/configuration/sdc/configfile_rows.jspf
@@ -8,9 +8,13 @@
<img alt='<bean:message key="config.common.fileAlt"
/>'
src="/img/rhn-listicon-cfg_file.gif"> ${current.path}
</c:when>
- <c:otherwise>
+ <c:when test="${current.configFileType ==
'directory'}">
<img alt='<bean:message key="config.common.dirAlt"
/>'
src="/img/rhn-listicon-cfg_folder.gif">
${current.path}
+ </c:when>
+ <c:otherwise>
+ <img alt='<bean:message
key="config.common.symlinkAlt" />'
+ src="/img/rhn-listicon-cfg_symlink.gif">
${current.path}
</c:otherwise>
</c:choose>
</rhn:column>
@@ -37,4 +41,4 @@
</c:otherwise>
</c:choose>
${current.channelNameDisplay}
- </rhn:column>
\ No newline at end of file
+ </rhn:column>
diff --git a/java/code/webapp/WEB-INF/pages/configuration/files/comparecopy.jsp
b/java/code/webapp/WEB-INF/pages/configuration/files/comparecopy.jsp
index b4521de..a4a567e 100644
--- a/java/code/webapp/WEB-INF/pages/configuration/files/comparecopy.jsp
+++ b/java/code/webapp/WEB-INF/pages/configuration/files/comparecopy.jsp
@@ -37,9 +37,13 @@
<img alt='<bean:message key="config.common.fileAlt"
/>'
src="/img/rhn-listicon-cfg_file.gif" />
</c:when>
- <c:otherwise>
+ <c:when test="${current.configFileType ==
'directory'}">
<img alt='<bean:message key="config.common.dirAlt"
/>'
src="/img/rhn-listicon-cfg_folder.gif" />
+ </c:when>
+ <c:otherwise>
+ <img alt='<bean:message key="config.common.symlinkAlt"
/>'
+ src="/img/rhn-listicon-cfg_symlink.gif" />
</c:otherwise>
</c:choose>
<bean:message key="comparecopy.jsp.revnum"
arg0="${current.configRevision}" />
diff --git a/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
b/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
index 718c7ec..de3465d 100644
--- a/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
+++ b/java/code/webapp/WEB-INF/pages/configuration/overview/overview.jsp
@@ -48,10 +48,15 @@
src="/img/rhn-listicon-cfg_file.gif" />
${fn:escapeXml(current.path)}
</c:when>
- <c:otherwise>
+ <c:when test="${current.type == 'directory'}">
<img alt='<bean:message key="config.common.dirAlt"
/>'
src="/img/rhn-listicon-cfg_folder.gif" />
${fn:escapeXml(current.path)}
+ </c:when>
+ <c:otherwise>
+ <img alt='<bean:message key="config.common.symlinkAlt"
/>'
+ src="/img/rhn-listicon-cfg_symlink.gif" />
+ ${fn:escapeXml(current.path)}
</c:otherwise>
</c:choose>
</rhn:column>
diff --git a/java/code/webapp/WEB-INF/pages/configuration/ssm/difffiles.jsp
b/java/code/webapp/WEB-INF/pages/configuration/ssm/difffiles.jsp
index 25a446a..2acfd62 100644
--- a/java/code/webapp/WEB-INF/pages/configuration/ssm/difffiles.jsp
+++ b/java/code/webapp/WEB-INF/pages/configuration/ssm/difffiles.jsp
@@ -34,10 +34,14 @@
src="/img/rhn-listicon-cfg_file.gif" />
<c:out value="${current.path}" />
</c:when>
- <c:otherwise>
+ <c:when test="${current.configFileType ==
'directory'}">
<img alt='<bean:message key="config.common.dirAlt"
/>'
src="/img/rhn-listicon-cfg_folder.gif" />
<c:out value="${current.path}" />
+ </c:when>
+ <c:otherwise>
+ <img alt='<bean:message key="config.common.symlinkAlt"
/>'
+ src="/img/rhn-listicon-cfg_symlink.gif" />
</c:otherwise>
</c:choose>
</rhn:column>
diff --git a/schema/spacewalk/common/data/rhnConfigFileType.sql
b/schema/spacewalk/common/data/rhnConfigFileType.sql
index d28a5cd..c0b6620 100644
--- a/schema/spacewalk/common/data/rhnConfigFileType.sql
+++ b/schema/spacewalk/common/data/rhnConfigFileType.sql
@@ -18,6 +18,7 @@
insert into rhnConfigFileType values (1, 'file', 'File', sysdate,
sysdate);
insert into rhnConfigFileType values (2, 'directory', 'Directory',
sysdate, sysdate);
+insert into rhnConfigFileType values (3, 'symlink', 'Symlink', sysdate,
sysdate);
--
--
diff --git
a/schema/spacewalk/upgrade/spacewalk-schema-0.6-to-spacewalk-schema-0.7/150-rhnConfigFileType_symlinks.sql
b/schema/spacewalk/upgrade/spacewalk-schema-0.6-to-spacewalk-schema-0.7/150-rhnConfigFileType_symlinks.sql
new file mode 100644
index 0000000..e48930a
--- /dev/null
+++
b/schema/spacewalk/upgrade/spacewalk-schema-0.6-to-spacewalk-schema-0.7/150-rhnConfigFileType_symlinks.sql
@@ -0,0 +1,6 @@
+--
+-- Add in an entry for symlinks
+--
+
+insert into rhnConfigFileType values (3, 'symlink', 'Symlink', sysdate,
sysdate);
+