This repository has been archived by the owner on Feb 14, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
tail.js
113 lines (97 loc) · 2.93 KB
/
tail.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*
* Licensed to Cloudkick, Inc ('Cloudkick') under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* Cloudkick licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var sys = require('sys');
var path = require('path');
var sprintf = require('sprintf').sprintf;
var http = require('util/http');
var misc = require('util/misc');
var config = {
shortDescription: 'Print log file for a specified service',
longDescription: 'Print a log file for a specified service. ' +
'If a --follow switch is provided, new data is ' +
'printed as soon as it is available.',
requiredArguments: [['name', 'Service name']],
optionalArguments: [['bytes', 'How many bytes from the end of the log file to print']],
options: [
{
names: ['--follow', '-F'],
dest: 'follow',
action: 'store_true',
desc: 'Output new data as some as it is available (aka tail -F)'
}
],
usesGlobalOptions: ['debug', 'remote']
};
function handleCommand(args, parser, callback) {
// Return 1024 bytes from the end of the log file by default
var bytes = args.bytes || '1024';
var serviceName = args.name;
var remotePath = path.join(
'/',
'1.0',
'services',
serviceName,
'tail',
bytes
);
if (args.follow) {
remotePath = path.join(remotePath, 'follow');
}
// Tack on a trailing /
remotePath = path.join(remotePath, '/');
var opts = {
method: 'GET',
path: remotePath
};
http.buildRequest(args.remote, opts, function(err, request) {
if (err) {
callback(err);
return;
}
request.on('error', function(err) {
callback(err);
return;
});
function onData(chunk) {
sys.print(chunk);
}
request.on('response', function(response) {
var body = '';
if (response.statusCode !== 200) {
response.on('data', function(chunk) {
body += chunk;
});
response.on('end', function() {
try {
callback(new misc.ServerError(JSON.parse(body).message));
}
catch (e) {
callback(e);
}
});
}
else {
response.setEncoding('ascii');
response.on('data', onData);
}
});
// Send the request
request.end();
});
}
exports.config = config;
exports.handleCommand = handleCommand;