Skip to content

Commit

Permalink
db version on overview page (Closes #115) (#117)
Browse files Browse the repository at this point in the history
* db version on overview page

* added new db version in env

* using correct variable for ARTEMIS versions in frontend

* eslint exceptions
  • Loading branch information
pgigis committed Feb 27, 2019
1 parent f690de9 commit 0842d8e
Show file tree
Hide file tree
Showing 14 changed files with 85 additions and 39 deletions.
2 changes: 1 addition & 1 deletion .env
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Docker specific configs
# use only letters and numbers for the project name
COMPOSE_PROJECT_NAME=artemis
DB_VERSION=9
DB_VERSION=10
GUI_ENABLED=true
SYSTEM_VERSION=latest

Expand Down
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
- Automated DB backups
- View hijack by key
- Enable sorting for columns: # Peers Seen/# ASes Infected
- Added DB version on overview page

### Changed
- Testing refactoring
Expand Down
2 changes: 1 addition & 1 deletion backend/entrypoint
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ start_backend() {
echo "[+] Starting Backend"
if [ "$GUI_ENABLED" = "true" ]; then
./wait-for graphql:8080 -t 60
curl -s "http://graphql:8080/v1/query" -H "Content-Type: application/json" -H "X-Hasura-Access-Key: ${HASURA_GRAPHQL_ACCESS_KEY}" --data '{"type":"replace_metadata","args":{"tables":[{"table":"view_processes","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["name","running","timestamp"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_bgpupdates","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["prefix","origin_as","peer_asn","as_path","service","type","communities","timestamp","hijack_key","handled","matched_prefix","orig_path"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_configs","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["raw_config","comment","time_modified"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_hijacks","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["active","comment","configured_prefix","hijack_as","ignored","key","mitigation_started","num_asns_inf","num_peers_seen","peers_seen","peers_withdrawn","prefix","resolved","seen","time_detected","time_ended","time_last","time_started","timestamp_of_config","type","under_mitigation","withdrawn","outdated"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]}],"query_templates":[],"remote_schemas":[]}}' > /dev/null
curl -s "http://graphql:8080/v1/query" -H "Content-Type: application/json" -H "X-Hasura-Access-Key: ${HASURA_GRAPHQL_ACCESS_KEY}" --data '{"type":"replace_metadata","args":{"tables":[{"table":"view_db_details","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["version","upgraded_on"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_processes","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["name","running","timestamp"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_bgpupdates","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["prefix","origin_as","peer_asn","as_path","service","type","communities","timestamp","hijack_key","handled","matched_prefix","orig_path"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_configs","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["raw_config","comment","time_modified"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_hijacks","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["active","comment","configured_prefix","hijack_as","ignored","key","mitigation_started","num_asns_inf","num_peers_seen","peers_seen","peers_withdrawn","prefix","resolved","seen","time_detected","time_ended","time_last","time_started","timestamp_of_config","type","under_mitigation","withdrawn","outdated"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]}],"query_templates":[],"remote_schemas":[]}}' > /dev/null
fi
service cron start
sed -i 's/bind 127.0.0.1/# bind 127.0.0.1/g' /etc/redis/redis.conf
Expand Down
2 changes: 1 addition & 1 deletion backend/entrypoint.test
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ start_backend() {
echo "[+] Starting Backend"
if [ "$GUI_ENABLED" = "true" ]; then
./wait-for graphql:8080 -t 60
curl -s "http://graphql:8080/v1/query" -H "Content-Type: application/json" -H "X-Hasura-Access-Key: ${HASURA_GRAPHQL_ACCESS_KEY}" --data '{"type":"replace_metadata","args":{"tables":[{"table":"view_processes","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["name","running","timestamp"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_bgpupdates","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["prefix","origin_as","peer_asn","as_path","service","type","communities","timestamp","hijack_key","handled","matched_prefix","orig_path"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_configs","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["raw_config","comment","time_modified"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_hijacks","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["active","comment","configured_prefix","hijack_as","ignored","key","mitigation_started","num_asns_inf","num_peers_seen","peers_seen","peers_withdrawn","prefix","resolved","seen","time_detected","time_ended","time_last","time_started","timestamp_of_config","type","under_mitigation","withdrawn","outdated"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]}],"query_templates":[],"remote_schemas":[]}}' > /dev/null
curl -s "http://graphql:8080/v1/query" -H "Content-Type: application/json" -H "X-Hasura-Access-Key: ${HASURA_GRAPHQL_ACCESS_KEY}" --data '{"type":"replace_metadata","args":{"tables":[{"table":"view_db_details","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["version","upgraded_on"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_processes","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["name","running","timestamp"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_bgpupdates","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["prefix","origin_as","peer_asn","as_path","service","type","communities","timestamp","hijack_key","handled","matched_prefix","orig_path"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_configs","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["raw_config","comment","time_modified"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]},{"table":"view_hijacks","object_relationships":[],"array_relationships":[],"insert_permissions":[],"select_permissions":[{"role":"user","comment":null,"permission":{"allow_aggregations":true,"columns":["active","comment","configured_prefix","hijack_as","ignored","key","mitigation_started","num_asns_inf","num_peers_seen","peers_seen","peers_withdrawn","prefix","resolved","seen","time_detected","time_ended","time_last","time_started","timestamp_of_config","type","under_mitigation","withdrawn","outdated"],"filter":{}}}],"update_permissions":[],"delete_permissions":[],"event_triggers":[]}],"query_templates":[],"remote_schemas":[]}}' > /dev/null
fi
service cron start
sed -i 's/bind 127.0.0.1/# bind 127.0.0.1/g' /etc/redis/redis.conf
Expand Down
1 change: 1 addition & 0 deletions backend/migrate/migrations/scripts/migration_10.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
CREATE OR REPLACE VIEW view_db_details AS SELECT version, upgraded_on FROM db_details;
6 changes: 6 additions & 0 deletions backend/migrate/migrations/target_steps.json
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,12 @@
"db_version": "9",
"description": "Expanded hijacks type field from 5 to 7 characters to support policy dimension and migrated hijacks",
"file": "migration_9.sql"
},
"10": {
"id": "10",
"db_version": "10",
"description": "Added the view_db_details view",
"file": "migration_10.sql"
}
}
}
4 changes: 3 additions & 1 deletion backend/testing/db/data/tables.sql
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ CREATE TRIGGER db_details_no_delete
BEFORE DELETE ON db_details
FOR EACH ROW EXECUTE PROCEDURE db_version_no_delete();

INSERT INTO db_details (version, upgraded_on) VALUES (9, now());
INSERT INTO db_details (version, upgraded_on) VALUES (10, now());

CREATE TABLE IF NOT EXISTS bgp_updates (
key VARCHAR ( 32 ) NOT NULL,
Expand Down Expand Up @@ -166,3 +166,5 @@ BEFORE UPDATE ON process_states
FOR EACH ROW EXECUTE PROCEDURE update_timestamp();

CREATE OR REPLACE VIEW view_processes AS SELECT * FROM process_states;

CREATE OR REPLACE VIEW view_db_details AS SELECT version, upgraded_on FROM db_details;
46 changes: 36 additions & 10 deletions frontend/webapp/static/js/custom/graphql.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ function waitForConnection(ws, message) {
}

var dbstatsCalled = false;
function fetchDbStatsLive(ws, cb_func) {
function fetchDbStatsLive(ws, cb_func) { // eslint-disable-line no-unused-vars
if(dbstatsCalled) {
waitForConnection(ws, JSON.stringify({id: "1", type: "stop"}));
}
Expand All @@ -35,15 +35,15 @@ function fetchDbStatsLive(ws, cb_func) {
});
dbstatsCalled=true;
}

}


var datatableCalled = false;
function stopDatatableLive(ws){
function stopDatatableLive(ws){ // eslint-disable-line no-unused-vars
waitForConnection(ws, JSON.stringify({id: "2", type: "stop"}));
}

function startDatatableLive(ws, query){
function startDatatableLive(ws, query){ // eslint-disable-line no-unused-vars
waitForConnection(ws, JSON.stringify({
id: "2",
type: "start",
Expand All @@ -56,7 +56,7 @@ function startDatatableLive(ws, query){
}));
}

function fetchDatatableLive(ws, cb_func, query) {
function fetchDatatableLive(ws, cb_func, query) { // eslint-disable-line no-unused-vars
if(datatableCalled) {
waitForConnection(ws, JSON.stringify({id: "2", type: "stop"}));
}
Expand All @@ -71,7 +71,6 @@ function fetchDatatableLive(ws, cb_func, query) {
query: "subscription getLiveTable " + query
}
}));

if(!datatableCalled) {
ws.addEventListener('message', (event) => {
data = JSON.parse(event.data);
Expand All @@ -88,7 +87,7 @@ function fetchDatatableLive(ws, cb_func, query) {
}
}

function fetchDatatable(cb_func, query) {
function fetchDatatable(cb_func, query) { // eslint-disable-line no-unused-vars
fetch("/jwt/auth", {
method: "GET",
credentials: 'include'
Expand Down Expand Up @@ -119,7 +118,7 @@ function fetchDatatable(cb_func, query) {
.catch(error => console.error(error));
}

function fetchDistinctValues(type, query) {
function fetchDistinctValues(type, query) { // eslint-disable-line no-unused-vars
fetch("/jwt/auth", {
method: "GET",
credentials: 'include'
Expand Down Expand Up @@ -183,7 +182,7 @@ function fetchDistinctValues(type, query) {
}

var processStateCalled = false;
function fetchProcStatesLive(ws, cb_func) {
function fetchProcStatesLive(ws, cb_func) { // eslint-disable-line no-unused-vars
if(processStateCalled) {
waitForConnection(ws, JSON.stringify({id: "3", type: "stop"}));
}
Expand All @@ -210,7 +209,7 @@ function fetchProcStatesLive(ws, cb_func) {
}

var configStatsCalled = false;
function fetchConfigStatsLive(ws, cb_func) {
function fetchConfigStatsLive(ws, cb_func) { // eslint-disable-line no-unused-vars
if(configStatsCalled) {
waitForConnection(ws, JSON.stringify({id: "5", type: "stop"}));
}
Expand All @@ -235,3 +234,30 @@ function fetchConfigStatsLive(ws, cb_func) {
configStatsCalled = true;
}
}

function fetchDBVersion() { // eslint-disable-line no-unused-vars
fetch("/jwt/auth", {
method: "GET",
credentials: 'include'
})
.then(response => response.json())
.then(data => {
fetch("/api/graphql", {
method: "POST",
headers: {
"Content-Type": "application/json; charset=utf-8",
"Authorization":"Bearer " + data['access_token']
},
body: JSON.stringify({
query: "query getDBstats { view_data: view_db_details { version, upgraded_on } }"
})
})
.then(response => response.json())
.then(data => {
$('#database_version').text(data['data']['view_data'][0].version)
}
)
.catch(error => console.error(error));
})
.catch(error => console.error(error));
}
3 changes: 1 addition & 2 deletions frontend/webapp/static/js/custom/ripestat.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ function getData(ASN){
return Promise.all([getName(ASN), getCountry(ASN)]);
}

function asn_map_to_name(){
function asn_map_to_name(){ // eslint-disable-line no-unused-vars
$("cc_as").mouseover(function() {
// For some browsers, `attr` is undefined; for others,
// `attr` is false. Check for both.
Expand All @@ -31,7 +31,6 @@ function asn_map_to_name(){
var ASN_str = $(this).text();
}
var ASN_int = parseInt(ASN_str);
var result = null;

if(ASN_str in cachedData){
var html = '<p class="tooltip-custom-margin">ASN: ' + ASN_str + ' (ASN-DOT: ' + cachedData[ASN_str][2] + ')</br>';
Expand Down
14 changes: 7 additions & 7 deletions frontend/webapp/static/js/custom/utils.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
function format_hijacks_datatable(data){
function format_hijacks_datatable(data){ // eslint-disable-line no-unused-vars
if('code' in data){ // its an error
return {};
}
Expand All @@ -8,7 +8,7 @@ function format_hijacks_datatable(data){
return data;
}

function format_datatable(data){
function format_datatable(data){ // eslint-disable-line no-unused-vars
if('code' in data){ // its an error
return {};
}
Expand Down Expand Up @@ -52,7 +52,7 @@ function format_hijack_entry(data){
return data;
}

function format_bgp_updates_datatable(data){
function format_bgp_updates_datatable(data){ // eslint-disable-line no-unused-vars
if('code' in data){ // its an error
return {};
}
Expand Down Expand Up @@ -181,13 +181,13 @@ function format_communities(n) {
}), "[" + t.slice(0, -2) + "]"
}

function transform_unix_timestamp_to_client_local_time(n) {
function transform_unix_timestamp_to_client_local_time(n) { // eslint-disable-line no-unused-vars
if (0 == n) return "Never";
var t = moment.unix(n);
return moment(t).local().format("DD-MM-YYYY HH:mm:ss")
}

function isValidDate(n) {
function isValidDate(n) { // eslint-disable-line no-unused-vars
return n instanceof Date && !isNaN(n)
}

Expand All @@ -202,11 +202,11 @@ function hijack_key_create_link(hijack_key){
return '';
}

function display_hijack_key(n) {
function display_hijack_key(n) { // eslint-disable-line no-unused-vars
return null != n && "0" != n ? n : ""
}

function display_timezone(){
function display_timezone(){ // eslint-disable-line no-unused-vars
var offset = new Date().getTimezoneOffset();
if(offset<0)
return "GMT+" + (offset/-60) + ' (' + Intl.DateTimeFormat().resolvedOptions().timeZone + ')';
Expand Down
34 changes: 22 additions & 12 deletions frontend/webapp/templates/index.htm
Original file line number Diff line number Diff line change
Expand Up @@ -194,22 +194,31 @@ <h1 class="page-header">Dashboard</h1>
$('#modules_states li').not('li:first').remove();
data['view_processes'].sort((str1, str2) => (str1['name'] < str2['name'] ? -1 : +(str1['name'] > str2['name'])));
for (var key in data['view_processes']) {
var html_ = '<li class="list-group-item"><div class="row"><div class="col-lg-4" helpText="field_'
html_ += data['view_processes'][key].name.split('_')[0] +'">'
html_ += data['view_processes'][key].name.charAt(0).toUpperCase() + data['view_processes'][key].name.slice(1) + '</div><div class="col-lg-8">'
html_ += '<div class="row"><div class="col-lg-4">'
var html_ = [];
html_.push('<li class="list-group-item"><div class="row"><div class="col-lg-4" helpText="field_');
html_.push(data['view_processes'][key].name.split('_')[0]);
html_.push('">');
var module_name = data['view_processes'][key].name.charAt(0).toUpperCase() + data['view_processes'][key].name.slice(1);
if(module_name == "Database"){
module_name += " v.<text id=\"database_version\"></text>";
}
html_.push(module_name);
html_.push('</div><div class="col-lg-8">');
html_.push('<div class="row"><div class="col-lg-4">');
if(data['view_processes'][key].running){
html_ += '<b style="color:#008000">On</b></div>'
html_.push('<b style="color:#008000">On</b></div>');
var seconds_elapsed = elapsed_seconds(data['view_processes'][key].timestamp);
html_ += '<div class="col-lg-8"><time_passed elapsed="' + seconds_elapsed + '">'
html_ += calculate_time_passed(seconds_elapsed)
html_ += '</time_passed></div></div>'
html_.push('<div class="col-lg-8"><time_passed elapsed="');
html_.push(seconds_elapsed);
html_.push('">');
html_.push(calculate_time_passed(seconds_elapsed));
html_.push('</time_passed></div></div>');
}else{
html_ += '<b style="color:#ff0000">Off</b></div>'
html_ += '<div class="col-lg-8"> </div></div>'
html_.push('<b style="color:#ff0000">Off</b></div>');
html_.push('<div class="col-lg-8"> </div></div>');
}
html_ += '</div></div></li>'
$('#modules_states').append(html_);
html_.push('</div></div></li>');
$('#modules_states').append(html_.join(''));
}
displayHelpTextStats();
}
Expand Down Expand Up @@ -495,6 +504,7 @@ <h1 class="page-header">Dashboard</h1>
render_table(ws);
fetchDbStatsLive(ws, render_db_stats);
fetchProcStatesLive(ws, render_modules_state);
fetchDBVersion();
$('#hijacks_table').on( 'draw.dt', function () {
asn_map_to_name();
});
Expand Down
3 changes: 1 addition & 2 deletions frontend/webapp/templates/layout.htm
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,8 @@
<p class="float-right">
<a href="#">Back to top</a>
</p>
<p>ARTEMIS version {{ version }}</p>
<p>ARTEMIS v.'{{ version }}'</p>
</div>
</footer>

{% endblock %}
{% endblock %}
Loading

0 comments on commit 0842d8e

Please sign in to comment.