mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-22 06:42:42 +01:00
Improve debug support for notifications
Summary: Add a `notification.debug` setting that shows debug info in the browser. Also improve some logging/error handling stuff and fix a bug with host names. Test Plan: {F13098} Reviewers: jungejason, btrahan, vrana Reviewed By: btrahan CC: aran Maniphest Tasks: T944 Differential Revision: https://secure.phabricator.com/D2810
This commit is contained in:
parent
addc2c8764
commit
5e184ee593
8 changed files with 61 additions and 128 deletions
|
@ -209,6 +209,9 @@ return array(
|
||||||
// PID file to use.
|
// PID file to use.
|
||||||
'notification.pidfile' => '/var/run/aphlict.pid',
|
'notification.pidfile' => '/var/run/aphlict.pid',
|
||||||
|
|
||||||
|
// Enable this option to get additional debug output in the browser.
|
||||||
|
'notification.debug' => false,
|
||||||
|
|
||||||
|
|
||||||
// -- Email ----------------------------------------------------------------- //
|
// -- Email ----------------------------------------------------------------- //
|
||||||
|
|
||||||
|
|
|
@ -49,20 +49,6 @@ celerity_register_resource_map(array(
|
||||||
'disk' => '/rsrc/image/custom/example_template.png',
|
'disk' => '/rsrc/image/custom/example_template.png',
|
||||||
'type' => 'png',
|
'type' => 'png',
|
||||||
),
|
),
|
||||||
'/rsrc/image/facebook/icon/fatcow/speedometer.png' =>
|
|
||||||
array(
|
|
||||||
'hash' => '3345a7ba5b3c99dbfa3a922a16756815',
|
|
||||||
'uri' => '/res/3345a7ba/rsrc/image/facebook/icon/fatcow/speedometer.png',
|
|
||||||
'disk' => '/rsrc/image/facebook/icon/fatcow/speedometer.png',
|
|
||||||
'type' => 'png',
|
|
||||||
),
|
|
||||||
'/rsrc/image/facebook/icon/sandcastle.png' =>
|
|
||||||
array(
|
|
||||||
'hash' => '496a1c2e91ccb8332435491a7bbfa67d',
|
|
||||||
'uri' => '/res/496a1c2e/rsrc/image/facebook/icon/sandcastle.png',
|
|
||||||
'disk' => '/rsrc/image/facebook/icon/sandcastle.png',
|
|
||||||
'type' => 'png',
|
|
||||||
),
|
|
||||||
'/rsrc/image/grippy_texture.png' =>
|
'/rsrc/image/grippy_texture.png' =>
|
||||||
array(
|
array(
|
||||||
'hash' => 'a8945e12ceeaddd5b491a8d81cfa19c1',
|
'hash' => 'a8945e12ceeaddd5b491a8d81cfa19c1',
|
||||||
|
@ -701,69 +687,6 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/css/application/diffusion/diffusion-source.css',
|
'disk' => '/rsrc/css/application/diffusion/diffusion-source.css',
|
||||||
),
|
),
|
||||||
'facebook-differential-core-view-css' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/6053fa4a/rsrc/css/facebook/application/differential/core.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/differential/core.css',
|
|
||||||
),
|
|
||||||
'facebook-example-css' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/6ba49cd8/rsrc/css/facebook/application/example/example.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/example/example.css',
|
|
||||||
),
|
|
||||||
'facebook-example-js' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/31058d06/rsrc/js/facebook/application/example/example.js',
|
|
||||||
'type' => 'js',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/js/facebook/application/example/example.js',
|
|
||||||
),
|
|
||||||
'facebook-releeph-branch' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/6b7eea98/rsrc/css/facebook/application/releeph/releeph-branch.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/releeph/releeph-branch.css',
|
|
||||||
),
|
|
||||||
'facebook-releeph-core' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/c3027f71/rsrc/css/facebook/application/releeph/releeph-core.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/releeph/releeph-core.css',
|
|
||||||
),
|
|
||||||
'facebook-releeph-project' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/497c0c11/rsrc/css/facebook/application/releeph/releeph-project.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/releeph/releeph-project.css',
|
|
||||||
),
|
|
||||||
'facebook-releeph-request-typeahead-css' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/2f4bab97/rsrc/css/facebook/application/releeph/request-typeahead.css',
|
|
||||||
'type' => 'css',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/css/facebook/application/releeph/request-typeahead.css',
|
|
||||||
),
|
|
||||||
'files-css' =>
|
'files-css' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/a265a77d/rsrc/css/application/files/files.css',
|
'uri' => '/res/a265a77d/rsrc/css/application/files/files.css',
|
||||||
|
@ -856,7 +779,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'javelin-behavior-aphlict-listen' =>
|
'javelin-behavior-aphlict-listen' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/da96a861/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
|
'uri' => '/res/c716b386/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
|
||||||
'type' => 'js',
|
'type' => 'js',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
@ -866,7 +789,8 @@ celerity_register_resource_map(array(
|
||||||
3 => 'javelin-request',
|
3 => 'javelin-request',
|
||||||
4 => 'javelin-uri',
|
4 => 'javelin-uri',
|
||||||
5 => 'javelin-dom',
|
5 => 'javelin-dom',
|
||||||
6 => 'phabricator-notification',
|
6 => 'javelin-json',
|
||||||
|
7 => 'phabricator-notification',
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
|
'disk' => '/rsrc/js/application/aphlict/behavior-aphlict-listen.js',
|
||||||
),
|
),
|
||||||
|
@ -1239,25 +1163,6 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'disk' => '/rsrc/js/application/core/behavior-error-log.js',
|
'disk' => '/rsrc/js/application/core/behavior-error-log.js',
|
||||||
),
|
),
|
||||||
'javelin-behavior-facebook-releeph-request-typeahead' =>
|
|
||||||
array(
|
|
||||||
'uri' => '/res/585eff76/rsrc/js/facebook/application/releeph/request-typeahead.js',
|
|
||||||
'type' => 'js',
|
|
||||||
'requires' =>
|
|
||||||
array(
|
|
||||||
0 => 'javelin-behavior',
|
|
||||||
1 => 'javelin-util',
|
|
||||||
2 => 'javelin-dom',
|
|
||||||
3 => 'javelin-typeahead',
|
|
||||||
4 => 'javelin-tokenizer',
|
|
||||||
5 => 'javelin-typeahead-preloaded-source',
|
|
||||||
6 => 'javelin-typeahead-ondemand-source',
|
|
||||||
7 => 'javelin-dom',
|
|
||||||
8 => 'javelin-stratcom',
|
|
||||||
9 => 'javelin-util',
|
|
||||||
),
|
|
||||||
'disk' => '/rsrc/js/facebook/application/releeph/request-typeahead.js',
|
|
||||||
),
|
|
||||||
'javelin-behavior-fancy-datepicker' =>
|
'javelin-behavior-fancy-datepicker' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/b2d89e4c/rsrc/js/application/core/behavior-fancy-datepicker.js',
|
'uri' => '/res/b2d89e4c/rsrc/js/application/core/behavior-fancy-datepicker.js',
|
||||||
|
@ -2292,7 +2197,7 @@ celerity_register_resource_map(array(
|
||||||
),
|
),
|
||||||
'phabricator-notification-css' =>
|
'phabricator-notification-css' =>
|
||||||
array(
|
array(
|
||||||
'uri' => '/res/7452322a/rsrc/css/aphront/notification.css',
|
'uri' => '/res/1ed48691/rsrc/css/aphront/notification.css',
|
||||||
'type' => 'css',
|
'type' => 'css',
|
||||||
'requires' =>
|
'requires' =>
|
||||||
array(
|
array(
|
||||||
|
|
|
@ -76,7 +76,8 @@ You can run `aphlict` in the foreground to get output to your console:
|
||||||
|
|
||||||
phabricator/ $ ./bin/aphlict --foreground
|
phabricator/ $ ./bin/aphlict --foreground
|
||||||
|
|
||||||
This may help identify and resolve problems.
|
You can set `notification.debug` in your configuration to get additional
|
||||||
|
output in your browser.
|
||||||
|
|
||||||
The server also generates a log, by default in `/var/log/aphlict.log`. You can
|
The server also generates a log, by default in `/var/log/aphlict.log`. You can
|
||||||
change this location by changing `notification.log` in your configuration. The
|
change this location by changing `notification.log` in your configuration. The
|
||||||
|
|
|
@ -394,16 +394,20 @@ final class PhabricatorStandardPageView extends AphrontPageView {
|
||||||
$client_uri = PhabricatorEnv::getEnvConfig('notification.client-uri');
|
$client_uri = PhabricatorEnv::getEnvConfig('notification.client-uri');
|
||||||
$client_uri = new PhutilURI($client_uri);
|
$client_uri = new PhutilURI($client_uri);
|
||||||
if ($client_uri->getDomain() == 'localhost') {
|
if ($client_uri->getDomain() == 'localhost') {
|
||||||
$this_host = new PhutilURI($this->getRequest()->getHost());
|
$this_host = $this->getRequest()->getHost();
|
||||||
|
$this_host = new PhutilURI('http://'.$this_host.'/');
|
||||||
$client_uri->setDomain($this_host->getDomain());
|
$client_uri->setDomain($this_host->getDomain());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$enable_debug = PhabricatorEnv::getEnvConfig('notification.debug');
|
||||||
|
|
||||||
Javelin::initBehavior(
|
Javelin::initBehavior(
|
||||||
'aphlict-listen',
|
'aphlict-listen',
|
||||||
array(
|
array(
|
||||||
'id' => $aphlict_object_id,
|
'id' => $aphlict_object_id,
|
||||||
'server' => $client_uri->getDomain(),
|
'server' => $client_uri->getDomain(),
|
||||||
'port' => $client_uri->getPort(),
|
'port' => $client_uri->getPort(),
|
||||||
|
'debug' => $enable_debug,
|
||||||
'pageObjects' => array_fill_keys($this->pageObjects, true),
|
'pageObjects' => array_fill_keys($this->pageObjects, true),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,6 @@ package {
|
||||||
this.remotePort = port;
|
this.remotePort = port;
|
||||||
|
|
||||||
this.connectToServer();
|
this.connectToServer();
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -51,17 +51,25 @@ var querystring = require('querystring');
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
|
|
||||||
// set up log file
|
// set up log file
|
||||||
var logfile = fs.createWriteStream(config.log,
|
var logfile = fs.createWriteStream(
|
||||||
{ flags: 'a',
|
config.log,
|
||||||
|
{
|
||||||
|
flags: 'a',
|
||||||
encoding: null,
|
encoding: null,
|
||||||
mode: 0666 });
|
mode: 0666
|
||||||
logfile.write('----- ' + (new Date()).toLocaleString() + ' -----\n');
|
});
|
||||||
|
|
||||||
function log(str) {
|
function log(str) {
|
||||||
console.log(str);
|
console.log(str);
|
||||||
logfile.write(str + '\n');
|
logfile.write(str + '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process.on('uncaughtException', function (err) {
|
||||||
|
log("\n<<< UNCAUGHT EXCEPTION! >>>\n\n" + err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
log('----- ' + (new Date()).toLocaleString() + ' -----\n');
|
||||||
|
|
||||||
function getFlashPolicy() {
|
function getFlashPolicy() {
|
||||||
return [
|
return [
|
||||||
|
@ -75,9 +83,10 @@ function getFlashPolicy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
net.createServer(function(socket) {
|
net.createServer(function(socket) {
|
||||||
socket.on('data', function() {
|
|
||||||
socket.write(getFlashPolicy() + '\0');
|
socket.write(getFlashPolicy() + '\0');
|
||||||
});
|
socket.end();
|
||||||
|
|
||||||
|
log('[' + socket.remoteAddress + '] Sent Flash Policy');
|
||||||
|
|
||||||
socket.on('error', function (e) {
|
socket.on('error', function (e) {
|
||||||
log('Error in policy server: ' + e);
|
log('Error in policy server: ' + e);
|
||||||
|
@ -85,7 +94,6 @@ net.createServer(function(socket) {
|
||||||
}).listen(843);
|
}).listen(843);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function write_json(socket, data) {
|
function write_json(socket, data) {
|
||||||
var serial = JSON.stringify(data);
|
var serial = JSON.stringify(data);
|
||||||
var length = Buffer.byteLength(serial, 'utf8');
|
var length = Buffer.byteLength(serial, 'utf8');
|
||||||
|
@ -118,32 +126,33 @@ function generate_id() {
|
||||||
|
|
||||||
var send_server = net.createServer(function(socket) {
|
var send_server = net.createServer(function(socket) {
|
||||||
var client_id = generate_id();
|
var client_id = generate_id();
|
||||||
|
var client_name = '[' + socket.remoteAddress + '] [#' + client_id + '] ';
|
||||||
|
|
||||||
socket.on('connect', function() {
|
socket.on('connect', function() {
|
||||||
clients[client_id] = socket;
|
clients[client_id] = socket;
|
||||||
current_connections++;
|
current_connections++;
|
||||||
log(client_id + ': connected\t\t('
|
log(client_name + 'connected\t\t('
|
||||||
+ current_connections + ' current connections)');
|
+ current_connections + ' current connections)');
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('close', function() {
|
socket.on('close', function() {
|
||||||
delete clients[client_id];
|
delete clients[client_id];
|
||||||
current_connections--;
|
current_connections--;
|
||||||
log(client_id + ': closed\t\t('
|
log(client_name + 'closed\t\t('
|
||||||
+ current_connections + ' current connections)');
|
+ current_connections + ' current connections)');
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('timeout', function() {
|
socket.on('timeout', function() {
|
||||||
log(client_id + ': timed out!');
|
log(client_name + 'timed out!');
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('end', function() {
|
socket.on('end', function() {
|
||||||
log(client_id + ': ended the connection');
|
log(client_name + 'ended the connection');
|
||||||
// node automatically closes half-open connections
|
// node automatically closes half-open connections
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.on('error', function (e) {
|
socket.on('error', function (e) {
|
||||||
log('Uncaught error in send server: ' + e);
|
log(cliient_name + 'Uncaught error in send server: ' + e);
|
||||||
});
|
});
|
||||||
}).listen(config.port);
|
}).listen(config.port);
|
||||||
|
|
||||||
|
|
|
@ -31,3 +31,8 @@
|
||||||
background: #ffffa0;
|
background: #ffffa0;
|
||||||
border: 1px solid #aaaa60;
|
border: 1px solid #aaaa60;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.jx-notification-debug {
|
||||||
|
background: #ffa0ff;
|
||||||
|
border: 1px solid #aa60aa;
|
||||||
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
* javelin-request
|
* javelin-request
|
||||||
* javelin-uri
|
* javelin-uri
|
||||||
* javelin-dom
|
* javelin-dom
|
||||||
|
* javelin-json
|
||||||
* phabricator-notification
|
* phabricator-notification
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -23,17 +24,23 @@ JX.behavior('aphlict-listen', function(config) {
|
||||||
// Respond to a notification from the Aphlict notification server. We send
|
// Respond to a notification from the Aphlict notification server. We send
|
||||||
// a request to Phabricator to get notification details.
|
// a request to Phabricator to get notification details.
|
||||||
function onaphlictmessage(type, message) {
|
function onaphlictmessage(type, message) {
|
||||||
if (!message) {
|
if (type == 'receive') {
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type != 'receive') {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var request = new JX.Request('/notification/individual/', onnotification)
|
var request = new JX.Request('/notification/individual/', onnotification)
|
||||||
.addData({key: message.key})
|
.addData({key: message.key})
|
||||||
.send();
|
.send();
|
||||||
|
} else if (__DEV__) {
|
||||||
|
if (config.debug) {
|
||||||
|
var details = message
|
||||||
|
? JX.JSON.stringify(message)
|
||||||
|
: '';
|
||||||
|
|
||||||
|
new JX.Notification()
|
||||||
|
.setContent('(Aphlict) [' + type + '] ' + details)
|
||||||
|
.setClassName('jx-notification-debug')
|
||||||
|
.setDuration(0)
|
||||||
|
.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue