0
|
1 #!/usr/bin/env python
|
|
2 """
|
|
3 xenaUtils: a set of python utilities for the Galaxy / Xena interface
|
|
4 """
|
|
5
|
|
6 import os
|
|
7 import socket
|
|
8 import subprocess
|
|
9
|
|
10 def jarPath():
|
|
11 """Return the full pathname of the xena jar file"""
|
|
12 jarPath = os.getenv("XENA_JAR_PATH", "~")
|
|
13 return(os.path.join(jarPath, "xena.jar"))
|
|
14
|
|
15
|
|
16 def baseDir():
|
|
17 return(os.getenv("XENA_BASE_DIR", "/tmp"))
|
|
18
|
|
19 def fileDir():
|
|
20 return(baseDir() + "/files")
|
|
21
|
|
22 def isRunning(xenaPort):
|
|
23 """Determine if Xena is running on the specified port"""
|
|
24 query = "wget -q -O- http://localhost:%s/data/'(+ 1 2)'" % xenaPort
|
|
25 try:
|
|
26 result = subprocess.check_output(query, shell=True)
|
|
27 except:
|
|
28 return False
|
|
29 else:
|
|
30 return(result == "3.0")
|
|
31
|
|
32
|
|
33 def findUnusedPort():
|
|
34 """Find a random port that is available on the local system, and return
|
|
35 the port number.
|
|
36 """
|
|
37 ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
38 ss.bind(('', 0))
|
|
39 portNumber = ss.getsockname()[1]
|
|
40 ss.close()
|
|
41 return(portNumber)
|
|
42
|
|
43 def isPortAvailable(port):
|
|
44 """Test if a given port is available"""
|
|
45 ss = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
46 try:
|
|
47 ss.bind(('', port))
|
|
48 except:
|
|
49 return False
|
|
50 else:
|
|
51 ss.close()
|
|
52 return True
|
|
53
|
|
54
|
|
55 def portFilename():
|
|
56 """ Return the name of the file with the port of the running Xena,
|
|
57 if any
|
|
58 """
|
|
59 xenaBaseDir = os.getenv("XENA_BASE_DIR", "~")
|
|
60 xenaPortFilename = xenaBaseDir + "/xena.port"
|
|
61 return(xenaPortFilename)
|
|
62
|
|
63
|
|
64
|
|
65
|
|
66 def port(testIfAvailable=False, findNewPort=False):
|
|
67 preferredXenaPort = 7220
|
|
68 xenaPort = None
|
|
69 xenaPortFname = portFilename()
|
|
70 if os.path.exists(xenaPortFname):
|
|
71 fp = open(xenaPortFname)
|
|
72 line = fp.readline()
|
|
73 xenaPort = int(line.rstrip())
|
|
74 if testIfAvailable and not isRunning(xenaPort):
|
|
75 # Xena is not running on the port. Make sure that
|
|
76 # the port is not occupied by some other process
|
|
77 if not isPortAvailable(xenaPort):
|
|
78 #cmd = "lsof -t -i :%s -sTCP:LISTEN" % portID
|
|
79 #pid = subprocess.check_output(cmd, shell=True).rstrip()
|
|
80 #print "not available, used by",pid
|
|
81 xenaPort = None
|
|
82 if findNewPort and xenaPort == None:
|
|
83 if isPortAvailable(preferredXenaPort):
|
|
84 xenaPort = preferredXenaPort
|
|
85 else:
|
|
86 xenaPort = findUnusedPort()
|
|
87 fp = open(portFilename(), "w")
|
|
88 fp.write("%d\n" % xenaPort)
|
|
89 fp.close()
|
|
90 return(xenaPort)
|
|
91
|
|
92 def cleanUpPort():
|
|
93 """ Clean up the port file after Xena has stopped running"""
|
|
94 os.unlink(portFilename())
|
|
95
|
|
96
|
|
97
|