Mercurial > prosody-hg
annotate plugins/mod_cron.lua @ 13946:f5e8ab42c708
mod_http_file_share: Check that files are still there with correct size
Failed uploads can leave behind unused slots. Files shouldn't change
size after they have been successfully uploaded, but might as well
double check it.
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Sat, 04 Dec 2021 18:56:51 +0100 |
| parents | 8b05340a94d3 |
| children |
| rev | line source |
|---|---|
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
1 -- This file is generated from teal-src/prosody/plugins/mod_cron.tl |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
2 module:set_global(); |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
3 |
|
12977
74b9e05af71e
plugins: Prefix module imports with prosody namespace
Kim Alvefur <zash@zash.se>
parents:
12489
diff
changeset
|
4 local async = require("prosody.util.async"); |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
5 |
|
13421
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
6 local cron_initial_delay = module:get_option_number("cron_initial_delay", 1); |
|
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
7 local cron_check_delay = module:get_option_number("cron_check_delay", 3600); |
|
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
8 local cron_spread_factor = module:get_option_number("cron_spread_factor", 0); |
|
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
9 |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
10 local active_hosts = {} |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
11 |
|
13588
899453f11f50
mod_cron: Don't run tasks if loaded inside prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
13443
diff
changeset
|
12 if prosody.process_type == "prosodyctl" then |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
13 return |
|
13588
899453f11f50
mod_cron: Don't run tasks if loaded inside prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
13443
diff
changeset
|
14 end |
|
899453f11f50
mod_cron: Don't run tasks if loaded inside prosodyctl
Matthew Wild <mwild1@gmail.com>
parents:
13443
diff
changeset
|
15 |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
16 function module.add_host(host_module) |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
18 local last_run_times = host_module:open_store("cron", "map"); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
19 active_hosts[host_module.host] = true; |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
20 |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
21 local function save_task(task, started_at) |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
22 last_run_times:set(nil, task.id, started_at); |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
23 end |
|
13265
6ac5ad578565
mod_cron: Load last task run time inside task runner to fix async
Kim Alvefur <zash@zash.se>
parents:
13264
diff
changeset
|
24 |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
25 local function restore_task(task) |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
26 if task.last == nil then |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
27 task.last = last_run_times:get(nil, task.id); |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
28 end |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
29 end |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
30 |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
31 local function task_added(event) |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
32 local task = event.item; |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
33 if task.name == nil then |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
34 task.name = task.when; |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
35 end |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
36 if task.id == nil then |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
37 task.id = event.source.name .. "/" .. task.name:gsub("%W", "_"):lower(); |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
38 end |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
39 task.period = host_module:get_option_period(task.id:gsub("/", "_") .. "_period", "1" .. task.when, 60, 86400 * 7 * 53); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
40 task.restore = restore_task; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
41 task.save = save_task; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
42 module:log("debug", "%s task %s added", task.when, task.id); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
43 return true |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
44 end |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
45 |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
46 local function task_removed(event) |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
47 local task = event.item; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
48 host_module:log("debug", "Task %s removed", task.id); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
49 return true |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
50 end |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
51 |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
52 host_module:handle_items("task", task_added, task_removed, true); |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
54 function host_module.unload() |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
55 active_hosts[host_module.host] = nil; |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
56 end |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 end |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
58 |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
59 local function should_run(task, last) |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
60 return not last or last + task.period * 0.995 <= os.time() |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
61 end |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
62 |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
63 local function run_task(task) |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
64 task:restore(); |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
65 if not should_run(task, task.last) then |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
66 return |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
67 end |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
68 local started_at = os.time(); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
69 task:run(started_at); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
70 task.last = started_at; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
71 task:save(started_at); |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
72 end |
|
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
73 |
|
13421
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
74 local function spread(t, factor) |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
75 return t * (1 - factor + 2 * factor * math.random()) |
|
13421
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
76 end |
|
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
77 |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
78 local task_runner = async.runner(run_task); |
|
13421
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
79 scheduled = module:add_timer(cron_initial_delay, function() |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
80 module:log("info", "Running periodic tasks"); |
|
13421
92301fa7a673
mod_cron: Allow configuring various "internal" delay parameters
Matthew Wild <mwild1@gmail.com>
parents:
13371
diff
changeset
|
81 local delay = spread(cron_check_delay, cron_spread_factor); |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
82 for host in pairs(active_hosts) do |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
83 module:log("debug", "Running periodic tasks for host %s", host); |
|
13884
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
84 for _, task in ipairs(module:context(host):get_host_items("task")) do |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
85 task_runner:run(task); |
|
8b05340a94d3
mod_cron: Move changes to Teal source
Kim Alvefur <zash@zash.se>
parents:
13701
diff
changeset
|
86 end |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
87 end |
|
13443
98a6ec4ce140
mod_cron: Fix log format to account for float that was integer before
Kim Alvefur <zash@zash.se>
parents:
13421
diff
changeset
|
88 module:log("debug", "Wait %gs", delay); |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
89 return delay |
|
11986
3d5135e8a2a7
mod_cron: Initial commit of periodic task runner
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
90 end); |
|
13364
6f9b15757384
mod_cron: Add shell command to list registered cron tasks with status
Matthew Wild <mwild1@gmail.com>
parents:
13284
diff
changeset
|
91 |
|
6f9b15757384
mod_cron: Add shell command to list registered cron tasks with status
Matthew Wild <mwild1@gmail.com>
parents:
13284
diff
changeset
|
92 module:add_item("shell-command", { |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
93 section = "cron"; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
94 section_desc = "View and manage recurring tasks"; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
95 name = "tasks"; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
96 desc = "View registered tasks"; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
97 args = {}; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
98 handler = function(self, filter_host) |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
99 local format_table = require("prosody.util.human.io").table; |
|
13701
1aa7efabeacb
mod_cloud_notify, mod_cron, mod_invites: Add 'prosody.' prefix to requires
Matthew Wild <mwild1@gmail.com>
parents:
13588
diff
changeset
|
100 local it = require("prosody.util.iterators"); |
|
13371
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
101 local row = format_table({ |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
102 { title = "Host"; width = "2p" }; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
103 { title = "Task"; width = "3p" }; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
104 { title = "Desc"; width = "3p" }; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
105 { title = "When"; width = "1p" }; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
106 { title = "Last run"; width = "20" }; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
107 }, self.session.width); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
108 local print = self.session.print; |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
109 print(row()); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
110 for host in it.sorted_pairs(filter_host and { [filter_host] = true } or active_hosts) do |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
111 for _, task in ipairs(module:context(host):get_host_items("task")) do |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
112 print(row({ host; task.id; task.name; task.when; task.last and os.date("%Y-%m-%d %R:%S", task.last) or "never" })); |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
113 end |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
114 end |
|
a22e3a980178
mod_cron: Rebuild with new LuaFormatter settings (tabs!)
Kim Alvefur <zash@zash.se>
parents:
13366
diff
changeset
|
115 end; |
|
13364
6f9b15757384
mod_cron: Add shell command to list registered cron tasks with status
Matthew Wild <mwild1@gmail.com>
parents:
13284
diff
changeset
|
116 }); |
