Mercurial > farol > farol
annotate farol/cache.py @ 178:e46fb0027e52 tip
Added tag 1.1.1 for changeset ae584cfe6252
author | Benoît Allard <benoit.allard@greenbone.net> |
---|---|
date | Thu, 08 Jan 2015 14:37:57 +0100 |
parents | 8a9fdf02bf5b |
children |
rev | line source |
---|---|
0 | 1 # -*- encoding: utf-8 -*- |
2 # Description: | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
3 # Web stuff related to the cache. |
0 | 4 # |
5 # Authors: | |
6 # BenoƮt Allard <benoit.allard@greenbone.net> | |
7 # | |
8 # Copyright: | |
9 # Copyright (C) 2014 Greenbone Networks GmbH | |
10 # | |
11 # This program is free software; you can redistribute it and/or | |
12 # modify it under the terms of the GNU General Public License | |
13 # as published by the Free Software Foundation; either version 2 | |
14 # of the License, or (at your option) any later version. | |
15 # | |
16 # This program is distributed in the hope that it will be useful, | |
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 # GNU General Public License for more details. | |
20 # | |
21 # You should have received a copy of the GNU General Public License | |
22 # along with this program; if not, write to the Free Software | |
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
24 | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
25 """\ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
26 The caching stuff ... |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
27 """ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
28 |
0 | 29 import os |
30 | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
31 from flask import (Blueprint, current_app, session, flash, redirect, url_for, |
16
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
32 render_template, request, abort) |
0 | 33 from werkzeug import secure_filename |
34 | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
35 from farolluz.parsers.cvrf import parse |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
36 from farolluz.renderer import render |
0 | 37 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
38 from .session import get_current, set_current, del_current, has_current, document_required |
0 | 39 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
40 mod = Blueprint('cache', __name__) |
3
3478e20885fd
Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
41 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
42 def caching_type(): |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
43 """\ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
44 Returns the type of caching we are using: |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
45 None, 'session' or 'global' |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
46 """ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
47 c_type = current_app.config.get('CACHING', 'global') |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
48 return {'disabled': None}.get(c_type, c_type) |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
49 |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
50 def _caching_dir(): |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
51 """\ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
52 Returns the current caching directory |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
53 """ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
54 c_type = caching_type() |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
55 if c_type is None: return None |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
56 root_dir = current_app.config.get('CACHE_DIRECTORY', |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
57 os.path.join(current_app.instance_path, '_cache')) |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
58 if c_type == 'global': return root_dir |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
59 uid = session.get('id') |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
60 # No uid yet, so no cache ... |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
61 if uid is None: return None |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
62 return os.path.join(root_dir, uid.hex) |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
63 |
0 | 64 def cache_content(): |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
65 """\ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
66 The content of the cache |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
67 """ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
68 dirname = _caching_dir() |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
69 if dirname is None: return [] |
0 | 70 if not os.path.exists(dirname): |
1
63b00c10ada8
Add Configuration support, warning when in DEBUG mode, and Deployment instruction
Benoît Allard <benoit.allard@greenbone.net>
parents:
0
diff
changeset
|
71 os.makedirs(dirname) |
0 | 72 l = [] |
73 for path in os.listdir(dirname): | |
74 name, ext = os.path.splitext(path) | |
75 if ext == '.xml': | |
76 l.append(name) | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
77 return l |
8
2ce3676c9b2e
Ease the import of new documents
Benoît Allard <benoit.allard@greenbone.net>
parents:
7
diff
changeset
|
78 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
79 def cleanup_cache(): |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
80 """\ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
81 Remove old documents ... maybe ... from time to time ... |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
82 """ |
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
83 pass |
0 | 84 |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
85 @mod.route('/save', methods=['GET', 'POST']) |
0 | 86 @document_required |
87 def save(): | |
16
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
88 if caching_type() is None: |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
89 current_app.logger.warning('Tried to save although caching is disabled.') |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
90 flash('This version does not allow you to save your document !', 'danger') |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
91 abort(403) |
0 | 92 if request.method != 'POST': |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
93 return render_template('cache/save.j2', |
33
752b8bfe0baf
Use FarolLuz method to get a document ID (increase dependency version)
Benoît Allard <benoit.allard@greenbone.net>
parents:
16
diff
changeset
|
94 id_=get_current().getDocId()) |
0 | 95 # Get some kind of filename, and save the cvrf on cache (disk) |
96 path = secure_filename(request.form['fname']) | |
97 path, _ = os.path.splitext(path) | |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
98 dirname = _caching_dir() |
3
3478e20885fd
Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
99 with open(os.path.join(dirname, path + '.xml'), 'wt') as f: |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
100 f.write(render(get_current(), 'cvrf.j2').encode('utf-8')) |
0 | 101 flash('File saved as %s' % path) |
102 del_current() | |
103 return redirect(url_for('new')) | |
104 | |
103
8a9fdf02bf5b
Don't allow a GET request to modify the server state
Benoît Allard <benoit.allard@greenbone.net>
parents:
33
diff
changeset
|
105 @mod.route('/load/<element>', methods=['POST']) |
0 | 106 def load(element): |
12
4219d6fb4c38
Implement three kind of caches
Benoît Allard <benoit.allard@greenbone.net>
parents:
11
diff
changeset
|
107 dirname = _caching_dir() |
16
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
108 element = secure_filename(element) |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
109 if dirname is None: |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
110 current_app.logger.warning('Tried to load something although no' |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
111 ' caching dir present: %s' % element) |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
112 flash('Not able to load %s' % element) |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
113 abort(404) |
3
3478e20885fd
Add a ReverseProxy and fix the cache path everywhere
Benoît Allard <benoit.allard@greenbone.net>
parents:
1
diff
changeset
|
114 fpath = os.path.join(dirname, element+'.xml') |
16
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
115 if not os.path.exists(fpath): |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
116 current_app.logger.warning('Tried to load an unexisting document: %s' % element) |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
117 flash('Document %s does not exists !' % element) |
eedf9606ab33
Add more error handling in the caching system
Benoît Allard <benoit.allard@greenbone.net>
parents:
12
diff
changeset
|
118 abort(404) |
0 | 119 with open(fpath, 'rt') as f: |
120 set_current(parse(f)) | |
121 os.remove(fpath) | |
122 flash('"%s" has been removed from cache' % element) | |
123 # Get some kind of id, and load the file. | |
7
8f41bb7f4681
Move the Document management routines to a document Blueprint
Benoît Allard <benoit.allard@greenbone.net>
parents:
3
diff
changeset
|
124 return redirect(url_for('document.view')) |