diff options
author | ttrask <ttrask@ab2d0c66-481e-0410-8bed-d214d4d58bed> | 2009-03-18 15:51:29 +0000 |
---|---|---|
committer | ttrask <ttrask@ab2d0c66-481e-0410-8bed-d214d4d58bed> | 2009-03-18 15:51:29 +0000 |
commit | 7ba853589ddcaaf1e768784af3bfeebd6dd5abfe (patch) | |
tree | 240850f6b14ac5ad70b4082c000f06fe1aacad25 | |
parent | f664556711a283133063ba51a031905d02cbb052 (diff) | |
download | acf-postfix-7ba853589ddcaaf1e768784af3bfeebd6dd5abfe.tar.bz2 acf-postfix-7ba853589ddcaaf1e768784af3bfeebd6dd5abfe.tar.xz |
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
-rw-r--r-- | postfix-controller.lua | 12 | ||||
l--------- | postfix-createfile-html.lsp | 1 | ||||
-rw-r--r-- | postfix-listfiles-html.lsp | 24 | ||||
-rw-r--r-- | postfix-model.lua | 83 | ||||
-rw-r--r-- | postfix.roles | 4 |
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 |