summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTed Trask <ttrask01@yahoo.com>2008-12-02 21:46:41 +0000
committerTed Trask <ttrask01@yahoo.com>2008-12-02 21:46:41 +0000
commit26aa5c382a1b6d1a49a02b8ac098af93d86cd2f8 (patch)
tree372a1ebe364b20586c3c3174710db78b8f3be878
parent531d2d73fb4acfe9e4a4d4f49d615d16683acde9 (diff)
downloadacf-samba-26aa5c382a1b6d1a49a02b8ac098af93d86cd2f8.tar.bz2
acf-samba-26aa5c382a1b6d1a49a02b8ac098af93d86cd2f8.tar.xz
Modified samba to add listing, creating, editing, and deleting of shares.
git-svn-id: svn://svn.alpinelinux.org/acf/samba/trunk@1618 ab2d0c66-481e-0410-8bed-d214d4d58bed
-rw-r--r--samba-controller.lua16
l---------samba-createshare-html.lsp1
-rw-r--r--samba-editshare-html.lsp10
-rw-r--r--samba-listshares-html.lsp44
-rw-r--r--samba-model.lua196
-rw-r--r--samba.menu1
-rw-r--r--samba.roles6
7 files changed, 271 insertions, 3 deletions
diff --git a/samba-controller.lua b/samba-controller.lua
index 4083ce2..85d3cc7 100644
--- a/samba-controller.lua
+++ b/samba-controller.lua
@@ -20,3 +20,19 @@ end
function join(self)
return controllerfunctions.handle_form(self, self.model.get_join, self.model.set_join, self.clientdata, "Join", "Join Domain")
end
+
+function listshares(self)
+ return self.model.list_shares()
+end
+
+function editshare(self)
+ return controllerfunctions.handle_form(self, function() return self.model.read_share(self.clientdata.name) end, self.model.update_share, self.clientdata, "Save", "Edit Share", "Share Saved")
+end
+
+function deleteshare(self)
+ return self:redirect_to_referrer(self.model.delete_share(self.clientdata.name))
+end
+
+function createshare(self)
+ return controllerfunctions.handle_form(self, self.model.read_share, self.model.create_share, self.clientdata, "Create", "Create Share", "Share Created")
+end
diff --git a/samba-createshare-html.lsp b/samba-createshare-html.lsp
new file mode 120000
index 0000000..59159fa
--- /dev/null
+++ b/samba-createshare-html.lsp
@@ -0,0 +1 @@
+samba-editshare-html.lsp \ No newline at end of file
diff --git a/samba-editshare-html.lsp b/samba-editshare-html.lsp
new file mode 100644
index 0000000..aa67e11
--- /dev/null
+++ b/samba-editshare-html.lsp
@@ -0,0 +1,10 @@
+<% local form, viewlibrary, page_info = ...
+require("viewfunctions")
+%>
+
+<H1><%= form.label %></H1>
+<%
+ form.action = page_info.script .. page_info.prefix .. page_info.controller .. "/" .. page_info.action
+ local order = {"name", "valid", "comment", "path", "browseable", "guest", "printable", "writable"}
+ displayform(form, order, {"other"})
+%>
diff --git a/samba-listshares-html.lsp b/samba-listshares-html.lsp
new file mode 100644
index 0000000..67af4c8
--- /dev/null
+++ b/samba-listshares-html.lsp
@@ -0,0 +1,44 @@
+<% local view, viewlibrary, page_info, session = ...
+require("viewfunctions")
+%>
+
+<% displaycommandresults({"editshare", "deleteshare"}, session) %>
+<% displaycommandresults({"createshare"}, session, true) %>
+
+<H1>Shares</H1>
+<DL>
+<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">Name</TD>
+ <TD style="padding-right:20px;white-space:nowrap;text-align:left;" class="header">Path</TD>
+ <TD style="white-space:nowrap;text-align:left;" class="header">Comment</TD>
+ </TR>
+<% if #view.value == 0 then %>
+No Shares Found
+<% end %>
+<% for i,share in ipairs(view.value) do %>
+ <TR>
+ <TD style="padding-right:20px;white-space:nowrap;">
+ <% if session.permissions.samba.editshare then %>
+ <%= html.link{value=page_info.script..page_info.prefix..page_info.controller.."/editshare?name="..share.name.."&redir="..page_info.orig_action, label="Edit "} %>
+ <% end %>
+ <% if session.permissions.samba.deleteshare then %>
+ <%= html.link{value=page_info.script..page_info.prefix..page_info.controller.."/deleteshare?name="..share.name, label="Delete "} %>
+ <% end %>
+ </TD>
+ <TD style="padding-right:20px;white-space:nowrap;"><%= share.name %></TD>
+ <TD style="padding-right:20px;white-space:nowrap;"><%= share.path %></TD>
+ <TD style="white-space:nowrap;"><%= share.comment %></TD>
+ </TR>
+<% end %>
+</TABLE>
+</DL>
+
+<% if viewlibrary and viewlibrary.dispatch_component and session.permissions.samba.createshare then %>
+<H2>Create new share</H2>
+<form action="<%= page_info.script .. page_info.prefix .. page_info.controller %>/createshare" method="POST">
+<input class="hidden" type="hidden" name="redir" value="<%= page_info.orig_action %>" >
+<dl><dt></dt><dd><input class="submit" type="submit" value="Create Share"></dd></dl>
+</form>
+<% end %>
diff --git a/samba-model.lua b/samba-model.lua
index 628929d..49200d2 100644
--- a/samba-model.lua
+++ b/samba-model.lua
@@ -16,12 +16,89 @@ local initname = "samba"
local configcontent
local config
+local specialsection = {global=1, homes=2, printers=3}
local path="PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin "
-- ################################################################################
-- LOCAL FUNCTIONS
+local function config_to_bool(value)
+ if value and (string.lower(value) == "yes" or string.lower(value) == "true" or value == "1") then
+ return true
+ else
+ return false
+ end
+end
+
+local function validate_share(share)
+ local success = true
+
+ if share.value.name.value == "" then
+ share.value.name.errtxt = "Cannot be blank"
+ success = false
+ end
+ --share.value.browseable.value
+ --share.value.comment.value
+ success = modelfunctions.validateselect(share.value.guest) and success
+ --share.value.invalid_users.value
+ --share.value.path.value
+ --share.value.printable.value
+ --share.value.read_list.value
+ --share.value.writeable.value
+ --share.value.username.value
+ --share.value.valid_users.value
+ --share.value.valid.value
+ --share.value.write_list.value
+ --share.value.other.value
+
+ return success, share
+end
+
+local function write_share(share)
+ local lines = {}
+ if not share.value.browseable.value then
+ lines[#lines+1] = "browseable = no"
+ end
+ if share.value.comment.value ~= "" then
+ lines[#lines+1] = "comment = "..share.value.comment.value
+ end
+ if share.value.guest.value == "OK" then
+ lines[#lines+1] = "guest ok = yes"
+ elseif share.value.guest.value == "Only" then
+ lines[#lines+1] = "guest ok = yes"
+ lines[#lines+1] = "guest only = yes"
+ end
+ --share.value.invalid_users.value
+ if share.value.path.value ~= "" then
+ lines[#lines+1] = "path = "..share.value.path.value
+ end
+ if share.value.printable.value then
+ lines[#lines+1] = "printable = yes"
+ end
+ --share.value.read_list.value
+ if share.value.writeable.value then
+ lines[#lines+1] = "writeable = yes"
+ else
+ lines[#lines+1] = "read only = yes"
+ end
+ --share.value.username.value
+ --share.value.valid_users.value
+ if not share.value.valid.value then
+ lines[#lines+1] = "-valid = no"
+ end
+ --share.value.write_list.value
+ if share.value.other.value ~= "" then
+ lines[#lines+1] = share.value.other.value
+ end
+
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ configcontent = format.set_ini_section(configcontent, share.value.name.value, table.concat(lines, "\n"))
+ fs.write_file(configfile, configcontent)
+ configcontent = nil
+ config = nil
+end
+
-- ################################################################################
-- PUBLIC FUNCTIONS
@@ -93,3 +170,122 @@ function set_join(connect)
return connect
end
+
+function list_shares()
+ local shares = {}
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ config = config or format.parse_ini_file(configcontent)
+
+ for name,section in pairs(config or {}) do
+ if not specialsection[name] then
+ local temp = {name =name}
+ temp.path = section.path or section.directory or ""
+ temp.comment = section.comment or ""
+ shares[#shares+1] = temp
+ end
+ end
+
+ return cfe({ type="structure", value=shares, label="Shares" })
+end
+
+function read_share(name)
+ local share = {}
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ config = config or format.parse_ini_file(configcontent)
+ name = name or ""
+ local sharecfg = config[name] or {}
+
+ share.name = cfe({ value=name, label="Share Name" })
+ share.browseable = cfe({ type="boolean", value=true, label="Browseable", descr="Controls whether this share is seen in the list of available shares" })
+ if sharecfg.browseable then share.browseable.value = config_to_bool(sharecfg.browseable)
+ elseif sharecfg.browsable then share.browseable.value = config_to_bool(sharecfg.browsable) end
+ share.comment = cfe({ value=sharecfg.comment or "", label="Comment" })
+ share.guest = cfe({ type="select", value="No", label="Guest Access", option={"No", "OK", "Only"} })
+ if config_to_bool(sharecfg.public) or config_to_bool(sharecfg["guest ok"]) then
+ if config_to_bool(sharecfg["only guest"]) or config_to_bool(sharecfg["guest only"]) then
+ share.guest.value = "Only"
+ else
+ share.guest.value = "OK"
+ end
+ end
+ --share.invalid_users =
+ share.path = cfe({ value=sharecfg.path or sharecfg.directory or "", label="Path" })
+ share.printable = cfe({ type="boolean", value=config_to_bool(sharecfg.printable) or config_to_bool(sharecfg["print ok"]) or false, label="Printable" })
+ --share.read_list =
+ share.writeable = cfe({ type="boolean", value=config_to_bool(sharecfg.writeable) or config_to_bool(sharecfg.writable) or (sharecfg["read only"] and not config_to_bool(sharecfg["read only"])) or false, label="Writable" })
+ --share.username = (same as user and users)
+ --share.valid_users =
+ share.valid = cfe({ type="boolean", value=not sharecfg["-valid"] or config_to_bool(sharecfg["-valid"]), label="Enabled" })
+ --share.write_list =
+ share.other = cfe({ type="longtext", value={}, label="Other parameters" })
+ local reverseparams = {browseable=1, browsable=2, comment=3, public=4, ["guest ok"]=5, ["only guest"]=6, ["guest only"]=7, path=8, directory=9, printable=10, ["print ok"]=11, writeable=12, writable=13, ["read only"]=14, ["-valid"]=15 }
+ for name,value in pairs(sharecfg) do
+ if not reverseparams[name] then
+ table.insert(share.other.value, name.." = "..value)
+ end
+ end
+ share.other.value = table.concat(share.other.value, "\n") or ""
+
+ return cfe({ type="group", value=share, label="Samba Share" })
+end
+
+function update_share(share)
+ local success, share = validate_share(share)
+
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ config = config or format.parse_ini_file(configcontent)
+ if not config[share.value.name.value] then
+ share.value.name.errtxt = "Share not found"
+ success = false
+ end
+
+ if success then
+ write_share(share)
+ else
+ share.errtxt = "Failed to update share"
+ end
+
+ return share
+end
+
+function create_share(share)
+ local success, share = validate_share(share)
+
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ config = config or format.parse_ini_file(configcontent)
+ if config[share.value.name.value] then
+ share.value.name.errtxt = "Share already exists"
+ success = false
+ end
+
+ if success then
+ write_share(share)
+ else
+ share.errtxt = "Failed to update share"
+ end
+
+ return share
+end
+
+function delete_share(name)
+ local retval = cfe({ label="Delete Share result" })
+
+ if specialsection[name] then
+ retval.errtxt = "Share not found"
+ else
+ configcontent = configcontent or fs.read_file(configfile) or ""
+ config = config or format.parse_ini_file(configcontent)
+ if config[name] then
+ configcontent = format.set_ini_section(configcontent, name, "")
+ configcontent = string.gsub(configcontent, "\n%s*%[%s*"..format.escapemagiccharacters(name).."%s*%][^\n]*", "")
+ fs.write_file(configfile, configcontent)
+ configcontent = nil
+ config = nil
+ retval.value = "Share Deleted"
+ else
+ retval.errtxt = "Share not found"
+ end
+ end
+
+ return retval
+end
diff --git a/samba.menu b/samba.menu
index 964d038..87a7e9a 100644
--- a/samba.menu
+++ b/samba.menu
@@ -1,4 +1,5 @@
#CAT GROUP/DESC TAB ACTION
Networking 35Samba Status status
+Networking 35Samba Shares listshares
Networking 35Samba Join_Domain join
Networking 35Samba Expert expert
diff --git a/samba.roles b/samba.roles
index 51f6f4d..9bcf187 100644
--- a/samba.roles
+++ b/samba.roles
@@ -1,4 +1,4 @@
-USER=samba:status,samba:startstop
-EDITOR=samba:join
+USER=samba:status,samba:startstop,samba:listshares
+EDITOR=samba:join,samba:editshare,samba:deleteshare,samba:createshare
EXPERT=samba:expert
-ADMIN=samba:status,samba:startstop,samba:join,samba:expert
+ADMIN=samba:status,samba:startstop,samba:listshares,samba:join,samba:editshare,samba:deleteshare,samba:createshare,samba:expert