You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@continuum.apache.org by ca...@apache.org on 2008/04/19 05:17:09 UTC

svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java

Author: carlos
Date: Fri Apr 18 20:17:07 2008
New Revision: 649749

URL: http://svn.apache.org/viewvc?rev=649749&view=rev
Log:
[CONTINUUM-1731] Add some commands to use a chroot jail in the build executor, keeping previous functionality unmodified

Added:
    continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java   (with props)
Modified:
    continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java

Modified: continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java?rev=649749&r1=649748&r2=649749&view=diff
==============================================================================
--- continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java (original)
+++ continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java Fri Apr 18 20:17:07 2008
@@ -19,6 +19,7 @@
  * under the License.
  */
 
+import org.apache.maven.continuum.configuration.ConfigurationService;
 import org.apache.maven.continuum.installation.InstallationService;
 import org.apache.maven.continuum.model.project.BuildDefinition;
 import org.apache.maven.continuum.model.project.Project;
@@ -51,6 +52,9 @@
     extends AbstractLogEnabled
     implements ContinuumBuildExecutor, Initializable
 {
+    private static final String SUDO_EXECUTABLE = "sudo";
+    private static final String CHROOT_EXECUTABLE = "chroot";
+
     // ----------------------------------------------------------------------
     //
     // ----------------------------------------------------------------------
@@ -78,6 +82,11 @@
     /**
      * @plexus.configuration
      */
+    private File chrootJailDirectory;
+
+    /**
+     * @plexus.configuration
+     */
     private String defaultExecutable;
 
     // ----------------------------------------------------------------------
@@ -232,6 +241,26 @@
 
         try
         {
+            File chrootJailDirectory = getChrootJailDirectory();
+            if ( chrootJailDirectory != null )
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.append( CHROOT_EXECUTABLE );
+                sb.append( " " );
+                sb.append( new File( chrootJailDirectory, project.getGroupId() ) );
+                sb.append( " " );
+                sb.append( " cd " );
+                sb.append( getRelativePath( chrootJailDirectory, workingDirectory, project.getGroupId() ) );
+                sb.append( " && " );
+                sb.append( actualExecutable );
+                sb.append( " " );
+                sb.append( arguments );
+
+                arguments = sb.toString();
+                actualExecutable = SUDO_EXECUTABLE;
+                workingDirectory = chrootJailDirectory; // not really used but must exist
+            }
+
             ExecutionResult result =
                 getShellCommandHelper().executeShellCommand( workingDirectory, actualExecutable, arguments, output,
                                                              project.getId(), environments );
@@ -260,6 +289,21 @@
         }
     }
 
+    private String getRelativePath( File chrootDir, File workingDirectory, String groupId )
+    {
+        String path = workingDirectory.getPath();
+        String chrootBase = new File( chrootDir, groupId ).getPath();
+        if ( path.startsWith( chrootBase ) )
+        {
+            return path.substring( chrootBase.length(), path.length() );
+        }
+        else
+        {
+            throw new IllegalArgumentException( "Working directory is not inside the chroot jail " + chrootBase +
+                " , " + path );
+        }
+    }
+
     protected abstract Map<String, String> getEnvironments( BuildDefinition buildDefinition );
 
     protected String getJavaHomeValue( BuildDefinition buildDefinition )
@@ -374,5 +418,15 @@
     public void setExecutableResolver( ExecutableResolver executableResolver )
     {
         this.executableResolver = executableResolver;
+    }
+
+    public void setChrootJailDirectory( File chrootJailDirectory )
+    {
+        this.chrootJailDirectory = chrootJailDirectory;
+    }
+
+    public File getChrootJailDirectory()
+    {
+        return chrootJailDirectory;
     }
 }

Added: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
URL: http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java?rev=649749&view=auto
==============================================================================
--- continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java (added)
+++ continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java Fri Apr 18 20:17:07 2008
@@ -0,0 +1,141 @@
+package org.apache.maven.continuum.execution;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import junit.framework.TestCase;
+
+import org.apache.maven.continuum.configuration.ConfigurationService;
+import org.apache.maven.continuum.configuration.DefaultConfigurationService;
+import org.apache.maven.continuum.model.project.BuildDefinition;
+import org.apache.maven.continuum.model.project.Project;
+import org.apache.maven.continuum.model.project.ProjectGroup;
+import org.apache.maven.continuum.utils.ChrootJailWorkingDirectoryService;
+import org.apache.maven.continuum.utils.shell.ExecutionResult;
+import org.apache.maven.continuum.utils.shell.ShellCommandHelper;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
+import org.jmock.Expectations;
+import org.jmock.Mock;
+import org.jmock.Mockery;
+import org.jmock.core.Constraint;
+
+public class AbstractContinuumBuildExecutorTest
+    extends TestCase
+{
+    protected AbstractBuildExecutor executor = new BuildExecutorStub();
+
+    private Mockery context = new Mockery();
+
+    private String toSystemPath( String path )
+    {
+        if ( File.separator.equals( "\\" ) )
+        {
+            return path.replaceAll( "/", "\\" + File.separator );
+        }
+        return path;
+    }
+
+    public void testExecuteShellCommand()
+        throws Exception
+    {
+        final File chrootJailFile = new File( toSystemPath( "/home" ) );
+        final File workingDirectory = new File( toSystemPath( "/dir1/dir2/workingdir" ) );
+
+        final ShellCommandHelper helper = context.mock( ShellCommandHelper.class );
+
+        ConfigurationService configurationService = new DefaultConfigurationService()
+        {
+            @Override
+            public File getWorkingDirectory()
+            {
+                return workingDirectory;
+            }
+        };
+
+        ChrootJailWorkingDirectoryService directoryService = new ChrootJailWorkingDirectoryService();
+        directoryService.setConfigurationService( configurationService );
+        directoryService.setChrootJailDirectory( chrootJailFile );
+
+        executor.setChrootJailDirectory( chrootJailFile );
+        executor.setShellCommandHelper( helper );
+        executor.setWorkingDirectoryService( directoryService );
+        executor.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "" ) );
+
+        final Project project = new Project();
+        project.setId( 7 );
+        project.setGroupId( "xx" );
+        ProjectGroup projectGroup = new ProjectGroup();
+        projectGroup.setGroupId( project.getGroupId() );
+        project.setProjectGroup( projectGroup );
+
+        assertEquals( toSystemPath( chrootJailFile.getPath() + "/" + project.getGroupId() + workingDirectory.getPath() +
+            "/" + project.getId() ), directoryService.getWorkingDirectory( project ).getPath() );
+
+        String executable = "mvn";
+        final String arguments = "-o clean install";
+        final File output = new File( "target/tmp" );
+        final Map<String, String> environments = new HashMap<String, String>();
+
+        final String cmd =
+            "chroot /home/xx " + " cd /dir1/dir2/workingdir/" + project.getId() + " && " + executable + " " + arguments;
+        // Constraint[] args =
+        // new Constraint[] { eq( chrootJailFile ), eq( "sudo" ), eq( toSystemPath( cmd ) ), eq( output ),
+        // eq( project.getId() ), eq( environments ) };
+        final ExecutionResult result = new ExecutionResult( 0 );
+
+        context.checking( new Expectations()
+        {
+            {
+                one( helper ).executeShellCommand( chrootJailFile, "sudo", toSystemPath( cmd ), output,
+                                                   project.getId(), environments );
+                will( returnValue( result ) );
+            }
+        } );
+
+        // helperMock.expects( once() ).method( "executeShellCommand" ).with( args ).will( returnValue( result ) );
+
+        executor.executeShellCommand( project, executable, arguments, output, environments );
+
+        context.assertIsSatisfied();
+        // super.verify();
+    }
+
+    class BuildExecutorStub
+        extends AbstractBuildExecutor
+    {
+
+        protected BuildExecutorStub()
+        {
+            super( "stub", true );
+        }
+
+        protected String findExecutable( Project project, String executable, String defaultExecutable,
+                                         boolean resolveExecutable, File workingDirectory )
+        {
+            return executable;
+        }
+
+        @Override
+        protected Map<String, String> getEnvironments( BuildDefinition buildDefinition )
+        {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public ContinuumBuildExecutionResult build( Project project, BuildDefinition buildDefinition, File buildOutput )
+            throws ContinuumBuildExecutorException
+        {
+            // TODO Auto-generated method stub
+            return null;
+        }
+
+        public void updateProjectFromCheckOut( File workingDirectory, Project project, BuildDefinition buildDefinition )
+            throws ContinuumBuildExecutorException
+        {
+            // TODO Auto-generated method stub
+
+        }
+    }
+}

Propchange: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"



Re: svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java

Posted by Emmanuel Venisse <em...@gmail.com>.
On Thu, Apr 24, 2008 at 9:39 AM, Wendy Smoak <ws...@gmail.com> wrote:

> On Mon, Apr 21, 2008 at 9:32 PM, Emmanuel Venisse
> <em...@gmail.com> wrote:
>
> > Is it work on windows??? chroot/sudo aren't DOS commands.
>
> My guess is no, but as long as it's an optional thing I don't see a
> problem with it.  Emm, are you thinking it will be a problem for
> Windows users?


oh, if it is optional and not used by default, it is ok.

Emmanuel

Re: svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java

Posted by Wendy Smoak <ws...@gmail.com>.
On Mon, Apr 21, 2008 at 9:32 PM, Emmanuel Venisse
<em...@gmail.com> wrote:

> Is it work on windows??? chroot/sudo aren't DOS commands.

My guess is no, but as long as it's an optional thing I don't see a
problem with it.  Emm, are you thinking it will be a problem for
Windows users?

-- 
Wendy

Re: svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java

Posted by Emmanuel Venisse <em...@gmail.com>.
ping

On Mon, Apr 21, 2008 at 3:32 PM, Emmanuel Venisse <
emmanuel.venisse@gmail.com> wrote:

> Is it work on windows??? chroot/sudo aren't DOS commands.
>
> Emmanuel
>
>
> On Sat, Apr 19, 2008 at 5:17 AM, <ca...@apache.org> wrote:
>
> > Author: carlos
> > Date: Fri Apr 18 20:17:07 2008
> > New Revision: 649749
> >
> > URL: http://svn.apache.org/viewvc?rev=649749&view=rev
> > Log:
> > [CONTINUUM-1731] Add some commands to use a chroot jail in the build
> > executor, keeping previous functionality unmodified
> >
> > Added:
> >
> >  continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> >   (with props)
> > Modified:
> >
> >  continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> >
> > Modified:
> > continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> > URL:
> > http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java?rev=649749&r1=649748&r2=649749&view=diff
> >
> > ==============================================================================
> > ---
> > continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> > (original)
> > +++
> > continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> > Fri Apr 18 20:17:07 2008
> > @@ -19,6 +19,7 @@
> >  * under the License.
> >  */
> >
> > +import org.apache.maven.continuum.configuration.ConfigurationService;
> >  import org.apache.maven.continuum.installation.InstallationService;
> >  import org.apache.maven.continuum.model.project.BuildDefinition;
> >  import org.apache.maven.continuum.model.project.Project;
> > @@ -51,6 +52,9 @@
> >     extends AbstractLogEnabled
> >     implements ContinuumBuildExecutor, Initializable
> >  {
> > +    private static final String SUDO_EXECUTABLE = "sudo";
> > +    private static final String CHROOT_EXECUTABLE = "chroot";
> > +
> >     //
> > ----------------------------------------------------------------------
> >     //
> >     //
> > ----------------------------------------------------------------------
> > @@ -78,6 +82,11 @@
> >     /**
> >      * @plexus.configuration
> >      */
> > +    private File chrootJailDirectory;
> > +
> > +    /**
> > +     * @plexus.configuration
> > +     */
> >     private String defaultExecutable;
> >
> >     //
> > ----------------------------------------------------------------------
> > @@ -232,6 +241,26 @@
> >
> >         try
> >         {
> > +            File chrootJailDirectory = getChrootJailDirectory();
> > +            if ( chrootJailDirectory != null )
> > +            {
> > +                StringBuilder sb = new StringBuilder();
> > +                sb.append( CHROOT_EXECUTABLE );
> > +                sb.append( " " );
> > +                sb.append( new File( chrootJailDirectory,
> > project.getGroupId() ) );
> > +                sb.append( " " );
> > +                sb.append( " cd " );
> > +                sb.append( getRelativePath( chrootJailDirectory,
> > workingDirectory, project.getGroupId() ) );
> > +                sb.append( " && " );
> > +                sb.append( actualExecutable );
> > +                sb.append( " " );
> > +                sb.append( arguments );
> > +
> > +                arguments = sb.toString();
> > +                actualExecutable = SUDO_EXECUTABLE;
> > +                workingDirectory = chrootJailDirectory; // not really
> > used but must exist
> > +            }
> > +
> >             ExecutionResult result =
> >                 getShellCommandHelper().executeShellCommand(
> > workingDirectory, actualExecutable, arguments, output,
> >
> >  project.getId(), environments );
> > @@ -260,6 +289,21 @@
> >         }
> >     }
> >
> > +    private String getRelativePath( File chrootDir, File
> > workingDirectory, String groupId )
> > +    {
> > +        String path = workingDirectory.getPath();
> > +        String chrootBase = new File( chrootDir, groupId ).getPath();
> > +        if ( path.startsWith( chrootBase ) )
> > +        {
> > +            return path.substring( chrootBase.length(), path.length()
> > );
> > +        }
> > +        else
> > +        {
> > +            throw new IllegalArgumentException( "Working directory is
> > not inside the chroot jail " + chrootBase +
> > +                " , " + path );
> > +        }
> > +    }
> > +
> >     protected abstract Map<String, String> getEnvironments(
> > BuildDefinition buildDefinition );
> >
> >     protected String getJavaHomeValue( BuildDefinition buildDefinition )
> > @@ -374,5 +418,15 @@
> >     public void setExecutableResolver( ExecutableResolver
> > executableResolver )
> >     {
> >         this.executableResolver = executableResolver;
> > +    }
> > +
> > +    public void setChrootJailDirectory( File chrootJailDirectory )
> > +    {
> > +        this.chrootJailDirectory = chrootJailDirectory;
> > +    }
> > +
> > +    public File getChrootJailDirectory()
> > +    {
> > +        return chrootJailDirectory;
> >     }
> >  }
> >
> > Added:
> > continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> > URL:
> > http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java?rev=649749&view=auto
> >
> > ==============================================================================
> > ---
> > continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> > (added)
> > +++
> > continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> > Fri Apr 18 20:17:07 2008
> > @@ -0,0 +1,141 @@
> > +package org.apache.maven.continuum.execution;
> > +
> > +import java.io.File;
> > +import java.util.HashMap;
> > +import java.util.Map;
> > +
> > +import junit.framework.TestCase;
> > +
> > +import org.apache.maven.continuum.configuration.ConfigurationService;
> > +import
> > org.apache.maven.continuum.configuration.DefaultConfigurationService;
> > +import org.apache.maven.continuum.model.project.BuildDefinition;
> > +import org.apache.maven.continuum.model.project.Project;
> > +import org.apache.maven.continuum.model.project.ProjectGroup;
> > +import
> > org.apache.maven.continuum.utils.ChrootJailWorkingDirectoryService;
> > +import org.apache.maven.continuum.utils.shell.ExecutionResult;
> > +import org.apache.maven.continuum.utils.shell.ShellCommandHelper;
> > +import org.codehaus.plexus.logging.Logger;
> > +import org.codehaus.plexus.logging.console.ConsoleLogger;
> > +import org.jmock.Expectations;
> > +import org.jmock.Mock;
> > +import org.jmock.Mockery;
> > +import org.jmock.core.Constraint;
> > +
> > +public class AbstractContinuumBuildExecutorTest
> > +    extends TestCase
> > +{
> > +    protected AbstractBuildExecutor executor = new BuildExecutorStub();
> > +
> > +    private Mockery context = new Mockery();
> > +
> > +    private String toSystemPath( String path )
> > +    {
> > +        if ( File.separator.equals( "\\" ) )
> > +        {
> > +            return path.replaceAll( "/", "\\" + File.separator );
> > +        }
> > +        return path;
> > +    }
> > +
> > +    public void testExecuteShellCommand()
> > +        throws Exception
> > +    {
> > +        final File chrootJailFile = new File( toSystemPath( "/home" )
> > );
> > +        final File workingDirectory = new File( toSystemPath(
> > "/dir1/dir2/workingdir" ) );
> > +
> > +        final ShellCommandHelper helper = context.mock(
> > ShellCommandHelper.class );
> > +
> > +        ConfigurationService configurationService = new
> > DefaultConfigurationService()
> > +        {
> > +            @Override
> > +            public File getWorkingDirectory()
> > +            {
> > +                return workingDirectory;
> > +            }
> > +        };
> > +
> > +        ChrootJailWorkingDirectoryService directoryService = new
> > ChrootJailWorkingDirectoryService();
> > +        directoryService.setConfigurationService( configurationService
> > );
> > +        directoryService.setChrootJailDirectory( chrootJailFile );
> > +
> > +        executor.setChrootJailDirectory( chrootJailFile );
> > +        executor.setShellCommandHelper( helper );
> > +        executor.setWorkingDirectoryService( directoryService );
> > +        executor.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG,
> > "" ) );
> > +
> > +        final Project project = new Project();
> > +        project.setId( 7 );
> > +        project.setGroupId( "xx" );
> > +        ProjectGroup projectGroup = new ProjectGroup();
> > +        projectGroup.setGroupId( project.getGroupId() );
> > +        project.setProjectGroup( projectGroup );
> > +
> > +        assertEquals( toSystemPath( chrootJailFile.getPath() + "/" +
> > project.getGroupId() + workingDirectory.getPath() +
> > +            "/" + project.getId() ),
> > directoryService.getWorkingDirectory( project ).getPath() );
> > +
> > +        String executable = "mvn";
> > +        final String arguments = "-o clean install";
> > +        final File output = new File( "target/tmp" );
> > +        final Map<String, String> environments = new HashMap<String,
> > String>();
> > +
> > +        final String cmd =
> > +            "chroot /home/xx " + " cd /dir1/dir2/workingdir/" +
> > project.getId() + " && " + executable + " " + arguments;
> > +        // Constraint[] args =
> > +        // new Constraint[] { eq( chrootJailFile ), eq( "sudo" ), eq(
> > toSystemPath( cmd ) ), eq( output ),
> > +        // eq( project.getId() ), eq( environments ) };
> > +        final ExecutionResult result = new ExecutionResult( 0 );
> > +
> > +        context.checking( new Expectations()
> > +        {
> > +            {
> > +                one( helper ).executeShellCommand( chrootJailFile,
> > "sudo", toSystemPath( cmd ), output,
> > +                                                   project.getId(),
> > environments );
> > +                will( returnValue( result ) );
> > +            }
> > +        } );
> > +
> > +        // helperMock.expects( once() ).method( "executeShellCommand"
> > ).with( args ).will( returnValue( result ) );
> > +
> > +        executor.executeShellCommand( project, executable, arguments,
> > output, environments );
> > +
> > +        context.assertIsSatisfied();
> > +        // super.verify();
> > +    }
> > +
> > +    class BuildExecutorStub
> > +        extends AbstractBuildExecutor
> > +    {
> > +
> > +        protected BuildExecutorStub()
> > +        {
> > +            super( "stub", true );
> > +        }
> > +
> > +        protected String findExecutable( Project project, String
> > executable, String defaultExecutable,
> > +                                         boolean resolveExecutable,
> > File workingDirectory )
> > +        {
> > +            return executable;
> > +        }
> > +
> > +        @Override
> > +        protected Map<String, String> getEnvironments( BuildDefinition
> > buildDefinition )
> > +        {
> > +            // TODO Auto-generated method stub
> > +            return null;
> > +        }
> > +
> > +        public ContinuumBuildExecutionResult build( Project project,
> > BuildDefinition buildDefinition, File buildOutput )
> > +            throws ContinuumBuildExecutorException
> > +        {
> > +            // TODO Auto-generated method stub
> > +            return null;
> > +        }
> > +
> > +        public void updateProjectFromCheckOut( File workingDirectory,
> > Project project, BuildDefinition buildDefinition )
> > +            throws ContinuumBuildExecutorException
> > +        {
> > +            // TODO Auto-generated method stub
> > +
> > +        }
> > +    }
> > +}
> >
> > Propchange:
> > continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> >
> > ------------------------------------------------------------------------------
> >    svn:eol-style = native
> >
> > Propchange:
> > continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> >
> > ------------------------------------------------------------------------------
> >    svn:keywords = "Author Date Id Revision"
> >
> >
> >
>

Re: svn commit: r649749 - in /continuum/trunk/continuum-core/src: main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java

Posted by Emmanuel Venisse <em...@gmail.com>.
Is it work on windows??? chroot/sudo aren't DOS commands.

Emmanuel

On Sat, Apr 19, 2008 at 5:17 AM, <ca...@apache.org> wrote:

> Author: carlos
> Date: Fri Apr 18 20:17:07 2008
> New Revision: 649749
>
> URL: http://svn.apache.org/viewvc?rev=649749&view=rev
> Log:
> [CONTINUUM-1731] Add some commands to use a chroot jail in the build
> executor, keeping previous functionality unmodified
>
> Added:
>
>  continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
>   (with props)
> Modified:
>
>  continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
>
> Modified:
> continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> URL:
> http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java?rev=649749&r1=649748&r2=649749&view=diff
>
> ==============================================================================
> ---
> continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> (original)
> +++
> continuum/trunk/continuum-core/src/main/java/org/apache/maven/continuum/execution/AbstractBuildExecutor.java
> Fri Apr 18 20:17:07 2008
> @@ -19,6 +19,7 @@
>  * under the License.
>  */
>
> +import org.apache.maven.continuum.configuration.ConfigurationService;
>  import org.apache.maven.continuum.installation.InstallationService;
>  import org.apache.maven.continuum.model.project.BuildDefinition;
>  import org.apache.maven.continuum.model.project.Project;
> @@ -51,6 +52,9 @@
>     extends AbstractLogEnabled
>     implements ContinuumBuildExecutor, Initializable
>  {
> +    private static final String SUDO_EXECUTABLE = "sudo";
> +    private static final String CHROOT_EXECUTABLE = "chroot";
> +
>     //
> ----------------------------------------------------------------------
>     //
>     //
> ----------------------------------------------------------------------
> @@ -78,6 +82,11 @@
>     /**
>      * @plexus.configuration
>      */
> +    private File chrootJailDirectory;
> +
> +    /**
> +     * @plexus.configuration
> +     */
>     private String defaultExecutable;
>
>     //
> ----------------------------------------------------------------------
> @@ -232,6 +241,26 @@
>
>         try
>         {
> +            File chrootJailDirectory = getChrootJailDirectory();
> +            if ( chrootJailDirectory != null )
> +            {
> +                StringBuilder sb = new StringBuilder();
> +                sb.append( CHROOT_EXECUTABLE );
> +                sb.append( " " );
> +                sb.append( new File( chrootJailDirectory,
> project.getGroupId() ) );
> +                sb.append( " " );
> +                sb.append( " cd " );
> +                sb.append( getRelativePath( chrootJailDirectory,
> workingDirectory, project.getGroupId() ) );
> +                sb.append( " && " );
> +                sb.append( actualExecutable );
> +                sb.append( " " );
> +                sb.append( arguments );
> +
> +                arguments = sb.toString();
> +                actualExecutable = SUDO_EXECUTABLE;
> +                workingDirectory = chrootJailDirectory; // not really
> used but must exist
> +            }
> +
>             ExecutionResult result =
>                 getShellCommandHelper().executeShellCommand(
> workingDirectory, actualExecutable, arguments, output,
>
>  project.getId(), environments );
> @@ -260,6 +289,21 @@
>         }
>     }
>
> +    private String getRelativePath( File chrootDir, File
> workingDirectory, String groupId )
> +    {
> +        String path = workingDirectory.getPath();
> +        String chrootBase = new File( chrootDir, groupId ).getPath();
> +        if ( path.startsWith( chrootBase ) )
> +        {
> +            return path.substring( chrootBase.length(), path.length() );
> +        }
> +        else
> +        {
> +            throw new IllegalArgumentException( "Working directory is not
> inside the chroot jail " + chrootBase +
> +                " , " + path );
> +        }
> +    }
> +
>     protected abstract Map<String, String> getEnvironments(
> BuildDefinition buildDefinition );
>
>     protected String getJavaHomeValue( BuildDefinition buildDefinition )
> @@ -374,5 +418,15 @@
>     public void setExecutableResolver( ExecutableResolver
> executableResolver )
>     {
>         this.executableResolver = executableResolver;
> +    }
> +
> +    public void setChrootJailDirectory( File chrootJailDirectory )
> +    {
> +        this.chrootJailDirectory = chrootJailDirectory;
> +    }
> +
> +    public File getChrootJailDirectory()
> +    {
> +        return chrootJailDirectory;
>     }
>  }
>
> Added:
> continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> URL:
> http://svn.apache.org/viewvc/continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java?rev=649749&view=auto
>
> ==============================================================================
> ---
> continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> (added)
> +++
> continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
> Fri Apr 18 20:17:07 2008
> @@ -0,0 +1,141 @@
> +package org.apache.maven.continuum.execution;
> +
> +import java.io.File;
> +import java.util.HashMap;
> +import java.util.Map;
> +
> +import junit.framework.TestCase;
> +
> +import org.apache.maven.continuum.configuration.ConfigurationService;
> +import
> org.apache.maven.continuum.configuration.DefaultConfigurationService;
> +import org.apache.maven.continuum.model.project.BuildDefinition;
> +import org.apache.maven.continuum.model.project.Project;
> +import org.apache.maven.continuum.model.project.ProjectGroup;
> +import
> org.apache.maven.continuum.utils.ChrootJailWorkingDirectoryService;
> +import org.apache.maven.continuum.utils.shell.ExecutionResult;
> +import org.apache.maven.continuum.utils.shell.ShellCommandHelper;
> +import org.codehaus.plexus.logging.Logger;
> +import org.codehaus.plexus.logging.console.ConsoleLogger;
> +import org.jmock.Expectations;
> +import org.jmock.Mock;
> +import org.jmock.Mockery;
> +import org.jmock.core.Constraint;
> +
> +public class AbstractContinuumBuildExecutorTest
> +    extends TestCase
> +{
> +    protected AbstractBuildExecutor executor = new BuildExecutorStub();
> +
> +    private Mockery context = new Mockery();
> +
> +    private String toSystemPath( String path )
> +    {
> +        if ( File.separator.equals( "\\" ) )
> +        {
> +            return path.replaceAll( "/", "\\" + File.separator );
> +        }
> +        return path;
> +    }
> +
> +    public void testExecuteShellCommand()
> +        throws Exception
> +    {
> +        final File chrootJailFile = new File( toSystemPath( "/home" ) );
> +        final File workingDirectory = new File( toSystemPath(
> "/dir1/dir2/workingdir" ) );
> +
> +        final ShellCommandHelper helper = context.mock(
> ShellCommandHelper.class );
> +
> +        ConfigurationService configurationService = new
> DefaultConfigurationService()
> +        {
> +            @Override
> +            public File getWorkingDirectory()
> +            {
> +                return workingDirectory;
> +            }
> +        };
> +
> +        ChrootJailWorkingDirectoryService directoryService = new
> ChrootJailWorkingDirectoryService();
> +        directoryService.setConfigurationService( configurationService );
> +        directoryService.setChrootJailDirectory( chrootJailFile );
> +
> +        executor.setChrootJailDirectory( chrootJailFile );
> +        executor.setShellCommandHelper( helper );
> +        executor.setWorkingDirectoryService( directoryService );
> +        executor.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, ""
> ) );
> +
> +        final Project project = new Project();
> +        project.setId( 7 );
> +        project.setGroupId( "xx" );
> +        ProjectGroup projectGroup = new ProjectGroup();
> +        projectGroup.setGroupId( project.getGroupId() );
> +        project.setProjectGroup( projectGroup );
> +
> +        assertEquals( toSystemPath( chrootJailFile.getPath() + "/" +
> project.getGroupId() + workingDirectory.getPath() +
> +            "/" + project.getId() ),
> directoryService.getWorkingDirectory( project ).getPath() );
> +
> +        String executable = "mvn";
> +        final String arguments = "-o clean install";
> +        final File output = new File( "target/tmp" );
> +        final Map<String, String> environments = new HashMap<String,
> String>();
> +
> +        final String cmd =
> +            "chroot /home/xx " + " cd /dir1/dir2/workingdir/" +
> project.getId() + " && " + executable + " " + arguments;
> +        // Constraint[] args =
> +        // new Constraint[] { eq( chrootJailFile ), eq( "sudo" ), eq(
> toSystemPath( cmd ) ), eq( output ),
> +        // eq( project.getId() ), eq( environments ) };
> +        final ExecutionResult result = new ExecutionResult( 0 );
> +
> +        context.checking( new Expectations()
> +        {
> +            {
> +                one( helper ).executeShellCommand( chrootJailFile,
> "sudo", toSystemPath( cmd ), output,
> +                                                   project.getId(),
> environments );
> +                will( returnValue( result ) );
> +            }
> +        } );
> +
> +        // helperMock.expects( once() ).method( "executeShellCommand"
> ).with( args ).will( returnValue( result ) );
> +
> +        executor.executeShellCommand( project, executable, arguments,
> output, environments );
> +
> +        context.assertIsSatisfied();
> +        // super.verify();
> +    }
> +
> +    class BuildExecutorStub
> +        extends AbstractBuildExecutor
> +    {
> +
> +        protected BuildExecutorStub()
> +        {
> +            super( "stub", true );
> +        }
> +
> +        protected String findExecutable( Project project, String
> executable, String defaultExecutable,
> +                                         boolean resolveExecutable, File
> workingDirectory )
> +        {
> +            return executable;
> +        }
> +
> +        @Override
> +        protected Map<String, String> getEnvironments( BuildDefinition
> buildDefinition )
> +        {
> +            // TODO Auto-generated method stub
> +            return null;
> +        }
> +
> +        public ContinuumBuildExecutionResult build( Project project,
> BuildDefinition buildDefinition, File buildOutput )
> +            throws ContinuumBuildExecutorException
> +        {
> +            // TODO Auto-generated method stub
> +            return null;
> +        }
> +
> +        public void updateProjectFromCheckOut( File workingDirectory,
> Project project, BuildDefinition buildDefinition )
> +            throws ContinuumBuildExecutorException
> +        {
> +            // TODO Auto-generated method stub
> +
> +        }
> +    }
> +}
>
> Propchange:
> continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
>
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Propchange:
> continuum/trunk/continuum-core/src/test/java/org/apache/maven/continuum/execution/AbstractContinuumBuildExecutorTest.java
>
> ------------------------------------------------------------------------------
>    svn:keywords = "Author Date Id Revision"
>
>
>