Mercurial > hg > tomcat-userconfig
changeset 10:086a55aa2620
PasswdUserConfig. Error logging.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Mon, 02 Nov 2009 23:17:40 +0300 |
parents | a3321ea9b33f |
children | 3a71cbe721f9 |
files | nbproject/build-impl.xml nbproject/genfiles.properties src/kryshen/catalina/startup/HomesUserConfig.java src/kryshen/catalina/startup/PasswdUserConfig.java src/kryshen/catalina/startup/UserConfig.java |
diffstat | 5 files changed, 159 insertions(+), 29 deletions(-) [+] |
line wrap: on
line diff
--- a/nbproject/build-impl.xml Mon Nov 02 18:36:24 2009 +0300 +++ b/nbproject/build-impl.xml Mon Nov 02 23:17:40 2009 +0300 @@ -20,6 +20,13 @@ --> <project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="tomcat-userconfig-impl"> + <fail message="Please build using Ant 1.7.1 or higher."> + <condition> + <not> + <antversion atleast="1.7.1"/> + </not> + </condition> + </fail> <target depends="test,jar,javadoc" description="Build and test whole project." name="default"/> <!-- ====================== @@ -152,10 +159,18 @@ <attribute default="${includes}" name="includes"/> <attribute default="${excludes}" name="excludes"/> <attribute default="${javac.debug}" name="debug"/> - <attribute default="/does/not/exist" name="sourcepath"/> + <attribute default="${empty.dir}" name="sourcepath"/> + <attribute default="${empty.dir}" name="gensrcdir"/> <element name="customize" optional="true"/> <sequential> + <property location="${build.dir}/empty" name="empty.dir"/> + <mkdir dir="${empty.dir}"/> <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}"> + <src> + <dirset dir="@{gensrcdir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </src> <classpath> <path path="@{classpath}"/> </classpath> @@ -271,6 +286,8 @@ <java classname="@{classname}" dir="${work.dir}" fork="true"> <jvmarg line="${debug-args-line}"/> <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/> + <jvmarg value="-Dfile.encoding=${source.encoding}"/> + <redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/> <jvmarg line="${run.jvmargs}"/> <classpath> <path path="@{classpath}"/> @@ -287,12 +304,15 @@ <target name="-init-macrodef-java"> <macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1"> <attribute default="${main.class}" name="classname"/> + <attribute default="${run.classpath}" name="classpath"/> <element name="customize" optional="true"/> <sequential> <java classname="@{classname}" dir="${work.dir}" fork="true"> + <jvmarg value="-Dfile.encoding=${source.encoding}"/> + <redirector errorencoding="${source.encoding}" inputencoding="${source.encoding}" outputencoding="${source.encoding}"/> <jvmarg line="${run.jvmargs}"/> <classpath> - <path path="${run.classpath}"/> + <path path="@{classpath}"/> </classpath> <syspropertyset> <propertyref prefix="run-sys-prop."/> @@ -332,10 +352,15 @@ <!-- You can override this target in the ../build.xml file. --> </target> <target if="do.depend.true" name="-compile-depend"> - <j2seproject3:depend/> + <pathconvert property="build.generated.subdirs"> + <dirset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="*"/> + </dirset> + </pathconvert> + <j2seproject3:depend srcdir="${src.dir}:${build.generated.subdirs}"/> </target> <target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile"> - <j2seproject3:javac/> + <j2seproject3:javac gensrcdir="${build.generated.sources.dir}"/> <copy todir="${build.classes.dir}"> <fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/> </copy> @@ -352,7 +377,7 @@ <target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single"> <fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail> <j2seproject3:force-recompile/> - <j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/> + <j2seproject3:javac excludes="" gensrcdir="${build.generated.sources.dir}" includes="${javac.includes}" sourcepath="${src.dir}"/> </target> <target name="-post-compile-single"> <!-- Empty placeholder for easier customization. --> @@ -418,11 +443,29 @@ <property location="${dist.jar}" name="dist.jar.resolved"/> <echo>java -jar "${dist.jar.resolved}"</echo> </target> + <target depends="init,compile,-pre-pre-jar,-pre-jar" if="libs.CopyLibs.classpath" name="-do-jar-with-libraries-without-manifest" unless="manifest.available+main.class"> + <property location="${build.classes.dir}" name="build.classes.dir.resolved"/> + <pathconvert property="run.classpath.without.build.classes.dir"> + <path path="${run.classpath}"/> + <map from="${build.classes.dir.resolved}" to=""/> + </pathconvert> + <pathconvert pathsep=" " property="jar.classpath"> + <path path="${run.classpath.without.build.classes.dir}"/> + <chainedmapper> + <flattenmapper/> + <globmapper from="*" to="lib/*"/> + </chainedmapper> + </pathconvert> + <taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/> + <copylibs compress="${jar.compress}" jarfile="${dist.jar}" runtimeclasspath="${run.classpath.without.build.classes.dir}"> + <fileset dir="${build.classes.dir}"/> + </copylibs> + </target> <target name="-post-jar"> <!-- Empty placeholder for easier customization. --> <!-- You can override this target in the ../build.xml file. --> </target> - <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/> + <target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-do-jar-with-libraries-without-manifest,-post-jar" description="Build JAR." name="jar"/> <!-- ================= EXECUTION SECTION @@ -442,6 +485,10 @@ <fail unless="run.class">Must select one file in the IDE or set run.class</fail> <j2seproject1:java classname="${run.class}"/> </target> + <target depends="init,-do-not-recompile,compile-test-single" name="run-test-with-main"> + <fail unless="run.class">Must select one file in the IDE or set run.class</fail> + <j2seproject1:java classname="${run.class}" classpath="${run.test.classpath}"/> + </target> <!-- ================= DEBUGGING SECTION @@ -450,6 +497,9 @@ <target depends="init" if="netbeans.home" name="-debug-start-debugger"> <j2seproject1:nbjpdastart name="${debug.class}"/> </target> + <target depends="init" if="netbeans.home" name="-debug-start-debugger-main-test"> + <j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${debug.class}"/> + </target> <target depends="init,compile" name="-debug-start-debuggee"> <j2seproject3:debug> <customize> @@ -467,6 +517,11 @@ <j2seproject3:debug classname="${debug.class}"/> </target> <target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/> + <target depends="init,compile-test-single" if="netbeans.home" name="-debug-start-debuggee-main-test"> + <fail unless="debug.class">Must select one file in the IDE or set debug.class</fail> + <j2seproject3:debug classname="${debug.class}" classpath="${debug.test.classpath}"/> + </target> + <target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-main-test,-debug-start-debuggee-main-test" if="netbeans.home" name="debug-test-with-main"/> <target depends="init" name="-pre-debug-fix"> <fail unless="fix.includes">Must set fix.includes</fail> <property name="javac.includes" value="${fix.includes}.java"/> @@ -489,6 +544,9 @@ <fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}"> <filename name="**/*.java"/> </fileset> + <fileset dir="${build.generated.sources.dir}" erroronmissingdir="false"> + <include name="**/*.java"/> + </fileset> </javadoc> </target> <target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview"> @@ -550,7 +608,7 @@ <j2seproject3:junit testincludes="**/*Test.java"/> </target> <target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run"> - <fail if="tests.failed">Some tests failed; see details above.</fail> + <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> </target> <target depends="init" if="have.tests" name="test-report"/> <target depends="init" if="netbeans.home+have.tests" name="-test-browse"/> @@ -563,7 +621,7 @@ <j2seproject3:junit excludes="" includes="${test.includes}"/> </target> <target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single"> - <fail if="tests.failed">Some tests failed; see details above.</fail> + <fail if="tests.failed" unless="ignore.failing.tests">Some tests failed; see details above.</fail> </target> <target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/> <!--
--- a/nbproject/genfiles.properties Mon Nov 02 18:36:24 2009 +0300 +++ b/nbproject/genfiles.properties Mon Nov 02 23:17:40 2009 +0300 @@ -4,5 +4,5 @@ # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. nbproject/build-impl.xml.data.CRC32=8168bf3c -nbproject/build-impl.xml.script.CRC32=22b92b6d -nbproject/build-impl.xml.stylesheet.CRC32=65b8de21 +nbproject/build-impl.xml.script.CRC32=92172d17 +nbproject/build-impl.xml.stylesheet.CRC32=5c621a33@1.26.2.45
--- a/src/kryshen/catalina/startup/HomesUserConfig.java Mon Nov 02 18:36:24 2009 +0300 +++ b/src/kryshen/catalina/startup/HomesUserConfig.java Mon Nov 02 23:17:40 2009 +0300 @@ -6,6 +6,7 @@ package kryshen.catalina.startup; import java.io.File; +import org.apache.juli.logging.LogFactory; /** * @@ -13,26 +14,17 @@ */ public class HomesUserConfig extends UserConfig { - /** - * The directory name to be searched for within each user home directory. - */ - private String directoryName = "public_webapps"; + protected static org.apache.juli.logging.Log log = + org.apache.juli.logging.LogFactory.getLog(HomesUserConfig.class); + /** * The base directory containing user home directories. */ private String homeBase = null; - public String getDirectoryName() { - return directoryName; - } - /** - * Set the directory name for user web applications. - * - * @param directoryName The new directory name - */ - public void setDirectoryName(String directoryName) { - this.directoryName = directoryName; + public HomesUserConfig() { + log = LogFactory.getLog(HomesUserConfig.class); } /** @@ -56,7 +48,7 @@ File homeBaseFile = new File(homeBase); if (!homeBaseFile.exists() || !homeBaseFile.isDirectory()) { - host.getLogger().error("Invalid home base."); + log.error("Invalid home base."); return; } @@ -69,8 +61,7 @@ continue; } - File base = new File(home, directoryName); - deployUserApps(name, base); + deployUserApps(name, home); } } }
--- a/src/kryshen/catalina/startup/PasswdUserConfig.java Mon Nov 02 18:36:24 2009 +0300 +++ b/src/kryshen/catalina/startup/PasswdUserConfig.java Mon Nov 02 23:17:40 2009 +0300 @@ -1,5 +1,13 @@ package kryshen.catalina.startup; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.regex.Pattern; +import org.apache.juli.logging.LogFactory; + /** * * @author Mikhail Kryshen @@ -8,6 +16,11 @@ private static final String PASSWD_DATABASE = "passwd"; + /* Passwd format details. */ + private static final Pattern PASSWD_SPLIT_PATTERN = Pattern.compile(":"); + private static final int PASSWD_FIELD_USERNAME = 0; + private static final int PASSWD_FIELD_HOME = 5; + /** * Command for retrieving passwd database. */ @@ -18,6 +31,10 @@ */ private String passwd = "/etc/passwd"; + public PasswdUserConfig() { + log = LogFactory.getLog(PasswdUserConfig.class); + } + /** * Get command for retrieving passwd database. */ @@ -48,6 +65,43 @@ @Override protected void deployUserApps() { - // TODO + BufferedReader in; + + try { + if (getent == null) { + in = new BufferedReader(new FileReader(passwd)); + } else { + Process process = Runtime.getRuntime().exec( + getent, new String[]{PASSWD_DATABASE}); + + in = new BufferedReader( + new InputStreamReader(process.getInputStream())); + } + + String line; + + try { + while ((line = in.readLine()) != null) { + String[] fields = PASSWD_SPLIT_PATTERN.split(line); + + String name = fields[PASSWD_FIELD_USERNAME]; + File home = new File(fields[PASSWD_FIELD_HOME]); + + if (!home.isDirectory()) { + log.error("Invalid home directory for user" + + name + ": " + home.getPath() + "."); + continue; + } + + deployUserApps(name, home); + } + } finally { + in.close(); + } + } catch (IOException e) { + log.error("Error reading passwd database.", e); + } catch (ArrayIndexOutOfBoundsException e) { + log.error("Invalid passwd format.", e); + } } }
--- a/src/kryshen/catalina/startup/UserConfig.java Mon Nov 02 18:36:24 2009 +0300 +++ b/src/kryshen/catalina/startup/UserConfig.java Mon Nov 02 23:17:40 2009 +0300 @@ -2,6 +2,7 @@ import java.io.File; import org.apache.catalina.startup.HostConfig; +import org.apache.juli.logging.LogFactory; /** * @@ -9,6 +10,29 @@ */ public abstract class UserConfig extends HostConfig { + /** + * The directory name to be searched for within each user home directory. + */ + private String directoryName = "public_webapps"; + + + protected UserConfig() { + log = LogFactory.getLog(UserConfig.class); + } + + public String getDirectoryName() { + return directoryName; + } + + /** + * Set the directory name for user web applications. + * + * @param directoryName The new directory name + */ + public void setDirectoryName(String directoryName) { + this.directoryName = directoryName; + } + @Override protected void deployApps() { deployUserApps(); @@ -22,7 +46,9 @@ protected abstract void deployUserApps(); - protected void deployUserApps(String user, File base) { + protected void deployUserApps(String user, File home) { + File base = new File(home, directoryName); + if (!base.exists() || !base.isDirectory() || !base.canRead()) { return; } @@ -40,6 +66,7 @@ protected void deployDirectories(String user, File base, String[] files) { if (files == null) { + log.error("Error reading base directory: " + base.getPath() + "."); return; }