blob: 0facbff69d34d12aa9c65bda6f9a3c80c081f628 [file] [log] [blame]
Krzysztof Opasiak28c3d2e2019-03-21 22:49:38 +01001#!/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
32if [ "$#" -lt 1 ]; then
33 echo "Usage: $0 <k8s-namespace>"
34 exit 1
35fi
36
37K8S_NAMESPACE=$1
38LOCAL_PORT=12543
39
40list_pods() {
41 kubectl get po --namespace=$K8S_NAMESPACE | grep Running | awk '{print $1}' | grep -v NAME
42}
43
44do_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
Krzysztof Opasiak0a856632019-05-06 23:27:08 +020050 # 10s timeout to avoid hangs when service doesn't answer at all
51 local response=`nc -w 10 $ip $port <<<$jdwp_challenge | tr '\0' '\n'`
Krzysztof Opasiak28c3d2e2019-03-21 22:49:38 +010052 if [[ $response == *"$jdwp_response"* ]]; then
53 return 0
54 fi
55
56 return 1
57}
58# get open ports from procfs as netstat is not always available
59get_open_ports_on_pod() {
60 local pod=$1
61 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`
62 for hex_port in $open_ports_hex; do
63 echo $((16#$hex_port))
64 done
65}
66
67N_PORTS=0
68
69# go through all pods
70for pod in `list_pods`; do
71 open_ports=`get_open_ports_on_pod $pod`
72 # if there is no open ports just go to next pod
73 if [ -z "$open_ports" ]; then
74 continue
75 fi
76
77 # let's setup a proxy and check every open port
78 for port in $open_ports; do
79 # run proxy
80 kubectl port-forward --namespace=$K8S_NAMESPACE $pod $LOCAL_PORT:$port &>/dev/null &
81 sleep 1
82 proxy_pid=$!
83
84 do_jdwp_handshake $LOCAL_PORT
85 if [ $? -eq 0 ]; then
86 echo $pod $port
87 ((++N_PORTS))
88 fi
89 kill $proxy_pid 2>/dev/null
90 wait $proxy_pid 2>/dev/null
91 done
92done
93
94exit $N_PORTS