2626MAX_LDAP_ATTEMPTS = 3
2727class SimpleVault (object ):
2828 p_vault_conn = None
29- # persistent vault connection
30- def __init__ (self , vault_user = None , vault_addr = None , vault_token = None , persistent_session = True , auto_prompt = True ):
29+ # persistent vault connection
30+ def __init__ (
31+ self , vault_user = None , vault_addr = None , vault_token = None , namespace = None ,
32+ mount_point = None , persistent_session = True , auto_prompt = True ):
3133 def try_reading_token_file ():
3234 ret = None
3335 try :
@@ -49,13 +51,15 @@ def write_token(token=None):
4951 #with vault running on the provisioner's machine ?
5052 self .vault_token = vault_token or os .getenv ('VAULT_TOKEN' ,None ) or try_reading_token_file ()
5153 self .vault_user = vault_user or os .getenv ('VAULT_USER' , None ) or getpass .getuser ()
54+ self .mount_point = mount_point
55+ self .namespace = namespace
5256 self .ldap_attempts = 0
5357
5458 if persistent_session :
5559 if SimpleVault .p_vault_conn :
5660 self .vault_conn = SimpleVault .p_vault_conn
5761 else :
58- self .vault_conn = hvac .Client (url = self .vault_addr , token = self .vault_token )
62+ self .vault_conn = hvac .Client (url = self .vault_addr , namespace = self . namespace , token = self .vault_token )
5963
6064 while not self .vault_conn .is_authenticated () and auto_prompt :
6165 display ("VAULT-LIB: Not authenticated to vault '%s'" % self .vault_addr , stderr = True , color = 'red' )
@@ -65,7 +69,7 @@ def write_token(token=None):
6569 try :
6670 self .ldap_attempts += 1
6771 ldap_password = getpass .getpass (prompt = 'LDAP password for %s for server %s: ' % (self .vault_user , self .vault_addr ))
68- auth_response = self .vault_conn .auth_ldap ( self .vault_user , ldap_password )
72+ auth_response = self .vault_conn .auth . ldap . login ( username = self .vault_user , password = ldap_password )
6973 self .vault_conn .is_authenticated ()
7074 self .vault_token = auth_response ['auth' ]['client_token' ]
7175 write_token (self .vault_token )
@@ -81,25 +85,27 @@ def get(self, path, key='value', wrap_ttl=None, default=None, fetch_all=False, r
8185 if fetch_all :
8286 key = None
8387 try :
84- raw_data = self .vault_conn .read (path , wrap_ttl = wrap_ttl ) or {}
85- data = raw_data .get ('data' ) or {}
88+ raw_data = self .vault_conn .secrets .kv .v2 .read_secret_version (
89+ path = path , mount_point = self .mount_point )
90+ # move this check earlier, and, if true, return immediately
91+ if raw :
92+ return raw_data
93+ data = raw_data .get ('data' )
8694 if isinstance (data , dict ):
8795 if not fetch_all :
8896 if key :
89- return data .get (key , default )
97+ # the actual secret k v pairs are nested under another dictionary key "data"
98+ return data .get ("data" ).get (key , default )
9099 else :
91100 raise ('VAULT-LIB: either key or fetch_all should be set!' )
92-
93101 except Exception as e :
94102 if raise_exceptions :
95103 raise e
96104 else :
97105 data = default
98- if raw :
99- return raw_data
100- else :
101- return data
102- def put (self ,path ,value ,lease = None ,wrap_ttl = None ):
106+ return data
107+
108+ def put (self , path , value , lease = None , wrap_ttl = None ):
103109 payload = {}
104110 if isinstance (value , (basestring , int , float , bool )):
105111 payload ['value' ] = str (value )
@@ -108,15 +114,20 @@ def put(self,path,value,lease=None,wrap_ttl=None):
108114 payload [k ] = str (v )
109115 else :
110116 raise Exception ('Unsupported data type for secret payload' )
111- self .vault_conn .write (path , wrap_ttl ,** payload )
117+ self .vault_conn .secrets .kv .v2 .create_or_update_secret (
118+ path = path , secret = payload , mount_point = self .mount_point )
119+
112120 def is_authenticated (self ):
113121 return self .vault_conn .is_authenticated ()
114122
115123
116124class ManagedVaultSecret (object ):
117125 p_sv = None
118- # Persistent SimpleVault accessory object
119- def __init__ (self , path , key = 'value' , policy = {}, vault_user = None , vault_addr = None , vault_token = None , auto_prompt = True ):
126+ # Persistent SimpleVault accessory object
127+ def __init__ (
128+ self , path , key = 'value' , policy = {}, vault_user = None , vault_addr = None ,
129+ vault_token = None , namespace = None , mount_point = None , auto_prompt = True ):
130+
120131 self .__DEFAULT_POLICY__ = {
121132 'engine' : 'passgen' ,
122133 'length' : 24
@@ -125,6 +136,8 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
125136 self .already_initialized = False
126137 self .actual_policy = self .__DEFAULT_POLICY__ .copy ()
127138 self .key = key
139+ self .mount_point = mount_point
140+ self .namespace = namespace
128141 if isinstance (policy ,int ):
129142 self .actual_policy .update ({'length' : policy })
130143 elif isinstance (policy ,dict ):
@@ -140,7 +153,9 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
140153 self .sv = ManagedVaultSecret .p_sv
141154 else :
142155 try :
143- self .sv = SimpleVault (vault_user = None , vault_addr = None , vault_token = None , auto_prompt = True )
156+ self .sv = SimpleVault (
157+ vault_user = None , vault_addr = None , vault_token = None , auto_prompt = True ,
158+ namespace = self .namespace , mount_point = self .mount_point )
144159 ManagedVaultSecret .p_sv = self .sv
145160 except Exception as e :
146161 display ('MANAGED-SECRET: could not obtain a proper Vault connection.\n {}' .format (e .message ))
@@ -166,8 +181,6 @@ def __init__(self, path, key='value', policy={}, vault_user=None, vault_addr=Non
166181 raise e
167182 try :
168183 #generating and storing the new secret
169-
170-
171184 self .new_data = self .current_data .copy ()
172185 self .new_data [key ] = passgen .passgen (** generator_args )
173186 self .sv .put (path , self .new_data )
0 commit comments