mod_migrate_http_upload/mod_migrate_http_upload.lua
author Matthew Wild <mwild1@gmail.com>
Tue, 18 Jan 2022 17:01:18 +0000
changeset 4880 0f5f2d4475b9
parent 4476 f210f242cf17
permissions -rw-r--r--
mod_http_xep227: Add support for import via APIs rather than direct store manipulation In particular this transitions PEP nodes and data to be imported via mod_pep's APIs, fixing issues with importing at runtime while PEP data may already be live in RAM. Next obvious candidate for this approach is rosters, so clients get immediate roster pushes and other special handling (such as emitting subscribes to reach the desired subscription state).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4472
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     1
-- Copyright (C) 2021 Kim Alvefur
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     2
--
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     3
-- This file is MIT licensed.
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     4
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     5
local lfs = require "lfs";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     6
local st = require "util.stanza";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     7
local jid = require "util.jid";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     8
local paths = require "util.paths";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
     9
local unpack = table.unpack or _G.unpack;
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    10
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    11
function module.command(arg)
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    12
	local sm = require "core.storagemanager";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    13
	local dm = sm.olddm;
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    14
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    15
	local component, user_host = unpack(arg);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    16
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    17
	sm.initialize_host(component);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    18
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    19
	local new_uploads = sm.open(component, "uploads", "archive");
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    20
4474
203f0f06d766 mod_migrate_http_upload: Respect the 'http_upload_path' setting
Kim Alvefur <zash@zash.se>
parents: 4472
diff changeset
    21
	local legacy_storage_path = module:context(component):get_option_string("http_upload_path", paths.join(prosody.paths.data, "http_upload"));
203f0f06d766 mod_migrate_http_upload: Respect the 'http_upload_path' setting
Kim Alvefur <zash@zash.se>
parents: 4472
diff changeset
    22
4472
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    23
	local legacy_uploads = {};
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    24
	for user in assert(dm.users(user_host, "http_upload", "list")) do
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    25
		legacy_uploads[user] = dm.list_load(user, user_host, "http_upload");
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    26
	end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    27
	while true do
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    28
		local oldest_uploads, uploader;
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    29
		for user, uploads in pairs(legacy_uploads) do
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    30
			if uploads[1] and (not oldest_uploads or uploads[1].time < oldest_uploads[1].time) then
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    31
				oldest_uploads, uploader = uploads, jid.join(user, user_host);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    32
			end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    33
		end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    34
		if not oldest_uploads then break end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    35
		local item = table.remove(oldest_uploads, 1);
4474
203f0f06d766 mod_migrate_http_upload: Respect the 'http_upload_path' setting
Kim Alvefur <zash@zash.se>
parents: 4472
diff changeset
    36
		local source_directory = paths.join(legacy_storage_path, item.dir);
4475
af7a9856950d mod_migrate_http_upload: Don't include per-upload directory twice
Kim Alvefur <zash@zash.se>
parents: 4474
diff changeset
    37
		local source_filename = paths.join(source_directory, item.filename);
4472
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    38
		local target_filename = dm.getpath(item.dir, component, "http_file_share", "bin", true);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    39
		if not lfs.attributes(source_filename, "mode") then
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    40
			print("Not migrating missing file " .. source_filename);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    41
		else
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    42
			print("Moving " .. source_filename .. " to " .. target_filename .. " for " .. uploader);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    43
			local upload = st.stanza("request", {
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    44
				xmlns = "urn:xmpp:http:upload:0";
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    45
				filename = item.filename;
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    46
				size = string.format("%d", item.size);
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    47
				-- content-type not included with mod_http_upload
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    48
			});
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    49
			assert(new_uploads:append(nil, item.dir, upload, item.time, uploader));
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    50
			assert(os.rename(source_filename, target_filename));
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    51
		end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    52
		os.remove(source_directory); -- failure not fatal
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    53
	end
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    54
	for user, uploads in pairs(legacy_uploads) do
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    55
		assert(dm.list_store(user, user_host, "http_upload", uploads));
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    56
	end
4476
f210f242cf17 mod_migrate_http_upload: Remove storage path when done
Kim Alvefur <zash@zash.se>
parents: 4475
diff changeset
    57
	os.remove(legacy_storage_path);
4472
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    58
	return 0;
5d8f9cc5c6fb mod_migrate_http_upload: Upload data converter to mod_http_file_share
Kim Alvefur <zash@zash.se>
parents:
diff changeset
    59
end