From b593a097d2ada3ebda4a2440c256f8dae533cb7e Mon Sep 17 00:00:00 2001
From: rsanchez <rsanchez@curisit.net>
Date: Fri, 26 Sep 2014 16:13:51 +0000
Subject: [PATCH] #2021 feature - Added packaging to Maven building and command line commands [start|stop]

---
 securis/etc/build/files/securis-server.bat                   |    4 
 securis/etc/build/pro/mvn_descriptor.xml                     |   39 +++
 securis/etc/build/files/securis-server.sh                    |    4 
 /dev/null                                                    |  143 --------------
 securis/etc/build/files/config/log4j2.xml                    |   42 ++++
 securis/src/main/java/net/curisit/securis/SeCurisServer.java |  234 +++++++++++++++++++++++
 securis/pom.xml                                              |   20 +
 securis/src/main/resources/log4j2.xml                        |   31 ++
 securis/etc/build/files/README                               |   10 +
 securis/etc/build/files/config/securis-server.properties     |   14 +
 10 files changed, 388 insertions(+), 153 deletions(-)

diff --git a/securis/etc/build/files/README b/securis/etc/build/files/README
new file mode 100644
index 0000000..3b2ce52
--- /dev/null
+++ b/securis/etc/build/files/README
@@ -0,0 +1,10 @@
+SeCuris server
+==============
+
+Updated doc: https://redmine.curistec.com/projects/securis/wiki/HowToSeCurisClient
+
+Creation of a request file
+For a manual activation, a request file should be sent to SeCuris administrator, to create a request file we can execute:
+
+  $ ./securis-server.sh start
+
diff --git a/securis/etc/build/files/config/log4j2.xml b/securis/etc/build/files/config/log4j2.xml
new file mode 100644
index 0000000..3ad030d
--- /dev/null
+++ b/securis/etc/build/files/config/log4j2.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Configuration>
+  <Appenders>
+
+    <RollingFileAppender name="defaultFile" fileName="${sys:user.home}/.SeCuris/logs/securis-server.log" append="true"
+    		filePattern="${sys:user.home}/.SeCuris/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">
+       <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+	  <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true" />
+      </Policies>
+		<DefaultRolloverStrategy max="10"/>
+    </RollingFileAppender>
+	<Async name="defaultFileAsync" includeLocation="true">
+      <AppenderRef ref="defaultFile"/>
+    </Async>
+   
+    <Console name="stdout" target="SYSTEM_OUT">
+      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+    </Console>
+
+    <Console name="console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%m%n"/>
+    </Console>
+
+   </Appenders>
+  <Loggers>
+    
+    <Logger name="net.curisit" level="INFO" additivity="false">
+      <AppenderRef ref="defaultFileAsync"/>
+      <AppenderRef ref="stdout"/>
+    </Logger>
+   
+    <Logger name="console" level="INFO" additivity="false">
+      <AppenderRef ref="console"/>
+    </Logger>
+   
+    <Root level="INFO" >
+      <AppenderRef ref="stdout"/>
+    </Root>
+
+  </Loggers>
+</Configuration>
diff --git a/securis/etc/build/files/config/securis-server.properties b/securis/etc/build/files/config/securis-server.properties
new file mode 100644
index 0000000..80f083f
--- /dev/null
+++ b/securis/etc/build/files/config/securis-server.properties
@@ -0,0 +1,14 @@
+#########################################################################
+#                                                                       #
+# Modify the current file using the proper values for you environment   #
+#                                                                       #
+#########################################################################
+
+license.server.hostname = 0.0.0.0
+license.server.port = 9080
+license.server.ssl.port = 9443
+
+ssl.keystore.path = /Users/rob/.ssh/keys/securis.pkcs12
+ssl.keystore.type = PKCS12
+ssl.keystore.password = curist3c
+ssl.keystore.alias = 
diff --git a/securis/etc/build/files/securis-server.bat b/securis/etc/build/files/securis-server.bat
new file mode 100644
index 0000000..2e8d8e2
--- /dev/null
+++ b/securis/etc/build/files/securis-server.bat
@@ -0,0 +1,4 @@
+@echo off
+
+set CLASSPATH="config;libs\*"
+java -client -cp "%CLASSPATH%" net.curisit.securis.License %*
diff --git a/securis/etc/build/files/securis-server.sh b/securis/etc/build/files/securis-server.sh
new file mode 100644
index 0000000..92250ef
--- /dev/null
+++ b/securis/etc/build/files/securis-server.sh
@@ -0,0 +1,4 @@
+#!/bin/bash
+
+export CLASSPATH="config:libs/*"
+java -cp "$CLASSPATH" net.curisit.securis.SeCurisServer $@
diff --git a/securis/etc/build/pro/mvn_descriptor.xml b/securis/etc/build/pro/mvn_descriptor.xml
new file mode 100644
index 0000000..20e39ab
--- /dev/null
+++ b/securis/etc/build/pro/mvn_descriptor.xml
@@ -0,0 +1,39 @@
+ <assembly
+xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+    <id>packager</id>
+    <formats>
+        <format>zip</format>
+        <format>tar.gz</format>
+    </formats>
+    <includeBaseDirectory>false</includeBaseDirectory>
+    <fileSets>
+        <fileSet>
+            <directory>${basedir}/etc/build/files</directory>
+            <includes>
+				<include>**/*</include>
+			</includes>
+			<excludes>
+				<exclude>*.sh</exclude>
+			</excludes>
+            <outputDirectory>.</outputDirectory>
+        </fileSet>
+        <fileSet>
+            <directory>${basedir}/etc/build/files</directory>
+            <includes>
+				<include>*.sh</include>
+			</includes>
+			<fileMode>755</fileMode>
+            <outputDirectory>.</outputDirectory>
+        </fileSet>
+    </fileSets>
+    <dependencySets>
+        <dependencySet>
+            <outputDirectory>/libs</outputDirectory>
+            <useProjectArtifact>true</useProjectArtifact>
+            <unpack>false</unpack>
+            <scope>runtime</scope>
+        </dependencySet>
+    </dependencySets>
+</assembly>
diff --git a/securis/pom.xml b/securis/pom.xml
index a9933b3..5d78a37 100644
--- a/securis/pom.xml
+++ b/securis/pom.xml
@@ -1,8 +1,8 @@
 <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>net.curisit</groupId>
-  <artifactId>securis</artifactId>
-  <version>0.0.1-SNAPSHOT</version>
+  <artifactId>securis-server</artifactId>
+  <version>0.0.2-SNAPSHOT</version>
   <name>SeCuris</name>
   <description>CurisTEC Server Licenses</description>
   <dependencies>
@@ -62,7 +62,21 @@
                 <target>1.7</target>
             </configuration>
         </plugin>
-		</plugins>
+		<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.4</version>
+				<configuration>
+					<formats>
+						<format>zip</format>
+						<format>tar.gz</format>
+					</formats>
+					<descriptors>
+						<descriptor>etc/build/pro/mvn_descriptor.xml</descriptor>
+					</descriptors>
+					<appendAssemblyId>false</appendAssemblyId>
+				</configuration>
+			</plugin>
+			</plugins>
 	</build>
   <repositories>
     <repository>
diff --git a/securis/src/main/java/net/curisit/securis/MainApp.java b/securis/src/main/java/net/curisit/securis/MainApp.java
deleted file mode 100644
index 96cadaa..0000000
--- a/securis/src/main/java/net/curisit/securis/MainApp.java
+++ /dev/null
@@ -1,143 +0,0 @@
-package net.curisit.securis;
-
-import java.net.URI;
-import java.security.KeyStore;
-import java.util.Properties;
-
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import net.curisit.securis.ioc.RequestsModule;
-import net.curisit.securis.ioc.SecurisModule;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.eclipse.jetty.http.HttpVersion;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.HttpConfiguration;
-import org.eclipse.jetty.server.HttpConnectionFactory;
-import org.eclipse.jetty.server.SecureRequestCustomizer;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.ServerConnector;
-import org.eclipse.jetty.server.SslConnectionFactory;
-import org.eclipse.jetty.server.handler.ContextHandlerCollection;
-import org.eclipse.jetty.server.handler.ResourceHandler;
-import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
-import org.eclipse.jetty.servlet.FilterHolder;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.util.resource.Resource;
-import org.eclipse.jetty.util.ssl.SslContextFactory;
-import org.eclipse.jetty.util.thread.QueuedThreadPool;
-import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
-import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
-
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Key;
-import com.google.inject.name.Names;
-import com.google.inject.persist.PersistFilter;
-import com.google.inject.persist.jpa.JpaPersistModule;
-import com.itextpdf.text.pdf.security.KeyStoreUtil;
-
-public class MainApp {
-
-    private static final Logger LOG = LogManager.getLogger(MainApp.class);
-
-    private static Server server;
-    private static Injector injector = null;
-
-    @Inject
-    @Named("base-uri")
-    private URI uri;
-
-    public static void main(String[] args) throws Exception {
-        LOG.info("SeCuris init...");
-
-        SecurisModule securisModule = new SecurisModule();
-        JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
-        Properties props = new Properties();
-        props.put("javax.persistence.jdbc.password", securisModule.getPassword());
-        props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));
-        LOG.info("BD Url: {} {}", securisModule.getUrl(securisModule.getAppDir()), securisModule.getPassword());
-        jpaPersistModule.properties(props);
-
-        injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);
-
-        startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
-        while (true) {
-            Thread.currentThread().sleep(100);
-        }
-    }
-
-    private static void startServer(URI uri) throws Exception {
-        System.out.println("Starting jetty...");
-
-        QueuedThreadPool threadPool = new QueuedThreadPool();
-        threadPool.setMaxThreads(50);
-        
-        server = new Server(9997);
-        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
-        context.setContextPath("/");
-        context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
-
-        context.setInitParameter("resteasy.role.based.security", "true");
-        context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());
-        context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
-        ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
-        sh.setName("resteasy");
-        context.addServlet(sh, "/*");
-
-        ResourceHandler staticResources = new ResourceHandler();
-        staticResources.setBaseResource(Resource.newResource(MainApp.class.getResource("/static").toURI()));
-        staticResources.setWelcomeFiles(new String[] {
-            "/main.html"
-        });
-        context.setHandler(staticResources);
-
-        ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
-        context.setErrorHandler(errorHandler);
-        LOG.info("Error Handlers: " + context.getErrorHandler());
-        ContextHandlerCollection contexts = new ContextHandlerCollection();
-
-        contexts.setHandlers(new Handler[] {
-                staticResources, context
-        });
-        
-        HttpConfiguration http_config = new HttpConfiguration();
-        http_config.setSecureScheme("https");
-        http_config.setSecurePort(8443);
-        http_config.setOutputBufferSize(32768);
-        http_config.setSendServerVersion(true);
-        http_config.setSendDateHeader(false);
-        
-        
-        HttpConfiguration https_config = new HttpConfiguration(http_config);
-        https_config.addCustomizer(new SecureRequestCustomizer());
-        
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        sslContextFactory.setKeyStorePath("/Users/rob/.ssh/keys/securis.pkcs12");
-        sslContextFactory.setKeyStoreType("PKCS12");
-        sslContextFactory.setKeyStorePassword("curist3c");
-        //sslContextFactory.setCertAlias("1");
-//        sslContextFactory.setKeyManagerPassword("curist3c");
-//        sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
-//        sslContextFactory.setTrustStorePassword("curist3c");
-        sslContextFactory.checkKeyStore();
-        sslContextFactory.setNeedClientAuth(false);
-        LOG.info("Protocol: {}", sslContextFactory.getProtocol());
-        
-        ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https_config));
-        sslConnector.setPort(8443);
-        sslConnector.setHost("securis.curistec.com");
-        server.addConnector( sslConnector );
-
-        server.setHandler(context);
-        server.setStopAtShutdown(true);
-        server.start();
-        server.join();
-
-        LOG.info("Started server in: http://127.0.0.1:9997/");
-    }
-
-}
diff --git a/securis/src/main/java/net/curisit/securis/SeCurisServer.java b/securis/src/main/java/net/curisit/securis/SeCurisServer.java
new file mode 100644
index 0000000..3f98d84
--- /dev/null
+++ b/securis/src/main/java/net/curisit/securis/SeCurisServer.java
@@ -0,0 +1,234 @@
+package net.curisit.securis;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Properties;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import net.curisit.securis.ioc.RequestsModule;
+import net.curisit.securis.ioc.SecurisModule;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
+import org.eclipse.jetty.server.HttpConnectionFactory;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
+import org.eclipse.jetty.server.handler.ContextHandlerCollection;
+import org.eclipse.jetty.server.handler.ResourceHandler;
+import org.eclipse.jetty.servlet.ErrorPageErrorHandler;
+import org.eclipse.jetty.servlet.FilterHolder;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+import org.eclipse.jetty.util.component.AbstractLifeCycle.AbstractLifeCycleListener;
+import org.eclipse.jetty.util.component.LifeCycle;
+import org.eclipse.jetty.util.resource.Resource;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+import org.eclipse.jetty.util.thread.QueuedThreadPool;
+import org.jboss.resteasy.plugins.guice.GuiceResteasyBootstrapServletContextListener;
+import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Key;
+import com.google.inject.name.Names;
+import com.google.inject.persist.PersistFilter;
+import com.google.inject.persist.jpa.JpaPersistModule;
+
+public class SeCurisServer {
+
+    private static final Logger LOG = LogManager.getLogger(SeCurisServer.class);
+    private static final Logger CONSOLE = LogManager.getLogger("console");
+
+    private static final String PID_FILE = System.getProperty("user.home") + "/.SeCuris/securis-server.pid";
+    
+    private static Server server;
+    private static Injector injector = null;
+
+    @Inject
+    @Named("base-uri")
+    private URI uri;
+
+    private static void showHelp() {
+        CONSOLE.info("Execute SeCuris server using:");
+        CONSOLE.info("    $ ./securis-server.sh {start|stop}");
+    }
+    
+    public static void main(String[] args) throws Exception {
+        String command; 
+        if (args.length > 0) {
+            command = args[0].toLowerCase();
+        } else {
+            command = "start";
+        }
+        
+        switch (command) {
+        case "start":
+            startServer();
+            break;
+        case "stop":
+            stopServer();
+            break;
+
+        default:
+            showHelp();
+            System.exit(-1);
+        }
+    }
+    
+    private static void stopServer() {
+        if (!new File(PID_FILE).exists()) {
+            CONSOLE.error("SeCuris server is NOT running or PID file is missing");
+            System.exit(-3);
+        }
+        try {
+            int pid = Integer.parseInt(FileUtils.readFileToString(new File(PID_FILE)));
+            Runtime.getRuntime().exec("kill -SIGINT " + pid);
+            new File(PID_FILE).delete();
+            CONSOLE.info("SeCuris server process stopped sucessfully (PID: {})", pid);
+        } catch (NumberFormatException | IOException e) {
+            LOG.error("Error getting SeCuris server process PID from file: {}", PID_FILE);
+        }
+    }
+    
+    private static void startServer() {
+
+        if (new File(PID_FILE).exists()) {
+            try {
+                CONSOLE.error("SeCuris server is already running with PID: {}", FileUtils.readFileToString(new File(PID_FILE)));
+            } catch (IOException e) {
+                LOG.error("Unexpected error", e);
+            }
+            System.exit(-2);
+        }
+        
+        SecurisModule securisModule = new SecurisModule();
+        JpaPersistModule jpaPersistModule = new JpaPersistModule("localdb");
+        Properties props = new Properties();
+        props.put("javax.persistence.jdbc.password", securisModule.getPassword());
+        props.put("javax.persistence.jdbc.url", securisModule.getUrl(securisModule.getAppDir()));
+        LOG.info("BD Url: {} {}", securisModule.getUrl(securisModule.getAppDir()), securisModule.getPassword());
+        jpaPersistModule.properties(props);
+
+        injector = Guice.createInjector(securisModule, new RequestsModule(), jpaPersistModule);
+
+        try {
+            startServer(injector.getInstance(Key.get(URI.class, Names.named("base-uri"))));
+            
+        } catch (SeCurisException e) {
+            CONSOLE.error("Error launching the SeCuris server, {}", e);
+        }
+    }
+
+    private static void savePID() throws SeCurisException {
+        String runtimeName = ManagementFactory.getRuntimeMXBean().getName();
+        // runtimeName contains something like: "12345@localhost"
+        String pid = runtimeName.substring(0, runtimeName.indexOf('@'));
+        try {
+            FileUtils.writeStringToFile(new File(PID_FILE), pid);
+            CONSOLE.info("SeCuris server process started sucessfully (PID: {})", pid);
+        } catch (IOException e) {
+            LOG.error("Error saving pid file", e);
+            throw new SeCurisException("Error saving pid file");
+        }
+    }
+
+    private static void startServer(URI uri) throws SeCurisException {
+        System.out.println("Starting jetty...");
+
+        QueuedThreadPool threadPool = new QueuedThreadPool();
+        threadPool.setMaxThreads(50);
+        
+        server = new Server(9997);
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        context.setContextPath("/");
+        context.addEventListener(injector.getInstance(GuiceResteasyBootstrapServletContextListener.class));
+
+        context.setInitParameter("resteasy.role.based.security", "true");
+        context.setInitParameter("resteasy.providers", DefaultExceptionHandler.class.getName());
+        context.addFilter(new FilterHolder(injector.getInstance(PersistFilter.class)), "/*", null);
+        ServletHolder sh = new ServletHolder(HttpServletDispatcher.class);
+        sh.setName("resteasy");
+        context.addServlet(sh, "/*");
+
+        ResourceHandler staticResources = new ResourceHandler();
+        try {
+            staticResources.setBaseResource(Resource.newResource(SeCurisServer.class.getResource("/static").toURI()));
+        } catch (IOException | URISyntaxException e) {
+            LOG.error("Error configuring static resources", e);
+            throw new SeCurisException("Error configuring static resources");
+        }
+        staticResources.setWelcomeFiles(new String[] {
+            "/main.html"
+        });
+        context.setHandler(staticResources);
+
+        ErrorPageErrorHandler errorHandler = new ErrorPageErrorHandler();
+        context.setErrorHandler(errorHandler);
+        LOG.info("Error Handlers: " + context.getErrorHandler());
+        ContextHandlerCollection contexts = new ContextHandlerCollection();
+
+        contexts.setHandlers(new Handler[] {
+                staticResources, context
+        });
+        
+        HttpConfiguration http_config = new HttpConfiguration();
+        http_config.setSecureScheme("https");
+        http_config.setSecurePort(8443);
+        http_config.setOutputBufferSize(32768);
+        http_config.setSendServerVersion(true);
+        http_config.setSendDateHeader(false);
+        
+        
+        HttpConfiguration https_config = new HttpConfiguration(http_config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
+        
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        sslContextFactory.setKeyStorePath("/Users/rob/.ssh/keys/securis.pkcs12");
+        sslContextFactory.setKeyStoreType("PKCS12");
+        sslContextFactory.setKeyStorePassword("curist3c");
+        //sslContextFactory.setCertAlias("1");
+//        sslContextFactory.setKeyManagerPassword("curist3c");
+//        sslContextFactory.setTrustStorePath("/Users/rob/.ssh/keys/keystore");
+//        sslContextFactory.setTrustStorePassword("curist3c");
+        sslContextFactory.checkKeyStore();
+        sslContextFactory.setNeedClientAuth(false);
+        LOG.info("Protocol: {}", sslContextFactory.getProtocol());
+        
+        ServerConnector sslConnector = new ServerConnector(server, new SslConnectionFactory(sslContextFactory,HttpVersion.HTTP_1_1.asString()), new HttpConnectionFactory(https_config));
+        sslConnector.setPort(8443);
+        sslConnector.setHost("securis.curistec.com");
+        server.addConnector( sslConnector );
+
+        server.setHandler(context);
+        server.setStopAtShutdown(true);
+        server.addLifeCycleListener(new ServerStoppedListener());
+        try {
+            server.start();
+            savePID();
+            server.join();
+        } catch (Exception e) {
+            LOG.error("Error starting SeCurisServer", e);
+            throw new SeCurisException("Error starting SeCurisServer");
+        }
+
+    }
+    
+    static class ServerStoppedListener extends AbstractLifeCycleListener  {
+        @Override public void lifeCycleStopped(LifeCycle event) {
+            if (new File(PID_FILE).exists())
+                new File(PID_FILE).delete();
+        }
+    }
+
+}
diff --git a/securis/src/main/resources/log4j2.xml b/securis/src/main/resources/log4j2.xml
index 901545f..90895bd 100644
--- a/securis/src/main/resources/log4j2.xml
+++ b/securis/src/main/resources/log4j2.xml
@@ -2,22 +2,39 @@
 <Configuration>
   <Appenders>
 
-    <File name="defaultFile" fileName="${sys:user.home}/.SeCuris/log/securis.log" append="false">
+    <RollingFile name="defaultFile" fileName="${sys:user.home}/.SeCuris/logs/securis-server.log" append="true"
+    		filePattern="${sys:user.home}/.SeCuris/logs/securis-server-%d{yyyy-MM-dd-HH}.log.gz">
        <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
-    </File>
-
+	  <Policies>
+        <TimeBasedTriggeringPolicy interval="1" modulate="true" />
+      </Policies>
+		<DefaultRolloverStrategy max="10"/>
+    </RollingFile>
+	<Async name="defaultFileAsync" includeLocation="true">
+      <AppenderRef ref="defaultFile"/>
+    </Async>
+   
     <Console name="stdout" target="SYSTEM_OUT">
       <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
+    </Console>
+
+    <Console name="console" target="SYSTEM_OUT">
+      <PatternLayout pattern="%m%n"/>
     </Console>
 
    </Appenders>
   <Loggers>
     
-    <Logger name="net.curisit" level="INFO">
-      <AppenderRef ref="defaultFile"/>
+    <Logger name="net.curisit" level="INFO" additivity="false">
+      <AppenderRef ref="defaultFileAsync"/>
+      <AppenderRef ref="stdout"/>
     </Logger>
-    
-    <Root level="OFF">
+   
+    <Logger name="console" level="INFO" additivity="false">
+      <AppenderRef ref="console"/>
+    </Logger>
+   
+    <Root level="INFO" >
       <AppenderRef ref="stdout"/>
     </Root>
 

--
Gitblit v1.3.2