espupload.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. #!/usr/bin/python
  2. #
  3. # espupload by Theo Arends - 20170103
  4. #
  5. # Uploads binary file to OTA server
  6. #
  7. # Execute: espupload -i <Host_IP_address> -p <Host_port> -f <sketch.bin>
  8. #
  9. # Needs pycurl
  10. # - pip install pycurl
  11. import sys
  12. import os
  13. import optparse
  14. import logging
  15. import pycurl
  16. HOST_ADDR = "domus1"
  17. HOST_PORT = 80
  18. HOST_URL = "/api/upload-arduino.php"
  19. def upload(hostAddr, hostPort, filename):
  20. url = 'http://%s:%d%s' % (hostAddr, hostPort, HOST_URL)
  21. c = pycurl.Curl()
  22. c.setopt(c.URL, url)
  23. # The "Expect:" is there to suppress "Expect: 100-continue" behaviour that is
  24. # the default in libcurl when posting large bodies (and fails on lighttpd).
  25. c.setopt(c.HTTPHEADER, ["Expect:"])
  26. c.setopt(c.HTTPPOST, [('file', (c.FORM_FILE, filename, )), ])
  27. c.perform()
  28. c.close()
  29. def parser():
  30. parser = optparse.OptionParser(
  31. usage = "%prog [options]",
  32. description = "Upload image to over the air Host server for the esp8266 module with OTA support."
  33. )
  34. # destination ip and port
  35. group = optparse.OptionGroup(parser, "Destination")
  36. group.add_option("-i", "--host_ip",
  37. dest = "host_ip",
  38. action = "store",
  39. help = "Host IP Address.",
  40. default = HOST_ADDR
  41. )
  42. group.add_option("-p", "--host_port",
  43. dest = "host_port",
  44. type = "int",
  45. help = "Host server ota Port. Default 80",
  46. default = HOST_PORT
  47. )
  48. parser.add_option_group(group)
  49. # image
  50. group = optparse.OptionGroup(parser, "Image")
  51. group.add_option("-f", "--file",
  52. dest = "image",
  53. help = "Image file.",
  54. metavar="FILE",
  55. default = None
  56. )
  57. parser.add_option_group(group)
  58. # output group
  59. group = optparse.OptionGroup(parser, "Output")
  60. group.add_option("-d", "--debug",
  61. dest = "debug",
  62. help = "Show debug output. And override loglevel with debug.",
  63. action = "store_true",
  64. default = False
  65. )
  66. parser.add_option_group(group)
  67. (options, args) = parser.parse_args()
  68. return options
  69. # end parser
  70. def main(args):
  71. # get options
  72. options = parser()
  73. # adapt log level
  74. loglevel = logging.WARNING
  75. if (options.debug):
  76. loglevel = logging.DEBUG
  77. # end if
  78. # logging
  79. logging.basicConfig(level = loglevel, format = '%(asctime)-8s [%(levelname)s]: %(message)s', datefmt = '%H:%M:%S')
  80. logging.debug("Options: %s", str(options))
  81. if (not options.host_ip or not options.image):
  82. logging.critical("Not enough arguments.")
  83. return 1
  84. # end if
  85. if not os.path.exists(options.image):
  86. logging.critical('Sorry: the file %s does not exist', options.image)
  87. return 1
  88. # end if
  89. upload(options.host_ip, options.host_port, options.image)
  90. # end main
  91. if __name__ == '__main__':
  92. sys.exit(main(sys.argv))
  93. # end if