Revised sysupgrade part 1
authorSteven Barth <steven@midlink.org>
Thu, 18 Sep 2008 19:23:08 +0000 (19:23 +0000)
committerSteven Barth <steven@midlink.org>
Thu, 18 Sep 2008 19:23:08 +0000 (19:23 +0000)
i18n/english/luasrc/i18n/admin-core.en.lua
i18n/english/luasrc/i18n/admin-core.en.xml
i18n/german/luasrc/i18n/admin-core.de.lua
i18n/german/luasrc/i18n/admin-core.de.xml
libs/http/luasrc/http/protocol.lua
libs/sys/luasrc/sys/mtdow.lua
modules/admin-full/luasrc/controller/admin/system.lua
modules/admin-full/luasrc/view/admin_system/upgrade.htm

index 3cb5efd..a53a7a8 100644 (file)
@@ -70,7 +70,7 @@ a_s_flash_flashed = 'Firmware successfully flashed. Rebooting device...'
 a_s_flash_flasherr = 'Failed to flash'
 a_s_flash_fwimage = 'Firmwareimage'
 a_s_flash_received = 'Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!'
 a_s_flash_flasherr = 'Failed to flash'
 a_s_flash_fwimage = 'Firmwareimage'
 a_s_flash_received = 'Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!'
-a_s_flash_inprogress = 'Writing firmware...'
+a_s_flash_inprogress = 'Writing'
 a_s_flash_fwupgrade = 'Flash Firmware'
 a_s_flash_keepcfg = 'Keep configuration files'
 a_s_flash_notimplemented = 'Sorry, this function is not (yet) available for your platform.'
 a_s_flash_fwupgrade = 'Flash Firmware'
 a_s_flash_keepcfg = 'Keep configuration files'
 a_s_flash_notimplemented = 'Sorry, this function is not (yet) available for your platform.'
index 155a5f3..ebeb2bc 100644 (file)
@@ -74,7 +74,7 @@
 <i18n:msg xml:id="a_s_flash_flasherr">Failed to flash</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg>
 <i18n:msg xml:id="a_s_flash_received">Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!</i18n:msg>
 <i18n:msg xml:id="a_s_flash_flasherr">Failed to flash</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg>
 <i18n:msg xml:id="a_s_flash_received">Image received. About to start flashing process. DO NOT POWER OFF THE DEVICE!</i18n:msg>
-<i18n:msg xml:id="a_s_flash_inprogress">Writing firmware...</i18n:msg>
+<i18n:msg xml:id="a_s_flash_inprogress">Writing</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwupgrade">Flash Firmware</i18n:msg>
 <i18n:msg xml:id="a_s_flash_keepcfg">Keep configuration files</i18n:msg>
 <i18n:msg xml:id="a_s_flash_notimplemented">Sorry, this function is not (yet) available for your platform.</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwupgrade">Flash Firmware</i18n:msg>
 <i18n:msg xml:id="a_s_flash_keepcfg">Keep configuration files</i18n:msg>
 <i18n:msg xml:id="a_s_flash_notimplemented">Sorry, this function is not (yet) available for your platform.</i18n:msg>
index c0169b4..d135bde 100644 (file)
@@ -40,7 +40,7 @@ a_s_flash_flashed = 'Flashvorgang erfolgreich. Router startet neu...'
 a_s_flash_flasherr = 'Flashvorgang fehlgeschlagen'
 a_s_flash_fwimage = 'Firmwareimage'
 a_s_flash_received = 'Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!'
 a_s_flash_flasherr = 'Flashvorgang fehlgeschlagen'
 a_s_flash_fwimage = 'Firmwareimage'
 a_s_flash_received = 'Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!'
-a_s_flash_inprogress = 'Schreibe Firmware...'
+a_s_flash_inprogress = 'Schreibe'
 a_s_flash_fwupgrade = 'Firmware aktualisieren'
 a_s_flash_keepcfg = 'Konfigurationsdateien übernehmen'
 a_s_flash_notimplemented = 'Diese Funktion steht leider (noch) nicht zur Verfügung.'
 a_s_flash_fwupgrade = 'Firmware aktualisieren'
 a_s_flash_keepcfg = 'Konfigurationsdateien übernehmen'
 a_s_flash_notimplemented = 'Diese Funktion steht leider (noch) nicht zur Verfügung.'
index f0f90b0..2eabce5 100644 (file)
@@ -44,7 +44,7 @@
 <i18n:msg xml:id="a_s_flash_flasherr">Flashvorgang fehlgeschlagen</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg>
 <i18n:msg xml:id="a_s_flash_received">Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!</i18n:msg>
 <i18n:msg xml:id="a_s_flash_flasherr">Flashvorgang fehlgeschlagen</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwimage">Firmwareimage</i18n:msg>
 <i18n:msg xml:id="a_s_flash_received">Abbild empfangen. Starte Flashvorgang. SCHALTEN SIE DAS GERÄT NICHT AUS!</i18n:msg>
-<i18n:msg xml:id="a_s_flash_inprogress">Schreibe Firmware...</i18n:msg>
+<i18n:msg xml:id="a_s_flash_inprogress">Schreibe</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwupgrade">Firmware aktualisieren</i18n:msg>
 <i18n:msg xml:id="a_s_flash_keepcfg">Konfigurationsdateien übernehmen</i18n:msg>
 <i18n:msg xml:id="a_s_flash_notimplemented">Diese Funktion steht leider (noch) nicht zur Verfügung.</i18n:msg>
 <i18n:msg xml:id="a_s_flash_fwupgrade">Firmware aktualisieren</i18n:msg>
 <i18n:msg xml:id="a_s_flash_keepcfg">Konfigurationsdateien übernehmen</i18n:msg>
 <i18n:msg xml:id="a_s_flash_notimplemented">Diese Funktion steht leider (noch) nicht zur Verfügung.</i18n:msg>
index 93c9e79..6873d24 100644 (file)
@@ -421,7 +421,7 @@ function mimedecode_message_body( src, msg, filecb )
                                        end
 
                                        if store then
                                        end
 
                                        if store then
-                                               store( field.headers, predata, true )
+                                               store( field, predata, true )
                                        end
 
 
                                        end
 
 
@@ -439,7 +439,7 @@ function mimedecode_message_body( src, msg, filecb )
                                        data   = data:sub( 1, #data - 78 )
 
                                        if store then
                                        data   = data:sub( 1, #data - 78 )
 
                                        if store then
-                                               store( field.headers, data, false )
+                                               store( field, data, false )
                                        else
                                                return nil, "Invalid MIME section header"
                                        end
                                        else
                                                return nil, "Invalid MIME section header"
                                        end
@@ -451,7 +451,7 @@ function mimedecode_message_body( src, msg, filecb )
                                        lchunk, eof = parse_headers( data, field )
                                        inhdr = not eof
                                else
                                        lchunk, eof = parse_headers( data, field )
                                        inhdr = not eof
                                else
-                                       store( field.headers, lchunk, false )
+                                       store( field, lchunk, false )
                                        lchunk, chunk = chunk, nil
                                end
                        end
                                        lchunk, chunk = chunk, nil
                                end
                        end
index bfa2e9e..7c03845 100644 (file)
@@ -44,7 +44,7 @@ EmulatedWriter.blocks = {
        image = {
                magic = "eb48",
                device = "/dev/hda",
        image = {
                magic = "eb48",
                device = "/dev/hda",
-               write = WRITE_SEPARATELY
+               write = WRITE_EMULATED
        }
 }
 
        }
 }
 
@@ -193,7 +193,7 @@ function Writer._write_memory(self, devicename, imagestream)
        end
        
        return os.execute( 
        end
        
        return os.execute( 
-               "%s write '%s' '%s'" % {
+               "%s write '%s' '%s' >/dev/null 2>&1" % {
                self.MTD, self.IMAGEFIFO, devicename
                }
        )       
                self.MTD, self.IMAGEFIFO, devicename
                }
        )       
@@ -212,21 +212,21 @@ function Writer._write_combined(self, devicename, imagestream, appendfile)
        end
        
        return os.execute( 
        end
        
        return os.execute( 
-               "%s -j '%s' write '%s' '%s'" % {
+               "%s -j '%s' write '%s' '%s' >/dev/null 2>&1" % {
                        self.MTD, appendfile, self.IMAGEFIFO, devicename
                }
        )
 end
 
 function Writer._refresh_block(self, devicename)
                        self.MTD, appendfile, self.IMAGEFIFO, devicename
                }
        )
 end
 
 function Writer._refresh_block(self, devicename)
-       return os.execute("%s refresh '%s'" % {self.MTD, devicename})
+       return os.execute("%s refresh '%s' >/dev/null 2>&1" % {self.MTD, devicename})
 end
 
 function Writer._append(self, devicename, appendfile, erase)
        erase = erase and ("-e '%s' " % devicename) or ''
        
        return os.execute( 
 end
 
 function Writer._append(self, devicename, appendfile, erase)
        erase = erase and ("-e '%s' " % devicename) or ''
        
        return os.execute( 
-               "%s %s jffs2write '%s' '%s'" % {
+               "%s %s jffs2write '%s' '%s' >/dev/null 2>&1" % {
                        self.MTD, erase, appendfile, devicename
                }
        )
                        self.MTD, erase, appendfile, devicename
                }
        )
index c89c585..35eca2a 100644 (file)
@@ -181,50 +181,83 @@ end
 
 function action_upgrade()
        require("luci.model.uci")
 
 function action_upgrade()
        require("luci.model.uci")
+       local mtdow = require "luci.sys.mtdow"
+       local writer = mtdow.native_writer()
+       local blocks = writer and writer.blocks
+       local ltn12 = require "luci.ltn12"
+       local uploads = {}
+       local flash = {}
 
        local ret
 
        local ret
-       local plat = luci.fs.mtime("/lib/upgrade/platform.sh")
-       local tmpfile = "/tmp/firmware.img"
-       local broadcom = os.execute('grep brcm_ /lib/upgrade/platform.sh >/dev/null 2>&1') == 0
-        
-       local keep_avail = not broadcom
+       local filepat = "/tmp/mtdblock.%s"
+       local kfile = "/tmp/mtdappend.tgz"
+
+       local keep_avail = false
+       if blocks then
+               for k, block in pairs(blocks) do
+                       if block.write == mtdow.WRITE_COMBINED 
+                       or block.write == mtdow.WRITE_EMULATED then
+                               keep_avail = true
+                       end
+               end
+       end
 
 
-       local file
        luci.http.setfilehandler(
                function(meta, chunk, eof)
        luci.http.setfilehandler(
                function(meta, chunk, eof)
-                       if not file then
-                               file = io.open(tmpfile, "w")
+                       if not meta or not blocks or not blocks[meta.name] then
+                               return
+                       end
+                       if not uploads[meta.name] then
+                               uploads[meta.name] = io.open(filepat % meta.name, "w")
                        end
                        if chunk then
                        end
                        if chunk then
-                               file:write(chunk)
+                               uploads[meta.name]:write(chunk)
                        end
                        if eof then
                        end
                        if eof then
-                               file:close()
+                               uploads[meta.name]:close()
+                               uploads[meta.name] = filepat % meta.name
                        end
                end
        )
 
                        end
                end
        )
 
-       local fname   = luci.http.formvalue("image")
+       luci.http.formvalue() -- Parse uploads
        local keepcfg = keep_avail and luci.http.formvalue("keepcfg")
        local keepcfg = keep_avail and luci.http.formvalue("keepcfg")
-
-       if plat and fname then
-               ret = function()
-                       return luci.sys.flash(tmpfile, keepcfg and _keep_pattern())
+       
+       local function _kfile()
+               luci.fs.unlink(kfile)
+               
+               local kpattern = ""
+               local files = luci.model.uci.cursor():get_all("luci", "flash_keep")
+               if files then
+                       kpattern = ""
+                       for k, v in pairs(files) do
+                               if k:sub(1,1) ~= "." and luci.fs.glob(v) then
+                                       kpattern = kpattern .. " '" ..  v .. "'"
+                               end
+                       end
                end
                end
+               
+               local stat = os.execute("tar czf '%s' %s >/dev/null 2>&1" % {kfile, kpattern})
+               return stat == 0 and kfile
        end
 
        end
 
-       luci.http.prepare_content("text/html")
-       luci.template.render("admin_system/upgrade", {sysupgrade=plat, ret=ret, keep_avail=keep_avail})
-end
+       for name, file in pairs(uploads) do
+               flash[name] = function()
+                       local imgstream = ltn12.source.file(io.open(file))
+                       return pcall(writer.write_block, writer, 
+                               name, imgstream, keepcfg and _kfile())
+               end
+       end
+       
+       local reboot = {}
 
 
-function _keep_pattern()
-       local kpattern = ""
-       local files = luci.model.uci.cursor():get_all("luci", "flash_keep")
-       if files then
-               kpattern = ""
-               for k,v in pairs(files) do
-                       kpattern = kpattern .. " " ..  v
+       luci.template.render("admin_system/upgrade", {blocks=blocks,
+               flash=flash, keep_avail=keep_avail, reboot=reboot})
+       if reboot.exec then
+               local pid = posix.fork()
+               if pid == 0 then
+                       os.execute("sleep 1")
+                       posix.execp("reboot")
                end
        end
                end
        end
-       return kpattern
 end
 end
index a3d97d6..693022f 100644 (file)
@@ -17,12 +17,13 @@ $Id$
 <h2><%:a_s_flash%></h2>
 <p><%:a_s_flash_upgrade1%></p>
 <br />
 <h2><%:a_s_flash%></h2>
 <p><%:a_s_flash_upgrade1%></p>
 <br />
-<% if sysupgrade and not ret then %>
+<% if next(blocks) and not next(flash) then %>
 <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
        <div class="left"><%:a_s_flash_fwimage%>:</div>
        <div>
 <form method="post" action="<%=REQUEST_URI%>" enctype="multipart/form-data">
        <div class="left"><%:a_s_flash_fwimage%>:</div>
        <div>
-               <input type="file" size="30" name="image" />
-               <br />
+               <% for name, v in pairs(blocks) do %>
+                       <%=name%>: <input type="file" size="30" name="<%=name%>" /><br />
+               <% end %>
                <br />
                <% if keep_avail then -%>
                <input type="checkbox" name="keepcfg" value="1" checked="checked" />
                <br />
                <% if keep_avail then -%>
                <input type="checkbox" name="keepcfg" value="1" checked="checked" />
@@ -33,20 +34,23 @@ $Id$
                <input type="submit" value="<%:a_s_flash_fwupgrade%>" />
        </div>
 </form>
                <input type="submit" value="<%:a_s_flash_fwupgrade%>" />
        </div>
 </form>
-<% elseif ret then %>
+<% elseif next(flash) then %>
        <p><%:a_s_flash_received%></p>
        <p><%:a_s_flash_received%></p>
-       <p><%:a_s_flash_inprogress%></p>
        
        
-<!-- <%=string.rep(" ", 2048)%> -->
-       <% %>
-       <% local ret = ret() 
-       if ret == 0 then %>
-<div class="ok"><%:a_s_flash_flashed%></div>
-       <% else %>
-<div class="error"><%:a_s_flash_flasherr%>! (<%:code%> <%=ret%>)</div> 
+       <% reboot.exec = false
+       for name, func in pairs(flash) do %>
+               <%:a_s_flash_inprogress%> <%=name%>...
+               <%=string.rep(" ", 2048)%>
+               <%
+                local stat, code = func()
+                reboot.exec = reboot.exec or stat 
+               if stat and code then %>
+                       <%:a_s_flash_flashed%><br />
+               <% else %>
+                       <%:a_s_flash_flasherr%>! (<%:code%> <%=code%>)<br />    
+               <% end %>
        <% end %>
 <% else %>
 <div class="error"><%:a_s_flash_notimplemented%></div>
 <% end %>
        <% end %>
 <% else %>
 <div class="error"><%:a_s_flash_notimplemented%></div>
 <% end %>
-<%+footer%>
-<% if ret == 0 then luci.sys.reboot() end %>
+<%+footer%>
\ No newline at end of file