Commit f7a4f04a authored by Leo Iannacone's avatar Leo Iannacone

Merge branch 'master' into portable

parents 04380791 43903d3a
......@@ -19,6 +19,11 @@ var express = require('express'),
Broadcaster = require('./lib/broadcaster.js');
// serve dsc files as octet-stream
serve_static.mime.define({
'application/octet-stream': ['dsc']
});
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(serve_static(__dirname + '/public'));
......
var config = require('./config.js')
, fs = require('fs')
, Tail = require('./tail.js')
'use strict';
function __watch_status_check_same_obj (obj1, obj2) {
var config = require('./config.js'),
fs = require('fs'),
utils = require('./utils.js'),
Tail = require('./tail.js');
function __watch_status_check_same_obj(obj1, obj2) {
if (obj1.status == obj2.status) {
if (obj1.distribution == obj2.distribution) {
if (obj1.hasOwnProperty('package') &&
obj2.hasOwnProperty('package'))
{
obj2.hasOwnProperty('package')) {
if (obj1.package == obj2.package)
return true;
return false
return false;
}
return true
return true;
}
}
return false
return false;
}
// watcher on build_status
function __watch_status (socket, status) {
function __watch_status(socket, status) {
var watcher = new Tail(config.debomatic.jsonfile)
watcher.on('line', function(new_content) {
var data = null
var watcher = new Tail(config.debomatic.jsonfile);
watcher.on('line', function (new_content) {
var data = null;
try {
data = JSON.parse(new_content)
data = JSON.parse(new_content);
} catch (err) {
utils.errors_handler('Broadcaster:__watch_status:JSON.parse(new_content) - ', err, socket)
return
utils.errors_handler('Broadcaster:__watch_status:JSON.parse(new_content) - ', err, socket);
return;
}
// looking for same status already in statuses lists
if (data.hasOwnProperty('success')) {
for(i = 0; i < status.length; i++) {
for (var i = 0; i < status.length; i++) {
if (__watch_status_check_same_obj(data, status[i])) {
status.splice(i, 1)
status.splice(i, 1);
break;
}
else
} else
continue;
}
} else {
status.push(data);
}
else {
status.push(data)
}
socket.emit(config.events.broadcast.status_update, data)
})
watcher.on('error', function(msg) {
socket.emit(config.events.error, msg)
})
socket.emit(config.events.broadcast.status_update, data);
});
watcher.on('error', function (msg) {
socket.emit(config.events.error, msg);
});
}
// watcher on new distributions
function __watch_distributions (socket) {
fs.watch(config.debomatic.path, { persistent: true }, function (event, fileName) {
function __watch_distributions(socket) {
fs.watch(config.debomatic.path, {
persistent: true
}, function (event, fileName) {
// wait half a second to get pool subdir created
setTimeout(function() {
utils.send_distributions(socket)
}, 500)
})
setTimeout(function () {
utils.send_distributions(socket);
}, 500);
});
}
function Broadcaster (sockets, status) {
var sockets = sockets
function Broadcaster(sockets, status) {
__watch_status(sockets, status)
__watch_status(sockets, status);
__watch_distributions(sockets)
__watch_distributions(sockets);
return {
}
};
}
module.exports = Broadcaster
module.exports = Broadcaster;
var fs = require('fs')
, path = require('path')
, config = require('./config.js')
, utils = require('./utils.js')
'use strict';
var fs = require('fs'),
path = require('path'),
config = require('./config.js'),
utils = require('./utils.js');
var _e = config.events.client
var _e = config.events.client;
function __get_files_list_from_package(data, callback) {
package_path = utils.get_package_path(data)
utils.get_files_list(package_path, false, function(files) {
data.package.files = []
data.package.debs = []
data.package.sources = []
var package_path = utils.get_package_path(data);
utils.get_files_list(package_path, false, function (files) {
data.package.files = [];
data.package.debs = [];
data.package.sources = [];
files.forEach(function (f) {
file = {}
file.path = path.join(package_path, f).replace(config.debomatic.path, config.routes.debomatic)
file.orig_name = f
file.name = f.split('_')[0]
var file = {};
file.path = path.join(package_path, f).replace(config.debomatic.path, config.routes.debomatic);
file.orig_name = f;
file.name = f.split('_')[0];
file.extension = f.split('.').pop();
if (file.extension == "deb" || file.extension == "ddeb") {
if (file.extension == 'deb' || file.extension == 'ddeb') {
data.package.debs.push(file);
}
else if (f.indexOf('.tar') >= 0 || file.extension == "changes" || file.extension == "dsc") {
file.name = f.replace(data.package.name + '_' + data.package.version + '.', '')
} else if (f.indexOf('.tar') >= 0 || file.extension == 'changes' || file.extension == 'dsc') {
file.name = f.replace(data.package.name + '_' + data.package.version + '.', '');
if (file.extension == 'changes')
file.name = file.extension
file.name = file.extension;
else if (f.indexOf('.tar') >= 0 && f.indexOf('.orig.') > 0)
file.name = 'orig.' + f.split('.orig.').pop()
data.package.sources.push(file)
}
else {
file.name = file.extension
data.package.files.push(file)
file.name = 'orig.' + f.split('.orig.').pop();
data.package.sources.push(file);
} else {
file.name = file.extension;
data.package.files.push(file);
}
});
callback(data);
});
}
function __send_package_files_list (event_name, socket, data) {
__get_files_list_from_package(data, function(new_data){
socket.emit(event_name, new_data)
function __send_package_files_list(event_name, socket, data) {
__get_files_list_from_package(data, function (new_data) {
socket.emit(event_name, new_data);
});
}
function __send_package_status(socket, data, package_data) {
var event_name = config.events.client.distribution_packages.status
var event_name = config.events.client.distribution_packages.status;
var new_data = {}
new_data.distribution = data.distribution
new_data.package = package_data
var new_data = {};
new_data.distribution = data.distribution;
new_data.package = package_data;
var status_data = {}
status_data.status = config.status.build
status_data.distribution = data.distribution.name
status_data.package = package_data.orig_name
var status_data = {};
status_data.status = config.status.build;
status_data.distribution = data.distribution.name;
status_data.package = package_data.orig_name;
var package_path = utils.get_package_path(new_data)
var package_path = utils.get_package_path(new_data);
// status policy:
// + successed: exists .dsc
// + building: wc -l .datestamp == 1 (FIX_ME)
// + failed: else
var base_path = path.join(package_path, package_data.orig_name)
fs.exists(base_path + '.dsc', function(dsc_exists){
var base_path = path.join(package_path, package_data.orig_name);
fs.exists(base_path + '.dsc', function (dsc_exists) {
if (dsc_exists) {
status_data.success = config.status.success
socket.emit(event_name, status_data)
}
else {
status_data.success = config.status.success;
socket.emit(event_name, status_data);
} else {
// emulate wc -l .datestamp in nodejs
var count = 0
var datestamp = base_path + '.datestamp'
fs.exists(datestamp, function(datestamp_exists){
var count = 0;
var datestamp = base_path + '.datestamp';
fs.exists(datestamp, function (datestamp_exists) {
if (datestamp_exists) {
// count lines
fs.createReadStream(datestamp)
.on('data', function(chunk) {
for (var i=0; i < chunk.length; ++i)
.on('data', function (chunk) {
for (var i = 0; i < chunk.length; ++i)
if (chunk[i] == 10) count++;
})
.on('end', function() {
.on('end', function () {
if (count > 1)
status_data.success = config.status.fail
socket.emit(event_name, status_data)
status_data.success = config.status.fail;
socket.emit(event_name, status_data);
});
}
})
});
}
})
});
}
function __send_distribution_packages (event_name, socket, data) {
distro_path = utils.get_distribution_pool_path(data)
function __send_distribution_packages(event_name, socket, data) {
var distro_path = utils.get_distribution_pool_path(data);
utils.get_files_list(distro_path, true, function (packages) {
data.distribution.packages = []
packages.forEach( function (p) {
pack = {}
info = p.split('_')
pack.name = info[0]
pack.version = info[1]
pack.orig_name = p
data.distribution.packages.push(pack)
__send_package_status(socket, data, pack)
data.distribution.packages = [];
packages.forEach(function (p) {
var pack = {};
var info = p.split('_');
pack.name = info[0];
pack.version = info[1];
pack.orig_name = p;
data.distribution.packages.push(pack);
__send_package_status(socket, data, pack);
});
socket.emit(event_name, data)
socket.emit(event_name, data);
});
}
function __send_file (event_name, socket, data) {
var file_path = utils.get_file_path(data)
function __send_file(event_name, socket, data) {
var file_path = utils.get_file_path(data);
fs.readFile(file_path, 'utf8', function (err, content) {
if (err) {
utils.errors_handler('client:__send_file', err, socket)
return
utils.errors_handler('client:__send_file', err, socket);
return;
}
data.file.orig_name = file_path.split('/').pop()
data.file.content = content
data.file.path = file_path.replace(config.debomatic.path, config.routes.debomatic)
socket.emit(event_name, data)
data.file.orig_name = file_path.split('/').pop();
data.file.content = content;
data.file.path = file_path.replace(config.debomatic.path, config.routes.debomatic);
socket.emit(event_name, data);
});
}
function __handler_get_file (socket, data) {
var file_path = utils.get_file_path(data)
utils.watch_path_onsocket(_e.file_newcontent, socket, data, file_path, function(event_name, socket, data) {
data.file.content = null
socket.emit(event_name, data)
})
__send_file(_e.file.set, socket, data)
function __handler_get_file(socket, data) {
var file_path = utils.get_file_path(data);
utils.watch_path_onsocket(_e.file_newcontent, socket, data, file_path, function (event_name, socket, data) {
data.file.content = null;
socket.emit(event_name, data);
});
__send_file(_e.file.set, socket, data);
}
function Client (socket) {
var socket = socket
function Client(socket) {
this.start = function () {
// init send distributions
utils.send_distributions(socket)
utils.send_distributions(socket);
// init events
socket.on(_e.distribution_packages.get, function (data) {
if (! utils.check_data_distribution(data))
return
distribution_path = path.join(config.debomatic.path, data.distribution.name, 'pool')
utils.generic_handler_watcher(_e.distribution_packages.set, socket, data, distribution_path, __send_distribution_packages)
})
if (!utils.check_data_distribution(data))
return;
var distribution_path = path.join(config.debomatic.path, data.distribution.name, 'pool');
utils.generic_handler_watcher(_e.distribution_packages.set, socket, data, distribution_path, __send_distribution_packages);
});
socket.on(_e.package_files_list.get, function(data) {
if (! utils.check_data_package(data))
return
package_path = utils.get_package_path(data)
utils.generic_handler_watcher(_e.package_files_list.set, socket, data, package_path, __send_package_files_list)
})
socket.on(_e.package_files_list.get, function (data) {
if (!utils.check_data_package(data))
return;
var package_path = utils.get_package_path(data);
utils.generic_handler_watcher(_e.package_files_list.set, socket, data, package_path, __send_package_files_list);
});
socket.on(_e.file.get, function (data){
if (! utils.check_data_file(data))
return
__handler_get_file(socket, data)
})
socket.on(_e.file.get, function (data) {
if (!utils.check_data_file(data))
return;
__handler_get_file(socket, data);
});
// on client disconnection close all watchers
socket.on('disconnect', function() {
socket.get("watchers", function(err, socket_watchers){
if (! socket_watchers)
socket.on('disconnect', function () {
socket.get('watchers', function (err, socket_watchers) {
if (!socket_watchers)
return;
for (key in socket_watchers) {
try { socket_watchers[key].close() }
catch (err) {}
for (var key in socket_watchers) {
try {
socket_watchers[key].close();
} catch (err) {}
}
})
});
});
}
};
this.send_status = function(status) {
socket.emit(_e.status, status)
}
this.send_status = function (status) {
socket.emit(_e.status, status);
};
}
module.exports = Client
module.exports = Client;
'use strict';
/*
* Please DO NOT edit this file.
*
* Edit auto-generated "user.config.js" file instead.
* Edit auto-generated 'user.config.js' file instead.
*
*/
// #start config-auto-export
var config = {}
var config = {};
/*
* Configure host and port.
* Please for ports < 1000 use authbind. DO NOT RUN nodejs as root.
* $ authbind nodejs index.js
*/
config.host = 'localhost'
config.port = 3000
config.host = 'localhost';
config.port = 3000;
config.socket = {}
config.socket.log = false
config.socket = {};
config.socket.log = false;
config.debomatic = {}
config.debomatic.path = '/srv/debomatic-amd64'
config.debomatic.jsonfile = '/var/log/debomatic-json.log'
config.debomatic = {};
config.debomatic.path = '/srv/debomatic-amd64';
config.debomatic.jsonfile = '/var/log/debomatic-json.log';
config.routes = {}
config.routes.debomatic = '/debomatic'
config.routes.distribution = '/distribution'
config.routes.preferences = '/preferences'
config.routes = {};
config.routes.debomatic = '/debomatic';
config.routes.distribution = '/distribution';
config.routes.preferences = '/preferences';
config.web = {}
config.web.title = "Deb-o-Matic web.ui"
config.web.description = "This is a web interface for debomatic"
config.web = {};
config.web.title = 'Deb-o-Matic web.ui';
config.web.description = 'This is a web interface for debomatic';
// debomatic configuration exportable for web
config.web.debomatic = {}
config.web.debomatic.admin = {}
config.web.debomatic.admin.name = "Your Name"
config.web.debomatic.admin.email = "you AT debian DOT org" // please use this SPAMFREE form - it will be converted client side by javascript
config.web.debomatic.architecture = 'amd64'
config.web.debomatic.dput = {}
config.web.debomatic.dput.incoming = config.debomatic.path
config.web.debomatic.dput.host = config.host
config.web.debomatic.dput.login = "debomatic"
config.web.debomatic.dput.method = "scp"
config.web.debomatic.dput.unsigned_uploads = false
config.web.debomatic = {};
config.web.debomatic.admin = {};
config.web.debomatic.admin.name = 'Your Name';
config.web.debomatic.admin.email = 'you AT debian DOT org'; // please use this SPAMFREE form - it will be converted client side by javascript
config.web.debomatic.architecture = 'amd64';
config.web.debomatic.dput = {};
config.web.debomatic.dput.incoming = config.debomatic.path;
config.web.debomatic.dput.host = config.host;
config.web.debomatic.dput.login = 'debomatic';
config.web.debomatic.dput.method = 'scp';
config.web.debomatic.dput.unsigned_uploads = false;
// default ui settings
config.web.preferences = {}
config.web.preferences.autoscroll = true
config.web.preferences.header = true
config.web.preferences.sidebar = true
config.web.preferences.glossy_theme = true
config.web.preferences.file_background = true
config.web.preferences.file_fontsize = 13 // valid values are [13..16]
config.web.preferences.debug = 0 // debug level - 0 means disabled
config.web.preferences = {};
config.web.preferences.autoscroll = true;
config.web.preferences.header = true;
config.web.preferences.sidebar = true;
config.web.preferences.glossy_theme = true;
config.web.preferences.file_background = true;
config.web.preferences.file_fontsize = 13; // valid values are [13..16]
config.web.preferences.debug = 0; // debug level - 0 means disabled
// #end config-auto-export
// DO NOT TOUCH these ones
config.version = '0.2.2'
config.version = '0.2.3';
// A simple function to quickly have
// get and set strings for client events
......@@ -69,78 +70,74 @@ function _event_get_set(event_name) {
return {
set: event_name,
get: 'get_' + event_name
}
};
}
config.events = {}
config.events.error = 'error'
config.events.broadcast = {}
config.events.broadcast.distributions = 'distributions'
config.events.broadcast.status_update = 'status_update'
config.events = {};
config.events.error = 'error';
config.events.broadcast = {};
config.events.broadcast.distributions = 'distributions';
config.events.broadcast.status_update = 'status_update';
config.events.client = {}
config.events.client.distribution_packages = _event_get_set('distribution_packages')
config.events.client.distribution_packages.status = 'package_status'
config.events.client.package_files_list = _event_get_set('package_files_list')
config.events.client.file = _event_get_set('file')
config.events.client.file_newcontent = 'file_newcontent'
config.events.client.status = 'status'
config.events.client = {};
config.events.client.distribution_packages = _event_get_set('distribution_packages');
config.events.client.distribution_packages.status = 'package_status';
config.events.client.package_files_list = _event_get_set('package_files_list');
config.events.client.file = _event_get_set('file');
config.events.client.file_newcontent = 'file_newcontent';
config.events.client.status = 'status';
// debomatic status according with JSONLogger.py module
config.status = {}
config.status.build = 'build'
config.status.create = 'create'
config.status.update = 'update'
config.status.success = true
config.status.fail = false
config.status = {};
config.status.build = 'build';
config.status.create = 'create';
config.status.update = 'update';
config.status.success = true;
config.status.fail = false;
// read user configuration and merge it
/*
* update object1 with object2 values
*/
function _merge(object1, object2) {
var result = {}
for (p in object1) {
var result = {};
for (var p in object1) {
if (object2.hasOwnProperty(p)) {
if (typeof object1[p] === 'object' && typeof object2[p] === 'object') {
result[p] = _merge(object1[p], object2[p])
}
else {
result[p] = object2[p]
}
result[p] = _merge(object1[p], object2[p]);
} else {
result[p] = object2[p];
}
else {
result[p] = object1[p]
} else {
result[p] = object1[p];
}
}
return result
return result;
}
try {
var Parser = require('./parser.js')
var parser = new Parser()
var user_config = parser.getUserConfig()
var Parser = require('./parser.js');
var parser = new Parser();
var user_config = parser.getUserConfig();
if (user_config) {
console.log("Reading user configutation ...")
config = _merge(config, require(user_config))
}
else {
console.log("No user config specified. Using global settings.")
console.log('Reading user configutation ...');
config = _merge(config, require(user_config));
} else {
console.log('No user config specified. Using global settings.');
}
} catch (err) {
if (err.code == 'MODULE_NOT_FOUND') {
console.log("File %s not found.", user_config)
process.exit(1)
}
else {
console.error("Error reading user configutation", err);
process.exit(1)
console.log('File %s not found.', user_config);
process.exit(1);
} else {
console.error('Error reading user configutation', err);
process.exit(1);
}
} finally {
// export some variable
config.web.paths = config.routes
config.web.events = config.events
config.web.status = config.status
config.web.host = config.host
module.exports = config
config.web.paths = config.routes;
config.web.events = config.events;
config.web.status = config.status;
config.web.host = config.host;
module.exports = config;
}
function Parser()
{
'use strict';
function Parser() {
var args = process.argv.slice(2);
var help = function() {
console.log("\
var help = function () {
console.log('\
Usage: %s [-c config]\n\
-h print this help \n\
-c set user configuration file",
-c set user configuration file',
process.argv[1].split('/').pop());
process.exit(0);
}
};
this.getUserConfig = function() {
this.getUserConfig = function () {
var configFile = null;
args.forEach(function (val, index) {
if (val == '-c') {
configFile = args[index+1]
return
configFile = args[index + 1];
return;
}
})
});
if (configFile)
return process.cwd() + '/' + configFile;
else
return null
}
return null;
};
args.forEach(function (val, index) {
if (val == '-h') {
help()
help();
}
})
});
}
module.exports = Parser
var fs =require('fs')
, Tail = require('tail').Tail
'use strict';
Tail.prototype.watchEvent = function(e) {
var fs = require('fs'),
Tail = require('tail').Tail;
Tail.prototype.watchEvent = function (e) {
var _this = this;
if (e === 'change') {
return fs.stat(this.filename, function(err, stats) {
return fs.stat(this.filename, function (err, stats) {
if (err) {
_this.emit('error', err);
}
......@@ -19,18 +21,18 @@ Tail.prototype.watchEvent = function(e) {
});
_this.pos = stats.size;
if (_this.queue.length === 1) {
return _this.internalDispatcher.emit("next");
return _this.internalDispatcher.emit('next');
}
}
});
} else if (e === 'rename') {
this.unwatch();
_this.emit('error', "File " + this.filename + " deleted.");
_this.emit('error', 'File ' + this.filename + ' deleted.');
}
};
Tail.prototype.close = function() {
this.unwatch()
}
Tail.prototype.close = function () {
this.unwatch();
};
module.exports = Tail
\ No newline at end of file
module.exports = Tail;
var path = require('path')
, fs = require('fs')
, config = require('./config.js')
, Tail = require('./tail.js')
'use strict';
var path = require('path'),
fs = require('fs'),
config = require('./config.js'),
Tail = require('./tail.js');
function __errors_handler(from, err, socket) {
if (! socket)
from = "NO SOCKET: " + from
console.error(from, err)
if (!socket)
from = 'NO SOCKET: ' + from;
console.error(from, err);
if (socket)
socket.emit(config.events.error, err.message)
socket.emit(config.events.error, err.message);
}
function __check_no_backward(backward_path) {
try {
return backward_path.indexOf('..') < 0
} catch (err) { return true }
return backward_path.indexOf('..') < 0;
} catch (err) {
return true;
}
}
function __check_data_distribution(data) {
return __check_no_backward(data) && __check_no_backward(data.distribution) && __check_no_backward(data.distribution.name)
return __check_no_backward(data) && __check_no_backward(data.distribution) && __check_no_backward(data.distribution.name);
}
function __check_data_package(data) {
return __check_data_distribution(data) && __check_no_backward(data.package) && __check_no_backward(data.package.name) && __check_no_backward(data.package.version)
return __check_data_distribution(data) && __check_no_backward(data.package) && __check_no_backward(data.package.name) && __check_no_backward(data.package.version);
}
function __check_data_file(data) {
return __check_data_package(data) && __check_no_backward(data.file) && __check_no_backward(data.file.name)
return __check_data_package(data) && __check_no_backward(data.file) && __check_no_backward(data.file.name);
}
function __get_distribution_pool_path(data) {
return path.join(config.debomatic.path, data.distribution.name, 'pool')
return path.join(config.debomatic.path, data.distribution.name, 'pool');
}
function __get_package_path(data) {
return path.join(__get_distribution_pool_path(data), data.package.name + '_' + data.package.version)
return path.join(__get_distribution_pool_path(data), data.package.name + '_' + data.package.version);
}
function __get_file_path(data) {
return path.join(__get_package_path(data), data.package.name + '_' + data.package.version + '.' + data.file.name)
return path.join(__get_package_path(data), data.package.name + '_' + data.package.version + '.' + data.file.name);
}
function __get_files_list(dir, onlyDirectories, callback) {
fs.readdir(dir, function(err, files){
result = [];
fs.readdir(dir, function (err, files) {
var result = [];
if (err) {
__errors_handler("__get_files_list", err)
__errors_handler('__get_files_list', err);
return;
}
files.forEach( function(f) {
files.forEach(function (f) {
try {
complete_path = path.join(dir, f);
stat = fs.statSync(complete_path)
var complete_path = path.join(dir, f);
var stat = fs.statSync(complete_path);
if (onlyDirectories) {
if (stat.isDirectory()) {
result.push(f);
}
}
else {
} else {
if (stat.isFile()) {
result.push(f);
}
}
} catch (fs_error) {
__errors_handler("__get_files_list:forEach", fs_error)
return
__errors_handler('__get_files_list:forEach', fs_error);
return;
}
});
callback(result);
......@@ -72,102 +75,103 @@ function __get_files_list(dir, onlyDirectories, callback) {
}
function __watch_path_onsocket(event_name, socket, data, watch_path, updater) {
socket.get("watchers", function(err, socket_watchers){
if (! socket_watchers) {
socket.get('watchers', function (err, socket_watchers) {
if (!socket_watchers) {
// init socket watchers
socket_watchers = {}
socket_watchers = {};
}
try {
var watcher = socket_watchers[event_name]
var watcher = socket_watchers[event_name];
if (watcher)
watcher.close()
watcher.close();
fs.stat(watch_path, function(err, stats) {
fs.stat(watch_path, function (err, stats) {
if (err) {
__errors_handler("__watch_path_onsocket:fs.stat", err, socket)
return
__errors_handler('__watch_path_onsocket:fs.stat', err, socket);
return;
}
if (stats.isDirectory()) {
watcher = fs.watch(watch_path, {persistent: true}, function (event, fileName) {
if(event == 'rename')
updater(event_name, socket, data)
})
}
else if(stats.isFile()) {
watcher = new Tail(watch_path)
watcher.on('line', function(new_content, tailInfo) {
data.file.new_content = new_content + '\n'
updater(event_name, socket, data)
watcher = fs.watch(watch_path, {
persistent: true
}, function (event, fileName) {
if (event == 'rename')
updater(event_name, socket, data);
});
watcher.on('error', function(msg) {
} else if (stats.isFile()) {
watcher = new Tail(watch_path);
watcher.on('line', function (new_content, tailInfo) {
data.file.new_content = new_content + '\n';
updater(event_name, socket, data);
});
watcher.on('error', function (msg) {
socket.emit(config.events.error, msg);
});
}
socket_watchers[event_name] = watcher
socket.set("watchers", socket_watchers)
})
socket_watchers[event_name] = watcher;
socket.set('watchers', socket_watchers);
});
} catch (err) {
__errors_handler("__watch_path_onsocket <- " + arguments.callee.caller.name, err, socket)
return
__errors_handler('__watch_path_onsocket <- ' + arguments.callee.caller.name, err, socket);
return;
}
})
});
}
function __generic_handler_watcher(event_name, socket, data, watch_path, callback) {
callback(event_name, socket, data)
__watch_path_onsocket(event_name, socket, data, watch_path, callback)
callback(event_name, socket, data);
__watch_path_onsocket(event_name, socket, data, watch_path, callback);
}
function __send_distributions(socket) {
__get_files_list(config.debomatic.path, true, function(directories) {
var distributions = []
directories.forEach(function(dir) {
var data = {}
data.distribution = {}
data.distribution.name = dir
var pool_path = __get_distribution_pool_path(data)
__get_files_list(config.debomatic.path, true, function (directories) {
var distributions = [];
directories.forEach(function (dir) {
var data = {};
data.distribution = {};
data.distribution.name = dir;
var pool_path = __get_distribution_pool_path(data);
if (fs.existsSync(pool_path)) {
distributions.push(dir)
distributions.push(dir);
}
})
});
socket.emit(config.events.broadcast.distributions, distributions);
})
});
}
utils = {
check_data_distribution: function(data) {
return __check_data_distribution(data)
var utils = {
check_data_distribution: function (data) {
return __check_data_distribution(data);
},
check_data_package: function(data) {
return __check_data_package(data)
check_data_package: function (data) {
return __check_data_package(data);
},
check_data_file: function(data) {
return __check_data_file(data)
check_data_file: function (data) {
return __check_data_file(data);
},
get_distribution_pool_path: function(data) {
return __get_distribution_pool_path(data)
get_distribution_pool_path: function (data) {
return __get_distribution_pool_path(data);
},
get_package_path: function(data) {
return __get_package_path(data)
get_package_path: function (data) {
return __get_package_path(data);
},
get_file_path: function(data) {
return __get_file_path(data)
get_file_path: function (data) {
return __get_file_path(data);
},
get_files_list: function(dir, onlyDirectories, callback) {
return __get_files_list(dir, onlyDirectories, callback)
get_files_list: function (dir, onlyDirectories, callback) {
return __get_files_list(dir, onlyDirectories, callback);
},
watch_path_onsocket: function(event_name, socket, data, watch_path, updater) {
return __watch_path_onsocket(event_name, socket, data, watch_path, updater)
watch_path_onsocket: function (event_name, socket, data, watch_path, updater) {
return __watch_path_onsocket(event_name, socket, data, watch_path, updater);
},
generic_handler_watcher: function(event_name, socket, data, watch_path, callback) {
generic_handler_watcher: function (event_name, socket, data, watch_path, callback) {
return __generic_handler_watcher(event_name, socket, data, watch_path, callback);
},
send_distributions: function(socket) {
return __send_distributions(socket)
send_distributions: function (socket) {
return __send_distributions(socket);
},
errors_handler: function(from, error, socket) {
return __errors_handler(from, error, socket)
errors_handler: function (from, error, socket) {
return __errors_handler(from, error, socket);
}
}
};
module.exports = utils
module.exports = utils;
"use strict";
/*
General information about debugging:
......@@ -10,17 +11,17 @@
3 - socket emit data
4 - socket received data
*/
var debug = function() {
var debug = function () {
if (arguments.length < 2) {
return
return;
}
var level = arguments[0]
arguments[0] = "debug [" + level + "]:"
var level = arguments[0];
arguments[0] = "debug [" + level + "]:";
if (level <= config.preferences.debug) {
if (console.debug)
console.debug.apply(console, arguments)
console.debug.apply(console, arguments);
else
console.log.apply(console, arguments)
console.log.apply(console, arguments);
}
}
......@@ -30,11 +31,11 @@ var debug = function() {
usage: debug_socket("emit"|"received", event_name, data)
*/
var debug_socket = function() {
var debug_socket = function () {
if (arguments.length != 3)
return
return;
var level = 3;
if (arguments[0] == "received")
level = 4
debug(level, "socket", arguments[0], "event:", arguments[1], "data:", arguments[2])
level = 4;
debug(level, "socket", arguments[0], "event:", arguments[1], "data:", arguments[2]);
}
// main client javascript
'use strict';
var preferences = new Preferences()
var preferences = new Preferences();
var page_generic = new Page_Generic()
var page_generic = new Page_Generic();
if (window.location.pathname == config.paths.preferences) {
preferences.initPage()
preferences.initPage();
}
if (window.location.pathname == '/') {
// convert email addresses in the right format
var emails = $(".email")
$.each(emails, function (){
var subject = ''
var emails = $('.email');
$.each(emails, function () {
var subject = '';
if ($(this).attr('subject')) {
subject = '?subject=' + $(this).attr('subject')
subject = '?subject=' + $(this).attr('subject');
}
var real_email = $(this).attr('address').replace('AT','@').replace('DOT','.').replace(/ /g,'')
var label = real_email
if (config.debomatic.admin.name && config.debomatic.admin.name != 'Your Name')
label = config.debomatic.admin.name
real_email = '<a href="mailto:' + real_email + subject + '">' + label + '</a>'
$(this).html(real_email)
var real_email = $(this).attr('address').replace('AT', '@').replace('DOT', '.').replace(/ /g, '');
var label = real_email;
if (config.debomatic.admin.name && config.debomatic.admin.name != 'Your Name');
label = config.debomatic.admin.name;
real_email = '<a href="mailto:' + real_email + subject + '">' + label + '</a>';
$(this).html(real_email);
})
}
var socket = io.connect('/');
page_generic.start(socket)
page_generic.start(socket);
if (window.location.pathname == config.paths.distribution) {
new Page_Distrubion(socket).start()
new Page_Distrubion(socket).start();
}
'use strict';
// function to get all files in on click
// event comes from HTML
function download_all (div_id) {
frame_id = 'downloadAllFrame'
if ($("#" + frame_id).length > 0)
frame = $($("#" + frame_id)[0])
function download_all(div_id) {
var frame_id = 'downloadAllFrame';
var frame = null;
if ($('#' + frame_id).length > 0)
frame = $($('#' + frame_id)[0]);
else {
frame = $('<iframe></iframe>')
frame.hide()
frame.attr('id', frame_id)
$('body').append(frame)
}
files = $(div_id).find('ul li a')
$.each(files, function(index, item) {
setTimeout(function() {
frame.attr('src', item.href)
}, index * 1000)
})
frame = $('<iframe></iframe>');
frame.hide();
frame.attr('id', frame_id);
$('body').append(frame);
}
var files = $(div_id).find('ul li a');
$.each(files, function (index, item) {
setTimeout(function () {
frame.attr('src', item.href);
}, index * 1000);
});
}
function Page_Distrubion(socket)
{
function Page_Distrubion(socket) {
/*
......@@ -60,549 +62,533 @@ function Page_Distrubion(socket)
*/
var socket = socket
var _e = config.events.client
var view = Utils.from_hash_to_view()
var sidebarOffset = 0
var new_lines = []
var _e = config.events.client;
var view = Utils.from_hash_to_view();
var sidebarOffset = 0;
var new_lines = [];
function __check_hash_makes_sense() {
if (window.location.hash.indexOf('..') >= 0) {
error.set("Detected '..' God Is Watching You !")
return false
error.set('Detected ".." God Is Watching You !');
return false;
}
if (! window.location.hash) {
welcome.show()
return false
if (!window.location.hash) {
welcome.show();
return false;
}
var info = window.location.hash.split('/')
var info = window.location.hash.split('/');
if (info.length == 2)
window.location.hash = info[0]
return true
window.location.hash = info[0];
return true;
}
var title = {
set: function(label) {
set: function (label) {
if (label) {
$('#title').html(label)
page_generic.set_window_title(label)
return
$('#title').html(label);
page_generic.set_window_title(label);
return;
}
var label = ''
var window_title = null
label = '';
var window_title = null;
if (Utils.check_view_file(view)) {
var complete_name = view.package.orig_name + '.' + view.file.name
window_title = complete_name
if (! view.file.path)
view.file.path = config.paths.debomatic + '/' + view.distribution.name + '/pool/' + view.package.orig_name + '/' + complete_name
label = complete_name + ' \
<a class="btn btn-link btn-lg" title="Download" href="' + view.file.path + '">\
<span class="glyphicon glyphicon-download-alt"></span>\
</a>'
}
else if (Utils.check_view_package(view))
label = view.package.orig_name
var complete_name = view.package.orig_name + '.' + view.file.name;
window_title = complete_name;
if (!view.file.path);
view.file.path = config.paths.debomatic + '/' + view.distribution.name + '/pool/' + view.package.orig_name + '/' + complete_name;
label = complete_name + '<a class="btn btn-link btn-lg" title="Download" href="' + view.file.path + '"> ' +
'<span class="glyphicon glyphicon-download-alt"></span></a>';
} else if (Utils.check_view_package(view))
label = view.package.orig_name;
else if (Utils.check_view_distribution(view))
label = view.distribution.name
$('#title').html(label)
label = view.distribution.name;
$('#title').html(label);
if (window_title)
label = window_title
page_generic.set_window_title(label)
label = window_title;
page_generic.set_window_title(label);
},
clean: function() {
$('#title').html('')
page_generic.set_window_title()
}
clean: function () {
$('#title').html('');
page_generic.set_window_title();
}
};
var packages = {
set: function (socket_data) {
packages.clean()
var tmp = Utils.clone(socket_data)
tmp.file = null
view.packages = {}
packages.clean();
var tmp = Utils.clone(socket_data);
tmp.file = null;
view.packages = {};
if (socket_data.distribution.packages && socket_data.distribution.packages.length > 0) {
socket_data.distribution.packages.forEach(function(p){
tmp.package = p
socket_data.distribution.packages.forEach(function (p) {
tmp.package = p;
// get datestamp if package is clicked
$('#packages ul').append('<li id="package-' + p.orig_name + '"><a href="' + Utils.from_view_to_hash(tmp) + '/datestamp">'+ p.name + ' <span>'+p.version+'</span></a></li>')
view.packages[p.orig_name] = Utils.clone(p)
})
packages.select()
}
else {
$('#packages ul').append('<li class="text-muted">No packages yet</li>')
$('#packages ul').append('<li id="package-' + p.orig_name + '"><a href="' +
Utils.from_view_to_hash(tmp) + '/datestamp">' + p.name + ' <span>' + p.version + '</span></a></li>');
view.packages[p.orig_name] = Utils.clone(p);
});
packages.select();
} else {
$('#packages ul').append('<li class="text-muted">No packages yet</li>');
}
packages.show()
sticky.updateOffset()
packages.show();
sticky.updateOffset();
},
clean: function () {
$('#packages ul').html('')
$('#packages ul').html('');
},
get: function () {
if (Utils.check_view_distribution(view)) {
var query_data = {}
query_data.distribution = view.distribution
debug_socket("emit", _e.distribution_packages.get, query_data)
socket.emit(_e.distribution_packages.get, query_data)
var query_data = {};
query_data.distribution = view.distribution;
debug_socket('emit', _e.distribution_packages.get, query_data);
socket.emit(_e.distribution_packages.get, query_data);
}
},
select: function() {
packages.unselect()
select: function () {
packages.unselect();
if (Utils.check_view_package(view)) {
$("#packages li[id='package-"+ view.package.orig_name + "']").addClass('active')
$('#packages li[id="package-' + view.package.orig_name + '"]').addClass('active');
}
},
unselect: function() {
$('#packages li').removeClass('active')
unselect: function () {
$('#packages li').removeClass('active');
},
set_status: function (status_data) {
// set status in view
if ( view.distribution.name == status_data.distribution
&& view.packages[status_data.package] )
{
view.packages[status_data.package].status = status_data.status
if (view.distribution.name == status_data.distribution && view.packages[status_data.package]) {
view.packages[status_data.package].status = status_data.status;
if (status_data.hasOwnProperty('success'))
view.packages[status_data.package].success = status_data.success
view.packages[status_data.package].success = status_data.success;
else
delete(view.packages[status_data.package].success)
delete(view.packages[status_data.package].success);
}
// and in html
var p_html = $("#packages li[id='package-"+ status_data.package + "'] a")
p_html.find('span.icon').remove()
p_html.append(Utils.get_status_icon_html(status_data))
if (Utils.check_view_package(view)
&& view.package.orig_name == status_data.package
&& view.distribution.name == status_data.distribution)
{
var p_html = $('#packages li[id="package-' + status_data.package + '"] a');
p_html.find('span.icon').remove();
p_html.append(Utils.get_status_icon_html(status_data));
if (Utils.check_view_package(view) && view.package.orig_name == status_data.package && view.distribution.name == status_data.distribution) {
// in case user is watching this package, update also view.package
view.package = Utils.clone(view.packages[status_data.package])
view.package = Utils.clone(view.packages[status_data.package]);
}
},
show: function() {
$("#packages").show()
show: function () {
$('#packages').show();
},
hide: function() {
$("#packages").hide()
}
hide: function () {
$('#packages').hide();
}
};
var files = {
set: function (socket_data) {
files.clean()
var tmp = Utils.clone(socket_data)
files.clean();
var tmp = Utils.clone(socket_data);
if (socket_data.package.files && socket_data.package.files.length > 0) {
// update view
view.package.files = Utils.clone(socket_data.package.files)
view.package.files = Utils.clone(socket_data.package.files);
// update html
socket_data.package.files.forEach(function(f){
tmp.file = f
var html_file = $('<li id="file-'+ f.orig_name +'"><a title="'+ f.orig_name +'" href="'+ Utils.from_view_to_hash(tmp) + '">' + f.name + '</a></li>')
html_file.on("click", function(){
files.select(this)
})
$('#logs ul').append(html_file)
})
$('#logs').show()
files.select()
socket_data.package.files.forEach(function (f) {
tmp.file = f;
var html_file = $('<li id="file-' + f.orig_name + '"><a title="' + f.orig_name + '" href="' +
Utils.from_view_to_hash(tmp) + '">' + f.name + '</a></li>');
html_file.on('click', function () {
files.select(this);
});
$('#logs ul').append(html_file);
});
$('#logs').show();
files.select();
}
if (socket_data.package.debs && socket_data.package.debs.length > 0) {
// update view
view.package.debs = Utils.clone(socket_data.package.debs)
view.package.debs = Utils.clone(socket_data.package.debs);
// update.html
socket_data.package.debs.forEach(function(f){
$('#debs ul').append('<li><a title="'+ f.orig_name +'" href="' + f.path + '">' + f.name +'</a> <span>.' + f.extension + '</span></li>')
})
$('#debs').show()
socket_data.package.debs.forEach(function (f) {
$('#debs ul').append('<li><a title="' + f.orig_name + '" href="' + f.path + '">' +
f.name + '</a> <span>.' + f.extension + '</span></li>');
});
$('#debs').show();
}
if (socket_data.package.sources && socket_data.package.sources.length > 0) {
// update view
view.package.sources = Utils.clone(socket_data.package.sources)
view.package.sources = Utils.clone(socket_data.package.sources);
// update html
socket_data.package.sources.forEach(function(f){
$('#sources ul').append('<li><a title="'+ f.orig_name +'" href="' + f.path + '">' + f.name +'</a></li>')
socket_data.package.sources.forEach(function (f) {
$('#sources ul').append('<li><a title="' + f.orig_name + '" href="' + f.path + '">' + f.name + '</a></li>');
})
$('#sources').show()
$('#sources').show();
}
files.show()
sticky.updateOffset()
files.show();
sticky.updateOffset();
},
clean: function() {
clean: function () {
$('#logs ul').html('');
$('#logs').hide()
$('#logs').hide();
$('#debs ul').html('');
$('#debs').hide();
$('#sources ul').html('')
$('#sources').hide()
files.hide()
$('#sources ul').html('');
$('#sources').hide();
files.hide();
},
get: function () {
if (Utils.check_view_package(view)) {
var query_data = {}
query_data.distribution = view.distribution
query_data.package = view.package
debug_socket("emit", _e.package_files_list.get, query_data)
socket.emit(_e.package_files_list.get, query_data)
var query_data = {};
query_data.distribution = view.distribution;
query_data.package = view.package;
debug_socket('emit', _e.package_files_list.get, query_data);
socket.emit(_e.package_files_list.get, query_data);
}
},
select: function() {
files.show()
files.unselect()
select: function () {
files.show();
files.unselect();
if (Utils.check_view_file(view)) {
$("#logs li[id='file-" + view.file.orig_name + "']").addClass('active')
$('#logs li[id="file-' + view.file.orig_name + '"]').addClass('active');
}
},
unselect: function() {
unselect: function () {
$('#logs li').removeClass('active');
},
hide: function() {
$('#files').hide()
hide: function () {
$('#files').hide();
},
show: function() {
$('#files').show()
show: function () {
$('#files').show();
},
}
};
var file = {
set: function(socket_data) {
view.file = Utils.clone(socket_data.file)
$("#file pre").html(socket_data.file.content)
$("#file").show()
set: function (socket_data) {
view.file = Utils.clone(socket_data.file);
$('#file pre').html(socket_data.file.content);
$('#file').show();
},
clean: function() {
$('#file pre').html('')
$('#file').hide()
clean: function () {
$('#file pre').html('');
$('#file').hide();
},
append: function(new_content) {
var content = $("#file pre")
content.append(new_content)
append: function (new_content) {
var content = $('#file pre');
content.append(new_content);
if (config.preferences.autoscroll) {
// scroll down if file is covering footer
var file_height = $("#fileOffset").offset().top
var footerOffset = $("footer").offset().top
var file_height = $('#fileOffset').offset().top;
var footerOffset = $('footer').offset().top;
if (file_height > footerOffset) {
debug(2, 'scoll down on new content')
$('html,body').animate({ scrollTop: file_height }, 0);
debug(2, 'scoll down on new content');
$('html,body').animate({
scrollTop: file_height
}, 0);
}
}
},
get: function() {
get: function () {
if (Utils.check_view_file(view)) {
var query_data = {}
query_data.distribution = view.distribution
query_data.package = view.package
query_data.file = view.file
query_data.file.content = null
var query_data = {};
query_data.distribution = view.distribution;
query_data.package = view.package;
query_data.file = view.file;
query_data.file.content = null;
// get a feedback to user while downloading file
$("#file pre").html("Downloading file, please wait a while ...")
$("#file").show()
debug_socket("emit", _e.file.get, query_data)
socket.emit(_e.file.get, query_data)
}
$('#file pre').html('Downloading file, please wait a while ...');
$('#file').show();
debug_socket('emit', _e.file.get, query_data);
socket.emit(_e.file.get, query_data);
}
}
};
var breadcrumb = {
update: function(label) {
update: function (label) {
if (label) {
$('.breadcrumb').html('<li class="active">' + label + '</li>')
return
}
hash = window.location.hash.replace('#', '')
var new_html = ''
var new_hash = '#'
var info = hash.split('/')
for (var i = 0; i < info.length ; i++) {
new_hash += info[i]
$('.breadcrumb').html('<li class="active">' + label + '</li>');
return;
}
var hash = window.location.hash.replace('#', '');
var new_html = '';
var new_hash = '#';
var info = hash.split('/');
for (var i = 0; i < info.length; i++) {
new_hash += info[i];
if (i == (info.length - 1))
new_html += '<li class="active">' + info[i] + '</li>'
new_html += '<li class="active">' + info[i] + '</li>';
else
new_html += '<li><a href="' + new_hash + '">' + info[i] + '</a>'
new_hash += '/'
}
$('.breadcrumb').html(new_html)
new_html += '<li><a href="' + new_hash + '">' + info[i] + '</a>';
new_hash += '/';
}
$('.breadcrumb').html(new_html);
}
};
// sticky sidebar
var sticky = {
init: function() {
if (sidebarOffset == 0)
return
init: function () {
if (sidebarOffset === 0)
return;
if ($(window).scrollTop() > sidebarOffset) {
sticky.show()
sticky.show();
} else {
sticky.hide()
sticky.updateOffset()
sticky.hide();
sticky.updateOffset();
}
},
start: function() {
$(window).scroll(sticky.init)
start: function () {
$(window).scroll(sticky.init);
},
stop: function() {
$(window).off("scroll")
stop: function () {
$(window).off('scroll');
},
reset: function() {
sticky.stop()
sticky.update()
sticky.init()
sticky.start()
reset: function () {
sticky.stop();
sticky.update();
sticky.init();
sticky.start();
},
show: function() {
show: function () {
if (config.preferences.sidebar) {
$("#sticky").addClass('fixed')
$('#sticky').addClass('fixed');
}
debug(2, "showing sticky")
$("#sticky-package").fadeIn()
debug(2, 'showing sticky');
$('#sticky-package').fadeIn();
},
hide: function() {
$("#sticky").removeClass('fixed')
$("#sticky-package").fadeOut(150)
hide: function () {
$('#sticky').removeClass('fixed');
$('#sticky-package').fadeOut(150);
},
update: function() {
sticky.updateOffset()
update: function () {
sticky.updateOffset();
if (Utils.check_view_distribution(view))
$("#sticky-package .distribution").html(view.distribution.name)
$('#sticky-package .distribution').html(view.distribution.name);
if (Utils.check_view_package(view)) {
$("#sticky-package .name").html(view.package.name)
$("#sticky-package .version").html(view.package.version)
sticky.set_status()
$('#sticky-package .name').html(view.package.name);
$('#sticky-package .version').html(view.package.version);
sticky.set_status();
}
},
updateOffset: function() {
var sidebar = $("#files")
sidebarOffset = sidebar.offset().top
updateOffset: function () {
var sidebar = $('#files');
sidebarOffset = sidebar.offset().top;
},
set_status: function(status_data) {
if (! status_data) {
status_data = {}
status_data.distribution = view.distribution.name
status_data.package = view.package.orig_name
status_data.status = view.package.status
set_status: function (status_data) {
if (!status_data) {
status_data = {};
status_data.distribution = view.distribution.name;
status_data.package = view.package.orig_name;
status_data.status = view.package.status;
if (view.package.hasOwnProperty('success'))
status_data.success = view.package.success
status_data.success = view.package.success;
}
if ( Utils.check_view_package(view)
&& status_data.distribution == view.distribution.name
&& status_data.package == view.package.orig_name)
{
if (Utils.check_view_package(view) && status_data.distribution == view.distribution.name && status_data.package == view.package.orig_name) {
// update html
var info = Utils.get_status_icon_and_class(status_data)
var panel = $("#sticky-package-content")
panel.removeClass()
panel.addClass('panel panel-' + info.className)
var div = $("#sticky-package .status")
div.find('span.icon').remove()
div.append(Utils.get_status_icon_html(status_data))
}
var info = Utils.get_status_icon_and_class(status_data);
var panel = $('#sticky-package-content');
panel.removeClass();
panel.addClass('panel panel-' + info.className);
var div = $('#sticky-package .status');
div.find('span.icon').remove();
div.append(Utils.get_status_icon_html(status_data));
}
}
};
var error = {
set: function(socket_error) {
$("#error span").html(socket_error)
error.view()
set: function (socket_error) {
$('#error span').html(socket_error);
error.view();
},
clean: function() {
$("#error").hide()
$("#error span").html('')
clean: function () {
$('#error').hide();
$('#error span').html('');
},
view: function() {
$("#error").fadeIn(100)
title.set("Something is wrong ...")
breadcrumb.update('Something is wrong ...')
file.clean()
files.hide()
unselect()
view: function () {
$('#error').fadeIn(100);
title.set('Something is wrong ...');
breadcrumb.update('Something is wrong ...');
file.clean();
files.hide();
unselect();
},
}
};
var welcome = {
set: function(distributions) {
welcome.clean()
if(distributions.length < 1) {
$('#welcome').append('<p class="lead text-muted">There is no distribution at the moment</p>')
}
else {
distributions.forEach(function (name){
$('#welcome').append('<a class="btn btn-lg btn-primary" href="'+ config.paths.distribution + '#'+ name + '">' + name + '</a>');
set: function (distributions) {
welcome.clean();
if (distributions.length < 1) {
$('#welcome').append('<p class="lead text-muted">There is no distribution at the moment</p>');
} else {
distributions.forEach(function (name) {
$('#welcome').append('<a class="btn btn-lg btn-primary" href="' + config.paths.distribution +
'# ' + name + '">' + name + '</a>');
});
}
},
show: function() {
title.set("Please select a distribution")
breadcrumb.update("Select a distribution")
packages.hide()
file.clean()
files.hide()
unselect()
$("#welcome").show()
show: function () {
title.set('Please select a distribution');
breadcrumb.update('Select a distribution');
packages.hide();
file.clean();
files.hide();
unselect();
$('#welcome').show();
},
clean: function() {
$("#welcome").html('')
clean: function () {
$('#welcome').html('');
},
hide: function() {
$("#welcome").hide()
}
hide: function () {
$('#welcome').hide();
}
};
var preferences = function() {
if (! config.preferences.sidebar) {
debug(2, "no sidebar - updating html")
$("#sidebar").removeClass()
$("#sidebar").addClass("col-md-12 row")
$("#packages").addClass("col-md-4")
$("#logs").addClass("col-md-4")
$("#files .others").addClass("col-md-4")
$("#main").removeClass().addClass("col-md-12")
$("#sticky-package").addClass("on-top")
var preferences = function () {
if (!config.preferences.sidebar) {
debug(2, 'no sidebar - updating html');
$('#sidebar').removeClass();
$('#sidebar').addClass('col-md-12 row');
$('#packages').addClass('col-md-4');
$('#logs').addClass('col-md-4');
$('#files .others').addClass('col-md-4');
$('#main').removeClass().addClass('col-md-12');
$('#sticky-package').addClass('on-top');
}
if (! config.preferences.file_background) {
$("#file pre").addClass("no-background")
}
$("#file pre").css('font-size', config.preferences.file_fontsize)
if (!config.preferences.file_background) {
$('#file pre').addClass('no-background');
}
$('#file pre').css('font-size', config.preferences.file_fontsize);
};
var select = function() {
unselect()
var select = function () {
unselect();
if (Utils.check_view_distribution(view)) {
$("#distributions li[id='distribution-" + view.distribution.name + "']").addClass('active')
}
packages.select()
files.select()
}
var unselect = function() {
$('#distributions li').removeClass('active')
files.unselect()
packages.unselect()
}
var clean = function() {
welcome.hide()
title.clean()
packages.clean()
files.clean()
file.clean()
unselect()
breadcrumb.update()
error.clean()
}
$('#distributions li[id="distribution-' + view.distribution.name + '"]').addClass('active');
}
packages.select();
files.select();
};
var unselect = function () {
$('#distributions li').removeClass('active');
files.unselect();
packages.unselect();
};
var clean = function () {
welcome.hide();
title.clean();
packages.clean();
files.clean();
file.clean();
unselect();
breadcrumb.update();
error.clean();
};
var update = {
page: function(old_view) {
if ( ! old_view
|| ! Utils.check_view_distribution(old_view)
|| ! Utils.check_view_distribution(view)
|| view.distribution.name != old_view.distribution.name
|| ! view.package.orig_name
)
{ // new distribution view
populate()
return
}
else if ( ! Utils.check_view_package(old_view) ||
! Utils.check_view_package(view) ||
view.package.orig_name != old_view.package.orig_name )
{ // new package view
files.get()
file.get()
}
else if ( ! Utils.check_view_file(old_view) ||
! Utils.check_view_file(view) ||
view.file.name != old_view.file.name )
{ // new file view
file.get()
}
update.view(view)
},
view : function() {
error.clean()
title.set()
breadcrumb.update()
select()
sticky.reset()
}
}
page: function (old_view) {
if (!old_view || !Utils.check_view_distribution(old_view) || !Utils.check_view_distribution(view) || view.distribution.name != old_view.distribution.name || !view.package.orig_name) { // new distribution view
populate();
return;
} else if (!Utils.check_view_package(old_view) || !Utils.check_view_package(view) ||
view.package.orig_name != old_view.package.orig_name) { // new package view
files.get();
file.get();
} else if (!Utils.check_view_file(old_view) || !Utils.check_view_file(view) ||
view.file.name != old_view.file.name) { // new file view
file.get();
}
update.view(view);
},
view: function () {
error.clean();
title.set();
breadcrumb.update();
select();
sticky.reset();
}
};
var populate = function () {
clean()
packages.get()
files.get()
file.get()
update.view()
}
clean();
packages.get();
files.get();
file.get();
update.view();
};
this.start = function () {
socket.on(config.events.error, function(socket_error) {
debug_socket("received", config.events.error, socket_error)
error.set(socket_error)
})
socket.on(config.events.error, function (socket_error) {
debug_socket('received', config.events.error, socket_error);
error.set(socket_error);
});
socket.on(config.events.broadcast.distributions, function (socket_data) {
debug_socket("received", config.events.broadcast.distributions, socket_data)
welcome.set(socket_data)
})
debug_socket('received', config.events.broadcast.distributions, socket_data);
welcome.set(socket_data);
});
socket.on(_e.distribution_packages.set, function (socket_data){
debug_socket("received", _e.distribution_packages.set, socket_data)
packages.set(socket_data)
})
socket.on(_e.distribution_packages.set, function (socket_data) {
debug_socket('received', _e.distribution_packages.set, socket_data);
packages.set(socket_data);
});
socket.on(_e.distribution_packages.status, function (socket_data){
debug_socket("received", _e.distribution_packages.set, socket_data)
packages.set_status(socket_data)
sticky.set_status(socket_data)
})
socket.on(_e.distribution_packages.status, function (socket_data) {
debug_socket('received', _e.distribution_packages.set, socket_data);
packages.set_status(socket_data);
sticky.set_status(socket_data);
});
socket.on(config.events.broadcast.status_update, function (socket_data){
packages.set_status(socket_data)
sticky.set_status(socket_data)
})
socket.on(config.events.broadcast.status_update, function (socket_data) {
packages.set_status(socket_data);
sticky.set_status(socket_data);
});
socket.on(_e.package_files_list.set, function (socket_data){
debug_socket("received", _e.package_files_list.set, socket_data)
files.set(socket_data)
})
socket.on(_e.package_files_list.set, function (socket_data) {
debug_socket('received', _e.package_files_list.set, socket_data);
files.set(socket_data);
});
socket.on(_e.file.set, function (socket_data) {
debug_socket("received", _e.file.set, socket_data)
file.set(socket_data)
})
debug_socket('received', _e.file.set, socket_data);
file.set(socket_data);
});
socket.on(_e.file_newcontent, function (socket_data) {
debug_socket("received", _e.file_newcontent, socket_data)
new_lines.push(socket_data.file.new_content)
})
debug_socket('received', _e.file_newcontent, socket_data);
new_lines.push(socket_data.file.new_content);
});
$(window).on('hashchange', function() {
if (! __check_hash_makes_sense())
return
var old_view = Utils.clone(view)
var new_view = Utils.from_hash_to_view()
$(window).on('hashchange', function () {
if (!__check_hash_makes_sense())
return;
var old_view = Utils.clone(view);
var new_view = Utils.from_hash_to_view();
// reset current view
view.distribution = Utils.clone(new_view.distribution)
view.package = Utils.clone(new_view.package)
view.distribution = Utils.clone(new_view.distribution);
view.package = Utils.clone(new_view.package);
if (view.packages[new_view.package.orig_name])
view.package = Utils.clone(view.packages[new_view.package.orig_name])
view.file = Utils.clone(new_view.file)
update.page(old_view)
$('html,body').animate({scrollTop: 0}, 0);
debug(1, "changing view", "old:", old_view, "new:", view)
view.package = Utils.clone(view.packages[new_view.package.orig_name]);
view.file = Utils.clone(new_view.file);
update.page(old_view);
$('html,body').animate({
scrollTop: 0
}, 0);
debug(1, 'changing view', 'old:', old_view, 'new:', view);
});
if (! __check_hash_makes_sense())
return
populate()
if (!__check_hash_makes_sense())
return;
populate();
// Init sticky-package back_on_top on click
$("#sticky-package").on("click", function(){
$('html,body').animate({scrollTop: 0}, 100);
})
$('#sticky-package').on('click', function () {
$('html,body').animate({
scrollTop: 0
}, 100);
});
// WORKAROUND:
// when page is loaded sidebar has offset().top
......@@ -615,15 +601,15 @@ function Page_Distrubion(socket)
// Append lines every 200 mills.
function watch_for_new_lines() {
if (new_lines.length > 0) {
file.append(new_lines.join(''))
new_lines = []
file.append(new_lines.join(''));
new_lines = [];
}
setTimeout(watch_for_new_lines, 200);
}
watch_for_new_lines()
watch_for_new_lines();
// Update html according with preferences
preferences()
preferences();
}
};
}
function Page_Generic()
{
var _e = config.events
'use strict';
function Page_Generic() {
var _e = config.events;
function __get_status_html_id(status_data) {
var result = 'status-' + status_data.status + '-' + status_data.distribution
var result = 'status-' + status_data.status + '-' + status_data.distribution;
if (status_data.hasOwnProperty('package'))
result += '-' + status_data.package
return result
result += '-' + status_data.package;
return result;
}
function __get_status_html_href(status_data) {
result = config.paths.distribution + '#' + status_data.distribution
result = config.paths.distribution + '#' + status_data.distribution;
if (status_data.hasOwnProperty('package'))
result += '/' + status_data.package.replace('_', '/') + '/datestamp'
return result
result += '/' + status_data.package.replace('_', '/') + '/datestamp';
return result;
}
function __get_status_html_title(status_data) {
result = status_data.status + ': ' + status_data.distribution
result = status_data.status + ': ' + status_data.distribution;
if (status_data.hasOwnProperty('package'))
result += ' > ' + status_data.package
result += ' > ' + status_data.package;
if (status_data.hasOwnProperty('uploader') && status_data.uploader.length > 0)
result += ' by ' + status_data.uploader
return result
result += ' by ' + status_data.uploader;
return result;
}
function __get_status_html_inner(status_data) {
if (status_data.hasOwnProperty('package'))
return status_data.package;
return status_data.distribution
return status_data.distribution;
}
function __get_status_html(status_data) {
var _s = status_data
var li = $('<li></li>')
li.attr('id', __get_status_html_id(status_data))
var button = $('<a></a>')
button.addClass('btn btn-xs')
button.addClass(_s.status)
button.attr('title', __get_status_html_title(_s))
button.attr('href', __get_status_html_href(_s))
button.html(__get_status_html_inner(_s))
var info = Utils.get_status_icon_and_class(_s)
button.addClass('btn-' + info.className)
var _s = status_data;
var li = $('<li></li>');
li.attr('id', __get_status_html_id(status_data));
var button = $('<a></a>');
button.addClass('btn btn-xs');
button.addClass(_s.status);
button.attr('title', __get_status_html_title(_s));
button.attr('href', __get_status_html_href(_s));
button.html(__get_status_html_inner(_s));
var info = Utils.get_status_icon_and_class(_s);
button.addClass('btn-' + info.className);
// add icon
button.html(button.html() + ' ' + Utils.get_status_icon_html(_s))
li.html(button)
var result = $('<div></div>')
result.html(li)
return result.html()
button.html(button.html() + ' ' + Utils.get_status_icon_html(_s));
li.html(button);
var result = $('<div></div>');
result.html(li);
return result.html();
}
var distributions = {
set: function(distributions) {
set: function (distributions) {
$('#distributions ul').html('');
if(distributions.length < 1) {
$('#distributions ul').append('<li><a title="There is no distribution at the moment" onclick="return false">None</li>')
}
else {
distributions.forEach(function (name){
$('#distributions ul').append('<li id="distribution-' + name +'"><a href="'+ config.paths.distribution + '#'+ name + '">' + name + '</a></li>');
if (distributions.length < 1) {
$('#distributions ul').append('<li><a title="There is no distribution at the moment" onclick="return false">None</li>');
} else {
distributions.forEach(function (name) {
$('#distributions ul').append('<li id="distribution-' + name + '"><a href="' + config.paths.distribution + '#' + name + '">' + name + '</a></li>');
});
if (window.location.pathname == config.paths.distribution) {
var data = Utils.from_hash_to_view()
var data = Utils.from_hash_to_view();
if (Utils.check_view_distribution(data)) {
$("#distributions li[id='distribution-" + data.distribution.name + "']").addClass('active')
$('#distributions li[id="distribution-' + data.distribution.name + '"]').addClass('active');
}
}
}
......@@ -72,107 +72,104 @@ function Page_Generic()
}
var status = {
set: function(data_status) {
$("#status ul").html('')
set: function (data_status) {
$("#status ul").html('');
if (data_status.length > 0) {
data_status.forEach(function(s){
status.append(s)
data_status.forEach(function (s) {
status.append(s);
})
}
},
append: function(status_data) {
$('#status .idle').hide()
$("#status ul").append(__get_status_html(status_data))
append: function (status_data) {
$('#status .idle').hide();
$("#status ul").append(__get_status_html(status_data));
},
update: function(status_data) {
update: function (status_data) {
var li = $("#status li[id='" + __get_status_html_id(status_data) + "']")
if (li.length > 0
&& status_data.hasOwnProperty('success'))
{
var li = $('#status li[id="' + __get_status_html_id(status_data) + '"]');
if (li.length > 0 && status_data.hasOwnProperty('success')) {
// Update color and icon
li = $(li[0])
li.html($(__get_status_html(status_data)).children())
li.attr('id', '')
li = $(li[0]);
li.html($(__get_status_html(status_data)).children());
li.attr('id', '');
// This is a chain to have a fadeOut and correctly
// delete status li from list.
// The first timemout fades out the status element.
setTimeout(function() {
li.children().fadeOut(config.status.delay.fadeOut)
setTimeout(function () {
li.children().fadeOut(config.status.delay.fadeOut);
// Then resize list.
setTimeout(function() {
li.animate({width: 'toggle'})
}, config.status.delay.fadeOut)
setTimeout(function () {
li.animate({
width: 'toggle'
});
}, config.status.delay.fadeOut);
// Finally remove status html
// and show idle label if necessary.
setTimeout(function() {
li.remove()
if ($('#status li').length == 0)
$('#status .idle').show()
}, config.status.delay.remove + 2000) // more delay on remove html
}, config.status.delay.remove)
}
else if (!status_data.hasOwnProperty('success')) {
status.append(status_data)
setTimeout(function () {
li.remove();
if ($('#status li').length === 0);
$('#status .idle').show();
}, config.status.delay.remove + 2000); // more delay on remove html
}, config.status.delay.remove);
} else if (!status_data.hasOwnProperty('success')) {
status.append(status_data);
}
},
}
};
this.preferences = function() {
this.preferences = function () {
if (config.preferences.header) {
$("#pageheader").show()
$(".navbar .home-link").hide()
}
else {
$("#pageheader").hide()
$(".navbar .home-link").show()
$('#pageheader').show();
$('.navbar .home-link').hide();
} else {
$('#pageheader').hide();
$('.navbar .home-link').show();
}
if (config.preferences.glossy_theme) {
if ($("head").find("link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']").length == 0)
$("head").append('<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">')
}
else {
$("head").find("link[href='/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css']").remove()
}
if ($('head').find('link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]').length === 0)
$('head').append('<link rel="stylesheet" href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css">');
} else {
$('head').find('link[href="/external_libs/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css"]').remove();
}
};
this.set_window_title = function (label) {
var window_title_separator = ' \u00ab '
var window_title_separator = ' \u00ab ';
if (label)
window.document.title = label + window_title_separator + config.title
window.document.title = label + window_title_separator + config.title;
else
window.document.title = config.title
}
window.document.title = config.title;
};
this.start = function (socket) {
// update distributions
socket.on(_e.broadcast.distributions, function(socket_distributions) {
debug_socket("received", _e.broadcast.distributions, socket_distributions)
distributions.set(socket_distributions)
socket.on(_e.broadcast.distributions, function (socket_distributions) {
debug_socket('received', _e.broadcast.distributions, socket_distributions);
distributions.set(socket_distributions);
});
socket.on(_e.client.status, function(socket_status) {
debug_socket("received", _e.client.status, socket_status)
status.set(socket_status)
})
socket.on(_e.client.status, function (socket_status) {
debug_socket('received', _e.client.status, socket_status);
status.set(socket_status);
});
socket.on(_e.broadcast.status_update, function(package_status) {
debug_socket("received", _e.broadcast.status_update, package_status)
status.update(package_status)
})
socket.on(_e.broadcast.status_update, function (package_status) {
debug_socket('received', _e.broadcast.status_update, package_status);
status.update(package_status);
});
socket.on(_e.error, function(error) {
console.error("socket > " + error)
})
}
socket.on(_e.error, function (error) {
console.error('socket > ' + error);
});
};
// select current page in navbar
if (window.location.pathname != config.paths.distribution) {
$(".navbar li a[href='" + window.location.pathname + "']").parent().addClass("active")
$('.navbar li a[href="' + window.location.pathname + '"]').parent().addClass('active');
}
// update html according with preferences
this.preferences()
this.preferences();
}
'use strict';
function Preferences() {
// update config.preferences according with user choices
var load = function () {
for (key in config.preferences) {
if ((value = localStorage.getItem(key))) {
debug(2, 'loading preference', key, value)
config.preferences[key] = JSON.parse(value)
}
for (var key in config.preferences) {
var value = localStorage.getItem(key);
if (value) {
debug(2, 'loading preference', key, value);
config.preferences[key] = JSON.parse(value);
}
}
};
// set prefence
var set = function (key, value) {
if (config.preferences.hasOwnProperty(key)) {
debug(1, 'setting preference', key, value)
localStorage.setItem(key, value)
config.preferences[key] = JSON.parse(value)
}
debug(1, 'setting preference', key, value);
localStorage.setItem(key, value);
config.preferences[key] = JSON.parse(value);
}
};
// init prefence page
this.initPage = function() {
this.initPage = function () {
page_generic.set_window_title("Preferences")
page_generic.set_window_title('Preferences');
// set view according with config.preferences
for (key in config.preferences) {
var element = $("#preferences #" + key)
if (element.attr('type') == "checkbox") {
element.prop('checked', config.preferences[key])
}
else {
element.val(config.preferences[key])
for (var key in config.preferences) {
var element = $('#preferences #' + key);
if (element.attr('type') == 'checkbox') {
element.prop('checked', config.preferences[key]);
} else {
element.val(config.preferences[key]);
}
}
// on input change, set prefence
$("#preferences input, #preferences select").change(function() {
var key = $(this).attr('id')
var value = $(this).val()
$('#preferences input, #preferences select').change(function () {
var key = $(this).attr('id');
var value = $(this).val();
if ($(this).attr('type') == 'checkbox')
value = $(this).is(':checked')
set(key,value)
value = $(this).is(':checked');
set(key, value);
// give to user an immediate feedback changing preferences
page_generic.preferences()
})
}
page_generic.preferences();
});
};
load()
load();
}
'use strict';
var Utils = {
from_hash_to_view: function (hash) {
if (! hash )
hash = window.location.hash
hash = hash.replace('#', '')
info = hash.split('/');
var view = {}
view.distribution = {}
view.packages = {}
view.package = {}
view.file = {}
if (!hash)
hash = window.location.hash;
hash = hash.replace('#', '');
var info = hash.split('/');
var view = {};
view.distribution = {};
view.packages = {};
view.package = {};
view.file = {};
if (info.length >= 1) {
view.distribution.name = info[0];
}
if (info.length >= 3){
if (info.length >= 3) {
view.package.name = info[1];
view.package.version = info[2];
view.package.orig_name = view.package.name + '_' + view.package.version
view.package.orig_name = view.package.name + '_' + view.package.version;
}
if (info.length >= 4) {
view.file.name = info[3]
view.file.orig_name = view.package.orig_name + '.' + view.file.name
view.file.name = info[3];
view.file.orig_name = view.package.orig_name + '.' + view.file.name;
}
return view
return view;
},
from_view_to_hash: function (view) {
hash = "#"
var hash = '#';
if (Utils.check_view_distribution(view)) {
hash = hash + view.distribution.name
hash = hash + view.distribution.name;
if (Utils.check_view_package(view)) {
hash = hash + '/' + view.package.name + "/" + view.package.version
hash = hash + '/' + view.package.name + '/' + view.package.version;
if (Utils.check_view_file(view))
hash = hash + '/' + view.file.name
hash = hash + '/' + view.file.name;
}
}
return hash
return hash;
},
check_view_distribution: function(view) {
return view && view.distribution && view.distribution.name
check_view_distribution: function (view) {
return view && view.distribution && view.distribution.name;
},
check_view_package: function(view) {
return Utils.check_view_distribution(view) && view.package && view.package.name && view.package.version && view.package.orig_name
check_view_package: function (view) {
return Utils.check_view_distribution(view) && view.package && view.package.name && view.package.version && view.package.orig_name;
},
check_view_file: function(view) {
return Utils.check_view_package(view) && view.file && view.file.name
check_view_file: function (view) {
return Utils.check_view_package(view) && view.file && view.file.name;
},
get_status_icon_and_class: function (status_data) {
var _c = config.status.className
var _i = config.status.icons
var _s = status_data
var className = null
var icon = null
var _c = config.status.className;
var _i = config.status.icons;
var _s = status_data;
var className = null;
var icon = null;
if (_s.hasOwnProperty('success')) {
if (_s.success == true) {
className = _c.success
icon = _i.success
}
else {
className = _c.fail
icon = _i.fail
if (_s.success === true) {
className = _c.success;
icon = _i.success;
} else {
className = _c.fail;
icon = _i.fail;
}
}
else {
className = _c[_s.status]
icon = _i[_s.status]
} else {
className = _c[_s.status];
icon = _i[_s.status];
}
// do not change color if update or create and successed
if (_s.success == true &&
_s.status != config.status.build)
{
className = _c[_s.status]
if (_s.success === true &&
_s.status != config.status.build) {
className = _c[_s.status];
}
return {
className: className,
icon: icon
}
};
},
get_status_icon_html: function (status_data) {
info = Utils.get_status_icon_and_class(status_data)
return '<span class="icon glyphicon glyphicon-' + info.icon + '"></span>'
var info = Utils.get_status_icon_and_class(status_data);
return '<span class="icon glyphicon glyphicon-' + info.icon + '"></span>';
},
// clone an object via JSON
clone: function (object) {
return JSON.parse(JSON.stringify(object));
}
}
};
......@@ -24,7 +24,11 @@
</nav>
<div class="others">
<nav id="sources">
<h4>Sources</h4>
<h4>Sources
<a class="btn btn-link" title="Get all sources in one click" onclick="download_all('#sources')">
<span class="glyphicon glyphicon-download-alt"></span>
</a>
</h4>
<ul></ul>
</nav>
<nav id="debs">
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment