Project

General

Profile

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()
(7-7/40)