]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Fuzzystat: Allow to sort keys
authorVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 5 Jan 2023 16:18:08 +0000 (16:18 +0000)
committerVsevolod Stakhov <vsevolod@rspamd.com>
Thu, 5 Jan 2023 16:18:08 +0000 (16:18 +0000)
lualib/rspamadm/fuzzy_stat.lua

index a8345751071f0dc61a314c251c1d28b529acd9b9..76a75956d77950869273f2d1f1cf0be1e63b9655 100644 (file)
@@ -4,7 +4,7 @@ local opts = {}
 
 local argparse = require "argparse"
 local parser = argparse()
-    :name "rspamadm confighelp"
+    :name "rspamadm control fuzzystat"
     :description "Shows help for the specified configuration options"
     :help_description_margin(32)
 parser:flag "--no-ips"
@@ -15,12 +15,13 @@ parser:flag "--short"
       :description "Short output mode"
 parser:flag "-n --number"
       :description "Disable numbers humanization"
-parser:option "-s --sort"
+parser:option "--sort"
       :description "Sort order"
       :convert {
+        checked = "checked",
         matched = "matched",
         errors = "errors",
-        ip = "ip"
+        name = "name"
       }
 
 local function add_data(target, src)
@@ -75,31 +76,31 @@ local function print_stat(st, tabs)
 end
 
 -- Sort by checked
-local function sort_ips(tbl, sort_opts)
+local function sort_hash_table(tbl, sort_opts, key_key)
   local res = {}
   for k,v in pairs(tbl) do
-    table.insert(res, {ip = k, data = v})
+    table.insert(res, {[key_key] = k, data = v})
   end
 
   local function sort_order(elt)
     local key = 'checked'
-    local _res = 0
+    local sort_res = 0
 
     if sort_opts['sort'] then
       if sort_opts['sort'] == 'matched' then
         key = 'matched'
       elseif sort_opts['sort'] == 'errors' then
         key = 'errors'
-      elseif sort_opts['sort'] == 'ip' then
-        return elt['ip']
+      elseif sort_opts['sort'] == 'name' then
+        return elt[key_key]
       end
     end
 
-    if elt['data'][key] then
-      _res = elt['data'][key]
+    if elt.data[key] then
+      sort_res = elt.data[key]
     end
 
-    return _res
+    return sort_res
   end
 
   table.sort(res, function(a, b)
@@ -255,11 +256,15 @@ return function(args, res)
     local res_keys = st['keys']
     if res_keys and not opts['no-keys'] and not opts['short'] then
       print('Keys statistics:')
-      for k, key_stat in pairs(res_keys) do
+      -- Convert into an array to allow sorting
+      local sorted_keys = sort_hash_table(res_keys, opts, 'key')
+
+      for _, key in ipairs(sorted_keys) do
+        local key_stat = key.data
         if key_stat.name then
-          print(string.format('Key id: %s, name: %s', k, key_stat.name))
+          print(string.format('Key id: %s, name: %s', key.key, key_stat.name))
         else
-          print(string.format('Key id: %s', k))
+          print(string.format('Key id: %s', key.key))
         end
 
         print_stat(key_stat, '\t')
@@ -267,7 +272,7 @@ return function(args, res)
         if key_stat['ips'] and not opts['no-ips'] then
           print('')
           print('\tIPs stat:')
-          local sorted_ips = sort_ips(key_stat['ips'], opts)
+          local sorted_ips = sort_hash_table(key_stat['ips'], opts, 'ip')
 
           for _,v in ipairs(sorted_ips) do
             print(string.format('\t%s', v['ip']))
@@ -299,7 +304,7 @@ return function(args, res)
     print('')
     print('IPs statistics:')
 
-    local sorted_ips = sort_ips(res_ips, opts)
+    local sorted_ips = sort_hash_table(res_ips, opts)
     for _, v in ipairs(sorted_ips) do
       print(string.format('%s', v['ip']))
       print_stat(v['data'], '\t')