From 1928d251fb3a6ce463efbc3405c5337cc59c9dda Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 14 Oct 2015 19:55:53 +0000 Subject: [PATCH] Introduce node initialisation. git-svn-id: https://svn.argeo.org/commons/trunk@8486 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- demo/init/node/dc=example,dc=com.ldif | 41 +++++++++++++++++++ .../init/node/ou=roles,ou=node.ldif | 0 demo/log4j.properties | 1 + .../org/argeo/cms/internal/kernel/Kernel.java | 39 +++++++++++++----- .../cms/internal/kernel/KernelConstants.java | 4 ++ .../cms/internal/kernel/NodeRepository.java | 10 ++--- .../cms/internal/kernel/NodeSecurity.java | 12 +++++- .../cms/internal/kernel/NodeUserAdmin.java | 11 ++--- .../cms/internal/kernel/ou=roles,ou=node.ldif | 21 ++++++++++ 9 files changed, 117 insertions(+), 22 deletions(-) create mode 100644 demo/init/node/dc=example,dc=com.ldif rename org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif => demo/init/node/ou=roles,ou=node.ldif (100%) create mode 100644 org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif diff --git a/demo/init/node/dc=example,dc=com.ldif b/demo/init/node/dc=example,dc=com.ldif new file mode 100644 index 000000000..fda4eadf7 --- /dev/null +++ b/demo/init/node/dc=example,dc=com.ldif @@ -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/org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif b/demo/init/node/ou=roles,ou=node.ldif similarity index 100% rename from org.argeo.cms/src/org/argeo/cms/internal/kernel/demo.ldif rename to demo/init/node/ou=roles,ou=node.ldif diff --git a/demo/log4j.properties b/demo/log4j.properties index 41a9a484c..62d1c06e9 100644 --- a/demo/log4j.properties +++ b/demo/log4j.properties @@ -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 diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java index b66140e31..d4092371a 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/Kernel.java @@ -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") diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java index 0fe5b3ae9..8e489c27c 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/KernelConstants.java @@ -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"; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java index a139289be..51eddce4d 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeRepository.java @@ -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; } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeSecurity.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeSecurity.java index b43a9fdf5..6714bd6e7 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeSecurity.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeSecurity.java @@ -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 " diff --git a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java index 7408b1c1f..77c8fdc33 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/NodeUserAdmin.java @@ -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/ou=roles,ou=node.ldif b/org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif new file mode 100644 index 000000000..c77f6e2f3 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/internal/kernel/ou=roles,ou=node.ldif @@ -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 -- 2.30.2