file_fetcher.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import json
  2. import socket
  3. import sys
  4. import time
  5. from threading import Thread
  6. from bookworm.constants import RAW_FILE_BUCKET, REDIS_UNPACK_FILE, REDIS_FETCH_FILE
  7. from bookworm.logger import log, setup_logger
  8. from bookworm import s3
  9. import redis
  10. def netcat(filename, ip, port, size, job_key, s3client, redis):
  11. log.info('netcat: %s %d %d %s', ip, port, size, filename)
  12. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  13. log.info("Fetching %s", filename)
  14. s.connect((ip, port))
  15. log.info("Receiving file %s", filename)
  16. buff = b''
  17. count = 0
  18. last_perc = 0
  19. while True:
  20. data = s.recv(16384)
  21. if len(data) == 0:
  22. log.info("No data received - finished")
  23. break
  24. count += len(data)
  25. buff += data
  26. perc = int(100 * count / size)
  27. if perc % 5 == 0 and perc != last_perc:
  28. log.info("Download percentage: %d", perc)
  29. # TODO set_job_state(job_key, 'DOWNLOADING', "%d%%" % perc)
  30. last_perc = perc
  31. if count >= size:
  32. break
  33. log.info("Download complete")
  34. s.close()
  35. log.info("Putting file in s3")
  36. # TODO set_job_state(job_key, 'DOWNLOAD_DONE', job_key)
  37. s3client.put_object(Body=buff, Bucket=RAW_FILE_BUCKET, Key=job_key)
  38. log.info("File %s in s3 with key %s", filename, job_key)
  39. redis.rpush(REDIS_UNPACK_FILE, json.dumps({'job_key': job_key}))
  40. def main():
  41. r = redis.StrictRedis(host='localhost', port=6379)
  42. setup_logger()
  43. while True:
  44. log.info('Waiting for message...')
  45. topic, message = r.blpop(REDIS_FETCH_FILE)
  46. log.info('got message: %s', message)
  47. params = json.loads(message.decode('utf-8'))
  48. log.info('params for netcat: %s', params)
  49. params['s3client'] = s3.client()
  50. params['redis'] = r
  51. t = Thread(target=netcat, kwargs=params)
  52. t.daemon = True
  53. t.start()
  54. main()