summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--postfix-controller.lua12
l---------postfix-createfile-html.lsp1
-rw-r--r--postfix-listfiles-html.lsp24
-rw-r--r--postfix-model.lua83
-rw-r--r--postfix.roles4
5 files changed, 116 insertions, 8 deletions
diff --git a/postfix-controller.lua b/postfix-controller.lua
index 682192d..0967ddd 100644
--- a/postfix-controller.lua
+++ b/postfix-controller.lua
@@ -21,6 +21,18 @@ function listfiles(self)
return self.model.getfilelist()
end
+function createfile(self)
+ return controllerfunctions.handle_form(self, self.model.getnewfile, self.model.createfile, self.clientdata, "Create", "Create new file", "New file created")
+end
+
+function deletefile(self)
+ return self:redirect_to_referrer(self.model.deletefile(self.clientdata.filename))
+end
+
function expert(self)
return controllerfunctions.handle_form(self, function() return self.model.getfiledetails(self.clientdata.filename) end, self.model.updatefiledetails, self.clientdata, "Save", "Edit Postfix File", "File Saved")
end
+
+function rebuilddatabases(self)
+ return self:redirect_to_referrer(self.model.rebuild_databases())
+end
diff --git a/postfix-createfile-html.lsp b/postfix-createfile-html.lsp
new file mode 120000
index 0000000..4b6b762
--- /dev/null
+++ b/postfix-createfile-html.lsp
@@ -0,0 +1 @@
+../form-html.lsp \ No newline at end of file
diff --git a/postfix-listfiles-html.lsp b/postfix-listfiles-html.lsp
index f94653b..dfca40c 100644
--- a/postfix-listfiles-html.lsp
+++ b/postfix-listfiles-html.lsp
@@ -9,7 +9,8 @@ io.write("</span>")
--]]
%>
-<% displaycommandresults({"expert", "startstop"}, session) %>
+<% displaycommandresults({"deletefile", "expert", "startstop", "rebuilddatabases"}, session) %>
+<% displaycommandresults({"createfile"}, session, true) %>
<% if viewlibrary and viewlibrary.dispatch_component then
viewlibrary.dispatch_component("status")
@@ -19,6 +20,7 @@ end %>
<TABLE>
<TR style="background:#eee;font-weight:bold;">
+ <TD style="padding-right:20px;white-space:nowrap;text-align:left;" class="header">Action</TD>
<TD style="padding-right:20px;white-space:nowrap;text-align:left;" class="header">File</TD>
<TD style="padding-right:20px;white-space:nowrap;text-align:left;" class="header">Size</TD>
<TD style="white-space:nowrap;text-align:left;" class="header">Last Modified</TD>
@@ -27,12 +29,30 @@ end %>
<% for i,file in ipairs(data.value) do %>
<TR>
- <TD style="padding-right:20px;white-space:nowrap;"><%= html.link{value = "expert?filename=" .. file.filename.."&redir="..page_info.orig_action, label=file.filename} %></TD>
+ <TD style="padding-right:20px;white-space:nowrap;">
+ <%= html.link{value = "expert?filename=" .. file.filename.."&redir="..page_info.orig_action, label="Edit "} %>
+ <% if file.filename ~= "/etc/mail/aliases" then %><%= html.link{value = "deletefile?filename=" .. file.filename, label="Delete "} %><% end %>
+ </TD>
+ <TD style="padding-right:20px;white-space:nowrap;"><%= html.html_escape(file.filename) %></TD>
<TD style="padding-right:20px;white-space:nowrap;"><%= html.html_escape(file.filesize) %></TD>
<TD style="white-space:nowrap;" width="90%"><%= html.html_escape(file.mtime) %></TD>
</TR>
<% end %>
</TABLE>
+<DL>
+<form action="<%= html.html_escape(page_info.script .. page_info.prefix .. page_info.controller .. "/rebuilddatabases") %>">
+<DT>Rebuild Databases</DT>
+<DD><input class="submit" type="submit" value="Rebuild"></DD>
+</form>
+</DL>
+
+<% if viewlibrary and viewlibrary.dispatch_component and session.permissions[page_info.controller].createfile then
+ local newfileform = viewlibrary.dispatch_component("createfile", nil, true) %>
+<h2>Create new file</h2>
+<%
+ newfileform.action = page_info.script .. page_info.prefix .. page_info.controller .. "/createfile"
+ displayform(newfileform)
+end %>
<% if viewlibrary and viewlibrary.dispatch_component then
viewlibrary.dispatch_component("startstop")
diff --git a/postfix-model.lua b/postfix-model.lua
index 8676ecd..33d4520 100644
--- a/postfix-model.lua
+++ b/postfix-model.lua
@@ -2,14 +2,16 @@ module(..., package.seeall)
-- Load libraries
require("modelfunctions")
+require("posix")
require("fs")
require("format")
+require("validator")
-- Set variables
local processname = "postfix"
local packagename = "postfix"
local baseurl = "/etc/postfix/"
-local filelist = {baseurl.."main.cf", baseurl.."master.cf", baseurl.."saslpass"}
+local aliasesfile = "/etc/mail/aliases"
local path = "PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin "
@@ -54,10 +56,16 @@ function getstatusdetails()
return cfe({ type="longtext", value="", label="Postfix Status Details" })
end
+local function geteditablefilelist()
+ local listed_files = fs.find_files_as_array("[^%.].*", baseurl)
+ table.insert(listed_files, aliasesfile)
+ return listed_files
+end
+
function getfilelist()
local listed_files = {}
- for i,name in ipairs(filelist) do
+ for i,name in ipairs(geteditablefilelist()) do
local filedetails = fs.stat(name) or {}
table.insert ( listed_files , {filename=name, mtime=filedetails.mtime or "---", filesize=filedetails.size or "0"} )
end
@@ -68,9 +76,76 @@ function getfilelist()
end
function getfiledetails(filename)
- return modelfunctions.getfiledetails(filename, filelist)
+ return modelfunctions.getfiledetails(filename, geteditablefilelist())
end
function updatefiledetails(filedetails)
- return modelfunctions.setfiledetails(filedetails, filelist)
+ return modelfunctions.setfiledetails(filedetails, geteditablefilelist())
+end
+
+function getnewfile()
+ local options = {}
+ options.filename = cfe({ label="File Name" })
+ return cfe({ type="group", value=options, label="New File" })
+end
+
+function createfile(newfile)
+ newfile.errtxt = "Failed to create file"
+ local path = newfile.value.filename.value
+ if not string.find(path, "/") then
+ path = baseurl..path
+ end
+ if validator.is_valid_filename(path, baseurl) then
+ if posix.stat(path) then
+ newfile.value.filename.errtxt = "File already exists"
+ else
+ fs.create_file(path)
+ newfile.errtxt = nil
+ end
+ else
+ newfile.value.filename.errtxt = "Invalid filename"
+ end
+
+ return newfile
+end
+
+function deletefile(filename)
+ local result = cfe({ value="Failed to delete file", label="Delete file result" })
+ if not validator.is_valid_filename(filename, baseurl) then
+ result.errtxt = "Not a valid filename!"
+ elseif not fs.is_file(filename) then
+ result.errtxt = "File doesn't exist!"
+ else
+ os.remove(filename)
+ result.value = "File Deleted"
+ end
+ return result
+end
+
+function rebuild_databases()
+ local result = cfe({ value={"Rebuilding databases"}, label="Rebuild Databases result" })
+ table.insert(result.value, " See logfile for possible errors")
+ local cmd,f,cmdresult
+ -- parse main.cf looking for hash files
+ local config = format.parse_ini_file(fs.read_file("/etc/postfix/main.cf") or "", "") or {}
+ for name,val in pairs(config) do
+ -- run postmap on files
+ local filename = string.match(val, "hash:(.*)")
+ if filename and not string.find(filename, aliasesfile) then
+ cmd = "postmap "..filename
+ table.insert(result.value, "Running: "..cmd)
+ f = io.popen(format.escapespecialcharacters(path..cmd))
+ table.insert(result.value, f:read("*a"))
+ f:close()
+ end
+ end
+ -- finally, run newaliases
+ cmd = "newaliases"
+ table.insert(result.value, "Running: "..cmd)
+ f = io.popen(format.escapespecialcharacters(path..cmd))
+ table.insert(result.value, f:read("*a"))
+ f:close()
+
+ result.value = table.concat(result.value, "\n")
+ return result
end
diff --git a/postfix.roles b/postfix.roles
index 21281a4..ff338dc 100644
--- a/postfix.roles
+++ b/postfix.roles
@@ -1,3 +1,3 @@
USER=postfix:status,postfix:logfile,postfix:details,postfix:startstop
-EXPERT=postfix:listfiles,postfix:expert
-ADMIN=postfix:status,postfix:logfile,postfix:details,postfix:startstop,postfix:listfiles,postfix:expert
+EXPERT=postfix:listfiles,postfix:createfile,postfix:deletefile,postfix:rebuilddatabases,postfix:expert
+ADMIN=postfix:status,postfix:logfile,postfix:details,postfix:startstop,postfix:listfiles,postfix:createfile,postfix:deletefile,postfix:rebuilddatabases,postfix:expert