[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Cluster-devel] conga/luci homebase/form-macros homebase/homeb ...



CVSROOT:	/cvs/cluster
Module name:	conga
Changes by:	rmccabe sourceware org	2008-01-22 15:02:33

Modified files:
	luci/homebase  : form-macros homebase_common.js index_html 
	                 validate_cluster_add_initial.js 
	                 validate_sys_remove.js 
	luci/plone-custom: conga.js conga_ajax.js 
	luci/cluster   : form-chooser form-macros index_html 
Added files:
	luci/plone-custom: update_hostinfo.js validate_auth.js 

Log message:
	sync up with my local tree
	- fixes for 252348 and 230462

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/form-macros.diff?cvsroot=cluster&r1=1.64&r2=1.65
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/homebase_common.js.diff?cvsroot=cluster&r1=1.23&r2=1.24
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/index_html.diff?cvsroot=cluster&r1=1.25&r2=1.26
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/validate_cluster_add_initial.js.diff?cvsroot=cluster&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/homebase/validate_sys_remove.js.diff?cvsroot=cluster&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/update_hostinfo.js.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/validate_auth.js.diff?cvsroot=cluster&r1=NONE&r2=1.1
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/conga.js.diff?cvsroot=cluster&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/plone-custom/conga_ajax.js.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-chooser.diff?cvsroot=cluster&r1=1.23&r2=1.24
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/form-macros.diff?cvsroot=cluster&r1=1.218&r2=1.219
http://sourceware.org/cgi-bin/cvsweb.cgi/conga/luci/cluster/index_html.diff?cvsroot=cluster&r1=1.40&r2=1.41

--- conga/luci/homebase/form-macros	2008/01/03 16:27:49	1.64
+++ conga/luci/homebase/form-macros	2008/01/22 15:02:32	1.65
@@ -289,6 +289,9 @@
 					-> if yes, confirm again, showing list
 	</tal:comment>
 
+	<script type="text/javascript" src="conga_ajax.js"></script>
+	<script type="text/javascript" src="update_hostinfo.js"></script>
+	<script type="text/javascript" src="validate_auth.js"></script>
 	<script type="text/javascript" src="/luci/homebase/validate_sys_remove.js">
 	</script>
 
@@ -313,6 +316,7 @@
 					<tr class="systemsTable">
 						<th class="systemsTable">System Hostname</th>
 						<th class="systemsTable">Root Password</th>
+						<th class="systemsTable">Key ID</th>
 						<th class="systemsTable"></th>
 					</tr>
 				</thead>
@@ -321,6 +325,7 @@
 					<tr class="systemsTable" id="__SYSTEM_ROW_0">
 						<td class="systemsTable">
 							<input class="hbInputSys" type="text"
+								onchange="reset_system_info(this)"
 								id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
 						</td>
 						<td class="systemsTable">
@@ -332,6 +337,10 @@
 								onchange="pwd0Change(this.form)" />
 						</td>
 						<td class="systemsTable">
+							<img id="__SYSTEM0Fingerprint" src="lock-open.png"
+								title="no key fingerprint available" />
+						</td>
+						<td class="systemsTable">
 							<img src="delete-row.png" class="deleteRow"
 								title="delete this row"
 								onclick="delete_element_id('__SYSTEM_ROW_0')" />
@@ -363,6 +372,7 @@
 							<input type="hidden" name="trust_shown" value="1" />
 
 							<input class="hbInputSys" type="text"
+								onchange="reset_system_info(this)"
 								tal:attributes="
 									id python: '__SYSTEM%d:Addr' % cur_sysnum;
 									name python: '__SYSTEM%d:Addr' % cur_sysnum;
@@ -379,10 +389,10 @@
 									value nothing" />
 						</td>
 						<td class="systemsTable">
-							<img
-								tal:attributes="
-									src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
-									title sys/fp | string:no key fingerprint available"
+							<img tal:attributes="
+								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+								src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
+								title sys/fp | string:no key fingerprint available"
 							/>
 							<input type="hidden"
 								tal:condition="exists: sys/fp"
@@ -416,10 +426,6 @@
 			<tfoot class="systemsTable">
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<ul class="vanilla">
-						<li class="vanilla">
-							<input name="check_certs" id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)"
-								type="checkbox">View system certificates before sending any passwords.</li>
 						<li class="vanilla"
 							tal:attributes="id python: cur_sysnum < 2 and 'allSameDiv' or ''">
 							<input type="checkbox" name="allSameCheckBox"
@@ -441,38 +447,55 @@
 		<input name="numStorage" id="numStorage" type="hidden"
 			tal:attributes="value cur_sysnum | string:1" />
 
-		<input type="hidden" name="pagetype" value="8" />
+		<input type="hidden" name="pagetype" value="1003" />
+
+		<div class="hbSubmit">
+        <div class="hbSubmit">
+			<input type="button" name="View SSL cert fingerprints"
+				value="View SSL cert fingerprints"
+				onclick="get_system_info('auth_retmsgsdiv', 'auth_errmsgsdiv')" />
+		</div>
 
 		<div class="hbSubmit" id="hbSubmit">
 			<input type="button" name="Submit" value="Submit"
 				onclick="validateAuth(this.form)" />
 		</div>
 
-		<tal:block tal:condition="exists: request/SESSION/auth_status">
-			<div class="retmsgs" id="auth_retmsgsdiv"
-				tal:condition="exists: request/SESSION/auth_status/messages">
-				<div class="hbclosebox">
-					<a href="javascript:hide_element('auth_retmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
-				</div>
-				<p class="retmsgs">Status messages:</p>
-				<ul class="statusmsg">
-					<tal:block tal:repeat="e request/SESSION/auth_status/messages">
-						<li class="statusmsg" tal:content="e" />
-					</tal:block>
-				</ul>
+		<tal:block tal:define="global have_retmsgs exists:request/SESSION/auth_status/messages" />
+		<tal:block tal:define="global have_errmsgs exists:request/SESSION/auth_status/errors" />
+
+		<div id="auth_retmsgsdiv"
+			tal:attributes="class python:'retmsgs' + (have_retmsgs and ' ' or ' invisible')">
+			<div class="hbclosebox">
+				<a href="javascript:hide_msgs('auth_retmsgsdiv')"><img src="x.png" class="closeBox" title="dismiss"></a>
 			</div>
-			<div class="errmsgs" id="auth_errmsgsdiv"
-				tal:condition="exists: request/SESSION/auth_status/errors">
-				<div class="hbclosebox">
-					<a href="javascript:hide_element('auth_errmsgsdiv');"><img src="x.png" class="closeBox" title="dismiss"></a>
-				</div>
-				<p class="errmsgs">The following errors occurred:</p>
-				<ul class="statusmsg">
-					<tal:block tal:repeat="e request/SESSION/auth_status/errors">
-						<li class="statusmsg" tal:content="e" />
-					</tal:block>
-				</ul>
+
+			<p class="retmsgs">Status messages:</p>
+			<ul class="statusmsg">
+				<tal:block
+					tal:condition="exists:request/SESSION/auth_status/messages"
+					tal:repeat="e request/SESSION/auth_status/messages">
+					<li class="statusmsg" tal:content="e" />
+				</tal:block>
+			</ul>
+		</div>
+
+		<div id="auth_errmsgsdiv"
+			tal:attributes="class python:'errmsgs' + (have_errmsgs and ' ' or ' invisible')">
+			<div class="hbclosebox">
+				<a href="javascript:hide_msgs('auth_errmsgsdiv')"><img src="x.png" class="closeBox" title="dismiss"></a>
 			</div>
+			<p class="errmsgs">The following errors occurred:</p>
+			<ul class="statusmsg">
+				<tal:block
+					tal:condition="exists:request/SESSION/auth_status/errors"
+					tal:repeat="e request/SESSION/auth_status/errors">
+					<li class="statusmsg" tal:content="e" />
+				</tal:block>
+			</ul>
+		</div>
+
+		<tal:block tal:condition="exists:request/SESSION/auth_status">
 			<tal:block
 				tal:define="x python: request.SESSION.delete('auth_status')" />
 			<div class="padding">&nbsp;</div>
@@ -589,6 +612,8 @@
 
 	<script type="text/javascript" src="/luci/homebase/validate_sys_add.js">
 	</script>
+	<script type="text/javascript" src="conga_ajax.js"></script>
+	<script type="text/javascript" src="update_hostinfo.js"></script>
 
 	<script type="text/javascript">
 		set_page_title('Luci — homebase — Add a storage system to be managed by Luci');
@@ -610,6 +635,7 @@
 					<tr class="systemsTable">
 						<th class="systemsTable">System Hostname</th>
 						<th class="systemsTable">Root Password</th>
+						<th class="systemsTable">Key ID</th>
 						<th class="systemsTable"></th>
 					</tr>
 				</thead>
@@ -618,6 +644,7 @@
 					<tr class="systemsTable" id="__SYSTEM_ROW_0">
 						<td class="systemsTable">
 							<input class="hbInputSys" type="text"
+								onchange="reset_system_info(this)"
 								id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
 						</td>
 						<td class="systemsTable">
@@ -629,6 +656,10 @@
 								onchange="pwd0Change(this.form)" />
 						</td>
 						<td class="systemsTable">
+							<img src="lock-open.png" id="__SYSTEM0Fingerprint"
+								title="no key fingerprint available" />
+						</td>
+						<td class="systemsTable">
 							<img src="delete-row.png" class="deleteRow"
 								title="delete this row"
 								onclick="delete_element_id('__SYSTEM_ROW_0')" />
@@ -643,7 +674,6 @@
 						<th class="systemsTable">System Hostname</th>
 						<th class="systemsTable">Root Password</th>
 						<th class="systemsTable">Key ID</th>
-						<th class="systemsTable">Trust</th>
 						<th class="systemsTable"></th>
 					</tr>
 				</thead>
@@ -660,6 +690,7 @@
 							<input type="hidden" name="trust_shown" value="1" />
 
 							<input class="hbInputSys" type="text"
+								onchange="reset_system_info(this)"
 								tal:attributes="
 									id python: '__SYSTEM%d:Addr' % cur_sysnum;
 									name python: '__SYSTEM%d:Addr' % cur_sysnum;
@@ -677,17 +708,10 @@
 
 						</td>
 						<td class="systemsTable">
-							<img
-								tal:attributes="
-									src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
-									title sys/fp | string:no key fingerprint available"
-							/>
-							<input type="hidden"
-								tal:condition="exists: sys/fp"
-								tal:attributes="
-									id python: '__SYSTEM%dFingerprint' % cur_sysnum;
-									name python: '__SYSTEM%dFingerprint' % cur_sysnum;
-									value sys/fp | nothing" />
+							<img tal:attributes="
+								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+								src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
+								title sys/fp | string:no key fingerprint available" />
 						</td>
 						<td class="systemsTable">
 							<input type="checkbox" checked tal:attributes="
@@ -714,12 +738,8 @@
 			<tfoot class="systemsTable">
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<ul class="vanilla">
-						<li class="vanilla">
-							<input name="check_certs" id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)"
-								type="checkbox">View system certificates before sending any passwords.</li>
 						<li class="vanilla"
-							tal:attributes="id python: cur_sysnum < 2 and 'allSameDiv' or ''"><input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onclick="allPasswdsSame(this.form);"/>Check if storage system passwords are identical.</li>
+							tal:attributes="id python: cur_sysnum < 2 and 'allSameDiv' or ''"><input type="checkbox" name="allSameCheckBox" id="allSameCheckBox" onclick="allPasswdsSame(this.form);"/>Check if system passwords are identical.</li>
 					</ul>
 				</td></tr>
 
@@ -729,6 +749,15 @@
 							onclick="addSystem(this.form)" />
 					</div>
 				</td></tr>
+
+				<tr class="systemsTable"><td class="systemsTable" colspan="2">
+					<div class="systemsTableEnd">
+							<input type="button"
+								name="View SSL cert fingerprints"
+								value="View SSL cert fingerprints"
+								onclick="get_system_info('retmsgsdiv', 'errmsgsdiv')" />
+					</div>
+				</td></tr>
 			</tfoot>
 		</table>
 
@@ -801,8 +830,7 @@
 				<tr class="systemsTable">
 					<th class="systemsTable">Node Hostname</th>
 					<th class="systemsTable">Root Password</th>
-					<th tal:condition="asked_for_certs" class="systemsTable">Key ID</th>
-					<th tal:condition="asked_for_certs" class="systemsTable">Trust</th>
+					<th class="systemsTable">Key ID</th>
 				</tr>
 
 			</thead>
@@ -811,12 +839,6 @@
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<input type="hidden" name="trust_shown" value="1" />
 					<ul class="vanilla">
-						<li class="vanilla">
-							<input name="check_certs" type="checkbox"
-								id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)" />
-							View system certificates before sending any passwords.
-						</li>
 						<li class="vanilla" id="allSameDiv">
 						<li class="vanilla" tal:condition="not: exists: add_cluster/complete">
 							<input type="checkbox" name="allSameCheckBox"
@@ -845,6 +867,7 @@
 					tal:define="sys python: add_cluster['nodes'][cur_sys]">
 					<td class="systemsTable">
 						<input type="text"
+							onchange="reset_system_info(this)"
 							tal:attributes="
 								value sys/host | nothing;
 								id python: '__SYSTEM%d:Addr' % cur_sysnum;
@@ -874,39 +897,12 @@
 									name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
 						</tal:block>
 					</td>
-					<td tal:condition="asked_for_certs" class="systemsTable">
-						<img
-							tal:attributes="
-								src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
-								title sys/fp | string:no key fingerprint available" />
-						<input type="hidden"
-							tal:condition="exists: sys/fp"
-							tal:attributes="
-								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								name python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								value sys/fp | nothing" />
-					</td>
-					<td tal:condition="asked_for_certs" class="systemsTable">
-						<input type="checkbox"
-							tal:attributes="
-								checked python: sys.has_key('fp') or sys.has_key('trusted');
-								id python: '__SYSTEM%dTrusted' % cur_sysnum;
-								name python: '__SYSTEM%dTrusted' % cur_sysnum;
-								disabled python: sys.has_key('trusted')" />
+					<td class="systemsTable">
+						<img tal:attributes="
+							id python: '__SYSTEM%dFingerprint' % cur_sysnum;
+							src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
+							title sys/fp | string:no key fingerprint available" />
 					</td>
-					<tal:block tal:condition="python:not asked_for_certs">
-						<input type="hidden" value="1"
-							tal:attributes="
-								id python: '__SYSTEM%dTrusted' % cur_sysnum;
-								name python: '__SYSTEM%dTrusted' % cur_sysnum"
-						/>
-						<input type="hidden"
-							tal:condition="exists: sys/fp"
-							tal:attributes="
-								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								name python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								value sys/fp | nothing" />
-					</tal:block>
 				</tr>
 				<tal:block tal:define="global cur_sysnum python: cur_sysnum + 1" />
 			 </tal:block>
@@ -944,14 +940,17 @@
 			- At least one node name/password are given and are valid
 	</tal:comment>
 
+	<script type="text/javascript" src="conga_ajax.js"></script>
+	<script type="text/javascript" src="update_hostinfo.js"></script>
 	<script type="text/javascript" src="/luci/homebase/validate_cluster_add_initial.js">
 	</script>
+
 	<script type="text/javascript">
 		set_page_title('Luci — homebase — Add a running cluster to be managed by Luci');
 	</script>
 
 	<form name="adminform" action="" method="post">
-		<input name="pagetype" type="hidden"
+		<input name="pagetype" type="hidden" id="pagetype"
 			tal:attributes="value request/form/pagetype | request/pagetype | nothing" />
 
 		<h2 class="homebase">Add an Existing Cluster</h2>
@@ -962,26 +961,32 @@
 			tal:define="cur_sys request/SESSION/add_cluster_initial | nothing">
 
 			<thead class="systemsTable">
+				<tr class="systemsTable"><td class="systemsTable" colspan="2">
+					<div class="systemsTableTop">
+						<strong class="cluster_name invisible" id="cluname_elem">Cluster Name:
+						</strong>
+						<input type="hidden" id="clustername" name="clustername" value="" />
+						<input type="hidden" id="cluster_os" name="cluster_os" value="rhel5" />
+					</div>
+				</td></tr>
+
 				<tr class="systemsTable">
 					<th class="systemsTable">System Hostname</th>
 					<th class="systemsTable">Root Password</th>
-					<tal:block tal:condition="cur_sys">
-						<th>Key Id</th>
-						<th>Trust</th>
-					</tal:block>
+					<th>Key ID</th>
 				</tr>
 			</thead>
 
 			<tfoot class="systemsTable">
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
-					<input type="hidden" name="trust_shown" value="1"
-						tal:condition="cur_sys" />
-
+					<input type="hidden" name="trust_shown" value="1" />
+				</td></tr>
+				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<ul class="vanilla">
-						<li class="vanilla">
-							<input name="check_certs" id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)"
-								type="checkbox">View system certificates before sending any passwords.
+						<li class="vanilla" id="allSameDiv">
+							<input type="checkbox" name="allSameCheckBox"
+								id="allSameCheckBox" onclick="allPasswdsSame(this.form)" />
+							Check if system passwords are identical.
 						</li>
 					</ul>
 				</td></tr>
@@ -991,6 +996,7 @@
 				<tr class="systemsTable">
 					<td class="systemsTable">
 						<input class="hbInputSys" type="text"
+							onchange="reset_system_info(this)"
 							id="__SYSTEM0:Addr" name="__SYSTEM0:Addr"
 							tal:attributes="
 								value cur_sys/host | nothing" />
@@ -1003,26 +1009,28 @@
 							tal:attributes="
 								value nothing" />
 					</td>
-					<tal:block tal:condition="cur_sys">
-						<td class="systemsTable">
-							<img tal:attributes="
+					<td class="systemsTable">
+						<img id="__SYSTEM0Fingerprint"
+							tal:attributes="
 								title sys/fp | string:no key fingerprint available;
-								src python: 'trusted' in cur_sys and 'lock-ok.png' or ('fp' in cur_sys and 'lock-closed.png' or 'lock-open.png')"
-							/>
-						</td>
-						<td class="systemsTable">
-							<input type="checkbox" name="host_is_trusted" checked="checked" />
-						</td>
-					</tal:block>
+								src python: (cur_sys and cur_sys.has_key('trusted')) and 'lock-ok.png' or ((cur_sys and cur_sys.has_key('fp')) and 'lock-closed.png' or 'lock-open.png')"
+						/>
+					</td>
 				</tr>
 			</tbody>
+
 			<tal:block tal:condition="cur_sys">
 				<tal:block
 					tal:define="x python: request.SESSION.delete('add_cluster_initial')" />
 			</tal:block>
 		</table>
 
-		<input type="hidden" name="numStorage" value="1" />
+		<input type="hidden" id="numStorage" name="numStorage" value="1" />
+
+		<div class="hbSubmit">
+			<input type="button" name="View SSL cert fingerprints"
+				value="View SSL cert fingerprints" onclick="get_system_info('retmsgsdiv', 'errmsgsdiv')" />
+		</div>
 
 		<div class="hbSubmit" id="hbSubmit">
 			<input type="button" name="Submit" value="Submit"
--- conga/luci/homebase/homebase_common.js	2008/01/02 20:52:23	1.23
+++ conga/luci/homebase/homebase_common.js	2008/01/22 15:02:32	1.24
@@ -74,7 +74,7 @@
 	}
 }
 
-function addSystem(form) {
+function addSystem(form, no_delete) {
 	var sltab = document.getElementById('sys_tbody');
 	if (!sltab) {
 		return;
@@ -87,6 +87,7 @@
 	newsys.setAttribute('id', '__SYSTEM' + num_systems + ':Addr');
 	newsys.setAttribute('type', 'text');
 	newsys.setAttribute('value', '');
+	newsys.onclick = new Function('reset_system_info(this)');
 
 	var newsysp = document.createElement('input');
 	newsysp.className = 'hbInputPass';
@@ -120,20 +121,34 @@
 	hcol.className = 'systemsTable';
 	var pcol = document.createElement('td');
 	pcol.className = 'systemsTable';
-	var dcol = document.createElement('td');
-	dcol.className = 'systemsTable';
-	var del_img = document.createElement('img');
-	del_img.src = 'delete-row.png';
-	del_img.title = 'delete this row';
-	del_img.className = 'deleteRow';
-	del_img.onclick = new Function('delete_element_id(\'' + newrow.id + '\')');
 
-	dcol.appendChild(del_img);
+	var fpcol = document.createElement('td');
+	fpcol.className = 'systemsTable';
+	var fp_img = document.createElement('img');
+	fp_img.src = 'lock-open.png';
+	fp_img.title = 'no key fingerprint available';
+	fp_img.id = '__SYSTEM' + num_systems + 'Fingerprint';
+	fpcol.appendChild(fp_img);
+
+	if (!no_delete) {
+		var dcol = document.createElement('td');
+		dcol.className = 'systemsTable';
+		var del_img = document.createElement('img');
+		del_img.src = 'delete-row.png';
+		del_img.title = 'delete this row';
+		del_img.className = 'deleteRow';
+		del_img.onclick = new Function('delete_element_id(\'' + newrow.id + '\')');
+		dcol.appendChild(del_img);
+	}
+
 	hcol.appendChild(newsys);
 	pcol.appendChild(newsysp);
 	newrow.appendChild(hcol);
 	newrow.appendChild(pcol);
-	newrow.appendChild(dcol);
+	newrow.appendChild(fpcol);
+	if (!no_delete) {
+		newrow.appendChild(dcol);
+	}
 	sltab.appendChild(newrow);
 
 	form.numStorage.value = ++num_systems;
@@ -142,6 +157,79 @@
 		temp.style.visibility = 'visible';
 		temp.style.display = 'block';
 	}
+	return (num_systems - 1);
+}
+
+function reset_system_info(obj) {
+	var offset = null;
+	if (!obj.id || obj.id.substr(0, 8) !== '__SYSTEM') {
+			return (-1);
+	}
+	offset = obj.id.substr(8, obj.id.indexOf(':') - 8);
+	if (offset === null || offset < 0) {
+		return (-1);
+	}
+	var pwd_elem = document.getElementById('__SYSTEM' + offset + ':Passwd');
+	if (pwd_elem) {
+		clr_form_err(pwd_elem);
+	}
+	var fp_elem = document.getElementById('__SYSTEM' + offset + 'Fingerprint');
+	if (fp_elem) {
+		fp_elem.src = 'lock-open.png';
+		fp_elem.title = 'no key fingerprint available';
+	}
+	clr_form_err(obj);
+
+}
+
+function get_systems_list(errors) {
+	var systems_entered = [];
+	var num_systems = 0;
+
+	try {
+		var num_elem = document.getElementById('numStorage');
+		num_systems = num_elem.value;
+		if (!is_valid_int(num_systems, null, null)) {
+			throw String(num_systems + ' is not a valid number of systems.');
+		}
+	} catch (e) {
+		errors.push(e);
+	}
+
+	for (var i = 0 ; i < num_systems ; i++) {
+		var element = document.getElementById('__SYSTEM' + i + ':Addr');
+
+		if (!element || str_is_blank(element.value)) {
+			continue;
+		}
+		systems_entered.push(element.value);
+	}
+	return (systems_entered);
+}
+
+function get_systems_list_offsets(errors) {
+	var systems_entered = [];
+	var num_systems = 0;
+
+	try {
+		var num_elem = document.getElementById('numStorage');
+		num_systems = num_elem.value;
+		if (!is_valid_int(num_systems, null, null)) {
+			throw String(num_systems + ' is not a valid number of systems.');
+		}
+	} catch (e) {
+		errors.append(e);
+	}
+
+	for (var i = 0 ; i < num_systems ; i++) {
+		var element = document.getElementById('__SYSTEM' + i + ':Addr');
+
+		if (!element || str_is_blank(element.value)) {
+			continue;
+		}
+		systems_entered.push([ element.value, i ]);
+	}
+	return (systems_entered);
 }
 
 function validate_systems(form, errors) {
--- conga/luci/homebase/index_html	2007/11/27 16:58:18	1.25
+++ conga/luci/homebase/index_html	2008/01/22 15:02:32	1.26
@@ -114,35 +114,38 @@
 				Homebase
 			</metal:main_form>
 
-	<tal:block tal:condition="python: request.SESSION.has_key('checkRet')"
-		tal:define="ret python: request.SESSION.get('checkRet')">
-
-		<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
+	<tal:block tal:define="ret python: request.SESSION.get('checkRet')">
+		<div id="retmsgsdiv"
+			tal:attributes="class python:'retmsgs' + ((ret and ret.get('messages') and len(ret.get('messages')) > 0) and ' ' or ' invisible')">
 			<div class="hbclosebox">
-				<img onclick="hide_element('retmsgsdiv')" src="x.png" class="closeBox" title="dismiss" />
+				<img onclick="hide_msgs('retmsgsdiv')"
+					src="x.png" class="closeBox" title="dismiss" />
 			</div>
 			<p class="retmsgs">Status messages:</p>
-			<ul class="statusmsg">
-				<tal:block tal:repeat="e python:ret['messages']">
-					<li class="statusmsg" tal:content="python:e" />
+			<ul class="statusmsg" id="statusmsglist">
+				<tal:block tal:condition="exists:ret/messages"
+					tal:repeat="e ret/messages">
+					<li class="statusmsg" tal:content="e" />
 				</tal:block>
 			</ul>
 		</div>
 
-		<div id="errmsgsdiv" class="errmsgs" tal:condition="python:(ret and 'errors' in ret and len(ret['errors']))">
+		<div id="errmsgsdiv"
+			tal:attributes="class python:'errmsgs' + ((ret and ret.get('errors') and len(ret.get('errors')) > 0) and ' ' or ' invisible')">
 			<div class="hbclosebox">
-				<img onclick="hide_element('errmsgsdiv')" src="x.png" class="closeBox" title="dismiss">
+				<img onclick="hide_msgs('errmsgsdiv')"
+					src="x.png" class="closeBox" title="dismiss" />
 			</div>
 			<p class="errmsgs">The following errors occurred:</p>
-			<ul class="statusmsg">
-				<tal:block tal:repeat="e python:ret['errors']">
-					<li class="statusmsg" tal:content="python:e" />
+			<ul class="statusmsg" id="errmsglist">
+				<tal:block tal:condition="exists:ret/errors"
+					tal:repeat="e ret/errors">
+					<li class="statusmsg" tal:content="e" />
 				</tal:block>
 			</ul>
 		</div>
 	</tal:block>
 
-
 				  </div>
 
 				</div>
--- conga/luci/homebase/validate_cluster_add_initial.js	2008/01/02 20:52:23	1.4
+++ conga/luci/homebase/validate_cluster_add_initial.js	2008/01/22 15:02:32	1.5
@@ -7,9 +7,11 @@
 ** Free Software Foundation.
 */
 
+var form_elem = null;
 function validateForm(form) {
 	var errors = [];
 
+	form_elem = form;
 	if (!form) {
 		return (-1);
 	}
@@ -28,10 +30,159 @@
 		return (-1);
 	}
 
-	if (confirm('Retrieve cluster information from ' + added_storage[0] + '?'))
-	{
-		form.submit();
+	if (form.pagetype.value == 7) {
+		if (confirm('Retrieve cluster information from ' + added_storage[0] + '?')) {
+			get_cluster_members();
+		}
+	} else if (form.pagetype.value == 6) {
+		if (confirm('Add this cluster?')) {
+			form.submit();
+		}
 	}
 
 	return (0);
 }
+
+function same_host(left, right) {
+	if (left === right) {
+		return (true);
+	}
+	left = left.toLowerCase();
+	right = right.toLowerCase();
+	if (left === right) {
+		return (true);
+	}
+	left = left.replace(/\.$/, '');
+	right = right.replace(/\.$/, '');
+	if (left.length > right.length) {
+		return (right === left.substr(0, right.length));
+	} else {
+		return (left === right.substr(0, left.length));
+	}
+	return false;
+}
+
+function get_cluster_members() {
+	var url = '/luci/cluster?pagetype=1000';
+	var node_num = 0;
+
+	var hclu_elem = document.getElementById('__SYSTEM0:Addr');
+	if (hclu_elem && hclu_elem.value) {
+		++node_num;
+		url += '&node' + node_num + '=' + hclu_elem.value;
+	}
+
+	if (!node_num) {
+		alert('No node names were entered');
+	} else {
+		initiate_async_get(url, cluster_member_callback);
+	}
+}
+
+function cluster_member_callback() {
+	return check_ajax_xml(xmlHttp_object, cluster_member_check);
+}
+
+function cluster_member_check(ret_status, obj) {
+	if (ret_status === null) {
+		/* Not ready */
+		return;
+	}
+
+	if (ret_status !== true) {
+		/* A communication error occurred. */
+		alert(obj);
+		form_elem.submit();
+		return;
+	}
+
+	var err = get_ricci_response_status(obj.responseXML);
+	if (err !== null && err.length > 0) {
+		alert(err.join('\n'));
+		form_elem.submit();
+		return;
+	}
+
+	try {
+		obj = obj.responseXML.getElementsByTagName('dict')[0];
+	} catch (e) {
+		alert('Received a malformed response from the luci server.');
+		form_elem.submit();
+		return;
+	}
+
+	var query_host;
+	var query_host_elem = document.getElementById('__SYSTEM0:Addr');
+	if (!query_host_elem || str_is_blank(query_host_elem.value)) {
+		alert('No node was entered.');
+		form_elem.submit();
+		return;
+	}
+	query_host = query_host_elem.value;
+
+	var clusters = [];
+	var dict_tags = obj.getElementsByTagName('dict');
+	var num_errors = 0;
+	for (var i = 0 ; i < dict_tags.length ; i++) {
+		try {
+			var cnode_names = [];
+			var tag_name = dict_tags[i].getAttribute('name');
+			var cnodes = dict_tags[i].getElementsByTagName('clusternode');
+			var cur_node_name;
+
+			for (var j = 0 ; j < cnodes.length - 1 ; j++) {
+				addSystem(form_elem, 1);
+			}
+
+			var last_num = 0;
+			for (var j = 0 ; j < cnodes.length ; j++) {
+				cur_node_name = cnodes[j].getAttribute('value');
+				cnode_names.push(cur_node_name);
+				if (!same_host(cur_node_name, query_host)) {
+					var addr_elem = document.getElementById('__SYSTEM' + ++last_num + ':Addr');
+					addr_elem.value = cur_node_name;
+				} else {
+					query_host_elem.value = cur_node_name;
+				}
+			}
+		} catch (e) {
+			num_errors++;
+			alert(e);
+		}
+	}
+	var cluster_name = "[unknown]";
+	var var_tags = obj.getElementsByTagName('var');
+	for (var i = 0 ; i < var_tags.length ; i++) {
+		try {
+			if (var_tags[i].getAttribute('name') == 'cluster') {
+				cluster_name = var_tags[i].getAttribute('value');
+				break;
+			}
+		} catch (e) {
+			alert(e);
+		}
+	}
+	try {
+		var cn_elem = document.getElementById('cluname_elem');
+		cn_elem.className = cn_elem.className.replace(/invisible/gi, '');
+		try {
+			var tn = document.createTextNode(cluster_name);
+			cn_elem.appendChild(tn);
+		} catch (e1) {
+			var tn = document.createElement('span');
+			tn.innerHTML = cluster_name;
+			cn_elem.appendChild(tn);
+		}
+		var cn_elem = document.getElementById('clustername');
+		cn_elem.value = cluster_name;
+	} catch (e) {
+		num_errors++;
+	}
+		
+	if (num_errors === 0) {
+		var pt_elem = document.getElementById('pagetype');
+		if (pt_elem) {
+			pt_elem.value = 6;
+		}
+	}
+}
--- conga/luci/homebase/validate_sys_remove.js	2008/01/02 20:52:23	1.6
+++ conga/luci/homebase/validate_sys_remove.js	2008/01/22 15:02:32	1.7
@@ -82,6 +82,5 @@
 		return (-1);
 	}
 
-	form.submit();
-	return (0);
+	validate_auth_form(form, 'auth_retmsgsdiv', 'auth_errmsgsdiv');
 }
/cvs/cluster/conga/luci/plone-custom/update_hostinfo.js,v  -->  standard output
revision 1.1
--- conga/luci/plone-custom/update_hostinfo.js
+++ -	2008-01-22 15:02:34.876851000 +0000
@@ -0,0 +1,144 @@
+/*
+** Copyright (C) 2007-2008 Red Hat, Inc.
+**
+** This program is free software; you can redistribute
+** it and/or modify it under the terms of version 2 of the
+** GNU General Public License as published by the
+** Free Software Foundation.
+*/
+
+var err_div_id = null;
+var msg_div_id = null;
+var err_if_clumember = false;
+
+function get_system_info(msgarea_id, errarea_id, err) {
+	var url = '/luci/cluster?pagetype=1002';
+	var errors = [];
+	var systems_list = get_systems_list(errors);
+
+	if (error_dialog(errors)) {
+		return (null);
+	}
+
+	if (systems_list.length < 1) {
+		alert('No system names were entered');
+		return (null);
+	}
+
+	try {
+		hide_msgs(errarea_id);
+		hide_msgs(msgarea_id);
+	} catch (e) {
+	}
+
+	for (var i = 0 ; i < systems_list.length ; i++) {
+		url += '&node' + i + '=' + systems_list[i];
+	}
+
+	msg_div_id = msgarea_id;
+	err_div_id = errarea_id;
+	err_if_clumember = err;
+	initiate_async_get(url, get_system_info_callback);
+}
+
+function get_system_info_callback() {
+	return check_ajax_xml(xmlHttp_object, system_info_check);
+}
+
+function system_info_check(ret_status, obj) {
+	if (ret_status === null) {
+		return;
+	}
+
+	if (ret_status !== true) {
+		/* A communication error occurred. */
+		alert(obj);
+		return;
+	}
+
+	var err = get_ricci_response_status(obj.responseXML);
+	if (err !== null && err.length > 0) {
+		alert(err.join('\n'));
+		return;
+	}
+
+	try {
+		obj = obj.responseXML.getElementsByTagName('dict')[0];
+	} catch (e) {
+		alert('Received a malformed response from the luci server.');
+		return;
+	}
+
+	var elem = obj.getElementsByTagName('dict');
+	var node_props = [];
+	for (var i = 0 ; i < elem.length ; i++) {
+		var elem_type = elem[i].getAttribute('name');
+		if (elem_type != 'clusternodes') {
+			continue;
+		}
+		var cur_node_props = [];
+		var var_elem = elem[i].getElementsByTagName('var');
+		for (var j = 0 ; j < var_elem.length ; j++) {
+			try {
+				var cur_name = var_elem[j].getAttribute('name');
+				var cur_value = var_elem[j].getAttribute('value');
+				cur_node_props[cur_name] = cur_value;
+			} catch (e) {
+				continue;
+			}
+		}
+		try {
+			node_props[cur_node_props['hostname']] = cur_node_props;
+		} catch (e) {
+			continue;
+		}
+	}
+
+	var errors = [];
+	var msgs = [];
+	var systems_list = get_systems_list_offsets(errors);
+
+	for (var i = 0 ; i < systems_list.length ; i++) {
+		var cur_node_props = node_props[systems_list[i][0]];
+		var cur_sys_name = systems_list[i][0];
+		var offset = systems_list[i][1];
+		try {
+			var addr_elem = document.getElementById('__SYSTEM' + offset + ':Addr');
+			var pwd_elem = document.getElementById('__SYSTEM' + offset + ':Passwd');
+			var fp_elem = document.getElementById('__SYSTEM' + offset + 'Fingerprint');
+
+			if (cur_node_props['available'] != 'True') {
+				errors.push(cur_node_props['err_msg']);
+				set_form_err(addr_elem);
+				set_form_err(pwd_elem);
+			} else if (cur_node_props['key_fp']) {
+				msgs.push('Host ' + cur_sys_name + ' has SSL key fingerprint ' + cur_node_props['key_fp']);
+				fp_elem.src = 'lock-closed.png';
+				fp_elem.title = cur_node_props['key_fp'];
+
+				try {
+					if (err_if_clumember && cur_node_props['cluname'] && !str_is_blank(cur_node_props['cluname'])) {
+						errors.push('Host ' + cur_sys_name + ' is already a member of the cluster named "' + cur_node_props['cluname'] + '"');
+						set_form_err(addr_elem);
+						clr_form_err(pwd_elem);
+					} else {
+						clr_form_err(addr_elem);
+						clr_form_err(pwd_elem);
+					}
+				} catch (e1) {
+					throw e1;
+				}
+			}
+		} catch (e) {
+			alert(e);
+		}
+	}
+
+	if (errors.length > 0) {
+		display_msgs(err_div_id, errors);
+	}
+
+	if (msgs.length > 0) {
+		display_msgs(msg_div_id, msgs);
+	}
+}
/cvs/cluster/conga/luci/plone-custom/validate_auth.js,v  -->  standard output
revision 1.1
--- conga/luci/plone-custom/validate_auth.js
+++ -	2008-01-22 15:02:34.959260000 +0000
@@ -0,0 +1,143 @@
+/*
+** Copyright (C) 2007-2008 Red Hat, Inc.
+**
+** This program is free software; you can redistribute
+** it and/or modify it under the terms of version 2 of the
+** GNU General Public License as published by the
+** Free Software Foundation.
+*/
+
+var err_div_id = null;
+var msg_div_id = null;
+
+function validate_auth_form(form, msgarea_id, errarea_id) {
+	var url = '/luci/cluster?pagetype=1003';
+	var errors = [];
+	var systems_list = get_systems_list(errors);
+
+	if (error_dialog(errors)) {
+		return (null);
+	}
+
+	if (systems_list.length < 1) {
+		alert('No system names were entered');
+		return (null);
+	}
+
+	try {
+		hide_msgs(errarea_id);
+		hide_msgs(msgarea_id);
+	} catch (e) {
+	}
+
+	msg_div_id = msgarea_id;
+	err_div_id = errarea_id;
+	initiate_async_post(form, url, validate_auth_callback);
+}
+
+function validate_auth_callback() {
+	return check_ajax_xml(xmlHttp_object, validate_auth_check);
+}
+
+function validate_auth_check(ret_status, obj) {
+	if (ret_status === null) {
+		return;
+	}
+
+	if (ret_status !== true) {
+		/* A communication error occurred. */
+		alert(obj);
+		return;
+	}
+
+	var err = get_ricci_response_status(obj.responseXML);
+	if (err !== null && err.length > 0) {
+		alert(err.join('\n'));
+		return;
+	}
+
+	try {
+		obj = obj.responseXML.getElementsByTagName('dict')[0];
+	} catch (e) {
+		alert('Received a malformed response from the luci server.');
+		return;
+	}
+
+	var elem = obj.getElementsByTagName('dict');
+	var node_props = [];
+	for (var i = 0 ; i < elem.length ; i++) {
+		var elem_type = elem[i].getAttribute('name');
+		if (elem_type != 'clusternodes') {
+			continue;
+		}
+		var cur_node_props = [];
+		var var_elem = elem[i].getElementsByTagName('var');
+		for (var j = 0 ; j < var_elem.length ; j++) {
+			try {
+				var cur_name = var_elem[j].getAttribute('name');
+				var cur_value = var_elem[j].getAttribute('value');
+				cur_node_props[cur_name] = cur_value;
+			} catch (e) {
+				continue;
+			}
+		}
+		try {
+			node_props[cur_node_props['hostname']] = cur_node_props;
+		} catch (e) {
+			continue;
+		}
+	}
+
+	var errors = [];
+	var msgs = [];
+	var systems_list = get_systems_list_offsets(errors);
+
+	for (var i = 0 ; i < systems_list.length ; i++) {
+		var cur_node_props = node_props[systems_list[i][0]];
+		var cur_sys_name = systems_list[i][0];
+		var offset = systems_list[i][1];
+		try {
+			var addr_elem = document.getElementById('__SYSTEM' + offset + ':Addr');
+			var pwd_elem = document.getElementById('__SYSTEM' + offset + ':Passwd');
+			var fp_elem = document.getElementById('__SYSTEM' + offset + 'Fingerprint');
+
+			if (cur_node_props['available'] != 'True') {
+				set_form_err(addr_elem);
+				clr_form_err(pwd_elem);
+				errors.push('Unable to connect to host ' + cur_sys_name + ' to authenticate: ' + cur_node_props['err_msg']);
+			} else {
+				var has_valid_fp = false;
+
+				if (cur_node_props['key_fp']) {
+					fp_elem.src = 'lock-closed.png';
+					fp_elem.title = cur_node_props['key_fp'];
+					has_valid_fp = true;
+				}
+
+				if (cur_node_props['authed'] != 'True') {
+					errors.push('Authentication for host ' + cur_sys_name + ' failed.');
+					clr_form_err(addr_elem);
+					set_form_err(pwd_elem);
+				} else {
+					var success_msg = 'Host ' + cur_sys_name + ' was authenticated successfully';
+					if (has_valid_fp === true) {
+						success_msg += ' (SSL key fingerprint ' + cur_node_props['key_fp'] + ')';
+					}
+					msgs.push(success_msg);
+					clr_form_err(addr_elem);
+					clr_form_err(pwd_elem);
+				}
+			}
+		} catch (e) {
+			alert(e);
+		}
+	}
+
+	if (errors.length > 0) {
+		display_msgs(err_div_id, errors);
+	}
+
+	if (msgs.length > 0) {
+		display_msgs(msg_div_id, msgs);
+	}
+}
--- conga/luci/plone-custom/conga.js	2008/01/02 20:52:23	1.11
+++ conga/luci/plone-custom/conga.js	2008/01/22 15:02:33	1.12
@@ -28,6 +28,56 @@
 	}
 }
 
+function hide_msgs(id) {
+	var elem = document.getElementById(id);
+	if (!elem) {
+		return (-1);
+	}
+	elem.className += ' invisible';
+
+	var ul_elem = elem.getElementsByTagName('ul');
+	if (ul_elem) {
+		var ul_elem = ul_elem[0];
+		while (ul_elem.firstChild) {
+			ul_elem.removeChild(ul_elem.firstChild);
+		}
+	}
+}
+
+function display_msgs(id, msg_list) {
+	if (!msg_list || msg_list.length < 1) {
+		return (-1);
+	}
+
+	var elem = document.getElementById(id);
+	if (!elem) {
+		return (-1);
+	}
+
+	var ul_elem = elem.getElementsByTagName('ul');
+	if (!ul_elem || ul_elem.length < 1) {
+		return (-1);
+	}
+
+	ul_elem = ul_elem[0];
+
+	for (var i = 0 ; i < msg_list.length ; i++) {
+		var li_elem = document.createElement('li');
+		li_elem.className = 'statusmsg';
+		try {
+			li_elem.appendChild(document.createTextElement(msg_list[i]));
+		} catch (e) {
+			li_elem.innerHTML = msg_list[i];
+		}
+		ul_elem.appendChild(li_elem);
+	}
+
+	try {
+		elem.className = elem.className.replace(/invisible/gi,'');
+	} catch (e) {
+	}
+}
+
 function popup_window(url, width_percent, height_percent) {
 	var width = window.innerWidth * (width_percent / 100);
 	var height = window.innerHeight * (height_percent / 100);
--- conga/luci/plone-custom/conga_ajax.js	2008/01/02 20:52:23	1.7
+++ conga/luci/plone-custom/conga_ajax.js	2008/01/22 15:02:33	1.8
@@ -68,7 +68,7 @@
 	xmlHttp_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
 	xmlHttp_object.setRequestHeader("Content-length", form_data_str.length);
 	xmlHttp_object.setRequestHeader("Connection", "close");
-	xmlHttp_object.send(form_data_str);
+	xmlHttp_object.send(form_data_str.substr(0, form_data_str.length - 1));
 }
 
 function get_ajax_msgs(obj, tag_name) {
--- conga/luci/cluster/form-chooser	2008/01/02 20:52:22	1.23
+++ conga/luci/cluster/form-chooser	2008/01/22 15:02:33	1.24
@@ -225,6 +225,10 @@
 	<tal:block tal:condition="python: ptype == '1000'">
 		<div metal:use-macro="here/form-macros/macros/get-cluster-members-form" />
 	</tal:block>
+
+	<tal:block tal:condition="python: ptype == '1002'">
+		<div metal:use-macro="here/form-macros/macros/get-system-info-form" />
+	</tal:block>
 </tal:block>
 </metal:choose-form>
 
--- conga/luci/cluster/form-macros	2008/01/02 20:52:22	1.218
+++ conga/luci/cluster/form-macros	2008/01/22 15:02:33	1.219
@@ -153,14 +153,12 @@
 </div>
 
 <div metal:define-macro="clusteradd-form">
-	<script type="text/javascript"
-		src="/luci/homebase/homebase_common.js">
-	</script>
-	<script type="text/javascript"
-		src="/luci/homebase/validate_cluster_add.js">
-	</script>
-	<script type="text/javascript"
-		src="validate_create_gulm.js">
+	<script type="text/javascript" src="/luci/homebase/homebase_common.js"></script>
+	<script type="text/javascript" src="/luci/homebase/validate_cluster_add.js"></script>
+	<script type="text/javascript" src="validate_create_gulm.js"></script>
+	<script type="text/javascript" src="conga_ajax.js"></script>
+	<script type="text/javascript" src="update_hostinfo.js"></script>
+	
 	<script type="text/javascript">
 		set_page_title('Luci — cluster — Deploy a cluster');
 	</script>
@@ -193,10 +191,7 @@
 				<tr class="systemsTable">
 					<th class="systemsTable">Node Hostname</th>
 					<th class="systemsTable">Root Password</th>
-					<tal:block tal:condition="add_cluster">
-						<th class="systemsTable">Key ID</th>
-						<th class="systemsTable">Trust</th>
-					</tal:block>
+					<th class="systemsTable">Key ID</th>
 					<th></th>
 				</tr>
 			</thead>
@@ -227,18 +222,15 @@
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<input type="checkbox" name="enable_storage"
 						tal:attributes="
-							checked add_cluster/shared_storage |string:checked" />
-					Enable Shared Storage Support
+							checked add_cluster/shared_storage |string:checked" />Enable Shared Storage Support
+				</td></tr>
+				<tr class="systemsTable"><td colspan="2" class="systemsTable">
+					<input type="checkbox" name="reboot_nodes"
+						tal:attributes="checked python:(add_cluster and add_cluster.get('reboot_nodes')) and 'checked' or ''" />Reboot nodes before joining cluster
 				</td></tr>
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<ul class="vanilla">
 						<li class="vanilla">
-							<input name="check_certs" type="checkbox"
-								id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)" />
-							View system certificates before sending any passwords.
-						</li>
-						<li class="vanilla">
 							<input type="checkbox"
 								name="allSameCheckBox" id="allSameCheckBox"
 								onClick="allPasswdsSame(this.form)"
@@ -349,7 +341,7 @@
 					tal:attributes="id python: '__SYSTEM_ROW_%d' % cur_sysnum"
 					tal:define="sys python: add_cluster['nodes'][cur_sys]">
 					<td class="systemsTable">
-						<input type="text"
+						<input type="text" onchange="reset_system_info(this)"
 							tal:attributes="
 								value sys/host | nothing;
 								id python: '__SYSTEM%d:Addr' % cur_sysnum;
@@ -379,25 +371,12 @@
 									name python: '__SYSTEM%d:Passwd' % cur_sysnum" />
 						</tal:block>
 					</td>
-					<td tal:condition="add_cluster" class="systemsTable">
+					<td class="systemsTable">
 						<img
 							tal:attributes="
+								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
 								src python: 'trusted' in sys and 'lock-ok.png' or ('fp' in sys and 'lock-closed.png' or 'lock-open.png');
 								title sys/fp | string:no key fingerprint available" />
-						<input type="hidden"
-							tal:condition="exists: sys/fp"
-							tal:attributes="
-								id python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								name python: '__SYSTEM%dFingerprint' % cur_sysnum;
-								value sys/fp | nothing" />
-					</td>
-					<td tal:condition="add_cluster" class="systemsTable">
-						<input type="checkbox" tal:attributes="
-							checked exists: sys/fp;
-							id python: '__SYSTEM%dTrusted' % cur_sysnum;
-							name python: '__SYSTEM%dTrusted' % cur_sysnum;
-							disabled python: 'trusted' in sys"
-						/>
 					</td>
 					<td class="systemsTable">
 						<img src="delete-row.png" class="deleteRow"
@@ -408,12 +387,13 @@
 				</tr>
 				<tal:block
 					tal:define="global cur_sysnum python: cur_sysnum + 1" />
-			 </tal:block>
+				 </tal:block>
 
 				<tr class="systemsTable" id="__SYSTEM_ROW_0"
 					tal:condition="not: add_cluster">
 					<td class="systemsTable">
 						<input class="hbInputSys" type="text"
+							onchange="reset_system_info(this)"
 							id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
 					</td>
 					<td class="systemsTable">
@@ -423,6 +403,10 @@
 							id="__SYSTEM0:Passwd" name="__SYSTEM0:Passwd" />
 					</td>
 					<td class="systemsTable">
+						<img id="__SYSTEM0Fingerprint" src="lock-open.png"
+							title="no key fingerprint available" />
+					</td>
+					<td class="systemsTable">
 						<img src="delete-row.png" class="deleteRow"
 							title="delete this row"
 							onclick="delete_element_id('__SYSTEM_ROW_0')" />
@@ -432,6 +416,7 @@
 					tal:condition="not: add_cluster">
 					<td class="systemsTable">
 						<input class="hbInputSys" type="text"
+							onchange="reset_system_info(this)"
 							id="__SYSTEM1:Addr" name="__SYSTEM1:Addr" />
 					</td>
 					<td class="systemsTable">
@@ -441,6 +426,10 @@
 							id="__SYSTEM1:Passwd" name="__SYSTEM1:Passwd" />
 					</td>
 					<td class="systemsTable">
+						<img id="__SYSTEM1Fingerprint" src="lock-open.png"
+							title="no key fingerprint available" />
+					</td>
+					<td class="systemsTable">
 						<img src="delete-row.png" class="deleteRow"
 							title="delete this row"
 							onclick="delete_element_id('__SYSTEM_ROW_1')" />
@@ -450,6 +439,7 @@
 					tal:condition="not: add_cluster">
 					<td class="systemsTable">
 						<input class="hbInputSys" type="text"
+							onchange="reset_system_info(this)"
 							id="__SYSTEM2:Addr" name="__SYSTEM2:Addr" />
 					</td>
 					<td class="systemsTable">
@@ -459,6 +449,10 @@
 							id="__SYSTEM2:Passwd" name="__SYSTEM2:Passwd" />
 					</td>
 					<td class="systemsTable">
+						<img id="__SYSTEM2Fingerprint" src="lock-open.png"
+							title="no key fingerprint available" />
+					</td>
+					<td class="systemsTable">
 						<img src="delete-row.png" class="deleteRow"
 							title="delete this row"
 							onclick="delete_element_id('__SYSTEM_ROW_2')" />
@@ -471,6 +465,12 @@
 		<input name="numStorage" id="numStorage" type="hidden"
 			tal:attributes="value cur_sysnum" />
 
+		<div class="hbSubmit">
+			<input type="button" name="View SSL cert fingerprints"
+				value="View SSL cert fingerprints"
+				onclick="get_system_info('retmsgsdiv', 'errmsgsdiv', 1)" />
+		</div>
+
 		<div class="hbSubmit" id="hbSubmit">
 			<input type="hidden" name="cluster_create" value="1" />
 			<input type="button" name="Submit" value="Submit"
@@ -1102,10 +1102,7 @@
 				<tr class="systemsTable">
 					<th class="systemsTable">Node Hostname</th>
 					<th class="systemsTable">Root Password</th>
-					<tal:block tal:condition="add_cluster">
-						<th class="systemsTable">Key ID</th>
-						<th class="systemsTable">Trust</th>
-					</tal:block>
+					<th class="systemsTable">Key ID</th>
 					<th></th>
 				</tr>
 			</thead>
@@ -1136,17 +1133,14 @@
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<input type="checkbox" name="enable_storage"
 						tal:attributes="
-							checked add_cluster/shared_storage | string:checked" />
-					Enable Shared Storage Support
+							checked add_cluster/shared_storage | string:checked" />Enable Shared Storage Support
+				</td></tr>
+				<tr class="systemsTable"><td colspan="2" class="systemsTable">
+					<input type="checkbox" name="reboot_nodes"
+						tal:attributes="checked python:(add_cluster and add_cluster.get('reboot_nodes')) and 'checked' or ''" />Reboot nodes before joining cluster
 				</td></tr>
 				<tr class="systemsTable"><td colspan="2" class="systemsTable">
 					<ul class="vanilla">
-						<li class="vanilla">
-							<input name="check_certs" type="checkbox"
-								id="view_certs"
-								onchange="view_certs_only(this.form, this.checked)" />
-							View system certificates before sending any passwords.
-						</li>
 						<li class="vanilla"
 							tal:attributes="id python: (not add_cluster or ('nodes' in add_cluster and len(add_cluster['nodes']) < 2)) and 'allSameDiv'">
 							<input type="checkbox"
@@ -1170,7 +1164,7 @@
 					tal:attributes="id python: '__SYSTEM_ROW_%d' % cur_sysnum"
 					tal:define="sys python: add_cluster['nodes'][cur_sys]">
 					<td class="systemsTable">
-						<input type="text"
+						<input type="text" onchange="reset_system_info(this)"
 							tal:attributes="
 								value sys/host | nothing;
 								id python: '__SYSTEM%d:Addr' % cur_sysnum;
@@ -1214,10 +1208,10 @@
 					</td>
 					<td tal:condition="add_cluster" class="systemsTable">
 						<input type="checkbox" tal:attributes="
-							checked exists: sys/fp;
+							checked python: sys.has_key('fp') or sys.has_key('trusted');
 							id python: '__SYSTEM%dTrusted' % cur_sysnum;
 							name python: '__SYSTEM%dTrusted' % cur_sysnum;
-							disabled python: 'trusted' in sys"
+							disabled python: sys.has_key('trusted')"
 						/>
 					</td>
 					<td class="systemsTable">
@@ -1235,6 +1229,7 @@
 					tal:condition="not: add_cluster">
 					<td class="systemsTable">
 						<input class="hbInputSys" type="text"
+							onchange="reset_system_info(this)"
 							id="__SYSTEM0:Addr" name="__SYSTEM0:Addr" />
 					</td>
 					<td class="systemsTable">
@@ -1323,5 +1318,9 @@
 	<tal:block tal:define="ret python: here.get_cluster_nodes_async(request)" />
 </div>
 
+<div metal:define-macro="get-system-info-form">
+	<tal:block tal:define="ret python: here.get_sysinfo_async(request)" />
+</div>
+
 </body>
 </html>
--- conga/luci/cluster/index_html	2007/11/27 16:58:19	1.40
+++ conga/luci/cluster/index_html	2008/01/22 15:02:33	1.41
@@ -214,35 +214,38 @@
 		</div>
 	</div>
 
-	<tal:block tal:condition="python: request.SESSION.has_key('checkRet')">
-		<tal:block tal:define="ret python: request.SESSION.get('checkRet')">
-		<div class="retmsgs" id="retmsgsdiv" tal:condition="python:(ret and 'messages' in ret and len(ret['messages']))">
+	<tal:block tal:define="ret python: request.SESSION.get('checkRet')">
+		<div id="retmsgsdiv"
+			tal:attributes="class python:'retmsgs' + ((ret and ret.get('messages') and len(ret.get('messages')) > 0) and ' ' or ' invisible')">
 			<div class="hbclosebox">
-				<img onclick="hide_element('retmsgsdiv')"
+				<img onclick="hide_msgs('retmsgsdiv')"
 					src="x.png" class="closeBox" title="dismiss" />
 			</div>
 			<p class="retmsgs">Status messages:</p>
-			<ul class="statusmsg">
-				<tal:block tal:repeat="e python:ret['messages']">
-					<li class="statusmsg" tal:content="python:e" />
+			<ul class="statusmsg" id="statusmsglist">
+				<tal:block tal:condition="exists:ret/messages"
+					tal:repeat="e ret/messages">
+					<li class="statusmsg" tal:content="e" />
 				</tal:block>
 			</ul>
 		</div>
 
-		<div id="errmsgsdiv" class="errmsgs" tal:condition="python:(ret and 'errors' in ret and len(ret['errors']))">
+		<div id="errmsgsdiv"
+			tal:attributes="class python:'errmsgs' + ((ret and ret.get('errors') and len(ret.get('errors')) > 0) and ' ' or ' invisible')">
 			<div class="hbclosebox">
-				<img onclick="hide_element('errmsgsdiv')"
+				<img onclick="hide_msgs('errmsgsdiv')"
 					src="x.png" class="closeBox" title="dismiss" />
 			</div>
 			<p class="errmsgs">The following errors occurred:</p>
-			<ul class="statusmsg">
-				<tal:block tal:repeat="e python:ret['errors']">
-					<li class="statusmsg" tal:content="python:e" />
+			<ul class="statusmsg" id="errmsglist">
+				<tal:block tal:condition="exists:ret/errors"
+					tal:repeat="e ret/errors">
+					<li class="statusmsg" tal:content="e" />
 				</tal:block>
 			</ul>
 		</div>
-		</tal:block>
 	</tal:block>
+
                   </div>
 
                 </div>


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]