Skip to content

Commit 0997672

Browse files
authored
Merge pull request #390 from chngtrn/pr/issue_376
Enable SSL support.
2 parents f62af43 + 87940ff commit 0997672

File tree

3 files changed

+44
-10
lines changed

3 files changed

+44
-10
lines changed

application.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
default_host = '0.0.0.0'
99
default_port = 5000
1010
default_debug = False
11+
default_enable_ssl = False
12+
default_ca_certs = None
1113
default_url = 'http://localhost:9200'
1214
is_gunicorn = "gunicorn" in os.environ.get("SERVER_SOFTWARE", "")
1315

@@ -28,11 +30,19 @@
2830
action="store_true", dest="debug", default=default_debug,
2931
help=optparse.SUPPRESS_HELP)
3032
parser.add_option("-u", "--url", default=default_url)
33+
parser.add_option("-s", "--enable-ssl",
34+
action="store_true", default=default_enable_ssl)
35+
parser.add_option("-c", "--ca-certs", default=default_ca_certs,
36+
help='Required when --use-ssl is set. ' + \
37+
'Path to CA file or directory [default %s]' % default_ca_certs)
38+
3139

3240
options, _ = parser.parse_args()
3341

3442
# set default url, override with env for docker
3543
application.config['DEFAULT_URL'] = os.environ.get('HQ_DEFAULT_URL', options.url)
44+
application.config['ENABLE_SSL'] = os.environ.get('HQ_ENABLE_SSL', options.enable_ssl)
45+
application.config['CA_CERTS'] = os.environ.get('HQ_CA_CERTS', options.ca_certs)
3646

3747
if is_gunicorn:
3848
# we set reloader False so gunicorn doesn't call two instances of all the Flask init functions.

elastichq/api/clusters.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
.. moduleauthor:: Roy Russo <royrusso@gmail.com>
55
"""
66

7-
from flask import request
7+
from flask import request, current_app
88
from flask_restful import Resource
99
from requests.exceptions import ConnectionError
1010

@@ -111,10 +111,14 @@ def post(self):
111111
scheme = 'https'
112112

113113
try:
114+
enable_ssl = current_app.config.get('ENABLE_SSL', False)
115+
ca_certs = current_app.config.get('CA_CERTS', None)
116+
114117
response = ConnectionService().create_connection(ip=params['ip'], port=params.get('port', "9200"),
115118
scheme=scheme, username=params.get('username', None),
116119
password=params.get('password', None),
117-
fail_on_exception=True)
120+
fail_on_exception=True,
121+
enable_ssl=enable_ssl, ca_certs=ca_certs)
118122

119123
schema = ClusterDTO(many=False)
120124
result = schema.dump(response)

elastichq/service/ConnectionService.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
__author__ = 'royrusso'
22

3+
import os
34
import json
45

56
import requests
@@ -34,7 +35,8 @@ def ping(self, ip, port, scheme='http'):
3435
except Exception as e:
3536
return False
3637

37-
def create_connection(self, ip, port, scheme='http', username=None, password=None, fail_on_exception=False):
38+
def create_connection(self, ip, port, scheme='http', username=None, password=None,
39+
fail_on_exception=False, enable_ssl=False, ca_certs=None):
3840
"""
3941
Creates a connection with a cluster and place the connection inside of a connection pool, using the cluster_name as an alias.
4042
:param ip:
@@ -55,10 +57,17 @@ def create_connection(self, ip, port, scheme='http', username=None, password=Non
5557

5658
# determine version first
5759
if is_basic_auth is True:
58-
response = requests.get(scheme + "://" + ip + ":" + port, auth=(username, password),
59-
timeout=REQUEST_TIMEOUT)
60+
if enable_ssl:
61+
response = requests.get(scheme + "://" + ip + ":" + port, auth=(username, password),
62+
timeout=REQUEST_TIMEOUT, verify=ca_certs)
63+
else:
64+
response = requests.get(scheme + "://" + ip + ":" + port, auth=(username, password),
65+
timeout=REQUEST_TIMEOUT)
6066
else:
61-
response = requests.get(scheme + "://" + ip + ":" + port, timeout=REQUEST_TIMEOUT)
67+
if enable_ssl:
68+
response = requests.get(scheme + "://" + ip + ":" + port, timeout=REQUEST_TIMEOUT, verify=ca_certs)
69+
else:
70+
response = requests.get(scheme + "://" + ip + ":" + port, timeout=REQUEST_TIMEOUT)
6271

6372
if response.status_code == 401:
6473
message = "Unable to create connection! Server returned 401 - UNAUTHORIZED: " + scheme + "://" + ip + ":" + port
@@ -68,11 +77,22 @@ def create_connection(self, ip, port, scheme='http', username=None, password=Non
6877

6978
# SAVE to Connection Pools
7079
if is_basic_auth is True:
71-
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
72-
version=content.get('version').get('number'), http_auth=(username, password))
80+
if enable_ssl:
81+
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
82+
use_ssl=True, verify_certs=True, ca_certs=ca_certs,
83+
version=content.get('version').get('number'), http_auth=(username, password))
84+
else:
85+
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
86+
version=content.get('version').get('number'), http_auth=(username, password))
87+
7388
else:
74-
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
75-
version=content.get('version').get('number'))
89+
if enable_ssl:
90+
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
91+
use_ssl=True, verify_certs=True, ca_certs=ca_certs,
92+
version=content.get('version').get('number'))
93+
else:
94+
conn = Elasticsearch(hosts=[scheme + "://" + ip + ":" + port], maxsize=5,
95+
version=content.get('version').get('number'))
7696

7797
self.add_connection(content.get('cluster_name'), conn=conn)
7898

0 commit comments

Comments
 (0)