1
|
#!/usr/bin/env python
|
2
|
# A DiGIR client
|
3
|
|
4
|
import os
|
5
|
import os.path
|
6
|
import sys
|
7
|
import urllib
|
8
|
import urllib2
|
9
|
|
10
|
sys.path.append(os.path.dirname(__file__)+"/../lib")
|
11
|
|
12
|
import dates
|
13
|
import opts
|
14
|
import streams
|
15
|
import util
|
16
|
|
17
|
# Config
|
18
|
timeout = 20 # sec
|
19
|
default_schema = 'http://digir.net/schema/conceptual/darwin/full/2003/1.0/darwin2full.xsd'
|
20
|
|
21
|
request_xml_template = '''\
|
22
|
<?xml version="1.0" encoding="UTF-8"?>
|
23
|
<request
|
24
|
xmlns="http://digir.net/schema/protocol/2003/1.0"
|
25
|
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
26
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
27
|
xmlns:digir="http://digir.net/schema/protocol/2003/1.0"
|
28
|
xmlns:darwin="http://digir.net/schema/conceptual/darwin/2003/1.0"
|
29
|
xmlns:dwc="http://digir.net/schema/conceptual/darwin/2003/1.0"
|
30
|
xsi:schemaLocation="http://digir.net/schema/protocol/2003/1.0
|
31
|
http://digir.sourceforge.net/schema/protocol/2003/1.0/digir.xsd
|
32
|
http://digir.net/schema/conceptual/darwin/2003/1.0
|
33
|
http://digir.sourceforge.net/schema/conceptual/darwin/2003/1.0/darwin2.xsd">
|
34
|
<header>
|
35
|
<version>1.0</version>
|
36
|
<sendTime>[time]</sendTime>
|
37
|
<source>[source]</source>
|
38
|
<destination resource="[resource]">[url]</destination>
|
39
|
<type>search</type>
|
40
|
</header>
|
41
|
<search>
|
42
|
<filter>
|
43
|
<equals>
|
44
|
<darwin:Kingdom>plantae</darwin:Kingdom>
|
45
|
</equals>
|
46
|
</filter>
|
47
|
<records limit="[count]" start="[start]">
|
48
|
<structure schemaLocation="[schema]"/>
|
49
|
</records>
|
50
|
<count>true</count>
|
51
|
</search>
|
52
|
</request>
|
53
|
'''
|
54
|
|
55
|
diags_start = '<diagnostics>'
|
56
|
diags_end = '</diagnostics>'
|
57
|
|
58
|
class InputException(Exception): pass
|
59
|
|
60
|
def main():
|
61
|
env_names = []
|
62
|
def usage_err():
|
63
|
raise SystemExit('Usage: '+opts.env_usage(env_names, True)+' '
|
64
|
+sys.argv[0]+' 2>>log')
|
65
|
|
66
|
# Get config from env vars
|
67
|
url = opts.get_env_var('url', None, env_names)
|
68
|
resource = opts.get_env_var('resource', None, env_names)
|
69
|
schema = opts.get_env_var('schema', default_schema, env_names)
|
70
|
start = util.cast(int, opts.get_env_var('start', 0, env_names))
|
71
|
count = util.cast(int, opts.get_env_var('n', 1, env_names))
|
72
|
debug = opts.env_flag('debug', False, env_names)
|
73
|
if url == None or resource == None: usage_err()
|
74
|
|
75
|
def clear_line(): sys.stderr.write('\n')
|
76
|
log_indent = 0
|
77
|
def log(msg, line_ending='\n'):
|
78
|
sys.stderr.write((' '*log_indent)+msg+line_ending)
|
79
|
def debug_log(str_, label=None):
|
80
|
if debug:
|
81
|
if label != None: sys.stderr.write(label+':\n')
|
82
|
sys.stderr.write(str_+'\n')
|
83
|
|
84
|
self_dir = os.path.dirname(__file__)
|
85
|
source = os.popen(self_dir+"/local_ip").read().strip()
|
86
|
this_request_xml_template = (request_xml_template
|
87
|
.replace('[source]', source)
|
88
|
.replace('[url]', url)
|
89
|
.replace('[resource]', resource)
|
90
|
.replace('[schema]', schema)
|
91
|
.replace('[count]', str(count))
|
92
|
)
|
93
|
|
94
|
time = dates.strftime('%Y-%m-%d %H:%M:%S %Z', dates.now())
|
95
|
request_xml = (this_request_xml_template
|
96
|
.replace('[start]', str(start))
|
97
|
.replace('[time]', time)
|
98
|
)
|
99
|
debug_log(request_xml, 'request')
|
100
|
this_url = url+'?'+urllib.urlencode({'request': request_xml})
|
101
|
diag_capture = streams.CaptureStream(streams.TimeoutInputStream(
|
102
|
urllib2.urlopen(this_url), timeout), diags_start, diags_end)
|
103
|
stream = streams.StreamIter(diag_capture)
|
104
|
|
105
|
try:
|
106
|
# Copy lines
|
107
|
for line in stream:
|
108
|
sys.stdout.write(line)
|
109
|
finally: # still run if break is called
|
110
|
stream.close()
|
111
|
|
112
|
debug_log(diag_capture.match, 'diagnostics')
|
113
|
|
114
|
main()
|