emulabclient.py.in 2.79 KB
Newer Older
1 2
#! /usr/bin/env python
#
3
# Copyright (c) 2004-2010 University of Utah and the Flux Group.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
# 
# {{{EMULAB-LICENSE
# 
# This file is part of the Emulab network testbed software.
# 
# This file is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or (at
# your option) any later version.
# 
# This file is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public
# License for more details.
# 
# You should have received a copy of the GNU Affero General Public License
# along with this file.  If not, see <http://www.gnu.org/licenses/>.
# 
# }}}
23
#
24
import re
25 26 27 28
import sys
import socket
import os
import getopt
29
import string
30

Leigh Stoller's avatar
Leigh Stoller committed
31
# Maximum size of an NS file that the server will accept. 
32 33 34 35
MAXNSFILESIZE = (1024 * 512)

#
# This class defines a simple structure to return back to the caller.
36 37 38 39 40 41 42
# 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
43
# converted to a hashed array (Python Dictionary), but using a class gives
44 45 46
# us a ready made constructor.
#
# WARNING: If you change this stuff, also change libxmlrpc.pm in this dir.
47
#
48 49 50 51 52 53 54
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
55
RESPONSE_REFUSED        = 7  # Emulab is down, try again later.
56
RESPONSE_TIMEDOUT       = 8
57

58
class EmulabResponse:
59
    def __init__(self, code, value=0, output=""):
60 61
        self.code     = code            # A RESPONSE code
        self.value    = value           # A return value; any valid XML type.
62 63 64
        self.output   = re.sub(         # Pithy output to print
            r'[^' + re.escape(string.printable) + ']', "", output)
        
65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
        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