emulabclient.py.in 2.58 KB
Newer Older
1 2 3
#! /usr/bin/env python
#
# EMULAB-COPYRIGHT
4
# Copyright (c) 2004-2010 University of Utah and the Flux Group.
5 6
# All rights reserved.
#
7 8 9 10 11 12 13 14 15
# Permission to use, copy, modify and distribute this software is hereby
# granted provided that (1) source code retains these copyright, permission,
# and disclaimer notices, and (2) redistributions including binaries
# reproduce the notices in supporting documentation.
#
# THE UNIVERSITY OF UTAH ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
# CONDITION.  THE UNIVERSITY OF UTAH DISCLAIMS ANY LIABILITY OF ANY KIND
# FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
#
16
import re
17 18 19 20
import sys
import socket
import os
import getopt
21
import string
22

Leigh Stoller's avatar
Leigh Stoller committed
23
# Maximum size of an NS file that the server will accept. 
24 25 26 27
MAXNSFILESIZE = (1024 * 512)

#
# This class defines a simple structure to return back to the caller.
28 29 30 31 32 33 34
# It includes a basic response code (success, failure, badargs, etc),
# as well as a return "value" which can be any valid datatype that can
# be represented in XML (int, string, hash, float, etc). You can also
# send back some output (a string with embedded newlines) to print out
# to the user.
#
# Note that XMLRPC does not actually return a "class" to the caller; It gets
Leigh Stoller's avatar
Leigh Stoller committed
35
# converted to a hashed array (Python Dictionary), but using a class gives
36 37 38
# us a ready made constructor.
#
# WARNING: If you change this stuff, also change libxmlrpc.pm in this dir.
39
#
40 41 42 43 44 45 46
RESPONSE_SUCCESS        = 0
RESPONSE_BADARGS        = 1
RESPONSE_ERROR          = 2
RESPONSE_FORBIDDEN      = 3
RESPONSE_BADVERSION     = 4
RESPONSE_SERVERERROR    = 5
RESPONSE_TOOBIG         = 6
Timothy Stack's avatar
Timothy Stack committed
47
RESPONSE_REFUSED        = 7  # Emulab is down, try again later.
48
RESPONSE_TIMEDOUT       = 8
49

50
class EmulabResponse:
51
    def __init__(self, code, value=0, output=""):
52 53
        self.code     = code            # A RESPONSE code
        self.value    = value           # A return value; any valid XML type.
54 55 56
        self.output   = re.sub(         # Pithy output to print
            r'[^' + re.escape(string.printable) + ']', "", output)
        
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
        return

#
# Read an nsfile and return a single string. 
#
def readnsfile(nsfilename, debug):
    nsfilestr  = ""
    try:
        fp = os.open(nsfilename, os.O_RDONLY)

        while True:
	    str = os.read(fp, 1024)

            if not str:
                break
            nsfilestr = nsfilestr + str
            pass

        os.close(fp)

    except:
        if debug:
            print "%s:%s" % (sys.exc_type, sys.exc_value)
            pass

        print "batchexp: Cannot read NS file '" + nsfilename + "'"
        return None
        pass

    return nsfilestr