summaryrefslogtreecommitdiffstats
path: root/etc/hypermail/mdir2mbox.lua
blob: 99b6f590bed5c202987a01c6b3d3943f9cdd349b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/lua
-- This script takes a mlmmj archive "maildir format" directory and
-- writes out an mbox formatted file to stdout
-- Copyright (c) 2009,2010  N. Angelacos under the  GPL 2 License

posix = require "posix"

-- command line parser, or exit
check_command_line = function ()
        local source_dir = arg[1]
        local source_time = arg[2]

        if (source_dir == nil ) then
                io.stderr:write("mdir2mbox  source_dir [hours]\n" ..
                        "Writes an mbox formatted file to stdout from the files in source_dir\n" ..
                        "If [hours] is given, then only files newer then [hours] are processed\n")
                os.exit(-1)
        end

        if (posix.stat(source_dir, "type") ~= "directory") then
                io.stderr:write(source_dir .. " is not a directory\n")
                os.exit(-1)
        end

        return source_dir, source_time
end

-- Get candidates
get_candidates = function (source, hours)
        local all = posix.dir(source)
        local candidates = {}
        local timestamp = 0

        if (hours) then
                timestamp = os.time() - hours * 3600
        end

        for k,v in ipairs(all) do
                local st = posix.stat(source .. "/" .. v)
                if (st) and (st.type == "regular") and (st.mtime > timestamp) then
                        table.insert(candidates,source .. "/" .. v)
                end
        end

        return candidates
end

file_to_mbox = function (path)
        local fh = io.open(path)
        if (fh == nil) then
                return
        end
        local headers = ""
        local l = ""
        -- get headers
        repeat
                headers = headers .. l
                l = (fh:read("*l") or "" ) .. "\n"
        until (#l == 1)

        local from = string.match("\n" .. headers, "\nFrom: ([^\n]*)")
        if from == nil then
                from = string.match("\n" .. headers, "\nReply-To: ([^\n]*)")
        end
        if from == nil then
                from = "<nobody@nowhere.com>"
        end
        from = string.match(from, "<([^>]*)>") or string.match(from, "([^ ]*)")


        local date = string.match("\n" .. headers, "\nDate: ([^\n]*)")
        if date == nil then
                date = os.date ("%a, %d %b %Y %X +%z", posix.stat(path, "mtime"))
        end

        local weekday,day,month,year,time,offset = string.match((date or ""), "([^,]*), +(%d+)[%s-](%a+)[%s-](%d+) ([%d:]*) ([-+%w]*)")

        print ("From " .. from .. " " .. string.format("%s %s %s %s %s", weekday, month, day, time, year, offset ))
        print (headers)

        -- get rest of message
        repeat
                local foo  = fh:read("*l")
                if foo then
                        print(foo)
                end
        until (foo == nil)

fh:close()
end

candidates =  get_candidates(check_command_line ())

for k,v in ipairs(candidates) do
        file_to_mbox(v)
end
print ("")