Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Features
---------
* Let the `--dsn` argument accept literal DSNs as well as aliases.
* Accept `--character-set` as an alias for `--charset` at the CLI.
* Add SSL/TLS version to `status` output.


Bug Fixes
Expand Down
3 changes: 2 additions & 1 deletion mycli/packages/special/dbcommands.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from mycli import __version__
from mycli.packages.special import iocommands
from mycli.packages.special.main import ArgType, special_command
from mycli.packages.special.utils import format_uptime
from mycli.packages.special.utils import format_uptime, get_ssl_version
from mycli.packages.sqlresult import SQLResult

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -126,6 +126,7 @@ def status(cur: Cursor, **_) -> list[SQLResult]:

output.append(("Server version:", f'{variables["version"]} {variables["version_comment"]}'))
output.append(("Protocol version:", variables["protocol_version"]))
output.append(('SSL/TLS version:', get_ssl_version(cur)))

if "unix" in cur.connection.host_info.lower():
host_info = cur.connection.host_info
Expand Down
25 changes: 25 additions & 0 deletions mycli/packages/special/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import logging
import os
import subprocess

from pymysql.cursors import Cursor

logger = logging.getLogger(__name__)

CACHED_SSL_VERSION: dict[int, str | None] = {}


def handle_cd_command(arg: str) -> tuple[bool, str | None]:
"""Handles a `cd` shell command by calling python's os.chdir."""
Expand Down Expand Up @@ -46,3 +53,21 @@ def format_uptime(uptime_in_seconds: str) -> str:

uptime = " ".join(uptime_values)
return uptime


def get_ssl_version(cur: Cursor) -> str | None:
if cur.connection.thread_id() in CACHED_SSL_VERSION:
return CACHED_SSL_VERSION[cur.connection.thread_id()] or None

query = 'SHOW STATUS LIKE "Ssl_version"'
logger.debug(query)
cur.execute(query)

ssl_version = None
if one := cur.fetchone():
CACHED_SSL_VERSION[cur.connection.thread_id()] = one[1]
ssl_version = one[1] or None
else:
CACHED_SSL_VERSION[cur.connection.thread_id()] = ''

return ssl_version