Hi Phil,

thank you for the help!
I'll check that class and will let you know.

Thanks again!
Regards,
Matteo



On 15/03/19 17:05, Phil Zampino wrote:
I was going to suggest that you might be experiencing a docker issue because the ext folder works; You beat me to it.

I'm not sure if this is what you're after, but org.apache.knox.gateway.security.SubjectUtils might be of use to you for identifying the currently logged-in principal.

On Fri, Mar 15, 2019 at 11:53 AM Matteo Alessandroni <skylar...@apache.org <mailto:skylar...@apache.org>> wrote:

    Ok I think I found the issue:
    I had to restart the full Docker container to actually restart Knox.
    So I did that and it seems it's getting my class in "ext/" now.

    The error I get now is:

    Caused by: org.apache.knox.gateway.config.ConfigurationException:
    Failed to find configuration for provider as provider of
    org.apache.knox.gateway.dispatch.MyCustomDispatch via
    org.apache.knox.gateway.config.FilterConfigurationAdapter

    so I guess it's a problem with my class code.
    Is there a very simple code snippetI could use for my custom
    dispatch in order to access the "request" object in order to get
    the name of the user that is currently logged?

    Regards,
    Matteo


    On 15/03/19 15:49, Matteo Alessandroni wrote:
    Thanks!
    I checked that too, my ".jar" has the same permissions of the
    other files in "lib/" folder (e.g. "gateway-shell-1.2.0.jar").
    I see your point about the script [1], but I also see that the
    original gateway.sh (for Knox v1.2.0) [2] is not doing anything
    special for the "ext/" folder, or am I wrong?

    Regards,
    Matteo


    [1]
    https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh
    [2]
    
https://github.com/apache/knox/blob/v1.2.0/gateway-release/home/bin/gateway.sh


    On 15/03/19 15:27, Sandeep Moré wrote:
    Ah, i missed the launcher.cfg, I see,
    https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh 
does
    not take into account a lot of environmental variables and new
    stuff that is included in the
    
https://github.com/apache/knox/blob/master/gateway-release/home/bin/gateway.sh
    that script is due for an update.

    The only other thing I can think of are the file permissions,
    make sure that your file can be read by knox.

    Best,
    Sandeep



    On Fri, Mar 15, 2019 at 10:09 AM Matteo Alessandroni
    <skylar...@apache.org <mailto:skylar...@apache.org>> wrote:

        Hi,

        I tried also the "lib/" folder, but same problem.
        About the configuration for classpath yes it should be
        correct because I have the "bin/gateway.cfg" file containing:

        #Created from
        jar:file:/knox-runtime/bin/gateway.jar!/META-INF/launcher.cfg
        #Thu Mar 14 10:10:31 GMT 2019
        GATEWAY_HOME=${launcher.dir}/..
        log4j.configuration=${GATEWAY_HOME}/conf/${launcher.name
        <http://launcher.name>}-log4j.properties
        main.class=org.apache.knox.gateway.GatewayServer
        class.path=../conf;../lib/*.jar;../dep/*.jar;../ext;../ext/*.jar

        so it should load the ".jar" files in those folders.

        Is there anything I can do to debug this?
        FYI I'm using this Docker image [1] to run Knox and after
        adding files to "ext/" or "lib/" I use this script [2] to
        restart Knox and it seems to restart well, but still not
        seeing my classes in classpath.

        Thanks


        [1] https://github.com/moresandeep/knox-dev-docker
        [2]
        
https://github.com/moresandeep/knox-dev-docker/blob/master/build/gateway.sh


        On 15/03/19 14:56, Sandeep Moré wrote:
        It should have picked it up, going through the gateway.sh
        file, I don't see any place where ext folder is added to
        class path, can you open a BUG for this ?

        as a workaround for this you can copy your jar into the lib
        folder and Knox should pick it up on the startup.

        Hopefully, this should help !

        Best,
        Sandepe


        On Fri, Mar 15, 2019 at 5:37 AM Matteo Alessandroni
        <skylar...@apache.org <mailto:skylar...@apache.org>> wrote:

            Hi Sandeep,

            thank you for your answer!
            Ok so I tried to change my project and adding a simple
            class like this:

            package com.test.ext;

            import java.io.IOException;
            import java.net.URI;
            import java.net.URISyntaxException;
            import javax.servlet.http.HttpServletRequest;
            import javax.servlet.http.HttpServletResponse;
            import org.apache.knox.gateway.config.Configure;
            import org.apache.knox.gateway.config.Default;
            import
            org.apache.knox.gateway.dispatch.AbstractGatewayDispatch;
            import org.slf4j.Logger;
            import org.slf4j.LoggerFactory;

            public class MyDispatch extends AbstractGatewayDispatch {

                private static final Logger LOG =
            LoggerFactory.getLogger(MyDispatch.class);

                @Override
                public void destroy() {
                    LOG.debug("******* destroy()");
                }

                @Configure
                protected void customMethod(@Default("Test") String
            test) {
                    LOG.debug("******* @Configure customMethod():
            {}", test);
                }

                @Override
                public void doGet(URI url, HttpServletRequest
            request, HttpServletResponse response)
                        throws IOException, URISyntaxException {

                    LOG.debug("******* doGet() request: {}, {}",
            request.getMethod(), new URI(request.getRequestURI()));

                    super.doGet(url, request, response);
                }

            }

            made the ".jar" and put in the "ext" folder.
            Executed the REST request again:

            curl -i -k -u admin:admin-password -X GET
            'https://localhost:8443/gateway/sandbox/webhdfs/v1/?op=LISTSTATUS'

            and I expected to see some logs, e.g. from the
            "doGet()" method (I'm not sure about the "@Configure"
            method, when should a method with that annotation be
            executed?), but it seems it does not see the class.
            So I tried to configure my topology to use the dispatch
            (as written on [1]):

            <service>
            <role>WEBHDFS</role>
                <url>http://hadoop-namenode:50070/webhdfs</url>

                <dispatch>
            <classname>com.test.ext.MyDispatch</classname>
            <use-two-way-ssl>false</use-two-way-ssl>
                </dispatch>
            </service>

            and after saving logs say:

            ERROR knox.gateway (GatewayFilter.java:doFilter(170)) -
            Gateway processing failed:
            javax.servlet.ServletException:
            org.apache.shiro.subject.ExecutionException:
            java.security.PrivilegedActionException:
            javax.servlet.ServletException:
            javax.servlet.ServletException:
            java.lang.ClassNotFoundException: com.test.ext.MyDispatch
            javax.servlet.ServletException:
            org.apache.shiro.subject.ExecutionException:
            java.security.PrivilegedActionException:
            javax.servlet.ServletException:
            javax.servlet.ServletException:
            *java.lang.ClassNotFoundException: com.test.ext.MyDispatch*

            so it's not seeing my class.
            What am I missing?

            Thank you!

            Matteo


            [1]
            https://knox.apache.org/books/knox-1-3-0/dev-guide.html#service.xml


            On 14/03/19 20:47, Sandeep Moré wrote:
            Hello Matteo,

            I don't think this is a right way to add filters to
            Knox, if you want to add some custom logic between
            your Knox and the backend you can  write custom
            dispatch [1]
            you can add this new jar in the ext folder and it
            should be picked up by Knox on start-up.

            [1]
            
https://knox.apache.org/books/knox-1-3-0/dev-guide.html#Custom+Dispatch+Dependency+Injection


            On Thu, Mar 14, 2019 at 12:52 PM Matteo Alessandroni
            <skylar...@apache.org <mailto:skylar...@apache.org>>
            wrote:

                Hi,

                I'm trying to add a filter on a Knox instance so
                that I'll be able to add a custom logic to (every
                / specific) REST requests to Knox.
                I thought to use the "Class Path" feature [1], so
                I created a Maven Java project, generated a ".jar"
                file and placed it in the "$GATEWAY_HOME/ext" folder
                Then, I thought it was necessary to link my custom
                class [2] on the "gateway.xml" files of the
                resources I wanted, e.g.

                
./data/deployments/sandbox.topo.16977ef2478/%2F/WEB-INF/gateway.xml

                added:

                <filter>
                <role>rewrite</role>
                <name>url-rewrite</name>
                <class>com.test.knox.MyUrlRewriteServletFilter</class>
                </filter>

                then I made a REST request to Knox:

                curl -i -k -u admin:admin-password -X GET
                
'https://localhost:8443/gateway/sandbox/webhdfs/v1/?op=LISTSTATUS'

                but my filter is not called at all (I cannot see
                the log) and I'm not sure whether it's because the
                class is not loaded or the filter is placed in the
                wrong place or whatever.

                On [4] you can see the project I have built.

                So my questions are:

                  * what am I doing wrong or missing?
                  * is there a better way to do that? I just need
                    to add a logic when executing REST requests to
                    Knox and make another REST call to an external
                    service I need.


                Thank you!
                Regards,
                Matteo

                [1]
                
https://knox.apache.org/books/knox-1-2-0/dev-guide.html#Class+Path
                [2]
                
https://github.com/mat-ale/apache-knox-filter/blob/master/src/main/java/com/plainid/ext/MyUrlRewriteServletFilter.java
                [3]
                [4] https://github.com/mat-ale/apache-knox-filter








Reply via email to