-
Notifications
You must be signed in to change notification settings - Fork 123
Expand file tree
/
Copy pathscript.py
More file actions
executable file
·135 lines (124 loc) · 5.81 KB
/
script.py
File metadata and controls
executable file
·135 lines (124 loc) · 5.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/usr/bin/env python
'''
A CLI interface to a remote salt-api instance
'''
from __future__ import print_function
import sys
import json
import logging
from pepper.cli import PepperCli
from pepper.retcode import PepperRetcode
from pepper.exceptions import (
PepperException,
PepperAuthException,
PepperArgumentsException,
)
try:
import salt.loader
import salt.config
import salt.output
HAS_SALT = True
except ImportError:
HAS_SALT = False
logger = logging.getLogger(__name__)
class Pepper(object):
def __init__(self):
self.cli = PepperCli()
if HAS_SALT:
self.opts = salt.config.client_config(self.cli.options.master)
else:
self.opts = {}
if self.cli.options.output_file is not None:
self.opts['output_file'] = self.cli.options.output_file
if self.cli.options.state_output is not None:
self.opts['state_output'] = self.cli.options.state_output
if self.cli.options.state_verbose is not None:
self.opts['state_verbose'] = self.cli.options.state_verbose in [ "true", "True", "1" ]
@property
def output(self):
if not hasattr(self, 'modules'):
self.modules = salt.loader.minion_mods(self.opts)
try:
oput = self.modules[self.cli.args[1]].__outputter__
except (KeyError, AttributeError, TypeError):
oput = 'nested'
return oput
def __call__(self):
try:
for exit_code, result in self.cli.run():
if HAS_SALT and self.opts:
logger.debug('Use Salt outputters')
result = json.loads(result)
# unwrap ret in some cases
if 'return' in result:
result = result['return']
for ret in result:
if isinstance(ret, dict):
if self.cli.options.client.startswith('local'):
for minionid, minionret in ret.items():
# rest_tornado doesnt return full_return directly
# it will always be from get_event, so the output differs slightly
if isinstance(minionret, dict) and 'return' in minionret:
# version >= 2017.7
salt.output.display_output(
{minionid: minionret['return']},
self.cli.options.output or minionret.get('out', None) or 'nested',
opts=self.opts
)
# cherrypy returns with ret via full_return
elif isinstance(minionret, dict) and 'ret' in minionret:
# version >= 2017.7
salt.output.display_output(
{minionid: minionret['ret']},
self.cli.options.output or minionret.get('out', None) or 'nested',
opts=self.opts
)
else:
salt.output.display_output(
{minionid: minionret},
self.cli.options.output or self.output,
opts=self.opts
)
elif 'data' in ret:
# unfold runners
outputter = ret.get('outputter', 'nested')
if isinstance(ret['data'], dict) and 'return' in ret['data']:
ret = ret['data']['return']
salt.output.display_output(
ret,
self.cli.options.output or outputter,
opts=self.opts
)
else:
salt.output.display_output(
{self.cli.options.client: ret},
self.cli.options.output or ret.get('outputter', 'nested'),
opts=self.opts
)
else:
salt.output.display_output(
{self.cli.options.client: ret},
self.cli.options.output or 'nested',
opts=self.opts,
)
else:
if self.cli.options.output_file is not None:
with open(self.cli.options.output_file, 'a') as ofile:
print(result, file=ofile)
else:
print(result)
if exit_code is not None:
if exit_code == 0:
return PepperRetcode().validate(self.cli.options, result)
return exit_code
except (PepperException, PepperAuthException, PepperArgumentsException) as exc:
print('Pepper error: {0}'.format(exc), file=sys.stderr)
return 1
except KeyboardInterrupt:
# TODO: mimic CLI and output JID on ctrl-c
return 0
except Exception as e:
print(e)
print('Uncaught Pepper error (increase verbosity for the full traceback).', file=sys.stderr)
logger.debug('Uncaught traceback:', exc_info=True)
return 1