Skip to content

Commit 74371c0

Browse files
committed
Initial commit
0 parents  commit 74371c0

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

jquery.min.js

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

logtail.css

Whitespace-only changes.

logtail.html

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<!DOCTYPE html>
2+
<!-- Copyright (c) 2012 Daniel Richman; GNU GPL 3 -->
3+
<html>
4+
<head>
5+
<title>habitat parser log viewer</title>
6+
<script type="text/javascript" src="jquery.min.js"></script>
7+
<script type="text/javascript" src="logtail.js"></script>
8+
<link href="logtail.css" rel="stylesheet" type="text/css">
9+
</head>
10+
<body>
11+
<pre id="data">Loading...</pre>
12+
</body>
13+
</html>

logtail.js

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
(function () {
2+
3+
var dataelem = "#data";
4+
var scrollelem = "body";
5+
6+
var url = "log";
7+
var load = 10024; /* 10KB */
8+
var poll = 1000; /* 1s */
9+
10+
var kill = false;
11+
var loading = false;
12+
var log_data = null;
13+
var log_size = null;
14+
15+
function get_log() {
16+
if (kill | loading) return;
17+
loading = true;
18+
19+
var range;
20+
if (log_size === null)
21+
/* Get the last 'load' bytes */
22+
range = "-" + load.toString();
23+
else
24+
/* Get the (log_size - 1)th byte, onwards. */
25+
range = (log_size - 1).toString() + "-";
26+
27+
/* The "log_size - 1" deliberately reloads the last byte, which we already
28+
* have. This is to prevent a 416 "Range unsatisfiable" error: a response
29+
* of length 1 tells us that the file hasn't changed yet. A 416 shows that
30+
* the file has been trucnated */
31+
32+
$.ajax(url, {
33+
cache: false,
34+
headers: {Range: "bytes=" + range},
35+
success: function (data, s, xhr) {
36+
loading = false;
37+
38+
if (xhr.status !== 206) /* Partial Content */
39+
throw "Server did not respond 206";
40+
var c_r = xhr.getResponseHeader("Content-Range");
41+
if (c_r === null)
42+
throw "Server did not respond with a Content-Range";
43+
44+
log_size = parseInt(c_r.split("/")[1]);
45+
if (isNaN(log_size))
46+
throw "Invalid Content-Range size";
47+
48+
var added = false;
49+
50+
if (log_data === null) {
51+
/* Clip leading part-line if not the whole file */
52+
if (data.length !== log_size) {
53+
var start = data.indexOf("\n");
54+
log_data = data.substring(start + 1);
55+
} else {
56+
log_data = data;
57+
}
58+
59+
added = true;
60+
} else {
61+
/* Drop the first byte (see above) */
62+
log_data += data.substring(1);
63+
64+
if (log_data.length > load) {
65+
var start = log_data.indexOf("\n", log_data.length - load);
66+
log_data = log_data.substring(start + 1);
67+
}
68+
69+
if (data.length > 1)
70+
added = true;
71+
}
72+
73+
show_log(added);
74+
setTimeout(get_log, poll);
75+
},
76+
error: function (xhr, s, t) {
77+
loading = false;
78+
79+
if (xhr.status === 416 || xhr.status == 404) {
80+
/* 416: Requested range not satisfiable: log was truncated. */
81+
/* 404: Retry soon, I guess */
82+
83+
log_size = null;
84+
log_data = null;
85+
show_log(true);
86+
87+
setTimeout(get_log, poll);
88+
} else {
89+
if (s == "error")
90+
error(xhr.statusText);
91+
else
92+
error("AJAX Error: " + s);
93+
}
94+
}
95+
});
96+
}
97+
98+
function show_log(scroll) {
99+
var d = $(dataelem);
100+
var s = $(scrollelem);
101+
102+
if (log_data !== null)
103+
d.text(log_data);
104+
else
105+
d.text("");
106+
107+
if (scroll)
108+
s.scrollTop(s.height());
109+
}
110+
111+
function error(what) {
112+
kill = true;
113+
/* TODO: error msg */
114+
}
115+
116+
$(document).ready(function () {
117+
$(window).error(error);
118+
get_log();
119+
});
120+
121+
})();

0 commit comments

Comments
 (0)