1
|
|
|
#!/usr/bin/env python |
2
|
|
|
# -*- encoding: utf-8 -*- |
3
|
|
|
# vim: set et sw=4 ts=4 sts=4 ff=unix fenc=utf8: |
4
|
|
|
# Author: Binux<[email protected]> |
5
|
|
|
# http://binux.me |
6
|
|
|
# Created on 2014-07-16 15:30:57 |
7
|
|
|
|
8
|
|
|
import socket |
9
|
|
|
from flask import abort, render_template, request, json |
10
|
|
|
|
11
|
|
|
from pyspider.libs import utils |
12
|
|
|
from .app import app |
13
|
|
|
|
14
|
|
|
|
15
|
|
|
@app.route('/task/<taskid>') |
16
|
|
|
def task(taskid): |
17
|
|
|
if ':' not in taskid: |
18
|
|
|
abort(400) |
19
|
|
|
project, taskid = taskid.split(':', 1) |
20
|
|
|
|
21
|
|
|
taskdb = app.config['taskdb'] |
22
|
|
|
task = taskdb.get_task(project, taskid) |
23
|
|
|
|
24
|
|
|
if not task: |
25
|
|
|
abort(404) |
26
|
|
|
resultdb = app.config['resultdb'] |
27
|
|
|
if resultdb: |
28
|
|
|
result = resultdb.get(project, taskid) |
29
|
|
|
|
30
|
|
|
return render_template("task.html", task=task, json=json, result=result, |
31
|
|
|
status_to_string=app.config['taskdb'].status_to_string) |
32
|
|
|
|
33
|
|
|
|
34
|
|
|
@app.route('/task/<taskid>.json') |
35
|
|
|
def task_in_json(taskid): |
36
|
|
|
if ':' not in taskid: |
37
|
|
|
return json.jsonify({'code': 400, 'error': 'bad project:task_id format'}) |
38
|
|
|
project, taskid = taskid.split(':', 1) |
39
|
|
|
|
40
|
|
|
taskdb = app.config['taskdb'] |
41
|
|
|
task = taskdb.get_task(project, taskid) |
42
|
|
|
|
43
|
|
|
if not task: |
44
|
|
|
return json.jsonify({'code': 404, 'error': 'not found'}) |
45
|
|
|
task['status_string'] = app.config['taskdb'].status_to_string(task['status']) |
46
|
|
|
return json.jsonify(task) |
47
|
|
|
|
48
|
|
|
|
49
|
|
|
@app.route('/tasks') |
50
|
|
|
def tasks(): |
51
|
|
|
rpc = app.config['scheduler_rpc'] |
52
|
|
|
taskdb = app.config['taskdb'] |
53
|
|
|
project = request.args.get('project', "") |
54
|
|
|
limit = int(request.args.get('limit', 100)) |
55
|
|
|
|
56
|
|
|
try: |
57
|
|
|
updatetime_tasks = rpc.get_active_tasks(project, limit) |
58
|
|
|
except socket.error as e: |
59
|
|
|
app.logger.warning('connect to scheduler rpc error: %r', e) |
60
|
|
|
return 'connect to scheduler error', 502 |
61
|
|
|
|
62
|
|
|
tasks = {} |
63
|
|
|
result = [] |
64
|
|
|
for updatetime, task in sorted(updatetime_tasks, key=lambda x: x[0]): |
65
|
|
|
key = '%(project)s:%(taskid)s' % task |
66
|
|
|
task['updatetime'] = updatetime |
67
|
|
|
if key in tasks and tasks[key].get('status', None) != taskdb.ACTIVE: |
68
|
|
|
result.append(tasks[key]) |
69
|
|
|
tasks[key] = task |
70
|
|
|
result.extend(tasks.values()) |
71
|
|
|
|
72
|
|
|
return render_template( |
73
|
|
|
"tasks.html", |
74
|
|
|
tasks=result, |
75
|
|
|
status_to_string=taskdb.status_to_string |
76
|
|
|
) |
77
|
|
|
|
78
|
|
|
|
79
|
|
|
@app.route('/active_tasks') |
80
|
|
|
def active_tasks(): |
81
|
|
|
rpc = app.config['scheduler_rpc'] |
82
|
|
|
taskdb = app.config['taskdb'] |
83
|
|
|
project = request.args.get('project', "") |
84
|
|
|
limit = int(request.args.get('limit', 100)) |
85
|
|
|
|
86
|
|
|
try: |
87
|
|
|
tasks = rpc.get_active_tasks(project, limit) |
88
|
|
|
except socket.error as e: |
89
|
|
|
app.logger.warning('connect to scheduler rpc error: %r', e) |
90
|
|
|
return '{}', 502, {'Content-Type': 'application/json'} |
91
|
|
|
|
92
|
|
|
result = [] |
93
|
|
|
for updatetime, task in tasks: |
94
|
|
|
task['updatetime'] = updatetime |
95
|
|
|
task['updatetime_text'] = utils.format_date(updatetime) |
96
|
|
|
if 'status' in task: |
97
|
|
|
task['status_text'] = taskdb.status_to_string(task['status']) |
98
|
|
|
result.append(task) |
99
|
|
|
|
100
|
|
|
return json.dumps(result), 200, {'Content-Type': 'application/json'} |
101
|
|
|
|
102
|
|
|
app.template_filter('format_date')(utils.format_date) |
103
|
|
|
|