From 26734e6fc5c10223e8e9485e892aa74dc646f0b0 Mon Sep 17 00:00:00 2001 From: creme Date: Thu, 20 Feb 2020 15:19:25 +0100 Subject: [PATCH] skel weechat add script log and purgelog --- .weechat/python/autoload/log.py | 1 + .weechat/python/autoload/purgelogs.py | 1 + .weechat/python/log.py | 163 +++++++++++++++ .weechat/python/purgelogs.py | 282 ++++++++++++++++++++++++++ 4 files changed, 447 insertions(+) create mode 120000 .weechat/python/autoload/log.py create mode 120000 .weechat/python/autoload/purgelogs.py create mode 100644 .weechat/python/log.py create mode 100644 .weechat/python/purgelogs.py diff --git a/.weechat/python/autoload/log.py b/.weechat/python/autoload/log.py new file mode 120000 index 0000000..69447f4 --- /dev/null +++ b/.weechat/python/autoload/log.py @@ -0,0 +1 @@ +../log.py \ No newline at end of file diff --git a/.weechat/python/autoload/purgelogs.py b/.weechat/python/autoload/purgelogs.py new file mode 120000 index 0000000..3fe1e73 --- /dev/null +++ b/.weechat/python/autoload/purgelogs.py @@ -0,0 +1 @@ +../purgelogs.py \ No newline at end of file diff --git a/.weechat/python/log.py b/.weechat/python/log.py new file mode 100644 index 0000000..2ca8a3a --- /dev/null +++ b/.weechat/python/log.py @@ -0,0 +1,163 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2019 by nils_2 +# +# for easy toggling current buffer logging. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# 2019-06-24: nils_2, (freenode.#weechat) +# 0.1 : initial version +# +# requires: WeeChat version 1.0 +# +# Development is currently hosted at +# https://github.com/weechatter/weechat-scripts + +try: + import weechat,re + +except Exception: + print('This script must be run under WeeChat.') + print('Get WeeChat now at: https://www.weechat.org/') + quit() + +SCRIPT_NAME = 'log' +SCRIPT_AUTHOR = 'nils_2 ' +SCRIPT_VERSION = '0.1' +SCRIPT_LICENSE = 'GPL' +SCRIPT_DESC = 'for easy toggling current buffer logging' + +# eval_expression(): to match ${color:nn} tags +regex_color=re.compile('\$\{color:([^\{\}]+)\}') + +# ==========================[ eval_expression() ]======================== +def substitute_colors(text,window): + global version + if int(version) >= 0x00040200: + buffer_ptr = weechat.window_get_pointer(window,"buffer") + return weechat.string_eval_expression(text, {"window": window, "buffer": buffer_ptr}, {}, {}) + # substitute colors in output + return re.sub(regex_color, lambda match: weechat.color(match.group(1)), text) + +# ============================[ subroutines ]============================ +def log_cmd_cb(data, buffer, args): + argv = args.strip().split(' ') + + log_level = infolist_log_buffer(buffer) + + if args == "" or (argv[0].lower() == 'show'): + # no args given. display log level of current buffer + weechat.prnt(buffer,'log level: %s' % log_level) + return weechat.WEECHAT_RC_OK + + if (argv[0].lower() == 'enable') or (argv[0].lower() == 'on'): + if log_level != 'disabled': + return weechat.WEECHAT_RC_OK # buffer already logging! + else: + enable_check(log_level,buffer) + return weechat.WEECHAT_RC_OK + + if (argv[0].lower() == 'disable') or (argv[0].lower() == 'off'): + if log_level == 'disabled': + return weechat.WEECHAT_RC_OK # buffer already disabled! + else: + disable_check(log_level,buffer) + return weechat.WEECHAT_RC_OK + + if (argv[0].lower() == 'toggle'): + if log_level == 'disabled': + enable_check(log_level,buffer) + else: + disable_check(log_level,buffer) + return weechat.WEECHAT_RC_OK + + return weechat.WEECHAT_RC_OK + +# ===============================[ logger() ]============================= +def enable_check(log_level,buffer): + log_level = buffer_get_string_log_level(buffer) + if log_level: + if not str(log_level).isnumeric() or (int(log_level) < 0) or (int(log_level) > 9): + log_level = 9 # invalid log level, set default + weechat.command(buffer,'/logger set %s' % log_level) + buffer_del_log_level(buffer) + else: # no logging and no localvar. + weechat.command(buffer,'/logger set 9') + return weechat.WEECHAT_RC_OK + +def disable_check(log_level,buffer): + buffer_set_string_log_level(buffer,log_level) # store old log level in localvar! + weechat.command(buffer,'/logger disable') + return weechat.WEECHAT_RC_OK + +# =============================[ localvars() ]============================ +def buffer_get_string_log_level(buffer): + return weechat.buffer_get_string(buffer,'localvar_log_level') + +def buffer_set_string_log_level(buffer,log_level): + weechat.buffer_set(buffer, 'localvar_set_log_level', '%s' % log_level) + return weechat.WEECHAT_RC_OK + +def buffer_del_log_level(buffer): + weechat.command(buffer,'/buffer set localvar_del_log_level') + return weechat.WEECHAT_RC_OK + +# =============================[ infolist() ]============================ +def infolist_log_buffer(ptr_buffer): + log_level = None + infolist = weechat.infolist_get('logger_buffer','','') + while weechat.infolist_next(infolist): + bpointer = weechat.infolist_pointer(infolist, 'buffer') + if ptr_buffer == bpointer: + log_enabled = weechat.infolist_integer(infolist, 'log_enabled') + log_level = weechat.infolist_integer(infolist, 'log_level') + + weechat.infolist_free(infolist) # free infolist() + if not log_level: + return 'disabled' + else: + return log_level +# ================================[ main ]=============================== +if __name__ == '__main__': + global version + if weechat.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, SCRIPT_DESC, '', ''): + version = weechat.info_get('version_number', '') or 0 + + # get weechat version (1.0) and store it + if int(version) >= 0x01000000: + + weechat.hook_command(SCRIPT_NAME,SCRIPT_DESC, + 'enable|on||' + 'disable|off||' + 'toggle||' + 'show', + ' enable/on: enable logging on current buffer, with default log-level (note: log-level from localvar will be used, if possible)\n' + 'disable/off: disable logging on current buffer (note: log-level is stored in localvar)\n' + ' toggle: will toggle logging on current buffer\n' + ' show: will print current log-level to buffer (default)\n' + '\n' + 'Examples:\n' + ' /log toggle', + 'enable||' + 'disable||' + 'on||' + 'off||' + 'toggle||' + 'show', + 'log_cmd_cb', '') + + else: + weechat.prnt('','%s%s %s' % (weechat.prefix('error'),SCRIPT_NAME,': needs version 1.0 or higher')) + weechat.command('','/wait 1ms /python unload %s' % SCRIPT_NAME) diff --git a/.weechat/python/purgelogs.py b/.weechat/python/purgelogs.py new file mode 100644 index 0000000..9a36c04 --- /dev/null +++ b/.weechat/python/purgelogs.py @@ -0,0 +1,282 @@ +# -*- coding: utf-8 -*- +# +# Copyright (c) 2011-2013 by nils_2 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# This script deletes weechatlog-files by age or size +# YOU ARE USING THIS SCRIPT AT YOUR OWN RISK! +# +# Usage: +# +# It is recommended to use this script with cron.py script: +# following command will check each 1th day of a month for logfiles older than 100 days and delete them +# /cron add * * 1 * * * core.weechat command /purgelogs age 100 delete +# +# Options: +# do not delete #weechat, #weechat-fr and nils_2 (query) logfiles +# /set plugins.var.python.purgelogs.blacklist "#weechat,#weechat-fr,nils_2" +# +# History: +# 2013-01-25: nils_2, (freenode.#weechat) +# 0.4 : make script compatible with Python 3.x +# 2011-09-18: nils_2, (freenode.#weechat) +# 0.3.1 : code optimization +# 2011-09-17: nils_2, (freenode.#weechat) +# 0.3 : added: search for log-files smaller than age/size (new functions: age_ls and size_ls) +# 2011-03-11: nils_2, (freenode.#weechat) +# 0.2 : added blacklist option +# 2011-02-18: nils_2, (freenode.#weechat) +# 0.1 : initial release +# +# Development is currently hosted at +# https://github.com/weechatter/weechat-scripts +# +# TODO: waiting for "/logger disable all" and "/logger enable all" + +try: + import weechat as w + import os, os.path, stat, time + from datetime import date, timedelta + +except Exception: + print("This script must be run under WeeChat.") + print("Get WeeChat now at: http://www.weechat.org/") + quit() + +SCRIPT_NAME = "purgelogs" +SCRIPT_AUTHOR = "nils_2 " +SCRIPT_VERSION = "0.4" +SCRIPT_LICENSE = "GPL" +SCRIPT_DESC = "delete weechatlog-files by age or size (YOU ARE USING THIS SCRIPT AT YOUR OWN RISK!)" + +purgelogs_commands = { + "delete" : "argument for security reasons", + "size" : "greater than for log-files to purge", + "size_ls": "less than for log-files to purge", + "age" : "older than for log-files to purge (maximum value: 9999)", + "age_ls" : "younger than for log-files to purge", +} +purgelogs_options = { + "blacklist": "" # comma separated list of buffers (short name) +} +blacklist = [] +# ================================[ weechat functions ]=============================== +def purgelogs_cb(data, buffer, args): + global basedir,purgelogs_commands,check_only, i + basedir = get_path() + if basedir == "": + return w.WEECHAT_RC_OK + argv = args.split(None, 2) + """ argument "check" is set? """ + if len(argv) == 0: # no arguments given + w.command("","/help purgelogs") # print help page + return w.WEECHAT_RC_OK + + if len(argv) == 1: + if argv[0] not in purgelogs_commands: + w.prnt("", "%s%s: unknown keyword \"%s\"" + % (w.prefix("error"), SCRIPT_NAME, argv[0])) + return w.WEECHAT_RC_OK + if len(argv) < 2: + w.prnt("", "%s%s: no value given" + % (w.prefix("error"), SCRIPT_NAME)) + return w.WEECHAT_RC_OK + if is_number(argv[1]) is False: + w.prnt("", "%s%s: wrong value \"%s\"" + % (w.prefix("error"), SCRIPT_NAME, argv[1])) + return w.WEECHAT_RC_OK + + if len(argv) == 3: + if argv[2] == "delete": + check_only = False # delete + w.command("","/mute /plugin unload logger") + else: + w.prnt("", "weechat-logs:") + check_only = True # show only + + if argv[0] in ["", "age_ls"]: + i = 0 + getdirs(basedir,int(argv[1]),"ls_age") + if argv[0] in ["", "size_ls"]: + i = 0 + getdirs(basedir,int(argv[1]),"ls_size") + if argv[0] in ["", "age"]: + i = 0 + getdirs(basedir,int(argv[1]),"by_age") + if argv[0] in ["", "size"]: + i = 0 + getdirs(basedir,int(argv[1]),"by_size") + if check_only is False: + w.command("","/mute /plugin load logger") + return w.WEECHAT_RC_OK + +def get_path(): + """ get logger path """ + return w.config_string(w.config_get("logger.file.path")).replace("%h", w.info_get("weechat_dir", "")) + +def is_number(s): + """ check if value is a number """ + try: + float(s) + return True + except ValueError: + return False + +# ================================[ os functions ]=============================== +def getdirs(basedir, value, search): + global i + for root, dirs, files in os.walk(basedir): + found = 1 + for file in files: + if "by_age" in search: + if value > 9999: + return + found_file = datecheck("by_age",root, file, value) + elif "by_size" in search: + found_file = sizecheck("by_size",root, file, value) + elif "ls_age" in search: + if value < 0: + return + found_file = datecheck("ls_age",root, file, value) + elif "ls_size" in search: + found_file = sizecheck("ls_size",root, file, value) + if i == 0: + w.prnt("", "no log-files matched.") + +def datecheck(mode,root, file, age): + basedate = date.today() - timedelta(days=age) + fname = os.path.join(root, file) + used = os.stat(fname).st_mtime # st_mtime=modified, st_atime=accessed + year, day, month = time.localtime(used)[:3] + lastused = date(year, day, month) + if mode == "by_age": + if lastused < basedate: # get files older than age days + file_action(root,file,"by_age") # return age + return # Not old enough + elif mode == "ls_age": + if lastused > basedate: # get files younger than age days + file_action(root,file,"by_age") # return age + return + +def sizecheck(mode,root, file, size): + filesize = 0 + filesize = int(os.path.getsize(os.path.join(root, file))) # filesize in bytes + size = size * 1024 # user option (KiB) to bytes + if mode == "by_size": + if filesize >= size: # get files greater than size + file_action(root,file,filesize) # return file size + return # not large enough + elif mode == "ls_size": + if filesize <= size: # get files smaller than size + file_action(root,file,filesize) # return file size + return # not large enough + +def file_action(root, file, size): + global check_only, mode_mute,i + fname=os.path.join(root, file) + if check_only is True: + if size == "by_age": # by age? + i = i + 1 + bufname = file.split('.',1) # get buffer name from file + if bufname[0] in blacklist: + w.prnt("", " %s[%s%03d%s]%s %s %s[%sblacklisted%s]" + % (w.color("chat_delimiters"), w.color("chat"), + i, + w.color("chat_delimiters"), w.color("chat"), + fname, + w.color("chat_delimiters"), + w.color("chat_channel"), + w.color("chat_delimiters"), + )) + else: + w.prnt("", " %s[%s%03d%s]%s %s" + % (w.color("chat_delimiters"), w.color("chat"), + i, + w.color("chat_delimiters"), w.color("chat"), + fname)) + else: + i = i + 1 + bufname = file.split('.',1) # get buffer name from file + if bufname[0] in blacklist: + w.prnt("", " %s[%s%03d%s]%s %s\n size: %s KiB %s[%sblacklisted%s]" + % (w.color("chat_delimiters"), w.color("chat"), + i, + w.color("chat_delimiters"), w.color("chat"), + fname,size/1024, + w.color("chat_delimiters"), + w.color("chat_channel"), + w.color("chat_delimiters"), + )) + else: + w.prnt("", " %s[%s%03d%s]%s %s\n size: %s KiB" + % (w.color("chat_delimiters"), w.color("chat"), + i, + w.color("chat_delimiters"), w.color("chat"), + fname,size/1024)) + elif check_only is False: # delete logfiles! + i = i + 1 + bufname = file.split('.',1) # get buffer name from file + if bufname[0] in blacklist: + return + + os.remove(fname) +# w.prnt("","delete: %s" % (fname)) + +def update_blacklist(*args): + global blacklist + if w.config_get_plugin('blacklist'): + blacklist = w.config_get_plugin('blacklist').split(',') + return w.WEECHAT_RC_OK + +# ================================[ main ]=============================== +if __name__ == "__main__": + if w.register(SCRIPT_NAME, SCRIPT_AUTHOR, SCRIPT_VERSION, SCRIPT_LICENSE, + SCRIPT_DESC, "", ""): +# str_commands = "" +# for cmd in (purgelogs_commands.keys()): +# str_commands += " " + cmd + ": " + purgelogs_commands[cmd] + "\n"; + w.hook_command("purgelogs", + "delete weechatlog-files by date or size", + "[age|age_ls] || [size|size_ls] || [delete]", + " size : greater than for log-files to purge\n" + " size_ls : less than for log-files to purge\n" + " age : older than for log-files to purge (maximum value: 9999)\n" + " age_ls : younger than for log-files to purge\n" + " delete : argument for security reasons\n" + "\n" +# str_commands + "\n" + "Examples:\n" + " show log-files older than 100 days\n" + " /" + SCRIPT_NAME + " age 100\n" + " purge log-files older than 100 days\n" + " /" + SCRIPT_NAME + " age 100 delete\n" + " show log-files younger than 10 days\n" + " /" + SCRIPT_NAME + " age_ls 10\n" + " purge log-files younger than 10 days\n" + " /" + SCRIPT_NAME + " age_ls 10 delete\n" + " show log-files greater than 100 KiB\n" + " /" + SCRIPT_NAME + " size 100\n" + " purge log-files greater than 100 KiB\n" + " /" + SCRIPT_NAME + " size 100 delete\n", + "age|age_ls|size|size_ls %-", + "purgelogs_cb", "") + w.hook_config('plugins.var.python.%s.blacklist' %SCRIPT_NAME, 'update_blacklist', '') + + for option, default_value in purgelogs_options.items(): +# for option, default_value in purgelogs_options.iteritems(): + if w.config_get_plugin(option) == "": + w.config_set_plugin(option, default_value) + else: + blacklist = w.config_get_plugin('blacklist').split(',')