@@ -2412,6 +2412,55 @@ def __init__(self, infields=None, outfields=None, **kwargs):
24122412 and self .inputs .template [- 1 ] != '$' ):
24132413 self .inputs .template += '$'
24142414
2415+ def _get_files_over_ssh (self , template ):
2416+ """Get the files matching template over an SSH connection."""
2417+ # Connect over SSH
2418+ client = self ._get_ssh_client ()
2419+ sftp = client .open_sftp ()
2420+ sftp .chdir (self .inputs .base_directory )
2421+
2422+ # Get all files in the dir, and filter for desired files
2423+ template_dir = os .path .dirname (template )
2424+ template_base = os .path .basename (template )
2425+ filelist = sftp .listdir (template_dir )
2426+ if self .inputs .template_expression == 'fnmatch' :
2427+ outfiles = fnmatch .filter (filelist , template_base )
2428+ elif self .inputs .template_expression == 'regexp' :
2429+ regexp = re .compile (template_base )
2430+ outfiles = list (filter (regexp .match , filelist ))
2431+ else :
2432+ raise ValueError ('template_expression value invalid' )
2433+
2434+ if len (outfiles ) == 0 :
2435+ # no files
2436+ msg = 'Output key: %s Template: %s returned no files' % (
2437+ key , template )
2438+ if self .inputs .raise_on_empty :
2439+ raise IOError (msg )
2440+ else :
2441+ warn (msg )
2442+
2443+ # return value
2444+ outfiles = None
2445+
2446+ else :
2447+ # found files, sort and save to outputs
2448+ if self .inputs .sort_filelist :
2449+ outfiles = human_order_sorted (outfiles )
2450+
2451+ # actually download the files, if desired
2452+ if self .inputs .download_files :
2453+ for f in outfiles :
2454+ try :
2455+ sftp .get (os .path .join (template_dir , f ), f )
2456+ except IOError :
2457+ iflogger .info ('remote file %s not found' % f )
2458+
2459+ # return value
2460+ outfiles = list_to_filename (outfiles )
2461+
2462+ return outfiles
2463+
24152464 def _list_outputs (self ):
24162465 try :
24172466 paramiko
@@ -2441,39 +2490,7 @@ def _list_outputs(self):
24412490 template = self .inputs .field_template [key ]
24422491
24432492 if not args :
2444- # Connect over SSH
2445- client = self ._get_ssh_client ()
2446- sftp = client .open_sftp ()
2447-
2448- # Get the files in the base dir, and filter for desired files
2449- sftp .chdir (self .inputs .base_directory )
2450- filelist = sftp .listdir ()
2451- if self .inputs .template_expression == 'fnmatch' :
2452- filelist = fnmatch .filter (filelist , template )
2453- elif self .inputs .template_expression == 'regexp' :
2454- regexp = re .compile (template )
2455- filelist = list (filter (regexp .match , filelist ))
2456- else :
2457- raise ValueError ('template_expression value invalid' )
2458-
2459- if len (filelist ) == 0 :
2460- # no files
2461- msg = 'Output key: %s Template: %s returned no files' % (
2462- key , template )
2463- if self .inputs .raise_on_empty :
2464- raise IOError (msg )
2465- else :
2466- warn (msg )
2467- else :
2468- # found files, sort and save to outputs
2469- if self .inputs .sort_filelist :
2470- filelist = human_order_sorted (filelist )
2471- outputs [key ] = list_to_filename (filelist )
2472-
2473- # actually download the files, if desired
2474- if self .inputs .download_files :
2475- for f in filelist :
2476- sftp .get (f , f )
2493+ outputs [key ] = self ._get_files_over_ssh (template )
24772494
24782495 for argnum , arglist in enumerate (args ):
24792496 maxlen = 1
@@ -2509,49 +2526,7 @@ def _list_outputs(self):
25092526 ": Template %s failed to convert with args %s"
25102527 % (template , str (tuple (argtuple ))))
25112528
2512- # Connect over SSH
2513- client = self ._get_ssh_client ()
2514- sftp = client .open_sftp ()
2515- sftp .chdir (self .inputs .base_directory )
2516-
2517- # Get all files in the dir, and filter for desired files
2518- filledtemplate_dir = os .path .dirname (filledtemplate )
2519- filledtemplate_base = os .path .basename (filledtemplate )
2520- filelist = sftp .listdir (filledtemplate_dir )
2521- if self .inputs .template_expression == 'fnmatch' :
2522- outfiles = fnmatch .filter (filelist ,
2523- filledtemplate_base )
2524- elif self .inputs .template_expression == 'regexp' :
2525- regexp = re .compile (filledtemplate_base )
2526- outfiles = list (filter (regexp .match , filelist ))
2527- else :
2528- raise ValueError ('template_expression value invalid' )
2529-
2530- if len (outfiles ) == 0 :
2531- msg = 'Output key: %s Template: %s returned no files' % (
2532- key , filledtemplate )
2533-
2534- # no files
2535- if self .inputs .raise_on_empty :
2536- raise IOError (msg )
2537- else :
2538- warn (msg )
2539- outputs [key ].append (None )
2540- else :
2541- # found files, sort and save to outputs
2542- if self .inputs .sort_filelist :
2543- outfiles = human_order_sorted (outfiles )
2544- outputs [key ].append (list_to_filename (outfiles ))
2545-
2546- # actually download the files, if desired
2547- if self .inputs .download_files :
2548- for f in outfiles :
2549- try :
2550- sftp .get (
2551- os .path .join (filledtemplate_dir , f ), f )
2552- except IOError :
2553- iflogger .info ('remote file %s not found' ,
2554- f )
2529+ outputs [key ].append (self ._get_files_over_ssh (filledtemplate ))
25552530
25562531 # disclude where there was any invalid matches
25572532 if any ([val is None for val in outputs [key ]]):
0 commit comments