1
1
import re
2
2
import socket
3
+ import ssl
3
4
import threading
4
5
from functools import partial
5
6
@@ -55,14 +56,17 @@ class AMIClient(object):
55
56
56
57
def __init__ (self , address = '127.0.0.1' , port = 5038 ,
57
58
encoding = 'utf-8' , encoding_errors = 'replace' ,
58
- timeout = 3 , buffer_size = 2 ** 10 ,
59
+ timeout = 3 , buffer_size = 2 ** 10 , ssl = False , checkcert = False , ca = False ,
59
60
** kwargs ):
60
61
self ._action_counter = 0
61
62
self ._futures = {}
62
63
self ._listeners = []
63
64
self ._event_listeners = []
64
65
self ._address = address
65
66
self ._buffer_size = buffer_size
67
+ self ._ssl = ssl
68
+ self ._checkcert = checkcert
69
+ self ._ca = ca
66
70
self ._port = port
67
71
self ._socket = None
68
72
self ._thread = None
@@ -80,8 +84,22 @@ def next_action_id(self):
80
84
return str (id )
81
85
82
86
def connect (self ):
83
- self ._socket = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
84
- self ._socket .settimeout (self ._timeout )
87
+ if self ._ssl :
88
+ with socket .socket (socket .AF_INET , socket .SOCK_STREAM ) as sock :
89
+ sock .settimeout (self ._timeout )
90
+ context = ssl .SSLContext (ssl .PROTOCOL_TLS_CLIENT )
91
+ if not self ._checkcert :
92
+ context .check_hostname = False
93
+ context .verify_mode = ssl .CERT_NONE
94
+ elif self ._ca :
95
+ context .verify_mode = ssl .CERT_REQUIRED
96
+ context .load_verify_locations (self ._ca )
97
+
98
+ self ._socket = context .wrap_socket (sock , server_hostname = self ._address )
99
+ else :
100
+ self ._socket = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
101
+ self ._socket .settimeout (self ._timeout )
102
+
85
103
self ._socket .connect ((self ._address , self ._port ))
86
104
self .finished = threading .Event ()
87
105
self ._thread = threading .Thread (target = self .listen )
0 commit comments