|
1 | 1 | # tastypie-like asyncio-aware resources |
| 2 | +import asyncio |
| 3 | +import iso8601 |
| 4 | +import itertools |
2 | 5 | import json |
3 | 6 | import logging |
4 | 7 | import os.path |
5 | | -import itertools |
6 | 8 |
|
7 | | -import asyncio |
8 | 9 | from aiohttp import web |
9 | | -from .auth import require_auth_token |
10 | | -from syncrypt.utils.format import format_size |
| 10 | +from tzlocal import get_localzone |
| 11 | + |
11 | 12 | from syncrypt.models import Identity |
| 13 | +from syncrypt.utils.format import format_size |
| 14 | + |
| 15 | +from .auth import require_auth_token |
| 16 | +from ..models.bundle import VirtualBundle |
| 17 | +from ..pipes import Once |
12 | 18 |
|
13 | 19 | logger = logging.getLogger(__name__) |
14 | 20 |
|
@@ -120,6 +126,9 @@ def add_routes(self, router): |
120 | 126 | router.add_route('GET', |
121 | 127 | '/{version}/{name}/{{id}}/fingerprints/'.format(**opts), |
122 | 128 | self.dispatch_fingerprints) |
| 129 | + router.add_route('GET', |
| 130 | + '/{version}/{name}/{{id}}/log/'.format(**opts), |
| 131 | + self.dispatch_log) |
123 | 132 | router.add_route('POST', |
124 | 133 | '/{version}/{name}/{{id}}/export/'.format(**opts), |
125 | 134 | self.dispatch_export) |
@@ -203,6 +212,32 @@ def dispatch_fingerprints(self, request): |
203 | 212 | fingerprint_list = yield from vault.backend.list_vault_user_key_fingerprints() |
204 | 213 | return JSONResponse(fingerprint_list) |
205 | 214 |
|
| 215 | + @asyncio.coroutine |
| 216 | + def dispatch_log(self, request): |
| 217 | + vault_id = request.match_info['id'] |
| 218 | + vault = self.find_vault_by_id(vault_id) |
| 219 | + local_tz = get_localzone() |
| 220 | + queue = yield from vault.backend.changes(None, None, verbose=True) |
| 221 | + log_items = [] |
| 222 | + while True: |
| 223 | + item = yield from queue.get() |
| 224 | + if item is None: |
| 225 | + break |
| 226 | + store_hash, metadata, server_info = item |
| 227 | + bundle = VirtualBundle(None, vault, store_hash=store_hash) |
| 228 | + yield from bundle.write_encrypted_metadata(Once(metadata)) |
| 229 | + rev_id = server_info['id'].decode(vault.config.encoding) |
| 230 | + created_at = server_info['created_at'].decode(vault.config.encoding) |
| 231 | + operation = server_info['operation'].decode(vault.config.encoding) |
| 232 | + user_email = server_info['email'].decode(vault.config.encoding) |
| 233 | + log_items.append({ |
| 234 | + 'operation': operation, |
| 235 | + 'user_email': user_email, |
| 236 | + 'created_at': created_at, |
| 237 | + 'path': bundle.relpath |
| 238 | + }) |
| 239 | + return JSONResponse({'items': log_items}) |
| 240 | + |
206 | 241 | @asyncio.coroutine |
207 | 242 | def dispatch_export(self, request): |
208 | 243 | vault_id = request.match_info['id'] |
|
0 commit comments