LH 3 rokov pred
rodič
commit
dc867c2e41

+ 76 - 16
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/FirmwareAutoDumper.java

@@ -20,11 +20,18 @@ public class FirmwareAutoDumper
     static Statefile state = null;
     static File outfolder_base;
     public static final boolean IA_UPLOAD_ENABLED = false;
+    public static final boolean DUMMY_MODE = false;
+    public static PrintStream dummydownloadfake = null;
+    public static Set<String> supprCache = new HashSet<>();
 
     public static void pullFirmwares(File statefile, File outfolder, boolean deepmode)
     {
         outfolder_base=outfolder;
         try{
+            if(DUMMY_MODE)
+            {
+                dummydownloadfake = new PrintStream(new FileOutputStream(new File(outfolder,"dummy.log")));
+            }
             Representer representer = new Representer();
             representer.addClassTag(Firmware.class, new Tag("!FW"));
             representer.addClassTag(FirmwareVersion.class, new Tag("!FWV"));
@@ -53,14 +60,20 @@ public class FirmwareAutoDumper
             }
 
             File outfolder_tmp = new File(outfolder,"tmp");
+            File downloadFolderBase = new File(outfolder_base,"downloadstage");
+            downloadFolderBase.mkdirs();
+            File fw = new File(outfolder_tmp,"Firmware");
             outfolder_tmp.mkdirs();
+            if(!fw.exists()) // should only happen in dummy mode or if something zarfed out while dev
+            {
             Utils.runTool(outfolder_tmp,
                     "wget",
                     "http://firmware.sena.com/senabluetoothmanager/Firmware"
                     );
+            }
 
-            BufferedReader br = new BufferedReader(new FileReader(new File(outfolder_tmp,"Firmware")));
-            final HashMap<String,String> basenamelookup = new HashMap<>();
+            BufferedReader br = new BufferedReader(new FileReader(fw));
+            final HashMap<String,String> basenamelookup = new LinkedHashMap<>();
             // filename --> real basename
             br.lines().forEach((line)->
                 {
@@ -98,14 +111,14 @@ public class FirmwareAutoDumper
                         Firmware tmp = new Firmware();
                         tmp.setDeviceId(FWBAsename);
                         tmp.setInitialDLDone(false);
-                        tmp.setVersions(new HashMap<>());
+                        tmp.setVersions(new LinkedHashMap<>());
                         state.getFirmwares().put(FWBAsename,tmp);
                     }
 
                     Firmware f = state.getFirmwares().get(FWBAsename);
 
                     try {
-                        int[] fwnumber = splitVersionAndPullFW(FWFileName,f.getVersions());
+                        int[] fwnumber = splitVersionAndPullFW(FWFileName,f.getVersions(),deepmode);
                         f.setMajor(fwnumber[0]);
                         f.setMinor(fwnumber[1]);
                         f.setPatch(fwnumber[2]);
@@ -115,7 +128,12 @@ public class FirmwareAutoDumper
                 });
             br.close();
             y.dump(state,new FileWriter(statefile));
-            new File(outfolder_tmp,"firmware").delete();
+            if(!DUMMY_MODE)
+                new File(outfolder_tmp,"firmware").delete();
+            if(DUMMY_MODE)
+            {
+                dummydownloadfake.close();
+            }
         }
         catch (IOException ex)
         {
@@ -123,7 +141,7 @@ public class FirmwareAutoDumper
         }
     }
 
-    private static int[] splitVersionAndPullFW(String filename,HashMap<String,FirmwareVersion> knownVersions) throws IOException {
+    private static int[] splitVersionAndPullFW(String filename,HashMap<String,FirmwareVersion> knownVersions, boolean deepmode) throws IOException {
         String[] magic = filename.split("-v");
         boolean fuckingoddity = false;
         if(magic.length==1)
@@ -169,6 +187,22 @@ public class FirmwareAutoDumper
 
         scanDownwards(major,minor,patch,prefix,suffix,knownVersions);
 
+        //scanning upwards for "poking" for undocumented stuff
+        if(deepmode)
+        {
+            //String synthesizedFileName = prefix+(major)+"."+minor+"."+(patch)+suffix;
+            String synthesizedFileName = prefix+(major+1)+"."+0+"."+(0)+suffix;
+            String synthesizedFileNameShort = prefix+(major+1)+"."+0+suffix;
+            peekNext(synthesizedFileName,synthesizedFileNameShort,major+1,0,0,knownVersions);
+
+            synthesizedFileName = prefix+(major)+"."+(minor+1)+"."+(0)+suffix;
+            synthesizedFileNameShort = prefix+(major)+"."+(minor+1)+suffix;
+            peekNext(synthesizedFileName,synthesizedFileNameShort,major,minor+1,0,knownVersions);
+
+            synthesizedFileName = prefix+(major)+"."+minor+"."+(patch+1)+suffix;
+            peekNext(synthesizedFileName,null,major,minor,patch+1,knownVersions);
+        }
+
         return new int[]{major,minor,patch};
     }
 
@@ -181,11 +215,6 @@ public class FirmwareAutoDumper
             HashMap<String,FirmwareVersion> knownVersions) throws IOException {
         System.out.println(major+"--"+minor+"--"+patch);
         List<FirmwareVersion> temp = new ArrayList<>();
-        //temp.add(prefix+(major+1)+".0.0"); // poking for next major
-        //temp.add(prefix+(major+1)+".0"); // poking for next major
-        //temp.add(prefix+(major)+"."+(minor+1)+".0"); // poking for next minor
-        //temp.add(prefix+(major)+"."+(minor+1)); // poking for next minor
-        //temp.add(prefix+(major)+"."+minor+"."+(patch+1)); // poking for next patch
         System.out.println(prefix+"."+major+"."+minor+"."+patch+"."+suffix);
 
         while(major>=1&&minor>=0&&patch>=0) //older versions won't be bruteforced, check for existence in the index prevents a redownload.
@@ -237,11 +266,25 @@ public class FirmwareAutoDumper
         f.setMinor(minor);
         f.setPatch(patch);
         File downloadFolderBase = new File(outfolder_base,"downloadstage");
+        if(supprCache.contains(fwname)) //leaves a "fake entry" when 2 different deviceIDs would lead to the same filename
+        {
+            f.setFiller(true);
+            f.setServerCreationDate(new Date(0));
+            return f;
+        }
+        supprCache.add(fwname); // banning a filename from rescan/redownload
         //if(true) return f;
-        Utils.runTool(downloadFolderBase,
-                "wget",
-                "http://firmware.sena.com/senabluetoothmanager/"+fwname
-        );
+        if(!DUMMY_MODE)
+        {
+            Utils.runTool(downloadFolderBase,
+                    "wget",
+                    "http://firmware.sena.com/senabluetoothmanager/"+fwname
+            );
+        }
+        else
+        {
+            dummydownloadfake.println("http://firmware.sena.com/senabluetoothmanager/"+fwname);
+        }
         System.err.println("New Version spotted:"+fwname); //intentionally a output. that should be mailed by the cron daemon if its
         File dlf = new File(downloadFolderBase,fwname);
         File dst = new File(outfolder_base,fwname);
@@ -270,6 +313,23 @@ public class FirmwareAutoDumper
         return f;
     }
 
-
+    private static void peekNext(String synthesizedFileName, String synthesizedFileNameShort, int major, int minor, int patch, HashMap<String,FirmwareVersion> knownVersions) throws IOException {
+        if(!(knownVersions.containsKey(synthesizedFileName)||knownVersions.containsKey(synthesizedFileNameShort))) // only re-poking if nothing was there yet.
+        {
+            FirmwareVersion nextMajor = getFirmware(major,minor,patch,true,synthesizedFileName);
+            if(nextMajor.isFiller())
+            {
+                if(synthesizedFileNameShort != null)
+                {
+                    nextMajor = getFirmware(major,minor,patch,true,synthesizedFileNameShort);
+                    synthesizedFileName = synthesizedFileNameShort;
+                }
+            }
+            if(!nextMajor.isFiller())
+            {
+                knownVersions.put(synthesizedFileName,nextMajor);
+            }
+        }
+    }
 
 }

+ 2 - 0
SenaBitWiggler/src/main/java/de/nplusc/izc/senabitwiggler/Statefile.java

@@ -1,8 +1,10 @@
 package de.nplusc.izc.senabitwiggler;
 
 import java.util.HashMap;
+import java.util.Set;
 
 public class Statefile {
+
     private HashMap<String, Firmware> firmwares;
 
     public HashMap<String, Firmware> getFirmwares() {