buildModels.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #!/usr/bin/python3
  2. #
  3. import argparse
  4. import json
  5. import os
  6. import re
  7. # Some Data
  8. PREFIX = "gluon-ffho"
  9. VENDORS = {
  10. '8devices' : '8 Devices',
  11. 'aerohive' : 'Aerohive',
  12. 'a5' : 'A5',
  13. 'alfa-network' : 'Alfa Network',
  14. 'allnet' : 'Allnet',
  15. 'arcadyan' : 'Arcadyan',
  16. 'avm' : 'AVM',
  17. 'aruba' : 'Aruba',
  18. 'asus' : 'ASUS',
  19. 'buffalo' : 'Buffalo',
  20. 'cudy' : 'Cudy',
  21. 'd-link' : 'D-Link',
  22. 'devolo' : 'Devolo',
  23. 'egenius' : 'Egenius',
  24. 'enterasys' : 'Enterasys',
  25. 'extreme-networks' : 'Extreme Networks',
  26. 'friendlyelec' : 'Friendlyelec',
  27. 'gl' : 'GL',
  28. 'gl.inet' : 'GL.Inet',
  29. 'joy-it' : 'Joy It',
  30. 'lemaker' : 'Lemaker',
  31. 'linksys' : 'Linksys',
  32. 'mercusys' : 'Mercusys',
  33. 'mikrotik' : 'Mikrotik',
  34. 'netgear' : 'Netgear',
  35. 'nexx' : 'Nexx',
  36. 'ocedo' : 'Ocedo',
  37. 'onion' : 'Onion',
  38. 'openmesh' : 'Openmesh',
  39. 'plasma' : 'Plasma',
  40. 'ravpower' : 'RAVPower',
  41. 'raspberri-pi' : 'Raspberri Pi',
  42. 'siemens' : 'Siemens',
  43. 'sophos' : 'Sophos',
  44. 'teltonika' : 'Teltonika',
  45. 'tp-link' : 'TP-Link',
  46. 'ubiquiti' : 'Ubiquiti',
  47. 'ubnt' : 'UBNT',
  48. 'vocore' : 'Vocore',
  49. 'wd-my-net' : 'WD My Net',
  50. 'x86' : 'x86',
  51. 'xiaomi' : 'Xiaomi',
  52. 'zbt' : 'ZBT',
  53. 'zyxel' : 'Zyxel'
  54. }
  55. BLACKLIST_MODELS = [
  56. 'cpe510-v1.0',
  57. 'cpe510-v1.1',
  58. 'cpe520-v1.1',
  59. 'wbs510-v1.20',
  60. 'bullet-m5',
  61. 'nanostation-m5',
  62. 'nanostation-m5-xw',
  63. 'nanostation-loco-m5',
  64. 'nanostation-loco-m5-xw',
  65. 'rocket-m5',
  66. 'rocket-m5-ti',
  67. 'rocket-m5-xw',
  68. 'unifi-ac-mesh',
  69. 'unifi-ac-mesh-pro',
  70. 'unifiap-outdoor',
  71. 'unifiap-outdoor+'
  72. ]
  73. def longestPrefixKeyMatch(string, dictionary):
  74. maxlen = 0
  75. retval = None
  76. for key in dictionary:
  77. if string.startswith(key):
  78. if len(key) > maxlen:
  79. maxlen = len(key)
  80. retval = key
  81. return retval
  82. def vendorPP(vendor):
  83. if vendor in VENDORS:
  84. return VENDORS[vendor]
  85. else:
  86. return vendor
  87. def findFiles(directory):
  88. retval = {}
  89. for imtype in ['sysupgrade', 'factory', 'bootloader']:
  90. searchpath = directory + "/"+imtype+"/"
  91. if imtype == 'sysupgrade':
  92. pattern = PREFIX + "-(([0-9]+\.?)+)-(.+)-sysupgrade\.((img|bin|img.gz|ubi|chk|vdi|vmdk|tar))"
  93. elif imtype == 'bootloader':
  94. pattern = PREFIX + "-(([0-9]+\.?)+)-(.+)-bootloader\.((img|bin|img.gz|ubi|chk|vdi|vmdk|tar))"
  95. else:
  96. pattern = PREFIX + "-(([0-9]+\.?)+)-(.+)\.((img|bin|img.gz|ubi|chk|vdi|vmdk|tar))"
  97. for f in os.listdir(searchpath):
  98. m = re.search(pattern, f)
  99. if m:
  100. # extract info from filename
  101. file = m.group(0)
  102. firmware = m.group(3)
  103. imageversion = m.group(1)
  104. imagetype = m.group(4)
  105. vendor = 'Unknown'
  106. model = 'Unknown'
  107. vendor_key = longestPrefixKeyMatch(firmware, VENDORS)
  108. if vendor_key:
  109. vendor = VENDORS[vendor_key]
  110. n = re.search(vendor_key + "-(.+)$", firmware)
  111. if n:
  112. model = n.group(1)
  113. if model in BLACKLIST_MODELS:
  114. continue
  115. vendor = vendorPP(vendor)
  116. entry = {'vendor' : vendor,
  117. 'model' : model,
  118. 'file' : file
  119. }
  120. if vendor not in retval:
  121. retval.update({vendor : {}})
  122. if model not in retval[vendor]:
  123. retval[vendor].update({model : {}})
  124. retval[vendor][model].update({'modelname' : model , imtype : entry})
  125. return retval
  126. if __name__ == "__main__":
  127. parser = argparse.ArgumentParser(description='Build models.json file.')
  128. parser.add_argument('directory', help='Directory where the firmware files are')
  129. parser.add_argument('outputfile', help='Write output to file', nargs='?')
  130. args = parser.parse_args()
  131. data = findFiles(args.directory)
  132. if args.outputfile:
  133. with open(args.outputfile, "w") as fd:
  134. json.dump(data, fd, sort_keys=True)
  135. else:
  136. print(json.dumps(data, sort_keys=True))