2 Copyright
2008 Steven Barth
<steven@midlink.org
>
3 Copyright
2008-
2010 Jo-Philipp Wich
<jow@openwrt.org
>
4 Licensed to the public under the Apache License
2.0.
8 local opkg = require
"luci.model.ipkg"
9 local fs = require
"nixio.fs"
10 local wa = require
"luci.tools.webadmin"
15 return (rowcnt %
2) +
1
18 local fstat = fs.statvfs(opkg.overlay_root())
19 local space_total = fstat and fstat.blocks or
0
20 local space_free = fstat and fstat.bfree or
0
21 local space_used = space_total - space_free
23 local used_perc = math.floor(
0.5 + ((space_total
> 0) and ((
100 / space_total) * space_used) or
100))
24 local free_byte = space_free * fstat.frsize
29 local opkg_list = luci.model.ipkg.list_all
31 if query and #query
> 0 then
32 querypat = '*%s*' % query
33 opkg_list = luci.model.ipkg.find
40 letterpat = string.char(letter,
42) -- 'A' '*'
47 <script type=
"text/javascript" src=
"<%=resource%>/cbi.js"></script>
49 <h2 name=
"content"><%:Software%
></h2>
53 <ul class=
"cbi-tabmenu">
54 <li class=
"cbi-tab"><a href=
"#"><%:Actions%
></a></li>
55 <li class=
"cbi-tab-disabled"><a href=
"<%=REQUEST_URI%>/ipkg"><%:Configuration%
></a></li>
58 <form method=
"post" action=
"<%=REQUEST_URI%>">
59 <input type=
"hidden" name=
"exec" value=
"1" />
60 <input type=
"hidden" name=
"token" value=
"<%=token%>" />
62 <div class=
"cbi-section">
63 <div class=
"cbi-section-node">
64 <% if (install and next(install)) or (remove and next(remove)) or update or upgrade then %
>
65 <div class=
"cbi-value">
66 <% if #stdout
> 0 then %
><pre><%=pcdata(stdout)%
></pre><% end %
>
67 <% if #stderr
> 0 then %
><pre class=
"error"><%=pcdata(stderr)%
></pre><% end %
>
71 <% if querypat then %
>
72 <div class=
"cbi-value">
73 <%:Displaying only packages containing%
> <strong>"<%=pcdata(query)%>"</strong>
74 <input type=
"button" onclick=
"location.href='?display=<%=luci.http.urlencode(display)%>'" href=
"#" class=
"cbi-button cbi-button-reset" style=
"margin-left:1em" value=
"<%:Reset%>" />
75 <br style=
"clear:both" />
79 <% if no_lists or old_lists then %
>
80 <div class=
"cbi-value">
81 <% if old_lists then %
>
82 <%:Package lists are older than
24 hours%
>
84 <%:No package lists available%
>
86 <input type=
"submit" name=
"update" href=
"#" class=
"cbi-button cbi-button-apply" style=
"margin-left:3em" value=
"<%:Update lists%>" />
90 <div class=
"cbi-value cbi-value-last">
91 <%:Free space%
>:
<strong><%=(
100-used_perc)%
>%
</strong> (
<strong><%=wa.byte_format(free_byte)%
></strong>)
92 <div style=
"margin:3px 0; width:300px; height:10px; border:1px solid #000000; background-color:#80C080">
93 <div style=
"background-color:#F08080; border-right:1px solid #000000; height:100%; width:<%=used_perc%>%"> </div>
100 <div class=
"cbi-section-node">
101 <input type=
"hidden" name=
"display" value=
"<%=pcdata(display)%>" />
103 <div class=
"cbi-value">
104 <label class=
"cbi-value-title"><%:Download and install package%
>:
</label>
105 <div class=
"cbi-value-field">
106 <input type=
"text" name=
"url" size=
"30" value=
"" />
107 <input class=
"cbi-button cbi-button-save" type=
"submit" name=
"go" value=
"<%:OK%>" />
111 <div class=
"cbi-value cbi-value-last">
112 <label class=
"cbi-value-title"><%:Filter%
>:
</label>
113 <div class=
"cbi-value-field">
114 <input type=
"text" name=
"query" size=
"20" value=
"<%=pcdata(query)%>" />
115 <input type=
"submit" class=
"cbi-button cbi-button-action" name=
"search" value=
"<%:Find package%>" />
126 <ul class=
"cbi-tabmenu">
127 <li class=
"cbi-tab<% if display ~= "available
" then %>-disabled<% end %>"><a href=
"?display=available&query=<%=pcdata(query)%>"><%:Available packages%
><% if query then %
> (<%=pcdata(query)%
>)<% end %
></a></li>
128 <li class=
"cbi-tab<% if display ~= "installed
" then %>-disabled<% end %>"><a href=
"?display=installed&query=<%=pcdata(query)%>"><%:Installed packages%
><% if query then %
> (<%=pcdata(query)%
>)<% end %
></a></li>
131 <% if display ~=
"available" then %
>
132 <div class=
"cbi-section">
133 <div class=
"cbi-section-node">
135 <div class=
"tr cbi-section-table-titles">
136 <div class=
"th left"><%:Package name%
></div>
137 <div class=
"th left"><%:Version%
></div>
138 <div class=
"th cbi-section-actions"> </div>
140 <% local empty = true; luci.model.ipkg.list_installed(querypat, function(n, v, s, d) empty = false; filter[n] = true %
>
141 <div class=
"tr cbi-rowstyle-<%=rowstyle()%>">
142 <div class=
"td left"><%=luci.util.pcdata(n)%
></div>
143 <div class=
"td left"><%=luci.util.pcdata(v)%
></div>
144 <div class=
"td cbi-section-actions">
145 <form method=
"post" class=
"inline" action=
"<%=REQUEST_URI%>">
146 <input type=
"hidden" name=
"exec" value=
"1" />
147 <input type=
"hidden" name=
"token" value=
"<%=token%>" />
148 <input type=
"hidden" name=
"remove" value=
"<%=pcdata(n)%>" />
149 <input class=
"cbi-button cbi-button-remove" type=
"submit" onclick=
"window.confirm('<%:Remove%> "<%=luci.util.pcdata(n)%>" ?') && this.parentNode.submit(); return false" value=
"<%:Remove%>" />
155 <div class=
"tr cbi-section-table-row">
156 <div class=
"td left"> </div>
157 <div class=
"td left"><em><%:none%
></em></div>
158 <div class=
"td left"><em><%:none%
></em></div>
165 <div class=
"cbi-section">
166 <% if not querypat then %
>
167 <ul class=
"cbi-tabmenu" style=
"flex-wrap:wrap">
168 <% local i; for i =
65,
90 do %
>
169 <li class=
"cbi-tab<% if letter ~= i then %>-disabled<% end %>"><a href=
"?display=available&letter=<%=string.char(i)%>"><%=string.char(i)%
></a></li>
171 <li class=
"cbi-tab<% if letter ~= 35 then %>-disabled<% end %>"><a href=
"?display=available&letter=%23">#
</a></li>
174 <div class=
"cbi-section-node cbi-section-node-tabbed">
176 <div class=
"tr cbi-section-table-titles">
177 <div class=
"th col-2 left"><%:Package name%
></div>
178 <div class=
"th col-2 left"><%:Version%
></div>
179 <div class=
"th col-1 center"><%:Size (.ipk)%
></div>
180 <div class=
"th col-10 left"><%:Description%
></div>
181 <div class=
"th cbi-section-actions"> </div>
183 <% local empty = true; opkg_list(querypat or letterpat, function(n, v, s, d) if filter[n] then return end; empty = false %
>
184 <div class=
"tr cbi-rowstyle-<%=rowstyle()%>">
185 <div class=
"td col-2 left"><%=luci.util.pcdata(n)%
></div>
186 <div class=
"td col-2 left"><%=luci.util.pcdata(v)%
></div>
187 <div class=
"td col-1 center"><%=luci.util.pcdata(s)%
></div>
188 <div class=
"td col-10 left"><%=luci.util.pcdata(d)%
></div>
189 <div class=
"td cbi-section-actions">
190 <form method=
"post" class=
"inline" action=
"<%=REQUEST_URI%>">
191 <input type=
"hidden" name=
"exec" value=
"1" />
192 <input type=
"hidden" name=
"token" value=
"<%=token%>" />
193 <input type=
"hidden" name=
"install" value=
"<%=pcdata(n)%>" />
194 <input class=
"cbi-button cbi-button-apply" type=
"submit" onclick=
"window.confirm('<%:Install%> "<%=luci.util.pcdata(n)%>" ?') && this.parentNode.submit(); return false" value=
"<%:Install%>" />
201 <div class=
"td left"> </div>
202 <div class=
"td left"><em><%:none%
></em></div>
203 <div class=
"td left"><em><%:none%
></em></div>
204 <div class=
"td right"><em><%:none%
></em></div>
205 <div class=
"td left"><em><%:none%
></em></div>