Compare commits

...
Sign in to create a new pull request.

5 commits

Author SHA1 Message Date
Pablo Martin
8e37e41d82 Added info about SSH tunneling in the readme. 2022-08-19 17:27:07 +02:00
Pablo Martin
0effe7f3c8 Updated config examples. 2022-08-19 17:25:34 +02:00
Pablo Martin
02f412a42e Updated the changelog. 2022-08-19 17:23:41 +02:00
Pablo Martin
9db02c154b SSHTunnel can now optionally take the password of the SSH key file. 2022-08-19 17:20:20 +02:00
Pablo Martin
c9f81f1c07 Put version back to latest. 2022-07-26 14:32:17 +02:00
7 changed files with 37 additions and 15 deletions

View file

@ -1,5 +1,15 @@
# Changelog
## [unreleased]
### Added
- Users can now specify a password for the SSH key used in the SSH tunnel. This is done by entering the password in
the config file, under the entry `connection_details > ssh_tunneling > ssh_private_key_password`.
### Changed
- The `ssh_tunneling` section of the config file is now optional and the application will work even if the config
file does not contain it.
## [0.2.0] - 2022-07-26
### Added

View file

@ -1 +1 @@
__version__ = "0.2.0"
__version__ = "latest"

View file

@ -5,9 +5,7 @@
"port": 3306,
"user": "your_user",
"password": "your_password",
"schema": "comprea",
"ssh_tunneling": {
"use_tunnel": false
"schema": "comprea"
},
"queries_to_measure": [
{

View file

@ -11,7 +11,8 @@
"ssh_host": "the_ssh_tunnel_host",
"ssh_username": "the_ssh_tunnel_user",
"ssh_port": 22,
"path_to_key": "G:\\path\\to\\ssh\\key.pem"
"path_to_key": "G:\\path\\to\\ssh\\key.pem",
"ssh_private_key_password": "my_keys_password"
}
},
"queries_to_measure": [

View file

@ -7,10 +7,7 @@
"password": "your_password",
"http_scheme": "https",
"catalog": "app_lm_mysql",
"schema": "comprea",
"ssh_tunneling": {
"use_tunnel": false
}
"schema": "comprea"
},
"queries_to_measure": [
{

View file

@ -21,15 +21,22 @@ def singleton(class_):
@singleton
class MySSHTunnel:
def __init__(
self, ssh_host, ssh_port, ssh_username, ssh_pkey, remote_host, remote_port
self,
ssh_host,
ssh_port,
ssh_username,
ssh_pkey,
remote_host,
remote_port,
ssh_private_key_password=None,
):
self.tunnel = SSHTunnelForwarder(
ssh_host=(ssh_host, ssh_port),
ssh_username=ssh_username,
ssh_pkey=ssh_pkey,
remote_bind_address=(remote_host, remote_port),
local_bind_address=("127.0.0.1", remote_port),
ssh_private_key_password=ssh_private_key_password,
)
def start(self):
@ -115,12 +122,13 @@ def get_connection_to_mysql(
:param connection_config: specifies host, port, etc.
:return: the connection object
"""
if connection_config["ssh_tunneling"]["use_tunnel"]:
mysql_connection_host = connection_config["host"]
if connection_config.get("ssh_tunneling", {}).get("use_tunnel", None):
open_ssh_tunnel(connection_config)
mysql_connection_host = "127.0.0.1"
if not connection_config["ssh_tunneling"]["use_tunnel"]:
mysql_connection_host = connection_config["host"]
# If we open an SSH tunnel, we reference the local bind instead of the
# actual host
connection = mysql.connector.connect(
host=mysql_connection_host,
@ -162,6 +170,10 @@ def open_ssh_tunnel(connection_config: dict) -> None:
ssh_pkey=connection_config["ssh_tunneling"]["path_to_key"],
remote_host=connection_config["host"],
remote_port=connection_config["port"],
ssh_private_key_password=connection_config["ssh_tunneling"].get(
"ssh_private_key_password",
None, # Since password is optional, we need a safe default
),
).start()
print("SSH tunnel is now open.")

View file

@ -41,6 +41,10 @@ A few notes:
- I advice you to make the first query a silly, fast query such as `SELECT 1` to validate your connection and
quickly confirm that everything is set up properly.
## Other features
- The connection to the database can be made through an SSH tunnel. See the examples in `config_examples` to
understand how to configure it.
## A few more details
- Queries are run sequentially, as in the second query will only start after the first query is finished.