source: trunk/src/ecmwf.py

Last change on this file was 204, checked in by pinsard, 10 years ago

fix thanks to coding rules; typo

  • Property svn:keywords set to URL Id
File size: 3.2 KB
Line 
1#!/usr/bin/env python
2# -*- coding: iso-8859-1 -*-
3
4__docformat__ = "restructuredtext en"
5__version__ = '$Id$'
6
7"""
8DESCRIPTION
9===========
10
11Toolbox to access to ECMWF server
12
13SEE ALSO
14========
15
16called by get_erai.py (experimental)
17
18EVOLUTIONS
19==========
20
21$Id$
22
23$URL$
24
25- fplod 20111130T153147Z cratos (Linux)
26
27  * got from http://data-portal.ecmwf.int/data/d/token/interim_full_daily/
28  * add docstring
29
30"""
31import urllib
32import urllib2
33import time
34import datetime
35
36class ECMWFDataServer:
37    def __init__(self,portal,token,email):
38        self.version = '0.3'
39        self.portal  = portal
40        self.token   = token
41        self.email   = email
42
43    def _call(self,action,args):
44
45        params = {'_token'   : self.token,
46                  '_email'   : self.email,
47                  '_action'  : action,
48                  '_version' : self.version}
49        params.update(args)
50
51        data = urllib.urlencode(params)
52        req = urllib2.Request(self.portal, data)
53        response = urllib2.urlopen(req)
54
55        json = response.read();
56
57        undef = None;
58        json = eval(json)
59
60        if json != None:
61            if 'error' in json:
62                raise RuntimeError(json['error'])
63            if 'message' in json:
64                self.put(json['message'])
65
66        return json
67
68    def put(self,*args):
69        print datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
70        for a in args:
71            print a,
72        print
73
74    def retrieve(self,args):
75        self.put("ECMWF data server batch tool version",self.version);
76        user = self._call("user_info",{});
77        self.put("Welcome to",user['name'], "from" , user['organisation']);
78
79        r = self._call('retrieve',args)
80        rid = r['request']
81
82        last  = ''
83        sleep = 0
84        while r['status'] != 'complete' and r['status'] != 'aborted':
85            text = r['status'] + '.'
86            if 'info' in r and r['info'] != None:
87                text = text + ' ' + r['info']
88
89            if text != last:
90                self.put("Request",text)
91                last = text
92
93            time.sleep(sleep)
94            r = self._call('status',{'request':rid})
95            if sleep < 60:
96                sleep = sleep + 1
97
98        if r['status'] != last:
99            self.put("Request",r['status'])
100
101        if 'reason' in r:
102            for m in r['reason']:
103                self.put(m)
104
105        if 'result' in r:
106            size = long(r['size'])
107            self.put("Downloading",self._bytename(size))
108            done = self._transfer(r['result'],args['target'])
109            self.put("Done")
110            if done != size:
111                raise RuntimeError("Size mismatch: " + str(done) + " and " + str(size))
112
113        self._call('delete',{'request':rid})
114
115        if r['status'] == 'aborted':
116            raise RuntimeError("Request aborted")
117
118    def _transfer(self,url,path):
119        result =  urllib.urlretrieve(url,path)
120        return long(result[1]['content-length'])
121
122    def _bytename(self,size):
123        next = {'':'K','K':'M','M':'G','G':'T','T':'P'}
124        l    = ''
125        size = size*1.0
126        while 1024 < size:
127            l = next[l]
128            size = size / 1024
129        return "%g %sbyte%s" % (size,l,'s')
130
Note: See TracBrowser for help on using the repository browser.