From 7ba853589ddcaaf1e768784af3bfeebd6dd5abfe Mon Sep 17 00:00:00 2001 From: ttrask Date: Wed, 18 Mar 2009 15:51:29 +0000 Subject: Modified postfix to edit/create/delete files in /etc/postfix, and added button to rebuild databases. git-svn-id: svn://svn.alpinelinux.org/acf/postfix/trunk@1731 ab2d0c66-481e-0410-8bed-d214d4d58bed --- postfix-controller.lua | 12 +++++++ postfix-createfile-html.lsp | 1 + postfix-listfiles-html.lsp | 24 +++++++++++-- postfix-model.lua | 83 ++++++++++++++++++++++++++++++++++++++++++--- postfix.roles | 4 +-- 5 files changed, 116 insertions(+), 8 deletions(-) create mode 120000 postfix-createfile-html.lsp 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("") --]] %> -<% 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 %> + @@ -27,12 +29,30 @@ end %> <% for i,file in ipairs(data.value) do %> - + + <% end %>
Action File Size Last Modified
<%= html.link{value = "expert?filename=" .. file.filename.."&redir="..page_info.orig_action, label=file.filename} %> + <%= 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 %> + <%= html.html_escape(file.filename) %> <%= html.html_escape(file.filesize) %> <%= html.html_escape(file.mtime) %>
+
+
"> +
Rebuild Databases
+
+
+
+ +<% if viewlibrary and viewlibrary.dispatch_component and session.permissions[page_info.controller].createfile then + local newfileform = viewlibrary.dispatch_component("createfile", nil, true) %> +

Create new file

+<% + 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 -- cgit v1.2.3