From f6035b0ca5654c8020a07b1d3513c5bf0a3e3ac2 Mon Sep 17 00:00:00 2001 From: Timothy Prepscius Date: Fri, 9 Aug 2013 17:31:37 -0400 Subject: [PATCH] adds the deploy scripts --- deploy/.gitignore | 1 + deploy/deploy-all | 9 + deploy/dev-deploy-all | 6 + deploy/dev-server-deploy | 24 + deploy/dev-tomcat-restart | 5 + deploy/dev-watch | 5 + deploy/dev-web-deploy | 2 + deploy/dev-web-deploy-s3 | 7 + deploy/james. | 0 .../META-INF/jpa-mappings-template.xml | 40 + .../META-INF/org/apache/james/README | 6 + .../james/spring-mailbox-authenticator.xml | 32 + .../org/apache/james/spring-mailbox-hbase.xml | 58 ++ .../org/apache/james/spring-server.xml | 373 +++++++ .../org/apache/james/spring-server.xml.bak | 419 ++++++++ .../META-INF/persistence-template.xml | 81 ++ .../META-INF/persistence.xml | 48 + .../dnsservice-template.conf | 65 ++ .../james/apache-james-conf/domainlist.conf | 63 ++ .../apache-james-conf/fetchmail-template.conf | 288 ++++++ .../apache-james-conf/hbase-site-template.xml | 34 + .../imapserver-template.conf | 80 ++ .../james-database-derby.properties | 40 + .../james-database-mysql.properties | 40 + .../james-database-template.properties | 40 + .../james-database.properties | 1 + .../jcr-repository-template.xml | 72 ++ .../apache-james-conf/jmx-template.properties | 28 + deploy/james/apache-james-conf/keystore | 1 + .../apache-james-conf/lib/JavaPNS_2.2.jar | 1 + deploy/james/apache-james-conf/lib/README.txt | 1 + .../lib/activation-1.1.1.jar | 1 + .../apache-james-conf/lib/aws-java-sdk.jar | 1 + .../lib/bcprov-jdk15on-148.jar | 1 + .../lib/dropbox-java-sdk.jar | 1 + .../lib/httpclient-4.1.1.jar | 1 + .../apache-james-conf/lib/httpcore-4.1.jar | 1 + .../lib/jackson-core-asl-1.8.9.jar | 1 + .../lib/jackson-mapper-asl-1.8.9.jar | 1 + .../apache-james-conf/lib/json_simple-1.1.jar | 1 + .../lib/mysql-connector-java-3.1.14-bin.jar | 1 + .../lmtpserver-template.conf | 77 ++ .../log4j-template.properties | 140 +++ .../james/apache-james-conf/log4j.properties | 151 +++ .../mailbox-jcr-template.cnd | 74 ++ .../mailbox-maildir-template.properties | 24 + deploy/james/apache-james-conf/mailbox.conf | 34 + .../mailetcontainer-template.conf | 675 +++++++++++++ .../apache-james-conf/mailetcontainer.conf | 662 ++++++++++++ .../mailrepositorystore-template.conf | 96 ++ .../pop3server-template.conf | 81 ++ .../recipientrewritetable-template.conf | 57 ++ .../smtpserver-template.conf | 323 ++++++ .../james/apache-james-conf/smtpserver.conf | 314 ++++++ .../sqlResources-template.xml | 938 ++++++++++++++++++ .../james/apache-james-conf/sqlResources.xml | 938 ++++++++++++++++++ .../usersrepository-template.conf | 81 ++ .../usersrepository23-template.conf | 36 + deploy/james/apache-james-conf/wrapper.conf | 234 +++++ deploy/james/apache-james-mailbox-memory.jar | 1 + deploy/james/apache-james-server-mailets.jar | Bin 0 -> 159282 bytes deploy/james/catalog | 5 + .../ios-push-certificate-dev.p12 | 1 + .../ios-push-certificate-prod.p12 | 1 + deploy/james/resources/passwords/mail | 1 + deploy/james/resources/passwords/mail-pbe | 1 + deploy/james/resources/passwords/mail_extra | 1 + .../resources/passwords/push-certificate | 1 + deploy/james/run | 9 + deploy/james/run-block | 1 + deploy/james/setup | 6 + deploy/james/shutdown | 2 + deploy/mail-key. | 0 deploy/mail-key/catalog | 5 + .../resources/key.streamserver/keystore.jks | 1 + deploy/mail-key/resources/passwords/mail | 1 + .../mail-key/resources/passwords/mail_extra | 1 + deploy/mail-key/run | 7 + deploy/mail-key/setup | 3 + deploy/mail-key/shutdown | 1 + deploy/mail-user. | 0 deploy/mail-user/catalog | 5 + .../resources/mail.streamserver/keystore.jks | 1 + deploy/mail-user/resources/passwords/captcha | 1 + deploy/mail-user/resources/passwords/mail | 1 + deploy/mail-user/resources/passwords/mail-pbe | 1 + .../mail-user/resources/passwords/mail_extra | 1 + deploy/mail-user/run | 7 + deploy/mail-user/setup | 3 + deploy/mail-user/shutdown | 1 + deploy/restart-all | 5 + deploy/server-deploy | 24 + deploy/server-restart | 20 + deploy/server-shutdown | 8 + deploy/startWebServer | 1 + deploy/tomcat-restart | 5 + deploy/tomcat. | 0 deploy/tomcat/catalog | 5 + .../resources/mail.server.push/keystore.jks | 1 + .../resources/mail.server.relay/keystore.jks | 1 + .../mail.server.relay/truststore.jks | 1 + .../passwords/BucketCreate-AWS-AccessKey | 1 + .../passwords/BucketCreate-AWS-SecretKey | 1 + deploy/tomcat/resources/passwords/captcha | 1 + deploy/tomcat/resources/passwords/mail_extra | 1 + deploy/tomcat/resources/web-server-url | 1 + deploy/tomcat/restart | 5 + deploy/tomcat/run | 1 + deploy/tomcat/setup | 3 + deploy/tomcat/shutdown | 0 deploy/tools. | 0 deploy/tools/catalog | 5 + deploy/tools/db-backup | 7 + deploy/tools/resources/key.streamserver | 1 + .../tools/resources/mail.auth/truststore.jks | 1 + deploy/tools/resources/mail.server.push | 1 + deploy/tools/resources/mail.streamserver | 1 + .../passwords/BucketCreate-AWS-AccessKey | 1 + .../passwords/BucketCreate-AWS-SecretKey | 1 + deploy/tools/resources/passwords/captcha | 1 + deploy/tools/resources/passwords/james | 1 + deploy/tools/resources/passwords/mail | 1 + deploy/tools/resources/passwords/mail-pbe | 1 + deploy/tools/resources/passwords/mail_extra | 1 + .../resources/passwords/push-certificate | 1 + deploy/tools/run | 1 + deploy/tools/setup | 3 + deploy/tools/shutdown | 0 deploy/tunnel. | 0 deploy/tunnel/nginx/install-nginx | 18 + deploy/tunnel/nginx/install-nginx-conf | 5 + deploy/tunnel/nginx/nginx-ssl.crt | 1 + deploy/tunnel/nginx/nginx-ssl.key | 1 + deploy/tunnel/nginx/nginx.conf | 60 ++ deploy/tunnel/nginx/nginx.conf-old | 19 + deploy/tunnel/run | 4 + deploy/tunnel/run-tunnel | 4 + deploy/tunnel/run-tunnel-sudo | 1 + deploy/tunnel/shutdown | 2 + deploy/tunnel/stop-tunnel | 2 + deploy/tunnel/sudoers.d-tunnel | 1 + deploy/tunnel/vpn-ssh/HOST | 5 + deploy/tunnel/vpn-ssh/client/run | 18 + deploy/tunnel/vpn-ssh/client/run-to-log | 2 + deploy/tunnel/vpn-ssh/dossh | 3 + deploy/tunnel/vpn-ssh/green.pem | 1 + deploy/tunnel/vpn-ssh/install | 5 + deploy/tunnel/vpn-ssh/reinstall | 4 + deploy/tunnel/vpn-ssh/run-server | 11 + deploy/tunnel/vpn-ssh/server/install | 7 + deploy/tunnel/vpn-ssh/server/run | 42 + deploy/tunnel/vpn-ssh/server/run-to-log | 2 + deploy/watch | 5 + deploy/web-deploy | 2 + deploy/web-deploy-ftp | 2 + deploy/web-deploy-s3 | 8 + deploy/websockets. | 0 deploy/websockets/proxy-tcp.js | 83 ++ deploy/websockets/proxy-ws.js | 54 + deploy/websockets/proxy.js | 1 + deploy/websockets/run | 11 + deploy/websockets/setup | 3 + deploy/websockets/shutdown | 2 + 163 files changed, 7387 insertions(+) create mode 100644 deploy/.gitignore create mode 100755 deploy/deploy-all create mode 100755 deploy/dev-deploy-all create mode 100755 deploy/dev-server-deploy create mode 100755 deploy/dev-tomcat-restart create mode 100755 deploy/dev-watch create mode 100755 deploy/dev-web-deploy create mode 100755 deploy/dev-web-deploy-s3 create mode 100644 deploy/james. create mode 100644 deploy/james/apache-james-conf/META-INF/jpa-mappings-template.xml create mode 100644 deploy/james/apache-james-conf/META-INF/org/apache/james/README create mode 100644 deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-authenticator.xml create mode 100644 deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-hbase.xml create mode 100644 deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml create mode 100644 deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml.bak create mode 100644 deploy/james/apache-james-conf/META-INF/persistence-template.xml create mode 100644 deploy/james/apache-james-conf/META-INF/persistence.xml create mode 100644 deploy/james/apache-james-conf/dnsservice-template.conf create mode 100644 deploy/james/apache-james-conf/domainlist.conf create mode 100644 deploy/james/apache-james-conf/fetchmail-template.conf create mode 100644 deploy/james/apache-james-conf/hbase-site-template.xml create mode 100644 deploy/james/apache-james-conf/imapserver-template.conf create mode 100644 deploy/james/apache-james-conf/james-database-derby.properties create mode 100644 deploy/james/apache-james-conf/james-database-mysql.properties create mode 100644 deploy/james/apache-james-conf/james-database-template.properties create mode 120000 deploy/james/apache-james-conf/james-database.properties create mode 100644 deploy/james/apache-james-conf/jcr-repository-template.xml create mode 100644 deploy/james/apache-james-conf/jmx-template.properties create mode 120000 deploy/james/apache-james-conf/keystore create mode 120000 deploy/james/apache-james-conf/lib/JavaPNS_2.2.jar create mode 100644 deploy/james/apache-james-conf/lib/README.txt create mode 120000 deploy/james/apache-james-conf/lib/activation-1.1.1.jar create mode 120000 deploy/james/apache-james-conf/lib/aws-java-sdk.jar create mode 120000 deploy/james/apache-james-conf/lib/bcprov-jdk15on-148.jar create mode 120000 deploy/james/apache-james-conf/lib/dropbox-java-sdk.jar create mode 120000 deploy/james/apache-james-conf/lib/httpclient-4.1.1.jar create mode 120000 deploy/james/apache-james-conf/lib/httpcore-4.1.jar create mode 120000 deploy/james/apache-james-conf/lib/jackson-core-asl-1.8.9.jar create mode 120000 deploy/james/apache-james-conf/lib/jackson-mapper-asl-1.8.9.jar create mode 120000 deploy/james/apache-james-conf/lib/json_simple-1.1.jar create mode 120000 deploy/james/apache-james-conf/lib/mysql-connector-java-3.1.14-bin.jar create mode 100644 deploy/james/apache-james-conf/lmtpserver-template.conf create mode 100644 deploy/james/apache-james-conf/log4j-template.properties create mode 100644 deploy/james/apache-james-conf/log4j.properties create mode 100644 deploy/james/apache-james-conf/mailbox-jcr-template.cnd create mode 100644 deploy/james/apache-james-conf/mailbox-maildir-template.properties create mode 100644 deploy/james/apache-james-conf/mailbox.conf create mode 100644 deploy/james/apache-james-conf/mailetcontainer-template.conf create mode 100644 deploy/james/apache-james-conf/mailetcontainer.conf create mode 100644 deploy/james/apache-james-conf/mailrepositorystore-template.conf create mode 100644 deploy/james/apache-james-conf/pop3server-template.conf create mode 100644 deploy/james/apache-james-conf/recipientrewritetable-template.conf create mode 100644 deploy/james/apache-james-conf/smtpserver-template.conf create mode 100644 deploy/james/apache-james-conf/smtpserver.conf create mode 100644 deploy/james/apache-james-conf/sqlResources-template.xml create mode 100644 deploy/james/apache-james-conf/sqlResources.xml create mode 100644 deploy/james/apache-james-conf/usersrepository-template.conf create mode 100644 deploy/james/apache-james-conf/usersrepository23-template.conf create mode 100644 deploy/james/apache-james-conf/wrapper.conf create mode 120000 deploy/james/apache-james-mailbox-memory.jar create mode 100644 deploy/james/apache-james-server-mailets.jar create mode 100755 deploy/james/catalog create mode 120000 deploy/james/resources/mail.server.push/ios-push-certificate-dev.p12 create mode 120000 deploy/james/resources/mail.server.push/ios-push-certificate-prod.p12 create mode 120000 deploy/james/resources/passwords/mail create mode 120000 deploy/james/resources/passwords/mail-pbe create mode 120000 deploy/james/resources/passwords/mail_extra create mode 120000 deploy/james/resources/passwords/push-certificate create mode 100755 deploy/james/run create mode 100755 deploy/james/run-block create mode 100755 deploy/james/setup create mode 100755 deploy/james/shutdown create mode 100644 deploy/mail-key. create mode 100755 deploy/mail-key/catalog create mode 120000 deploy/mail-key/resources/key.streamserver/keystore.jks create mode 120000 deploy/mail-key/resources/passwords/mail create mode 120000 deploy/mail-key/resources/passwords/mail_extra create mode 100755 deploy/mail-key/run create mode 100755 deploy/mail-key/setup create mode 100755 deploy/mail-key/shutdown create mode 100644 deploy/mail-user. create mode 100755 deploy/mail-user/catalog create mode 120000 deploy/mail-user/resources/mail.streamserver/keystore.jks create mode 120000 deploy/mail-user/resources/passwords/captcha create mode 120000 deploy/mail-user/resources/passwords/mail create mode 120000 deploy/mail-user/resources/passwords/mail-pbe create mode 120000 deploy/mail-user/resources/passwords/mail_extra create mode 100755 deploy/mail-user/run create mode 100755 deploy/mail-user/setup create mode 100755 deploy/mail-user/shutdown create mode 100755 deploy/restart-all create mode 100755 deploy/server-deploy create mode 100755 deploy/server-restart create mode 100755 deploy/server-shutdown create mode 100755 deploy/startWebServer create mode 100755 deploy/tomcat-restart create mode 100644 deploy/tomcat. create mode 100755 deploy/tomcat/catalog create mode 120000 deploy/tomcat/resources/mail.server.push/keystore.jks create mode 120000 deploy/tomcat/resources/mail.server.relay/keystore.jks create mode 120000 deploy/tomcat/resources/mail.server.relay/truststore.jks create mode 120000 deploy/tomcat/resources/passwords/BucketCreate-AWS-AccessKey create mode 120000 deploy/tomcat/resources/passwords/BucketCreate-AWS-SecretKey create mode 120000 deploy/tomcat/resources/passwords/captcha create mode 120000 deploy/tomcat/resources/passwords/mail_extra create mode 100644 deploy/tomcat/resources/web-server-url create mode 100755 deploy/tomcat/restart create mode 100755 deploy/tomcat/run create mode 100755 deploy/tomcat/setup create mode 100755 deploy/tomcat/shutdown create mode 100644 deploy/tools. create mode 100755 deploy/tools/catalog create mode 100755 deploy/tools/db-backup create mode 120000 deploy/tools/resources/key.streamserver create mode 120000 deploy/tools/resources/mail.auth/truststore.jks create mode 120000 deploy/tools/resources/mail.server.push create mode 120000 deploy/tools/resources/mail.streamserver create mode 120000 deploy/tools/resources/passwords/BucketCreate-AWS-AccessKey create mode 120000 deploy/tools/resources/passwords/BucketCreate-AWS-SecretKey create mode 120000 deploy/tools/resources/passwords/captcha create mode 120000 deploy/tools/resources/passwords/james create mode 120000 deploy/tools/resources/passwords/mail create mode 120000 deploy/tools/resources/passwords/mail-pbe create mode 120000 deploy/tools/resources/passwords/mail_extra create mode 120000 deploy/tools/resources/passwords/push-certificate create mode 100755 deploy/tools/run create mode 100755 deploy/tools/setup create mode 100755 deploy/tools/shutdown create mode 100644 deploy/tunnel. create mode 100755 deploy/tunnel/nginx/install-nginx create mode 100755 deploy/tunnel/nginx/install-nginx-conf create mode 120000 deploy/tunnel/nginx/nginx-ssl.crt create mode 120000 deploy/tunnel/nginx/nginx-ssl.key create mode 100644 deploy/tunnel/nginx/nginx.conf create mode 100644 deploy/tunnel/nginx/nginx.conf-old create mode 100755 deploy/tunnel/run create mode 100755 deploy/tunnel/run-tunnel create mode 100755 deploy/tunnel/run-tunnel-sudo create mode 100755 deploy/tunnel/shutdown create mode 100755 deploy/tunnel/stop-tunnel create mode 100644 deploy/tunnel/sudoers.d-tunnel create mode 100644 deploy/tunnel/vpn-ssh/HOST create mode 100755 deploy/tunnel/vpn-ssh/client/run create mode 100755 deploy/tunnel/vpn-ssh/client/run-to-log create mode 100755 deploy/tunnel/vpn-ssh/dossh create mode 100644 deploy/tunnel/vpn-ssh/green.pem create mode 100755 deploy/tunnel/vpn-ssh/install create mode 100755 deploy/tunnel/vpn-ssh/reinstall create mode 100755 deploy/tunnel/vpn-ssh/run-server create mode 100755 deploy/tunnel/vpn-ssh/server/install create mode 100755 deploy/tunnel/vpn-ssh/server/run create mode 100755 deploy/tunnel/vpn-ssh/server/run-to-log create mode 100755 deploy/watch create mode 100755 deploy/web-deploy create mode 100755 deploy/web-deploy-ftp create mode 100755 deploy/web-deploy-s3 create mode 100644 deploy/websockets. create mode 100644 deploy/websockets/proxy-tcp.js create mode 100644 deploy/websockets/proxy-ws.js create mode 120000 deploy/websockets/proxy.js create mode 100755 deploy/websockets/run create mode 100755 deploy/websockets/setup create mode 100755 deploy/websockets/shutdown diff --git a/deploy/.gitignore b/deploy/.gitignore new file mode 100644 index 0000000..ccbb9df --- /dev/null +++ b/deploy/.gitignore @@ -0,0 +1 @@ +www/ diff --git a/deploy/deploy-all b/deploy/deploy-all new file mode 100755 index 0000000..a6239b2 --- /dev/null +++ b/deploy/deploy-all @@ -0,0 +1,9 @@ +./server-shutdown tunnel +./server-deploy tomcat +./server-deploy james +./server-deploy mail-user +./server-deploy mail-key +./server-deploy tools +./web-deploy + +./server-deploy tunnel diff --git a/deploy/dev-deploy-all b/deploy/dev-deploy-all new file mode 100755 index 0000000..bce5771 --- /dev/null +++ b/deploy/dev-deploy-all @@ -0,0 +1,6 @@ +./dev-server-deploy tomcat +./dev-server-deploy james +./dev-server-deploy mail-user +./dev-server-deploy mail-key +./dev-server-deploy tools + diff --git a/deploy/dev-server-deploy b/deploy/dev-server-deploy new file mode 100755 index 0000000..9897238 --- /dev/null +++ b/deploy/dev-server-deploy @@ -0,0 +1,24 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="red" + +echo stopping... +ssh $1@$server "cd deploy && ./shutdown" + +echo transfering +rsync -avzL --delete $1/ $1@$server:deploy + +echo cataloging +ssh $1@$server "cd deploy && ./catalog" + +echo starting... +ssh $1@$server "cd deploy && ./run" + +echo tailing... +sleep 2 +ssh $1@$server "tail run.log" + +echo ... +echo "***** remember to restart mail-user if you restart-james *****" + + diff --git a/deploy/dev-tomcat-restart b/deploy/dev-tomcat-restart new file mode 100755 index 0000000..a7489ca --- /dev/null +++ b/deploy/dev-tomcat-restart @@ -0,0 +1,5 @@ + +server="red" + +echo restarting... +ssh tomcat@$server "cd deploy && ./restart" diff --git a/deploy/dev-watch b/deploy/dev-watch new file mode 100755 index 0000000..49d044b --- /dev/null +++ b/deploy/dev-watch @@ -0,0 +1,5 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="red" + +ssh $1@$server "tail -n 100 -f run.log" diff --git a/deploy/dev-web-deploy b/deploy/dev-web-deploy new file mode 100755 index 0000000..af4b9c1 --- /dev/null +++ b/deploy/dev-web-deploy @@ -0,0 +1,2 @@ +rsync -avL --exclude="WEB-INF" --delete ../gwt/war/ tprepscius@red:www/ + diff --git a/deploy/dev-web-deploy-s3 b/deploy/dev-web-deploy-s3 new file mode 100755 index 0000000..13388c6 --- /dev/null +++ b/deploy/dev-web-deploy-s3 @@ -0,0 +1,7 @@ +./web-deploy +s3cmd sync www/ s3://www.mailiverse.com/beta/ --acl-public --delete-removed + +echo putting files with cache control headers +s3cmd put www/index.html s3://www.mailiverse.com/beta/ --acl-public --add-header "Cache-Control: max-age:3600" +s3cmd put www/mailiverse_gwt/mailiverse_gwt.nocache.js s3://www.mailiverse.com/beta/mailiverse_gwt/ --acl-public --add-header "Cache-Control: no-cache" +echo done diff --git a/deploy/james. b/deploy/james. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/james/apache-james-conf/META-INF/jpa-mappings-template.xml b/deploy/james/apache-james-conf/META-INF/jpa-mappings-template.xml new file mode 100644 index 0000000..9d9647a --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/jpa-mappings-template.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/org/apache/james/README b/deploy/james/apache-james-conf/META-INF/org/apache/james/README new file mode 100644 index 0000000..2d2c855 --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/org/apache/james/README @@ -0,0 +1,6 @@ +You can place here any configuration file you find in +http://svn.apache.org/repos/asf/james/mailbox/trunk/spring/src/main/resources/META-INF/org/apache/james/ + +This will override the configuration loaded from classpath from mailbox-spring.jar. + +If you create a file, ensure that the configuration in that file in complete (we don't support partial file-based configuration). diff --git a/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-authenticator.xml b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-authenticator.xml new file mode 100644 index 0000000..900b3ed --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-authenticator.xml @@ -0,0 +1,32 @@ + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-hbase.xml b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-hbase.xml new file mode 100644 index 0000000..9f98924 --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-mailbox-hbase.xml @@ -0,0 +1,58 @@ + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml new file mode 100644 index 0000000..5d1e360 --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + usersrepository + + + + + + + + recipientrewritetable + + + + + + + + domainlist + + + + + + + usersrepository23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml.bak b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml.bak new file mode 100644 index 0000000..e652fc7 --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/org/apache/james/spring-server.xml.bak @@ -0,0 +1,419 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + usersrepository + + + + + + + + recipientrewritetable + + + + + + + + domainlist + + + + + + + usersrepository23 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ACL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/persistence-template.xml b/deploy/james/apache-james-conf/META-INF/persistence-template.xml new file mode 100644 index 0000000..f49cf2a --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/persistence-template.xml @@ -0,0 +1,81 @@ + + + + + + + + + META-INF/jpa-mappings-template.xml + + + org.apache.james.mailbox.jpa.mail.model.JPAMailbox + org.apache.james.mailbox.jpa.mail.model.JPAUserFlag + org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage + org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage + + + + + org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage + + org.apache.james.mailbox.jpa.mail.model.JPAProperty + org.apache.james.mailbox.jpa.user.model.JPASubscription + + + org.apache.james.domainlist.jpa.model.JPADomain + + + org.apache.james.user.jpa.model.JPAUser + + + org.apache.james.rrt.jpa.model.JPARecipientRewrite + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/META-INF/persistence.xml b/deploy/james/apache-james-conf/META-INF/persistence.xml new file mode 100644 index 0000000..fbabf68 --- /dev/null +++ b/deploy/james/apache-james-conf/META-INF/persistence.xml @@ -0,0 +1,48 @@ + + + + + + + + org.apache.james.mailbox.jpa.mail.model.JPAMailbox + org.apache.james.mailbox.jpa.mail.model.JPAUserFlag + org.apache.james.mailbox.jpa.mail.model.openjpa.AbstractJPAMessage + org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage + org.apache.james.mailbox.jpa.mail.model.openjpa.JPAMessage + org.apache.james.mailbox.jpa.mail.model.JPAProperty + org.apache.james.mailbox.jpa.user.model.JPASubscription + org.apache.james.domainlist.jpa.model.JPADomain + org.apache.james.user.jpa.model.JPAUser + org.apache.james.rrt.jpa.model.JPARecipientRewrite + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/dnsservice-template.conf b/deploy/james/apache-james-conf/dnsservice-template.conf new file mode 100644 index 0000000..cf38e9f --- /dev/null +++ b/deploy/james/apache-james-conf/dnsservice-template.conf @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + 50000 + + + + + diff --git a/deploy/james/apache-james-conf/domainlist.conf b/deploy/james/apache-james-conf/domainlist.conf new file mode 100644 index 0000000..83c9ac9 --- /dev/null +++ b/deploy/james/apache-james-conf/domainlist.conf @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + localhost + + + + diff --git a/deploy/james/apache-james-conf/fetchmail-template.conf b/deploy/james/apache-james-conf/fetchmail-template.conf new file mode 100644 index 0000000..3c6a890 --- /dev/null +++ b/deploy/james/apache-james-conf/fetchmail-template.conf @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + fetchmail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + pop.server.com + + + 600000 + + + + pop3 + + + INBOX + + + + + + + + + + + + + + false + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wibble@localhost, flobble@localhost + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/hbase-site-template.xml b/deploy/james/apache-james-conf/hbase-site-template.xml new file mode 100644 index 0000000..1010762 --- /dev/null +++ b/deploy/james/apache-james-conf/hbase-site-template.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/imapserver-template.conf b/deploy/james/apache-james-conf/imapserver-template.conf new file mode 100644 index 0000000..2ef7555 --- /dev/null +++ b/deploy/james/apache-james-conf/imapserver-template.conf @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + imapserver + + + + + + + 0.0.0.0:143 + + 200 + + + + + file://conf/keystore + yoursecret + org.bouncycastle.jce.provider.BouncyCastleProvider + + + + + + + + + + + + + + 0 + + + 0 + + + + + + diff --git a/deploy/james/apache-james-conf/james-database-derby.properties b/deploy/james/apache-james-conf/james-database-derby.properties new file mode 100644 index 0000000..10d0a2a --- /dev/null +++ b/deploy/james/apache-james-conf/james-database-derby.properties @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +# Use derby as default +database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver +database.url=jdbc:derby:../var/store/derby;create=true +database.username=app +database.password=app + +# Supported adapters are: +# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE +vendorAdapter.database=DERBY + +# Use streaming for Blobs +# This is only supported on a limited set of databases atm. You should check if its supported by your DB before enable +# it. +# +# See: +# http://openjpa.apache.org/builds/latest/docs/manual/ref_guide_mapping_jpa.html #7.11. LOB Streaming +# +openjpa.streaming=false \ No newline at end of file diff --git a/deploy/james/apache-james-conf/james-database-mysql.properties b/deploy/james/apache-james-conf/james-database-mysql.properties new file mode 100644 index 0000000..f21abf2 --- /dev/null +++ b/deploy/james/apache-james-conf/james-database-mysql.properties @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +# Use derby as default +database.driverClassName=com.mysql.jdbc.Driver +database.url=jdbc:mysql://localhost/james +database.username=james +database.password=JAMES_DB_PASSWORD + +# Supported adapters are: +# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE +vendorAdapter.database=MYSQL + +# Use streaming for Blobs +# This is only supported on a limited set of databases atm. You should check if its supported by your DB before enable +# it. +# +# See: +# http://openjpa.apache.org/builds/latest/docs/manual/ref_guide_mapping_jpa.html #7.11. LOB Streaming +# +openjpa.streaming=false diff --git a/deploy/james/apache-james-conf/james-database-template.properties b/deploy/james/apache-james-conf/james-database-template.properties new file mode 100644 index 0000000..10d0a2a --- /dev/null +++ b/deploy/james/apache-james-conf/james-database-template.properties @@ -0,0 +1,40 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +# Use derby as default +database.driverClassName=org.apache.derby.jdbc.EmbeddedDriver +database.url=jdbc:derby:../var/store/derby;create=true +database.username=app +database.password=app + +# Supported adapters are: +# DB2, DERBY, H2, HSQL, INFORMIX, MYSQL, ORACLE, POSTGRESQL, SQL_SERVER, SYBASE +vendorAdapter.database=DERBY + +# Use streaming for Blobs +# This is only supported on a limited set of databases atm. You should check if its supported by your DB before enable +# it. +# +# See: +# http://openjpa.apache.org/builds/latest/docs/manual/ref_guide_mapping_jpa.html #7.11. LOB Streaming +# +openjpa.streaming=false \ No newline at end of file diff --git a/deploy/james/apache-james-conf/james-database.properties b/deploy/james/apache-james-conf/james-database.properties new file mode 120000 index 0000000..c118bfb --- /dev/null +++ b/deploy/james/apache-james-conf/james-database.properties @@ -0,0 +1 @@ +james-database-mysql.properties \ No newline at end of file diff --git a/deploy/james/apache-james-conf/jcr-repository-template.xml b/deploy/james/apache-james-conf/jcr-repository-template.xml new file mode 100644 index 0000000..96f99f7 --- /dev/null +++ b/deploy/james/apache-james-conf/jcr-repository-template.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/jmx-template.properties b/deploy/james/apache-james-conf/jmx-template.properties new file mode 100644 index 0000000..a1dbdf8 --- /dev/null +++ b/deploy/james/apache-james-conf/jmx-template.properties @@ -0,0 +1,28 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +jmx.address=127.0.0.1 +jmx.port=9999 diff --git a/deploy/james/apache-james-conf/keystore b/deploy/james/apache-james-conf/keystore new file mode 120000 index 0000000..84deb41 --- /dev/null +++ b/deploy/james/apache-james-conf/keystore @@ -0,0 +1 @@ +../../../keys/james/final/mail_mailiverse_com.jks \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/JavaPNS_2.2.jar b/deploy/james/apache-james-conf/lib/JavaPNS_2.2.jar new file mode 120000 index 0000000..a985528 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/JavaPNS_2.2.jar @@ -0,0 +1 @@ +../../../../java/lib/JavaPNS_2.2.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/README.txt b/deploy/james/apache-james-conf/lib/README.txt new file mode 100644 index 0000000..d536d44 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/README.txt @@ -0,0 +1 @@ +# Put every jar you want to have included in the classpath in here \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/activation-1.1.1.jar b/deploy/james/apache-james-conf/lib/activation-1.1.1.jar new file mode 120000 index 0000000..80643fc --- /dev/null +++ b/deploy/james/apache-james-conf/lib/activation-1.1.1.jar @@ -0,0 +1 @@ +../../../../java/lib/activation-1.1.1.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/aws-java-sdk.jar b/deploy/james/apache-james-conf/lib/aws-java-sdk.jar new file mode 120000 index 0000000..0d8c11d --- /dev/null +++ b/deploy/james/apache-james-conf/lib/aws-java-sdk.jar @@ -0,0 +1 @@ +../../../../java/lib/aws-java-sdk.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/bcprov-jdk15on-148.jar b/deploy/james/apache-james-conf/lib/bcprov-jdk15on-148.jar new file mode 120000 index 0000000..815cbac --- /dev/null +++ b/deploy/james/apache-james-conf/lib/bcprov-jdk15on-148.jar @@ -0,0 +1 @@ +../../../../java/lib/bcprov-jdk15on-148.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/dropbox-java-sdk.jar b/deploy/james/apache-james-conf/lib/dropbox-java-sdk.jar new file mode 120000 index 0000000..8b5ef40 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/dropbox-java-sdk.jar @@ -0,0 +1 @@ +../../../../java/lib/dropbox-java-sdk-1.3.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/httpclient-4.1.1.jar b/deploy/james/apache-james-conf/lib/httpclient-4.1.1.jar new file mode 120000 index 0000000..0b12abd --- /dev/null +++ b/deploy/james/apache-james-conf/lib/httpclient-4.1.1.jar @@ -0,0 +1 @@ +../../../../java/lib/httpclient-4.1.1.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/httpcore-4.1.jar b/deploy/james/apache-james-conf/lib/httpcore-4.1.jar new file mode 120000 index 0000000..f95d93e --- /dev/null +++ b/deploy/james/apache-james-conf/lib/httpcore-4.1.jar @@ -0,0 +1 @@ +../../../../java/lib/httpcore-4.1.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/jackson-core-asl-1.8.9.jar b/deploy/james/apache-james-conf/lib/jackson-core-asl-1.8.9.jar new file mode 120000 index 0000000..8dad5b8 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/jackson-core-asl-1.8.9.jar @@ -0,0 +1 @@ +../../../../java/lib/jackson-core-asl-1.8.9.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/jackson-mapper-asl-1.8.9.jar b/deploy/james/apache-james-conf/lib/jackson-mapper-asl-1.8.9.jar new file mode 120000 index 0000000..01d06d7 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/jackson-mapper-asl-1.8.9.jar @@ -0,0 +1 @@ +../../../../java/lib/jackson-mapper-asl-1.8.9.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/json_simple-1.1.jar b/deploy/james/apache-james-conf/lib/json_simple-1.1.jar new file mode 120000 index 0000000..12822b4 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/json_simple-1.1.jar @@ -0,0 +1 @@ +../../../../java/lib/json_simple-1.1.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lib/mysql-connector-java-3.1.14-bin.jar b/deploy/james/apache-james-conf/lib/mysql-connector-java-3.1.14-bin.jar new file mode 120000 index 0000000..8608460 --- /dev/null +++ b/deploy/james/apache-james-conf/lib/mysql-connector-java-3.1.14-bin.jar @@ -0,0 +1 @@ +../../../../java/lib/mysql-connector-java-3.1.14-bin.jar \ No newline at end of file diff --git a/deploy/james/apache-james-conf/lmtpserver-template.conf b/deploy/james/apache-james-conf/lmtpserver-template.conf new file mode 100644 index 0000000..15bb62f --- /dev/null +++ b/deploy/james/apache-james-conf/lmtpserver-template.conf @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + lmtpserver + + + 127.0.0.1:24 + + 200 + + + + + + + + + 1200 + + + 0 + + + 0 + + + + 0 + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/log4j-template.properties b/deploy/james/apache-james-conf/log4j-template.properties new file mode 100644 index 0000000..fde91d0 --- /dev/null +++ b/deploy/james/apache-james-conf/log4j-template.properties @@ -0,0 +1,140 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +log4j.rootLogger=DEBUG + +log4j.appender.CONS=org.apache.log4j.ConsoleAppender +log4j.appender.CONS.layout=org.apache.log4j.PatternLayout +log4j.appender.CONS.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.FILE.File=../log/james-server.log +log4j.appender.FILE.layout=org.apache.log4j.PatternLayout +log4j.appender.FILE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILBOXMANAGER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILBOXMANAGER.File=../log/mailboxmanager.log +log4j.appender.MAILBOXMANAGER.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILBOXMANAGER.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILBOXMANAGER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.IMAPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.IMAPSERVER.File=../log/imapserver.log +log4j.appender.IMAPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.IMAPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.IMAPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILETCONTAINER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILETCONTAINER.File=../log/mailetcontainer.log +log4j.appender.MAILETCONTAINER.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILETCONTAINER.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILETCONTAINER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.DNSSERVICE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DNSSERVICE.File=../log/dnsservice.log +log4j.appender.DNSSERVICE.DatePattern='.'yyyy-MM-dd +log4j.appender.DNSSERVICE.layout=org.apache.log4j.PatternLayout +log4j.appender.DNSSERVICE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.POP3SERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.POP3SERVER.File=../log/pop3server.log +log4j.appender.POP3SERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.POP3SERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.POP3SERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.SMTPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.SMTPSERVER.File=../log/smtpserver.log +log4j.appender.SMTPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.SMTPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.SMTPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.LMTPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.LMTPSERVER.File=../log/lmtpserver.log +log4j.appender.LMTPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.LMTPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.LMTPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILREPOSITORYSTORE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILREPOSITORYSTORE.File=../log/mailrepositorystore.log +log4j.appender.MAILREPOSITORYSTORE.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILREPOSITORYSTORE.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILREPOSITORYSTORE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.USERSREPOSITORY=org.apache.log4j.DailyRollingFileAppender +log4j.appender.USERSREPOSITORY.File=../log/usersrepository.log +log4j.appender.USERSREPOSITORY.DatePattern='.'yyyy-MM-dd +log4j.appender.USERSREPOSITORY.layout=org.apache.log4j.PatternLayout +log4j.appender.USERSREPOSITORY.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.FETCHMAIL=org.apache.log4j.DailyRollingFileAppender +log4j.appender.FETCHMAIL.File=../log/fetchmail.log +log4j.appender.FETCHMAIL.DatePattern='.'yyyy-MM-dd +log4j.appender.FETCHMAIL.layout=org.apache.log4j.PatternLayout +log4j.appender.FETCHMAIL.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.DOMAINLIST=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DOMAINLIST.File=../log/domainlist.log +log4j.appender.DOMAINLIST.DatePattern='.'yyyy-MM-dd +log4j.appender.DOMAINLIST.layout=org.apache.log4j.PatternLayout +log4j.appender.DOMAINLIST.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.VIRTUALUSERTABLE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.VIRTUALUSERTABLE.File=../log/virtualusertable.log +log4j.appender.VIRTUALUSERTABLE.DatePattern='.'yyyy-MM-dd +log4j.appender.VIRTUALUSERTABLE.layout=org.apache.log4j.PatternLayout +log4j.appender.VIRTUALUSERTABLE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILQUEUEFACTORY=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILQUEUEFACTORY.File=../log/mailqueuefactory.log +log4j.appender.MAILQUEUEFACTORY.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILQUEUEFACTORY.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILQUEUEFACTORY.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.logger.org.apache.jackrabbit=ERROR, CONS, FILE + +log4j.logger.org.apache.xbean.spring=WARN, CONS, FILE +log4j.logger.org.apache.activemq=WARN, CONS, FILE + +log4j.logger.org.apache.camel=WARN, CONS, FILE +log4j.logger.org.springframework=WARN, CONS, FILE +log4j.logger.org.apache.james=INFO, CONS, FILE + +log4j.logger.james=WARN, CONS, FILE +log4j.logger=DEBUG, CONS, FILE + +log4j.logger.james.mailboxmanager=INFO, MAILBOXMANAGER +log4j.logger.james.imapserver=INFO, IMAPSERVER +log4j.logger.james.mailetcontainer=INFO, MAILETCONTAINER +log4j.logger.james.mailetcontext=INFO, MAILETCONTAINER +log4j.logger.james.mailspooler=INFO, MAILETCONTAINER +log4j.logger.james.mailprocessor=INFO, MAILETCONTAINER +log4j.logger.james.dnsservice=INFO, DNSSERVICE +log4j.logger.james.pop3server=INFO, POP3SERVER +log4j.logger.james.smtpserver=INFO, SMTPSERVER +log4j.logger.james.lmtpserver=INFO, LMTPSERVER +log4j.logger.james.mailrepositorystore=INFO, MAILREPOSITORYSTORE +log4j.logger.james.usersrepository=INFO, USERSREPOSITORY +log4j.logger.james.fetchmail=INFO, FETCHMAIL +log4j.logger.james.domainlist=INFO, DOMAINLIST +log4j.logger.james.virtualusertable=INFO, VIRTUALUSERTABLE +log4j.logger.james.mailqueuefactory=INFO, MAILQUEUEFACTORY + diff --git a/deploy/james/apache-james-conf/log4j.properties b/deploy/james/apache-james-conf/log4j.properties new file mode 100644 index 0000000..b888953 --- /dev/null +++ b/deploy/james/apache-james-conf/log4j.properties @@ -0,0 +1,151 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# See http://james.apache.org/server/3/config.html for usage + +log4j.rootLogger=DEBUG + +log4j.appender.CONS=org.apache.log4j.ConsoleAppender +log4j.appender.CONS.layout=org.apache.log4j.PatternLayout +log4j.appender.CONS.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.FILE.File=../log/james-server.log +log4j.appender.FILE.layout=org.apache.log4j.PatternLayout +log4j.appender.FILE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILBOXMANAGER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILBOXMANAGER.File=../log/mailboxmanager.log +log4j.appender.MAILBOXMANAGER.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILBOXMANAGER.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILBOXMANAGER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.IMAPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.IMAPSERVER.File=../log/imapserver.log +log4j.appender.IMAPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.IMAPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.IMAPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILETCONTAINER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILETCONTAINER.File=../log/mailetcontainer.log +log4j.appender.MAILETCONTAINER.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILETCONTAINER.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILETCONTAINER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.DNSSERVICE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DNSSERVICE.File=../log/dnsservice.log +log4j.appender.DNSSERVICE.DatePattern='.'yyyy-MM-dd +log4j.appender.DNSSERVICE.layout=org.apache.log4j.PatternLayout +log4j.appender.DNSSERVICE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.POP3SERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.POP3SERVER.File=../log/pop3server.log +log4j.appender.POP3SERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.POP3SERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.POP3SERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.SMTPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.SMTPSERVER.File=../log/smtpserver.log +log4j.appender.SMTPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.SMTPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.SMTPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.LMTPSERVER=org.apache.log4j.DailyRollingFileAppender +log4j.appender.LMTPSERVER.File=../log/lmtpserver.log +log4j.appender.LMTPSERVER.DatePattern='.'yyyy-MM-dd +log4j.appender.LMTPSERVER.layout=org.apache.log4j.PatternLayout +log4j.appender.LMTPSERVER.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILREPOSITORYSTORE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILREPOSITORYSTORE.File=../log/mailrepositorystore.log +log4j.appender.MAILREPOSITORYSTORE.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILREPOSITORYSTORE.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILREPOSITORYSTORE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.USERSREPOSITORY=org.apache.log4j.DailyRollingFileAppender +log4j.appender.USERSREPOSITORY.File=../log/usersrepository.log +log4j.appender.USERSREPOSITORY.DatePattern='.'yyyy-MM-dd +log4j.appender.USERSREPOSITORY.layout=org.apache.log4j.PatternLayout +log4j.appender.USERSREPOSITORY.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.FETCHMAIL=org.apache.log4j.DailyRollingFileAppender +log4j.appender.FETCHMAIL.File=../log/fetchmail.log +log4j.appender.FETCHMAIL.DatePattern='.'yyyy-MM-dd +log4j.appender.FETCHMAIL.layout=org.apache.log4j.PatternLayout +log4j.appender.FETCHMAIL.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.DOMAINLIST=org.apache.log4j.DailyRollingFileAppender +log4j.appender.DOMAINLIST.File=../log/domainlist.log +log4j.appender.DOMAINLIST.DatePattern='.'yyyy-MM-dd +log4j.appender.DOMAINLIST.layout=org.apache.log4j.PatternLayout +log4j.appender.DOMAINLIST.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.VIRTUALUSERTABLE=org.apache.log4j.DailyRollingFileAppender +log4j.appender.VIRTUALUSERTABLE.File=../log/virtualusertable.log +log4j.appender.VIRTUALUSERTABLE.DatePattern='.'yyyy-MM-dd +log4j.appender.VIRTUALUSERTABLE.layout=org.apache.log4j.PatternLayout +log4j.appender.VIRTUALUSERTABLE.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.appender.MAILQUEUEFACTORY=org.apache.log4j.DailyRollingFileAppender +log4j.appender.MAILQUEUEFACTORY.File=../log/mailqueuefactory.log +log4j.appender.MAILQUEUEFACTORY.DatePattern='.'yyyy-MM-dd +log4j.appender.MAILQUEUEFACTORY.layout=org.apache.log4j.PatternLayout +log4j.appender.MAILQUEUEFACTORY.layout.ConversionPattern=%-5p %d{HH:mm:ss,SSS} | %c | %m%n + +log4j.logger.org.apache.jackrabbit=ERROR, CONS, FILE + +log4j.logger.org.apache.xbean.spring=WARN, CONS, FILE +log4j.logger.org.apache.activemq=WARN, CONS, FILE + +log4j.logger.org.apache.camel=WARN, CONS, FILE +log4j.logger.org.springframework=WARN, CONS, FILE +log4j.logger.org.apache.james=INFO, CONS, FILE + +# tjp +log4j.logger.mail.server.handler=DEBUG, CONS, FILE +log4j.logger.org.apache.james.smtpserver.SendMailHandler=DEBUG, CONS, FILE + +log4j.logger.james=DEBUG, CONS, FILE +log4j.logger=DEBUG, CONS, FILE + +log4j.logger.james.mailboxmanager=INFO, MAILBOXMANAGER +log4j.logger.james.imapserver=INFO, IMAPSERVER +log4j.logger.james.mailetcontainer=DEBUG, MAILETCONTAINER +log4j.logger.james.mailspooler=DEBUG, MAILETCONTAINER +log4j.logger.james.mailprocessor=DEBUG, MAILETCONTAINER +log4j.logger.james.dnsservice=INFO, DNSSERVICE +log4j.logger.james.pop3server=OFF, POP3SERVER + + +#changed additivty tjp +log4j.logger.james.mailetcontext=DEBUG, MAILETCONTAINER +#log4j.additivity.james.mailetcontext = false + +#changed additivty tjp +log4j.logger.james.smtpserver=DEBUG, SMTPSERVER +#log4j.additivity.james.smtpserver = false + +#changed additivty tjp +log4j.logger.james.lmtpserver=DEBUG, LMTPSERVER +#log4j.additivity.james.lmtpserver = false + +log4j.logger.james.mailrepositorystore=INFO, MAILREPOSITORYSTORE +log4j.logger.james.usersrepository=INFO, USERSREPOSITORY +log4j.logger.james.fetchmail=INFO, FETCHMAIL +log4j.logger.james.domainlist=INFO, DOMAINLIST +log4j.logger.james.virtualusertable=INFO, VIRTUALUSERTABLE +log4j.logger.james.mailqueuefactory=INFO, MAILQUEUEFACTORY diff --git a/deploy/james/apache-james-conf/mailbox-jcr-template.cnd b/deploy/james/apache-james-conf/mailbox-jcr-template.cnd new file mode 100644 index 0000000..fd625fd --- /dev/null +++ b/deploy/james/apache-james-conf/mailbox-jcr-template.cnd @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + + + + + + +[jamesMailbox:user] > mix:created + mixin + - jamesMailbox:user (String) + - jamesMailbox:subscriptionMailboxes (STRING) multiple + + * (nt:unstructured) multiple + + +[jamesMailbox:messageHeader] > mix:created, mix:lockable + mixin + - jamesMailbox:headerFieldName (STRING) mandatory + - jamesMailbox:headerValue(STRING) mandatory + - jamesMailbox:headerLineNumber (LONG) mandatory + +[jamesMailbox:messageProperty] > mix:created + mixin + - jamesMailbox:propertyNamespace (STRING) mandatory + - jamesMailbox:propertyLocalName (STRING) mandatory + - jamesMailbox:propertyValue(STRING) mandatory + - jamesMailbox:propertyOrder (Long) mandatory + +[jamesMailbox:message] > mix:referenceable, mix:created, mix:created + mixin + - jamesMailbox:mailboxUUID (String) mandatory + - jamesMailbox:uid (LONG) mandatory + - jamesMailbox:modSeq (LONG) + - jamesMailbox:size (LONG) mandatory + - jamesMailbox:answered (BOOLEAN) + - jamesMailbox:deleted (BOOLEAN) + - jamesMailbox:draft (BOOLEAN) + - jamesMailbox:flagged (BOOLEAN) + - jamesMailbox:recent (BOOLEAN) + - jamesMailbox:seen (BOOLEAN) + - jamesMailbox:internalDate (DATE) + - jamesMailbox:userFlags (STRING) multiple + - jamesMailbox:messageBodyStartOctet (LONG) mandatory + - jamesMailbox:messageTextualLineCount (LONG) + - jamesMailbox:messageSubType (String) mandatory + + messageHeader (nt:unstructured) multiple + + messageProperty (nt:unstructured) multiple + +[jamesMailbox:mailbox] > mix:referenceable, mix:lockable, mix:created + mixin + - jamesMailbox:mailboxUidValidity (LONG) + - jamesMailbox:mailboxName (STRING) + - jamesMailbox:mailboxLastUid (LONG) + - jamesMailbox:mailboxNamespace (STRING) + - jamesMailbox:mailboxUser (STRING) + + * (nt:unstructured) multiple diff --git a/deploy/james/apache-james-conf/mailbox-maildir-template.properties b/deploy/james/apache-james-conf/mailbox-maildir-template.properties new file mode 100644 index 0000000..fb759ab --- /dev/null +++ b/deploy/james/apache-james-conf/mailbox-maildir-template.properties @@ -0,0 +1,24 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# This template file can be used as example for James Server configuration +# DO NOT USE IT AS SUCH AND ADAPT IT TO YOUR NEEDS + +# See http://james.apache.org/server/3/config.html for usage + +maildir.folder=../var/store/maildir/%domain/%user diff --git a/deploy/james/apache-james-conf/mailbox.conf b/deploy/james/apache-james-conf/mailbox.conf new file mode 100644 index 0000000..a53cec6 --- /dev/null +++ b/deploy/james/apache-james-conf/mailbox.conf @@ -0,0 +1,34 @@ + + + + + + + + + + + + + memory + diff --git a/deploy/james/apache-james-conf/mailetcontainer-template.conf b/deploy/james/apache-james-conf/mailetcontainer-template.conf new file mode 100644 index 0000000..b4d85aa --- /dev/null +++ b/deploy/james/apache-james-conf/mailetcontainer-template.conf @@ -0,0 +1,675 @@ + + + + + + + + + + + + + + postmaster@localhost + + + + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + virus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transport + + + + true + + + + + + + transport + + + + + + + + + + + + + + transport + + + + + + + + + + + + + + + + + spam + 550 Requested action not taken: rejected - see http://njabl.org/ + + + + + + + + + + + transport + + + + + + + + + + + + + + + + + + + file://var/mail/error/ + + + + + + + + + + + + + + + X-UserIsAuth + true + + + + X-WasSigned + true + + + + + + + + + + + + + + + + + Sent + false + + + + + + + + + local-address-error + 550 - Requested action not taken: no such user here + + + + + + + + + + + + + + + + + + + + + + + + + relay-denied + 550 - Requested action not taken: relaying denied + + + + + + outgoing + + + + 5 minutes + 10 minutes + 45 minutes + 2 hours + 3 hours + 6 hours + 25 + + + + 0 + + + 10 + + + true + + + + + bounces + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + file://var/mail/spam/ + + + + + + + + + + + + + + + true, bouncing + + + + + heads + none + Warning: We were unable to deliver the message below because it was found infected by virus(es). + + + + + + + + + + + + + + + + + + + + + file://var/mail/address-error/ + + + + + + + + + + + + + + + + + file://var/mail/relay-denied/ + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/mailetcontainer.conf b/deploy/james/apache-james-conf/mailetcontainer.conf new file mode 100644 index 0000000..6ccaa53 --- /dev/null +++ b/deploy/james/apache-james-conf/mailetcontainer.conf @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + postmaster@mailiverse.com + + + + + 20 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + virus + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + transport + + + + true + + + + + + + transport + + + + + + + + + + + + + + transport + + + + + + + + + + + + + + + + + spam + 550 Requested action not taken: rejected - see http://njabl.org/ + + + + + + + + + + + transport + + + + + + + + + + + + + true + + + + + + + + + + + + + + + X-UserIsAuth + true + + + + X-WasSigned + true + + + + + + + + + + + + + + + + + Sent + false + + + + + true + 1 minutes + 10 minutes + 45 minutes + 2 hours + 3 hours + 6 hours + 25 + + + + + + local-address-error + 550 - Requested action not taken: no such user here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + true + false + * + outgoing + + + + 5 minutes + 10 minutes + 45 minutes + 2 hours + 3 hours + 6 hours + 25 + + + + 0 + + + 10 + + + true + + + + + bounces + + + + + + + + + + + + + + + + + + + + + + outgoing.mailiverse.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + true, bouncing + + + + + heads + none + Warning: We were unable to deliver the message below because it was found infected by virus(es). + + + + + + + + + + + + + + + + + + + + + file://var/mail/address-error/ + + + + + + + + + + + + + + + + + file://var/mail/relay-denied/ + + + + + + + + + + + + false + + + + + + + + + + + This is Mailiverse. I'm not able to deliver this message. + + + + + + diff --git a/deploy/james/apache-james-conf/mailrepositorystore-template.conf b/deploy/james/apache-james-conf/mailrepositorystore-template.conf new file mode 100644 index 0000000..291fa24 --- /dev/null +++ b/deploy/james/apache-james-conf/mailrepositorystore-template.conf @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + file + + + + + + + + + + db + + + file://conf/sqlResources.xml + + + + + + + + + + + + dbfile + + + file://conf/sqlResources.xml + file://var/dbmail + + + + + + + mbox + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/pop3server-template.conf b/deploy/james/apache-james-conf/pop3server-template.conf new file mode 100644 index 0000000..83d1558 --- /dev/null +++ b/deploy/james/apache-james-conf/pop3server-template.conf @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + pop3server + + + + + 0.0.0.0:110 + + 200 + + + + + file://conf/keystore + yoursecret + org.bouncycastle.jce.provider.BouncyCastleProvider + + + + + + + + + + 1200 + + + 0 + + + 0 + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/recipientrewritetable-template.conf b/deploy/james/apache-james-conf/recipientrewritetable-template.conf new file mode 100644 index 0000000..b5399be --- /dev/null +++ b/deploy/james/apache-james-conf/recipientrewritetable-template.conf @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + true + 10 + + diff --git a/deploy/james/apache-james-conf/smtpserver-template.conf b/deploy/james/apache-james-conf/smtpserver-template.conf new file mode 100644 index 0000000..86ae510 --- /dev/null +++ b/deploy/james/apache-james-conf/smtpserver-template.conf @@ -0,0 +1,323 @@ + + + + + + + + + + + + + + smtpserver + + + + + + 0.0.0.0:25 + + 200 + + + + + file://conf/keystore + yoursecret + org.bouncycastle.jce.provider.BouncyCastleProvider + + SunX509 + + + + + + + + + + + 360 + + + 0 + + + 0 + + + + + + + 127.0.0.0/8 + + + + + + + + + + 0 + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/smtpserver.conf b/deploy/james/apache-james-conf/smtpserver.conf new file mode 100644 index 0000000..b86d9d7 --- /dev/null +++ b/deploy/james/apache-james-conf/smtpserver.conf @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + smtpserver + + + + + + 0.0.0.0:10025 + + 200 + + + + file://conf/keystore + password + org.bouncycastle.jce.provider.BouncyCastleProvider + + SunX509 + + + + + + + + mail.mailiverse.com + + + 360 + + + 0 + + + 0 + + + true + + + + + + + + + + + + + + 0 + + + + + + + + + true + + + + + + + + + + + + + + + + + + + false + + query.bondedsender.org. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/sqlResources-template.xml b/deploy/james/apache-james-conf/sqlResources-template.xml new file mode 100644 index 0000000..f3ed58d --- /dev/null +++ b/deploy/james/apache-james-conf/sqlResources-template.xml @@ -0,0 +1,938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${table} + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + ORDER BY username + + + + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + WHERE lower(username) = ? + + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + WHERE username = ? + + + + INSERT INTO ${table} + (username, pwdHash, pwdAlgorithm, useForwarding, forwardDestination, useAlias, alias) + VALUES (?,?,?,?,?,?,?) + + + + UPDATE ${table} SET + pwdHash = ?, pwdAlgorithm = ?, useForwarding = ?, forwardDestination = ?, useAlias = ?, alias = ? + WHERE username = ? + + + + DELETE FROM ${table} WHERE username = ? + + + CREATE CACHED TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), useForwarding INTEGER, forwardDestination VARCHAR(255), useAlias INTEGER, alias VARCHAR(255), PRIMARY KEY(username)) + CREATE TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), useForwarding SMALLINT, forwardDestination VARCHAR(255), useAlias SMALLINT, alias VARCHAR(255), PRIMARY KEY(username)) + + + + + ${table} + + + SELECT username, pwdHash, pwdAlgorithm + FROM ${table} + + + + INSERT INTO ${table} + (username, pwdHash, pwdAlgorithm) + VALUES (?,?,?) + + + + UPDATE ${table} SET + pwdHash = ?, pwdAlgorithm = ? + WHERE username = ? + + + + DELETE FROM ${table} WHERE username = ? + + + CREATE CACHED TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), PRIMARY KEY(username)) + CREATE TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), PRIMARY KEY(username)) + + + + + + + ${table} + + + SELECT listSubscriber + FROM ${table} + WHERE listName = '${key}' + + + + INSERT INTO ${table} + (listSubscriber, listName) + VALUES (?, '${key}') + + + + UPDATE ${table} SET + listSubscriber = ? + WHERE listSubscriber = ? AND listName = '${key}' + + + + DELETE FROM ${table} + WHERE listSubscriber = ? AND listName = '${key}' + + + + CREATE CACHED TABLE ${table} (listName VARCHAR(64) NOT NULL, listSubscriber VARCHAR(255) NOT NULL, PRIMARY KEY(listName, listSubscriber)) + CREATE TABLE ${table} (listName VARCHAR(64) NOT NULL, listSubscriber VARCHAR(255) NOT NULL, PRIMARY KEY(listName, listSubscriber)) + + + + + + SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ? + + + INSERT INTO ${table} (message_name, + repository_name, message_state, error_message, sender, recipients, + remote_host, remote_addr, last_updated, message_body, + message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + + + SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ? + + + + SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + + + DELETE FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC + + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (100) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients text NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body longblob NOT NULL , + message_attributes longblob NULL , + last_updated datetime NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE CACHED TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body varchar NOT NULL , + message_attributes varchar NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE CACHED TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body varchar NOT NULL , + message_attributes varchar NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE [${table}] ( + [message_name] [varchar] (200) NOT NULL, + [repository_name] [varchar] (255) NOT NULL, + [message_state] [varchar] (30) NOT NULL , + [error_message] [varchar] (1000) NULL , + [sender] [varchar] (255) NULL , + [recipients] [text] NOT NULL , + [remote_host] [varchar] (255) NOT NULL , + [remote_addr] [varchar] (20) NOT NULL , + [message_body] [image] NOT NULL , + [message_attributes] [image] NULL , + [last_updated] [datetime] NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar2(200) NOT NULL , + repository_name varchar2(255) NOT NULL , + message_state varchar2(30) NOT NULL , + error_message varchar2(200) NULL , + sender varchar2(255) , + recipients varchar2(1000) NOT NULL , + remote_host varchar2(100) NOT NULL , + remote_addr varchar2(20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob NULL , + last_updated date NOT NULL , + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients text NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body bytea NOT NULL , + message_attributes bytea NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (200) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (200) NULL , + recipients long NOT NULL , + remote_host varchar (100) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body long byte NOT NULL , + message_attributes long byte NULL , + last_updated date NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar(200) NOT NULL , + repository_name varchar(255) NOT NULL , + message_state varchar(30) NOT NULL , + error_message varchar(200) , + sender varchar(255) , + recipients varchar(1000) NOT NULL , + remote_host varchar(100) NOT NULL , + remote_addr varchar(20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob , + last_updated timestamp NOT NULL , + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) , + sender varchar (255) , + recipients LONG VARCHAR NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body LONG BYTE NOT NULL , + message_attributes LONG BYTE , + last_updated DATE NOT NULL + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) , + sender varchar (255) , + recipients long varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + + + + bayesiananalysis_ham + bayesiananalysis_spam + bayesiananalysis_messagecounts + + + SELECT HAMCOUNT, SPAMCOUNT FROM bayesiananalysis_messagecounts + + + INSERT INTO bayesiananalysis_messagecounts (HAMCOUNT, SPAMCOUNT) VALUES (0,0) + + + UPDATE bayesiananalysis_messagecounts SET HAMCOUNT=(HAMCOUNT + ?) + + + UPDATE bayesiananalysis_messagecounts SET SPAMCOUNT=(SPAMCOUNT + ?) + + + SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_ham + + + SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_spam + + + INSERT INTO bayesiananalysis_ham (TOKEN, OCCURRENCES) VALUES (?,?) + + + INSERT INTO bayesiananalysis_spam (TOKEN, OCCURRENCES) VALUES (?,?) + + + UPDATE bayesiananalysis_ham SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?) + + + UPDATE bayesiananalysis_spam SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?) + + + DELETE FROM bayesiananalysis_ham + + + DELETE FROM bayesiananalysis_spam + + + DELETE FROM bayesiananalysis_messagecounts + + + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) binary NOT NULL default '', + occurrences int(11) NOT NULL default '0', + PRIMARY KEY (token) + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_ham] ( + [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL, + [occurrences] [int] NOT NULL default (0), + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) NOT NULL, + occurrences INTEGER NOT NULL default 0, + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) NOT NULL, + occurrences int NOT NULL default 0, + PRIMARY KEY (token) + ) + + + + + CREATE TABLE bayesiananalysis_spam ( + token varchar(128) binary NOT NULL default '', + occurrences int(11) NOT NULL default '0', + PRIMARY KEY (token) + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_spam] ( + [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL, + [occurrences] [int] NOT NULL default (0), + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_spam ( + token varchar (128) NOT NULL, + occurrences INTEGER NOT NULL default 0, + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_spam ( + token varchar (128) NOT NULL, + occurrences int NOT NULL default 0, + PRIMARY KEY (token) + ) + + + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount int(11) NOT NULL default '0', + spamcount int(11) NOT NULL default '0' + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_messagecounts] ( + [hamcount] [int] NOT NULL default (0), + [spamcount] [int] NOT NULL default (0) + ) + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount INTEGER NOT NULL default 0, + spamcount INTEGER NOT NULL default 0 + ) + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount int NOT NULL default 0, + spamcount int NOT NULL default 0 + ) + + + + + + whitelist + + + SELECT localUser, localHost FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?) + + + SELECT remoteUser, remoteHost FROM whitelist where (localUser=? AND localHost=?) ORDER BY remoteUser, remoteHost + + + INSERT INTO whitelist (localUser, localHost, remoteUser, remoteHost) VALUES (?,?,?,?) + + + DELETE FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?) + + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + CREATE CACHED TABLE ${table} ( + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) character set latin1 NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) character set latin1 NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) TYPE=InnoDB + + + CREATE TABLE [whitelist] ( + [localUser] [varchar] (64) NOT NULL, + [localHost] [varchar] (255) NOT NULL, + [remoteUser] [varchar] (64) NOT NULL, + [remoteHost] [varchar] (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + + + + + networkWhitelist + + + SELECT network FROM networkWhitelist where (localUser=? AND localHost=?) + + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost) + ) + + CREATE CACHED TABLE ${table} ( + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) character set latin1 NOT NULL, + network varchar (255) NOT NULL + ) TYPE=InnoDB + + + CREATE TABLE [networkWhitelist] ( + [localUser] [varchar] (64) NOT NULL, + [localHost] [varchar] (255) NOT NULL, + [network] [varchar] (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + + + + + greylist + + + SELECT create_time,count FROM greylist WHERE ipaddress = ? AND sender = ? AND recip = ? + + + INSERT INTO greylist (ipaddress,sender,recip,count,create_time) values (?,?,?,?,?) + + + DELETE FROM greylist WHERE create_time < ? AND count = 0 + + + DELETE FROM greylist WHERE create_time < ? + + + UPDATE greylist SET create_time = ? , count = ? WHERE ipaddress = ? AND sender = ? AND recip = ? + + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE CACHED TABLE ${table} ( + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamo NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) TYPE=InnoDB + + + CREATE TABLE [greylist] ( + [ipaddress] [varchar] (20) NOT NULL, + [sender] [varchar] (255) NOT NULL, + [recip] [varchar] (255) NOT NULL, + [count] [int] NOT NULL, + [create_time] [datetime] NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar2(20) NOT NULL, + sender varchar2(255) NOT NULL, + recip varchar2(255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time date NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time date NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + + + + + select RecipientRewriteTable.target_address,(RecipientRewriteTable."user" || '@' ||RecipientRewriteTable.domain) from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where ((RecipientRewriteTable."user") like ? or (RecipientRewriteTable."user") = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by 2 desc + select RecipientRewriteTable.target_address from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where (RecipientRewriteTable.user like ? or RecipientRewriteTable.user = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by concat(RecipientRewriteTable.user,'@',RecipientRewriteTable.domain) desc limit 1 + select RecipientRewriteTable.target_address from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where (RecipientRewriteTable.user like ? or RecipientRewriteTable.user = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by (RecipientRewriteTable.user || '@' || RecipientRewriteTable.domain) desc limit 1 + + select RecipientRewriteTable.target_address from RecipientRewriteTable where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? + select RecipientRewriteTable.target_address from RecipientRewriteTable where RecipientRewriteTable.user = ? and RecipientRewriteTable.domain = ? + + delete from RecipientRewriteTable where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? and RecipientRewriteTable.target_address = ? + + update RecipientRewriteTable set RecipientRewriteTable.target_address = ? where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? + + insert into RecipientRewriteTable values(?,?,?) + + select * from RecipientRewriteTable + + + + CREATE TABLE RecipientRewriteTable ( + user varchar(64) NOT NULL default '', + domain varchar(255) NOT NULL default '', + target_address varchar(255) NOT NULL default '', + PRIMARY KEY (user,domain) + ) + + + + + CREATE TABLE RecipientRewriteTable ( + "user" varchar(64) NOT NULL default '', + domain varchar(255) NOT NULL default '', + target_address varchar(255) NOT NULL default '', + PRIMARY KEY ("user",domain) + ) + + + CREATE TABLE RecipientRewriteTable ( + "user" varchar (64) NOT NULL default '', + domain varchar (255) NOT NULL default '', + target_address varchar (255) NOT NULL default '', + PRIMARY KEY ("user",domain) + ) + + + + + diff --git a/deploy/james/apache-james-conf/sqlResources.xml b/deploy/james/apache-james-conf/sqlResources.xml new file mode 100644 index 0000000..f3ed58d --- /dev/null +++ b/deploy/james/apache-james-conf/sqlResources.xml @@ -0,0 +1,938 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${table} + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + ORDER BY username + + + + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + WHERE lower(username) = ? + + + + SELECT username, pwdHash, pwdAlgorithm, useForwarding, + forwardDestination, useAlias, alias + FROM ${table} + WHERE username = ? + + + + INSERT INTO ${table} + (username, pwdHash, pwdAlgorithm, useForwarding, forwardDestination, useAlias, alias) + VALUES (?,?,?,?,?,?,?) + + + + UPDATE ${table} SET + pwdHash = ?, pwdAlgorithm = ?, useForwarding = ?, forwardDestination = ?, useAlias = ?, alias = ? + WHERE username = ? + + + + DELETE FROM ${table} WHERE username = ? + + + CREATE CACHED TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), useForwarding INTEGER, forwardDestination VARCHAR(255), useAlias INTEGER, alias VARCHAR(255), PRIMARY KEY(username)) + CREATE TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), useForwarding SMALLINT, forwardDestination VARCHAR(255), useAlias SMALLINT, alias VARCHAR(255), PRIMARY KEY(username)) + + + + + ${table} + + + SELECT username, pwdHash, pwdAlgorithm + FROM ${table} + + + + INSERT INTO ${table} + (username, pwdHash, pwdAlgorithm) + VALUES (?,?,?) + + + + UPDATE ${table} SET + pwdHash = ?, pwdAlgorithm = ? + WHERE username = ? + + + + DELETE FROM ${table} WHERE username = ? + + + CREATE CACHED TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), PRIMARY KEY(username)) + CREATE TABLE ${table} (username VARCHAR(64) NOT NULL, pwdHash VARCHAR(50), pwdAlgorithm VARCHAR(20), PRIMARY KEY(username)) + + + + + + + ${table} + + + SELECT listSubscriber + FROM ${table} + WHERE listName = '${key}' + + + + INSERT INTO ${table} + (listSubscriber, listName) + VALUES (?, '${key}') + + + + UPDATE ${table} SET + listSubscriber = ? + WHERE listSubscriber = ? AND listName = '${key}' + + + + DELETE FROM ${table} + WHERE listSubscriber = ? AND listName = '${key}' + + + + CREATE CACHED TABLE ${table} (listName VARCHAR(64) NOT NULL, listSubscriber VARCHAR(255) NOT NULL, PRIMARY KEY(listName, listSubscriber)) + CREATE TABLE ${table} (listName VARCHAR(64) NOT NULL, listSubscriber VARCHAR(255) NOT NULL, PRIMARY KEY(listName, listSubscriber)) + + + + + + SELECT count(*) FROM ${table} WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_state = ?, error_message = ?, sender = ?, recipients = ?, remote_host = ?, remote_addr = ?, last_updated = ? WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_body = ? WHERE message_name = ? AND repository_name = ? + + + UPDATE ${table} SET message_attributes = ? WHERE message_name = ? AND repository_name = ? + + + INSERT INTO ${table} (message_name, + repository_name, message_state, error_message, sender, recipients, + remote_host, remote_addr, last_updated, message_body, + message_attributes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + + + SELECT message_state, error_message, sender, recipients, remote_host, remote_addr, last_updated FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_body FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_attributes FROM ${table} WHERE message_name = ? AND repository_name = ? + + + + SELECT datalength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT dbms_lob.getlength(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + SELECT length(message_body) FROM ${table} WHERE message_name = ? AND repository_name = ? + + + DELETE FROM ${table} WHERE message_name = ? AND repository_name = ? + + + SELECT message_name, message_state, last_updated FROM ${table} WHERE repository_name = ? ORDER BY last_updated ASC + + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (100) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients text NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body longblob NOT NULL , + message_attributes longblob NULL , + last_updated datetime NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE CACHED TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body varchar NOT NULL , + message_attributes varchar NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE CACHED TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body varchar NOT NULL , + message_attributes varchar NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE [${table}] ( + [message_name] [varchar] (200) NOT NULL, + [repository_name] [varchar] (255) NOT NULL, + [message_state] [varchar] (30) NOT NULL , + [error_message] [varchar] (1000) NULL , + [sender] [varchar] (255) NULL , + [recipients] [text] NOT NULL , + [remote_host] [varchar] (255) NOT NULL , + [remote_addr] [varchar] (20) NOT NULL , + [message_body] [image] NOT NULL , + [message_attributes] [image] NULL , + [last_updated] [datetime] NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar2(200) NOT NULL , + repository_name varchar2(255) NOT NULL , + message_state varchar2(30) NOT NULL , + error_message varchar2(200) NULL , + sender varchar2(255) , + recipients varchar2(1000) NOT NULL , + remote_host varchar2(100) NOT NULL , + remote_addr varchar2(20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob NULL , + last_updated date NOT NULL , + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (255) NULL , + recipients text NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body bytea NOT NULL , + message_attributes bytea NULL , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (200) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) NULL , + sender varchar (200) NULL , + recipients long NOT NULL , + remote_host varchar (100) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body long byte NOT NULL , + message_attributes long byte NULL , + last_updated date NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar(200) NOT NULL , + repository_name varchar(255) NOT NULL , + message_state varchar(30) NOT NULL , + error_message varchar(200) , + sender varchar(255) , + recipients varchar(1000) NOT NULL , + remote_host varchar(100) NOT NULL , + remote_addr varchar(20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob , + last_updated timestamp NOT NULL , + PRIMARY KEY (repository_name, message_name) + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) , + sender varchar (255) , + recipients LONG VARCHAR NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body LONG BYTE NOT NULL , + message_attributes LONG BYTE , + last_updated DATE NOT NULL + ) + + + CREATE TABLE ${table} ( + message_name varchar (200) NOT NULL, + repository_name varchar (255) NOT NULL, + message_state varchar (30) NOT NULL , + error_message varchar (200) , + sender varchar (255) , + recipients long varchar NOT NULL , + remote_host varchar (255) NOT NULL , + remote_addr varchar (20) NOT NULL , + message_body blob NOT NULL , + message_attributes blob , + last_updated timestamp NOT NULL, + PRIMARY KEY (repository_name, message_name) + ) + + + + + + bayesiananalysis_ham + bayesiananalysis_spam + bayesiananalysis_messagecounts + + + SELECT HAMCOUNT, SPAMCOUNT FROM bayesiananalysis_messagecounts + + + INSERT INTO bayesiananalysis_messagecounts (HAMCOUNT, SPAMCOUNT) VALUES (0,0) + + + UPDATE bayesiananalysis_messagecounts SET HAMCOUNT=(HAMCOUNT + ?) + + + UPDATE bayesiananalysis_messagecounts SET SPAMCOUNT=(SPAMCOUNT + ?) + + + SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_ham + + + SELECT TOKEN, OCCURRENCES FROM bayesiananalysis_spam + + + INSERT INTO bayesiananalysis_ham (TOKEN, OCCURRENCES) VALUES (?,?) + + + INSERT INTO bayesiananalysis_spam (TOKEN, OCCURRENCES) VALUES (?,?) + + + UPDATE bayesiananalysis_ham SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?) + + + UPDATE bayesiananalysis_spam SET OCCURRENCES=(OCCURRENCES + ?) WHERE (TOKEN=?) + + + DELETE FROM bayesiananalysis_ham + + + DELETE FROM bayesiananalysis_spam + + + DELETE FROM bayesiananalysis_messagecounts + + + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) binary NOT NULL default '', + occurrences int(11) NOT NULL default '0', + PRIMARY KEY (token) + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_ham] ( + [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL, + [occurrences] [int] NOT NULL default (0), + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) NOT NULL, + occurrences INTEGER NOT NULL default 0, + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_ham ( + token varchar(128) NOT NULL, + occurrences int NOT NULL default 0, + PRIMARY KEY (token) + ) + + + + + CREATE TABLE bayesiananalysis_spam ( + token varchar(128) binary NOT NULL default '', + occurrences int(11) NOT NULL default '0', + PRIMARY KEY (token) + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_spam] ( + [token] [varchar] (128) COLLATE Latin1_General_CS_AS NOT NULL, + [occurrences] [int] NOT NULL default (0), + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_spam ( + token varchar (128) NOT NULL, + occurrences INTEGER NOT NULL default 0, + PRIMARY KEY (token) + ) + + + CREATE TABLE bayesiananalysis_spam ( + token varchar (128) NOT NULL, + occurrences int NOT NULL default 0, + PRIMARY KEY (token) + ) + + + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount int(11) NOT NULL default '0', + spamcount int(11) NOT NULL default '0' + ) TYPE=InnoDB + + + CREATE TABLE [bayesiananalysis_messagecounts] ( + [hamcount] [int] NOT NULL default (0), + [spamcount] [int] NOT NULL default (0) + ) + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount INTEGER NOT NULL default 0, + spamcount INTEGER NOT NULL default 0 + ) + + + CREATE TABLE bayesiananalysis_messagecounts ( + hamcount int NOT NULL default 0, + spamcount int NOT NULL default 0 + ) + + + + + + whitelist + + + SELECT localUser, localHost FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?) + + + SELECT remoteUser, remoteHost FROM whitelist where (localUser=? AND localHost=?) ORDER BY remoteUser, remoteHost + + + INSERT INTO whitelist (localUser, localHost, remoteUser, remoteHost) VALUES (?,?,?,?) + + + DELETE FROM whitelist where (localUser=? AND localHost=? AND remoteUser=? AND remoteHost=?) + + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + CREATE CACHED TABLE ${table} ( + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) character set latin1 NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) character set latin1 NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) TYPE=InnoDB + + + CREATE TABLE [whitelist] ( + [localUser] [varchar] (64) NOT NULL, + [localHost] [varchar] (255) NOT NULL, + [remoteUser] [varchar] (64) NOT NULL, + [remoteHost] [varchar] (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + CREATE TABLE whitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + remoteUser varchar (64) NOT NULL, + remoteHost varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost, remoteUser, remoteHost) + ) + + + + + + + networkWhitelist + + + SELECT network FROM networkWhitelist where (localUser=? AND localHost=?) + + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL, + PRIMARY KEY (localUser, localHost) + ) + + CREATE CACHED TABLE ${table} ( + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) character set latin1 NOT NULL, + network varchar (255) NOT NULL + ) TYPE=InnoDB + + + CREATE TABLE [networkWhitelist] ( + [localUser] [varchar] (64) NOT NULL, + [localHost] [varchar] (255) NOT NULL, + [network] [varchar] (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + CREATE TABLE networkWhitelist ( + localUser varchar (64) NOT NULL, + localHost varchar (255) NOT NULL, + network varchar (255) NOT NULL + ) + + + + + + + greylist + + + SELECT create_time,count FROM greylist WHERE ipaddress = ? AND sender = ? AND recip = ? + + + INSERT INTO greylist (ipaddress,sender,recip,count,create_time) values (?,?,?,?,?) + + + DELETE FROM greylist WHERE create_time < ? AND count = 0 + + + DELETE FROM greylist WHERE create_time < ? + + + UPDATE greylist SET create_time = ? , count = ? WHERE ipaddress = ? AND sender = ? AND recip = ? + + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE CACHED TABLE ${table} ( + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamo NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) TYPE=InnoDB + + + CREATE TABLE [greylist] ( + [ipaddress] [varchar] (20) NOT NULL, + [sender] [varchar] (255) NOT NULL, + [recip] [varchar] (255) NOT NULL, + [count] [int] NOT NULL, + [create_time] [datetime] NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar2(20) NOT NULL, + sender varchar2(255) NOT NULL, + recip varchar2(255) NOT NULL, + count int NOT NULL, + create_time datetime NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time date NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time date NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + CREATE TABLE greylist ( + ipaddress varchar (20) NOT NULL, + sender varchar (255) NOT NULL, + recip varchar (255) NOT NULL, + count int NOT NULL, + create_time timestamp NOT NULL, + PRIMARY KEY (ipaddress,sender,recip) + ) + + + + + + + select RecipientRewriteTable.target_address,(RecipientRewriteTable."user" || '@' ||RecipientRewriteTable.domain) from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where ((RecipientRewriteTable."user") like ? or (RecipientRewriteTable."user") = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by 2 desc + select RecipientRewriteTable.target_address from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where (RecipientRewriteTable.user like ? or RecipientRewriteTable.user = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by concat(RecipientRewriteTable.user,'@',RecipientRewriteTable.domain) desc limit 1 + select RecipientRewriteTable.target_address from RecipientRewriteTable, RecipientRewriteTable as VUTDomains where (RecipientRewriteTable.user like ? or RecipientRewriteTable.user = '*') and (RecipientRewriteTable.domain like ? or (RecipientRewriteTable.domain = '*')) order by (RecipientRewriteTable.user || '@' || RecipientRewriteTable.domain) desc limit 1 + + select RecipientRewriteTable.target_address from RecipientRewriteTable where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? + select RecipientRewriteTable.target_address from RecipientRewriteTable where RecipientRewriteTable.user = ? and RecipientRewriteTable.domain = ? + + delete from RecipientRewriteTable where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? and RecipientRewriteTable.target_address = ? + + update RecipientRewriteTable set RecipientRewriteTable.target_address = ? where RecipientRewriteTable."user" = ? and RecipientRewriteTable.domain = ? + + insert into RecipientRewriteTable values(?,?,?) + + select * from RecipientRewriteTable + + + + CREATE TABLE RecipientRewriteTable ( + user varchar(64) NOT NULL default '', + domain varchar(255) NOT NULL default '', + target_address varchar(255) NOT NULL default '', + PRIMARY KEY (user,domain) + ) + + + + + CREATE TABLE RecipientRewriteTable ( + "user" varchar(64) NOT NULL default '', + domain varchar(255) NOT NULL default '', + target_address varchar(255) NOT NULL default '', + PRIMARY KEY ("user",domain) + ) + + + CREATE TABLE RecipientRewriteTable ( + "user" varchar (64) NOT NULL default '', + domain varchar (255) NOT NULL default '', + target_address varchar (255) NOT NULL default '', + PRIMARY KEY ("user",domain) + ) + + + + + diff --git a/deploy/james/apache-james-conf/usersrepository-template.conf b/deploy/james/apache-james-conf/usersrepository-template.conf new file mode 100644 index 0000000..3f68ed3 --- /dev/null +++ b/deploy/james/apache-james-conf/usersrepository-template.conf @@ -0,0 +1,81 @@ + + + + + + + + + + + + + + + + + MD5 + false + + + + + + + + + + + + + + + + + + + + + + diff --git a/deploy/james/apache-james-conf/usersrepository23-template.conf b/deploy/james/apache-james-conf/usersrepository23-template.conf new file mode 100644 index 0000000..5709494 --- /dev/null +++ b/deploy/james/apache-james-conf/usersrepository23-template.conf @@ -0,0 +1,36 @@ + + + + + + + + + + + true + true + true + false + + diff --git a/deploy/james/apache-james-conf/wrapper.conf b/deploy/james/apache-james-conf/wrapper.conf new file mode 100644 index 0000000..20a29d9 --- /dev/null +++ b/deploy/james/apache-james-conf/wrapper.conf @@ -0,0 +1,234 @@ +#******************************************************************** +# Wrapper Properties +#******************************************************************** +# Java Application +wrapper.java.command=java +wrapper.working.dir=. + +# Java Main class. This class must implement the WrapperListener interface +# or guarantee that the WrapperManager class is initialized. Helper +# classes are provided to do this for you. See the Integration section +# of the documentation for details. +wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp +set.default.REPO_DIR=../lib +set.default.APP_BASE=. + +# Java Classpath (include wrapper.jar) Add class path elements as +# needed starting from 1 +wrapper.java.classpath.1=%REPO_DIR%/wrapper.jar +wrapper.java.classpath.2=../conf +wrapper.java.classpath.3=%REPO_DIR%/apache-james-3.0-beta4.jar +wrapper.java.classpath.4=%REPO_DIR%/james-server-cli-3.0-beta4.jar +wrapper.java.classpath.5=%REPO_DIR%/commons-cli-1.2.jar +wrapper.java.classpath.6=%REPO_DIR%/james-server-core-3.0-beta4.jar +wrapper.java.classpath.7=%REPO_DIR%/apache-mailet-2.4.jar +wrapper.java.classpath.8=%REPO_DIR%/apache-mailet-base-1.1.jar +wrapper.java.classpath.9=%REPO_DIR%/commons-io-2.0.1.jar +wrapper.java.classpath.10=%REPO_DIR%/mail-1.4.4.jar +wrapper.java.classpath.11=%REPO_DIR%/james-server-data-api-3.0-beta4.jar +wrapper.java.classpath.12=%REPO_DIR%/james-server-dnsservice-library-3.0-beta4.jar +wrapper.java.classpath.13=%REPO_DIR%/james-server-filesystem-api-3.0-beta4.jar +wrapper.java.classpath.14=%REPO_DIR%/apache-jsieve-manager-api-0.5.jar +wrapper.java.classpath.15=%REPO_DIR%/james-server-lifecycle-api-3.0-beta4.jar +wrapper.java.classpath.16=%REPO_DIR%/commons-configuration-1.6.jar +wrapper.java.classpath.17=%REPO_DIR%/commons-lang-2.6.jar +wrapper.java.classpath.18=%REPO_DIR%/james-server-mailetcontainer-api-3.0-beta4.jar +wrapper.java.classpath.19=%REPO_DIR%/james-server-queue-api-3.0-beta4.jar +wrapper.java.classpath.20=%REPO_DIR%/james-server-container-spring-3.0-beta4.jar +wrapper.java.classpath.21=%REPO_DIR%/apache-james-mailbox-api-0.4.jar +wrapper.java.classpath.22=%REPO_DIR%/apache-james-mailbox-tool-0.4.jar +wrapper.java.classpath.23=%REPO_DIR%/geronimo-annotation_1.0_spec-1.1.1.jar +wrapper.java.classpath.24=%REPO_DIR%/protocols-api-1.6.2.jar +wrapper.java.classpath.25=%REPO_DIR%/spring-core-3.1.0.RELEASE.jar +wrapper.java.classpath.26=%REPO_DIR%/spring-asm-3.1.0.RELEASE.jar +wrapper.java.classpath.27=%REPO_DIR%/spring-beans-3.1.0.RELEASE.jar +wrapper.java.classpath.28=%REPO_DIR%/spring-context-3.1.0.RELEASE.jar +wrapper.java.classpath.29=%REPO_DIR%/spring-expression-3.1.0.RELEASE.jar +wrapper.java.classpath.30=%REPO_DIR%/spring-web-3.1.0.RELEASE.jar +wrapper.java.classpath.31=%REPO_DIR%/log4j-1.2.16.jar +wrapper.java.classpath.32=%REPO_DIR%/james-server-lifecycle-spring-3.0-beta4.jar +wrapper.java.classpath.33=%REPO_DIR%/geronimo-annotation_1.1_spec-1.0.1.jar +wrapper.java.classpath.34=%REPO_DIR%/geronimo-jpa_2.0_spec-1.0.jar +wrapper.java.classpath.35=%REPO_DIR%/slf4j-api-1.6.1.jar +wrapper.java.classpath.36=%REPO_DIR%/slf4j-log4j12-1.6.1.jar +wrapper.java.classpath.37=%REPO_DIR%/jcl-over-slf4j-1.6.1.jar +wrapper.java.classpath.38=%REPO_DIR%/commons-daemon-1.0.5.jar +wrapper.java.classpath.39=%REPO_DIR%/camel-core-2.5.0.jar +wrapper.java.classpath.40=%REPO_DIR%/commons-logging-api-1.1.jar +wrapper.java.classpath.41=%REPO_DIR%/commons-management-1.0.jar +wrapper.java.classpath.42=%REPO_DIR%/camel-spring-2.5.0.jar +wrapper.java.classpath.43=%REPO_DIR%/spring-aop-3.1.0.RELEASE.jar +wrapper.java.classpath.44=%REPO_DIR%/xbean-spring-3.6.jar +wrapper.java.classpath.45=%REPO_DIR%/commons-logging-1.0.3.jar +wrapper.java.classpath.46=%REPO_DIR%/spring-jms-3.1.0.RELEASE.jar +wrapper.java.classpath.47=%REPO_DIR%/aopalliance-1.0.jar +wrapper.java.classpath.48=%REPO_DIR%/spring-orm-3.1.0.RELEASE.jar +wrapper.java.classpath.49=%REPO_DIR%/spring-tx-3.1.0.RELEASE.jar +wrapper.java.classpath.50=%REPO_DIR%/spring-jdbc-3.1.0.RELEASE.jar +wrapper.java.classpath.51=%REPO_DIR%/james-server-mailetcontainer-camel-3.0-beta4.jar +wrapper.java.classpath.52=%REPO_DIR%/james-server-mailbox-adapter-3.0-beta4.jar +wrapper.java.classpath.53=%REPO_DIR%/apache-james-mailbox-store-0.4.jar +wrapper.java.classpath.54=%REPO_DIR%/apache-james-mailbox-maildir-0.4.jar +wrapper.java.classpath.55=%REPO_DIR%/james-server-dnsservice-api-3.0-beta4.jar +wrapper.java.classpath.56=%REPO_DIR%/james-server-dnsservice-dnsjava-3.0-beta4.jar +wrapper.java.classpath.57=%REPO_DIR%/dnsjava-2.1.1.jar +wrapper.java.classpath.58=%REPO_DIR%/james-server-protocols-library-3.0-beta4.jar +wrapper.java.classpath.59=%REPO_DIR%/protocols-netty-1.6.2.jar +wrapper.java.classpath.60=%REPO_DIR%/netty-3.3.1.Final.jar +wrapper.java.classpath.61=%REPO_DIR%/james-server-util-3.0-beta4.jar +wrapper.java.classpath.62=%REPO_DIR%/james-server-data-library-3.0-beta4.jar +wrapper.java.classpath.63=%REPO_DIR%/james-server-data-ldap-3.0-beta4.jar +wrapper.java.classpath.64=%REPO_DIR%/james-server-protocols-smtp-3.0-beta4.jar +wrapper.java.classpath.65=%REPO_DIR%/protocols-smtp-1.6.2.jar +wrapper.java.classpath.66=%REPO_DIR%/apache-jspf-resolver-1.0.0.jar +wrapper.java.classpath.67=%REPO_DIR%/james-server-protocols-imap4-3.0-beta4.jar +wrapper.java.classpath.68=%REPO_DIR%/apache-james-imap-api-0.3.jar +wrapper.java.classpath.69=%REPO_DIR%/jutf7-1.0.0.jar +wrapper.java.classpath.70=%REPO_DIR%/apache-james-imap-message-0.3.jar +wrapper.java.classpath.71=%REPO_DIR%/james-server-protocols-lmtp-3.0-beta4.jar +wrapper.java.classpath.72=%REPO_DIR%/protocols-lmtp-1.6.2.jar +wrapper.java.classpath.73=%REPO_DIR%/james-server-protocols-pop3-3.0-beta4.jar +wrapper.java.classpath.74=%REPO_DIR%/protocols-pop3-1.6.2.jar +wrapper.java.classpath.75=%REPO_DIR%/james-server-fetchmail-3.0-beta4.jar +wrapper.java.classpath.76=%REPO_DIR%/james-server-queue-file-3.0-beta4.jar +wrapper.java.classpath.77=%REPO_DIR%/james-server-queue-jms-3.0-beta4.jar +wrapper.java.classpath.78=%REPO_DIR%/geronimo-jms_1.1_spec-1.0.jar +wrapper.java.classpath.79=%REPO_DIR%/james-server-queue-activemq-3.0-beta4.jar +wrapper.java.classpath.80=%REPO_DIR%/activemq-core-5.4.2.jar +wrapper.java.classpath.81=%REPO_DIR%/activeio-core-3.1.2.jar +wrapper.java.classpath.82=%REPO_DIR%/kahadb-5.4.2.jar +wrapper.java.classpath.83=%REPO_DIR%/activemq-protobuf-1.1.jar +wrapper.java.classpath.84=%REPO_DIR%/geronimo-j2ee-management_1.1_spec-1.0.1.jar +wrapper.java.classpath.85=%REPO_DIR%/james-server-mailets-3.0-beta4.jar +wrapper.java.classpath.86=%REPO_DIR%/apache-jsieve-mailet-0.5.jar +wrapper.java.classpath.87=%REPO_DIR%/apache-jsieve-core-0.5.jar +wrapper.java.classpath.88=%REPO_DIR%/geronimo-javamail_1.4_mail-1.6.jar +wrapper.java.classpath.89=%REPO_DIR%/geronimo-activation_1.1_spec-1.0.2.jar +wrapper.java.classpath.90=%REPO_DIR%/apache-standard-mailets-1.1.jar +wrapper.java.classpath.91=%REPO_DIR%/commons-httpclient-3.0.1.jar +wrapper.java.classpath.92=%REPO_DIR%/commons-collections-3.2.1.jar +wrapper.java.classpath.93=%REPO_DIR%/derby-10.7.1.1.jar +wrapper.java.classpath.94=%REPO_DIR%/apache-james-mailbox-jpa-0.4.jar +wrapper.java.classpath.95=%REPO_DIR%/openjpa-2.1.0.jar +wrapper.java.classpath.96=%REPO_DIR%/serp-1.13.1.jar +wrapper.java.classpath.97=%REPO_DIR%/geronimo-jta_1.1_spec-1.1.1.jar +wrapper.java.classpath.98=%REPO_DIR%/commons-pool-1.5.5.jar +wrapper.java.classpath.99=%REPO_DIR%/jasypt-1.7.1.jar +wrapper.java.classpath.100=%REPO_DIR%/apache-james-mailbox-spring-0.4.jar +wrapper.java.classpath.101=%REPO_DIR%/apache-james-mailbox-hbase-0.4.jar +wrapper.java.classpath.102=%REPO_DIR%/commons-dbcp-1.4.jar +wrapper.java.classpath.103=%REPO_DIR%/jcr-2.0.jar +wrapper.java.classpath.104=%REPO_DIR%/apache-james-mailbox-lucene-0.4.jar +wrapper.java.classpath.105=%REPO_DIR%/apache-mime4j-core-0.7.2.jar +wrapper.java.classpath.106=%REPO_DIR%/apache-mime4j-dom-0.7.2.jar +wrapper.java.classpath.107=%REPO_DIR%/lucene-core-3.1.0.jar +wrapper.java.classpath.108=%REPO_DIR%/lucene-analyzers-3.1.0.jar +wrapper.java.classpath.109=%REPO_DIR%/lucene-smartcn-3.1.0.jar +wrapper.java.classpath.110=%REPO_DIR%/apache-james-mailbox-jcr-0.4.jar +wrapper.java.classpath.111=%REPO_DIR%/jackrabbit-jcr-commons-2.2.5.jar +wrapper.java.classpath.112=%REPO_DIR%/apache-james-mailbox-memory-0.4.jar +wrapper.java.classpath.113=%REPO_DIR%/james-server-data-file-3.0-beta4.jar +wrapper.java.classpath.114=%REPO_DIR%/james-server-data-jpa-3.0-beta4.jar +wrapper.java.classpath.115=%REPO_DIR%/commons-codec-1.5.jar +wrapper.java.classpath.116=%REPO_DIR%/james-server-data-jdbc-3.0-beta4.jar +wrapper.java.classpath.117=%REPO_DIR%/james-server-data-hbase-3.0-beta4.jar +wrapper.java.classpath.118=%REPO_DIR%/james-server-data-jcr-3.0-beta4.jar +wrapper.java.classpath.119=%REPO_DIR%/apache-james-imap-processor-0.3.jar + +# Java Library Path (location of Wrapper.DLL or libwrapper.so) +wrapper.java.library.path.1=lib + +# Java Additional Parameters +#wrapper.java.additional.1= +wrapper.java.additional.14=-Djames.message.usememorycopy=false +wrapper.java.additional.13=-Dmail.mime.address.strict=false +wrapper.java.additional.12=-Dmail.mime.decodeparameters=true +wrapper.java.additional.11=-Dmail.mime.encodeparameters=true +wrapper.java.additional.10=-Dmail.mime.base64.ignoreerrors=true +wrapper.java.additional.9=-Dmail.mime.multipart.allowempty=true +wrapper.java.additional.8=-Dmail.mime.uudecode.ignoremissingbeginend=true +wrapper.java.additional.7=-Dmail.mime.uudecode.ignoreerrors=true +wrapper.java.additional.6=-Dmail.mime.ignoreunknownencoding=true +wrapper.java.additional.5=-Dmail.mime.multipart.ignoremissingboundaryparameter=true +wrapper.java.additional.4=-Dmail.mime.multipart.ignoremissingendboundary=true +wrapper.java.additional.3=-Dcom.sun.management.jmxremote.authenticate=false +wrapper.java.additional.2=-Dcom.sun.management.jmxremote=true +wrapper.java.additional.1=-XX:+HeapDumpOnOutOfMemoryError + +# Initial Java Heap Size (in MB) +#wrapper.java.initmemory=3 +wrapper.java.initmemory=128 + +# Maximum Java Heap Size (in MB) +#wrapper.java.maxmemory=64 +wrapper.java.maxmemory=512 + +# Application parameters. Add parameters as needed starting from 1 +wrapper.app.parameter.1=org.apache.james.app.spring.JamesAppSpringMain +wrapper.app.parameter.2=start + +#******************************************************************** +# Wrapper Logging Properties +#******************************************************************** +# Format of output for the console. (See docs for formats) +wrapper.console.format=PM + +# Log Level for console output. (See docs for log levels) +wrapper.console.loglevel=INFO + +# Log file to use for wrapper output logging. +wrapper.logfile=log/wrapper.log + +# Format of output for the log file. (See docs for formats) +wrapper.logfile.format=LPTM + +# Log Level for log file output. (See docs for log levels) +wrapper.logfile.loglevel=INFO + +# Maximum size that the log file will be allowed to grow to before +# the log is rolled. Size is specified in bytes. The default value +# of 0, disables log rolling. May abbreviate with the 'k' (kb) or +# 'm' (mb) suffix. For example: 10m = 10 megabytes. +wrapper.logfile.maxsize=0 + +# Maximum number of rolled log files which will be allowed before old +# files are deleted. The default value of 0 implies no limit. +wrapper.logfile.maxfiles=0 + +# Log Level for sys/event log output. (See docs for log levels) +wrapper.syslog.loglevel=NONE + +#******************************************************************** +# Wrapper Windows Properties +#******************************************************************** +# Title to use when running as a console +wrapper.console.title=Apache James Server App + +#******************************************************************** +# Wrapper Windows NT/2000/XP Service Properties +#******************************************************************** +# WARNING - Do not modify any of these properties when an application +# using this configuration file has been installed as a service. +# Please uninstall the service before modifying this section. The +# service can then be reinstalled. + +# Name of the service +wrapper.ntservice.name=james + +# Display name of the service +wrapper.ntservice.displayname=Apache James Server App + +# Description of the service +wrapper.ntservice.description=An advanced email server + +# Service dependencies. Add dependencies as needed starting from 1 +wrapper.ntservice.dependency.1= + +# Mode in which the service is installed. AUTO_START or DEMAND_START +wrapper.ntservice.starttype=AUTO_START + +# Allow the service to interact with the desktop. +wrapper.ntservice.interactive=false + +configuration.directory.in.classpath.first=../conf +wrapper.java.library.path=../lib diff --git a/deploy/james/apache-james-mailbox-memory.jar b/deploy/james/apache-james-mailbox-memory.jar new file mode 120000 index 0000000..2777218 --- /dev/null +++ b/deploy/james/apache-james-mailbox-memory.jar @@ -0,0 +1 @@ +../../james/apache-james-mailbox-memory/target/apache-james-mailbox-memory-0.4.jar \ No newline at end of file diff --git a/deploy/james/apache-james-server-mailets.jar b/deploy/james/apache-james-server-mailets.jar new file mode 100644 index 0000000000000000000000000000000000000000..c555b576235616373f706d1546d2977fa100de37 GIT binary patch literal 159282 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

*e&wI`(S0U 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 XDM-LK1_P4=zNCRg&4?VZ_5k~TGHi&t literal 0 HcmV?d00001 diff --git a/deploy/james/catalog b/deploy/james/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/james/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/james/resources/mail.server.push/ios-push-certificate-dev.p12 b/deploy/james/resources/mail.server.push/ios-push-certificate-dev.p12 new file mode 120000 index 0000000..8579c77 --- /dev/null +++ b/deploy/james/resources/mail.server.push/ios-push-certificate-dev.p12 @@ -0,0 +1 @@ +../../../../keys/apns/ios-push-certificate-dev.p12 \ No newline at end of file diff --git a/deploy/james/resources/mail.server.push/ios-push-certificate-prod.p12 b/deploy/james/resources/mail.server.push/ios-push-certificate-prod.p12 new file mode 120000 index 0000000..34f009f --- /dev/null +++ b/deploy/james/resources/mail.server.push/ios-push-certificate-prod.p12 @@ -0,0 +1 @@ +../../../../keys/apns/ios-push-certificate-prod.p12 \ No newline at end of file diff --git a/deploy/james/resources/passwords/mail b/deploy/james/resources/passwords/mail new file mode 120000 index 0000000..5dd88cb --- /dev/null +++ b/deploy/james/resources/passwords/mail @@ -0,0 +1 @@ +../../../../passwords/mail \ No newline at end of file diff --git a/deploy/james/resources/passwords/mail-pbe b/deploy/james/resources/passwords/mail-pbe new file mode 120000 index 0000000..b1e108a --- /dev/null +++ b/deploy/james/resources/passwords/mail-pbe @@ -0,0 +1 @@ +../../../../passwords/mail-pbe \ No newline at end of file diff --git a/deploy/james/resources/passwords/mail_extra b/deploy/james/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/james/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/james/resources/passwords/push-certificate b/deploy/james/resources/passwords/push-certificate new file mode 120000 index 0000000..f47d229 --- /dev/null +++ b/deploy/james/resources/passwords/push-certificate @@ -0,0 +1 @@ +../../../../passwords/push-certificate \ No newline at end of file diff --git a/deploy/james/run b/deploy/james/run new file mode 100755 index 0000000..2260b54 --- /dev/null +++ b/deploy/james/run @@ -0,0 +1,9 @@ +./setup + +cd ~/apache-james/bin/ + +echo -------------------------------------------------- >> ~/run.log +date >> ~/run.log +echo -------------------------------------------------- >> ~/run.log + +nohup ./run.sh >> ~/run.log 2>&1 & diff --git a/deploy/james/run-block b/deploy/james/run-block new file mode 100755 index 0000000..70a654f --- /dev/null +++ b/deploy/james/run-block @@ -0,0 +1 @@ +cd apache-james/bin/ && ./run.sh diff --git a/deploy/james/setup b/deploy/james/setup new file mode 100755 index 0000000..b8aba4e --- /dev/null +++ b/deploy/james/setup @@ -0,0 +1,6 @@ +cd ~ +ln -fs deploy/resources +ln -fs deploy/apache-james-conf +ln -fs deploy/apache-james-mailbox-memory.jar +ln -fs deploy/apache-james-server-mailets.jar + diff --git a/deploy/james/shutdown b/deploy/james/shutdown new file mode 100755 index 0000000..6b7f05f --- /dev/null +++ b/deploy/james/shutdown @@ -0,0 +1,2 @@ +killall -w -user james java + diff --git a/deploy/mail-key. b/deploy/mail-key. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/mail-key/catalog b/deploy/mail-key/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/mail-key/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/mail-key/resources/key.streamserver/keystore.jks b/deploy/mail-key/resources/key.streamserver/keystore.jks new file mode 120000 index 0000000..7a5124f --- /dev/null +++ b/deploy/mail-key/resources/key.streamserver/keystore.jks @@ -0,0 +1 @@ +../../../../keys/key/keystore.jks \ No newline at end of file diff --git a/deploy/mail-key/resources/passwords/mail b/deploy/mail-key/resources/passwords/mail new file mode 120000 index 0000000..5dd88cb --- /dev/null +++ b/deploy/mail-key/resources/passwords/mail @@ -0,0 +1 @@ +../../../../passwords/mail \ No newline at end of file diff --git a/deploy/mail-key/resources/passwords/mail_extra b/deploy/mail-key/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/mail-key/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/mail-key/run b/deploy/mail-key/run new file mode 100755 index 0000000..834485f --- /dev/null +++ b/deploy/mail-key/run @@ -0,0 +1,7 @@ +./setup + +echo "----------------------------------------------" >> ../run.log +date >> ../run.log +echo "----------------------------------------------" >> ../run.log + +nohup java -jar KeyStreamServer.jar >> ../run.log 2>&1 & diff --git a/deploy/mail-key/setup b/deploy/mail-key/setup new file mode 100755 index 0000000..e66315d --- /dev/null +++ b/deploy/mail-key/setup @@ -0,0 +1,3 @@ +cd ~ +ln -fs deploy/resources + diff --git a/deploy/mail-key/shutdown b/deploy/mail-key/shutdown new file mode 100755 index 0000000..4bdb020 --- /dev/null +++ b/deploy/mail-key/shutdown @@ -0,0 +1 @@ +killall -user mail-key java diff --git a/deploy/mail-user. b/deploy/mail-user. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/mail-user/catalog b/deploy/mail-user/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/mail-user/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/mail-user/resources/mail.streamserver/keystore.jks b/deploy/mail-user/resources/mail.streamserver/keystore.jks new file mode 120000 index 0000000..a400e5e --- /dev/null +++ b/deploy/mail-user/resources/mail.streamserver/keystore.jks @@ -0,0 +1 @@ +../../../../keys/mail/keystore.jks \ No newline at end of file diff --git a/deploy/mail-user/resources/passwords/captcha b/deploy/mail-user/resources/passwords/captcha new file mode 120000 index 0000000..ed95472 --- /dev/null +++ b/deploy/mail-user/resources/passwords/captcha @@ -0,0 +1 @@ +../../../../passwords/captcha \ No newline at end of file diff --git a/deploy/mail-user/resources/passwords/mail b/deploy/mail-user/resources/passwords/mail new file mode 120000 index 0000000..5dd88cb --- /dev/null +++ b/deploy/mail-user/resources/passwords/mail @@ -0,0 +1 @@ +../../../../passwords/mail \ No newline at end of file diff --git a/deploy/mail-user/resources/passwords/mail-pbe b/deploy/mail-user/resources/passwords/mail-pbe new file mode 120000 index 0000000..b1e108a --- /dev/null +++ b/deploy/mail-user/resources/passwords/mail-pbe @@ -0,0 +1 @@ +../../../../passwords/mail-pbe \ No newline at end of file diff --git a/deploy/mail-user/resources/passwords/mail_extra b/deploy/mail-user/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/mail-user/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/mail-user/run b/deploy/mail-user/run new file mode 100755 index 0000000..453f277 --- /dev/null +++ b/deploy/mail-user/run @@ -0,0 +1,7 @@ +./setup + +echo ---------------------------------------- >> ../run.log +date >> ../run.log +echo ---------------------------------------- >> ../run.log + +nohup java -jar MailStreamServer.jar >> ~/run.log 2>&1 & diff --git a/deploy/mail-user/setup b/deploy/mail-user/setup new file mode 100755 index 0000000..e66315d --- /dev/null +++ b/deploy/mail-user/setup @@ -0,0 +1,3 @@ +cd ~ +ln -fs deploy/resources + diff --git a/deploy/mail-user/shutdown b/deploy/mail-user/shutdown new file mode 100755 index 0000000..7b192d2 --- /dev/null +++ b/deploy/mail-user/shutdown @@ -0,0 +1 @@ +killall -user mail-user java diff --git a/deploy/restart-all b/deploy/restart-all new file mode 100755 index 0000000..77f5f8a --- /dev/null +++ b/deploy/restart-all @@ -0,0 +1,5 @@ +./server-restart tomcat +./server-restart james +./server-restart mail-user +./server-restart mail-key + diff --git a/deploy/server-deploy b/deploy/server-deploy new file mode 100755 index 0000000..ca440a7 --- /dev/null +++ b/deploy/server-deploy @@ -0,0 +1,24 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="blue" + +echo stopping... +ssh $1@$server "cd deploy && ./shutdown" + +echo transfering +rsync -avzL --delete $1/ $1@$server:deploy + +echo cataloging +ssh $1@$server "cd deploy && ./catalog" + +echo starting... +ssh $1@$server "cd deploy && ./run" + +echo tailing... +sleep 2 +ssh $1@$server "tail run.log" + +echo ... +echo "***** remember to restart mail-user if you restart-james *****" + + diff --git a/deploy/server-restart b/deploy/server-restart new file mode 100755 index 0000000..1f23982 --- /dev/null +++ b/deploy/server-restart @@ -0,0 +1,20 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="blue" + +echo stopping... +ssh $1@$server "cd deploy && ./shutdown" + +sleep 2 + +echo starting... +ssh $1@$server "cd deploy && ./run" + +echo tailing... +sleep 2 +ssh $1@$server "tail run.log" + +echo ... +echo "***** remember to restart mail-user if you restart-james *****" + + diff --git a/deploy/server-shutdown b/deploy/server-shutdown new file mode 100755 index 0000000..d1a35c3 --- /dev/null +++ b/deploy/server-shutdown @@ -0,0 +1,8 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="blue" + +echo stopping... +ssh $1@$server "cd deploy && ./shutdown" + + diff --git a/deploy/startWebServer b/deploy/startWebServer new file mode 100755 index 0000000..e7373cc --- /dev/null +++ b/deploy/startWebServer @@ -0,0 +1 @@ +cd www && python -m SimpleHTTPServer 80 diff --git a/deploy/tomcat-restart b/deploy/tomcat-restart new file mode 100755 index 0000000..b27ae35 --- /dev/null +++ b/deploy/tomcat-restart @@ -0,0 +1,5 @@ + +server="blue" + +echo restarting... +ssh tomcat@$server "cd deploy && ./restart" diff --git a/deploy/tomcat. b/deploy/tomcat. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/tomcat/catalog b/deploy/tomcat/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/tomcat/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/tomcat/resources/mail.server.push/keystore.jks b/deploy/tomcat/resources/mail.server.push/keystore.jks new file mode 120000 index 0000000..41a30e1 --- /dev/null +++ b/deploy/tomcat/resources/mail.server.push/keystore.jks @@ -0,0 +1 @@ +../../../../keys/push/keystore.jks \ No newline at end of file diff --git a/deploy/tomcat/resources/mail.server.relay/keystore.jks b/deploy/tomcat/resources/mail.server.relay/keystore.jks new file mode 120000 index 0000000..44f10b5 --- /dev/null +++ b/deploy/tomcat/resources/mail.server.relay/keystore.jks @@ -0,0 +1 @@ +../../../../keys/localrelay/keystore.jks \ No newline at end of file diff --git a/deploy/tomcat/resources/mail.server.relay/truststore.jks b/deploy/tomcat/resources/mail.server.relay/truststore.jks new file mode 120000 index 0000000..381c98b --- /dev/null +++ b/deploy/tomcat/resources/mail.server.relay/truststore.jks @@ -0,0 +1 @@ +../../../../keys/localrelay/truststore.jks \ No newline at end of file diff --git a/deploy/tomcat/resources/passwords/BucketCreate-AWS-AccessKey b/deploy/tomcat/resources/passwords/BucketCreate-AWS-AccessKey new file mode 120000 index 0000000..e90eaf6 --- /dev/null +++ b/deploy/tomcat/resources/passwords/BucketCreate-AWS-AccessKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-AccessKey \ No newline at end of file diff --git a/deploy/tomcat/resources/passwords/BucketCreate-AWS-SecretKey b/deploy/tomcat/resources/passwords/BucketCreate-AWS-SecretKey new file mode 120000 index 0000000..7276a3b --- /dev/null +++ b/deploy/tomcat/resources/passwords/BucketCreate-AWS-SecretKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-SecretKey \ No newline at end of file diff --git a/deploy/tomcat/resources/passwords/captcha b/deploy/tomcat/resources/passwords/captcha new file mode 120000 index 0000000..ed95472 --- /dev/null +++ b/deploy/tomcat/resources/passwords/captcha @@ -0,0 +1 @@ +../../../../passwords/captcha \ No newline at end of file diff --git a/deploy/tomcat/resources/passwords/mail_extra b/deploy/tomcat/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/tomcat/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/tomcat/resources/web-server-url b/deploy/tomcat/resources/web-server-url new file mode 100644 index 0000000..3c3f56b --- /dev/null +++ b/deploy/tomcat/resources/web-server-url @@ -0,0 +1 @@ +mailiverse.com diff --git a/deploy/tomcat/restart b/deploy/tomcat/restart new file mode 100755 index 0000000..72028c8 --- /dev/null +++ b/deploy/tomcat/restart @@ -0,0 +1,5 @@ +cd ~/tomcat/bin + +./shutdown.sh +sleep 5 +./startup.sh diff --git a/deploy/tomcat/run b/deploy/tomcat/run new file mode 100755 index 0000000..44ba3c3 --- /dev/null +++ b/deploy/tomcat/run @@ -0,0 +1 @@ +./setup diff --git a/deploy/tomcat/setup b/deploy/tomcat/setup new file mode 100755 index 0000000..e66315d --- /dev/null +++ b/deploy/tomcat/setup @@ -0,0 +1,3 @@ +cd ~ +ln -fs deploy/resources + diff --git a/deploy/tomcat/shutdown b/deploy/tomcat/shutdown new file mode 100755 index 0000000..e69de29 diff --git a/deploy/tools. b/deploy/tools. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/tools/catalog b/deploy/tools/catalog new file mode 100755 index 0000000..58e0f33 --- /dev/null +++ b/deploy/tools/catalog @@ -0,0 +1,5 @@ +cd ~ +mkdir -p deploy-catalog +V=`date "+%Y%m%d_%H%M%S"` + +tar -czf deploy-catalog/deploy_$V.tar.gz deploy diff --git a/deploy/tools/db-backup b/deploy/tools/db-backup new file mode 100755 index 0000000..761b089 --- /dev/null +++ b/deploy/tools/db-backup @@ -0,0 +1,7 @@ +V=`date "+%Y%m%d_%H%M%S"` +mysqldump -u root -p --all-databases > all.database.$V.sql + +scp all.database.$V.sql mailiverse-backup@red:db-backup && rm all.database.$V.sql + +ssh mailiverse-backup@red ./db-backup-finished + diff --git a/deploy/tools/resources/key.streamserver b/deploy/tools/resources/key.streamserver new file mode 120000 index 0000000..0155727 --- /dev/null +++ b/deploy/tools/resources/key.streamserver @@ -0,0 +1 @@ +../../mail-key/resources/key.streamserver \ No newline at end of file diff --git a/deploy/tools/resources/mail.auth/truststore.jks b/deploy/tools/resources/mail.auth/truststore.jks new file mode 120000 index 0000000..0127257 --- /dev/null +++ b/deploy/tools/resources/mail.auth/truststore.jks @@ -0,0 +1 @@ +../../../../keys/mail/truststore.jks \ No newline at end of file diff --git a/deploy/tools/resources/mail.server.push b/deploy/tools/resources/mail.server.push new file mode 120000 index 0000000..d3e2ebb --- /dev/null +++ b/deploy/tools/resources/mail.server.push @@ -0,0 +1 @@ +../../james/resources/mail.server.push \ No newline at end of file diff --git a/deploy/tools/resources/mail.streamserver b/deploy/tools/resources/mail.streamserver new file mode 120000 index 0000000..bf253d0 --- /dev/null +++ b/deploy/tools/resources/mail.streamserver @@ -0,0 +1 @@ +../../mail-user/resources/mail.streamserver \ No newline at end of file diff --git a/deploy/tools/resources/passwords/BucketCreate-AWS-AccessKey b/deploy/tools/resources/passwords/BucketCreate-AWS-AccessKey new file mode 120000 index 0000000..e90eaf6 --- /dev/null +++ b/deploy/tools/resources/passwords/BucketCreate-AWS-AccessKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-AccessKey \ No newline at end of file diff --git a/deploy/tools/resources/passwords/BucketCreate-AWS-SecretKey b/deploy/tools/resources/passwords/BucketCreate-AWS-SecretKey new file mode 120000 index 0000000..7276a3b --- /dev/null +++ b/deploy/tools/resources/passwords/BucketCreate-AWS-SecretKey @@ -0,0 +1 @@ +../../../../passwords/BucketCreate-AWS-SecretKey \ No newline at end of file diff --git a/deploy/tools/resources/passwords/captcha b/deploy/tools/resources/passwords/captcha new file mode 120000 index 0000000..ed95472 --- /dev/null +++ b/deploy/tools/resources/passwords/captcha @@ -0,0 +1 @@ +../../../../passwords/captcha \ No newline at end of file diff --git a/deploy/tools/resources/passwords/james b/deploy/tools/resources/passwords/james new file mode 120000 index 0000000..98726bd --- /dev/null +++ b/deploy/tools/resources/passwords/james @@ -0,0 +1 @@ +../../../../passwords/james \ No newline at end of file diff --git a/deploy/tools/resources/passwords/mail b/deploy/tools/resources/passwords/mail new file mode 120000 index 0000000..5dd88cb --- /dev/null +++ b/deploy/tools/resources/passwords/mail @@ -0,0 +1 @@ +../../../../passwords/mail \ No newline at end of file diff --git a/deploy/tools/resources/passwords/mail-pbe b/deploy/tools/resources/passwords/mail-pbe new file mode 120000 index 0000000..b1e108a --- /dev/null +++ b/deploy/tools/resources/passwords/mail-pbe @@ -0,0 +1 @@ +../../../../passwords/mail-pbe \ No newline at end of file diff --git a/deploy/tools/resources/passwords/mail_extra b/deploy/tools/resources/passwords/mail_extra new file mode 120000 index 0000000..1a710aa --- /dev/null +++ b/deploy/tools/resources/passwords/mail_extra @@ -0,0 +1 @@ +../../../../passwords/mail_extra \ No newline at end of file diff --git a/deploy/tools/resources/passwords/push-certificate b/deploy/tools/resources/passwords/push-certificate new file mode 120000 index 0000000..f47d229 --- /dev/null +++ b/deploy/tools/resources/passwords/push-certificate @@ -0,0 +1 @@ +../../../../passwords/push-certificate \ No newline at end of file diff --git a/deploy/tools/run b/deploy/tools/run new file mode 100755 index 0000000..44ba3c3 --- /dev/null +++ b/deploy/tools/run @@ -0,0 +1 @@ +./setup diff --git a/deploy/tools/setup b/deploy/tools/setup new file mode 100755 index 0000000..e66315d --- /dev/null +++ b/deploy/tools/setup @@ -0,0 +1,3 @@ +cd ~ +ln -fs deploy/resources + diff --git a/deploy/tools/shutdown b/deploy/tools/shutdown new file mode 100755 index 0000000..e69de29 diff --git a/deploy/tunnel. b/deploy/tunnel. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/tunnel/nginx/install-nginx b/deploy/tunnel/nginx/install-nginx new file mode 100755 index 0000000..76c701d --- /dev/null +++ b/deploy/tunnel/nginx/install-nginx @@ -0,0 +1,18 @@ +apt-get install build-essential + +rm -rf nginx-build +mkdir nginx-build +cd nginx-build +wget http://nginx.org/download/nginx-1.3.15.tar.gz +wget http://downloads.sourceforge.net/project/pcre/pcre/8.32/pcre-8.32.tar.gz +wget http://zlib.net/zlib-1.2.7.tar.gz +wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz + +tar -xzf nginx-1.3.15.tar.gz +tar -xzf pcre-8.32.tar.gz +tar -xzf zlib-1.2.7.tar.gz +tar -xzf openssl-1.0.1e.tar.gz + +cd nginx-1.3.15 +./configure --with-http_ssl_module --with-pcre=../pcre-8.32 --with-zlib=../zlib-1.2.7 --with-openssl=../openssl-1.0.1e +make install diff --git a/deploy/tunnel/nginx/install-nginx-conf b/deploy/tunnel/nginx/install-nginx-conf new file mode 100755 index 0000000..d30884f --- /dev/null +++ b/deploy/tunnel/nginx/install-nginx-conf @@ -0,0 +1,5 @@ +mkdir /usr/local/nginx +mkdir /usr/local/nginx/conf +cp nginx.conf /usr/local/nginx/conf +cp nginx-ssl.* /usr/local/nginx/conf + diff --git a/deploy/tunnel/nginx/nginx-ssl.crt b/deploy/tunnel/nginx/nginx-ssl.crt new file mode 120000 index 0000000..fef4f37 --- /dev/null +++ b/deploy/tunnel/nginx/nginx-ssl.crt @@ -0,0 +1 @@ +../../../keys/nginx/final.crt \ No newline at end of file diff --git a/deploy/tunnel/nginx/nginx-ssl.key b/deploy/tunnel/nginx/nginx-ssl.key new file mode 120000 index 0000000..20ddbc7 --- /dev/null +++ b/deploy/tunnel/nginx/nginx-ssl.key @@ -0,0 +1 @@ +../../../keys/nginx/final.key \ No newline at end of file diff --git a/deploy/tunnel/nginx/nginx.conf b/deploy/tunnel/nginx/nginx.conf new file mode 100644 index 0000000..5398e88 --- /dev/null +++ b/deploy/tunnel/nginx/nginx.conf @@ -0,0 +1,60 @@ + +#user nobody; +worker_processes 1; + +#error_log logs/error.log; +#error_log logs/error.log notice; +#error_log logs/error.log info; + +#pid logs/nginx.pid; + + +events { + worker_connections 1024; +} + + +http { + include mime.types; + default_type application/octet-stream; + + #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' + # '$status $body_bytes_sent "$http_referer" ' + # '"$http_user_agent" "$http_x_forwarded_for"'; + + #access_log logs/access.log main; + + sendfile on; + #tcp_nopush on; + + #keepalive_timeout 0; + keepalive_timeout 65; + + gzip on; + + # HTTPS server + # + server { + listen 443; + server_name mail.mailiverse.com; + + ssl on; + ssl_certificate nginx-ssl.crt; + ssl_certificate_key nginx-ssl.key; + + ssl_session_timeout 5m; + + ssl_protocols SSLv2 SSLv3 TLSv1; + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + proxy_pass http://192.168.2.1:8080; # my existing apache instance + proxy_set_header Host $host; + + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + } + } +} diff --git a/deploy/tunnel/nginx/nginx.conf-old b/deploy/tunnel/nginx/nginx.conf-old new file mode 100644 index 0000000..54997d9 --- /dev/null +++ b/deploy/tunnel/nginx/nginx.conf-old @@ -0,0 +1,19 @@ +server { + + listen 443; # default_server doesn't work + server_name mail.mailiverse.com; + + ssl on; + ssl_certificate /etc/nginx/conf.d/nginx-ssl.crt; + ssl_certificate_key /etc/nginx/conf.d/nginx-ssl.key; + ssl_session_cache shared:SSL:10m; + + location / { + + proxy_pass http://192.168.2.1:8080; # my existing apache instance + proxy_set_header Host $host; + + # re-write redirects to http as to https, example: /home + proxy_redirect http:// https://; + } +} diff --git a/deploy/tunnel/run b/deploy/tunnel/run new file mode 100755 index 0000000..7b149be --- /dev/null +++ b/deploy/tunnel/run @@ -0,0 +1,4 @@ +if [ "$HOSTNAME" == "blue" ] ; then + echo running proxy + nohup ./run-tunnel-sudo > ~/run.log 2>&1 & +fi diff --git a/deploy/tunnel/run-tunnel b/deploy/tunnel/run-tunnel new file mode 100755 index 0000000..a2b7341 --- /dev/null +++ b/deploy/tunnel/run-tunnel @@ -0,0 +1,4 @@ +DIR="$( cd "$( dirname "$0" )" && pwd )" +cd $DIR/vpn-ssh + +while [ "true" ]; echo starting; do ./run-server; echo died; sleep 30; done; diff --git a/deploy/tunnel/run-tunnel-sudo b/deploy/tunnel/run-tunnel-sudo new file mode 100755 index 0000000..2268239 --- /dev/null +++ b/deploy/tunnel/run-tunnel-sudo @@ -0,0 +1 @@ +sudo /bin/bash /home/tunnel/deploy/run-tunnel diff --git a/deploy/tunnel/shutdown b/deploy/tunnel/shutdown new file mode 100755 index 0000000..d46e9ad --- /dev/null +++ b/deploy/tunnel/shutdown @@ -0,0 +1,2 @@ +sudo /bin/bash /home/tunnel/deploy/stop-tunnel + diff --git a/deploy/tunnel/stop-tunnel b/deploy/tunnel/stop-tunnel new file mode 100755 index 0000000..8b626d0 --- /dev/null +++ b/deploy/tunnel/stop-tunnel @@ -0,0 +1,2 @@ +pkill -f "/bin/bash /home/tunnel/deploy/run-tunnel" +killall autossh diff --git a/deploy/tunnel/sudoers.d-tunnel b/deploy/tunnel/sudoers.d-tunnel new file mode 100644 index 0000000..c2c21f3 --- /dev/null +++ b/deploy/tunnel/sudoers.d-tunnel @@ -0,0 +1 @@ +tunnel ALL = (root) NOPASSWD :/bin/bash /home/tunnel/deploy/run-tunnel,/bin/bash /home/tunnel/deploy/stop-tunnel diff --git a/deploy/tunnel/vpn-ssh/HOST b/deploy/tunnel/vpn-ssh/HOST new file mode 100644 index 0000000..30157b7 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/HOST @@ -0,0 +1,5 @@ +HOSTNAME=mail.mailiverse.com +HOST=`nslookup $HOSTNAME | grep Address | tail -n 1 | cut -d " " -f 2` + +export HOST + diff --git a/deploy/tunnel/vpn-ssh/client/run b/deploy/tunnel/vpn-ssh/client/run new file mode 100755 index 0000000..2995d46 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/client/run @@ -0,0 +1,18 @@ +##### +# client vpn +# +# Timothy Prepscius v20130326 +##### + +# Allow the client to forward ips +echo 1 > /proc/sys/net/ipv4/ip_forward + +# bring up the tap +ifconfig tap0 up +# put an ip on it so we can listen +ifconfig tap0 192.168.2.1 + +# route all traffic from 192.168.2.1 through 192.168.2.5 +ip rule add from 192.168.2.1 table 42 +ip route add default via 192.168.2.5 table 42 + diff --git a/deploy/tunnel/vpn-ssh/client/run-to-log b/deploy/tunnel/vpn-ssh/client/run-to-log new file mode 100755 index 0000000..74cdf1e --- /dev/null +++ b/deploy/tunnel/vpn-ssh/client/run-to-log @@ -0,0 +1,2 @@ +DIR="$( cd "$( dirname "$0" )" && pwd )" +$DIR/run > ~tunnel/client-run.log 2>&1 diff --git a/deploy/tunnel/vpn-ssh/dossh b/deploy/tunnel/vpn-ssh/dossh new file mode 100755 index 0000000..dba9f89 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/dossh @@ -0,0 +1,3 @@ +source ./HOST + +ssh -i green.pem root@$HOST $@ diff --git a/deploy/tunnel/vpn-ssh/green.pem b/deploy/tunnel/vpn-ssh/green.pem new file mode 100644 index 0000000..6357d5d --- /dev/null +++ b/deploy/tunnel/vpn-ssh/green.pem @@ -0,0 +1 @@ +PRIVATE-KEY from ec2 diff --git a/deploy/tunnel/vpn-ssh/install b/deploy/tunnel/vpn-ssh/install new file mode 100755 index 0000000..13e8215 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/install @@ -0,0 +1,5 @@ +source ./HOST + +scp -i green.pem ../nginx-ssl.* root@$HOST: +scp -i green.pem server/* root@$HOST: +ssh -i green.pem root@$HOST ./install diff --git a/deploy/tunnel/vpn-ssh/reinstall b/deploy/tunnel/vpn-ssh/reinstall new file mode 100755 index 0000000..5bb51d0 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/reinstall @@ -0,0 +1,4 @@ +source ./HOST + +scp -i green.pem ../nginx/* root@$HOST: +scp -i green.pem server/* root@$HOST: diff --git a/deploy/tunnel/vpn-ssh/run-server b/deploy/tunnel/vpn-ssh/run-server new file mode 100755 index 0000000..3045b72 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/run-server @@ -0,0 +1,11 @@ +source ./HOST + +autossh \ + -i green.pem root@$HOST \ + -D 23232 \ + -w 0:0 \ + -o Tunnel=ethernet \ + -o ServerAliveInterval=30 \ + -o PermitLocalCommand=yes \ + -o LocalCommand="./client/run-to-log" \ + ./run-to-log diff --git a/deploy/tunnel/vpn-ssh/server/install b/deploy/tunnel/vpn-ssh/server/install new file mode 100755 index 0000000..9bca8ab --- /dev/null +++ b/deploy/tunnel/vpn-ssh/server/install @@ -0,0 +1,7 @@ +apt-get update +apt-get install telnet + +echo "PermitTunnel yes" >> /etc/ssh/sshd_config +/etc/init.d/ssh restart + +./install-nginx diff --git a/deploy/tunnel/vpn-ssh/server/run b/deploy/tunnel/vpn-ssh/server/run new file mode 100755 index 0000000..76e9888 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/server/run @@ -0,0 +1,42 @@ +##### +# server dmz +# +# Timothy Prepscius v20130326 + +# Allow the server to forward ips +echo 1 > /proc/sys/net/ipv4/ip_forward + +# bring up the tap +ifconfig tap0 up +# put an ip on it so we can route traffic through it +ifconfig tap0 192.168.2.5 + +# route all traffic for 192.168.2.* through it +# this is done implicitly when we add the ip to the tap0 +#ip route add 192.168.2.0/24 dev tap0 + +##### +# server iptables + +iptables -F +iptables -t nat -F + +# forward traffic between DMZ and LAN +iptables -A FORWARD -i eth0 -o tap0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT +iptables -A FORWARD -i tap0 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT + +# Route incoming port to DMZ server 192.168.2.1 +#iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8000 -j DNAT --to-destination 192.168.2.1:8000 + +# do not need since nginx is performing this +#iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 80 -j DNAT --to-destination 192.168.2.1:8080 + +iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 25 -j DNAT --to-destination 192.168.2.1:10025 +iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 7000 -j DNAT --to-destination 192.168.2.1:7000 +iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 7001 -j DNAT --to-destination 192.168.2.1:7001 + +# When the traffic goes back out, make sure it has our IP and not the DMZ +iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE + +### End Server #### + diff --git a/deploy/tunnel/vpn-ssh/server/run-to-log b/deploy/tunnel/vpn-ssh/server/run-to-log new file mode 100755 index 0000000..60f48d6 --- /dev/null +++ b/deploy/tunnel/vpn-ssh/server/run-to-log @@ -0,0 +1,2 @@ +DIR="$( cd "$( dirname "$0" )" && pwd )" +./run > run.log 2>&1 diff --git a/deploy/watch b/deploy/watch new file mode 100755 index 0000000..5339267 --- /dev/null +++ b/deploy/watch @@ -0,0 +1,5 @@ +if [ -z "$1" ]; then echo "Must supply name"; exit 0; fi + +server="blue" + +ssh $1@$server "tail -n 100 -f run.log" diff --git a/deploy/web-deploy b/deploy/web-deploy new file mode 100755 index 0000000..88ddd69 --- /dev/null +++ b/deploy/web-deploy @@ -0,0 +1,2 @@ +rsync -avL --exclude="WEB-INF" --delete ../gwt/war/ ./www/ + diff --git a/deploy/web-deploy-ftp b/deploy/web-deploy-ftp new file mode 100755 index 0000000..a96db9c --- /dev/null +++ b/deploy/web-deploy-ftp @@ -0,0 +1,2 @@ +./web-deploy +sitecopy --update mailiverse.com -k diff --git a/deploy/web-deploy-s3 b/deploy/web-deploy-s3 new file mode 100755 index 0000000..4debe9c --- /dev/null +++ b/deploy/web-deploy-s3 @@ -0,0 +1,8 @@ +./web-deploy +s3cmd sync www/ s3://www.mailiverse.com/ --acl-public --delete-removed + +echo putting files with cache control headers +s3cmd put www/*.html s3://www.mailiverse.com/ --acl-public --add-header "Cache-Control: max-age:3600" +s3cmd put www/*.txt s3://www.mailiverse.com/ --acl-public --add-header "Cache-Control: max-age:3600" +s3cmd put www/mailiverse_gwt/mailiverse_gwt.nocache.js s3://www.mailiverse.com/mailiverse_gwt/ --acl-public --add-header "Cache-Control: no-cache" +echo done diff --git a/deploy/websockets. b/deploy/websockets. new file mode 100644 index 0000000..e69de29 diff --git a/deploy/websockets/proxy-tcp.js b/deploy/websockets/proxy-tcp.js new file mode 100644 index 0000000..2d57366 --- /dev/null +++ b/deploy/websockets/proxy-tcp.js @@ -0,0 +1,83 @@ +var WebSocket = require('ws'); +var WebSocketServer = WebSocket.Server; +var http = require('http'); +var net = require('net'); + +var server = + http.createServer(function (req, res) { + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end('Not implemented'); + }); + +server.listen(8081, "0.0.0.0", null); +closeServer = function() { self._server.close(); }; + +var incrementingId = 0; + +function createWebSocket(path, ws) { + console.log('connection'); + + ws.xStringVal = (new Date()) + ":" + incrementingId++; + ws.xString = function() { return ws.xStringVal; }; + ws.proxy = net.createConnection(path); + ws.proxy.buffer = ""; + ws.proxy.connected = false; + ws.proxy.outQueue = []; + ws.proxy.inQueue = []; + + ws.proxy.sendQueue = function() { + if (!this.connected) { + while (this.outQueue.length > 0) + { + var message = ws.proxy.outQueue.shift(); + console.log(ws.xString() + ' C -> ' + message); + ws.proxy.write(message.trim() + "\r\n"); + } + } + }; + + ws.proxy.receiveQueue = function() { + while (this.inQueue.length > 0) + { + var message = ws.proxy.inQueue.shift(); + console.log(ws.xString() + ' <- S ' + message); + ws.send(message.trim() + "\r\n"); + } + }; + + ws.proxy.queueAndReceive = function() { + var retPos = -1; + while ((retPos=this.buffer.indexOf("\n"))!=-1) + { + var next = this.buffer.substring(0, retPos); + this.buffer = this.buffer.substring(retPos+1); + this.inQueue.push(next.trim()); + } + + this.receiveQueue(); + }; + + ws.proxy.on('data', function(message) { + console.log(ws.xString() + ' <- Q ' + message); + this.buffer += message; + ws.proxy.queueAndReceive(); + }); + ws.proxy.on('close', function() { console.log(ws.xString() + ' close S'); ws.close() }); + ws.proxy.on('open', function() { ws.proxy.connected = true; ws.proxy.sendQueue(); }); + + ws.on('message', function(message) { + console.log(ws.xString() + ' Q ->', message); + ws.proxy.outQueue.push(message); + ws.proxy.sendQueue(); + }); + + ws.on('close', function() { console.log(ws.xString() + ' C close'); ws.proxy.end(); }); +} + + +wss = new WebSocketServer({server:server, path:"/Mailiverse/KeyServer"}); +wss.on('connection', function(ws) { createWebSocket(7000, ws); }); + +wss = new WebSocketServer({server:server, path:"/Mailiverse/MailServer"}); +wss.on('connection', function(ws) { createWebSocket(7001, ws); }); + diff --git a/deploy/websockets/proxy-ws.js b/deploy/websockets/proxy-ws.js new file mode 100644 index 0000000..05f9dd1 --- /dev/null +++ b/deploy/websockets/proxy-ws.js @@ -0,0 +1,54 @@ +var WebSocket = require('ws'); +var WebSocketServer = WebSocket.Server; +var http = require('http'); + +var server = + http.createServer(function (req, res) { + res.writeHead(200, {'Content-Type': 'text/plain'}); + res.end('Not implemented'); + }); + +server.listen(8081, "0.0.0.0", null); +closeServer = function() { self._server.close(); }; + +function createWebSocket(path, ws) { + console.log('connection'); + + ws.proxy = new WebSocket(path); + ws.proxy.queue = []; + + ws.proxy.on('message', function(message) { console.log('<- P ' + message); ws.send(message); }); + ws.proxy.on('close', function() { console.log('close P'); ws.close() }); + ws.proxy.on('open', function() { + while (ws.proxy.queue.length > 0) + { + var message = ws.proxy.queue.shift(); + console.log('C -> ' + message); + ws.proxy.send(message); + } + ws.proxy.queue = null; + }); + + ws.on('message', function(message) { + if (ws.proxy.queue != null) + { + console.log('C q ' + message); + ws.proxy.queue.push(message); + } + else + { + console.log('C -> ' + message); + ws.proxy.send(message); + } + }); + + ws.on('close', function() { console.log('C close'); ws.proxy.close(); }); +} + + +wss = new WebSocketServer({server:server, path:"Mailiverse/KeyServer"}); +wss.on('connection', function(ws) { createWebSocket('ws://red:8080/Mailiverse/KeyServer', ws); }); + +wss = new WebSocketServer({server:server, path:"Mailiverse/MailServer"}); +wss.on('connection', function(ws) { createWebSocket('ws://red:8080/Mailiverse/MailServer', ws); }); + diff --git a/deploy/websockets/proxy.js b/deploy/websockets/proxy.js new file mode 120000 index 0000000..c60c2f1 --- /dev/null +++ b/deploy/websockets/proxy.js @@ -0,0 +1 @@ +proxy-tcp.js \ No newline at end of file diff --git a/deploy/websockets/run b/deploy/websockets/run new file mode 100755 index 0000000..4d5eda3 --- /dev/null +++ b/deploy/websockets/run @@ -0,0 +1,11 @@ +./setup + +cd ~/server + +echo ---------------------------------------- >> ../run.log +date >> ~/run.log +echo ---------------------------------------- >> ../run.log + +node proxy.js >> ~/run.log 2>&1 & + + diff --git a/deploy/websockets/setup b/deploy/websockets/setup new file mode 100755 index 0000000..8519eb5 --- /dev/null +++ b/deploy/websockets/setup @@ -0,0 +1,3 @@ +cd ~ +cp deploy/proxy.js server/proxy.js + diff --git a/deploy/websockets/shutdown b/deploy/websockets/shutdown new file mode 100755 index 0000000..5edcb3d --- /dev/null +++ b/deploy/websockets/shutdown @@ -0,0 +1,2 @@ +killall -user websockets node +