diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/.gitignore b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..a1c3ab4d08c0f9f91918f21c730272a4711885e8 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.settings/ +.classpath +.project diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/Schema/schema.ldif b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/Schema/schema.ldif new file mode 100644 index 0000000000000000000000000000000000000000..9338a24eab6423306b1a94623e134b80ac113bb3 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/Schema/schema.ldif @@ -0,0 +1,12 @@ +version: 1 + +dn: ou=groups,dc=hdm-stuttgart,dc=de +objectClass: top +objectClass: organizationalUnit +ou: groups + +dn: ou=users,dc=hdm-stuttgart,dc=de +objectClass: top +objectClass: organizationalUnit +ou: users + diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/pom.xml b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7d82a7c1391932a6fb28404c1cd3f957201cb8f9 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/pom.xml @@ -0,0 +1,54 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>de.hdm-stuttgart.mi.sda2</groupId> + <artifactId>rdbms2ldap</artifactId> + <version>0.9</version> + <packaging>jar</packaging> + + <name>rdbms2ldap</name> + + <!--Fixme: Add a sensible project related domain here --> + <url>http://somedomain.org</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.17</version> + </dependency> + + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>5.1.33</version> + </dependency> + + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Config.java b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Config.java new file mode 100644 index 0000000000000000000000000000000000000000..b88b0e4b6cb0798ba150ab102a9b03488a5216c6 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Config.java @@ -0,0 +1,22 @@ +package de.hdm_stuttgart.mi.sda2.rdbms2ldap; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class Config { + private static final String BUNDLE_NAME = "de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap"; //$NON-NLS-1$ + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private Config() { + } + + public static String get(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Driver.java b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Driver.java new file mode 100644 index 0000000000000000000000000000000000000000..3ce7d8aac065f9ccb8e56ed264cecd01592d0281 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/Driver.java @@ -0,0 +1,38 @@ +package de.hdm_stuttgart.mi.sda2.rdbms2ldap; + +import java.sql.SQLException; + +import javax.naming.NamingException; + +import org.apache.log4j.Logger; + +import de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap.LdapHandler; +import de.hdm_stuttgart.mi.sda2.rdbms2ldap.rdbms.RdbmsHandler; + +/** + * Transfer user/group data from RDBMS to LDAP + * + */ +public class Driver { + private static Logger log = Logger.getLogger(Driver.class); + + public static void main( String[] args ) { + + final RdbmsHandler rdbmsHandler = new RdbmsHandler(); + try { + rdbmsHandler.connect(); + } catch (SQLException e1) { + log.fatal("Unable to connect to database server"); + } + + final LdapHandler ldapHandler = new LdapHandler(); + try { + ldapHandler.connect(); + } catch (NamingException e) { + log.error("Unable to connect to lDAP server:" + e.getMessage()); + } + rdbmsHandler.transferUsers(ldapHandler); + rdbmsHandler.transferGroups(ldapHandler); + + } +} diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap/LdapHandler.java b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap/LdapHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..391ec4f4c2584dbc5679422ffa3fded9d6e93a55 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap/LdapHandler.java @@ -0,0 +1,96 @@ +package de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap; + +import java.util.Hashtable; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttribute; +import javax.naming.directory.BasicAttributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; + +import org.apache.log4j.Logger; + +import de.hdm_stuttgart.mi.sda2.rdbms2ldap.Config; + +public class LdapHandler { + private static Logger log = Logger.getLogger(LdapHandler.class); + + InitialDirContext rootContext; + + DirContext groupsContext, usersContext; + + public void connect() throws NamingException { + Hashtable <String, String> env = new Hashtable<String, String>(); + env.put(Context.INITIAL_CONTEXT_FACTORY, Config.get("LdapHandler.ldapCtxFactory")); + env.put(Context.PROVIDER_URL, Config.get("LdapHandler.ldapBaseDN")); + env.put(Context.SECURITY_PRINCIPAL, Config.get("LdapHandler.ldapBindDn")); + env.put(Context.SECURITY_CREDENTIALS, Config.get("LdapHandler.ldapBindPw")); + + rootContext = new InitialDirContext (env); + groupsContext = (DirContext) lookupContext(rootContext, Config.get("LdapHandler.groupsRDN"), DirContext.class); + usersContext = (DirContext) lookupContext(rootContext, Config.get("LdapHandler.usersRDN"), DirContext.class); + } + + public void insertGroup(final String gid, final int gidNumber) { + final Attributes groupAttrs = new BasicAttributes(); + groupAttrs.put(new BasicAttribute ("objectclass", "top")); + groupAttrs.put(new BasicAttribute("objectclass", "posixGroup")); + + groupAttrs.put(new BasicAttribute("cn", gid)); + groupAttrs.put(new BasicAttribute("gidNumber", "" + gidNumber)); + + final String groupRdn = "gidNumber=" + gidNumber; + try { + groupsContext.bind(groupRdn, null, groupAttrs); + } catch (NamingException e) { + log.fatal("Unable to bind context '" + groupRdn + "' :" + e.getMessage()); + System.exit(1); + } + } + + public void insertUser(final String uid, final int uidNumber, final int primaryGidNumber, final String cname, final String homeDirectory, final String shell) { + + final Attributes userAttrs = new BasicAttributes(); + + final BasicAttribute objectClass = new BasicAttribute("objectClass", "account"); + objectClass.add("posixAccount"); + objectClass.add("top"); + + userAttrs.put(objectClass); + + userAttrs.put(new BasicAttribute("uid", uid)); + userAttrs.put(new BasicAttribute("uidNumber", "" + uidNumber)); + userAttrs.put(new BasicAttribute("gidNumber", "" + primaryGidNumber)); + userAttrs.put(new BasicAttribute("cn", cname)); + userAttrs.put(new BasicAttribute("homeDirectory", homeDirectory)); + userAttrs.put(new BasicAttribute("loginShell", shell)); + + final String userRdn = "uid=" + uid; + try { + usersContext.bind(userRdn, null, userAttrs); + } catch (NamingException e) { + log.fatal("Unable to bind context '" + userRdn + "' :" + e.getMessage()); + System.exit(1); + } + } + + @SuppressWarnings("unchecked") + private static final <T extends Object> T lookupContext(final DirContext parent, final String rdn, Class<T> type) { + try { + final Object o = parent.lookup(rdn); + if (null == o) { + log.fatal("Context '" + rdn + "' does not exist"); + } else if(type.isAssignableFrom(o.getClass())) { + return (T)o; + } else { + log.fatal("Context '" + rdn + "' is no subtype of '" + type + "'"); + } + } catch (NamingException ne) { + log.fatal("Unable to retrieve context '" + rdn + "'"); + System.exit(1); + } + return null; + } +} diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/rdbms/RdbmsHandler.java b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/rdbms/RdbmsHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..069a0905cf1f5e97c3965f385acf6184412f15de --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/rdbms/RdbmsHandler.java @@ -0,0 +1,74 @@ +package de.hdm_stuttgart.mi.sda2.rdbms2ldap.rdbms; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import org.apache.log4j.Logger; + +import de.hdm_stuttgart.mi.sda2.rdbms2ldap.Config; +import de.hdm_stuttgart.mi.sda2.rdbms2ldap.ldap.LdapHandler; + +public class RdbmsHandler { + + private static Logger log = Logger + .getLogger(RdbmsHandler.class); + + static { + try { + Class.forName(Config.get("RdbmsHandler.driverClassName")); + } catch (ClassNotFoundException e) { + System.err.println("Unable to register JDBC driver '" + + Config.get("RdbmsHandler.jdbcUrl") + "'"); + System.exit(1); + } + } + + Connection conn = null; + + public void connect() throws SQLException { + if (null != conn) { + conn.rollback(); + conn.close(); + } + conn = DriverManager.getConnection(Config.get("RdbmsHandler.jdbcUrl"), + Config.get("RdbmsHandler.user"), Config.get("RdbmsHandler.password")); + conn.setAutoCommit(true); + } + + public void transferGroups(LdapHandler ldapHandler) { + try { + Statement stmt = conn.createStatement(); + final ResultSet groups = stmt.executeQuery("SELECT * FROM SysGroup"); + while (groups.next()) { + ldapHandler.insertGroup(groups.getString("gid"), + groups.getInt("gidNumber")); + } + + } catch (SQLException e) { + log.fatal("Unable to insert groups: " + e.getMessage()); + } + } + public void transferUsers(LdapHandler ldapHandler) { + try { + Statement stmt = conn.createStatement(); + final ResultSet users = stmt.executeQuery("SELECT * FROM SysUser"); + while (users.next()) { + ldapHandler.insertUser( + users.getString("uid") + ,users.getInt("uidNumber") + ,users.getInt("primaryGidNumber") + ,users.getString("cname") + ,users.getString("homeDirectory") + ,users.getString("shell") + ); + } + + } catch (SQLException e) { + log.fatal("Unable to insert userss: " + e.getMessage()); + } + } + +} diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap.properties b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap.properties new file mode 100644 index 0000000000000000000000000000000000000000..abb0fb2b0a2ed1e7b438112825fd540199c297e6 --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/de/hdm_stuttgart/mi/sda2/rdbms2ldap/ldap.properties @@ -0,0 +1,16 @@ +# LDAP +LdapHandler.ldapCtxFactory=com.sun.jndi.ldap.LdapCtxFactory +LdapHandler.ldapBaseDN=ldap://localhost:389/dc=hdm-stuttgart,dc=de +LdapHandler.ldapBindDn=cn=admin,dc=hdm-stuttgart,dc=de +LdapHandler.ldapBindPw=XYZ + +LdapHandler.groupsRDN=ou=groups +LdapHandler.usersRDN=ou=users + + +# RDBMS +RdbmsHandler.driverClassName=com.mysql.jdbc.Driver + +RdbmsHandler.jdbcUrl=jdbc:mysql://localhost:3306/hdm +RdbmsHandler.password=XYZ +RdbmsHandler.user=hdmuser diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/log4j.properties b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..05100dbdea8c0eda4a287c8d6a8c754fd981352f --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/main/resources/log4j.properties @@ -0,0 +1,15 @@ +#Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=DEBUG, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout comforting Eclipse's debugger. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%p: %m at %c.%M(%C{1}.java:%L)%n + +# Activate per-class or package logging rules if required. For example +# reducing logging to INFO level for class de.hdm-stuttgart.mi.sda2.rdbms2ldap.App +# can be achieved by un-commenting the following line: + +#log4j.logger.de.hdm-stuttgart.mi.sda2.rdbms2ldap.App.parse.Group=INFO diff --git a/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/test/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/AppTest.java b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/test/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/AppTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f80250269b3b0962f30d361734c4d58d4c65721f --- /dev/null +++ b/Sda2/P/UnixSqlLdap/Jndi/Rdbms2Ldap/src/test/java/de/hdm_stuttgart/mi/sda2/rdbms2ldap/AppTest.java @@ -0,0 +1,14 @@ +package de.hdm_stuttgart.mi.sda2.rdbms2ldap; + +import org.junit.Assert; +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest { + @Test + public void testApp() { + Assert.assertTrue( true ); + } +}