get-hc-secrets 1.5.10__py3-none-any.whl → 1.5.20__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- getSecrets/__init__.py +86 -60
- {get_hc_secrets-1.5.10.dist-info → get_hc_secrets-1.5.20.dist-info}/METADATA +22 -5
- get_hc_secrets-1.5.20.dist-info/RECORD +6 -0
- {get_hc_secrets-1.5.10.dist-info → get_hc_secrets-1.5.20.dist-info}/WHEEL +1 -1
- get_hc_secrets-1.5.10.dist-info/RECORD +0 -6
- {get_hc_secrets-1.5.10.dist-info → get_hc_secrets-1.5.20.dist-info/licenses}/LICENSE +0 -0
- {get_hc_secrets-1.5.10.dist-info → get_hc_secrets-1.5.20.dist-info}/top_level.txt +0 -0
getSecrets/__init__.py
CHANGED
|
@@ -5,22 +5,24 @@ from os import getenv
|
|
|
5
5
|
from os.path import join
|
|
6
6
|
|
|
7
7
|
import requests
|
|
8
|
+
import urllib3
|
|
8
9
|
import yaml
|
|
9
10
|
|
|
10
11
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s',
|
|
11
12
|
datefmt='%m/%d/%Y %I:%M:%S %p')
|
|
12
13
|
|
|
13
|
-
_config_file = "
|
|
14
|
+
_config_file = ".config/.vault/vault.yml"
|
|
14
15
|
_home = getenv("HOME")
|
|
15
16
|
|
|
16
17
|
try:
|
|
17
|
-
_config = yaml.safe_load(open(join(_home, _config_file
|
|
18
|
+
_config = yaml.safe_load(open(join(_home, _config_file)))
|
|
18
19
|
except (FileNotFoundError, TypeError):
|
|
19
20
|
if not os.path.exists("/etc/vault"):
|
|
20
21
|
os.makedirs("/etc/vault")
|
|
21
22
|
_home = "/etc/vault"
|
|
23
|
+
_config_file = "vault.yml"
|
|
22
24
|
try:
|
|
23
|
-
_config = yaml.safe_load(open(join(_home,
|
|
25
|
+
_config = yaml.safe_load(open(join(_home, _config_file)))
|
|
24
26
|
except FileNotFoundError:
|
|
25
27
|
logging.error(f"No vault configuration found in {_home}")
|
|
26
28
|
sys.exit(1)
|
|
@@ -38,25 +40,34 @@ def get_secret(id: str, repo: str = 'secret') -> dict:
|
|
|
38
40
|
If the request fails, the method logs an HTTP error message and returns a n empty json {}.
|
|
39
41
|
"""
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
if
|
|
43
|
-
|
|
43
|
+
# check if data is available in config file
|
|
44
|
+
if id in _config:
|
|
45
|
+
return _config[id]
|
|
44
46
|
else:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
base_url = _config['vault']['vault_addr']
|
|
48
|
+
if _home == '/etc/vault':
|
|
49
|
+
certs = '/etc/vault/bundle.pem'
|
|
50
|
+
else:
|
|
51
|
+
certs = join(_home, _config['vault']['certs'].replace("~/", ''))
|
|
52
|
+
# check if file exist, else make insecure
|
|
53
|
+
if not (os.path.exists(certs)):
|
|
54
|
+
certs = False
|
|
55
|
+
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
|
56
|
+
logging.warning(f"No vault bundle.pem found at {certs} - working insecure !!")
|
|
57
|
+
|
|
58
|
+
token = _config['vault']['token']
|
|
59
|
+
headers = {"X-Vault-Token": token}
|
|
60
|
+
uri = f"/v1/{repo}/data/"
|
|
61
|
+
url = f"{base_url}{uri}{id}"
|
|
62
|
+
resp = requests.get(url, headers=headers, verify=certs)
|
|
63
|
+
if resp.status_code == 200:
|
|
64
|
+
secret = resp.json()["data"]["data"]
|
|
65
|
+
return secret
|
|
55
66
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
67
|
+
else:
|
|
68
|
+
print(f"http error {resp.status_code}")
|
|
69
|
+
logging.error(f"Vault api error {resp}")
|
|
70
|
+
return {}
|
|
60
71
|
|
|
61
72
|
|
|
62
73
|
def get_user_pwd(id: str, repo: str = 'secret') -> tuple:
|
|
@@ -71,26 +82,30 @@ def get_user_pwd(id: str, repo: str = 'secret') -> tuple:
|
|
|
71
82
|
If the request fails, the method prints an HTTP error message and returns (None, None).
|
|
72
83
|
"""
|
|
73
84
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
85
|
+
# check if data is available in config file
|
|
86
|
+
if id in _config:
|
|
87
|
+
return _config[id]['username'], _config[id]['password']
|
|
88
|
+
else:
|
|
89
|
+
base_url = _config['vault']['vault_addr']
|
|
90
|
+
certs = join(_home, _config['vault']['certs'].replace("~/", ''))
|
|
91
|
+
token = _config['vault']['token']
|
|
92
|
+
|
|
93
|
+
headers = {"X-Vault-Token": token}
|
|
94
|
+
uri = f"/v1/{repo}/data/"
|
|
95
|
+
url = f"{base_url}{uri}{id}"
|
|
96
|
+
resp = requests.get(url, headers=headers, verify=certs)
|
|
97
|
+
if resp.status_code == 200:
|
|
98
|
+
secret = resp.json()["data"]["data"]
|
|
99
|
+
if 'username' in secret and 'password' in secret:
|
|
100
|
+
return secret['username'], secret['password']
|
|
101
|
+
else:
|
|
102
|
+
return None, None
|
|
77
103
|
|
|
78
|
-
headers = {"X-Vault-Token": token}
|
|
79
|
-
uri = f"/v1/{repo}/data/"
|
|
80
|
-
url = f"{base_url}{uri}{id}"
|
|
81
|
-
resp = requests.get(url, headers=headers, verify=certs)
|
|
82
|
-
if resp.status_code == 200:
|
|
83
|
-
secret = resp.json()["data"]["data"]
|
|
84
|
-
if 'username' in secret and 'password' in secret:
|
|
85
|
-
return secret['username'], secret['password']
|
|
86
104
|
else:
|
|
105
|
+
print(f"http error {resp.status_code}")
|
|
106
|
+
logging.error(f"Vault api error {resp}")
|
|
87
107
|
return None, None
|
|
88
108
|
|
|
89
|
-
else:
|
|
90
|
-
print(f"http error {resp.status_code}")
|
|
91
|
-
logging.error(f"Vault api error {resp}")
|
|
92
|
-
return None, None
|
|
93
|
-
|
|
94
109
|
|
|
95
110
|
def list_secret(repo: str = 'secret'):
|
|
96
111
|
"""
|
|
@@ -125,29 +140,40 @@ def upd_secret(id: str, data, repo: str = 'secret'):
|
|
|
125
140
|
|
|
126
141
|
"""
|
|
127
142
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
uri = f"/v1/{repo}/data/"
|
|
134
|
-
url = f"{base_url}{uri}{id}"
|
|
135
|
-
resp = requests.request('GET', url, headers=headers, verify=certs)
|
|
136
|
-
if resp.status_code == 200:
|
|
137
|
-
version = resp.json()["data"]['metadata']['version']
|
|
138
|
-
obj = {
|
|
139
|
-
"options": {
|
|
140
|
-
"cas": version
|
|
141
|
-
},
|
|
142
|
-
"data": data
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
resp2 = requests.request('POST', url, headers=headers, json=obj, verify=certs)
|
|
146
|
-
if resp2.status_code != 200:
|
|
147
|
-
logging.warning(f"Vault update error for {id} with new {data}")
|
|
148
|
-
return resp2.status_code
|
|
143
|
+
# check if data is available in config file
|
|
144
|
+
if id in _config:
|
|
145
|
+
_config[id] = data
|
|
146
|
+
yaml.safe_dump(data, open(join(_home, _config_file)))
|
|
147
|
+
return 200
|
|
149
148
|
|
|
150
149
|
else:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
150
|
+
base_url = _config['vault']['vault_addr']
|
|
151
|
+
certs = join(_home, _config['vault']['certs'].replace("~/", ''))
|
|
152
|
+
token = _config['vault']['token']
|
|
153
|
+
|
|
154
|
+
headers = {"X-Vault-Token": token}
|
|
155
|
+
uri = f"/v1/{repo}/data/"
|
|
156
|
+
url = f"{base_url}{uri}{id}"
|
|
157
|
+
resp = requests.request('GET', url, headers=headers, verify=certs)
|
|
158
|
+
if resp.status_code == 200:
|
|
159
|
+
version = resp.json()["data"]['metadata']['version']
|
|
160
|
+
obj = {
|
|
161
|
+
"options": {
|
|
162
|
+
"cas": version
|
|
163
|
+
},
|
|
164
|
+
"data": data
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
resp2 = requests.request('POST', url, headers=headers, json=obj, verify=certs)
|
|
168
|
+
if resp2.status_code != 200:
|
|
169
|
+
logging.warning(f"Vault update error for {id} with new {data}")
|
|
170
|
+
return resp2.status_code
|
|
171
|
+
|
|
172
|
+
else:
|
|
173
|
+
print(f"http error {resp.status_code}")
|
|
174
|
+
logging.error(f"Vault api error {resp}")
|
|
175
|
+
return None, None
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
if __name__ == "__main__":
|
|
179
|
+
secret = get_secret('test')
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: get_hc_secrets
|
|
3
|
-
Version: 1.5.
|
|
4
|
-
Summary: A package to read secrets from Hashicorp vault
|
|
3
|
+
Version: 1.5.20
|
|
4
|
+
Summary: A package to read secrets from Hashicorp vault or from a local file
|
|
5
5
|
Author-email: Xavier Mayeur <xavier@mayeur.be>
|
|
6
6
|
Project-URL: Homepage, https://github.com/xmayeur/getSecrets
|
|
7
7
|
Project-URL: Bug Tracker, https://github.com/xmayeur/getSecrets/issues
|
|
@@ -13,19 +13,23 @@ Description-Content-Type: text/markdown
|
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
Requires-Dist: pyyaml
|
|
15
15
|
Requires-Dist: requests
|
|
16
|
+
Dynamic: license-file
|
|
16
17
|
|
|
17
18
|
# getSecrets package
|
|
18
19
|
|
|
19
20
|
getSecrets is a simple package that reads from the given engine ('secret' by default) of a Hashicorp vault
|
|
21
|
+
It can also read data from the local vault.yml file
|
|
20
22
|
|
|
21
23
|
usage:
|
|
22
24
|
|
|
23
25
|
```
|
|
24
26
|
from getSecrets import *
|
|
25
27
|
|
|
26
|
-
data = get_secret(<id>, [
|
|
28
|
+
data = get_secret(<id>, [repo:<secret>])
|
|
27
29
|
|
|
28
|
-
|
|
30
|
+
usr, pwd = get_user_pwd(<id> , [repo:<secret>])
|
|
31
|
+
|
|
32
|
+
updater = update_secret(<id>, <new_object>, [repo:<secret>])
|
|
29
33
|
|
|
30
34
|
list = list_secret([<secret>]
|
|
31
35
|
|
|
@@ -38,4 +42,17 @@ vault:
|
|
|
38
42
|
token: "<access token>"
|
|
39
43
|
vault_addr: "https://vault:8200"
|
|
40
44
|
certs: "<path>/bundle.pem"
|
|
45
|
+
|
|
46
|
+
id:
|
|
47
|
+
item1: 1
|
|
48
|
+
item2: 2
|
|
49
|
+
username: user
|
|
50
|
+
password: !@•?
|
|
41
51
|
```
|
|
52
|
+
|
|
53
|
+
for reminder:
|
|
54
|
+
bundle.pem, for own certificates, is made of, in this order:
|
|
55
|
+
|
|
56
|
+
- vault certificate
|
|
57
|
+
- intermediate certificate
|
|
58
|
+
- root certificate
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
getSecrets/__init__.py,sha256=bIzwK45nHov9AHzlAxtbzzTb6PTHf-ZbPVqPqR5GsSQ,6347
|
|
2
|
+
get_hc_secrets-1.5.20.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
|
|
3
|
+
get_hc_secrets-1.5.20.dist-info/METADATA,sha256=mTkjgn4gmDgAkXY8m87PgxSxJOx4z7BPjPs1A2krZmE,1410
|
|
4
|
+
get_hc_secrets-1.5.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
5
|
+
get_hc_secrets-1.5.20.dist-info/top_level.txt,sha256=X_v6_cB4900TWZoDSDtFDhZrxKcH4dJiPCIAcyL5Z7k,11
|
|
6
|
+
get_hc_secrets-1.5.20.dist-info/RECORD,,
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
getSecrets/__init__.py,sha256=U2J8nInxyA5jv5JMjc3yAt7WUTWSHC0ZI0ODoFlJ8-8,5304
|
|
2
|
-
get_hc_secrets-1.5.10.dist-info/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
|
|
3
|
-
get_hc_secrets-1.5.10.dist-info/METADATA,sha256=DwFHqkDHQvfKAtgtFBLLwB6tDW0i5m-4--zLNMlMek4,1051
|
|
4
|
-
get_hc_secrets-1.5.10.dist-info/WHEEL,sha256=HiCZjzuy6Dw0hdX5R3LCFPDmFS4BWl8H-8W39XfmgX4,91
|
|
5
|
-
get_hc_secrets-1.5.10.dist-info/top_level.txt,sha256=X_v6_cB4900TWZoDSDtFDhZrxKcH4dJiPCIAcyL5Z7k,11
|
|
6
|
-
get_hc_secrets-1.5.10.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|