From f1e6ab5c0046ed6172fb53505c6c1f023f791654 Mon Sep 17 00:00:00 2001 From: Thorsten Spille Date: Tue, 1 Feb 2022 19:35:42 +0100 Subject: [PATCH] Update checkzfs.py --- checkzfs.py | 90 ++++++++++++++++++++++++++++------------------------- 1 file changed, 47 insertions(+), 43 deletions(-) diff --git a/checkzfs.py b/checkzfs.py index c7ac242..b93015e 100644 --- a/checkzfs.py +++ b/checkzfs.py @@ -16,7 +16,7 @@ ## GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -VERSION = 4.02 +VERSION = 4.04 ### for check_mk usage link or copy binary to check_mk_agent/local/checkzfs ### create /etc/check_mk/checkzfs ## the config file name matches the filename in check_mk_agent/local/ @@ -61,7 +61,6 @@ import json import os.path import os import socket -from datetime import datetime from email.message import EmailMessage from email.mime.application import MIMEApplication from email.utils import formatdate @@ -531,8 +530,11 @@ class zfscheck(object): raise Exception(_stderr.decode(sys.stdout.encoding)) ## Raise Errorlevel with Error from proc -- kann check_mk stderr lesen? sollte das nach stdout? return _stdout.decode(sys.stdout.encoding) ## ausgabe kommt als byte wir wollen str - def convert_ts_date(self,ts): - return time.strftime(self.DATEFORMAT,time.localtime(ts)) + def convert_ts_date(self,ts,dateformat=None): + if dateformat: + return time.strftime(dateformat,time.localtime(ts)) + else: + return time.strftime(self.DATEFORMAT,time.localtime(ts)) @staticmethod def format_status(val): @@ -661,31 +663,30 @@ class zfscheck(object): _header_names = [self.COLUMN_NAMES.get(i,i) for i in _header] _converter = dict((i,self.COLUMN_MAPPER.get(i,(lambda x: str(x)))) for i in _header) _hostname = socket.getfqdn() - - _out = "" - _out += "" - _out += "" - _out += "" - _out += "Check ZFS" - _out += f"

{_hostname}

{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}

" - _out += "" - _out += "".format("".format("
{0}
".join(_header_names)) - + _now = self.convert_ts_date(time.time(),'%Y-%m-%d %H:%M:%S') + _out = [] + _out.append("") + _out.append("") + _out.append("") + _out.append("") + _out.append("Check ZFS") + _out.append(f"

{_hostname}

{_now}

") + _out.append("") + _out.append("".format("".format("
{0}
".join(_header_names))) for _item in self._datasort(data): - _out += "
{0}
".join([_converter.get(_col)(_item.get(_col,"")) for _col in _header]),_converter["status"](_item.get("status","0"))) - - _out += "
" + _out.append("
{0}
".join([_converter.get(_col)(_item.get(_col,"")) for _col in _header]),_converter["status"](_item.get("status","0")))) + _out.append("
") return "".join(_out) def mail_output(self,data): @@ -755,6 +756,8 @@ if __name__ == "__main__": help=_("Nur Snapshot-Alter prüfen")) _parser.add_argument("--mail",type=str, help=_("Email für den Versand")) + _parser.add_argument("--config",dest="config_file",type=str,default="", + help=_("Config File")) _parser.add_argument("--threshold",type=str, help=_("Grenzwerte für Alter von Snapshots warn,crit")) _parser.add_argument("--maxsnapshots",type=str, @@ -782,30 +785,31 @@ if __name__ == "__main__": CONFIG_KEYS="disabled|source|sourceonly|piggyback|remote|legacyhosts|prefix|filter|replicafilter|threshold|maxsnapshots|snapshotfilter|ssh-identity|ssh-extra-options" _config_regex = re.compile(f"^({CONFIG_KEYS}):\s*(.*?)(?:\s+#|$)",re.M) _basename = os.path.basename(__file__).split(".")[0] ## name für config ermitteln aufgrund des script namens - _config_file = f"/etc/check_mk/{_basename}" - if not os.path.exists(_config_file): ### wenn checkmk aufruf und noch keine config ... default erstellen + args.config_file = f"/etc/check_mk/{_basename}" + if not os.path.exists(args.config_file): ### wenn checkmk aufruf und noch keine config ... default erstellen if not os.path.isdir("/etc/check_mk"): os.mkdir("/etc/check_mk") - with open(_config_file,"wt") as _f: ## default config erstellen + with open(args.config_file,"wt") as _f: ## default config erstellen _f.write("## config for checkzfs check_mk") _f.write("\n".join([f"# {_k}:" for _k in CONFIG_KEYS.split("|")])) _f.write("\n") - print(f"please edit config {_config_file}") + print(f"please edit config {args.config_file}") os._exit(0) - _rawconfig = open(_config_file,"rt").read() - for _k,_v in _config_regex.findall(_rawconfig): - if _k == "disabled" and _v.lower().strip() in ( "1","yes","true"): ## wenn disabled dann ignorieren check wird nicht durchgeführt - os._exit(0) - if _k == "sourceonly": - args.sourceonly = bool(_v.lower().strip() in ( "1","yes","true")) - elif _k == "prefix": - args.__dict__["prefix"] = _v.strip() - elif not args.__dict__.get(_k.replace("-","_"),None): - args.__dict__[_k.replace("-","_")] = _v.strip() - except: pass args.output = "checkmk" if not args.output else args.output + if args.config_file: + _rawconfig = open(args.config_file,"rt").read() + for _k,_v in _config_regex.findall(_rawconfig): + if _k == "disabled" and _v.lower().strip() in ( "1","yes","true"): ## wenn disabled dann ignorieren check wird nicht durchgeführt + os._exit(0) + if _k == "sourceonly": + args.sourceonly = bool(_v.lower().strip() in ( "1","yes","true")) + elif _k == "prefix": + args.__dict__["prefix"] = _v.strip() + elif not args.__dict__.get(_k.replace("-","_"),None): + args.__dict__[_k.replace("-","_")] = _v.strip() + try: ZFSCHECK_OBJ = zfscheck(**args.__dict__) pass ## for debugger