Introduce node initialisation.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2015 19:55:53 +0000 (19:55 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2015 19:55:53 +0000 (19:55 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@8486 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

demo/init/node/dc=example,dc=com.ldif [new file with mode: 0644]
demo/init/node/ou=roles,ou=node.ldif [new file with mode: 0644]
demo/log4j.properties
org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeSecurity.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java
org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif [new file with mode: 0644]

diff --git a/demo/init/node/dc=example,dc=com.ldif b/demo/init/node/dc=example,dc=com.ldif
new file mode 100644 (file)
index 0000000..fda4ead
--- /dev/null
@@ -0,0 +1,41 @@
+dn: dc=example,dc=com
+objectClass: domain
+objectClass: extensibleObject
+objectClass: top
+dc: example
+
+dn: ou=groups,dc=example,dc=com
+objectClass: organizationalUnit
+objectClass: top
+ou: groups
+
+dn: ou=users,dc=example,dc=com
+objectClass: organizationalUnit
+objectClass: top
+ou: users
+
+dn: uid=demo,ou=users,dc=example,dc=com
+objectClass: inetOrgPerson
+objectClass: organizationalPerson
+objectClass: person
+objectClass: top
+cn: Demo User
+description: Demo user
+givenname: Demo
+mail: demo@localhost
+sn: User
+uid: demo
+userpassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
+
+dn: uid=root,ou=users,dc=example,dc=com
+objectClass: inetOrgPerson
+objectClass: person
+objectClass: organizationalPerson
+objectClass: top
+cn: Super User
+description: Superuser
+givenname: Super
+mail: root@localhost
+sn: User
+uid: root
+userpassword:: e1NIQX1pZVNWNTVRYytlUU9hWURSU2hhL0Fqek5USkU9
diff --git a/demo/init/node/ou=roles,ou=node.ldif b/demo/init/node/ou=roles,ou=node.ldif
new file mode 100644 (file)
index 0000000..5fd3372
--- /dev/null
@@ -0,0 +1,36 @@
+dn: ou=node
+objectClass: organizationalUnit
+objectClass: top
+ou: node
+
+dn: ou=roles,ou=node
+objectClass: organizationalUnit
+objectClass: top
+ou: roles
+
+dn: cn=admin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: admin
+member: uid=root,ou=users,dc=example,dc=com
+
+dn: cn=userAdmin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: userAdmin
+member: cn=admin,ou=roles,ou=node
+member: uid=demo,ou=users,dc=example,dc=com
+
+dn: cn=groupAdmin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: groupAdmin
+member: cn=admin,ou=roles,ou=node
+
+dn: cn=org.argeo.cms.editor,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: org.argeo.cms.editor
+member: cn=admin,ou=roles,ou=node
+member: uid=demo,ou=users,dc=example,dc=com
+
index 41a9a484c03fa554b65cb7d9c08224634b6112de..62d1c06e9eeaed8fbf87e7eff2b116e5bd9ef21e 100644 (file)
@@ -1,6 +1,7 @@
 log4j.rootLogger=WARN, development
 
 log4j.logger.org.argeo=DEBUG
+log4j.logger.org.argeo.cms.internal.kernel=TRACE
 #log4j.logger.org.apache.jackrabbit.core.RepositoryImpl=DEBUG
 #log4j.logger.argeo.stats=DEBUG
 #log4j.logger.org.eclipse.jetty.server.Server=DEBUG
index b66140e31e1de8274d3f0a3c3206dbecd962bf3a..d4092371a402ada6cbef1d09e9f6ce9ed5c8411f 100644 (file)
@@ -3,7 +3,9 @@ package org.argeo.cms.internal.kernel;
 import static bitronix.tm.TransactionManagerServices.getTransactionManager;
 import static bitronix.tm.TransactionManagerServices.getTransactionSynchronizationRegistry;
 import static java.util.Locale.ENGLISH;
+import static org.apache.commons.io.FileUtils.copyDirectory;
 import static org.argeo.cms.internal.kernel.KernelUtils.getFrameworkProp;
+import static org.argeo.cms.internal.kernel.KernelUtils.getOsgiInstanceDir;
 import static org.argeo.cms.internal.kernel.KernelUtils.getOsgiInstancePath;
 import static org.argeo.jcr.ArgeoJcrConstants.ALIAS_NODE;
 import static org.argeo.jcr.ArgeoJcrConstants.JCR_REPOSITORY_ALIAS;
@@ -11,6 +13,7 @@ import static org.argeo.util.LocaleChoice.asLocaleList;
 import static org.osgi.framework.Constants.FRAMEWORK_UUID;
 
 import java.io.File;
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.security.PrivilegedAction;
 import java.util.HashMap;
@@ -114,16 +117,18 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
                                .getContextClassLoader();
                Thread.currentThread().setContextClassLoader(
                                Kernel.class.getClassLoader());
-               // KernelUtils.logFrameworkProperties(log);
-               defaultLocale = new Locale(getFrameworkProp(I18N_DEFAULT_LOCALE,
-                               ENGLISH.getLanguage()));
-               locales = asLocaleList(getFrameworkProp(I18N_LOCALES));
-
                try {
-                       // Initialise services
+                       if (nodeSecurity.isFirstInit())
+                               firstInit();
+
+                       defaultLocale = new Locale(getFrameworkProp(I18N_DEFAULT_LOCALE,
+                                       ENGLISH.getLanguage()));
+                       locales = asLocaleList(getFrameworkProp(I18N_LOCALES));
                        logger = new NodeLogger();
-                       initBitronixTransactionManager();
-                       repository = new NodeRepository(bc);
+
+                       // Initialise services
+                       initTransactionManager();
+                       repository = new NodeRepository();
                        repositoryFactory = new OsgiJackrabbitRepositoryFactory();
                        userAdmin = new NodeUserAdmin(transactionManager, repository);
 
@@ -156,12 +161,26 @@ final class Kernel implements KernelHeader, KernelConstants, ServiceListener {
                directorsCut(initDuration);
        }
 
-       private void initBitronixTransactionManager() {
+       private void firstInit() {
+               log.info("## FIRST INIT ##");
+               File initDir = new File(getFrameworkProp(NODE_INIT,
+                               KernelUtils.getOsgiInstancePath("../../../init")));
+               // TODO also uncompress archives
+               if (initDir.exists())
+                       try {
+                               copyDirectory(initDir, getOsgiInstanceDir());
+                               log.info("CMS initialized from " + initDir.getCanonicalPath());
+                       } catch (IOException e) {
+                               throw new CmsException("Cannot initialize from " + initDir, e);
+                       }
+       }
+
+       private void initTransactionManager() {
                Configuration tmConf = TransactionManagerServices.getConfiguration();
                tmConf.setServerId(getFrameworkProp(FRAMEWORK_UUID));
 
                File tmBaseDir = new File(getFrameworkProp(TRANSACTIONS_HOME,
-                               getOsgiInstancePath("transactions")));
+                               getOsgiInstancePath(DIR_TRANSACTIONS)));
                File tmDir1 = new File(tmBaseDir, "btm1");
                tmDir1.mkdirs();
                tmConf.setLogPart1Filename(new File(tmDir1, tmDir1.getName() + ".tlog")
index 0fe5b3ae90787cdaa3b65cb7f3081d70e6d355b1..8e489c27c039d81cf90fb2fee66afb738616a8df 100644 (file)
@@ -1,6 +1,8 @@
 package org.argeo.cms.internal.kernel;
 
 public interface KernelConstants {
+       final static String NODE_INIT = "argeo.node.init";
+
        // Node
        final static String REPO_HOME = "argeo.node.repo.home";
        final static String REPO_TYPE = "argeo.node.repo.type";
@@ -16,6 +18,8 @@ public interface KernelConstants {
        final static String REPO_SEARCH_CACHE_SIZE = "argeo.node.repo.searchCacheSize";
        final static String REPO_MAX_VOLATILE_INDEX_SIZE = "argeo.node.repo.maxVolatileIndexSize";
 
+       final static String DIR_NODE = "node";
+       final static String DIR_TRANSACTIONS = "tranactions";
        final static String TRANSACTIONS_HOME = "argeo.node.transactions.home";
 
        final static String I18N_DEFAULT_LOCALE = "argeo.i18n.defaultLocale";
index a139289be58a75dfa00906c87d98f4e54aa19f8c..51eddce4d9c0e75788e5bdd8e93a66107a811da2 100644 (file)
@@ -24,7 +24,6 @@ import org.argeo.ArgeoException;
 import org.argeo.cms.CmsException;
 import org.argeo.jackrabbit.JackrabbitWrapper;
 import org.argeo.jcr.ArgeoJcrConstants;
-import org.osgi.framework.BundleContext;
 import org.xml.sax.InputSource;
 
 /** Jacrabbit based data layer */
@@ -34,8 +33,8 @@ class NodeRepository extends JackrabbitWrapper implements KernelConstants,
 
        private RepositoryContext repositoryContext;
 
-       public NodeRepository(BundleContext bundleContext) {
-               setBundleContext(bundleContext);
+       public NodeRepository() {
+               setBundleContext(Activator.getBundleContext());
                JackrabbitNodeType type = JackrabbitNodeType.valueOf(prop(REPO_TYPE,
                                h2.name()));
                try {
@@ -96,7 +95,7 @@ class NodeRepository extends JackrabbitWrapper implements KernelConstants,
 
                // home
                File osgiInstanceDir = KernelUtils.getOsgiInstanceDir();
-               File homeDir = new File(osgiInstanceDir, "node");
+               File homeDir = new File(osgiInstanceDir, DIR_NODE);
                // home cannot be overridden
                defaults.put(RepositoryConfigurationParser.REPOSITORY_HOME_VARIABLE,
                                homeDir.getAbsolutePath());
@@ -168,7 +167,6 @@ class NodeRepository extends JackrabbitWrapper implements KernelConstants,
 
        private RepositoryContext createJackrabbitRepository(
                        RepositoryConfig repositoryConfig) throws RepositoryException {
-               File homeDirectory = null;
                long begin = System.currentTimeMillis();
                //
                // Actual repository creation
@@ -179,7 +177,7 @@ class NodeRepository extends JackrabbitWrapper implements KernelConstants,
                double duration = ((double) (System.currentTimeMillis() - begin)) / 1000;
                if (log.isTraceEnabled())
                        log.trace("Created Jackrabbit repository in " + duration
-                                       + " s, home: " + homeDirectory);
+                                       + " s, home: " + repositoryConfig.getHomeDir());
 
                return repositoryContext;
        }
index b43a9fdf5c393b5aef084b8eb9e5b3df35e808ee..6714bd6e706c6ca1847e4a97987c889f2f7f6a73 100644 (file)
@@ -1,5 +1,7 @@
 package org.argeo.cms.internal.kernel;
 
+import static org.argeo.cms.internal.kernel.KernelUtils.getOsgiInstanceDir;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.URL;
@@ -25,13 +27,15 @@ import org.argeo.cms.auth.AuthConstants;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 
 /** Low-level kernel security */
-class NodeSecurity {
+class NodeSecurity implements KernelConstants {
        public final static int HARDENED = 3;
        public final static int STAGING = 2;
        public final static int DEV = 1;
 
        final static String SECURITY_PROVIDER = "BC";// Bouncy Castle
 
+       private final boolean firstInit;
+
        private final static Log log;
        static {
                log = LogFactory.getLog(NodeSecurity.class);
@@ -57,6 +61,8 @@ class NodeSecurity {
                System.setProperty("java.security.auth.login.config",
                                url.toExternalForm());
 
+               firstInit = !new File(getOsgiInstanceDir(), DIR_NODE).exists();
+
                this.kernelSubject = logInKernel();
        }
 
@@ -112,6 +118,10 @@ class NodeSecurity {
                return securityLevel;
        }
 
+       public boolean isFirstInit() {
+               return firstInit;
+       }
+
        public void setSecurityLevel(int newValue) {
                if (newValue != STAGING || newValue != DEV)
                        throw new CmsException("Invalid value for security level "
index 7408b1c1f91d28977690dcf3e30c73d901e0629d..77c8fdc336d1e3bc66851db88a8ee5fc8a754ab7 100644 (file)
@@ -52,7 +52,7 @@ import org.osgi.service.useradmin.UserAdmin;
  * Aggregates multiple {@link UserDirectory} and integrates them with this node
  * system roles.
  */
-public class NodeUserAdmin implements UserAdmin {
+public class NodeUserAdmin implements UserAdmin, KernelConstants {
        private final static Log log = LogFactory.getLog(NodeUserAdmin.class);
        final static LdapName ROLES_BASE;
        static {
@@ -85,11 +85,11 @@ public class NodeUserAdmin implements UserAdmin {
                }
 
                // DAOs
-               File nodeBaseDir = new File(getOsgiInstanceDir(), "node");
+               File nodeBaseDir = new File(getOsgiInstanceDir(), DIR_NODE);
                nodeBaseDir.mkdirs();
-               String userAdminUri = getFrameworkProp(KernelConstants.USERADMIN_URIS);
+               String userAdminUri = getFrameworkProp(USERADMIN_URIS);
                initUserAdmins(userAdminUri, nodeBaseDir);
-               String nodeRolesUri = getFrameworkProp(KernelConstants.ROLES_URI);
+               String nodeRolesUri = getFrameworkProp(ROLES_URI);
                initNodeRoles(nodeRolesUri, nodeBaseDir);
 
                // Transaction manager
@@ -316,7 +316,8 @@ public class NodeUserAdmin implements UserAdmin {
                        if (!nodeRolesFile.exists())
                                try {
                                        FileUtils.copyInputStreamToFile(getClass()
-                                                       .getResourceAsStream("demo.ldif"), nodeRolesFile);
+                                                       .getResourceAsStream(baseNodeRoleDn + ".ldif"),
+                                                       nodeRolesFile);
                                } catch (IOException e) {
                                        throw new CmsException("Cannot copy demo resource", e);
                                }
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif b/org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif
deleted file mode 100644 (file)
index 5fd3372..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-dn: ou=node
-objectClass: organizationalUnit
-objectClass: top
-ou: node
-
-dn: ou=roles,ou=node
-objectClass: organizationalUnit
-objectClass: top
-ou: roles
-
-dn: cn=admin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: admin
-member: uid=root,ou=users,dc=example,dc=com
-
-dn: cn=userAdmin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: userAdmin
-member: cn=admin,ou=roles,ou=node
-member: uid=demo,ou=users,dc=example,dc=com
-
-dn: cn=groupAdmin,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: groupAdmin
-member: cn=admin,ou=roles,ou=node
-
-dn: cn=org.argeo.cms.editor,ou=roles,ou=node
-objectClass: groupOfNames
-objectClass: top
-cn: org.argeo.cms.editor
-member: cn=admin,ou=roles,ou=node
-member: uid=demo,ou=users,dc=example,dc=com
-
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif b/org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif
new file mode 100644 (file)
index 0000000..c77f6e2
--- /dev/null
@@ -0,0 +1,21 @@
+dn: ou=node
+objectClass: organizationalUnit
+objectClass: top
+ou: node
+
+dn: ou=roles,ou=node
+objectClass: organizationalUnit
+objectClass: top
+ou: roles
+
+dn: cn=admin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: admin
+member: uid=root,ou=users,dc=example,dc=com
+
+dn: cn=userAdmin,ou=roles,ou=node
+objectClass: groupOfNames
+objectClass: top
+cn: userAdmin
+member: cn=admin,ou=roles,ou=node