-
Notifications
You must be signed in to change notification settings - Fork 16
CHC SFTP Downloads #352
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CHC SFTP Downloads #352
Changes from 6 commits
17bc7ab
e4343fc
638c578
571d51d
f115859
6d789d8
b310fd9
b27f6da
c8fe35f
7248fb4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
""" | ||
Downloads files modified in the last 24 hours from the specified ftp server.""" | ||
|
||
# standard | ||
import datetime | ||
import functools | ||
import sys | ||
from os import path | ||
|
||
# third party | ||
import paramiko | ||
|
||
|
||
def print_callback(filename, bytes_so_far, bytes_total): | ||
"""Log file transfer progress""" | ||
rough_percent_transferred = int(100 * (bytes_so_far / bytes_total)) | ||
if (rough_percent_transferred % 25) == 0: | ||
print(f'{filename} transfer: {rough_percent_transferred}%') | ||
|
||
|
||
def get_files_from_dir(sftp, out_path): | ||
"""Download files from sftp server that have been uploaded in last day | ||
Args: | ||
sftp: SFTP Session from Paramiko client | ||
out_path: Path to local directory into which to download the files | ||
""" | ||
|
||
current_time = datetime.datetime.now() | ||
|
||
# go through files in recieving dir | ||
filepaths_to_download = {} | ||
for fileattr in sftp.listdir_attr(): | ||
file_time = datetime.datetime.fromtimestamp(fileattr.st_mtime) | ||
filename = fileattr.filename | ||
if current_time - file_time < datetime.timedelta(days=1) and \ | ||
not path.exists(filename): | ||
chinandrew marked this conversation as resolved.
Show resolved
Hide resolved
|
||
filepaths_to_download[filename] = path.join(out_path, filename) | ||
|
||
# make sure we don't download more than 2 files per day | ||
assert len(filepaths_to_download) <= 2, "more files dropped than expected" | ||
|
||
# download! | ||
for infile, outfile in filepaths_to_download.items(): | ||
callback_for_filename = functools.partial(print_callback, infile) | ||
sftp.get(infile, outfile, callback=callback_for_filename) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. callback is cool, didn't know of this feature in paramiko |
||
|
||
|
||
def download(out_path, ftp_conn): | ||
"""Downloads files necessary to create CHC signal from ftp server. | ||
Args: | ||
out_path: Path to local directory into which to download the files | ||
ftp_conn: Dict containing login credentials to ftp server | ||
""" | ||
|
||
# open client | ||
try: | ||
client = paramiko.SSHClient() | ||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | ||
|
||
client.connect(ftp_conn["host"], username=ftp_conn["user"], | ||
password=ftp_conn["pass"][1:] + ftp_conn["pass"][0], | ||
port=ftp_conn["port"], | ||
allow_agent=False, look_for_keys=False) | ||
sftp = client.open_sftp() | ||
|
||
sftp.chdir('/dailycounts/All_Outpatients_By_County') | ||
get_files_from_dir(sftp, out_path) | ||
|
||
sftp.chdir('/dailycounts/Covid_Outpatients_By_County') | ||
get_files_from_dir(sftp, out_path) | ||
|
||
finally: | ||
if client: | ||
client.close() |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,6 +14,7 @@ | |
from delphi_utils import read_params | ||
|
||
# first party | ||
from .download_ftp_files import download | ||
from .update_sensor import CHCSensorUpdator | ||
|
||
|
||
|
@@ -25,6 +26,10 @@ def run_module(): | |
|
||
logging.basicConfig(level=logging.DEBUG) | ||
|
||
## download recent files from FTP server | ||
logging.info("downloading recent files through SFTP") | ||
download(params["cache_dir"], params["ftp_conn"]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can this be mocked out for testing? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. +1 |
||
|
||
## get end date from input file | ||
# the filenames are expected to be in the format: | ||
# Denominator: "YYYYMMDD_All_Outpatients_By_County.dat.gz" | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -11,7 +11,8 @@ | |
"delphi-utils", | ||
"covidcast", | ||
"boto3", | ||
"moto" | ||
"moto", | ||
"paramiko" | ||
] | ||
|
||
setup( | ||
|
Uh oh!
There was an error while loading. Please reload this page.