Scripting with pshell

Overview

If you have a supercomputing allocation, then your workflow may involve some of these steps.

There are two ways of executing pshell commands non-interactively:

  • a single command to run
  • a series of sequential commands supplied via an input script

iblis:~/dev/mfclient> python pshell -h
usage: pshell [-h] [-c CONFIG] [-i SCRIPT] [-d] [command]

pshell help

positional arguments:
  command     a single command to execute

optional arguments:
  -h, --help  show this help message and exit
  -c CONFIG   the server in $HOME/.mf_config to connect to
  -i SCRIPT   input text file containing commands
  -d          turns debugging on


The delegate command is intended for performing automated authentication in the context of a (non-interactive) submitted job.

This means that pshell commands can be run without the need to type in username and password, within the lifetime of the delegate (default 7 days.)


Exercises

Exercise 1 - create a delegate and check that pshell is using it.

This exercise can only be done when logged in with a Pawsey username and password. Delegate identities are not allowed to create further delegates.

Perform the following:
  • run pshell and log in using your Pawsey credentials
  • examine your identity
  • create a delegate
  • exit and restart pshell
  • check your identity


 Solution to exercise 1
iblis:~/dev/mfclient> python pshell
Reading config [/Users/sean/.mf_config]
 === pshell: type 'help' for a list of commands ===
pawsey:offline>login
Username: sean
Password: 

pawsey:/projects>whoami
actor = ivec:sean
  role = ivec
  role = user
  role = Data Team:administer

pawsey:/projects>delegate
Delegating until: 30-May-2017 16:31:10

pawsey:/projects>exit
iblis:~/dev/mfclient> pshell
Reading config [/Users/sean/.mf_config]
 === pshell: type 'help' for a list of commands ===

pawsey:/projects>whoami
actor = delegate
  role = ivec:sean
  role = ivec


Exercise 2 - running commands from the shell

Run pshell from the command line to:

  • check your identity,
  • list the contents of the /projects/Data Team/testfiles remote folder,
  • download a single file.
 Solution to exercise 2
iblis:~> python pshell whoami
Reading config [/Users/sean/.mf_config]
actor = delegate
  role = Data Team:readonly
  role = Demo:readwrite
  role = ivec


iblis:~> python pshell "ls /projects/Data Team/testfiles"
Reading config [/Users/sean/.mf_config]
31 items, 29 items per page, remote folder: /projects/Data Team/testfiles
 69776098   | online  |     17 KB | i000769.jpg
 69776099   | online  |  17.02 KB | i000765.jpg
 69776100   | online  |  17.69 KB | i000771.jpg
 69776101   | online  |  17.21 KB | i000767.jpg
etc


iblis:~> python pshell "get /projects/Data Team/testfiles/i000769.jpg"
Reading config [/Users/sean/.mf_config]
Total files=1, transferring ...  
Progress=100%, rate=0.0 MB/s  Completed.


Exercise 3 - script a task to download a file in your directory.

Perform the following:

  • create a text file to change into the /projects/Data Team/testfiles directory and download a file
  • use this script as input to pshell
 Solution to exercise 3

Create a plain text file script1.txt containing:

cd Data Team/testfiles
get i000769.jpg

Then do:

iblis:~> python pshell -i script1.txt
Reading config [/Users/sean/.mf_config]
input> cd Data Team/sean

Remote: /projects/Data Team
input> get i000769.jpg

Total files=1, transferring ...  
Progress=100%, rate=0.0 MB/s  Completed.


Exercise 4 - script a task that attempts to perform something that will fail (eg remove a directory that doesn't exist) and correctly report that the script encountered an error.

Perform the following:

  • write a shell (eg bash) script to run a single pshell command to remove the remote folder /idontexist
  • based on the exit code being 0 if successful and non 0 on failure, report that there was a problem
 Solution to exercise 4

Run the following script if you have bash ... sorry Windows users (without WSL.)

#!/bin/bash

python pshell "rmdir /idontexist"

if [ $? == 0 ]; then
   echo "All good - proceed further!"
else
   echo "Operation failed!"
fi

Which produces:

Error from server: The namespace '/idontexist' does not exist or is not accessible
Operation failed!

This would typically be a job script on (eg) Pawsey HPC - where you would be doing all such work in a Linux environment and probably using the bash shell.

The idea is that if something in your data setup pipeline fails - abort straight away and don't waste any valuable cpu time on it.