source: trunk/luci/libs/fon/luasrc/fon/pkg.lua

Last change on this file was 175, checked in by cyrus, 8 years ago

Fixed symlink handling for plugin installer

File size: 5.6 KB
Line 
1module("luci.fon.pkg", package.seeall)
2
3local util = require("luci.util")
4
5Plugin = util.class()
6
7-- adds a mime type to the
8function add_mime(ext, mime)
9        local uci = require("luci.model.uci").cursor()
10        if ext and mime then
11                uci:set("fon_browser", "mime", ext, mime)
12                uci:commit("fon_browser")
13        end
14end
15
16-- adds a handler for a mime type
17function add_mime_handler(module, template, priority, mimes)
18        if module and template and priority and mimes then
19                local uci = require("luci.model.uci").cursor()
20                uci:section("fon_browser", "module", module,
21                        {template=template,priority=priority})
22                uci:set_list("fon_browser", module, "filter", mimes)
23                uci:commit("fon_browser")
24        end
25end
26
27function remove_mime_handler(module)
28        if module then
29                local uci = require("luci.model.uci").cursor()
30                uci:delete("fon_browser", module)
31                uci:commit("fon_browser")
32        end
33end
34
35-- constructor
36function Plugin.__init__(self, title)
37        self.uci = require("luci.model.uci").cursor()
38        self.title = title
39end
40
41-- adds base info about a plugin
42function Plugin.add(self, name, provider, version)
43        local s = self.uci:get_all("plugfons", self.title)
44        if s ~= nil then
45                os.exit(1)
46        end
47        if self.title and name and provider and version then
48                self.name = name
49                self.provider = provider
50                self.version = version
51                self.uci:section("plugfons", "plugin", self.title,
52                        {name=name, provider=provider, version=version})
53                return true
54        end
55        return false
56end
57
58-- adds base info about a plugin
59function Plugin.load(self)
60        if not(self.title) then
61                return false
62        end
63        self.name = self.uci:get("plugfons", self.title, "name")
64        self.provider = self.uci:get("plugfons", self.title, "provider")
65        self.version = self.uci:get("plugfons", self.title, "version")
66        return true
67end
68
69function Plugin.add_uninstall(self, file)
70        if not(self.name and self.title and self.provider and self.version) then
71                return false
72        end
73        self.uci:set("plugfons", self.title, "uninstall", file)
74end
75
76function Plugin.delete(self)
77        if not(self.name and self.title and self.provider and self.version) then
78                return false
79        end
80        local fs = require("luci.fs")
81        local nodel = self.uci:get("plugfons", self.title, "nodel")
82        if nodel == "1" then
83                return
84        end
85        local uninstall = self.uci:get("plugfons", self.title, "uninstall")
86        if uninstall ~= nil then
87                os.execute(uninstall)
88        end
89        local files = self.uci:get_list("plugfons", self.title, "files")
90        for i,v in ipairs(files) do
91                print(v)
92                fs.unlink(v)
93        end
94        self.uci:delete("plugfons", self.title)
95        self.uci:commit("plugfons")
96        return true
97end
98
99-- adds a plugin to the dashboard
100function Plugin.dashboard(self, icon, order, href)
101        if not(self.title) then
102                return nil
103        end
104        if icon and order and href then
105                self.uci:set("plugfons", self.title, "dashicon", icon)
106                self.uci:set("plugfons", self.title, "order", order)
107                self.uci:set("plugfons", self.title, "href", href)
108                return true
109        end
110        return false
111end
112
113-- make luci redirct to the plugin
114function Plugin.redirect(self)
115        self.redirect = true
116end
117
118function reapdir(path, relative, modes)
119        if not(relative) then
120                relative = ""
121        end
122        local fs = require("luci.fs")
123        local files = {}
124        modes = modes or {}
125        local dirs = fs.dir(path..relative)
126        local size = 0
127        for i,j in ipairs(dirs) do
128                if j ~= "." and j ~= ".." then
129                        local stat = fs.stat(path..relative.."/"..j)
130                        modes[relative.."/"..j] = stat.mode
131                        if stat.type == "directory" then
132                                local f
133                                local s
134                                f,s = reapdir(path, relative.."/"..j, modes)
135                                size = size + s
136                                util.append(files, f)
137                        else
138                                if stat.type == "regular" then
139                                        size = size + stat.size
140                                end
141                                table.insert(files, relative.."/"..j)
142                        end
143                end
144        end
145        return files, size, modes
146end
147
148-- adds files to a plugin
149function Plugin.addfiles(self, path)
150        if not(self.title) then
151                return nil
152        end
153        self.path = path
154        self.files, self.size, self.modes = reapdir(path)
155end
156
157-- helper function for getting jffs partition size, with the reserved part already substracted
158function get_free_space()
159        local luanet = require("luanet")
160        local discs = luanet.df()
161        local flash
162        local total = 0
163        function psize_count(s)
164                if s.size then
165                        total = total + tonumber(s.size)
166                end
167        end
168
169        local uci = require("luci.model.uci").cursor()
170        uci:load("plugfons")
171        uci:foreach("plugfons", "plugin", psize_count)
172        if discs then
173                for i,v in ipairs(discs) do
174                        if v.mountpoint == "/jffs" then
175                                flash = v
176                        end
177                end
178        end
179        -- this is flacky, because we rely on it actually being there ....
180        flash.blocks = (flash.blocks - tonumber(require("luci.model.uci").cursor():get("system", "fon", "flash") or "250")) * 1024
181        flash.avail = flash.blocks - total
182        flash.percent = 100 - ((100 * flash.avail) / flash.blocks)
183        --os.execute("logger blocks = "..flash.blocks.."   flash.avail="..flash.avail.."   count="..total.. "  flash.percent="..flash.percent)
184        return flash
185end
186
187-- after all settings were made, we finalize the install with a uci commit
188function Plugin.finalize(self, a)
189        if not(self.title) then
190                return nil
191        end
192        local jffs = get_free_space(total)
193        if jffs.avail < self.size then
194                os.exit(2)
195        end
196        if self.path and self.files and self.size then
197                local fs = require("luci.fs")
198                for i,j in ipairs(self.files) do
199                        fs.mkdir(fs.dirname(j), true)
200                        if fs.stat(self.path..j, "type") == "link" then
201                                fs.link(fs.readlink(self.path..j), j, true)
202                        else
203                                fs.copy(self.path..j, j)
204                        end
205                end
206                for file, mode in pairs(self.modes) do
207                        fs.chmod(file, mode)
208                end
209                self.uci:set_list("plugfons", self.title, "files", self.files)
210                self.uci:set("plugfons", self.title, "size", self.size)
211        end
212        if self.redirect == true then
213                self.uci:set("plugfons", self.title, "redirect", "1")
214        end
215        self.uci:commit("plugfons")
216        return true
217end
Note: See TracBrowser for help on using the repository browser.