Skip to content

SAGA Tutorial Part 4: Adding File Transfer

GrayIsTheMood edited this page Oct 11, 2012 · 20 revisions

This page is part of the SAGA Tutorial.

Overview / Background

Another important feature of SAGA is its (remote) file and directory handling capabilities. These capabilities are packaged in the bliss.saga.filesystem module (API Doc). Two main classes are defined in this module:

  • The filesystem.File class (API Doc) provides a handle to a (remote) file.
  • The filesystem.Directory class (API Doc) provides a handle to a (remote) directory.

Together, these two classes can be used to traverse and modify local and remote filesystems. Currently (v. 0.2.4), SAGA supports the SFTP protocol, but other protocol plug-ins are under development.

Hands-On: Listing a Remote Directory

NOTE: For security reasons, SAGA does not support SSH authentication via plain username/password. In order to use the sftp plug-in with remote machines, it is hence necessary to set-up public-key-based ssh-keychain access to the remote hosts you want to use. For this tutorial, we use localhost for the sake of simplicity. If you need help setting up your ssh key, please check our ([guide to configuring SSH Password-Less Login]https://github.com/saga-project/BigJob/wiki/Configuration-of-SSH-for-Password-less-Authentication)

In your $HOME directory, open a new file saga_example_2.py with your favorite editor (e.g., vim) and paste the following content:

import os, sys, getpass
import bliss.saga as saga

def main():

    try:
        # create a new subdirectory in /tmp/
        tmp = saga.filesystem.Directory("sftp://localhost/tmp")
        mydir = tmp.open_dir(getpass.getuser(), saga.filesystem.Create)

        # copy this python file to the newly created directory 
        thisfile = saga.filesystem.File("sftp://localhost/"+os.path.abspath(__file__))
        thisfile.copy(str(mydir.get_url()))
        # copy another file
        motdfile = saga.filesystem.File("sftp://localhost/etc/motd")
        motdfile.copy(mydir.get_url())

        # list the directory content
        for entry in mydir.list():
            file = saga.filesystem.File(str(mydir.get_url())+"/"+entry)
            print "%s (%s bytes)" % (file.get_url(), file.get_size())

        # finally, remove the directory 
        mydir.remove()

    except saga.Exception, ex:
        print "An error occured during file operation: %s" % (str(ex))
        sys.exit(-1)

if __name__ == "__main__":
    main()

Save the file and execute it via the python interpreter (make sure your virtualenv is activated):

python saga_example_2.py

The output should look something like this:

sftp://localhost/tmp/yourusername//saga_example_2.py (1029 bytes)
sftp://localhost/tmp/yourusername//motd (1758 bytes)