Merge "switch drools pdp image to new one"
[integration.git] / test / security / check_for_jdwp.sh
1 #!/usr/bin/env bash
2
3 #   COPYRIGHT NOTICE STARTS HERE
4 #
5 #   Copyright 2019 Samsung Electronics Co., Ltd.
6 #
7 #   Licensed under the Apache License, Version 2.0 (the "License");
8 #   you may not use this file except in compliance with the License.
9 #   You may obtain a copy of the License at
10 #
11 #       http://www.apache.org/licenses/LICENSE-2.0
12 #
13 #   Unless required by applicable law or agreed to in writing, software
14 #   distributed under the License is distributed on an "AS IS" BASIS,
15 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 #   See the License for the specific language governing permissions and
17 #   limitations under the License.
18 #
19 #   COPYRIGHT NOTICE ENDS HERE
20
21 # Check all ports exposed by pods to internal network and look for
22 # open JDWP ports
23 #
24 # Dependencies:
25 #     kubectl + config
26 #     netcat
27 #
28 # Return value: Number of discovered JDWP ports
29 # Output: List of pods and exposing JDWP interface
30 #
31
32 if [ "$#" -lt 1 ]; then
33     echo "Usage: $0 <k8s-namespace>"
34     exit 1
35 fi
36
37 K8S_NAMESPACE=$1
38 LOCAL_PORT=12543
39
40 list_pods() {
41         kubectl get po --namespace=$K8S_NAMESPACE | grep Running | awk '{print $1}' | grep -v NAME
42 }
43
44 do_jdwp_handshake() {
45         local ip="127.0.0.1"
46         local port=$1
47         local jdwp_challenge="JDWP-Handshake\n"
48         local jdwp_response="JDWP-Handshake"
49
50         local response=`nc $ip $port <<<$jdwp_challenge`
51         if [[ $response == *"$jdwp_response"* ]]; then
52                 return 0
53         fi
54
55         return 1
56 }
57 # get open ports from procfs as netstat is not always available
58 get_open_ports_on_pod() {
59         local pod=$1
60         local open_ports_hex=`kubectl exec --namespace=$K8S_NAMESPACE $pod cat /proc/net/tcp 2>/dev/null| grep -v "local_address" | awk '{ print $2" "$4 }' | grep '0A$' | tr ":" " " | awk '{ print $2 }' | sort | uniq`
61         for hex_port in $open_ports_hex; do
62                 echo $((16#$hex_port))
63         done
64 }
65
66 N_PORTS=0
67
68 # go through all pods
69 for pod in `list_pods`; do
70         open_ports=`get_open_ports_on_pod $pod`
71         # if there is no open ports just go to next pod
72         if [ -z "$open_ports" ]; then
73                 continue
74         fi
75
76         # let's setup a proxy and check every open port
77         for port in $open_ports; do
78                 # run proxy
79                 kubectl port-forward --namespace=$K8S_NAMESPACE $pod $LOCAL_PORT:$port &>/dev/null &
80                 sleep 1
81                 proxy_pid=$!
82
83                 do_jdwp_handshake $LOCAL_PORT
84                 if [ $? -eq 0 ]; then
85                         echo $pod $port
86                         ((++N_PORTS))
87                 fi
88                 kill $proxy_pid 2>/dev/null
89                 wait $proxy_pid 2>/dev/null
90         done
91 done
92
93 exit $N_PORTS