[Cluster-devel] conga/luci ChangeLog configure load_site.py cl ...
rmccabe at sourceware.org
rmccabe at sourceware.org
Tue Sep 11 16:04:48 UTC 2007
CVSROOT: /cvs/cluster
Module name: conga
Changes by: rmccabe at sourceware.org 2007-09-11 16:04:36
Modified files:
luci : ChangeLog configure load_site.py
luci/cluster : fence_device.js form-macros
validate_config_multicast.js
luci/conga_ssl : SSLClient.cpp SSLClient.h conga_ssl_lib.cpp
setup.py
luci/docs : config_rhel5 user_manual.html
luci/homebase : form-macros
luci/logs : index_html
luci/plone-custom: README footer global_personalbar
login_form_validate.vpy login_success
main_template portlet_login
luci/site/luci/Extensions: LuciClusterActions.py
LuciClusterInfo.py
cluster_adapters.py
luci/site/luci/Extensions/ClusterModel: ClusterNode.py Cman.py
Fence.py FenceDaemon.py
Gulm.py Heuristic.py
Lockserver.py
ModelBuilder.py
Multicast.py Rm.py
Totem.py
luci/site/luci/Products/ManagedSystem: ManagedSystem.py
__init__.py
luci/site/luci/Products/ManagedSystem/skins:
managedsystem_edit_form.cpt
managedsystem_view.pt
luci/site/luci/bin: runzope.in
luci/site/luci/etc: zope.conf.in
luci/storage : cache_report check-batch clu_portlet_fetcher
form-chooser form-macros index_html
mappings_macros mappings_provider
portlet_cluconfig portlet_cluconfig_macro
validate_html
luci/sysconfig : luci
Log message:
luci whitespace cleanup
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/ChangeLog.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/configure.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/load_site.py.diff?cvsroot=cluster&r1=1.16&r2=1.17
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/fence_device.js.diff?cvsroot=cluster&r1=1.14&r2=1.15
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=1.210&r2=1.211
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/validate_config_multicast.js.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/SSLClient.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/SSLClient.h.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/conga_ssl_lib.cpp.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/conga_ssl/setup.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/docs/config_rhel5.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/docs/user_manual.html.diff?cvsroot=cluster&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/form-macros.diff?cvsroot=cluster&r1=1.59&r2=1.60
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/logs/index_html.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/README.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/footer.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/global_personalbar.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/login_form_validate.vpy.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/login_success.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/main_template.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/portlet_login.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterActions.py.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/LuciClusterInfo.py.diff?cvsroot=cluster&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/cluster_adapters.py.diff?cvsroot=cluster&r1=1.269&r2=1.270
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/ClusterNode.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Cman.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Fence.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Gulm.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Heuristic.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Lockserver.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Multicast.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Rm.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Extensions/ClusterModel/Totem.py.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Products/ManagedSystem/ManagedSystem.py.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Products/ManagedSystem/__init__.py.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_edit_form.cpt.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_view.pt.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/bin/runzope.in.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/site/luci/etc/zope.conf.in.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/cache_report.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/check-batch.diff?cvsroot=cluster&r1=1.2&r2=1.3
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/clu_portlet_fetcher.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-chooser.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/form-macros.diff?cvsroot=cluster&r1=1.24&r2=1.25
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/index_html.diff?cvsroot=cluster&r1=1.9&r2=1.10
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/mappings_macros.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/mappings_provider.diff?cvsroot=cluster&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/portlet_cluconfig.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/portlet_cluconfig_macro.diff?cvsroot=cluster&r1=1.1&r2=1.2
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/storage/validate_html.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/sysconfig/luci.diff?cvsroot=cluster&r1=1.1&r2=1.2
--- conga/luci/ChangeLog 2006/07/24 20:17:01 1.5
+++ conga/luci/ChangeLog 2007/09/11 16:04:31 1.6
@@ -1,15 +1,14 @@
-2006-07-24 Stanko Kupcevic <kupcevic at redhat.com>
- * include zope and plone into rpm if
- ../autogen.sh --include_zope_and_plone=yes
+2006-07-24 Stanko Kupcevic <kupcevic at redhat.com>
+ * include zope and plone into rpm if
+ ../autogen.sh --include_zope_and_plone=yes
and configure system accordingly
-2006-07-18 Stanko Kupcevic <kupcevic at redhat.com>
+2006-07-18 Stanko Kupcevic <kupcevic at redhat.com>
* storage: add icons to property dialogs
-2006-07-17 Stanko Kupcevic <kupcevic at redhat.com>
+2006-07-17 Stanko Kupcevic <kupcevic at redhat.com>
* storage: styling of property dialogs
-2006-07-12 Stanko Kupcevic <kupcevic at redhat.com>
+2006-07-12 Stanko Kupcevic <kupcevic at redhat.com>
* storage: use pretty properties' names
-
--- conga/luci/configure 2006/07/24 20:17:01 1.3
+++ conga/luci/configure 2007/09/11 16:04:32 1.4
@@ -19,7 +19,7 @@
done
if [ "$INCLUDE_ZOPE_PLONE" = "" ] ; then
echo 'please define "include_zope_and_plone" as yes or no'
- echo " eg: $0 --include_zope_and_plone=yes"
+ echo " eg: $0 --include_zope_and_plone=yes"
rm -f $MAKE_DEFINES
exit 1
fi
@@ -47,7 +47,7 @@
LIBDIR_SED=\\/lib
X86_64_TMP=`uname -a | grep x86_64`
-if [ "$X86_64_TMP" ]; then
+if [ "$X86_64_TMP" ]; then
LIBDIR_SED=\\/lib64
fi
--- conga/luci/load_site.py 2007/02/05 20:08:28 1.16
+++ conga/luci/load_site.py 2007/09/11 16:04:32 1.17
@@ -185,7 +185,7 @@
if verbose: print 'Uploaded', dbid
except: print 'Unable to upload', dbid
except: print 'Unable to delete', dbid
-
+
def upload_cpt(object, f):
dir, name = os.path.split(f)
@@ -208,7 +208,7 @@
if verbose: print 'Uploaded', dbid
except: print 'Unable to upload', dbid
except: print 'Unable to delete', dbid
-
+
def upload_pt(object, f):
dir, name = os.path.split(f)
--- conga/luci/cluster/fence_device.js 2007/08/08 21:00:06 1.14
+++ conga/luci/cluster/fence_device.js 2007/09/11 16:04:32 1.15
@@ -104,7 +104,7 @@
fence_type = input_tags[i].value;
}
}
- }
+ }
}
var target_form = document.createElement('form');
--- conga/luci/cluster/form-macros 2007/08/24 22:01:41 1.210
+++ conga/luci/cluster/form-macros 2007/09/11 16:04:32 1.211
@@ -287,7 +287,7 @@
onClick="allPasswdsSame(this.form)"
tal:attributes="checked python: (add_cluster and add_cluster['identical_passwds']) and 'checked'"
/>
-
+
Check if node passwords are identical.
</li>
</ul>
@@ -423,7 +423,7 @@
</tal:block>
</td>
<td tal:condition="add_cluster" class="systemsTable">
- <img
+ <img
tal:attributes="
src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
title sys/fp | string:no key fingerprint available" />
@@ -2387,7 +2387,7 @@
value cur_fencedev/name | nothing" />
</td>
</tr>
- </table>
+ </table>
<tal:block tal:condition="exists: cur_fencedev">
<input type="hidden" name="existing_device" value="1" />
@@ -3881,7 +3881,7 @@
</tal:block>
</td>
<td tal:condition="add_cluster" class="systemsTable">
- <img
+ <img
tal:attributes="
src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
title sys/fp | string:no key fingerprint available" />
@@ -4904,7 +4904,7 @@
<input type="hidden" name="oldname"
tal:condition="exists: fdom/name"
tal:attributes="value fdom/name | nothing" />
-
+
<table class="systemsTable" width="100%">
<thead class="systemsTable">
<tr class="systemsTable">
@@ -5257,7 +5257,7 @@
global cur_fence_type cur_fencedev/agent | nothing" />
</tal:block>
- <form name="fencedeveditform" action="" method="post">
+ <form name="fencedeveditform" action="" method="post">
<tal:block
metal:use-macro="here/form-macros/macros/fencedev-cond-ladder" />
--- conga/luci/cluster/validate_config_multicast.js 2007/08/24 22:01:41 1.6
+++ conga/luci/cluster/validate_config_multicast.js 2007/09/11 16:04:32 1.7
@@ -36,7 +36,7 @@
var ifObj = document.getElementById(ifId);
if (ifObj) {
ifObj.disabled = false;
- ifObj.value = prev_mcast_if;
+ ifObj.value = prev_mcast_if;
}
}
--- conga/luci/conga_ssl/SSLClient.cpp 2007/06/25 16:03:38 1.4
+++ conga/luci/conga_ssl/SSLClient.cpp 2007/09/11 16:04:32 1.5
@@ -13,7 +13,7 @@
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
MA 02139, USA.
*/
/*
@@ -59,7 +59,7 @@
file_cert(const String& file, const String& cert) :
file(file),
cert(cert) {}
-
+
String file;
String cert;
};
@@ -67,31 +67,31 @@
-static int
+static int
verify_cert_callback(int preverify_ok, X509_STORE_CTX *ctx)
{
return 1;
}
-static void
+static void
load_peer_certs()
{
MutexLocker l(global_lock);
-
+
// load trusted CAs
- if (!SSL_CTX_load_verify_locations(ctx,
- _trust_CAs,
+ if (!SSL_CTX_load_verify_locations(ctx,
+ _trust_CAs,
NULL))
;//cout << "failed to load trusted CAs" << endl;
-
- STACK_OF(X509_NAME) *cert_names =
+
+ STACK_OF(X509_NAME) *cert_names =
SSL_load_client_CA_file(_trust_CAs);
if (cert_names)
SSL_CTX_set_client_CA_list(ctx, cert_names);
// else
// cout << "failed to load trusted CAs" << endl;
-
+
// load saved certs
-
+
set<String> files;
String dir_path(_certs_store_dir);
DIR* d = opendir(dir_path.c_str());
@@ -118,9 +118,9 @@
closedir(d);
throw;
}
-
+
trusted_certs.clear();
-
+
for (set<String>::const_iterator iter = files.begin();
iter != files.end();
iter++) {
@@ -131,10 +131,10 @@
} catch ( ... ) {}
}
}
-static void
-ssl_mutex_callback(int mode,
- int n,
- const char *file,
+static void
+ssl_mutex_callback(int mode,
+ int n,
+ const char *file,
int line)
{
if (mode & CRYPTO_LOCK)
@@ -155,60 +155,60 @@
SSLClient::SSLClient(ClientSocket sock) :
- _sock(sock),
+ _sock(sock),
_connected(false)
{
{
MutexLocker l(global_lock);
if (!ssl_inited) {
// init library
-
+
SSL_library_init();
// TODO: random number generator,
// not on systems with /dev/urandom (eg. Linux)
-
+
// thread support
ssl_locks.clear();
for (int i=0; i<CRYPTO_num_locks()+1; i++)
ssl_locks.push_back(counting_auto_ptr<Mutex>(new Mutex()));
CRYPTO_set_locking_callback(ssl_mutex_callback);
CRYPTO_set_id_callback(ssl_id_callback);
-
+
// create context
if (!ctx)
ctx = SSL_CTX_new(SSLv23_client_method());
if (!ctx)
throw String("SSL context creation failed");
// set verify_callback() function
- SSL_CTX_set_verify(ctx,
- SSL_VERIFY_PEER,
+ SSL_CTX_set_verify(ctx,
+ SSL_VERIFY_PEER,
verify_cert_callback);
// set mode
SSL_CTX_set_mode(ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
SSL_CTX_set_mode(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
-
+
// load key
- if (!SSL_CTX_use_PrivateKey_file(ctx,
- _privkey,
+ if (!SSL_CTX_use_PrivateKey_file(ctx,
+ _privkey,
SSL_FILETYPE_PEM))
throw String("error importing cert key file");
// load cert
- if (!SSL_CTX_use_certificate_file(ctx,
- _pubkey,
+ if (!SSL_CTX_use_certificate_file(ctx,
+ _pubkey,
SSL_FILETYPE_PEM))
throw String("error importing cert file");
// load peers' certs
load_peer_certs();
-
+
ssl_inited = true;
}
-
+
// create SSL object, giving it context
_ssl = SSL_new(ctx);
if (!_ssl)
throw String("creation of ssl object failed");
}
-
+
// make socket non-blocking
try {
_sock.nonblocking(true);
@@ -216,7 +216,7 @@
SSL_free(_ssl);
throw;
}
-
+
// assign fd to _ssl
if (!SSL_set_fd(_ssl, _sock.get_sock())) {
SSL_free(_ssl);
@@ -231,12 +231,12 @@
}
-bool
+bool
SSLClient::connect(unsigned int timeout)
{
if (_connected)
return _connected;
-
+
unsigned int beg = time_mil();
while (time_mil() < beg + timeout) {
int ret = SSL_connect(_ssl);
@@ -249,20 +249,20 @@
socket().ready(want_read, want_write, 250);
}
}
-
+
return _connected;
}
-String
+String
SSLClient::send(const String& msg,
unsigned int timeout)
{
if (!_connected)
throw String("cannot send, yet: SSL connection not connected");
-
+
if (msg.empty())
return msg;
-
+
unsigned int beg = time_mil();
while (time_mil() < beg + timeout) {
int ret = SSL_write(_ssl, msg.c_str(), msg.size());
@@ -274,18 +274,18 @@
socket().ready(want_read, want_write, 250);
}
}
-
+
return msg;
}
-String
+String
SSLClient::recv(unsigned int timeout)
{
if (!_connected)
throw String("cannot receive, yet: SSL connection not connected");
-
+
char buff[4096];
-
+
unsigned int beg = time_mil();
while (time_mil() < beg + timeout) {
int ret = SSL_read(_ssl, buff, sizeof(buff));
@@ -299,23 +299,23 @@
socket().ready(want_read, want_write, 250);
}
}
-
+
return "";
}
-bool
+bool
SSLClient::peer_has_cert()
{
if (!_connected)
throw String("cannot determine if peer has certificate: SSL connection not connected");
-
+
if (_cert_pem.size())
return true;
-
+
X509* cert = SSL_get_peer_certificate(_ssl);
- if (!cert)
+ if (!cert)
return false;
-
+
// load cert into _cert_pem
FILE* f = NULL;
try {
@@ -324,7 +324,7 @@
if (!PEM_write_X509(f, cert))
throw String("unable to write cert to tmp file");
X509_free(cert); cert = NULL;
-
+
// read cert
rewind(f);
while (true) {
@@ -339,7 +339,7 @@
}
}
fclose(f); f = NULL;
- } catch ( ... ) {
+ } catch ( ... ) {
if (cert)
X509_free(cert);
if (f)
@@ -347,16 +347,16 @@
_cert_pem.clear();
throw;
}
-
+
return true;
}
-String
+String
SSLClient::peer_cert_fingerprint(String& digest)
{
if (!peer_has_cert())
throw String("peer did not present cert");
-
+
String f_name("/tmp/luci_tmp_XXXXXX");
int fd = -1;
char* buff = new char[f_name.size() + 1];
@@ -368,10 +368,10 @@
f_name = buff;
delete[] buff; buff = 0;
while (close(fd) && errno == EINTR) ; fd = -1;
-
+
File f = File::open(f_name, true);
f.replace(_cert_pem);
-
+
String out, err;
int status;
vector<String> args;
@@ -381,7 +381,7 @@
args.push_back(f_name);
args.push_back("-noout");
args.push_back("-fingerprint");
- if (utils::execute("/usr/bin/openssl",
+ if (utils::execute("/usr/bin/openssl",
args,
out,
err,
@@ -391,17 +391,17 @@
if (status)
throw String("openssl command failed");
unlink(f_name.c_str());
-
+
vector<String> words(utils::split(utils::strip(out)));
if (words.size() != 2)
throw String("error parsing fingerprint");
-
+
String finger(words[1]);
String::size_type idx = finger.find('=');
if (idx == finger.npos ||
idx+1 == finger.size())
throw String("error parsing fingerprint");
-
+
digest = words[0];
return finger.substr(idx+1);
} catch ( ... ) {
@@ -414,17 +414,17 @@
}
}
-bool
+bool
SSLClient::peer_cert_trusted()
{
// signed by trusted CAs?
X509* cert = SSL_get_peer_certificate(_ssl);
- if (!cert)
+ if (!cert)
return false;
X509_free(cert);
if (SSL_get_verify_result(_ssl) == X509_V_OK)
return true;
-
+
// cert present among saved certs?
peer_has_cert(); // make sure cert is saved in _cert_pem
MutexLocker l(global_lock);
@@ -436,17 +436,17 @@
return false;
}
-bool
+bool
SSLClient::trust_peer_cert(const String& hostname)
{
MutexLocker l(global_lock);
-
+
if (peer_cert_trusted())
return true;
-
+
if (!peer_has_cert())
throw String("peer did not present cert");
-
+
String filename(_certs_store_dir);
filename += "/" + hostname + "_cert_pub";
try {
@@ -455,26 +455,26 @@
unlink(filename.c_str());
return false;
}
-
+
load_peer_certs();
-
+
return true;
}
-bool
+bool
SSLClient::untrust_peer_cert()
{
MutexLocker l(global_lock);
-
+
if (!peer_has_cert())
throw String("peer did not present cert");
-
+
for (list<file_cert>::const_iterator iter = trusted_certs.begin();
iter != trusted_certs.end();
iter++)
if (iter->cert == _cert_pem)
unlink(iter->file.c_str());
-
+
load_peer_certs();
return true;
}
@@ -489,7 +489,7 @@
SSLClient::check_error(int value, bool& want_read, bool& want_write)
{
want_read = want_write = false;
-
+
String e;
switch (SSL_get_error(_ssl, value)) {
case SSL_ERROR_NONE:
@@ -520,10 +520,10 @@
e = "SSL_ERROR_SSL";
break;
}
-
+
//FILE* f = fopen("/tmp/ssl_error_que", "a");
//ERR_print_errors_fp(f);
//fclose(f);
-
+
throw String("SSL error: ") + e;
}
--- conga/luci/conga_ssl/SSLClient.h 2006/12/21 21:32:00 1.2
+++ conga/luci/conga_ssl/SSLClient.h 2007/09/11 16:04:32 1.3
@@ -13,7 +13,7 @@
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
MA 02139, USA.
*/
/*
@@ -44,36 +44,36 @@
public:
SSLClient(ClientSocket sock);
virtual ~SSLClient();
-
+
bool connect(unsigned int timeout);
-
+
String send(const String& msg, unsigned int timeout);
String recv(unsigned int timeout);
-
-
+
+
bool peer_has_cert();
bool peer_cert_trusted(); // return true if peer's cert is trusted (either thru CA chain, or saved in cert_store)
-
+
String peer_cert_fingerprint(String& digest);
-
+
bool trust_peer_cert(const String&);
bool untrust_peer_cert(); // remove peer's cert from cert_store
-
+
ClientSocket& socket();
-
+
private:
SSLClient(const SSLClient&);
SSLClient operator=(const SSLClient&);
-
+
ClientSocket _sock;
SSL* _ssl;
String _cert_pem;
-
+
bool _connected;
-
+
void check_error(int value, bool& want_read, bool& want_write);
-
-
+
+
}; // class SSLClient
--- conga/luci/conga_ssl/conga_ssl_lib.cpp 2007/06/25 16:03:38 1.4
+++ conga/luci/conga_ssl/conga_ssl_lib.cpp 2007/09/11 16:04:32 1.5
@@ -13,7 +13,7 @@
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to the
- Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
+ Free Software Foundation, Inc., 675 Mass Ave, Cambridge,
MA 02139, USA.
*/
/*
@@ -41,10 +41,10 @@
public:
PythonThreadsAllower()
{ _save = PyEval_SaveThread(); }
-
+
~PythonThreadsAllower()
{ PyEval_RestoreThread(_save); }
-
+
private:
PyThreadState *_save;
};
@@ -114,8 +114,8 @@
const char* hostname;
int port;
int timeout;
- if (!PyArg_ParseTuple(args,
- "sii",
+ if (!PyArg_ParseTuple(args,
+ "sii",
&hostname,
&port,
&timeout))
@@ -128,7 +128,7 @@
PyErr_SetString(PyExc_ValueError, "negative timeout");
return NULL;
}
-
+
try {
counting_auto_ptr<SSLClient> ss;
{
@@ -154,9 +154,9 @@
int id;
if (!PyArg_ParseTuple(args, "i", &id))
return NULL;
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::iterator iter =
ssls.find(id);
if (iter != ssls.end())
ssls.erase(iter);
@@ -182,13 +182,13 @@
PyErr_SetString(PyExc_ValueError, "negative timeout");
return NULL;
}
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
{
PythonThreadsAllower all;
int beg = int(time_sec());
@@ -201,7 +201,7 @@
break;
}
}
-
+
Py_INCREF(Py_None);
return Py_None;
} catch (String e) {
@@ -224,14 +224,14 @@
PyErr_SetString(PyExc_ValueError, "negative timeout");
return NULL;
}
-
+
try {
map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
String resp;
{
PythonThreadsAllower all;
@@ -261,7 +261,7 @@
}
}
}
-
+
PyObject* resp_p = Py_BuildValue("s", resp.c_str());
return resp_p;
} catch (String e) {
@@ -280,19 +280,19 @@
const char* msg;
if (!PyArg_ParseTuple(args, "is", &id, &msg))
return NULL;
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
bool resp;
{
PythonThreadsAllower all;
resp = iter->second->trust_peer_cert(msg);
}
-
+
PyObject* resp_p = Py_BuildValue("i", (resp)?1:0);
return resp_p;
} catch (String e) {
@@ -309,19 +309,19 @@
int id;
if (!PyArg_ParseTuple(args, "i", &id))
return NULL;
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
bool resp;
{
PythonThreadsAllower all;
resp = iter->second->peer_cert_trusted();
}
-
+
PyObject* resp_p = Py_BuildValue("i", (resp)?1:0);
return resp_p;
} catch (String e) {
@@ -338,19 +338,19 @@
int id;
if (!PyArg_ParseTuple(args, "i", &id))
return NULL;
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
bool resp;
{
PythonThreadsAllower all;
resp = iter->second->untrust_peer_cert();
}
-
+
PyObject* resp_p = Py_BuildValue("i", (resp)?1:0);
return resp_p;
} catch (String e) {
@@ -367,19 +367,19 @@
int id;
if (!PyArg_ParseTuple(args, "i", &id))
return NULL;
-
+
try {
- map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
+ map<int, counting_auto_ptr<SSLClient> >::const_iterator iter =
ssls.find(id);
if (iter == ssls.end())
throw String("SSL connection closed");
-
+
String finger, digest;
{
PythonThreadsAllower all;
finger = iter->second->peer_cert_fingerprint(digest);
}
-
+
PyObject* resp_p = Py_BuildValue("(ss)", digest.c_str(), finger.c_str());
return resp_p;
} catch (String e) {
--- conga/luci/conga_ssl/setup.py 2007/03/23 17:25:12 1.2
+++ conga/luci/conga_ssl/setup.py 2007/09/11 16:04:32 1.3
@@ -9,27 +9,27 @@
'/usr/include/libxml2'],
libraries = ['ssl', 'xml2'],
#library_dirs = ['/usr/local/lib'],
- sources = ['conga_ssl_lib.cpp',
- 'SSLClient.cpp',
- '../../ricci/common/ClientSocket.cpp',
- '../../ricci/common/Socket.cpp',
- '../../ricci/common/Network.cpp',
- '../../ricci/common/Logger.cpp',
- '../../ricci/common/Time.cpp',
- '../../ricci/common/File.cpp',
- '../../ricci/common/XML.cpp',
- '../../ricci/common/utils.cpp',
+ sources = ['conga_ssl_lib.cpp',
+ 'SSLClient.cpp',
+ '../../ricci/common/ClientSocket.cpp',
+ '../../ricci/common/Socket.cpp',
+ '../../ricci/common/Network.cpp',
+ '../../ricci/common/Logger.cpp',
+ '../../ricci/common/Time.cpp',
+ '../../ricci/common/File.cpp',
+ '../../ricci/common/XML.cpp',
+ '../../ricci/common/utils.cpp',
'../../ricci/common/executils.cpp'])
setup (name = 'conga_ssl_lib',
version = '0.8',
- description = 'SSL Python bindings for Conga',
- author = 'Stanko Kupcevic',
+ description = 'SSL Python bindings for Conga',
+ author = 'Stanko Kupcevic',
author_email = 'kupcevic at redhat.com',
copyright = 'Red Hat, Inc.',
- license = 'GPL',
+ license = 'GPL',
url = 'http://www.sourceware.org/cluster/conga',
long_description = '''
conga_ssl_lib
--- conga/luci/docs/config_rhel5 2006/11/03 21:47:27 1.2
+++ conga/luci/docs/config_rhel5 2007/09/11 16:04:33 1.3
@@ -50,13 +50,13 @@
9000 MTU as the maximum frame size including the IP header. Setting the netmtu
and host MTUs to 9000 will cause totem to use the full 9000 bytes of the frame.
Then Linux will add a 18 byte header moving the full frame size to 9018. As a
-result some hardware will not operate properly with this size of data. A netmtu
+result some hardware will not operate properly with this size of data. A netmtu
of 8982 seems to work for the few large frame devices that have been tested.
Some manufacturers claim large frame support when in fact they support frame
sizes of 4500 bytes.
<p>
Increasing the MTU from 1500 to 8982 doubles throughput performance from 30MB/sec
-to 60MB/sec as measured with evsbench with 175000 byte messages with the secauth
+to 60MB/sec as measured with evsbench with 175000 byte messages with the secauth
directive set to off.
<p>
When sending multicast traffic, if the network frequently reconfigures, chances are
@@ -73,7 +73,7 @@
multiple threads to encrypt and send multicast messages.
<p>
A thread directive of 0 indicates that no threaded send should be used. This
-mode offers best performance for non-SMP systems.
+mode offers best performance for non-SMP systems.
<p>
The default is 0.
<p>
@@ -81,14 +81,14 @@
This directive controls the virtual synchrony filter type used to identify
a primary component. The preferred choice is YKD dynamic linear voting,
however, for clusters larger then 32 nodes YKD consumes alot of memory. For
-large scale clusters that are created by changing the MAX_PROCESSORS_COUNT
+large scale clusters that are created by changing the MAX_PROCESSORS_COUNT
#define in the C code totem.h file, the virtual synchrony filter "none" is
recommended but then AMF and DLCK services (which are currently experimental)
are not safe for use.
<p>
The default is ykd. The vsftype can also be set to none.
<p>
-Within the
+Within the
<B>totem </B>
directive, there are several configuration options which are used to control
@@ -129,7 +129,7 @@
The default is 4 retransmissions.
<p>
<dt><a name="join"><strong>join</strong></a><dd>
-This timeout specifies in milliseconds how long to wait for join messages in
+This timeout specifies in milliseconds how long to wait for join messages in
the membership protocol.
<p>
The default is 100 milliseconds.
@@ -181,10 +181,10 @@
<dt><a name="heartbeat_failures_allowed"><strong>heartbeat_failures_allowed</strong></a><dd>
[HeartBeating mechanism]
Configures the optional HeartBeating mechanism for faster failure detection. Keep in
-mind that engaging this mechanism in lossy networks could cause faulty loss declaration
-as the mechanism relies on the network for heartbeating.
+mind that engaging this mechanism in lossy networks could cause faulty loss declaration
+as the mechanism relies on the network for heartbeating.
<p>
-So as a rule of thumb use this mechanism if you require improved failure in low to
+So as a rule of thumb use this mechanism if you require improved failure in low to
medium utilized networks.
<p>
This constant specifies the number of heartbeat failures the system should tolerate
--- conga/luci/docs/user_manual.html 2007/06/27 08:14:12 1.17
+++ conga/luci/docs/user_manual.html 2007/09/11 16:04:33 1.18
@@ -67,28 +67,28 @@
<p/>
<p/>
Enter admin as the user name, and then enter the admin password that has been
- set up in the appropriate field, then click "log in".
+ set up in the appropriate field, then click "log in".
<h4>UI Organization</h4>
luci is set up with three tabs:
<ul><li>Homebase: This is where admin tools for adding and deleting systems
- or users are located. Only admin is allowed access to this tab.</li>
+ or users are located. Only admin is allowed access to this tab.</li>
<li>Cluster: If any clusters are set up with the luci server, they will
show up in a list in this tab. If a user other than admin navigates to the
cluster tab, only those clusters that the user has permission to manage show
up in the cluster list. The cluster tab provides a means for creating and
- configuring clusters.</li>
+ configuring clusters.</li>
<li>Storage: Remote administration of storage is available through this
- page in the luci site.</li>
+ page in the luci site.</li>
</ul>
<h2>Homebase Tab</h2>
The following figure shows the entry look of the Homebase tab.<br/>
- <img src="./ss_homebase1.png"/>
+ <img src="./ss_homebase1.png"/>
<br/>
<b>Figure #2: Homebase Tab</b>
<p/>
<p/>
With no systems registered with a luci server, the Homebase page provides three
- initial utilities to the admin:
+ initial utilities to the admin:
<ul><li>Add a System</li>
<li>Add an Existing Cluster</li>
<li>Add a User</li>
@@ -96,7 +96,7 @@
After systems have been added to a luci server, the Manage Systems link become
available in the navigation table.<p/>
-
+
After users have been added to a luci server, the following links become available in the navigation table:
<ul>
<li>User Permissions</li>
@@ -104,12 +104,12 @@
</ul>
<h4>Add a System:</h4> Adding a single system to luci makes the system
- available for remote storage administration. In addition to
+ available for remote storage administration. In addition to
storage administration, Conga provides remote package retrieval and
installation, the chkconfig function, full remote cluster administration, and
- module support to filter and retrieve log entries. <p/>
+ module support to filter and retrieve log entries. <p/>
To add a system, click on the Add a System link in the left hand navigation
- table. This will load the following page:
+ table. This will load the following page:
<img src="./addsys_11.png"/><br/>
<b>Figure #3: Add a System</b>
<p/>
@@ -120,24 +120,24 @@
Another Entry button is provided. When this button is clicked and at least
one additional entry row has been provided, a checkbox is also made available
that can be selected if all systems specified for addition to the luci server
- share the same password.
+ share the same password.
<img src="./addsys_22.png"/><br/>
<b>Figure #4: Multiple System Entries</b>
<p/>
<p/>
If the System Hostname is left blank for any row, it is disregarded when the
- list of systems is submitted for addition. If the user wishes to delete a
- row for any reason, the icon at the far right of the row (that resembles
+ list of systems is submitted for addition. If the user wishes to delete a
+ row for any reason, the icon at the far right of the row (that resembles
rows in a table with an 'x') can be clicked. If systems in the list of rows do
NOT share the same password (and the checkbox is, of course, left unchecked)
and one or more passwords are incorrect, an error message is generated for
each system that has an incorrect password. The systems listed with correct
passwords are added to the luci server. In addition to incorrect password
problems, an error message is also displayed if luci is unable to connect to
- the ricci agent on a system.
+ the ricci agent on a system.
<p/>
For most typical datacenter deployments of conga, the luci server will
- reside on a system within the confines of the datacenter network, and
+ reside on a system within the confines of the datacenter network, and
the datacenter systems can pretty safely be assumed to be trustworthy.
If a luci server is used to connect to systems across the open Internet,
the user <i>could</i> be vulnerable to a form of security attack known
@@ -145,15 +145,15 @@
the client and server intercepts data exchanged, while masquerading
to its peers as a legitimate party, and issues potentially malicious commands.
<p/>
- If the user would like to verify the certificate of a ricci agent before
- authenticating to it (avoiding a 'Man in the Middle' attack), the
- checkbox marked <b>Verify system certificates before sending any
- passwords</b> should be checked. With this box checked, clicking submit
- retrieves the certificate information for all systems listed, and provides
- a 'Trust' checkbox for each system. The password for a system will not
+ If the user would like to verify the certificate of a ricci agent before
+ authenticating to it (avoiding a 'Man in the Middle' attack), the
+ checkbox marked <b>Verify system certificates before sending any
+ passwords</b> should be checked. With this box checked, clicking submit
+ retrieves the certificate information for all systems listed, and provides
+ a 'Trust' checkbox for each system. The password for a system will not
be sent without the trust box checked. To add the system or systems,
click the 'Trust' checkboxes for each row desired and click submit again.
- Mousing over the lock icon for
+ Mousing over the lock icon for
a row entry will display the certificate information for just that system. It is important to note that in order to defend against this type of attack, the user must know the certificate fingerprints of client systems prior to the initial key exchange. When the client systems are added, the user can then compare the known certificate fingerprints with the fingerprints displayed by the luci server to verify they match. A mismatch indicates the possibility of an attack.
<p/>
<img src="./addsys_33.png"/><br/>
@@ -182,58 +182,58 @@
<p/>When a cluster is added to a luci server, all nodes are also added as general systems so that storage may be managed on them. If this is not desired, the individual systems may be removed from luci, while remote cluster management capability is maintained.<p/>
NOTE: If an administrator desires to create a new cluster, this capability is
available on the Cluster tab. This task link is only for adding and managing
- clusters that already exist.<p/>
+ clusters that already exist.<p/>
<h4>Add a User: </h4>Here the admin may add additional user accounts. The user
- name is entered along with an initial password.
+ name is entered along with an initial password.
<img src="./ss_homebase4.png"/><br/>
<b>Figure #5: Add a User</b>
<p/>
<p/>
As stated above, after systems have been added to a luci server, an additional
Manage Systems link appears in the navigation table. The Manage Systems page
- provides a way to delete systems if desired.
+ provides a way to delete systems if desired.
<p/>
When an administrator adds a new user to a luci server, two additional links appear in
the Navigation Table: A Delete User link, and a User Permissions link. The
Delete User link is self explanatory, and this page lists all users other than
the admin, in a dropdown menu. Selecting a user name and then clicking the
- Delete This User button removes that user account from the luci server.<br/>
+ Delete This User button removes that user account from the luci server.<br/>
The User Permissions page is where an administrator grants privileges to user
accounts. A dropdown menu lists all current users, followed by a list of all
systems registered with the luci server. By selecting a user from the
dropdown, the context is set for the page, and then those systems that the
admin wishes to allow the user to administer are checked. Finally, the Update
Permissions button is clicked to persist the privileges. By default, a user
- has no user permissions upon creation.
+ has no user permissions upon creation.
<img src="./ss_homebase5.png"/><br/>
<b>Figure #6: User Permissions Page</b>
<p/>
<p/>
-
+
<h2>Cluster Tab</h2>
- When the cluster tab is selected, luci first checks the identity of the user and
+ When the cluster tab is selected, luci first checks the identity of the user and
compiles a list of clusters that the current user is permitted to administer.
If the current user is not permitted to access any of the clusters registered
on the luci server, they are informed accordingly. If the current user is the
- admin, then all clusters are accessible.
+ admin, then all clusters are accessible.
<p/>
Selecting the Cluster tab causes a page to be displayed that lists all
- registered clusters on the luci server that are accessible by the
+ registered clusters on the luci server that are accessible by the
current user. Each cluster is identified by name and presents a link to
the properties page for that cluster. In addition, the health of the
cluster can be quickly assessed - green indicates good health, and red
- indicates a problem.
+ indicates a problem.
<p/>
The nodes of the cluster are also listed, with health indicated by font
- color. Green means healthy and part of the cluster;
+ color. Green means healthy and part of the cluster;
red means not part of the cluster, and gray means that the node is not
- responding and in an unknown state.
+ responding and in an unknown state.
<br/>
The Cluster List page offers some additional summary information about each
cluster. It displays quorum status and the total cluster votes. A dropdown
menu allows a cluster to be started, stopped, or
restarted. Finally, services for the cluster are listed as links, with their
- health indicated by font color.
+ health indicated by font color.
<p/>
On the left side of every cluster tab page is a navigation table with
three links: Cluster List, Create, and Configure. The default page is the
@@ -241,7 +241,7 @@
the Configure link displays a short list of clusters in the navigation
table. Choosing a cluster name takes the user to the properties page for that
cluster (the cluster name link on the Cluster List page performs the same
- action).
+ action).
<img src="./clus1.png"/><br/>
<b>Figure #7: Cluster List Page</b>
<p/>
@@ -253,7 +253,7 @@
navigation table to be displayed below the clusters table (on the left side of
the page). The cluster specific table identifies the cluster name at the top
of the table and presents links to the five configuration
- categories for clusters.</br>
+ categories for clusters.</br>
NOTE: Until a specific cluster is selected, the cluster pages have no specific
cluster context associated with them. Once a cluster has been selected,
however, the links and options available on the lower cluster navigation table
@@ -265,9 +265,9 @@
(You can easily return to the cluster list page in one of three ways: by
clicking on the Cluster tab, selecting the Cluster List link in the main
navigation table, or selecting the Configure link from the main navigation
- table.)
+ table.)
The configuration categories available in the lower cluster-specific navigation
- table are as follows:
+ table are as follows:
<ul><li>Nodes</li>
<li>Services</li>
<li>Resources</li>
@@ -275,14 +275,14 @@
<li>Shared Fence Devices</li>
</ul>
Selecting any of these primary configuration links offers a similar set of
- options for each configuration category, by doing the following:
+ options for each configuration category, by doing the following:
<ul><li>A list is presented of the corresponding configurable cluster
elements. For example, if Nodes is selected, a list of all nodes in the
cluster is displayed with general node tasks and quick links to node-related
configuration pages. The following figure shows a typical node list. Note that
this is a high-level view of each node, and is useful for quickly assessing
the health of the node and checking which cluster services are currently
- deployed on a node.</li>
+ deployed on a node.</li>
<li>A sub-menu is offered for each configuration category. Options in this
submenu are:<ul><li>Create or Add</li><li>Configure; which also displays a
list of the individual configuration elements which are direct links to the
@@ -293,10 +293,10 @@
of those elements with a high level diagnostic view and links to more detailed
aspects of the elements, a link to create a new element, and a sub-menu list
of direct links to the detailed configuration properties page for each element
- currently configured.
+ currently configured.
This "drill-down" pattern, wherein a top level list of elements is displayed
with links to properties pages for each element, paired with a way to create a
- new element, is repeated throughout the luci Cluster UI.
+ new element, is repeated throughout the luci Cluster UI.
<img src="./clus2.png"/><br/>
<b>Figure #8: Cluster Properties Page - Note name of cluster at the top of the page, and in the Title section of the lower navigation table</b>
<p/>
@@ -308,80 +308,80 @@
for the node in a new browser window. A dropdown menu allows administrators of
the cluster a way to have the node join or leave the cluster. The node can
also be fenced, rebooted, or deleted through the options in the dropdown
- menu.
+ menu.
<img src="./clus3.png"/>
<b>Figure #9: Node List Page</b><br/>
- <p/>
- <p/>
+ <p/>
+ <p/>
The name of the node is a link to the detailed configuration page for that node,
and the color of the font (green or red) reflects a course status check on the
- health of the node.
-<p/>
+ health of the node.
+<p/>
When the Nodes link is chosen in the lower navigation table, the Add a Node
and Configure options become visible. The Configure option link has a list of
the nodes beneath it, and selecting one of these links is a direct path to the
detailed properties page for the node, in the same way that the node name link
- is on the node list page.
+ is on the node list page.
<h4>Add a Node</h4>
Below is a screenshot of the Add a Node page:<br/>
<img src="./addnode_11.png"/>
<b>Figure #10: Add a Node Page</b>
- <p/>
- <p/>
+ <p/>
+ <p/>
The Add a Node page is similar in look and function to the Add a System
page available in the Homebase tab. The system hostname of IP address is
entered in the appropriate field along with the password for the
system. Multiple nodes may be added at once. The user is offered the
chance to verify the certificate for the new node to be added, just as
- they were when adding a system on the home base tab.
+ they were when adding a system on the home base tab.
<p/>
Two other options are available to the user when adding a node: They are
presented with a pair of radio buttons that allow for a choice of either
- pulling the necessary packages from the configured Yum repository for
+ pulling the necessary packages from the configured Yum repository for
the system (The very latest packages are always selected with this option),
- or packages already installed on the system are used. If any packages
+ or packages already installed on the system are used. If any packages
are missing, an error message is returned and the node is not added.
<p/>
The other option available to the user is a checkbox for Shared Storage
support. Checking this box will install and initially configure the
- CLVM (Clustered Logical Volume Management) packages and the GFS clustered file system packages. In a cluster environment, this box will almost always need to
+ CLVM (Clustered Logical Volume Management) packages and the GFS clustered file system packages. In a cluster environment, this box will almost always need to
be checked.
When the submit button is
- clicked, the following takes place:
+ clicked, the following takes place:
<ul>
<li>Contact is made with each future nodes ricci agent. If this contact fails
on any listed hostname, the operation is suspended and the user is offered the
- chance to re-enter the password.</li>
+ chance to re-enter the password.</li>
<li>After authentication is made on all listed nodes, the proper cluster suite
- RPMs for that node's architecture are pulled down and installed.</li>
+ RPMs for that node's architecture are pulled down and installed.</li>
<li>After installation, an initial cluster.conf file is propagated to each node.</li>
<li>Finally, each future node is rebooted. When the node comes back up, it
- should join the cluster without error.</li>
+ should join the cluster without error.</li>
</ul><br/>
NOTE: Until the node to be added has completed he installation and cluster join
operation, any attempts to navigate to the configuration page for that node
will result in a "busy signal" graphic that informs the user of what
modification is occurring and to try back later when the operation is
- complete.
+ complete.
<p/>
<h4>Node Configuration Page</h4>
Selecting the name link in the node list page, or selecting a nodename in the
list below the node Configure link in the lower navigation table takes the
user directly to the Node Configuration page. Here is an image of a typical
- node configuration page:
+ node configuration page:
<img src="./clus4.png"/>
<b>Figure #11: Node Configuration Page</b><br/>
- <p/>
- <p/>
+ <p/>
+ <p/>
This page is divided into 5 sections.
<ul>
<li>General Node Tasks - The first section on the node configuration page
shows general node health and offers a link to view recent log activity on the
node in a pop-up browser window, and also offers a dropdown menu of some common
- tasks to perform on a node. These tasks are:
+ tasks to perform on a node. These tasks are:
<ul>
<li>Have node join/leave cluster - depending on he node status, one of these
- options is offered.</li>
+ options is offered.</li>
<li>Fence Node - The node is fenced by the configured means.</li>
<li>Reboot Node</li>
<li>Delete Node - when a node is deleted, it is made to leave the cluster,
@@ -389,16 +389,16 @@
deleted, and a new cluster.conf file is propagated to the remaining nodes in
the cluster with the deleted node removed from the configuration. Note
that deleting a node does not remove the installed cluster packages from the
- node.</li>
+ node.</li>
</ul>
</li><br/>
<li>The next section of the node configuration page is a table showing the
status of cluster daemons. In the screenshot above, four cluster daemons are
listed. This is for a RHEL 4 cluster. In the RHEL 5 cluster suite, only two
- daemons are listed.
+ daemons are listed.
<p/>
Each daemon can be separately started or stopped, and its chkconfig status
- amended to allow the daemon to be enabled at system startup or not.</li>
+ amended to allow the daemon to be enabled at system startup or not.</li>
<li>All services running on the node are listed along with their status in the
"Services on this Node" section. Links are offered to each services
configuration page.</li> <br/>
@@ -409,16 +409,16 @@
configuration. Two levels of fencing may be configured: A Main fencing method,
and a Backup method. The cluster suite attempts to fence the node, if
necessary, with the main fencing method first. If this fails, the backup
- method is employed.
+ method is employed.
<p/>
Each of the two fence levels or methods may employ multiple fence types within
them; for example, when power switch fencing is used to fence a node with dual
- redundant power supplies.</li>
+ redundant power supplies.</li>
</ul>
<p/>
<p/>
- <h2>Storage Tab</h2>
+ <h2>Storage Tab</h2>
This tab allows the user to monitor and configure storage
on remote systems. It provides a means for configuring disk partitions, logical
volumes (clustered as well as single system use), and file system parameters and
@@ -434,28 +434,28 @@
changed on specific configuration forms throughout the storage UI. This general
choice allows an administrator to avoid difficult decimal representations of storage
size (for example, if they know that most of their storage is measured in
-gigabytes, terabytes, or other more familiar representations). <p/>
+gigabytes, terabytes, or other more familiar representations). <p/>
A dropdown menu also allows the user to choose if they would rather have devices
-displayed by path or SCSI ID.<p/>
+displayed by path or SCSI ID.<p/>
Finally, this main storage page lists systems that the user is authorized to
access, but currently unable to administer due to a problem such as a system
is unreachable via the network, or the system has been re-imaged and the luci
server admin must re-authenticate with the ricci agent on the system. A reason
- for the trouble is displayed if it can be determined.<p/>
+ for the trouble is displayed if it can be determined.<p/>
Only those systems that the user is privileged to administer is shown in the
tabs main navigation table. If the user has no permissions on any systems, an
-appropriate message is displayed.
+appropriate message is displayed.
<h4>General System Page</h4>
After a system is selected to administer, a general properties page is
- displayed for the system. This page view is divided into three sections:
+ displayed for the system. This page view is divided into three sections:
<ul>
<li>Hard Drives</li>
<li>Partitions</li>
<li>Volume Groups</li>
</ul>
Each of these sections is set up as an expandable tree, with direct links
- provided to property sheets for specific devices, partitions, etc.
+ provided to property sheets for specific devices, partitions, etc.
</body>
</html>
--- conga/luci/homebase/form-macros 2007/08/09 21:05:28 1.59
+++ conga/luci/homebase/form-macros 2007/09/11 16:04:33 1.60
@@ -187,7 +187,7 @@
<tal:block tal:condition="python:perms">
<span tal:content="string:Select a User" /><br/>
-
+
<select class="homebase" name="userList"
onchange="document.location = '/luci/homebase/?pagetype=3&user=' + this.form.userList.options[this.form.userList.selectedIndex].text">
<tal:block tal:define="userlist python: perms">
@@ -307,7 +307,7 @@
<th class="systemsTable"></th>
</tr>
</thead>
-
+
<tbody class="systemsTable" id="sys_tbody">
<tr class="systemsTable" id="__SYSTEM_ROW_0">
<td class="systemsTable">
@@ -370,7 +370,7 @@
value nothing" />
</td>
<td class="systemsTable">
- <img
+ <img
tal:attributes="
src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
title sys/fp | string:no key fingerprint available"
@@ -604,7 +604,7 @@
<th class="systemsTable"></th>
</tr>
</thead>
-
+
<tbody class="systemsTable" id="sys_tbody">
<tr class="systemsTable" id="__SYSTEM_ROW_0">
<td class="systemsTable">
@@ -665,10 +665,10 @@
id python: '__SYSTEM%d:Passwd' % cur_sysnum;
name python: '__SYSTEM%d:Passwd' % cur_sysnum;
value nothing" />
-
+
</td>
<td class="systemsTable">
- <img
+ <img
tal:attributes="
src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
title sys/fp | string:no key fingerprint available"
@@ -812,7 +812,7 @@
id="allSameCheckBox" onclick="allPasswdsSame(this.form)"
tal:attributes="checked python: add_cluster['identical_passwds'] and 'checked'"
/>
-
+
Check if node passwords are identical.
</li>
<li class="vanilla" tal:condition="python: add_cluster['pass'] > 0 and 'incomplete' in add_cluster">
@@ -864,7 +864,7 @@
</tal:block>
</td>
<td class="systemsTable">
- <img
+ <img
tal:attributes="
src python: 'trusted' in sys and '/luci/lock-ok.png' or ('fp' in sys and '/luci/lock-closed.png' or '/luci/lock-open.png');
title sys/fp | string:no key fingerprint available" />
--- conga/luci/logs/index_html 2007/06/25 16:03:38 1.4
+++ conga/luci/logs/index_html 2007/09/11 16:04:33 1.5
@@ -27,7 +27,7 @@
<metal:headslot define-slot="head_slot" />
<tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
</metal:headslot>
-
+
<metal:styleslot fill-slot="style_slot">
<tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
<metal:styleslot define-slot="style_slot" />
@@ -115,8 +115,8 @@
<div id="log_data">
<h2>Recent log information for <span tal:replace="request/nodename | string: host"/></h2>
-
- <div id="log_entries">
+
+ <div id="log_entries">
<table style="width: 100%">
<tr><td><div style="padding-bottom: 2cm;"> </div></td></tr>
<tr>
--- conga/luci/plone-custom/README 2006/07/26 16:55:37 1.1
+++ conga/luci/plone-custom/README 2007/09/11 16:04:33 1.2
@@ -1,4 +1,4 @@
-custom.xml is a backup of whole portal_skins/custom directory, including methods, types and permisions.
+custom.xml is a backup of whole portal_skins/custom directory, including methods, types and permisions.
Other files are a content of the same dir.
So, custom.xml is to be restored first, thru ZMI, the rest of files can be pushed using Makefile.
--- conga/luci/plone-custom/footer 2007/03/12 17:20:01 1.4
+++ conga/luci/plone-custom/footer 2007/09/11 16:04:33 1.5
@@ -4,7 +4,7 @@
<p>
<span i18n:translate="description_copyright" tal:omit-tag="">
- The
+ The
<span>
<a href="http://www.sourceware.org/cluster/conga">
Conga Cluster and Storage Management System</a>
@@ -14,8 +14,8 @@
©
</acronym>
2000—<span
- i18n:name="current_year"
- tal:define="now modules/DateTime/DateTime"
+ i18n:name="current_year"
+ tal:define="now modules/DateTime/DateTime"
tal:content="now/year" />
<a href="http://www.redhat.com/">Red Hat, Inc.</a>
</span>
@@ -23,7 +23,7 @@
<p>
<span i18n:translate="description_license">
- Distributed under the
+ Distributed under the
<span i18n:name="license">
<a href="http://creativecommons.org/licenses/GPL/2.0/" i18n:translate="label_gnu_gpl_licence">GNU GPL license</a>
</span>.
--- conga/luci/plone-custom/global_personalbar 2006/10/10 19:19:13 1.5
+++ conga/luci/plone-custom/global_personalbar 2007/09/11 16:04:33 1.6
@@ -15,7 +15,7 @@
<tal:comment tal:replace="nothing">
<tal:block condition="not: isAnon">
- <li class="portalUser"
+ <li class="portalUser"
tal:define="author python:mtool.getMemberInfo(user.getId())">
<a id="user-name"
tal:attributes="href string:${portal_url}/author/${user/getId}">
--- conga/luci/plone-custom/login_form_validate.vpy 2006/09/19 15:01:21 1.1
+++ conga/luci/plone-custom/login_form_validate.vpy 2007/09/11 16:04:33 1.2
@@ -35,7 +35,7 @@
password_empty = request.get('pwd_empty', None)=='1'
ac_name = auth.name_cookie
ac_password = auth.pw_cookie
-
+
if not user_name:
# no user name
state.setError(ac_name, _(u'Please enter your login name.'), 'login_name_required')
--- conga/luci/plone-custom/login_success 2006/09/19 14:59:27 1.6
+++ conga/luci/plone-custom/login_success 2007/09/11 16:04:33 1.7
@@ -32,7 +32,7 @@
<div tal:condition="not:js_enabled">
<p i18n:translate="description_javascript_advantage">
You can take fuller advantage of the features of this site
- if you enable javascript in your browser.
+ if you enable javascript in your browser.
</p>
<p i18n:translate="description_enable_cookies_for_login">
--- conga/luci/plone-custom/main_template 2006/09/18 19:56:35 1.5
+++ conga/luci/plone-custom/main_template 2007/09/11 16:04:33 1.6
@@ -27,7 +27,7 @@
<metal:headslot define-slot="head_slot" />
<tal:comment replace="nothing"> A slot where you can insert elements in the header from a template </tal:comment>
</metal:headslot>
-
+
<metal:styleslot fill-slot="style_slot">
<tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
<metal:styleslot define-slot="style_slot" />
@@ -142,7 +142,7 @@
<tal:comment replace="nothing"> Start of right column </tal:comment>
<td id="portal-column-two"
- metal:define-slot="column_two_slot"
+ metal:define-slot="column_two_slot"
tal:condition="python: False">
<div class="visualPadding">
<metal:portlets define-slot="portlets_two_slot">
--- conga/luci/plone-custom/portlet_login 2006/09/21 21:45:36 1.9
+++ conga/luci/plone-custom/portlet_login 2007/09/11 16:04:33 1.10
@@ -59,7 +59,7 @@
tabindex tabindex/next"
i18n:attributes="alt label_login_name;"/>
</div>
-
+
<div class="field">
<label for=""
tal:attributes="for ac_password"
@@ -77,7 +77,7 @@
Cookies are not enabled. You must <span i18n:name="enable_cookies">
<a href="enabling_cookies" i18n:translate="label_enable_cookies">enable cookies</a></span> before you can log in.
</div>
-
+
<div class="formControls">
<input type="submit" name="submit" value="Log in" alt="Log in"
tal:attributes="tabindex tabindex/next;
@@ -100,7 +100,7 @@
<dd class="portletItem"
tal:condition="python: not auth"
i18n:translate="login_portlet_disabled">
- Cookie authentication is disabled.
+ Cookie authentication is disabled.
Login portlet not available.
</dd>
--- conga/luci/site/luci/Extensions/LuciClusterActions.py 2007/08/20 16:31:13 1.5
+++ conga/luci/site/luci/Extensions/LuciClusterActions.py 2007/09/11 16:04:33 1.6
@@ -603,7 +603,7 @@
luci_log.debug_verbose('FNF0: no ricci to fence %s for cluster %s' \
% (nodename_resolved, clustername))
return None
-
+
batch_number, result = rq.nodeFence(rc, nodename_resolved)
if batch_number is None or result is None:
if LUCI_DEBUG_MODE is True:
--- conga/luci/site/luci/Extensions/LuciClusterInfo.py 2007/08/24 22:01:42 1.12
+++ conga/luci/site/luci/Extensions/LuciClusterInfo.py 2007/09/11 16:04:33 1.13
@@ -372,7 +372,7 @@
for node in nodenames:
if node != nodename:
starturl = {}
- starturl['nodename'] = node
+ starturl['nodename'] = node
starturl['url'] = '%s?clustername=%s&servicename=%s&pagetype=%s&nodename=%s' % (baseurl, cluname, servicename, SERVICE_START, node)
starturls.append(starturl)
--- conga/luci/site/luci/Extensions/cluster_adapters.py 2007/08/24 22:01:42 1.269
+++ conga/luci/site/luci/Extensions/cluster_adapters.py 2007/09/11 16:04:33 1.270
@@ -2511,7 +2511,7 @@
return busy_map
clusterfolder = getClusterDBObj(self, cluname)
-
+
if LUCI_DEBUG_MODE is True:
luci_log.debug_verbose('ICB2: %s is busy: %d flags' \
% (cluname, len(items)))
--- conga/luci/site/luci/Extensions/ClusterModel/ClusterNode.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/ClusterNode.py 2007/09/11 16:04:34 1.3
@@ -43,7 +43,7 @@
def setInterface(self, ifc):
nd = self.getMulticastNode()
if nd is None:
- return
+ return
else:
nd.addAttribute("interface", ifc)
--- conga/luci/site/luci/Extensions/ClusterModel/Cman.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Cman.py 2007/09/11 16:04:34 1.3
@@ -12,4 +12,4 @@
class Cman(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/Fence.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Fence.py 2007/09/11 16:04:34 1.3
@@ -12,4 +12,4 @@
class Fence(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/FenceDaemon.py 2007/09/11 16:04:34 1.3
@@ -16,7 +16,7 @@
class FenceDaemon(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
self.addAttribute('post_join_delay', POST_JOIN_DEFAULT)
self.addAttribute('post_fail_delay', POST_FAIL_DEFAULT)
self.addAttribute('clean_start', CLEAN_START_DEFAULT)
--- conga/luci/site/luci/Extensions/ClusterModel/Gulm.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Gulm.py 2007/09/11 16:04:34 1.3
@@ -12,4 +12,4 @@
class Gulm(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/Heuristic.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Heuristic.py 2007/09/11 16:04:34 1.3
@@ -12,4 +12,4 @@
class Heuristic(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/Lockserver.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Lockserver.py 2007/09/11 16:04:34 1.3
@@ -12,4 +12,4 @@
class Lockserver(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2007/08/24 22:01:42 1.7
+++ conga/luci/site/luci/Extensions/ClusterModel/ModelBuilder.py 2007/09/11 16:04:34 1.8
@@ -973,7 +973,7 @@
mcast.removeAttribute('interface')
except:
pass
- self.mcast_address = mcast_addr
+ self.mcast_address = mcast_addr
self.mcast_interface = mcast_if
self.usesMulticast = True
self.set_nodes_multicast(mcast_addr, mcast_if=mcast_if)
--- conga/luci/site/luci/Extensions/ClusterModel/Multicast.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Multicast.py 2007/09/11 16:04:35 1.3
@@ -12,4 +12,4 @@
class Multicast(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/Rm.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Rm.py 2007/09/11 16:04:35 1.3
@@ -12,4 +12,4 @@
class Rm(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Extensions/ClusterModel/Totem.py 2007/06/25 16:03:39 1.2
+++ conga/luci/site/luci/Extensions/ClusterModel/Totem.py 2007/09/11 16:04:35 1.3
@@ -12,4 +12,4 @@
class Totem(TagObject):
def __init__(self):
TagObject.__init__(self)
- self.TAG_NAME = TAG_NAME
+ self.TAG_NAME = TAG_NAME
--- conga/luci/site/luci/Products/ManagedSystem/ManagedSystem.py 2006/05/30 20:17:21 1.1
+++ conga/luci/site/luci/Products/ManagedSystem/ManagedSystem.py 2007/09/11 16:04:35 1.2
@@ -29,7 +29,7 @@
class ManagedSystem(PortalContent, DefaultDublinCoreImpl):
meta_type = product_name
- __implements__ = (
+ __implements__ = (
PortalContent.__implements__,
DefaultDublinCoreImpl.__implements__
)
--- conga/luci/site/luci/Products/ManagedSystem/__init__.py 2006/05/30 20:17:21 1.1
+++ conga/luci/site/luci/Products/ManagedSystem/__init__.py 2007/09/11 16:04:35 1.2
@@ -12,12 +12,9 @@
registerDirectory('skins', globals())
def initialize(context):
- product = utils.ContentInit(product_name,
+ product = utils.ContentInit(product_name,
content_types = contentClasses,
permission = add_permission,
extra_constructors = contentConstructors,
fti = contentFTI)
product.initialize(context)
-
-
-
--- conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_edit_form.cpt 2006/05/30 20:17:21 1.1
+++ conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_edit_form.cpt 2007/09/11 16:04:35 1.2
@@ -5,48 +5,48 @@
<body>
-<div metal:fill-slot="main"
+<div metal:fill-slot="main"
tal:define="errors options/state/getErrors">
<h1 i18n:translate="heading_edit_item">
Edit
<span i18n:name="itemtype">
- <span i18n:translate=""
- tal:content="python:here.getTypeInfo().Title()"
+ <span i18n:translate=""
+ tal:content="python:here.getTypeInfo().Title()"
tal:omit-tag="">Item type</span>
- </span>
+ </span>
</h1>
-
+
<p i18n:translate="description_edit_document">
Fill in the details of this document.
- </p>
+ </p>
<form name="edit_form"
- action="."
- method="post"
+ action="."
+ method="post"
enctype="multipart/form-data"
tal:attributes="action string:${here/getId}/${template/getId}" >
-
+
<fieldset>
-
+
<legend i18n:translate="legend_document_details">Document Details</legend>
-
- <div class="field"
+
+ <div class="field"
tal:condition="python:member.getProperty('visible_ids', None)"
tal:define="error errors/id | nothing;
id python:request.get('id', test(here.show_id(),here.getId(),''));"
tal:attributes="class python:test(error, 'field error', 'field')">
-
+
<label for="id" i18n:translate="label_short_name">Short Name</label>
<div class="formHelp" i18n:translate="help_shortname">
- Should not contain spaces, underscores or mixed case.
+ Should not contain spaces, underscores or mixed case.
This will be part of the web address to this item.
</div>
-
+
<div tal:content="error">Validation error output</div>
-
- <input type="text"
+
+ <input type="text"
id="id"
name="id"
value=""
@@ -55,47 +55,47 @@
tal:attributes="value id;
tabindex tabindex/next;"
/>
-
+
</div>
- <input type="hidden"
- name="id"
+ <input type="hidden"
+ name="id"
tal:condition="python:not member.getProperty('visible_ids', '')"
- tal:attributes="value python:request.get('id', here.getId())"
+ tal:attributes="value python:request.get('id', here.getId())"
/>
-
+
<div class="field"
tal:define="error errors/title|nothing;
Title request/title | here/Title;"
tal:attributes="class python:test(error, 'field error', 'field')">
-
+
<label for="title" i18n:translate="label_title">Title</label>
-
+
<span class="fieldRequired" title="Required"
i18n:attributes="title"
i18n:translate="label_required">(Required)</span>
-
+
<div tal:content="error">Validation error output</div>
-
+
<input type="text"
id="title"
- name="title"
- value=""
- size="40"
+ name="title"
+ value=""
+ size="40"
tabindex=""
tal:attributes="value Title;
- tabindex tabindex/next;"
+ tabindex tabindex/next;"
/>
-
+
</div>
-
+
<div class="field"
tal:define="description request/description | here/Description ">
<label for="description" i18n:translate="label_description">Description</label>
-
+
<div class="formHelp" i18n:translate="help_description">
- A brief description of the item.
+ A brief description of the item.
</div>
<textarea tabindex=""
@@ -104,10 +104,10 @@
tal:content="description"
tal:attributes="tabindex tabindex/next;"
>
- Description
+ Description
</textarea>
</div>
-
+
<div class="field"
tal:define="tabindex tabindex/next;">
@@ -116,7 +116,7 @@
<div class="formHelp" i18n:translate="help_format">
Enter the address:
</div>
-
+
<textarea cols="80"
rows="25"
tabindex=""
@@ -128,7 +128,7 @@
</div>
- <div class="field">
+ <div class="field">
<label for="language" i18n:translate="label_format">Language</label>
<div class="formHelp" i18n:translate="help_format">
@@ -136,54 +136,54 @@
</div>
<select name="text_format" tal:define="current here/getLanguage">
<option tal:repeat="item here/getLanguages"
- tal:content="item/name"
+ tal:content="item/name"
tal:attributes="value item/value; selected python:test(item['value'] == current, 1, 0)" />
</select>
</div>
-
+
<div class="field"
tal:define="error errors/file|nothing;"
- tal:attributes="class python:test(error, 'field error', 'field')">
-
+ tal:attributes="class python:test(error, 'field error', 'field')">
+
<label for="file" i18n:translate="label_upload_contents_optional">Upload contents (optional)</label>
-
+
<div class="formHelp" i18n:translate="help_uploads">
Uploaded files will replace the body text entered above.
</div>
<div tal:content="error">Validation error output</div>
-
+
<input type="file"
id="file"
- name="file"
- size="30"
- tabindex=""
+ name="file"
+ size="30"
+ tabindex=""
value=""
- tal:attributes="tabindex tabindex/next"
+ tal:attributes="tabindex tabindex/next"
/>
</div>
-
-
+
+
<div class="formControls"
- tal:define="process_creation request/process_creation|nothing;">
- <input class="context"
+ tal:define="process_creation request/process_creation|nothing;">
+ <input class="context"
tabindex=""
- type="submit"
- name="form.button.Save"
- value="Save"
+ type="submit"
+ name="form.button.Save"
+ value="Save"
i18n:attributes="value"
- tal:attributes="tabindex tabindex/next;" />
-
- <input class="context"
+ tal:attributes="tabindex tabindex/next;" />
+
+ <input class="context"
tabindex=""
- type="submit"
- name="form.button.Cancel"
- value="Cancel"
+ type="submit"
+ name="form.button.Cancel"
+ value="Cancel"
i18n:attributes="value"
- tal:attributes="tabindex tabindex/next;" />
+ tal:attributes="tabindex tabindex/next;" />
</div>
</fieldset>
-
+
<input type="hidden" name="form.submitted" value="1" />
</form>
--- conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_view.pt 2006/05/30 20:17:21 1.1
+++ conga/luci/site/luci/Products/ManagedSystem/skins/managedsystem_view.pt 2007/09/11 16:04:35 1.2
@@ -15,19 +15,19 @@
<h1 tal:content="object_title" class="documentFirstHeading">
Title or id
</h1>
-
+
<p class="documentDescription"
tal:content="here/Description"
tal:condition="here/Description">
Description
</p>
-
+
<p tal:condition="python: not text and is_editable"
i18n:translate="no_body_text"
class="discreet">
This item does not have any body text, click the edit tab to change it.
</p>
-
+
<div class="stx"
tal:condition="text"
tal:attributes="class python:test(here.Format() in ('text/structured',
@@ -35,7 +35,7 @@
<div tal:replace="structure text" />
</div>
-
+
</tal:main-macro>
</metal:main>
--- conga/luci/site/luci/bin/runzope.in 2006/08/23 19:58:42 1.4
+++ conga/luci/site/luci/bin/runzope.in 2007/09/11 16:04:35 1.5
@@ -22,11 +22,11 @@
if /bin/grep True /var/lib/luci/.default_password_has_been_reset >/dev/null 2>&1; then
exec "$PYTHON" "$ZOPE_RUN" -C "$CONFIG_FILE" "$@"
-else
+else
echo ""
echo ""
echo "luci's 'admin' password has to be changed before server is allowed to start"
- echo "To do so, execute (as root): "
+ echo "To do so, execute (as root): "
echo -e "\tluci_admin password"
echo ""
echo ""
--- conga/luci/site/luci/etc/zope.conf.in 2007/03/15 16:50:33 1.2
+++ conga/luci/site/luci/etc/zope.conf.in 2007/09/11 16:04:35 1.3
@@ -431,7 +431,7 @@
# Directive: cgi-maxlen
#
# Description:
-# Set this value to limit the amount of form data being processed
+# Set this value to limit the amount of form data being processed
# by Zope to prevent DoS attacks.
#
# Default: 0 (= no restrictions)
@@ -887,7 +887,7 @@
#
# Port numbers are offset by the setting of port-base.
#
-# To run the monitor-server an emergency user must be defined
+# To run the monitor-server an emergency user must be defined
# (through an 'access' file).
#
# Default:
--- conga/luci/storage/cache_report 2007/06/25 16:03:41 1.3
+++ conga/luci/storage/cache_report 2007/09/11 16:04:35 1.4
@@ -7,7 +7,7 @@
<span tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
global cache_result python:here.cache_storage_report(ricci, request.SESSION)"
tal:replace="string:"/>
-<span tal:condition="python: cache_result == True"
+<span tal:condition="python: cache_result == True"
tal:replace="string:OK"/>
<span tal:condition="python: cache_result != True and access_to_host_allowed"
tal:replace="structure cache_result"/>
--- conga/luci/storage/check-batch 2007/06/25 16:03:41 1.2
+++ conga/luci/storage/check-batch 2007/09/11 16:04:35 1.3
@@ -1,11 +1,11 @@
-<span tal:omit-tag=""
- tal:define="global storagename request/storagename;
+<span tal:omit-tag=""
+ tal:define="global storagename request/storagename;
global batch_id request/batch_id"/>
-<span tal:omit-tag=""
- tal:define="stosystemss context/systems/storage/objectItems;
- global allowed_systems python:here.allowed_systems(stosystemss);
+<span tal:omit-tag=""
+ tal:define="stosystemss context/systems/storage/objectItems;
+ global allowed_systems python:here.allowed_systems(stosystemss);
global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
-<span tal:omit-tag=""
+<span tal:omit-tag=""
tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems)"/>
@@ -23,11 +23,11 @@
<span tal:omit-tag=""
tal:define="index_html_URL context/storage/index_html/absolute_url;
dummy python:here.get_storage_batch_result(storagename, ricci, index_html_URL, batch_id);
- error dummy/error;
- completed dummy/completed;
- redirect_url dummy/redirect_url;
+ error dummy/error;
+ completed dummy/completed;
+ redirect_url dummy/redirect_url;
msg dummy/msg">
-
+
<span tal:omit-tag=""
tal:condition="not: error">
<span tal:omit-tag=""
--- conga/luci/storage/clu_portlet_fetcher 2006/06/30 17:00:02 1.1
+++ conga/luci/storage/clu_portlet_fetcher 2007/09/11 16:04:35 1.2
@@ -5,7 +5,7 @@
<metal:leftcolumn define-macro="left_column">
<span tal:define="global stosystems allowed_systems"/>
-<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/stochooseportlet" />
+<div tal:omit-tag="" metal:use-macro="here/portlet_cluconfig/macros/stochooseportlet" />
<!--
<span tal:omit-tag="" tal:define="global hasstoragename request/storagename |nothing"/>
<span tal:omit-tag="" tal:condition="hasstoragename">
--- conga/luci/storage/form-chooser 2007/06/25 16:03:41 1.6
+++ conga/luci/storage/form-chooser 2007/09/11 16:04:35 1.7
@@ -3,14 +3,14 @@
<title id="pagetitle" tal:content="template/title">The title</title>
</head>
<body>
-
+
<metal:choose-form metal:define-macro="main-form">
-
+
<span tal:omit-tag=""
tal:define="global preferred_size_units python:here.set_persistent_var('preferred_size_units', 'GB')"/>
<span tal:omit-tag=""
tal:define="global preferred_path_display python:here.set_persistent_var('preferred_path_display', 'path')"/>
-
+
<!--
<span tal:omit-tag="" tal:condition="python: storage_report == None and storagename != None">
<div metal:use-macro="here/form-macros/macros/error-form"/>
@@ -25,7 +25,7 @@
</span>
<span tal:omit-tag="" tal:condition="python: storage_report == None and storagename != None and access_to_host_allowed">
- <div metal:use-macro="here/form-macros/macros/wait-probing-storage"/>
+ <div metal:use-macro="here/form-macros/macros/wait-probing-storage"/>
</span>
<span tal:omit-tag="" tal:condition="python: (pagetype == '0' or pagetype == None) and storagename == None">
@@ -33,7 +33,7 @@
</span>
<span tal:omit-tag="" tal:condition="python: pagetype=='commit_changes' and storage_report != None">
- <div metal:use-macro="here/form-macros/macros/commit-changes"/>
+ <div metal:use-macro="here/form-macros/macros/commit-changes"/>
</span>
<span tal:omit-tag="" tal:condition="python: pagetype == '44' and storage_report != None">
--- conga/luci/storage/form-macros 2007/08/20 16:31:14 1.24
+++ conga/luci/storage/form-macros 2007/09/11 16:04:35 1.25
@@ -99,9 +99,9 @@
<div metal:define-macro="commit-changes">
- <span tal:omit-tag=""
- tal:define="batch_id python:here.apply_storage_changes(ricci, storage_report, request);
- check_URL context/storage/check-batch/absolute_url;
+ <span tal:omit-tag=""
+ tal:define="batch_id python:here.apply_storage_changes(ricci, storage_report, request);
+ check_URL context/storage/check-batch/absolute_url;
check_url python:check_URL + '?storagename=' + storagename + '&batch_id=' + batch_id">
<div metal:use-macro="here/form-macros/macros/display-committing-changes"/>
<form id="urls_form">
@@ -233,7 +233,7 @@
}
setTimeout("cache_report()", 10)
</script>
-
+
<table style="width: 100%;">
<tr>
<td align="center">
@@ -265,11 +265,11 @@
</td>
<td>
<select name="preferred_size_units" onchange="this.form.submit()">
- <option value="MB"
+ <option value="MB"
tal:attributes="selected python:preferred_size_units == 'MB'">MB - Megabytes</option>
- <option value="GB"
+ <option value="GB"
tal:attributes="selected python:preferred_size_units == 'GB'">GB - Gigabytes</option>
- <option value="TB"
+ <option value="TB"
tal:attributes="selected python:preferred_size_units == 'TB'">TB - Terabytes</option>
</select>
</td>
@@ -282,29 +282,29 @@
<select name="preferred_path_display"
onchange="this.form.submit()"
style="width: 100%;">
- <option value="path"
+ <option value="path"
tal:attributes="selected python:preferred_path_display == 'path'">Device Path</option>
- <option value="scsi"
+ <option value="scsi"
tal:attributes="selected python:preferred_path_display == 'scsi'">SCSI ID</option>
</select>
</td>
</tr>
</table>
</form>
- </fieldset>
-
+ </fieldset>
+
<dl tal:define="tmp_triple python:here.group_systems_by_cluster(allowed_systems, from_cache=True);
nonclu_list python:tmp_triple[0];
clu_list python:tmp_triple[1];
bad_list python:tmp_triple[2]">
-
+
<dt>
You are authorized to administer Storage Systems on the list to the left
</dt>
<dd>
Please, select one to administer
</dd>
-
+
<dt>
<span tal:condition="not: bad_list">
All systems are up and running
@@ -328,7 +328,7 @@
<tr>
<td>
<span style="color: red;"
- tal:content="b/hostname"></span>
+ tal:content="b/hostname"></span>
</td>
<td>
<span tal:omit-tag=""
@@ -345,8 +345,8 @@
</table>
</dd>
</dl>
- </div>
-
+ </div>
+
<div metal:define-macro="error-form">
<h2>Error Form</h2>
@@ -431,7 +431,7 @@
var href;
if (typeof(mylink) == 'string')
href=mylink;
- else
+ else
href=mylink.href;
window.open(href, windowname, 'width=500,height=500,scrollbars=yes');
return false;
@@ -541,7 +541,7 @@
<li tal:define="bd_data source;
prefix python:mapper['mapper_id'] + '_source_' + bd_data['path'] + '_';
properties_span_id python:prefix + 'properties_span_id'">
- <span tal:define="displaying_source python:True"
+ <span tal:define="displaying_source python:True"
tal:attributes="id properties_span_id">
<div metal:use-macro="here/form-macros/macros/display-BD"/>
</span>
@@ -596,7 +596,7 @@
<div metal:use-macro="here/form-macros/macros/content-scripts"/>
<div metal:use-macro="here/form-macros/macros/form-scripts"/>
<div metal:use-macro="here/form-macros/macros/single-visible-span"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="mapper python:here.get_mapper_data(storage_report, request['mapper_id']);
properties_span_id python:mapper['mapper_id'] + '_properties_span_id'">
<div align="center">
@@ -609,18 +609,18 @@
</span>
</h3>
</div>
-
-
- <input type="checkbox"
+
+
+ <input type="checkbox"
id="graphics_checkbox_id"
tal:attributes="checked mapper/graphical_view"
onchange="var s = (this.checked)?'graphical_view':'textual_view'; singleVisibleSpan('mappings_view', s);"/>
Graphical View <small>(Uncheck if volumes are too small to select)</small>
<span id="mappings_view"
tal:define="mappings_view_classnames mapper/mappings-view_css_classnames">
-
- <div id="graphical_view"
- tal:attributes="class mappings_view_classnames/graphical_view"
+
+ <div id="graphical_view"
+ tal:attributes="class mappings_view_classnames/graphical_view"
tal:define="global bd_path request/bd_path|nothing">
<span tal:omit-tag=""
tal:condition="not: bd_path">
@@ -632,21 +632,21 @@
width string:700px;
height string:195"></iframe>
</div>
-
- <div id="textual_view"
+
+ <div id="textual_view"
tal:attributes="class mappings_view_classnames/textual_view">
<br/>
<div>
<h3 style="font-size: small;">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="targets mapper/targets_all">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python:len(targets) > 1"
tal:content="python:mapper['pretty_targets_name'] + ': '"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python:len(targets) == 1"
tal:content="python:mapper['pretty_target_name'] + ': '"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="t targets">
<span style="cursor: pointer; text-decoration: underline"
tal:attributes="onclick python:'singleVisibleSpan(\'' + properties_span_id + '\', \'' + t['path'] + '\')'"
@@ -660,15 +660,15 @@
<br/>
<div>
<h3 style="font-size: small;">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="sources mapper/sources">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python: len(sources) > 1"
tal:content="python:mapper['pretty_sources_name'] + ': '"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python: len(sources) == 1"
tal:content="python:mapper['pretty_source_name'] + ': '"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="s sources">
<span style="cursor: pointer; text-decoration: underline"
tal:attributes="onclick python:'singleVisibleSpan(\'' + properties_span_id + '\', \'' + s['path'] + '\')'"
@@ -681,13 +681,13 @@
</div>
<br/>
</div>
-
+
</span> <!-- display -->
-
-
-
-
-
+
+
+
+
+
<div tal:attributes="id properties_span_id"
style="width: 700px; min-height: 360px; ">
<span id="warning_box"
@@ -701,22 +701,22 @@
<span tal:omit-tag=""
tal:repeat="bd_data mapper/targets">
<div tal:attributes="id bd_data/path;
- class string:invisible">
+ class string:invisible">
<div metal:use-macro="here/form-macros/macros/display-BD"/>
</div>
</span>
<span tal:omit-tag=""
tal:repeat="bd_data mapper/new_targets">
<div tal:attributes="id bd_data/path;
- class string:invisible">
+ class string:invisible">
<div metal:use-macro="here/form-macros/macros/display-BD"/>
</div>
</span>
<span tal:omit-tag=""
tal:repeat="bd_data mapper/sources">
- <div tal:define="displaying_source python:True"
+ <div tal:define="displaying_source python:True"
tal:attributes="id bd_data/path;
- class string:invisible">
+ class string:invisible">
<div metal:use-macro="here/form-macros/macros/display-BD"/>
</div>
</span>
@@ -736,8 +736,8 @@
<div metal:use-macro="here/form-macros/macros/content-scripts"/>
<div metal:use-macro="here/form-macros/macros/form-scripts"/>
<div metal:use-macro="here/form-macros/macros/single-visible-span"/>
- <span tal:omit-tag=""
- tal:define="bd_data python:here.get_bd_data(storage_report, request['mapper_id'], request['bd_path']);
+ <span tal:omit-tag=""
+ tal:define="bd_data python:here.get_bd_data(storage_report, request['mapper_id'], request['bd_path']);
mapper python:here.get_mapper_data(storage_report, request['mapper_id'])">
<span tal:define="properties_span_id string:if seen in javascript error log -> FIXME">
<div metal:use-macro="here/form-macros/macros/display-BD"/>
@@ -747,31 +747,31 @@
- <div metal:define-macro="create-mapper-form"
- tal:define="mapper python:here.get_mapper_template_data(storage_report, request['mapper_type']);
- prefix python:'create_mapper_template_' + mapper['mapper_type'] + '_';
- properties_span_id string:;
- mapper_template_form_id python:prefix + 'mapper_template_form_id';
+ <div metal:define-macro="create-mapper-form"
+ tal:define="mapper python:here.get_mapper_template_data(storage_report, request['mapper_type']);
+ prefix python:'create_mapper_template_' + mapper['mapper_type'] + '_';
+ properties_span_id string:;
+ mapper_template_form_id python:prefix + 'mapper_template_form_id';
create_mapper_button_id python:prefix + 'mapper_template_apply_button_id';
form_submit_button_id create_mapper_button_id">
<div metal:use-macro="here/form-macros/macros/forms-css"/>
<div metal:use-macro="here/form-macros/macros/form-scripts"/>
- <form tal:attributes="id mapper_template_form_id;
+ <form tal:attributes="id mapper_template_form_id;
method string:get">
- <input tal:attributes="type string:hidden;
- name string:pagetype;
+ <input tal:attributes="type string:hidden;
+ name string:pagetype;
value string:commit_changes"/>
- <input tal:attributes="type string:hidden;
- name string:object_type;
+ <input tal:attributes="type string:hidden;
+ name string:object_type;
value string:mapper_template"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_type;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_type;
value mapper/mapper_type"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_id;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_id;
value python:''"/>
- <input tal:attributes="type string:hidden;
- name string:storagename;
+ <input tal:attributes="type string:hidden;
+ name string:storagename;
value storagename"/>
<table class="props-form-table">
<tr class="props-form-header">
@@ -823,7 +823,7 @@
tal:repeat="bd bds">
<tr>
<td>
- <input tal:attributes="type string:checkbox;
+ <input tal:attributes="type string:checkbox;
name python:'source_bd_' + bd['path']"/>
</td>
<td tal:define="bytes bd/props/size/value;
@@ -859,17 +859,17 @@
</td>
<td align="right">
- <input type="button"
- name="action_type"
- value="Reset"
+ <input type="button"
+ name="action_type"
+ value="Reset"
onclick="return reset_form(this.form)"
class="form_button"/>
<input tal:define="prompt_msg python:'Do you really want to create new ' + mapper['pretty_type'] + '?';
- validate_url context/validate_html/absolute_url"
- tal:attributes="id create_mapper_button_id;
- type string:button;
- name string:action_type;
- value string:Create;
+ validate_url context/validate_html/absolute_url"
+ tal:attributes="id create_mapper_button_id;
+ type string:button;
+ name string:action_type;
+ value string:Create;
onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + mapper_template_form_id + '\', \'' + create_mapper_button_id + '\', \'' + prompt_msg + '\')'"
class="form_button"/>
</td>
@@ -885,42 +885,42 @@
- <div metal:define-macro="add-sources-form"
- tal:define="mapper python:here.get_mapper_data(storage_report, request['mapper_id']);
- prefix python:'add_sources_to_' + mapper['mapper_id'] + '_';
- properties_span_id string:;
- add_sources_form_id python:prefix + 'form_id';
- add_sources_button_id python:prefix + 'button_id';
+ <div metal:define-macro="add-sources-form"
+ tal:define="mapper python:here.get_mapper_data(storage_report, request['mapper_id']);
+ prefix python:'add_sources_to_' + mapper['mapper_id'] + '_';
+ properties_span_id string:;
+ add_sources_form_id python:prefix + 'form_id';
+ add_sources_button_id python:prefix + 'button_id';
form_submit_button_id add_sources_button_id">
<div metal:use-macro="here/form-macros/macros/forms-css"/>
<div metal:use-macro="here/form-macros/macros/form-scripts"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="not: mapper/new_sources">
- There are no available <span tal:replace="mapper/pretty_sources_name"/> to be added to <span tal:replace="mapper/pretty_type"/> '<span tal:replace="mapper/pretty_name"/>'.
+ There are no available <span tal:replace="mapper/pretty_sources_name"/> to be added to <span tal:replace="mapper/pretty_type"/> '<span tal:replace="mapper/pretty_name"/>'.
<br/>
<br/>
- <a tal:define="go_to_mapper_url python:'./?pagetype=52&mapper_type=' + mapper['mapper_type'] + '&mapper_id=' + mapper['mapper_id'] + '&storagename=' + storagename"
+ <a tal:define="go_to_mapper_url python:'./?pagetype=52&mapper_type=' + mapper['mapper_type'] + '&mapper_id=' + mapper['mapper_id'] + '&storagename=' + storagename"
tal:attributes="href go_to_mapper_url">
Go Back to <span tal:replace="mapper/pretty_type"/>
</a>
</span>
- <form tal:condition="mapper/new_sources"
- tal:attributes="id add_sources_form_id;
+ <form tal:condition="mapper/new_sources"
+ tal:attributes="id add_sources_form_id;
method string:get">
- <input tal:attributes="type string:hidden;
- name string:pagetype;
+ <input tal:attributes="type string:hidden;
+ name string:pagetype;
value string:commit_changes"/>
- <input tal:attributes="type string:hidden;
- name string:object_type;
+ <input tal:attributes="type string:hidden;
+ name string:object_type;
value string:add_sources"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_type;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_type;
value mapper/mapper_type"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_id;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_id;
value mapper/mapper_id"/>
- <input tal:attributes="type string:hidden;
- name string:storagename;
+ <input tal:attributes="type string:hidden;
+ name string:storagename;
value storagename"/>
<table class="props-form-table">
<tr class="props-form-header">
@@ -960,7 +960,7 @@
tal:repeat="bd bds">
<tr>
<td>
- <input tal:attributes="type string:checkbox;
+ <input tal:attributes="type string:checkbox;
name python:'source_bd_' + bd['path']"/>
</td>
<td tal:define="bytes bd/props/size/value;
@@ -991,18 +991,18 @@
</td>
<td align="right">
- <input tal:define="go_to_mapper_url python:'./?pagetype=52&mapper_type=' + mapper['mapper_type'] + '&mapper_id=' + mapper['mapper_id'] + '&storagename=' + storagename"
- tal:attributes="type string:button;
- name string:cancel_button;
- value string:Cancel;
+ <input tal:define="go_to_mapper_url python:'./?pagetype=52&mapper_type=' + mapper['mapper_type'] + '&mapper_id=' + mapper['mapper_id'] + '&storagename=' + storagename"
+ tal:attributes="type string:button;
+ name string:cancel_button;
+ value string:Cancel;
onclick python:'window.location.assign(\'' + go_to_mapper_url + '\')'"
class="form_button"/>
<input tal:define="prompt_msg python:'Do you really want to add selected ' + mapper['pretty_sources_name'] + ' to \\\'' + mapper['pretty_name'] + '\\\'?';
- validate_url context/validate_html/absolute_url"
- tal:attributes="id add_sources_button_id;
- type string:button;
- name string:action_type;
- value string:Add;
+ validate_url context/validate_html/absolute_url"
+ tal:attributes="id add_sources_button_id;
+ type string:button;
+ name string:action_type;
+ value string:Add;
onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + add_sources_form_id + '\', \'' + add_sources_button_id + '\', \'' + prompt_msg + '\')'"
class="form_button"/>
</td>
@@ -1021,9 +1021,9 @@
<div tal:omit-tag="" metal:define-macro="display-props-tableless">
<span tal:omit-tag=""
tal:define="predefines_test python:'display-props: ' + str(props) + prefix + properties_span_id"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="prop props">
- <tr tal:define="p prop/name;
+ <tr tal:define="p prop/name;
prop_pr_name prop/pretty_name"
tal:condition="not: prop/hidden">
<td tal:content="prop_pr_name"/>
@@ -1043,7 +1043,7 @@
tal:attributes="id select_id;
onfocus python:'replace_properties_block__old_select_value = this.value';
onchange python:'replace_properties_block(\'' + properties_span_id + '\', \'' + select_id + '\')'">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="repl_name repls/repl_names">
<option tal:attributes="value python:repls[repl_name]['path']"/><span tal:replace="repl_name"/>
</span>
@@ -1064,19 +1064,19 @@
<input tal:condition="python:prop_type == 'text'"
- tal:attributes="name p;
- type string:text;
+ tal:attributes="name p;
+ type string:text;
value prop/value;
onkeypress python:'return validate_text_keypress(this, event, 2, \'' + prop['validation']['illegal_chars'] + '\', ' + str(prop['validation']['max_length']) + ')';
onchange python:'validate_text(this, 2, \'' + prop['validation']['illegal_chars'] + '\', \'' + prop['validation']['reserved_words'] + '\', ' + str(prop['validation']['min_length']) + ', ' + str(prop['validation']['max_length']) + ', \'' + form_submit_button_id + '\')'"/>
-
-
-
+
+
+
<span tal:omit-tag=""
tal:condition="python:prop_type == 'int' and prop_units != 'bytes'">
- <input tal:attributes="name p;
- type string:text;
- size string:15;
+ <input tal:attributes="name p;
+ type string:text;
+ size string:15;
value prop/value;
onchange python:'validate_int(this, 2, ' + str(prop['validation']['min']) + ', ' + str(prop['validation']['max']) + ', ' + str(prop['validation']['step']) + ', \'' + prop_units + '\', \'' + form_submit_button_id + '\')'"
onkeypress="return validate_int_keypress(this, event, 2)"/>
@@ -1094,7 +1094,7 @@
step python:here.convert_bytes(prop['validation']['step'], units)">
<input tal:attributes="name p;
type string:text;
- size string:15;
+ size string:15;
value value;
onchange python:'validate_float(this, 2, ' + str(minim) + ', ' + str(maxim) + ', ' + str(step) + ', \'' + units + '\', \'' + form_submit_button_id + '\')'"
onkeypress="return validate_float_keypress(this, event, 2)"/>
@@ -1102,18 +1102,18 @@
<span tal:replace="units"/>
</span>
</span>
-
-
-
+
+
+
<span tal:condition="python:prop_type == 'select'">
<select tal:define="prop_options prop/value"
tal:attributes="name p">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python: prop_units != 'bytes'"
tal:repeat="prop_opt prop_options">
<option tal:attributes="value prop_opt"/><span tal:replace="prop_opt"/>
</span>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="python: prop_units == 'bytes'"
tal:repeat="prop_opt prop_options">
<option tal:attributes="value prop_opt"/><span tal:define="dummy python: here.bytes_to_value_units(prop_opt);
@@ -1154,7 +1154,7 @@
<div tal:omit-tag="" metal:define-macro="display-content">
<span tal:omit-tag=""
tal:define="predefines_test python:'display-content: ' + str(cont) + properties_span_id"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="props cont/props_ordered">
<table class="props-inner-table">
<div metal:use-macro="here/form-macros/macros/display-props-tableless"/>
@@ -1166,7 +1166,7 @@
<div tal:omit-tag="" metal:define-macro="content-scripts">
<script language="javascript" type="text/javascript">
-
+
var replace_properties_block__old_select_value = ''
function replace_properties_block(parent_id, select_id) {
selem = document.getElementById(select_id);
@@ -1174,12 +1174,12 @@
selem.value = replace_properties_block__old_select_value;
singleVisibleSpan(parent_id, child_id);
}
-
+
function change_content(select_content_id, content_span_id) {
content_id = document.getElementById(select_content_id).value;
singleVisibleSpan(content_span_id, content_id);
}
-
+
function reset_bd_form(form, select_content_id, content_span_id) {
if (reset_form(form)) {
change_content(select_content_id, content_span_id);
@@ -1187,7 +1187,7 @@
}
return false;
}
-
+
</script>
</div>
@@ -1198,13 +1198,13 @@
input { background-image: none; }
input.validation_error { border: medium double red; background-color: orange; }
input.selected { border: thin solid orange; }
- input.form_button { background-color: #fff;
+ input.form_button { background-color: #fff;
-moz-border-radius-topleft: 7px;
-moz-border-radius-topright: 7px;
-moz-border-radius-bottomleft: 7px;
-moz-border-radius-bottomright: 7px; }
</style>
-
+
<script language="javascript" type="text/javascript">
@@ -1213,9 +1213,9 @@
function validate_text(elem, timeout, illegal_chars, reserved_words, min_length, max_length, button_id)
{
document.getElementById(button_id).disabled = true;
-
+
var value = elem.value;
-
+
for (var i=0; i<value.length; i++) {
if (illegal_chars.indexOf(value[i]) != -1) {
//return;
@@ -1224,7 +1224,7 @@
return;
}
}
-
+
var res_list = reserved_words.split(';');
for (var i=0; i<res_list.length; i++) {
if (value == res_list[i] && value != '') {
@@ -1234,21 +1234,21 @@
return;
}
}
-
+
if (value.length < min_length) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Minimum length is ' + min_length);
return;
}
-
+
if (value.length > max_length) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Maximum length is ' + max_length);
return;
}
-
+
elem.className = '';
document.getElementById(button_id).disabled = false;
}
@@ -1257,7 +1257,7 @@
function validate_int(elem, timeout, min, max, step, units, button_id)
{
document.getElementById(button_id).disabled = true;
-
+
var value = elem.value;
for (var i=0; i<value.length; i++) {
if ('0123456789'.indexOf(value[i]) == -1) {
@@ -1267,7 +1267,7 @@
return;
}
}
-
+
min = parseInt(min);
max = parseInt(max);
step = parseInt(step);
@@ -1275,21 +1275,21 @@
step = 1;
value = parseInt(value);
value = (value / step) * step;
-
+
if (value < min) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Minimum allowed value is ' + min + ' ' + units);
return;
}
-
+
if (value > max) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Maximum allowed value is ' + max + ' ' + units);
return;
}
-
+
elem.className = '';
document.getElementById(button_id).disabled = false;
}
@@ -1297,7 +1297,7 @@
function validate_float(elem, timeout, min, max, step, units, button_id)
{
document.getElementById(button_id).disabled = true;
-
+
var value = elem.value;
for (var i=0; i<value.length; i++) {
if ('0123456789.'.indexOf(value[i]) == -1) {
@@ -1307,7 +1307,7 @@
return;
}
}
-
+
min = parseFloat(min);
max = parseFloat(max);
step = parseFloat(step);
@@ -1315,21 +1315,21 @@
step = 0.00001;
value = parseFloat(value);
value = (value / step) * step;
-
+
if (value < min) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Minimum allowed value is ' + min + ' ' + units);
return;
}
-
+
if (value > max) {
//return;
elem.className = 'validation_error';
display_warning(elem, timeout, 'Maximum allowed value is ' + max + ' ' + units);
return;
}
-
+
elem.className = '';
document.getElementById(button_id).disabled = false;
}
@@ -1340,24 +1340,24 @@
var ev = event;
if (!ev) ev = window.event;
var key = get_keycode(ev);
-
+
if (key == 8 || key == 9) return true;
else if (ev.which) ;
else if (document.selection) ;
else return true;
-
+
var ch = String.fromCharCode(key);
-
+
if (illegal_chars.indexOf(ch) != -1) {
// display_warning(elem, timeout, 'Illegal characters are: \'' + illegal_chars + '\'');
return false;
}
-
+
if (elem.value.length + 1 > max_length) {
// display_warning(elem, timeout, 'Maximum allowed length is ' + max_length);
return false;
}
-
+
return true;
}
@@ -1366,19 +1366,19 @@
var ev = event;
if (!ev) ev = window.event;
var key = get_keycode(ev);
-
+
if (key == 8 || key == 9) return true;
else if (ev.which) ;
else if (document.selection) ;
else return true;
-
+
var ch = String.fromCharCode(key);
-
+
if ('0123456789'.indexOf(ch) == -1) {
// display_warning(elem, timeout, 'Only whole numbers are allowed');
return false;
}
-
+
return true;
}
@@ -1387,19 +1387,19 @@
var ev = event;
if (!ev) ev = window.event;
var key = get_keycode(ev);
-
+
if (key == 8 || key == 9) return true;
else if (ev.which) ;
else if (document.selection) ;
else return true;
-
+
var ch = String.fromCharCode(key);
-
+
if ('0123456789.'.indexOf(ch) == -1) {
// display_warning(elem, timeout, 'Only digits and dot are allowed');
return false;
}
-
+
if (ch == '.') {
txt = elem.value;
c = 0;
@@ -1410,7 +1410,7 @@
if (c != 0)
return false;
}
-
+
return true;
}
@@ -1432,15 +1432,15 @@
pending_warning = false;
}
return;
-
+
var geom_obj = getGeom(el);
-
+
var warning_box = document.getElementById('warning_box');
if (!warning_box) {
alert(text);
return;
}
-
+
warning_box.innerHTML = text;
/*
warning_box.style.position = 'absolute'
@@ -1462,7 +1462,7 @@
function getGeom(el)
{
var object = new Object();
-
+
object.x = el.offsetLeft;
object.y = el.offsetTop;
var parent = el.offsetParent;
@@ -1487,7 +1487,7 @@
}
return false;
}
-
+
@@ -1523,12 +1523,12 @@
return;
}
} else {
-
+
// get elem_name & msg
var ind = res.indexOf(' ');
var elem_name = res.substr(0, ind);
var err_msg = strip_left(res.substr(ind));
-
+
form = document.getElementById(tmp_form_id);
for (i=0; i<form.length; i++) {
elem = form.elements[i];
@@ -1536,7 +1536,7 @@
if (name == elem_name)
elem.className = 'validation_error';
}
-
+
alert(err_msg);
}
} else {
@@ -1575,7 +1575,7 @@
document.getElementById(tmp_button_id).disabled = true;
}
-
+
</script>
</div>
@@ -1617,7 +1617,7 @@
<div metal:use-macro="here/form-macros/macros/forms-css"/>
<span tal:omit-tag=""
tal:define="predefines_test python:'display-BD: ' + str(bd_data) + storagename + properties_span_id"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="mapper string:;
conts python:bd_data['contents'];
prefix prefix|bd_data/path;
@@ -1629,28 +1629,28 @@
content_span_id python:prefix + 'content_span_id'">
<form tal:attributes="id bd_form_id;
method string:get">
- <input tal:attributes="type string:hidden;
- name string:pagetype;
+ <input tal:attributes="type string:hidden;
+ name string:pagetype;
value string:commit_changes"/>
- <input tal:condition="not: bd_data/new"
- tal:attributes="type string:hidden;
+ <input tal:condition="not: bd_data/new"
+ tal:attributes="type string:hidden;
name string:object_type;
value string:bd"/>
- <input tal:condition="bd_data/new"
- tal:attributes="type string:hidden;
+ <input tal:condition="bd_data/new"
+ tal:attributes="type string:hidden;
name string:object_type;
value string:bd_template"/>
<input tal:attributes="type string:hidden;
name string:mapper_id;
value bd_data/mapper_id"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_type;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_type;
value bd_data/mapper_type"/>
- <input tal:attributes="type string:hidden;
- name string:bd_path;
+ <input tal:attributes="type string:hidden;
+ name string:bd_path;
value bd_data/path"/>
- <input tal:attributes="type string:hidden;
- name string:storagename;
+ <input tal:attributes="type string:hidden;
+ name string:storagename;
value storagename"/>
<table class="props-form-table">
<tr class="props-form-header">
@@ -1697,7 +1697,7 @@
</tr>
<tr class="props-form-body">
<td>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="props bd_data/props_ordered">
<table class="props-inner-table">
<div metal:use-macro="here/form-macros/macros/display-props-tableless"/>
@@ -1726,25 +1726,25 @@
Content<span tal:condition="python:len(conts) == 1"
tal:replace="string::"/>
<select tal:define="funct python:'change_content(\'' + select_content_id + '\', \'' + content_span_id + '\')'"
- tal:condition="python:len(conts) > 1"
- tal:attributes="id select_content_id;
- name string:content_id;
+ tal:condition="python:len(conts) > 1"
+ tal:attributes="id select_content_id;
+ name string:content_id;
onchange funct">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="cont conts">
<option tal:attributes="value cont/id"/><span tal:replace="cont/name"/>
</span>
</select>
<span tal:define="cont python:conts[0]"
tal:condition="python:len(conts) == 1">
- <input tal:attributes="id select_content_id;
- type string:hidden;
- name string:content_id;
+ <input tal:attributes="id select_content_id;
+ type string:hidden;
+ name string:content_id;
value cont/id"/>
<span tal:replace="cont/name"/>
</span>
- <span tal:omit-tag=""
- tal:define="cont python:conts[0]"
+ <span tal:omit-tag=""
+ tal:define="cont python:conts[0]"
tal:condition="not: displaying_source|nothing">
<span tal:condition="cont/is_source">
<br/>
@@ -1795,31 +1795,31 @@
<tr>
<td align="left"
tal:define="actions bd_data/actions">
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:repeat="action actions">
<span tal:omit-tag=""
- tal:define="act_name action/name;
- act_msg action/msg;
+ tal:define="act_name action/name;
+ act_msg action/msg;
act_link action/link">
<span tal:condition="act_link">
- <input tal:define="act_link python:act_link + '&storagename=' + storagename;
+ <input tal:define="act_link python:act_link + '&storagename=' + storagename;
funct python:'window.location.assign(\'' + act_link + '\')'"
- tal:attributes="type string:button;
- name string:action_type;
- value act_name;
+ tal:attributes="type string:button;
+ name string:action_type;
+ value act_name;
onclick funct"
class="form_button"/>
</span>
<span tal:condition="not: act_link">
- <input tal:condition="act_msg"
- tal:attributes="type string:submit;
- name string:action_type;
+ <input tal:condition="act_msg"
+ tal:attributes="type string:submit;
+ name string:action_type;
value act_name;
onclick python:'return confirm(\'' + act_msg + '\')'"
class="form_button"/>
- <input tal:condition="not: act_msg"
- tal:attributes="type string:submit;
- name string:action_type;
+ <input tal:condition="not: act_msg"
+ tal:attributes="type string:submit;
+ name string:action_type;
value act_name"
class="form_button"/>
</span>
@@ -1832,27 +1832,27 @@
tal:condition="not: bd_data/need_apply_button">
</span>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:condition="bd_data/need_apply_button">
- <input tal:attributes="type string:button;
- name string:action_type;
- value string:Reset;
+ <input tal:attributes="type string:button;
+ name string:action_type;
+ value string:Reset;
onclick python:'return reset_bd_form(this.form, \'' + select_content_id + '\', \'' + content_span_id + '\')'"
class="form_button"/>
- <input tal:condition="bd_data/new"
- tal:define="prompt_msg python:'Do you really want to create ' + bd_data['pretty_type'] + '?'"
+ <input tal:condition="bd_data/new"
+ tal:define="prompt_msg python:'Do you really want to create ' + bd_data['pretty_type'] + '?'"
tal:attributes="id apply_button_id;
- type string:button;
- name string:action_type;
- value string:Create;
+ type string:button;
+ name string:action_type;
+ value string:Create;
onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + bd_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
class="form_button"/>
- <input tal:condition="not: bd_data/new"
- tal:define="prompt_msg python:'Do you really want to apply changes to ' + bd_data['pretty_type'] + ' \\\'' + bd_data['pretty_name'] + '\\\'?'"
- tal:attributes="id apply_button_id;
- type string:button;
- name string:action_type;
- value string:Apply;
+ <input tal:condition="not: bd_data/new"
+ tal:define="prompt_msg python:'Do you really want to apply changes to ' + bd_data['pretty_type'] + ' \\\'' + bd_data['pretty_name'] + '\\\'?'"
+ tal:attributes="id apply_button_id;
+ type string:button;
+ name string:action_type;
+ value string:Apply;
onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + bd_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
class="form_button"/>
</span>
@@ -1881,20 +1881,20 @@
form_submit_button_id apply_button_id"
tal:attributes="id mapper_form_id;
method string:get">
- <input tal:attributes="type string:hidden;
- name string:pagetype;
+ <input tal:attributes="type string:hidden;
+ name string:pagetype;
value string:commit_changes"/>
- <input tal:attributes="type string:hidden;
- name string:object_type;
+ <input tal:attributes="type string:hidden;
+ name string:object_type;
value string:mapper"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_id;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_id;
value mapper/mapper_id"/>
- <input tal:attributes="type string:hidden;
- name string:mapper_type;
+ <input tal:attributes="type string:hidden;
+ name string:mapper_type;
value mapper/mapper_type"/>
- <input tal:attributes="type string:hidden;
- name string:storagename;
+ <input tal:attributes="type string:hidden;
+ name string:storagename;
value storagename"/>
<table class="props-form-table">
<tr class="props-form-header">
@@ -1934,32 +1934,32 @@
<table style="width: 100%;">
<tr>
<td align="left">
- <span tal:omit-tag=""
- tal:define="actions mapper/actions"
+ <span tal:omit-tag=""
+ tal:define="actions mapper/actions"
tal:repeat="action actions">
- <span tal:define="act_name action/name;
- act_msg action/msg;
+ <span tal:define="act_name action/name;
+ act_msg action/msg;
act_link action/link"
align="center">
<span tal:condition="act_link">
- <input tal:define="act_link python:act_link + '&storagename=' + storagename;
+ <input tal:define="act_link python:act_link + '&storagename=' + storagename;
funct python:'window.location.assign(\'' + act_link + '\')'"
- tal:attributes="type string:button;
- name string:action_type;
- value act_name;
+ tal:attributes="type string:button;
+ name string:action_type;
+ value act_name;
onclick funct"
class="form_button"/>
</span>
<span tal:condition="not: act_link">
- <input tal:condition="act_msg"
- tal:attributes="type string:submit;
- name string:action_type;
- value act_name;
+ <input tal:condition="act_msg"
+ tal:attributes="type string:submit;
+ name string:action_type;
+ value act_name;
onclick python:'return confirm(\'' + act_msg + '\')'"
class="form_button"/>
- <input tal:condition="not: act_msg"
- tal:attributes="type string:submit;
- name string:action_type;
+ <input tal:condition="not: act_msg"
+ tal:attributes="type string:submit;
+ name string:action_type;
value act_name"
class="form_button"/>
</span>
@@ -1979,11 +1979,11 @@
onclick="return reset_form(this.form)"
class="form_button"/>
<input tal:define="prompt_msg python:'Do you really want to apply changes to ' + mapper['pretty_type'] + ' \\\'' + mapper['pretty_name'] + '\\\'?';
- validate_url context/validate_html/absolute_url"
- tal:attributes="id apply_button_id;
- type string:button;
- name string:action_type;
- value string:Apply;
+ validate_url context/validate_html/absolute_url"
+ tal:attributes="id apply_button_id;
+ type string:button;
+ name string:action_type;
+ value string:Apply;
onclick python:'return validate_and_submit_form(\'' + validate_url + '\', \'' + mapper_form_id + '\', \'' + apply_button_id + '\', \'' + prompt_msg + '\')'"
class="form_button"/>
</span>
--- conga/luci/storage/index_html 2007/06/27 08:14:22 1.9
+++ conga/luci/storage/index_html 2007/09/11 16:04:35 1.10
@@ -30,7 +30,7 @@
<metal:cssslot fill-slot="css_slot">
<tal:comment replace="nothing"> A slot where you can insert CSS in the header from a template </tal:comment>
-
+
<style type="text/css"><!-- @import url(/luci/cluster/clusterportlet.css); --></style>
<metal:cssslot define-slot="css_slot" />
</metal:cssslot>
@@ -38,7 +38,7 @@
<metal:javascriptslot fill-slot="javascript_head_slot">
<tal:comment replace="nothing"> A slot where you can insert javascript in the header from a template </tal:comment>
<metal:javascriptslot define-slot="javascript_head_slot">
-
+
@@ -156,20 +156,20 @@
The wrapper table. It contains the three columns. There's a table-less
alternative in the plone_tableless skin layer that you can use if you
prefer layouts that don't use tables.
- </tal:comment>
- <span tal:omit-tag=""
- tal:define="global pagetype request/pagetype|nothing;
+ </tal:comment>
+ <span tal:omit-tag=""
+ tal:define="global pagetype request/pagetype|nothing;
global storagename request/storagename|nothing"/>
<span tal:omit-tag=""
tal:condition="not: pagetype">
<span tal:omit-tag=""
tal:define="global pagetype python:'0'"/>
</span>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="stosystemss context/systems/storage/objectItems;
global allowed_systems python:here.allowed_systems(stosystemss);
global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
- <span tal:omit-tag=""
+ <span tal:omit-tag=""
tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
global storage_report nothing"/>
<span tal:omit-tag=""
@@ -181,7 +181,7 @@
tal:define="global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
</span>
</span>
-
+
<table id="portal-columns">
<tbody>
<tr>
--- conga/luci/storage/mappings_macros 2006/06/30 17:00:02 1.1
+++ conga/luci/storage/mappings_macros 2007/09/11 16:04:35 1.2
@@ -3,24 +3,24 @@
<title tal:content="template/title">The title</title>
</head>
<body>
-
+
<h2><span tal:replace="here/title_or_id">content title or id</span>
<span tal:condition="template/title"
tal:replace="template/title">optional template title</span></h2>
This is Page Template <em tal:content="template/id">template id</em>.
</body>
-
-
-
+
+
+
<div metal:define-macro="draw-base-cyl"
tal:define="cap python:cyl['color'] + '_cap_40.png'">
-
+
<div tal:omit-tag=""
tal:define="cyls cyl/cyls;
tmp python:cyls.reverse()"
@@ -44,19 +44,19 @@
style python:here.add_commas('position:absolute', here.add_commas('left: ' + str(0), 'top: 0'))"/>
</div>
</div>
-
+
<img tal:define="one_tmp_assignment python:here.add_commas('position:absolute', here.add_commas('left: -' + str(curve_width), 'top: 0'))"
tal:attributes="src cap;
height string:40;
width string:20;
style one_tmp_assignment"/>
-
+
</div>
<div metal:define-macro="draw-highlights">
-
+
<div tal:omit-tag=""
tal:repeat="high highs">
<div tal:define="beg high/beg;
@@ -80,7 +80,7 @@
</span>
</div>
</div>
-
+
</div>
--- conga/luci/storage/mappings_provider 2007/06/25 16:03:41 1.5
+++ conga/luci/storage/mappings_provider 2007/09/11 16:04:35 1.6
@@ -1,18 +1,18 @@
<html>
-<span tal:omit-tag=""
- tal:define="global pagetype request/pagetype|nothing;
+<span tal:omit-tag=""
+ tal:define="global pagetype request/pagetype|nothing;
global storagename request/storagename|nothing"/>
<span tal:omit-tag=""
tal:condition="not: pagetype">
<span tal:omit-tag=""
tal:define="global pagetype python:'0'"/>
</span>
-<span tal:omit-tag=""
+<span tal:omit-tag=""
tal:define="stosystemss context/systems/storage/objectItems;
global allowed_systems python:here.allowed_systems(stosystemss);
global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
-<span tal:omit-tag=""
+<span tal:omit-tag=""
tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
@@ -26,62 +26,62 @@
<head>
<title tal:content="mapper/pretty_name">The title</title>
-
+
<script>
-
+
function ellipse(y) {
if (y == 0)
return 2;
-
+
if (y == 1)
return 3;
-
+
if (y == 2)
return 4;
-
+
if (y == 3)
return 5;
-
+
if (y == 4)
return 5;
-
+
if (y == 5)
return 6;
-
+
if (y == 6)
return 6;
-
+
if (y == 7)
return 7;
-
+
if (y == 8)
return 7;
-
+
if (y == 9)
return 7;
-
+
if (y == 10)
return 8;
-
+
if (y == 11)
return 8;
-
+
if (y == 12)
return 8;
-
+
if (y == 13)
return 8;
-
+
if (y > 26)
return ellipse(40 - y);
-
+
else
return 9;
}
-
+
var properties_span_id = '';
var current_selection = '';
-
+
function select_subcyl(id, h_data) {
var old_selection = current_selection;
unselect_cyl(old_selection, h_data);
@@ -126,9 +126,9 @@
}
}
}
-
-
-
+
+
+
function cyl_click(X, Y, c_data, h_data) {
if (Y < 0 || Y > 40)
return;
@@ -143,11 +143,11 @@
select_subcyl(id, h_data);
}
}
-
-
-
-
-
+
+
+
+
+
function cyl_over(msg_board, X, Y, c_data, h_data) {
if (Y < 0 || Y > 40) {
msg_board.style.visibility = 'invisible';
@@ -171,18 +171,18 @@
}
msg_board.style.visibility = 'invisible';
}
-
-
-
+
+
+
</script>
<style>
-
+
div.visible { visibility: visible; }
div.invisible { visibility: hidden; }
-
+
</style>
@@ -201,25 +201,25 @@
onload_c python:here.add_commas(onload_c, 'display_props(' + mapp_info['js'] + ')');
onload_c python:here.add_commas(onload_c, default_selection_c)"
tal:attributes="onload onload_c">
-
-
+
+
<div>
-
-
-
-
-
-
-
+
+
+
+
+
+
+
<!-- upper cylinder -->
<div tal:define="cyl mapp_info/upper_cyl;
X_offset python:X_offset + cyl['offset']"
tal:condition="cyl/cyls"
tal:attributes="style python:here.add_commas('position:absolute', here.add_commas('left: ' + str(X_offset), 'top: ' + str(Y_offset)))">
-
+
<!-- description -->
<div tal:define="style_1 python:here.add_commas('left: -1em', 'top: -1.5ex');
style_2 python:here.add_commas(style_1, 'position: absolute');
@@ -232,38 +232,38 @@
<span tal:replace="cyl/description"/>:
</div>
</div>
-
+
<div tal:define="one_temp_assignment python:here.add_commas('position:absolute', here.add_commas('left: ' + str(curve_width), 'top: 0'))"
tal:attributes="onmousedown python:'cyl_click(event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
onmousemove python:'cyl_over(document.getElementById(\'upper_msg_board\'), event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
onmouseout python:'document.getElementById(\'upper_msg_board\').style.visibility = \'hidden\'';
style python:here.add_commas('cursor: pointer', one_temp_assignment);
id string:upper_cylinder">
-
+
<!-- base -->
<div metal:use-macro="here/mappings_macros/macros/draw-base-cyl"/>
-
+
<!-- highlights -->
<span tal:omit-tag=""
tal:define="highs cyl/highs">
<div metal:use-macro="here/mappings_macros/macros/draw-highlights"/>
</span>
-
+
<div id="upper_msg_board"
style="position: absolute; border: 2px solid black; padding: 2px; background-color: lightyellow; visibility: hidden; z-index: 100; white-space: nowrap; font-size: small;">
</div>
-
+
</div>
</div>
-
-
+
+
<!-- lower cylinder -->
<div tal:define="cyl mapp_info/lower_cyl;
lower_Y_offset python:Y_offset + 80;
X_offset python:X_offset + cyl['offset']"
tal:condition="cyl/cyls"
tal:attributes="style python:here.add_commas('position:absolute', here.add_commas('left: ' + str(X_offset), 'top: ' + str(lower_Y_offset)))">
-
+
<!-- description -->
<div tal:define="style_1 python:here.add_commas('left: -1em', 'top: -1.5ex');
style_2 python:here.add_commas(style_1, 'position: absolute');
@@ -276,31 +276,31 @@
<span tal:replace="cyl/description"/>:
</div>
</div>
-
+
<div tal:define="one_temp_assignment python:here.add_commas('position:absolute', here.add_commas('left: ' + str(curve_width), 'top: 0'))"
- tal:attributes="onmousedown python:'cyl_click(event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(lower_Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
+ tal:attributes="onmousedown python:'cyl_click(event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(lower_Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
onmousemove python:'cyl_over(document.getElementById(\'lower_msg_board\'), event.clientX-' + str(curve_width) + '-' + str(X_offset) + ', event.clientY-' + str(lower_Y_offset) + ', ' + cyl['js'] + ', ' + mapp_info['js'] + ')';
onmouseout python:'document.getElementById(\'lower_msg_board\').style.visibility = \'hidden\'';
style python:here.add_commas('cursor: pointer', one_temp_assignment);
id string:lower_cylinder">
-
+
<!-- base -->
<div metal:use-macro="here/mappings_macros/macros/draw-base-cyl"/>
-
+
<!-- highlights -->
<span tal:omit-tag=""
tal:define="highs cyl/highs">
<div metal:use-macro="here/mappings_macros/macros/draw-highlights"/>
</span>
-
+
<div id="lower_msg_board"
style="position: absolute; border: 2px solid black; padding: 2px; background-color: lightyellow; visibility: hidden; z-index: 100; white-space: nowrap; font-size: small;">
</div>
-
+
</div>
</div>
-
-
+
+
<!-- select me message -->
<div tal:define="cyl mapp_info/lower_cyl;
Y_offset python:Y_offset + 80 + 40 + 10;
@@ -313,8 +313,8 @@
Click cylinders to view properties, unselect all to view <span tal:replace="mapper/pretty_type"/>'s properties
</div>
</div>
-
-
+
+
</div>
--- conga/luci/storage/portlet_cluconfig 2006/06/30 17:00:02 1.1
+++ conga/luci/storage/portlet_cluconfig 2007/09/11 16:04:35 1.2
@@ -4,7 +4,7 @@
<body>
-<div metal:define-macro="stochooseportlet"
+<div metal:define-macro="stochooseportlet"
tal:omit-tag=""
tal:define="global data python:here.createStorageChooser(request, stosystems)">
<dl class="portlet" id="portlet-cluconfig-tree">
@@ -34,11 +34,11 @@
<dt class="portletHeader">
<!--
<a href="#" tal:attributes="href python:here.getClusterURL(request, modelb)">
- <div tal:omit-tag="" tal:content="python: here.getClusterName(modelb)" />
+ <div tal:omit-tag="" tal:content="python: here.getClusterName(modelb)" />
</a>
-->
<a href="#" tal:attributes="href python:here.getStorageURL(request, storagename)">
- <div tal:omit-tag="" tal:content="storagename" />
+ <div tal:omit-tag="" tal:content="storagename" />
</a>
</dt>
<dd class="portletItemSingle">
--- conga/luci/storage/portlet_cluconfig_macro 2006/06/30 17:00:02 1.1
+++ conga/luci/storage/portlet_cluconfig_macro 2007/09/11 16:04:35 1.2
@@ -8,7 +8,7 @@
cur_item item/currentItem;"
tal:condition="python: (cur_item or parent_shows_children or children)">
- <tal:level define="item_type_class python: 'type-' + item['cfg_type'];">
+ <tal:level define="item_type_class python: 'type-' + item['cfg_type'];">
<div tal:attributes="class item_type_class">
<a tal:condition="cur_item"
tal:attributes="href item/absolute_url;
--- conga/luci/storage/validate_html 2007/06/25 16:03:41 1.3
+++ conga/luci/storage/validate_html 2007/09/11 16:04:35 1.4
@@ -1,15 +1,15 @@
-<span tal:omit-tag=""
- tal:define="global pagetype request/pagetype|nothing;
+<span tal:omit-tag=""
+ tal:define="global pagetype request/pagetype|nothing;
global storagename request/storagename|nothing"/>
-<span tal:omit-tag=""
- tal:define="stosystemss context/systems/storage/objectItems;
- global allowed_systems python:here.allowed_systems(stosystemss);
+<span tal:omit-tag=""
+ tal:define="stosystemss context/systems/storage/objectItems;
+ global allowed_systems python:here.allowed_systems(stosystemss);
global access_to_host_allowed python:here.access_to_host_allowed(storagename, allowed_systems)"/>
-<span tal:omit-tag=""
- tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
+<span tal:omit-tag=""
+ tal:define="global ricci python:here.get_ricci_communicator(storagename, allowed_systems);
global storage_report python:here.get_storage_report(ricci, request.SESSION)"/>
-<span tal:omit-tag=""
+<span tal:omit-tag=""
tal:define="global action_type request/action_type|nothing"/>
<span tal:omit-tag=""
@@ -30,8 +30,8 @@
OK if validated
message if not validated
</span>
-
- <span tal:omit-tag=""
+
+ <span tal:omit-tag=""
tal:condition="python:action_type != 'Validate'">
This form is to be used for validation only
</span>
--- conga/luci/sysconfig/luci 2006/06/16 23:14:34 1.1
+++ conga/luci/sysconfig/luci 2007/09/11 16:04:35 1.2
@@ -1,4 +1,4 @@
-# defaults for luci,
-# web UI fronted for remote management
+# defaults for luci,
+# web UI fronted for remote cluster and storage management
LUCI_HTTPS_PORT=8084
More information about the Cluster-devel
mailing list