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 <[email protected]>
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}-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 <[email protected]>
> 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 <
>> [email protected]> 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