From 7d91359d3af00d521c99a7448d117730a5c85bda Mon Sep 17 00:00:00 2001 From: Mate Szalay-Beko Date: Tue, 15 Oct 2019 15:12:18 +0200 Subject: [PATCH 1/4] ZOOKEEPER-3567: add SSL support for zkpython --- zookeeper-contrib/build-contrib.xml | 6 +- .../zookeeper-contrib-zkpython/README | 8 +- .../zookeeper-contrib-zkpython/build.xml | 2 +- .../src/c/pyzk_docstrings.h | 27 ++++ .../src/c/zookeeper.c | 44 +++++-- .../src/python/setup.py | 4 +- .../src/test/connection_test.py | 31 +++++ .../src/test/gencerts.sh | 118 ++++++++++++++++++ .../src/test/run_tests.sh | 5 +- .../src/test/zkServer.sh | 69 ++++++---- .../src/test/zktestbase.py | 5 +- .../src/test/zoo.cfg | 14 +++ 12 files changed, 289 insertions(+), 44 deletions(-) create mode 100755 zookeeper-contrib/zookeeper-contrib-zkpython/src/test/gencerts.sh create mode 100644 zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zoo.cfg diff --git a/zookeeper-contrib/build-contrib.xml b/zookeeper-contrib/build-contrib.xml index 70bb8644f52..681db2d763e 100644 --- a/zookeeper-contrib/build-contrib.xml +++ b/zookeeper-contrib/build-contrib.xml @@ -32,7 +32,7 @@ - + @@ -179,7 +179,7 @@ - + @@ -190,7 +190,7 @@ - diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/README b/zookeeper-contrib/zookeeper-contrib-zkpython/README index 89d99989756..56154618356 100644 --- a/zookeeper-contrib/zookeeper-contrib-zkpython/README +++ b/zookeeper-contrib/zookeeper-contrib-zkpython/README @@ -7,14 +7,18 @@ DEPENDENCIES: This has only been tested against SVN (i.e. 3.2.0 in development) but should work against 3.1.1. -You will need the Python development headers installed to build the module - on many package-management systems, these can be found in python-devel. +You will need the Python development headers installed to build the module - on many package-management systems, these can be found in python-devel. (On ubuntu 18.4, install python2.7 and python2.7-dev.) Python >= 2.6 is required. We have tested against 2.6. We have not tested against 3.x. +E.g. setting up tpyhon and python devel on ubuntu 18.4: +sudo apt-get install python2.7 python2.7-dev +sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 + BUILD AND INSTALL: ------------------- -To install, make sure that the C client has been built and that the libraries are installed in /usr/local/lib (or change this directory in setup.py). Then run: +To install, make sure that the C client has been built (use `mvn clean install -DskipTests -Pfull-build` in the root folder of zookeeper) or that the zookeeper C libraries are installed in /usr/local/lib (or change this directory in setup.py). Then run: ant install diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/build.xml b/zookeeper-contrib/zookeeper-contrib-zkpython/build.xml index c229deec654..99f634abe81 100644 --- a/zookeeper-contrib/zookeeper-contrib-zkpython/build.xml +++ b/zookeeper-contrib/zookeeper-contrib-zkpython/build.xml @@ -20,10 +20,10 @@ - + /dev/null +if [ $? -eq 0 ] +then + pid=`lsof -i :22182 | grep LISTEN | awk '{print $2}'` + if [ -n "$pid" ] then - rm -rf /tmp/zkdata - else - rm -rf ${base_dir}/build/tmp + kill -9 $pid fi fi -if [ "x${base_dir}" == "x" ] + + + +if [ "x$1" == "xstartClean" ] then -zk_base="../../" -else -zk_base="${base_dir}" + rm -rf ${WORK_DIR} fi -CLASSPATH="$CLASSPATH:${zk_base}/build/classes" + + +CLASSPATH="$CLASSPATH:${PROJECT_ROOT}/zookeeper-server/target/classes" CLASSPATH="$CLASSPATH:${zk_base}/conf" -for i in "${zk_base}"/build/lib/*.jar +for i in "${PROJECT_ROOT}"/zookeeper-server/target/lib/*.jar do CLASSPATH="$CLASSPATH:$i" done -for i in "${zk_base}"/zookeeper-server/src/main/resource/lib/*.jar +for i in "${PROJECT_ROOT}"/zookeeper-server/src/main/resource/lib/*.jar do CLASSPATH="$CLASSPATH:$i" done @@ -57,15 +77,20 @@ done case $1 in start|startClean) - if [ "x${base_dir}" == "x" ] - then - mkdir -p /tmp/zkdata - java -cp $CLASSPATH org.apache.zookeeper.server.ZooKeeperServerMain 22182 /tmp/zkdata &> /tmp/zk.log & - else - mkdir -p ${base_dir}/build/tmp/zkdata - java -cp $CLASSPATH org.apache.zookeeper.server.ZooKeeperServerMain 22182 ${base_dir}/build/tmp/zkdata &> ${base_dir}/build/tmp/zk.log & - fi - sleep 5 + mkdir -p ${WORK_DIR}/zkdata + + rm -rf ${WORK_DIR}/ssl + mkdir -p ${WORK_DIR}/ssl + cp ${TEST_DIR}/gencerts.sh ${WORK_DIR}/ssl/ + cd ${WORK_DIR}/ssl/ + ./gencerts.sh + cd - + + sed "s#WORKDIR#${WORK_DIR}#g" ${TEST_DIR}/zoo.cfg > "${WORK_DIR}/zoo.cfg" + java -Dzookeeper.extendedTypesEnabled=true -Dznode.container.checkIntervalMs=100 -cp $CLASSPATH org.apache.zookeeper.server.ZooKeeperServerMain "${WORK_DIR}/zoo.cfg" &> "${WORK_DIR}/zoo.log" & + pid=$! + echo -n $! > ${WORK_DIR}/../zk.pid + sleep 5 ;; stop) # Already killed above diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zktestbase.py b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zktestbase.py index 8229418e3e7..cafbec56669 100755 --- a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zktestbase.py +++ b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zktestbase.py @@ -22,10 +22,13 @@ class TestBase(unittest.TestCase): SERVER_PORT = 22182 - + SERVER_SSL_PORT = 22183 + def __init__(self,methodName='runTest'): unittest.TestCase.__init__(self,methodName) self.host = "localhost:%d" % self.SERVER_PORT + self.sslhost = "localhost:%d" % self.SERVER_SSL_PORT + self.sslcert = "./target/zkpython_tests/ssl/server.crt,./target/zkpython_tests/ssl/client.crt,./target/zkpython_tests/ssl/clientkey.pem,password" self.connected = False self.handle = -1 logdir = os.environ.get("ZKPY_LOG_DIR") diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zoo.cfg b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zoo.cfg new file mode 100644 index 00000000000..2d4fc31d9fd --- /dev/null +++ b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zoo.cfg @@ -0,0 +1,14 @@ +tickTime=500 +initLimit=10 +syncLimit=5 +dataDir=WORKDIR/zkdata +maxClientCnxns=200 + +clientPort=22182 +secureClientPort=22183 +serverCnxnFactory=org.apache.zookeeper.server.NettyServerCnxnFactory +ssl.keyStore.location=WORKDIR/ssl/server.jks +ssl.keyStore.password=password +ssl.trustStore.location=WORKDIR/ssl/servertrust.jks +ssl.trustStore.password=password + From 0150986da77823b6181aefb0eb33e2eea3d5bfd9 Mon Sep 17 00:00:00 2001 From: Mate Szalay-Beko Date: Wed, 16 Oct 2019 13:00:02 +0200 Subject: [PATCH 2/4] ZOOKEEPER-3567: removing code duplication: re-use test SSL certificate generator from C-client tests --- .../src/test/gencerts.sh | 118 ------------------ .../src/test/zkServer.sh | 2 +- 2 files changed, 1 insertion(+), 119 deletions(-) delete mode 100755 zookeeper-contrib/zookeeper-contrib-zkpython/src/test/gencerts.sh diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/gencerts.sh b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/gencerts.sh deleted file mode 100755 index 77f013c2dbf..00000000000 --- a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/gencerts.sh +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env bash - -# 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 script cleans up old transaction logs and snapshots -# - -# -# If this scripted is run out of /usr/bin or some other system bin directory -# it should be linked to and not copied. Things like java jar files are found -# relative to the canonical path of this script. -# - -# Generate the root key -openssl genrsa -out rootkey.pem 2048 - -#Generate the root Cert -openssl req -x509 -new -key rootkey.pem -out root.crt -config <( -cat <<-EOF -[ req ] -default_bits = 2048 -prompt = no -default_md = sha256 -distinguished_name = dn - -[ dn ] -C = US -ST = California -L = San Francisco -O = Bookkeeper -emailAddress = dev@bookkeeper.apache.org -CN = bookkeeper.apache.org -EOF -) - -#Generate Client Key -openssl genrsa -out clientkey.pem 2048 - -#Generate Client Cert -openssl req -new -key clientkey.pem -out client.csr -config <( -cat <<-EOF -[ req ] -default_bits = 2048 -prompt = no -default_md = sha256 -distinguished_name = dn - -[ dn ] -C = US -ST = California -L = San Francisco -O = Bookkeeper -emailAddress = dev@bookkeeper.apache.org -CN = bookkeeper.apache.org -EOF -) -openssl x509 -req -in client.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out client.crt - -#Export in pkcs12 format -openssl pkcs12 -export -in client.crt -inkey clientkey.pem -out client.pkcs12 -password pass:password - -# Import Keystore in JKS -keytool -importkeystore -srckeystore client.pkcs12 -destkeystore client.jks -srcstoretype pkcs12 -srcstorepass password -deststorepass password - -############################################################ - -#Generate Server key -openssl genrsa -out serverkey.pem 2048 - -#Generate Server Cert -openssl req -new -key serverkey.pem -out server.csr -config <( -cat <<-EOF -[ req ] -default_bits = 2048 -prompt = no -default_md = sha256 -distinguished_name = dn - -[ dn ] -C = US -ST = California -L = San Francisco -O = Bookkeeper -emailAddress = dev@bookkeeper.apache.org -CN = bookkeeper.apache.org -EOF -) -openssl x509 -req -in server.csr -CA root.crt -CAkey rootkey.pem -CAcreateserial -days 3650 -out server.crt - -#Export in pkcs12 format -openssl pkcs12 -export -in server.crt -inkey serverkey.pem -out server.pkcs12 -password pass:password - -# Import Keystore in JKS -keytool -importkeystore -srckeystore server.pkcs12 -destkeystore server.jks -srcstoretype pkcs12 -srcstorepass password -deststorepass password - - -keytool -importcert -keystore server.jks -file root.crt -storepass password -noprompt - -keytool -importcert -alias ca -file root.crt -keystore clienttrust.jks -storepass password -noprompt - -keytool -importcert -alias clientcert -file client.crt -keystore clienttrust.jks -storepass password -noprompt - -keytool -importcert -alias ca -file root.crt -keystore servertrust.jks -storepass password -noprompt -keytool -importcert -alias servercert -file server.crt -keystore servertrust.jks -storepass password -noprompt diff --git a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zkServer.sh b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zkServer.sh index 5e44e92803e..3b6ed37fc12 100755 --- a/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zkServer.sh +++ b/zookeeper-contrib/zookeeper-contrib-zkpython/src/test/zkServer.sh @@ -81,7 +81,7 @@ start|startClean) rm -rf ${WORK_DIR}/ssl mkdir -p ${WORK_DIR}/ssl - cp ${TEST_DIR}/gencerts.sh ${WORK_DIR}/ssl/ + cp ${PROJECT_ROOT}/zookeeper-client/zookeeper-client-c/ssl/gencerts.sh ${WORK_DIR}/ssl/ cd ${WORK_DIR}/ssl/ ./gencerts.sh cd - From b92f686e82a16bc079b6e345e942e04e79c26790 Mon Sep 17 00:00:00 2001 From: Mate Szalay-Beko Date: Wed, 16 Oct 2019 15:18:27 +0200 Subject: [PATCH 3/4] ZOOKEEPER-3567: fix license check issue --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index a08bb25e1a3..3654247be05 100755 --- a/pom.xml +++ b/pom.xml @@ -798,6 +798,7 @@ zookeeper-contrib-fatjar/src/main/resources/mainClasses zookeeper-contrib-zkperl/Changes zookeeper-contrib-zkperl/MANIFEST + zookeeper-contrib-zkpython/src/test/zoo.cfg zookeeper-contrib-loggraph/src/main/resources/webapp/org/apache/zookeeper/graph/resources/* src/main/resources/webapp/org/apache/zookeeper/graph/resources/* src/main/java/com/nitido/utils/toaster/Toaster.java From d25d61024f0f2ab5b72de42eeccd45b9c30d6239 Mon Sep 17 00:00:00 2001 From: Mate Szalay-Beko Date: Tue, 26 Nov 2019 13:41:11 +0100 Subject: [PATCH 4/4] ZOOKEEPER-3567: fix build issues after top-level ant removal --- README_packaging.md | 6 ++--- zookeeper-contrib/build-contrib.xml | 2 +- zookeeper-contrib/ivysettings.xml | 41 +++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 zookeeper-contrib/ivysettings.xml diff --git a/README_packaging.md b/README_packaging.md index e2a2d47672a..0f01369553b 100644 --- a/README_packaging.md +++ b/README_packaging.md @@ -19,11 +19,11 @@ yum install python-setuptools yum install openssl openssl-devel ``` -On Ubuntu: +On Ubuntu (in case of 16.4+): ``` -apt-get install cppunit -apt-get install python-setuptools +apt-get install libcppunit-dev +apt-get install python-setuptools python2.7-dev apt-get install openssl libssl-dev ``` diff --git a/zookeeper-contrib/build-contrib.xml b/zookeeper-contrib/build-contrib.xml index 681db2d763e..34f3c9b03b3 100644 --- a/zookeeper-contrib/build-contrib.xml +++ b/zookeeper-contrib/build-contrib.xml @@ -47,7 +47,7 @@ - + diff --git a/zookeeper-contrib/ivysettings.xml b/zookeeper-contrib/ivysettings.xml new file mode 100644 index 00000000000..15c98b6ec4e --- /dev/null +++ b/zookeeper-contrib/ivysettings.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + +