Maybe it would be good to make Kimchi smarter to automatically connect
to the external web server.
For example, we could add a new parameter in Kimchi config file
(/etc/kimchi/kimchi.conf) and once it is filled up we start the nginx
proxy according to it. Otherwise, we keep starting Kimchi on
From: Frederic Bonnard <frediz(a)linux.vnet.ibm.com>
The goal is to be able to have kimchi website elsewhere than / , for example
https://server/kimchi/
Also providing an nginx configuration file example that can serve kimchi at the
URL above.
---
docs/Makefile.am | 1 +
docs/nginx.conf.subsite.ex | 37 +++++++
src/kimchi/screenshot.py | 2 +-
ui/css/theme-default/template_add.css | 20 ++--
ui/css/theme-default/topbar.css | 2 +-
ui/js/src/kimchi.api.js | 176 +++++++++++++++++-----------------
ui/js/src/kimchi.login.js | 2 +-
ui/pages/guest.html.tmpl | 2 +-
ui/pages/help/dita-help.xsl | 4 +-
ui/pages/kimchi-ui.html.tmpl | 4 +-
ui/pages/storagepool-add.html.tmpl | 2 +-
ui/pages/tabs/storage.html.tmpl | 2 +-
ui/pages/template-add.html.tmpl | 2 +-
13 files changed, 147 insertions(+), 109 deletions(-)
create mode 100644 docs/nginx.conf.subsite.ex
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 679aa18..a73d4c5 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -25,4 +25,5 @@ dist_doc_DATA = \
README-federation.md \
kimchi-guest.png \
kimchi-templates.png \
+ nginx.conf.subsite.ex \
$(NULL)
diff --git a/docs/nginx.conf.subsite.ex b/docs/nginx.conf.subsite.ex
new file mode 100644
index 0000000..5b2b3bc
--- /dev/null
+++ b/docs/nginx.conf.subsite.ex
@@ -0,0 +1,37 @@
+server {
+ sendfile on;
+
+ client_max_body_size 4194304k;
+
+ # Timeout set to 10 minutes to avoid the 504 Gateway Timeout
+ # when Kimchi is processing a request.
+ proxy_connect_timeout 600;
+ proxy_send_timeout 600;
+ proxy_read_timeout 600;
+ send_timeout 600;
+
+ error_log /var/log/nginx/test.log debug;
+ rewrite_log on;
+ listen 443 ssl;
+
+ ssl_certificate /etc/kimchi/kimchi-cert.pem;
+ ssl_certificate_key /etc/kimchi/kimchi-key.pem;
+
+ add_header Strict-Transport-Security "max-age=31536000;
includeSubdomains;";
+ add_header X-Frame-Options DENY;
+ add_header X-Content-Type-Options nosniff;
+ add_header X-XSS-Protection "1; mode=block";
+
+ location /kimchi/ {
+ proxy_pass
http://127.0.0.1:8010/;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_redirect
http://127.0.0.1:8010/ https://$host/kimchi/;
+ }
+}
+
+server {
+ listen 80;
+ rewrite ^/kimchi/(.*)$ https://$host/kimchi/$1 redirect;
+}
diff --git a/src/kimchi/screenshot.py b/src/kimchi/screenshot.py
index e599d40..fc9aaac 100644
--- a/src/kimchi/screenshot.py
+++ b/src/kimchi/screenshot.py
@@ -68,7 +68,7 @@ class VMScreenshot(object):
if now - last_update > self.OUTDATED_SECS:
self._clean_extra(self.LIVE_WINDOW)
self._generate_thumbnail()
- return '/data/screenshots/%s' %\
+ return 'data/screenshots/%s' %\
os.path.basename(self.info['thumbnail'])
def _clean_extra(self, window=-1):
diff --git a/ui/css/theme-default/template_add.css
b/ui/css/theme-default/template_add.css
index e58bccb..f005a2c 100644
--- a/ui/css/theme-default/template_add.css
+++ b/ui/css/theme-default/template_add.css
@@ -41,7 +41,7 @@
float: left; display : block;
width: 50px;
height: 52px;
- background: url(../../images/theme-default/icon-back.png) center
+ background: url(../images/theme-default/icon-back.png) center
center no-repeat;
cursor: pointer;
display: block;
@@ -59,17 +59,17 @@
margin: 0 10px 10px;
padding: 20px 10px 20px 65px;
border: 2px solid #ccc;
- background: url(../../images/theme-default/icon-local.png) 15px
+ background: url(../images/theme-default/icon-local.png) 15px
center no-repeat;
cursor: pointer;
}
.step-choose>li>a.local {
- background-image: url(../../images/theme-default/icon-local.png);
+ background-image: url(../images/theme-default/icon-local.png);
}
.step-choose>li>a.remote {
- background-image: url(../../images/theme-default/icon-remote.png);
+ background-image: url(../images/theme-default/icon-remote.png);
}
.step-choose>li>a:HOVER {
@@ -176,27 +176,27 @@
}
.iso-icon.centos {
- background-image: url(../../images/icon-centos.png);
+ background-image: url(../images/icon-centos.png);
}
.iso-icon.debian {
- background-image: url(../../images/icon-debian.png);
+ background-image: url(../images/icon-debian.png);
}
.iso-icon.fedora {
- background-image: url(../../images/icon-fedora.png);
+ background-image: url(../images/icon-fedora.png);
}
.iso-icon.opensuse {
- background-image: url(../../images/icon-opensuse.png);
+ background-image: url(../images/icon-opensuse.png);
}
.iso-icon.ubuntu {
- background-image: url(../../images/icon-ubuntu.png);
+ background-image: url(../images/icon-ubuntu.png);
}
.iso-icon.gentoo {
- background-image: url(../../images/icon-gentoo.png);
+ background-image: url(../images/icon-gentoo.png);
}
.list-iso {
diff --git a/ui/css/theme-default/topbar.css b/ui/css/theme-default/topbar.css
index d21fc50..04676b8 100644
--- a/ui/css/theme-default/topbar.css
+++ b/ui/css/theme-default/topbar.css
@@ -132,7 +132,7 @@
}
#user-icon {
- background: url("/images/theme-default/user-icon.png") no-repeat left
top;
+ background: url("../images/theme-default/user-icon.png") no-repeat left
top;
height: 16px;
width: 16px;
}
diff --git a/ui/js/src/kimchi.api.js b/ui/js/src/kimchi.api.js
index 2abe8f5..277bf55 100644
--- a/ui/js/src/kimchi.api.js
+++ b/ui/js/src/kimchi.api.js
@@ -54,7 +54,7 @@ var kimchi = {
getCapabilities : function(suc, err, done) {
done = typeof done !== 'undefined' ? done: function(){};
kimchi.requestJSON({
- url : "/config/capabilities",
+ url : "config/capabilities",
type : "GET",
contentType : "application/json",
dataType : "json",
@@ -69,7 +69,7 @@ var kimchi = {
*/
getI18n: function(suc, err, url, sync) {
kimchi.requestJSON({
- url : url ? url : kimchi.url + 'i18n.json',
+ url : url ? url : 'i18n.json',
type : 'GET',
resend: true,
dataType : 'json',
@@ -84,7 +84,7 @@ var kimchi = {
*/
getHost: function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host',
+ url : 'host',
type : 'GET',
resend: true,
contentType : 'application/json',
@@ -99,7 +99,7 @@ var kimchi = {
*/
getHostStats : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/stats',
+ url : 'host/stats',
type : 'GET',
contentType : 'application/json',
headers: {'Kimchi-Robot': 'kimchi-robot'},
@@ -114,7 +114,7 @@ var kimchi = {
*/
getHostStatsHistory : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/stats/history',
+ url : 'host/stats/history',
type : 'GET',
resend: true,
contentType : 'application/json',
@@ -138,7 +138,7 @@ var kimchi = {
*/
createVM : function(settings, suc, err) {
kimchi.requestJSON({
- url : "/vms",
+ url : "vms",
type : "POST",
contentType : "application/json",
data : JSON.stringify(settings),
@@ -154,7 +154,7 @@ var kimchi = {
*/
createTemplate : function(settings, suc, err) {
kimchi.requestJSON({
- url : "/templates",
+ url : "templates",
type : "POST",
contentType : "application/json",
data : JSON.stringify(settings),
@@ -166,7 +166,7 @@ var kimchi = {
deleteTemplate : function(tem, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'templates/' + encodeURIComponent(tem),
+ url : 'templates/' + encodeURIComponent(tem),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -177,7 +177,7 @@ var kimchi = {
cloneTemplate : function(tem, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'templates/' + encodeURIComponent(tem) +
"/clone",
+ url : 'templates/' + encodeURIComponent(tem) + "/clone",
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -188,7 +188,7 @@ var kimchi = {
listTemplates : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'templates',
+ url : 'templates',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -202,7 +202,7 @@ var kimchi = {
*/
retrieveTemplate : function(templateName, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + "templates/" +
encodeURIComponent(templateName),
+ url : "templates/" + encodeURIComponent(templateName),
type : 'GET',
contentType : 'application/json',
dataType : 'json'
@@ -216,7 +216,7 @@ var kimchi = {
*/
updateTemplate : function(name, settings, suc, err) {
$.ajax({
- url : kimchi.url + "templates/" + encodeURIComponent(name),
+ url : "templates/" + encodeURIComponent(name),
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -232,7 +232,7 @@ var kimchi = {
*/
createStoragePool : function(settings, suc, err) {
kimchi.requestJSON({
- url : '/storagepools',
+ url : 'storagepools',
type : 'POST',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -242,7 +242,7 @@ var kimchi = {
updateStoragePool : function(name, content, suc, err) {
$.ajax({
- url : kimchi.url + "storagepools/" + encodeURIComponent(name),
+ url : "storagepools/" + encodeURIComponent(name),
type : 'PUT',
contentType : 'application/json',
dataType : 'json',
@@ -254,7 +254,7 @@ var kimchi = {
startVM : function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm) +
'/start',
+ url : 'vms/' + encodeURIComponent(vm) + '/start',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -265,7 +265,7 @@ var kimchi = {
poweroffVM : function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm) +
'/poweroff',
+ url : 'vms/' + encodeURIComponent(vm) + '/poweroff',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -276,7 +276,7 @@ var kimchi = {
shutdownVM : function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm) +
'/shutdown',
+ url : 'vms/' + encodeURIComponent(vm) + '/shutdown',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -287,7 +287,7 @@ var kimchi = {
resetVM : function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm) +
'/reset',
+ url : 'vms/' + encodeURIComponent(vm) + '/reset',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -305,7 +305,7 @@ var kimchi = {
*/
retrieveVM : function(vm, suc, err) {
$.ajax({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm),
+ url : 'vms/' + encodeURIComponent(vm),
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -319,7 +319,7 @@ var kimchi = {
*/
updateVM : function(name, settings, suc, err) {
$.ajax({
- url : kimchi.url + "vms/" + encodeURIComponent(name),
+ url : "vms/" + encodeURIComponent(name),
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -331,7 +331,7 @@ var kimchi = {
deleteVM : function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm),
+ url : 'vms/' + encodeURIComponent(vm),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -342,13 +342,13 @@ var kimchi = {
vncToVM : function(vm) {
kimchi.requestJSON({
- url : '/config',
+ url : 'config',
type : 'GET',
dataType : 'json'
}).done(function(data, textStatus, xhr) {
proxy_port = data['display_proxy_port'];
kimchi.requestJSON({
- url : "/vms/" + encodeURIComponent(vm) +
"/connect",
+ url : "vms/" + encodeURIComponent(vm) + "/connect",
type : "POST",
dataType : "json"
}).done(function() {
@@ -374,13 +374,13 @@ var kimchi = {
spiceToVM : function(vm) {
kimchi.requestJSON({
- url : '/config',
+ url : 'config',
type : 'GET',
dataType : 'json'
}).done(function(data, textStatus, xhr) {
proxy_port = data['display_proxy_port'];
kimchi.requestJSON({
- url : "/vms/" + encodeURIComponent(vm) +
"/connect",
+ url : "vms/" + encodeURIComponent(vm) + "/connect",
type : "POST",
dataType : "json"
}).done(function(data, textStatus, xhr) {
@@ -406,7 +406,7 @@ var kimchi = {
listVMs : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms',
+ url : 'vms',
type : 'GET',
contentType : 'application/json',
headers: {'Kimchi-Robot': 'kimchi-robot'},
@@ -419,7 +419,7 @@ var kimchi = {
listTemplates : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'templates',
+ url : 'templates',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -431,7 +431,7 @@ var kimchi = {
listStoragePools : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'storagepools',
+ url : 'storagepools',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -443,7 +443,7 @@ var kimchi = {
listStorageVolumes : function(poolName, suc, err) {
$.ajax({
- url : kimchi.url + 'storagepools/' + encodeURIComponent(poolName) +
'/storagevolumes',
+ url : 'storagepools/' + encodeURIComponent(poolName) +
'/storagevolumes',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -454,7 +454,7 @@ var kimchi = {
listIsos : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'storagepools/kimchi_isos/storagevolumes',
+ url : 'storagepools/kimchi_isos/storagevolumes',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -465,7 +465,7 @@ var kimchi = {
listDistros : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'config/distros',
+ url : 'config/distros',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -527,7 +527,7 @@ var kimchi = {
getTask : function(taskId, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'tasks/' + encodeURIComponent(taskId),
+ url : 'tasks/' + encodeURIComponent(taskId),
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -538,7 +538,7 @@ var kimchi = {
getTasksByFilter : function(filter, suc, err, sync) {
kimchi.requestJSON({
- url : kimchi.url + 'tasks?' + filter,
+ url : 'tasks?' + filter,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -550,7 +550,7 @@ var kimchi = {
login : function(settings, suc, err) {
$.ajax({
- url : "/login",
+ url : "login",
type : "POST",
contentType : "application/json",
data : JSON.stringify(settings),
@@ -560,7 +560,7 @@ var kimchi = {
logout : function(suc, err) {
kimchi.requestJSON({
- url : '/logout',
+ url : 'logout',
type : 'POST',
contentType : "application/json",
dataType : "json"
@@ -569,7 +569,7 @@ var kimchi = {
deleteStoragePool : function(poolName, suc, err) {
$.ajax({
- url : kimchi.url + 'storagepools/' + encodeURIComponent(poolName),
+ url : 'storagepools/' + encodeURIComponent(poolName),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -581,7 +581,7 @@ var kimchi = {
changePoolState : function(poolName, state, suc, err) {
if (state === 'activate' || state === 'deactivate')
$.ajax({
- url : kimchi.url + 'storagepools/' +
encodeURIComponent(poolName) + '/' + state,
+ url : 'storagepools/' + encodeURIComponent(poolName) +
'/' + state,
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -592,7 +592,7 @@ var kimchi = {
listPlugins : function(suc, err, sync) {
kimchi.requestJSON({
- url : kimchi.url + 'plugins',
+ url : 'plugins',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -605,7 +605,7 @@ var kimchi = {
listNetworks : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'networks',
+ url : 'networks',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -620,7 +620,7 @@ var kimchi = {
toggleNetwork : function(name, on, suc, err) {
var action = on ? "activate" : "deactivate";
kimchi.requestJSON({
- url : kimchi.url + 'networks/' + encodeURIComponent(name) +
'/' + action,
+ url : 'networks/' + encodeURIComponent(name) + '/' +
action,
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -633,7 +633,7 @@ var kimchi = {
createNetwork : function(network, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'networks',
+ url : 'networks',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -647,7 +647,7 @@ var kimchi = {
getInterfaces : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'interfaces',
+ url : 'interfaces',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -661,7 +661,7 @@ var kimchi = {
deleteNetwork : function(name, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'networks/' + encodeURIComponent(name),
+ url : 'networks/' + encodeURIComponent(name),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -674,7 +674,7 @@ var kimchi = {
listReports : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'debugreports',
+ url : 'debugreports',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -717,7 +717,7 @@ var kimchi = {
};
kimchi.requestJSON({
- url : kimchi.url + 'debugreports',
+ url : 'debugreports',
type : "POST",
contentType : "application/json",
data : JSON.stringify(settings),
@@ -729,7 +729,7 @@ var kimchi = {
renameReport : function(name, settings, suc, err) {
$.ajax({
- url : kimchi.url + "debugreports/" + encodeURIComponent(name),
+ url : "debugreports/" + encodeURIComponent(name),
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -742,7 +742,7 @@ var kimchi = {
deleteReport: function(settings, suc, err) {
var reportName = encodeURIComponent(settings['name']);
kimchi.requestJSON({
- url : kimchi.url + 'debugreports/' + reportName,
+ url : 'debugreports/' + reportName,
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -757,7 +757,7 @@ var kimchi = {
shutdown: function(settings, suc, err) {
var reboot = settings && settings['reboot'] === true;
- var url = kimchi.url + 'host/' + (reboot ? 'reboot' :
'shutdown');
+ var url = 'host/' + (reboot ? 'reboot' : 'shutdown');
kimchi.requestJSON({
url : url,
type : 'POST',
@@ -770,7 +770,7 @@ var kimchi = {
listHostPartitions : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/partitions',
+ url : 'host/partitions',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -780,7 +780,7 @@ var kimchi = {
},
getStorageServers: function(type, suc, err) {
- var url = kimchi.url + 'storageservers?_target_type=' + type;
+ var url = 'storageservers?_target_type=' + type;
kimchi.requestJSON({
url : url,
type : 'GET',
@@ -794,7 +794,7 @@ var kimchi = {
},
getStorageTargets: function(server,type, suc, err) {
- var url = kimchi.url + 'storageservers/' + server +
'/storagetargets?_target_type=' + type;
+ var url = 'storageservers/' + server +
'/storagetargets?_target_type=' + type;
kimchi.requestJSON({
url : url,
type : 'GET',
@@ -807,7 +807,7 @@ var kimchi = {
},
getStoragePoolVolume: function(poolName, volumeName, suc, err) {
- var url = kimchi.url + 'storagepools/' + encodeURIComponent(poolName) +
'/storagevolumes/' + encodeURIComponent(volumeName);
+ var url = 'storagepools/' + encodeURIComponent(poolName) +
'/storagevolumes/' + encodeURIComponent(volumeName);
kimchi.requestJSON({
url : url,
type : 'GET',
@@ -823,7 +823,7 @@ var kimchi = {
var vm = encodeURIComponent(settings['vm']);
delete settings['vm'];
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + vm + '/storages',
+ url : 'vms/' + vm + '/storages',
type : 'POST',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -837,7 +837,7 @@ var kimchi = {
var vm = encodeURIComponent(settings['vm']);
var dev = encodeURIComponent(settings['dev']);
kimchi.requestJSON({
- url : kimchi.url + "vms/" + vm + '/storages/' + dev,
+ url : "vms/" + vm + '/storages/' + dev,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -850,7 +850,7 @@ var kimchi = {
var vm = encodeURIComponent(settings['vm']);
var dev = encodeURIComponent(settings['dev']);
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + vm + '/storages/' + dev,
+ url : 'vms/' + vm + '/storages/' + dev,
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify({
@@ -866,7 +866,7 @@ var kimchi = {
var vm = settings['vm'];
var dev = settings['dev'];
kimchi.requestJSON({
- url : kimchi.url + 'vms/' + encodeURIComponent(vm) +
+ url : 'vms/' + encodeURIComponent(vm) +
'/storages/' + encodeURIComponent(dev),
type : 'DELETE',
contentType : 'application/json',
@@ -879,7 +879,7 @@ var kimchi = {
listVMStorages : function(params, suc, err) {
var vm = encodeURIComponent(params['vm']);
var type = params['storageType'];
- var url = kimchi.url + 'vms/' + vm + '/storages';
+ var url = 'vms/' + vm + '/storages';
if(type) {
url += '?type=' + type;
}
@@ -895,7 +895,7 @@ var kimchi = {
listSoftwareUpdates : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/packagesupdate',
+ url : 'host/packagesupdate',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -935,7 +935,7 @@ var kimchi = {
};
kimchi.requestJSON({
- url : kimchi.url + 'host/swupdate',
+ url : 'host/swupdate',
type : "POST",
contentType : "application/json",
dataType : "json",
@@ -959,7 +959,7 @@ var kimchi = {
retrieveRepository : function(repository, suc, err) {
var reposID = encodeURIComponent(repository);
kimchi.requestJSON({
- url : kimchi.url + "host/repositories/" + reposID,
+ url : "host/repositories/" + reposID,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -971,7 +971,7 @@ var kimchi = {
updateRepository : function(name, settings, suc, err) {
var reposID = encodeURIComponent(name);
$.ajax({
- url : kimchi.url + "host/repositories/" + reposID,
+ url : "host/repositories/" + reposID,
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify(settings),
@@ -984,7 +984,7 @@ var kimchi = {
enableRepository : function(name, enable, suc, err) {
var reposID = encodeURIComponent(name);
$.ajax({
- url : kimchi.url + "host/repositories/" + reposID +
+ url : "host/repositories/" + reposID +
'/' + (enable === true ? 'enable' :
'disable'),
type : 'POST',
contentType : 'application/json',
@@ -997,7 +997,7 @@ var kimchi = {
deleteRepository : function(repository, suc, err) {
var reposID = encodeURIComponent(repository);
kimchi.requestJSON({
- url : kimchi.url + 'host/repositories/' + reposID,
+ url : 'host/repositories/' + reposID,
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -1008,7 +1008,7 @@ var kimchi = {
listRepositories : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/repositories',
+ url : 'host/repositories',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1019,7 +1019,7 @@ var kimchi = {
},
getHostFCDevices: function(suc, err) {
- var url = kimchi.url+'host/devices?_cap=fc_host';
+ var url = 'host/devices?_cap=fc_host';
kimchi.requestJSON({
url : url,
type : 'GET',
@@ -1033,7 +1033,7 @@ var kimchi = {
},
getGuestInterfaces: function(name, suc, err) {
- var url = kimchi.url+'vms/'+encodeURIComponent(name)+'/ifaces';
+ var url = 'vms/'+encodeURIComponent(name)+'/ifaces';
kimchi.requestJSON({
url : url,
type : 'GET',
@@ -1048,7 +1048,7 @@ var kimchi = {
createGuestInterface : function(name, interface, suc, err) {
kimchi.requestJSON({
- url : kimchi.url+'vms/'+encodeURIComponent(name)+'/ifaces',
+ url : 'vms/'+encodeURIComponent(name)+'/ifaces',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -1062,7 +1062,7 @@ var kimchi = {
deleteGuestInterface : function(vm, mac, suc, err) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/ifaces/'+encodeURIComponent(mac),
+ url :
'vms/'+encodeURIComponent(vm)+'/ifaces/'+encodeURIComponent(mac),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -1075,7 +1075,7 @@ var kimchi = {
updateGuestInterface : function(vm, mac, interface, suc, err) {
$.ajax({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/ifaces/'+encodeURIComponent(mac),
+ url :
'vms/'+encodeURIComponent(vm)+'/ifaces/'+encodeURIComponent(mac),
type : 'PUT',
contentType : 'application/json',
data : JSON.stringify(interface),
@@ -1089,7 +1089,7 @@ var kimchi = {
getUserById : function(data, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'users?_user_id=' + data.user_id,
+ url : 'users?_user_id=' + data.user_id,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1104,7 +1104,7 @@ var kimchi = {
getUsers : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'users',
+ url : 'users',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1118,7 +1118,7 @@ var kimchi = {
getGroups : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'groups',
+ url : 'groups',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1132,7 +1132,7 @@ var kimchi = {
getHostPCIDevices : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/devices?_passthrough=true&_cap=pci',
+ url : 'host/devices?_passthrough=true&_cap=pci',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1146,7 +1146,7 @@ var kimchi = {
getPCIDeviceCompanions : function(pcidev, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/devices?_passthrough_affected_by=' +
pcidev,
+ url : 'host/devices?_passthrough_affected_by=' + pcidev,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1162,7 +1162,7 @@ var kimchi = {
server = encodeURIComponent(server);
port = port ? '&_server_port='+encodeURIComponent(port) :
'';
kimchi.requestJSON({
- url : kimchi.url +
'storageservers/'+server+'/storagetargets?_target_type=iscsi'+port,
+ url :
'storageservers/'+server+'/storagetargets?_target_type=iscsi'+port,
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1176,7 +1176,7 @@ var kimchi = {
getPeers : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'peers',
+ url : 'peers',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1190,7 +1190,7 @@ var kimchi = {
getVMPCIDevices : function(id, suc, err) {
kimchi.requestJSON({
- url : kimchi.url +
'vms/'+encodeURIComponent(id)+'/hostdevs',
+ url : 'vms/'+encodeURIComponent(id)+'/hostdevs',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1204,7 +1204,7 @@ var kimchi = {
addVMPCIDevice : function(vm, device, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/'+ encodeURIComponent(vm)
+'/hostdevs',
+ url : 'vms/'+ encodeURIComponent(vm) +'/hostdevs',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -1218,7 +1218,7 @@ var kimchi = {
removeVMPCIDevice : function(vm, device, suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'vms/'+ encodeURIComponent(vm)
+'/hostdevs/' + encodeURIComponent(device),
+ url : 'vms/'+ encodeURIComponent(vm) +'/hostdevs/' +
encodeURIComponent(device),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -1236,7 +1236,7 @@ var kimchi = {
var fd = settings['formData'];
var sp = encodeURIComponent(settings['sp']);
kimchi.requestJSON({
- url : kimchi.url + 'storagepools/' + sp +
'/storagevolumes',
+ url : 'storagepools/' + sp + '/storagevolumes',
type : 'POST',
data : fd,
processData : false,
@@ -1254,7 +1254,7 @@ var kimchi = {
var sp = encodeURIComponent(settings['sp']);
delete settings['sp'];
kimchi.requestJSON({
- url : kimchi.url + 'storagepools/' + sp +
'/storagevolumes',
+ url : 'storagepools/' + sp + '/storagevolumes',
type : 'POST',
data : JSON.stringify(settings),
contentType : 'application/json',
@@ -1266,7 +1266,7 @@ var kimchi = {
cloneGuest: function(vm, suc, err) {
kimchi.requestJSON({
- url : kimchi.url +
'vms/'+encodeURIComponent(vm)+"/clone",
+ url : 'vms/'+encodeURIComponent(vm)+"/clone",
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -1279,7 +1279,7 @@ var kimchi = {
listSnapshots : function(vm, suc, err) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/snapshots',
+ url : 'vms/'+encodeURIComponent(vm)+'/snapshots',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1293,7 +1293,7 @@ var kimchi = {
getCurrentSnapshot : function(vm, suc, err, sync) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/snapshots/current',
+ url : 'vms/'+encodeURIComponent(vm)+'/snapshots/current',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
@@ -1308,7 +1308,7 @@ var kimchi = {
revertSnapshot : function(vm, snapshot, suc, err) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/snapshots/'+encodeURIComponent(snapshot)+'/revert',
+ url :
'vms/'+encodeURIComponent(vm)+'/snapshots/'+encodeURIComponent(snapshot)+'/revert',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -1321,7 +1321,7 @@ var kimchi = {
createSnapshot : function(vm, suc, err) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/snapshots',
+ url : 'vms/'+encodeURIComponent(vm)+'/snapshots',
type : 'POST',
contentType : 'application/json',
dataType : 'json',
@@ -1334,7 +1334,7 @@ var kimchi = {
deleteSnapshot : function(vm, snapshot, suc, err) {
kimchi.requestJSON({
- url :
kimchi.url+'vms/'+encodeURIComponent(vm)+'/snapshots/'+encodeURIComponent(snapshot),
+ url :
'vms/'+encodeURIComponent(vm)+'/snapshots/'+encodeURIComponent(snapshot),
type : 'DELETE',
contentType : 'application/json',
dataType : 'json',
@@ -1347,7 +1347,7 @@ var kimchi = {
getCPUInfo : function(suc, err) {
kimchi.requestJSON({
- url : kimchi.url + 'host/cpuinfo',
+ url : 'host/cpuinfo',
type : 'GET',
contentType : 'application/json',
dataType : 'json',
diff --git a/ui/js/src/kimchi.login.js b/ui/js/src/kimchi.login.js
index 19b8691..556fbda 100644
--- a/ui/js/src/kimchi.login.js
+++ b/ui/js/src/kimchi.login.js
@@ -57,7 +57,7 @@ kimchi.login_main = function() {
var next_url = lastPage ? lastPage.replace(/\"/g,'') :
"/";
}
kimchi.cookie.set('roles',JSON.stringify(data.roles));
- window.location.replace(next_url)
+ window.location.replace(window.location.pathname.replace(/\/+login.html/,
'') + next_url)
}, function() {
$("#messUserPass").show();
$("#messSession").hide();
diff --git a/ui/pages/guest.html.tmpl b/ui/pages/guest.html.tmpl
index 3cc2fad..7051ed5 100644
--- a/ui/pages/guest.html.tmpl
+++ b/ui/pages/guest.html.tmpl
@@ -45,7 +45,7 @@
<div class="tile ">
<img class="imgactive" alt=""
src="">
<img class="imgload" alt=""
src="">
- <img class="overlay shutoff-hidden"
alt="$_("Start")"
src="/images/theme-default/icon-power-down.png" >
+ <img class="overlay shutoff-hidden"
alt="$_("Start")"
src="images/theme-default/icon-power-down.png" >
</div>
</div>
<div class="sortable guest-actions"
name="guest-actions">
diff --git a/ui/pages/help/dita-help.xsl b/ui/pages/help/dita-help.xsl
index 9cfeeea..8583a4e 100644
--- a/ui/pages/help/dita-help.xsl
+++ b/ui/pages/help/dita-help.xsl
@@ -9,8 +9,8 @@
<head>
<title><xsl:value-of select="/cshelp/title"
/></title>
<meta charset="UTF-8" />
- <link rel="shortcut icon" href="/images/logo.ico"
/>
- <link rel="stylesheet" type="text/css"
href="/help/kimchi.css" />
+ <link rel="shortcut icon"
href="../../images/logo.ico" />
+ <link rel="stylesheet" type="text/css"
href="../kimchi.css" />
</head>
<body>
<xsl:apply-templates select="//cshelp" />
diff --git a/ui/pages/kimchi-ui.html.tmpl b/ui/pages/kimchi-ui.html.tmpl
index 844234d..2366d67 100644
--- a/ui/pages/kimchi-ui.html.tmpl
+++ b/ui/pages/kimchi-ui.html.tmpl
@@ -118,7 +118,7 @@
<script id="about-tmpl" type="kimchi/template">
<div class="window about-window">
<header>
- <h1 class="title"><img alt="Kimchi logo"
src="/images/logo.ico"/> $_("About")</h1>
+ <h1 class="title"><img alt="Kimchi logo"
src="images/logo.ico"/> $_("About")</h1>
<div class="close">X</div>
</header>
<div class="content" align="center">
@@ -126,7 +126,7 @@
<div>
<br/>
<br/>
- <img src="/images/theme-default/logo-plain.gif"/>
+ <img src="images/theme-default/logo-plain.gif"/>
<br/>
<br/>
<h2>Kimchi</h2>
diff --git a/ui/pages/storagepool-add.html.tmpl b/ui/pages/storagepool-add.html.tmpl
index 081805b..8ed77a6 100644
--- a/ui/pages/storagepool-add.html.tmpl
+++ b/ui/pages/storagepool-add.html.tmpl
@@ -100,7 +100,7 @@
<div class="host-partition">
<p class="text-help">
$_("Looking for available partitions ...")
- <img src =
"../images/theme-default/loading.gif" />
+ <img src =
"images/theme-default/loading.gif" />
</p>
</div>
</section>
diff --git a/ui/pages/tabs/storage.html.tmpl b/ui/pages/tabs/storage.html.tmpl
index dbbaef9..df4636c 100644
--- a/ui/pages/tabs/storage.html.tmpl
+++ b/ui/pages/tabs/storage.html.tmpl
@@ -43,7 +43,7 @@
</div>
<div id="logicalPoolExtend" title="$_("Device
path")">
<p id="loading-info" class="text-help">
- <img src = "../images/theme-default/loading.gif" />
+ <img src = "images/theme-default/loading.gif" />
$_("Looking for available partitions ...")
</p>
<div class="host-partition">
diff --git a/ui/pages/template-add.html.tmpl b/ui/pages/template-add.html.tmpl
index eaafaa7..f5c5a75 100644
--- a/ui/pages/template-add.html.tmpl
+++ b/ui/pages/template-add.html.tmpl
@@ -145,7 +145,7 @@
<div id="load-remote-iso">
<h3 class="step-subtitle">
<label>
- <img src =
"../images/theme-default/loading.gif" />
+ <img src = "images/theme-default/loading.gif"
/>
$_("Loading default remote ISOs ...")
</label>
</h3>