hieraviz 0.1.2 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/app/apiv1.rb +23 -18
- data/app/common.rb +38 -48
- data/app/public/js/base-switch.js +22 -20
- data/app/public/js/farms.js +4 -23
- data/app/public/js/main.js +35 -15
- data/app/public/js/nodes.js +17 -36
- data/app/views/_head.erb +4 -2
- data/app/views/_layout.erb +3 -1
- data/app/views/home.erb +1 -1
- data/app/views/store.erb +2 -2
- data/app/web.rb +50 -44
- data/config.ru +2 -4
- data/lib/hieraviz/auth_gitlab.rb +28 -25
- data/lib/hieraviz/config.rb +7 -6
- data/lib/hieraviz/facts.rb +6 -3
- data/lib/hieraviz/puppetdb.rb +1 -0
- data/lib/hieraviz/store.rb +28 -21
- data/lib/hieraviz/utilities.rb +14 -0
- data/lib/hieraviz.rb +6 -6
- data/spec/app/apiv1_spec.rb +188 -79
- data/spec/app/web_dummy_auth_spec.rb +11 -0
- data/spec/app/web_spec.rb +11 -13
- data/spec/files/config_dummy.yml +0 -1
- data/spec/lib/auth_gitlab_spec.rb +73 -21
- data/spec/lib/config_spec.rb +5 -8
- data/spec/lib/facts_spec.rb +14 -11
- data/spec/lib/puppetdb_spec.rb +18 -0
- data/spec/lib/store_spec.rb +40 -49
- data/spec/oauth2_helper.rb +5 -3
- data/spec/sinatra_helper.rb +2 -4
- data/spec/spec_helper.rb +10 -8
- metadata +73 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b4eaf9279a8b9ffdd555aa1d48fcf395a648b5e2
|
4
|
+
data.tar.gz: 3325be3798ce496aea8ce0f99e1c58348ef72805
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1365f4a1804d57eae53a2ea56fa47a8a0be87eb605a98e575ba075dc76a68ca398c5e33125a5dcc73e9a9f95fa8dc6c30b1a38fb98270cc6e248c66f67941f77
|
7
|
+
data.tar.gz: f46e79ebd53ade534fad598bf09ce5584b41e6ff943ff65fca029fffc9089e1ea9a9d0598994a87f4c6bad2b87f7a5a2f00878757d6b361c0ec25507200e8907
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
Hieraviz Changelog
|
2
2
|
========================
|
3
3
|
|
4
|
+
### v0.2.0 - 2014-03-03
|
5
|
+
- fix button display on firefox
|
6
|
+
- fixes on http simple auth
|
7
|
+
- various refactoring
|
8
|
+
|
4
9
|
### v0.1.2 - 2016-02-22
|
5
10
|
- add a way to write custom local facts
|
6
11
|
- add display of nodes info on node panel
|
data/app/apiv1.rb
CHANGED
@@ -19,29 +19,39 @@ module HieravizApp
|
|
19
19
|
|
20
20
|
case settings.configdata['auth_method']
|
21
21
|
when 'dummy'
|
22
|
+
|
22
23
|
helpers do
|
23
24
|
def check_authorization
|
25
|
+
logger.info session['access_token']
|
26
|
+
if !session['access_token'] && !request.env['HTTP_X_AUTH']
|
27
|
+
redirect '/v1/not_logged'
|
28
|
+
end
|
24
29
|
true
|
25
30
|
end
|
26
31
|
end
|
32
|
+
|
27
33
|
when 'gitlab', 'http'
|
34
|
+
|
28
35
|
helpers do
|
29
36
|
def check_authorization
|
30
37
|
if !session['access_token'] && !request.env['HTTP_X_AUTH']
|
31
38
|
redirect '/v1/not_logged'
|
32
39
|
else
|
33
40
|
token = session['access_token'] || request.env['HTTP_X_AUTH']
|
34
|
-
session_info =
|
35
|
-
|
41
|
+
session_info = settings.store.get(token, settings.configdata['session_renew'])
|
42
|
+
unless session_info['username']
|
36
43
|
redirect '/v1/unauthorized'
|
37
44
|
end
|
38
45
|
end
|
39
46
|
end
|
40
47
|
end
|
48
|
+
|
41
49
|
end
|
42
50
|
|
43
51
|
helpers do
|
44
|
-
|
52
|
+
def get_facts(base, node)
|
53
|
+
Hieraviz::Facts.new(settings.configdata['tmpdir'], base, node, username)
|
54
|
+
end
|
45
55
|
end
|
46
56
|
|
47
57
|
get %r{^/?([-_\.a-zA-Z0-9]+)?/nodes} do |base|
|
@@ -73,23 +83,20 @@ module HieravizApp
|
|
73
83
|
|
74
84
|
get %r{^/?([-_\.a-zA-Z0-9]+)?/node/([-_\.a-zA-Z0-9]+)/facts} do |base, node|
|
75
85
|
check_authorization
|
76
|
-
|
77
|
-
facts = Hieraviz::Facts.new(settings.configdata['tmpdir'], base, node, get_username)
|
86
|
+
facts = get_facts(base, node)
|
78
87
|
json facts.read
|
79
88
|
end
|
80
89
|
|
81
90
|
post %r{^/?([-_\.a-zA-Z0-9]+)?/node/([-_\.a-zA-Z0-9]+)/facts} do |base, node|
|
82
91
|
check_authorization
|
83
|
-
|
84
|
-
facts = Hieraviz::Facts.new(settings.configdata['tmpdir'], base, node, get_username)
|
92
|
+
facts = get_facts(base, node)
|
85
93
|
data = JSON.parse(request.body.read.to_s)
|
86
94
|
json facts.write(data)
|
87
95
|
end
|
88
96
|
|
89
97
|
delete %r{^/?([-_\.a-zA-Z0-9]+)?/node/([-_\.a-zA-Z0-9]+)/facts} do |base, node|
|
90
98
|
check_authorization
|
91
|
-
|
92
|
-
facts = Hieraviz::Facts.new(settings.configdata['tmpdir'], base, node, get_username)
|
99
|
+
facts = get_facts(base, node)
|
93
100
|
json facts.remove
|
94
101
|
end
|
95
102
|
|
@@ -118,9 +125,8 @@ module HieravizApp
|
|
118
125
|
hieracles_config = prepare_config(base, node)
|
119
126
|
hiera = Hieracles::Hiera.new(hieracles_config)
|
120
127
|
nodeinfo = Hieracles::Node.new(node, hieracles_config)
|
121
|
-
facts =
|
122
|
-
|
123
|
-
res = {
|
128
|
+
facts = get_facts(base, node)
|
129
|
+
res = {
|
124
130
|
'hiera' => hiera.hierarchy,
|
125
131
|
'vars' => hiera.params,
|
126
132
|
'info' => nodeinfo.info,
|
@@ -134,9 +140,8 @@ module HieravizApp
|
|
134
140
|
get %r{^/?([-_\.a-zA-Z0-9]+)?/farm/([-_\.a-zA-Z0-9]+)$} do |base, farm|
|
135
141
|
check_authorization
|
136
142
|
hieracles_config = prepare_config(base)
|
137
|
-
nodes = Hieracles::Registry.nodes_data(hieracles_config, base).
|
138
|
-
|
139
|
-
a
|
143
|
+
nodes = Hieracles::Registry.nodes_data(hieracles_config, base).each_with_object({}) do |(key, val), acc|
|
144
|
+
acc[key] = val if val['farm'] == farm
|
140
145
|
end
|
141
146
|
json nodes
|
142
147
|
end
|
@@ -148,15 +153,15 @@ module HieravizApp
|
|
148
153
|
end
|
149
154
|
|
150
155
|
get '/not_logged' do
|
151
|
-
json(
|
156
|
+
json(error: 'Not connected.')
|
152
157
|
end
|
153
158
|
|
154
159
|
get '/unauthorized' do
|
155
|
-
json(
|
160
|
+
json(error: 'Unauthorized')
|
156
161
|
end
|
157
162
|
|
158
163
|
not_found do
|
159
|
-
json(
|
164
|
+
json(error: 'Endpoint not found')
|
160
165
|
end
|
161
166
|
|
162
167
|
end
|
data/app/common.rb
CHANGED
@@ -7,99 +7,91 @@ module HieravizApp
|
|
7
7
|
configure do
|
8
8
|
set :app_name, 'HieraViz'
|
9
9
|
set :configdata, Hieraviz::Config.load
|
10
|
-
set :config, Hieracles::Config.new({ config: Hieraviz::Config.configfile })
|
11
10
|
set :basepaths, Hieraviz::Config.basepaths
|
11
|
+
set :store, Hieraviz::Store.new(settings.configdata['tmpdir'])
|
12
12
|
enable :session
|
13
13
|
enable :logging
|
14
14
|
end
|
15
15
|
|
16
16
|
helpers do
|
17
|
-
|
18
17
|
case settings.configdata['auth_method']
|
19
18
|
when 'dummy'
|
20
19
|
|
21
|
-
def
|
20
|
+
def username
|
22
21
|
'Dummy'
|
23
22
|
end
|
24
|
-
|
23
|
+
|
24
|
+
def userinfo
|
25
25
|
{ 'username' => 'Dummy' }
|
26
26
|
end
|
27
27
|
|
28
28
|
when 'http'
|
29
29
|
|
30
|
-
def
|
30
|
+
def username
|
31
31
|
settings.configdata['http_auth']['username']
|
32
32
|
end
|
33
|
-
|
33
|
+
|
34
|
+
def userinfo
|
34
35
|
{ 'username' => settings.configdata['http_auth']['username'] }
|
35
36
|
end
|
36
37
|
|
37
38
|
when 'gitlab'
|
38
|
-
|
39
|
-
def
|
39
|
+
|
40
|
+
def username
|
40
41
|
if session['access_token']
|
41
|
-
session_info =
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
''
|
46
|
-
end
|
42
|
+
session_info = settings.store.get(session['access_token'], settings.configdata['session_renew'])
|
43
|
+
session_info['username'] || ''
|
44
|
+
else
|
45
|
+
''
|
47
46
|
end
|
48
47
|
end
|
49
48
|
|
50
|
-
def
|
51
|
-
|
49
|
+
def userinfo
|
50
|
+
settings.store.get(session['access_token'], settings.configdata['session_renew'])
|
52
51
|
end
|
53
|
-
|
52
|
+
|
54
53
|
end
|
55
54
|
|
56
|
-
def prepare_config(
|
57
|
-
|
58
|
-
path = get_path(
|
55
|
+
def prepare_config(paths, node = nil)
|
56
|
+
paths ||= File.basename(settings.configdata['basepath'])
|
57
|
+
path = get_path(paths)[0]
|
59
58
|
if path
|
60
59
|
@base = get_base(path)
|
61
|
-
@base_name = @base.gsub(
|
62
|
-
get_config(path, cached_params(
|
60
|
+
@base_name = @base.gsub(%r{/}, '')
|
61
|
+
get_config(path, cached_params(paths, node))
|
63
62
|
end
|
64
63
|
end
|
65
64
|
|
66
65
|
def cached_params(base, node)
|
67
66
|
if node
|
68
|
-
cache = Hieraviz::Facts.new settings.configdata['tmpdir'], base, node,
|
69
|
-
if cache.exist?
|
70
|
-
return cache.read
|
71
|
-
end
|
67
|
+
cache = Hieraviz::Facts.new settings.configdata['tmpdir'], base, node, username
|
68
|
+
return cache.read if cache.exist?
|
72
69
|
end
|
73
70
|
{}
|
74
71
|
end
|
75
72
|
|
76
|
-
def prepare_params(
|
77
|
-
|
78
|
-
path = get_path(
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
73
|
+
def prepare_params(paths)
|
74
|
+
paths ||= File.basename(settings.configdata['basepath'])
|
75
|
+
path = get_path(paths)[0]
|
76
|
+
return unless path
|
77
|
+
settings.configdata['basepath'] = path
|
78
|
+
settings.configdata
|
83
79
|
end
|
84
|
-
|
80
|
+
|
85
81
|
def get_path(path)
|
86
82
|
if settings.basepaths
|
87
|
-
settings.basepaths.select do |
|
88
|
-
path == File.basename(
|
83
|
+
settings.basepaths.select do |file|
|
84
|
+
path == File.basename(file)
|
89
85
|
end
|
90
86
|
else
|
91
|
-
[
|
87
|
+
[settings.configdata['basepath']]
|
92
88
|
end
|
93
89
|
end
|
94
|
-
|
90
|
+
|
95
91
|
def get_config(path, extra)
|
96
92
|
args = { config: Hieraviz::Config.configfile }
|
97
|
-
if path
|
98
|
-
|
99
|
-
end
|
100
|
-
if extra.length > 0
|
101
|
-
args[:params] = format_params(extra)
|
102
|
-
end
|
93
|
+
args[:basepath] = path if path
|
94
|
+
args[:params] = format_params(extra) unless extra.empty?
|
103
95
|
Hieracles::Config.new args
|
104
96
|
end
|
105
97
|
|
@@ -108,12 +100,10 @@ module HieravizApp
|
|
108
100
|
end
|
109
101
|
|
110
102
|
def format_params(params)
|
111
|
-
params.
|
112
|
-
|
113
|
-
a
|
103
|
+
params.each_with_object([]) do |(key, val), acc|
|
104
|
+
acc << "#{key}=#{val}"
|
114
105
|
end.join(',')
|
115
106
|
end
|
116
|
-
|
117
107
|
end
|
118
108
|
|
119
109
|
end
|
@@ -1,27 +1,29 @@
|
|
1
|
-
|
2
1
|
ready( () => {
|
3
2
|
var bases = document.querySelectorAll('.base .all .select');
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
if (bases.length > 0) {
|
4
|
+
var button = document.querySelector(".base .current");
|
5
|
+
var menu = document.querySelector(".base .all");
|
6
|
+
var menuvisible = false;
|
7
|
+
filterBox(".base .all .filter input", bases);
|
8
|
+
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
button.addEventListener('click', (ev) => {
|
11
|
+
if (menuvisible) {
|
12
|
+
removeClass(menu, "focus");
|
13
|
+
} else {
|
14
|
+
addClass(menu, "focus");
|
15
|
+
}
|
16
|
+
menuvisible = !menuvisible;
|
17
|
+
});
|
17
18
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
/* declaration of events for the bases menu */
|
20
|
+
Array.prototype.forEach.call(bases, (item, i) => {
|
21
|
+
item.addEventListener('click', (ev) => {
|
22
|
+
var url = window.location;
|
23
|
+
base = ev.target.textContent;
|
24
|
+
url.pathname = url.pathname.replace(/^\/[^\/]+/,"/"+base);
|
25
|
+
});
|
24
26
|
});
|
25
|
-
});
|
26
27
|
|
28
|
+
}
|
27
29
|
});
|
data/app/public/js/farms.js
CHANGED
@@ -10,7 +10,7 @@ https://fetch.spec.whatwg.org
|
|
10
10
|
*/
|
11
11
|
|
12
12
|
function ready(fn) {
|
13
|
-
if (document.readyState
|
13
|
+
if (document.readyState !== 'loading') {
|
14
14
|
fn();
|
15
15
|
} else {
|
16
16
|
document.addEventListener('DOMContentLoaded', fn);
|
@@ -24,25 +24,6 @@ ready( () => {
|
|
24
24
|
focusNav('farms');
|
25
25
|
filterBox(".side .filter input", farms);
|
26
26
|
|
27
|
-
function restore_url(list) {
|
28
|
-
if (window.location.hash != '') {
|
29
|
-
var target = window.location.hash.replace(/#/,'');
|
30
|
-
var parts = target.split('/');
|
31
|
-
Array.prototype.forEach.call(list, (item, i) => {
|
32
|
-
if (item.textContent == parts[0]) {
|
33
|
-
if (parts[1] != undefined) {
|
34
|
-
Farm[parts[1]](parts[0]);
|
35
|
-
} else {
|
36
|
-
var event = document.createEvent('HTMLEvents');
|
37
|
-
event.initEvent('click', true, false);
|
38
|
-
item.dispatchEvent(event);
|
39
|
-
}
|
40
|
-
}
|
41
|
-
});
|
42
|
-
}
|
43
|
-
}
|
44
|
-
|
45
|
-
|
46
27
|
function build_list(top, title, hash) {
|
47
28
|
window.location.hash = '#'+title;
|
48
29
|
top.innerHTML = "<h3>Farm "+title+"</h3>";
|
@@ -74,7 +55,7 @@ ready( () => {
|
|
74
55
|
fetch('/v1/' + base + '/farm/' + farm, auth_header()).
|
75
56
|
then(res => res.json()).
|
76
57
|
then(j => {
|
77
|
-
if (j.error
|
58
|
+
if (j.error !== undefined) {
|
78
59
|
show_error(meat, j['error']);
|
79
60
|
} else {
|
80
61
|
build_list(meat, farm, j);
|
@@ -86,7 +67,7 @@ ready( () => {
|
|
86
67
|
}
|
87
68
|
removeClass(meat, 'wait');
|
88
69
|
});
|
89
|
-
}
|
70
|
+
}
|
90
71
|
};
|
91
72
|
|
92
73
|
Array.prototype.forEach.call(farms, (item, i) => {
|
@@ -96,6 +77,6 @@ ready( () => {
|
|
96
77
|
});
|
97
78
|
|
98
79
|
update_footer('/v1/' + base + '/farms');
|
99
|
-
restore_url(farms);
|
80
|
+
restore_url(farms, Farm);
|
100
81
|
|
101
82
|
});
|
data/app/public/js/main.js
CHANGED
@@ -9,6 +9,7 @@ let's use the fetch API for ajax calls
|
|
9
9
|
https://fetch.spec.whatwg.org
|
10
10
|
*/
|
11
11
|
|
12
|
+
// "use strict";
|
12
13
|
|
13
14
|
function ready(fn) {
|
14
15
|
if (document.readyState != 'loading') {
|
@@ -27,7 +28,7 @@ function make_base_auth(user, password) {
|
|
27
28
|
}
|
28
29
|
|
29
30
|
function addClass(el, className) {
|
30
|
-
if (el.classList
|
31
|
+
if (el.classList !== null)
|
31
32
|
el.classList.add(className);
|
32
33
|
else
|
33
34
|
el.className += ' ' + className;
|
@@ -59,21 +60,23 @@ function shortParamFile(path) {
|
|
59
60
|
|
60
61
|
function filterBox(input, els) {
|
61
62
|
var filterinput = document.querySelector(input);
|
62
|
-
filterinput
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
});
|
69
|
-
else
|
70
|
-
Array.prototype.forEach.call(els, (item, i) => {
|
71
|
-
if (item.textContent.match(el.value))
|
63
|
+
if (filterinput !== null) {
|
64
|
+
filterinput.focus();
|
65
|
+
filterinput.addEventListener('keyup', (ev) => {
|
66
|
+
el = ev.target;
|
67
|
+
if (el.value === '')
|
68
|
+
Array.prototype.forEach.call(els, (item, i) => {
|
72
69
|
item.style.display = 'block';
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
70
|
+
});
|
71
|
+
else
|
72
|
+
Array.prototype.forEach.call(els, (item, i) => {
|
73
|
+
if (item.textContent.match(el.value))
|
74
|
+
item.style.display = 'block';
|
75
|
+
else
|
76
|
+
item.style.display = 'none';
|
77
|
+
});
|
78
|
+
});
|
79
|
+
}
|
77
80
|
}
|
78
81
|
|
79
82
|
function start_wait(meat) {
|
@@ -95,6 +98,23 @@ function auth_header() {
|
|
95
98
|
return { headers: h }
|
96
99
|
}
|
97
100
|
|
101
|
+
function restore_url(list, someclass) {
|
102
|
+
if (window.location.hash !== '') {
|
103
|
+
var target = window.location.hash.replace(/#/,'');
|
104
|
+
var parts = target.split('/');
|
105
|
+
Array.prototype.forEach.call(list, (item, i) => {
|
106
|
+
if (item.textContent.split(' ')[0] === parts[0]) {
|
107
|
+
if (parts[1] !== undefined) {
|
108
|
+
someclass[parts[1]](parts[0]);
|
109
|
+
} else {
|
110
|
+
var event = document.createEvent('HTMLEvents');
|
111
|
+
event.initEvent('click', true, false);
|
112
|
+
item.dispatchEvent(event);
|
113
|
+
}
|
114
|
+
}
|
115
|
+
});
|
116
|
+
}
|
117
|
+
}
|
98
118
|
|
99
119
|
ready( () => {
|
100
120
|
|
data/app/public/js/nodes.js
CHANGED
@@ -17,24 +17,6 @@ ready( () => {
|
|
17
17
|
focusNav('nodes');
|
18
18
|
filterBox(".side .filter input", nodes);
|
19
19
|
|
20
|
-
function restore_url(list) {
|
21
|
-
if (window.location.hash != '') {
|
22
|
-
var target = window.location.hash.replace(/#/,'');
|
23
|
-
var parts = target.split('/');
|
24
|
-
Array.prototype.forEach.call(list, (item, i) => {
|
25
|
-
if (item.textContent == parts[0]) {
|
26
|
-
if (parts[1] != undefined) {
|
27
|
-
Node[parts[1]](parts[0]);
|
28
|
-
} else {
|
29
|
-
var event = document.createEvent('HTMLEvents');
|
30
|
-
event.initEvent('click', true, false);
|
31
|
-
item.dispatchEvent(event);
|
32
|
-
}
|
33
|
-
}
|
34
|
-
});
|
35
|
-
}
|
36
|
-
}
|
37
|
-
|
38
20
|
function build_line(top, file, key, value, overriden) {
|
39
21
|
if (overriden === true) {
|
40
22
|
rowclass = "row overriden";
|
@@ -50,7 +32,7 @@ ready( () => {
|
|
50
32
|
|
51
33
|
function build_row(top, key, params) {
|
52
34
|
build_line(top, params['file'], key, params['value'], false);
|
53
|
-
if (params['overriden']
|
35
|
+
if (params['overriden'] === true) {
|
54
36
|
Array.prototype.forEach.call(params['found_in'], (values, i) => {
|
55
37
|
build_line(top, values['file'], key, values['value'], true);
|
56
38
|
});
|
@@ -111,7 +93,7 @@ ready( () => {
|
|
111
93
|
fetch(req, auth_header()).
|
112
94
|
then(res => res.json()).
|
113
95
|
then(j => {
|
114
|
-
if (j.error
|
96
|
+
if (j.error !== undefined) {
|
115
97
|
show_error(hierachy, j['error']);
|
116
98
|
} else {
|
117
99
|
location.reload();
|
@@ -136,7 +118,7 @@ ready( () => {
|
|
136
118
|
fetch(req, auth_header()).
|
137
119
|
then(res => res.json()).
|
138
120
|
then(j => {
|
139
|
-
if (j.error
|
121
|
+
if (j.error !== undefined) {
|
140
122
|
show_error(hierachy, j['error']);
|
141
123
|
} else {
|
142
124
|
location.reload();
|
@@ -152,10 +134,9 @@ ready( () => {
|
|
152
134
|
then(res => res.json()).
|
153
135
|
then(j => {
|
154
136
|
var hierachy = document.querySelector('div.hierarchy');
|
155
|
-
if (j.error
|
137
|
+
if (j.error !== undefined) {
|
156
138
|
show_error(hierachy, j['error']);
|
157
139
|
} else {
|
158
|
-
console.debug(j);
|
159
140
|
// --------------------
|
160
141
|
addTo(hierarchy, "<h3>From hiera config</h3>");
|
161
142
|
var hierafiles = document.createElement('div');
|
@@ -171,7 +152,7 @@ ready( () => {
|
|
171
152
|
hierarchy.appendChild(nodeinfo);
|
172
153
|
Array.prototype.forEach.call(Object.keys(j.info), (item, k) => {
|
173
154
|
var index = j.vars.indexOf(item);
|
174
|
-
if (index > -1 && (j.facts
|
155
|
+
if (index > -1 && (Object.keys(j.facts).length === 0 || j.facts[item] === undefined)) {
|
175
156
|
addTo(nodeinfo, "<div class=\"var\"><div class=\"label\">"+item+"</div>" +
|
176
157
|
"<div><input type=\"text\" name=\""+item+"\" value=\""+j.info[item]+"\" disabled></div></div>");
|
177
158
|
j.vars.splice(index, 1);
|
@@ -182,9 +163,9 @@ ready( () => {
|
|
182
163
|
var factinfo = document.createElement('div');
|
183
164
|
factinfo.className = "factinfo";
|
184
165
|
hierarchy.appendChild(factinfo);
|
185
|
-
if (j.facts
|
166
|
+
if (Object.keys(j.facts).length === 0) {
|
186
167
|
Array.prototype.forEach.call(Object.keys(j.vars), (item, k) => {
|
187
|
-
if (j.defaults
|
168
|
+
if (j.defaults !== null && j.defaults[j.vars[item]] !== undefined) {
|
188
169
|
addTo(factinfo, "<div class=\"var\"><div class=\"label\">"+j.vars[item]+"</div>" +
|
189
170
|
"<div><input type=\"text\" class=\"userinput\" name=\"" +
|
190
171
|
j.vars[item]+"\" value=\"" +
|
@@ -192,7 +173,7 @@ ready( () => {
|
|
192
173
|
}
|
193
174
|
});
|
194
175
|
Array.prototype.forEach.call(Object.keys(j.vars), (item, k) => {
|
195
|
-
if (j.defaults
|
176
|
+
if (Object.keys(j.defaults).length === 0 || j.defaults[j.vars[item]] === undefined) {
|
196
177
|
addTo(factinfo, "<div class=\"var\"><div class=\"label\">"+j.vars[item]+"</div>" +
|
197
178
|
"<div><input type=\"text\" class=\"userinput\" name=\"" +
|
198
179
|
j.vars[item]+"\" value=\"\"></div></div>");
|
@@ -201,7 +182,7 @@ ready( () => {
|
|
201
182
|
} else {
|
202
183
|
Array.prototype.forEach.call(Object.keys(j.facts), (item, k) => {
|
203
184
|
var override = '';
|
204
|
-
if (j.defaults
|
185
|
+
if (j.defaults !== null && j.defaults[item] !== undefined) {
|
205
186
|
override = " <i>("+j.defaults[item]+")</i>";
|
206
187
|
}
|
207
188
|
addTo(factinfo, "<div class=\"var\"><div class=\"label\">" +
|
@@ -218,7 +199,7 @@ ready( () => {
|
|
218
199
|
// . . . . . . . . . . .
|
219
200
|
var updateinfo = document.createElement('button');
|
220
201
|
updateinfo.id = 'updateinfo';
|
221
|
-
updateinfo.
|
202
|
+
updateinfo.textContent = 'Update';
|
222
203
|
updatediv.appendChild(updateinfo);
|
223
204
|
updateinfo.addEventListener('click', (ev) => {
|
224
205
|
var fields = get_input();
|
@@ -227,7 +208,7 @@ ready( () => {
|
|
227
208
|
// // . . . . . . . . . . .
|
228
209
|
// var checkinfo = document.createElement('button');
|
229
210
|
// checkinfo.id = 'checkinfo';
|
230
|
-
// checkinfo.
|
211
|
+
// checkinfo.textContent = 'Check';
|
231
212
|
// updatediv.appendChild(checkinfo);
|
232
213
|
// checkinfo.addEventListener('click', (ev) => {
|
233
214
|
|
@@ -235,7 +216,7 @@ ready( () => {
|
|
235
216
|
// . . . . . . . . . . .
|
236
217
|
var restoreinfo = document.createElement('button');
|
237
218
|
restoreinfo.id = 'restoreinfo';
|
238
|
-
restoreinfo.
|
219
|
+
restoreinfo.textContent = 'Restore Defaults';
|
239
220
|
updatediv.appendChild(restoreinfo);
|
240
221
|
restoreinfo.addEventListener('click', (ev) => {
|
241
222
|
clear_input(node);
|
@@ -294,7 +275,7 @@ ready( () => {
|
|
294
275
|
then(j => {
|
295
276
|
// console.log(auth_header().headers.getAll('x-auth'));
|
296
277
|
build_top(node);
|
297
|
-
if (j.error
|
278
|
+
if (j.error !== undefined) {
|
298
279
|
show_error(meat, j['error']);
|
299
280
|
} else {
|
300
281
|
build_params(meat, node, j);
|
@@ -313,7 +294,7 @@ ready( () => {
|
|
313
294
|
then(res => res.json()).
|
314
295
|
then(j => {
|
315
296
|
build_top(node);
|
316
|
-
if (j.error
|
297
|
+
if (j.error !== undefined) {
|
317
298
|
show_error(meat, j['error']);
|
318
299
|
} else {
|
319
300
|
build_info(meat, node, j);
|
@@ -332,7 +313,7 @@ ready( () => {
|
|
332
313
|
then(res => res.json()).
|
333
314
|
then(j => {
|
334
315
|
build_top(node);
|
335
|
-
if (j.error
|
316
|
+
if (j.error !== undefined) {
|
336
317
|
show_error(meat, j['error']);
|
337
318
|
} else {
|
338
319
|
build_params(meat, node, j);
|
@@ -343,7 +324,7 @@ ready( () => {
|
|
343
324
|
}
|
344
325
|
end_wait(meat);
|
345
326
|
});
|
346
|
-
}
|
327
|
+
}
|
347
328
|
}
|
348
329
|
|
349
330
|
/* declaration of events for the nodes menu */
|
@@ -354,6 +335,6 @@ ready( () => {
|
|
354
335
|
});
|
355
336
|
|
356
337
|
update_footer('/v1/' + base + '/nodes');
|
357
|
-
restore_url(nodes);
|
338
|
+
restore_url(nodes, Node);
|
358
339
|
|
359
340
|
});
|
data/app/views/_head.erb
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
</a>
|
5
5
|
</div>
|
6
6
|
|
7
|
-
<% if session[:access_token] && @username != '' and @base -%>
|
8
7
|
<div class="nav">
|
8
|
+
<% if session[:access_token] && @username != '' and @base -%>
|
9
9
|
<% if settings.basepaths -%>
|
10
10
|
<div class="base">
|
11
11
|
<span class="current"><%= @base_name %></span>
|
@@ -21,13 +21,15 @@
|
|
21
21
|
</div>
|
22
22
|
</div>
|
23
23
|
<% end -%>
|
24
|
+
<% end -%>
|
24
25
|
|
26
|
+
<% if session[:access_token] -%>
|
25
27
|
<a href="<%= @base %>/nodes" class="nodes">Nodes</a>
|
26
28
|
<a href="<%= @base %>/farms" class="farms">Farms</a>
|
27
29
|
<a href="<%= @base %>/modules" class="modules">Modules</a>
|
28
30
|
<a href="<%= @base %>/resources" class="resources">Resources</a>
|
29
|
-
</div>
|
30
31
|
<% end -%>
|
32
|
+
</div>
|
31
33
|
|
32
34
|
<% if session[:access_token] && @username != '' -%>
|
33
35
|
<div class="auth">
|