|
@@ -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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
}
|