Bug 1093374

Summary: JON plugin for AS 7 cannot create an admin user in a moved configuration directory
Product: [Other] RHQ Project Reporter: Tom Fonteyne <tfonteyn>
Component: PluginsAssignee: Thomas Heute <theute>
Status: ON_QA --- QA Contact:
Severity: high Docs Contact:
Priority: unspecified    
Version: 4.12CC: bkramer, hrupp, theute
Target Milestone: ---   
Target Release: RHQ 4.13   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On:    
Bug Blocks: 1093370    

Description Tom Fonteyne 2014-05-01 14:40:20 UTC
After detecting/importing an AS 7 instance, JON can execute an operation:

"install an RHQ user"

which is intended to add a user/password to the mgmt-users.properties file in "domain/configuration" or in "standalone/configuration"

AS supports moving the base directory, for example "standalone" and up to a point JON supports that. However, AS also supports moving the "configuration" directory either with a relative path or an absolute path.
The JON plugin does not cope with this.

The problem is located in

rhq/source/modules/plugins/jboss-as-7/src/main/java/org/rhq/modules/plugins/jbossas7/helper/HostConfiguration.java

"relative-to" is a so called "named path"; an alias for a directory.
"path" is either relative to the resolved "relative-to" setting, or when the latter is not set, an absolute path

example:
path: mgmt-users.properties
relative-to: jboss.server.config.dir

Full path:    /opt/jboss/standalone/configuration/mgmt-users.properties

However, if "jboss.server.config.dir" has been redefine, lets say "/var/jboss/config"; then the above resolved to

/var/jboss/config/mgmt-users.properties

JON code breaks on this:


217     public File getSecurityPropertyFile(File baseDir, AS7Mode mode, String realm) {
218         String fileName = obtainXmlPropertyViaXPath("//security-realms/security-realm[@name='" + realm
219             + "']/authentication/properties/@path");
220         String relDir = obtainXmlPropertyViaXPath("//security-realms/security-realm[@name='" + realm
221             + "']/authentication/properties/@relative-to");
222 
223         String dmode;
224         if (mode == AS7Mode.STANDALONE)
225             dmode = "server";
226         else
227             dmode = "domain";
228 
229         File configDir;
230         if (relDir.equals("jboss." + dmode + ".config.dir")) {
231             configDir = new File(baseDir, "configuration");
232         } else {
233             configDir = new File(relDir);
234         }
235         File securityPropertyFile = new File(configDir, fileName);
236 
237         return securityPropertyFile;
238     }

problematic lines are:

229         File configDir;
230         if (relDir.equals("jboss." + dmode + ".config.dir")) {
231             configDir = new File(baseDir, "configuration");
232         } else {
233             configDir = new File(relDir);
234         }
235         File securityPropertyFile = new File(configDir, fileName);
236 
237         return securityPropertyFile;
238     }

As (for now) I assume the plugin cannot resolve the relative-to named path, a first correction to the code should be:

230         if (relDir == null || relDir.isEmpty()) {
231             return new File(fileName);
232         } else {
233             return new File(baseDir, "configuration");
234         }
238     }

This at least allows customers to set "path" to a fully qualified pathname for the file (and remove relative-to)
thus allowing to have the configuration directory elsewhere.


A better solution would be:


230         if (relDir == null || relDir.isEmpty()) {
231             return new File(fileName);
232         } else {
233             return new File(resolveNamedPath(relDir));
234         }
238     }

resolveNamedPath(..) would need to be able to ask JBoss to resolve the named path of course.
I'm not sure if that is possible right now.
I presume "AS7Mode mode" would need to be extended to take the configuration directory

Comment 1 Libor Zoubek 2014-07-10 15:35:12 UTC
in master

commit b43e1a33a9d81410caf030c0deea857b2b767ba7
Author: Libor Zoubek <lzoubek>
Date:   Thu Jul 10 17:20:21 2014 +0200

    Bug 1093374 - JON plugin for AS 7 cannot create an admin user in a moved
    configuration directory

    Original HostConfiguration#getSecurityPropertyFile is now deprecated, new
    implementation takes ServerPluginConfiguration as a parameter instead of
    baseDir and properly resovles 'relative-to' attribute value (according to
    AS7 XSD Doc this value can be a any AS7 path name).
    ServerPluginConfiguration has now method called getPath(String) which
    accepts path-name and if known by plugin, appropriate File instance is
    returned.