FirmwareAutoDumper.java 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package de.nplusc.izc.senabitwiggler;
  2. import org.yaml.snakeyaml.DumperOptions;
  3. import org.yaml.snakeyaml.TypeDescription;
  4. import org.yaml.snakeyaml.Yaml;
  5. import org.yaml.snakeyaml.constructor.Constructor;
  6. import org.yaml.snakeyaml.nodes.Tag;
  7. import org.yaml.snakeyaml.representer.Representer;
  8. import javax.swing.plaf.nimbus.State;
  9. import java.io.*;
  10. import java.nio.file.CopyOption;
  11. import java.nio.file.Files;
  12. import java.nio.file.StandardCopyOption;
  13. import java.util.*;
  14. public class FirmwareAutoDumper
  15. {
  16. static Statefile state = null;
  17. static File outfolder_base;
  18. public static final boolean IA_UPLOAD_ENABLED = false;
  19. public static void pullFirmwares(File statefile, File outfolder, boolean deepmode)
  20. {
  21. outfolder_base=outfolder;
  22. try{
  23. Representer representer = new Representer();
  24. representer.addClassTag(Firmware.class, new Tag("!FW"));
  25. representer.addClassTag(FirmwareVersion.class, new Tag("!FWV"));
  26. Yaml y = new Yaml(representer, new DumperOptions());
  27. if(statefile.exists())
  28. {
  29. try {
  30. Constructor constructor = new Constructor();
  31. constructor.addTypeDescription(new TypeDescription(Firmware.class, "!FW"));
  32. constructor.addTypeDescription(new TypeDescription(FirmwareVersion.class, "!FWV"));
  33. Yaml internal = new Yaml(constructor);
  34. state = (Statefile) internal.load(new FileReader(statefile));
  35. } catch (FileNotFoundException e) {
  36. System.err.println("Hurz");
  37. e.printStackTrace();
  38. }
  39. }
  40. else
  41. {
  42. state = new Statefile();
  43. state.setFirmwares(new LinkedHashMap<>());
  44. }
  45. File outfolder_tmp = new File(outfolder,"tmp");
  46. outfolder_tmp.mkdirs();
  47. Utils.runTool(outfolder_tmp,
  48. "wget",
  49. "http://firmware.sena.com/senabluetoothmanager/Firmware"
  50. );
  51. BufferedReader br = new BufferedReader(new FileReader(new File(outfolder_tmp,"Firmware")));
  52. final HashMap<String,String> basenamelookup = new HashMap<>();
  53. // filename --> real basename
  54. br.lines().forEach((line)->
  55. {
  56. String[] linesplitted = line.split(":");
  57. String FWFileName;
  58. String FWBAsename = "ZÖINKS!";
  59. if(linesplitted.length==4)
  60. {
  61. FWBAsename = linesplitted[0]+"-"+linesplitted[2];
  62. FWFileName = linesplitted[3];
  63. }
  64. else if(linesplitted.length==3)
  65. {
  66. FWBAsename = linesplitted[0]+"-NOLNG";
  67. FWFileName = linesplitted[2];
  68. }
  69. else
  70. {
  71. return;
  72. }
  73. if(basenamelookup.containsKey(FWFileName))
  74. {
  75. return; //languageless file, no need to handle multiple times.
  76. }
  77. else
  78. {
  79. basenamelookup.put(FWFileName,FWBAsename);
  80. }
  81. if(!state.getFirmwares().containsKey(FWBAsename))
  82. {
  83. Firmware tmp = new Firmware();
  84. tmp.setDeviceId(FWBAsename);
  85. tmp.setInitialDLDone(false);
  86. tmp.setVersions(new HashMap<>());
  87. state.getFirmwares().put(FWBAsename,tmp);
  88. }
  89. Firmware f = state.getFirmwares().get(FWBAsename);
  90. try {
  91. int[] fwnumber = splitVersionAndPullFW(FWFileName,f.getVersions());
  92. f.setMajor(fwnumber[0]);
  93. f.setMinor(fwnumber[1]);
  94. f.setPatch(fwnumber[2]);
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. }
  98. });
  99. br.close();
  100. y.dump(state,new FileWriter(statefile));
  101. new File(outfolder_tmp,"firmware").delete();
  102. }
  103. catch (IOException ex)
  104. {
  105. ex.printStackTrace();
  106. }
  107. }
  108. private static int[] splitVersionAndPullFW(String filename,HashMap<String,FirmwareVersion> knownVersions) throws IOException {
  109. String[] magic = filename.split("-v");
  110. boolean fuckingoddity = false;
  111. if(magic.length==1)
  112. {
  113. fuckingoddity = true;
  114. magic = filename.split("_v");
  115. }
  116. String version = magic[1];
  117. String[] vsplit = version.split("\\.");
  118. String suffix = "";
  119. int major=0,minor=0,patch=0;
  120. major=Integer.valueOf(vsplit[0]);
  121. if(vsplit.length==4)
  122. {
  123. minor = Integer.valueOf(vsplit[1]);
  124. patch = Integer.valueOf(vsplit[2].substring(0,1));
  125. if(vsplit[2].length()>1)
  126. {
  127. suffix = vsplit[2].substring(1)+"."+vsplit[3];
  128. }
  129. else
  130. {
  131. suffix = "."+vsplit[3];
  132. }
  133. }
  134. else
  135. {
  136. if(vsplit[1].length()>1)
  137. {
  138. minor = Integer.valueOf(vsplit[1].substring(0,1));
  139. suffix = vsplit[1].substring(1)+"."+vsplit[2];
  140. }
  141. else
  142. {
  143. minor = Integer.valueOf(vsplit[1].substring(0,1));
  144. suffix = "."+vsplit[2];
  145. }
  146. }
  147. String prefix = magic[0]+(fuckingoddity?"_":"-")+"v";
  148. //suffix = suffix+".img";
  149. scanDownwards(major,minor,patch,prefix,suffix,knownVersions);
  150. return new int[]{major,minor,patch};
  151. }
  152. private static void scanDownwards(
  153. int major,
  154. int minor,
  155. int patch,
  156. String prefix,
  157. String suffix,
  158. HashMap<String,FirmwareVersion> knownVersions) throws IOException {
  159. System.out.println(major+"--"+minor+"--"+patch);
  160. List<FirmwareVersion> temp = new ArrayList<>();
  161. //temp.add(prefix+(major+1)+".0.0"); // poking for next major
  162. //temp.add(prefix+(major+1)+".0"); // poking for next major
  163. //temp.add(prefix+(major)+"."+(minor+1)+".0"); // poking for next minor
  164. //temp.add(prefix+(major)+"."+(minor+1)); // poking for next minor
  165. //temp.add(prefix+(major)+"."+minor+"."+(patch+1)); // poking for next patch
  166. System.out.println(prefix+"."+major+"."+minor+"."+patch+"."+suffix);
  167. while(major>=1&&minor>=0&&patch>=0) //older versions won't be bruteforced, check for existence in the index prevents a redownload.
  168. {
  169. String synthesizedFileName = prefix+(major)+"."+minor+"."+(patch)+suffix;
  170. if(knownVersions.containsKey(synthesizedFileName)) //skipping redownload and setting it as "not hidden" if it was a hidden version
  171. {
  172. knownVersions.get(synthesizedFileName).setHidden(false);
  173. }
  174. else
  175. {
  176. FirmwareVersion f = getFirmware(major,minor,patch,false,synthesizedFileName);
  177. knownVersions.put(synthesizedFileName,f);
  178. }
  179. if(patch==0)
  180. {
  181. synthesizedFileName = prefix+(major)+"."+minor+suffix;
  182. if(knownVersions.containsKey(synthesizedFileName)) //skipping redownload and setting it as "not hidden" if it was a hidden version
  183. {
  184. knownVersions.get(synthesizedFileName).setHidden(false);
  185. }
  186. else
  187. {
  188. FirmwareVersion f2 = getFirmware(major,minor,patch,false,synthesizedFileName);
  189. knownVersions.put(synthesizedFileName,f2);
  190. }
  191. }
  192. patch--;
  193. if(patch<0)
  194. {
  195. patch=9;
  196. minor--;
  197. }
  198. if(minor<0)
  199. {
  200. minor=9;
  201. major--;
  202. }
  203. }/**/
  204. }
  205. private static FirmwareVersion getFirmware(int major, int minor, int patch, boolean hidden, String fwname) throws IOException {
  206. FirmwareVersion f = new FirmwareVersion();
  207. f.setFilename(fwname);
  208. f.setHidden(hidden);
  209. f.setMajor(major);
  210. f.setMinor(minor);
  211. f.setPatch(patch);
  212. File downloadFolderBase = new File(outfolder_base,"downloadstage");
  213. //if(true) return f;
  214. Utils.runTool(downloadFolderBase,
  215. "wget",
  216. "http://firmware.sena.com/senabluetoothmanager/"+fwname
  217. );
  218. System.err.println("New Version spotted:"+fwname); //intentionally a output. that should be mailed by the cron daemon if its
  219. File dlf = new File(downloadFolderBase,fwname);
  220. File dst = new File(outfolder_base,fwname);
  221. if(dlf.exists()&&!dst.exists())
  222. {
  223. f.setFiller(false);
  224. f.setServerCreationDate(new Date(dlf.lastModified()));
  225. Files.copy(dlf.toPath(),dst.toPath());
  226. if(IA_UPLOAD_ENABLED)
  227. {
  228. Utils.runTool(downloadFolderBase,
  229. "ia",
  230. "upload",
  231. "sena-firmware-files",
  232. "--no-derive",
  233. fwname
  234. );
  235. }
  236. }
  237. else
  238. {
  239. f.setFiller(true);
  240. f.setServerCreationDate(new Date(0));
  241. }
  242. return f;
  243. }
  244. }