--- /dev/null
+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
--- /dev/null
+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
+
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
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;
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;
.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);
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")
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";
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";
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 */
private RepositoryContext repositoryContext;
- public NodeRepository(BundleContext bundleContext) {
- setBundleContext(bundleContext);
+ public NodeRepository() {
+ setBundleContext(Activator.getBundleContext());
JackrabbitNodeType type = JackrabbitNodeType.valueOf(prop(REPO_TYPE,
h2.name()));
try {
// 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());
private RepositoryContext createJackrabbitRepository(
RepositoryConfig repositoryConfig) throws RepositoryException {
- File homeDirectory = null;
long begin = System.currentTimeMillis();
//
// Actual repository creation
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;
}
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;
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);
System.setProperty("java.security.auth.login.config",
url.toExternalForm());
+ firstInit = !new File(getOsgiInstanceDir(), DIR_NODE).exists();
+
this.kernelSubject = logInKernel();
}
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 "
* 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 {
}
// 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
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);
}
+++ /dev/null
-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
-
--- /dev/null
+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