From d0f2e4efbd3eb0f1d7f5a28e7f97c1fb4ec027bb Mon Sep 17 00:00:00 2001 From: PKI Team Date: Tue, 18 Mar 2008 22:36:57 +0000 Subject: Initial open source version based upon proprietary Red Hat Certificate System (RHCS) 7.3. git-svn-id: svn+ssh://svn.fedorahosted.org/svn/pki/trunk@2 c9f7a03b-bd48-0410-a16d-cbbf54688b0b --- .../src/com/netscape/admin/certsrv/CMSAdmin.java | 969 +++++++++++++++++++++ 1 file changed, 969 insertions(+) create mode 100644 pki/base/console/src/com/netscape/admin/certsrv/CMSAdmin.java (limited to 'pki/base/console/src/com/netscape/admin/certsrv/CMSAdmin.java') diff --git a/pki/base/console/src/com/netscape/admin/certsrv/CMSAdmin.java b/pki/base/console/src/com/netscape/admin/certsrv/CMSAdmin.java new file mode 100644 index 000000000..fe0d7edd7 --- /dev/null +++ b/pki/base/console/src/com/netscape/admin/certsrv/CMSAdmin.java @@ -0,0 +1,969 @@ +// --- BEGIN COPYRIGHT BLOCK --- +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; version 2 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License along +// with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +// +// (C) 2007 Red Hat, Inc. +// All rights reserved. +// --- END COPYRIGHT BLOCK --- +package com.netscape.admin.certsrv; + +import java.util.*; +import java.net.*; +import java.awt.*; +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import com.netscape.certsrv.common.*; +import com.netscape.management.client.*; +import com.netscape.management.client.topology.*; +import com.netscape.management.client.console.*; +import com.netscape.management.client.util.*; +import com.netscape.admin.certsrv.config.install.*; +import com.netscape.admin.certsrv.task.*; +import com.netscape.admin.certsrv.wizard.*; +import netscape.ldap.*; + +/** + * Netscape Certificate Server 4.0 configuration entry point. The + * directory server needs to contain the name of this class in order + * for the topology view to load this class. + * + * @author Jack Pan-Chen + * @author Thomas Kwan + * @version $Revision: 14593 $, $Date: 2007-05-01 16:35:45 -0700 (Tue, 01 May 2007) $ + * @date 01/12/97 + */ +public class CMSAdmin extends AbstractServerObject + implements IWizardDone, IRemovableServerObject, IMenuInfo +{ + + /*========================================================== + * variables + *==========================================================*/ + private static final String PREFIX = "CMSADMIN"; + private static final String START = "start"; + private static final String STOP = "stop"; + private static final String CONFIGURE = "configure"; +// private static final String START_DAEMON_CGI = "Tasks/Operation/StartDaemon"; + + private ConsoleInfo mConsoleInfo; // global information + private CMSServerInfo mServerInfo; // server-specific information + private ConsoleInfo mServerInstanceInfo; + private CMSServerInfo mStatusInfo; // server-specific information + private CMSUIFramework mFramework; // parent frame + private CMSPageFeeder mPagefeeder; // what generates tab views + //private CMSInfoPanel mInfoPanel; // information panel + private RemoteImage mIconImage = null; // server icon + private String mServerID, mServerVersion, mInstallationDate, mServerRoot; + private String mHost = null; // server name + private int mPort = 0; // server port + private String mAdminURL = null; // admin server url + private int mServerStatus = STATUS_UNKNOWN; + private StatusItemText mAuthid; + private JFrame mActiveFrame; + + protected ResourceBundle mResource; //resource boundle + + /*========================================================== + * constructors + *==========================================================*/ + public CMSAdmin() + { + //Debug.setTrace(true); + if (mActiveFrame == null) + mActiveFrame = UtilConsoleGlobals.getActivatedFrame(); + mResource = ResourceBundle.getBundle(CMSAdminResources.class.getName()); + // STATUS_UPDATE_INTERVAL = 1500000; + } + + /*========================================================== + * public methods + *==========================================================*/ + + public int getServerLastKnownStatus() { + return mServerStatus; + } + + /** + * Initialize the page with global information. + * + * @param info global information. + */ + public void initialize(ConsoleInfo info) { + mConsoleInfo = info; + mIconImage = CMSAdminUtil.getImage(CMSAdminResources.IMAGE_CERTICON_SMALL); + getInfo( info.getCurrentDN()); + //getServerStatus(); + if (info.getCurrentDN() == null) { + Debug.println( "initialized CMSAdmin (Standalone mode)"); + } else { + super.initialize( info ); + } + Debug.println( "initialized CMSAdmin for " + mConsoleInfo.getCurrentDN() ); + } + + + /** + * overwrite the base class to add admin port number + * Not sure we want to do this. + * + protected Vector initializeNodeDataVector(String dataKeys[]) { + Vector v = super.initializeNodeDataVector(dataKeys); + if ( mServerInfo != null ) { + int port = mServerInfo.getPort(); + if ( port > 0 ) { + String label = mResource.getString(PREFIX+"_ADMINPORT_LABEL"); + v.addElement(new NodeData("nsServerPort", + label, + Integer.toString(port))); + } + } + return v; + } + */ + + /** + * return the server instance name instead for now + * + * @return return the server name + * + */ + public String getName() { + return ("Certificate Server ("+ mServerID +")"); + } + + + /** + * Return the information panel. - Admin take over this already + * + * @return information panel + * + public Component getCustomPanel() { + if(mInfoPanel == null) + mInfoPanel = new CMSInfoPanel( (IServerObject)this, + mHost, + mPort, + mServerVersion, + mInstallationDate, + mAdminURL); + return mInfoPanel; + } + */ + + /** + * Return connection info for a server instance. + * @return Connection info for a server instance. + */ + public CMSServerInfo getServerInfo() { + return mServerInfo; + } + + public ConsoleInfo getServerInstanceInfo() { + mServerInstanceInfo = (ConsoleInfo)mConsoleInfo.clone(); + return mServerInstanceInfo; + } + + /** + * Returns the global console info. + * + * @return Global console info reference. + **/ + public ConsoleInfo getConsoleInfo() { + return mConsoleInfo; + } + + /** + * This function is called when the certificate server is deselected + * on the topology view. + */ + public void unselect(IPage viewInstance) { +// Debug.println( "DSAdmin unselect" ); + super.unselect(viewInstance); + fireRemoveMenuItems( viewInstance, this ); + } + + /** + * This function is called when the directory server is selected + * on the topology view. + */ + public void select(IPage viewInstance) { +/* + if (_removed) + return; +*/ + + HourGlass hglass = new HourGlass(mActiveFrame); + super.select(viewInstance); // sets _viewInstance used + // by getViewInstance() + Debug.println( "CMSAdmin.select(): viewInstance =" + + getViewInstance() ); + fireAddMenuItems( viewInstance, this ); + if (mPort == 0) { + fireDisableMenuItem(viewInstance, START); + fireDisableMenuItem(viewInstance, STOP); + fireEnableMenuItem(viewInstance, CONFIGURE); + } else if ( getServerStatus() == STATUS_STARTED ) { + fireDisableMenuItem( viewInstance, START ); + fireEnableMenuItem(viewInstance, STOP); + fireDisableMenuItem(viewInstance, CONFIGURE); + } else { + fireEnableMenuItem( viewInstance, START ); + fireDisableMenuItem( viewInstance, STOP ); + fireDisableMenuItem(viewInstance, CONFIGURE); + } + if (hglass != null) { + hglass.setNonWaitCursor(); + hglass = null; + } + } + + /** + * Returns supported menu categories + */ + public String[] getMenuCategoryIDs() { + return new String[] + { + ResourcePage.MENU_CONTEXT, + ResourcePage.MENU_OBJECT + }; + } + + /** + * Add menu items for this page. + * + * @param category Which menu + */ + public IMenuItem[] getMenuItems(String category) { + /* Same for both CONTEXT and OBJECT menus */ + return new IMenuItem[] { + new MenuItemText( CONFIGURE, + CMSAdminResources.MENU_CONFIGURE_SERVER, + CMSAdminResources.MENU_CONFIGURE_SERVER_DESC), + new MenuItemText( START, + CMSAdminResources.MENU_START_SERVER, + CMSAdminResources.MENU_START_SERVER_DESC), + + new MenuItemText( STOP, + CMSAdminResources.MENU_STOP_SERVER, + CMSAdminResources.MENU_STOP_SERVER_DESC), + new MenuItemSeparator() }; + } + + /** + * Notification that a menu item has been selected. + */ + public void actionMenuSelected(IPage viewInstance, IMenuItem item) { + if (item.getID().equals(START)) { + ConsoleInfo info = getServerInstanceInfo(); + /* Fire off the Start task */ + CMSStart task = new CMSStart(); + mConsoleInfo.put(CMSStart.START_TASK_CGI, mServerID); + mConsoleInfo.put("serverRoot",mServerRoot); + mConsoleInfo.put("servid", mServerID); + task.initialize(mConsoleInfo); + //task.setConsoleInfo( info ); + boolean status = task.run( null ); + if( status ) { + getServerStatus(); + enableStartStop(viewInstance); + } + } else if(item.getID().equals(STOP)) { + CMSStop task = new CMSStop(); + ConsoleInfo info = getServerInstanceInfo(); + mConsoleInfo.put(CMSStop.STOP_TASK_CGI, mServerID); + mConsoleInfo.put("servid", mServerID); + mConsoleInfo.put("serverRoot",mServerRoot); + task.initialize(mConsoleInfo); + boolean status = task.run( null ); + if ( status ) { + getServerStatus(); + enableStartStop(viewInstance); + } + } else if (item.getID().equals(CONFIGURE)) { + startupInstallationWizard(viewInstance); + } + } + + public void updateMenu(IPage viewInstance) { + getInfo(getConsoleInfo().getCurrentDN()); + if (mPort != 0) { + fireDisableMenuItem(viewInstance, CONFIGURE); + getServerStatus(); + enableStartStop(viewInstance); + } + } + + /** + * Enable/Disable start/stop action menu. + */ + private void enableStartStop(IPage viewInstance) { + if (mServerStatus == STATUS_STOPPED) { + fireEnableMenuItem( viewInstance, START ); + fireDisableMenuItem( viewInstance, STOP ); + } else if (mServerStatus == STATUS_STARTED) { + fireEnableMenuItem( viewInstance, STOP ); + fireDisableMenuItem( viewInstance, START ); + } + } + + /** + * Set the title bar in the following format:

+     *      [server information] - [server type] - [nickname]
+ * Administrator id is shown at lower status bar + */ + public void updateTitle () { + /* + mAuthid.setState(mResource.getString("CMSADMIN_USER_LABEL")+ + " = "+mServerInfo.getUserId()+" "); + mFramework.getFramework().changeStatusItemState(mAuthid); + */ + String id = mServerID; + int i = id.indexOf( '-' ); + if ( (i > 0) && (i < (id.length()-1)) ) + id = id.substring( i + 1 ); + mFramework.getFramework().setTitle( mServerInfo.getHost()+" - " + + mResource.getString(CMSAdminResources.CERT_SERVER_NAME)+ + " - "+ id ); + } + + private Hashtable createWizardInfo() { + Hashtable data = new Hashtable(); + /* This does nothing + data.put(ConfigConstants.TASKID,TaskId.TASK_LIST_PREVIOUS_STAGES); + data.put(ConfigConstants.OPTYPE, OpDef.OP_READ); + data.put(ConfigConstants.PR_CERT_INSTANCE_NAME, mServerID); + data.put(ConfigConstants.PR_SERVER_ROOT, mServerRoot); + */ + + // moved from WIIntroPage.java + data.put(ConfigConstants.TASKID,TaskId.TASK_GET_DEFAULT_INFO); + data.put(ConfigConstants.OPTYPE, OpDef.OP_READ); + data.put(ConfigConstants.PR_CERT_INSTANCE_NAME, + mConsoleInfo.get(ConfigConstants.PR_CERT_INSTANCE_NAME)); + // #344791 - help server to make up the hostname + data.put(ConfigConstants.PR_HOST, + mConsoleInfo.get(ConfigConstants.PR_HOST)); + data.put(ConfigConstants.PR_SERVER_ROOT, + mConsoleInfo.get(ConfigConstants.PR_SERVER_ROOT)); + return data; + } + + /** + * This is called when the installwizard is done. + */ + public void notify(WizardWidget w) { + Debug.println("Configuration Completed"); + for (int i = 0; i < 10; i++) { // try to detect 10 times + Debug.println("Check Status #" + i); + if ( getServerStatus() == STATUS_STARTED ) { + return; + } + try { + Thread.currentThread().sleep(2000); // 2 seconds + } catch (Exception e) { + } + } + } + + /** + * Start up the installation wizard + */ + public void startupInstallationWizard(IPage viewInstance) { + Hashtable data = new Hashtable(); + CMSStartDaemon daemon = new CMSStartDaemon(); + mConsoleInfo.put("servid", mServerID); + mConsoleInfo.put(CMSStartDaemon.START_DAEMON_CGI, mServerID); + mConsoleInfo.put(CMSConfigCert.CONFIG_CERT_CGI, mServerID); + daemon.initialize(mConsoleInfo); + data.put(ConfigConstants.PR_CERT_INSTANCE_NAME, mServerID); + Debug.println("about to run Daemon"); + boolean success = daemon.runDaemon(data); + Debug.println("run daemon success = "+success); + data.clear(); + data = null; + boolean isInfoReady = false; + + if (success) { + InstallWizardInfo wizardInfo = + new InstallWizardInfo(mConsoleInfo); + wizardInfo.setAdminFrame(mActiveFrame); + Debug.println("CMSAdmin: creating new configCertCgi"); + CMSConfigCert configCertCgi = new CMSConfigCert(); + configCertCgi.initialize(wizardInfo); + Debug.println("CMSAdmin: back from creating new configCertCgi"); + data = createWizardInfo(); + isInfoReady = configCertCgi.configCert(data); + Debug.println("CMSAdmin: isInfoReady = "+isInfoReady); + + if (isInfoReady) { + JFrame frame = new JFrame(); + Cursor cursor = new Cursor(Cursor.HAND_CURSOR); + frame.setCursor(cursor); + frame.invalidate(); + frame.validate(); + frame.repaint(1); + // XXX - checking status is too slow, dont do it now. + // InstallWizard wizard = new InstallWizard( + // mConsoleInfo.getFrame(), wizardInfo, this); + InstallWizard wizard = new InstallWizard(mActiveFrame, + wizardInfo, null); + wizardInfo.setAdminFrame(mActiveFrame); + wizardInfo.put("viewInstance", viewInstance); + wizardInfo.put("CMSAdmin", this); + new Thread(wizard).start(); + } + } + data.clear(); + data = null; + mServerStatus = STATUS_UNKNOWN; + } + + /** + * This function is called when the server is double clicked on + * the topology view. Auth dialog is displayed to get user dn and pwd. + */ + public boolean run(IPage viewInstance) { + + Debug.println("The user double click the icon "+getConsoleInfo().getCurrentDN()); + Debug.println("View instance in the run method -> "+viewInstance); + + if (getConsoleInfo().getCurrentDN() == null) { + mServerID = (String)mConsoleInfo.get("cmsServerInstance"); + } + + mConsoleInfo.put(CMSRestart.RESTART_TASK_CGI, mServerID); + mConsoleInfo.put(CMSStart.START_TASK_CGI, mServerID); + mConsoleInfo.put(CMSStop.STOP_TASK_CGI, mServerID); + mConsoleInfo.put("CMSAdmin", this); + if (mPort == 0) { + getInfo(getConsoleInfo().getCurrentDN()); + if (mPort == 0) { + startupInstallationWizard(viewInstance); + return false; + } + } + + if (getConsoleInfo().getCurrentDN() == null) { + mHost = (String)mConsoleInfo.get("cmsHost"); + mPort = Integer.parseInt((String)mConsoleInfo.get("cmsPort")); + } else { + try { + LDAPConnection ldc = mConsoleInfo.getLDAPConnection(); + if ( ldc == null ) { + Debug.println( "No connection ready in ConsoelInfo" ); + ldc = new LDAPConnection(); + ldc.connect( mConsoleInfo.getHost(), mConsoleInfo.getPort(), + mConsoleInfo.getAuthenticationDN(), + mConsoleInfo.getAuthenticationPassword()); + } + //Debug.println( "Fetching " + sBase + " from " + + // mConsoleInfo.getHost() + ":" + mConsoleInfo.getPort() ); + LDAPEntry entry = ldc.read( mConsoleInfo.getCurrentDN() ); + //Debug.println( "Got " + entry ); + + try { + String port = getAttrVal(entry, "nsserverport"); + + if (port == null) + return false; + else { + int portnum = Integer.parseInt(port); + if (portnum != mPort) + mPort = portnum; + } + } catch (Exception e) { + return false; + } + } catch (LDAPException ex) { + CMSAdminUtil.showErrorDialog(mConsoleInfo.getFrame(), mResource, + ex.toString(), CMSAdminUtil.ERROR_MESSAGE); + } + } + + try { + // server off + if (getServerStatus() != STATUS_STARTED) { + CMSAdminUtil.showMessageDialog(mConsoleInfo.getFrame(), mResource, PREFIX, + "SERVEROFF", CMSAdminUtil.ERROR_MESSAGE); + return false; + } + +/* + mServerInfo = new CMSServerInfo(mHost, mPort, d.getUsername(), + d.getPassword(), + mServerID, mInstallationDate, mServerVersion, mServerRoot); +*/ + String path = (String)mConsoleInfo.get("cmsPath"); + mServerInfo = new CMSServerInfo(mHost, mPort, "","", + mServerID, mInstallationDate, mServerVersion, mServerRoot, path); + + + String authType = mServerInfo.getAuthType(); + + // server is alive, do authenticate if the server asks for + // password-based authentication + if (authType.equals("pwd")) { + CMSPassword d = new CMSPassword(mActiveFrame); + d.show(); + if (d.isCancel()) + return false; + mServerInfo = new CMSServerInfo(mHost, mPort, d.getUsername(), + d.getPassword(), + mServerID, mInstallationDate, mServerVersion, mServerRoot, path); + mServerInfo.authenticate(); + } + mConsoleInfo.put("serverInfo", mServerInfo); + } catch (EAdminException ex) { + System.exit(0); // exit if authentication fails + CMSAdminUtil.showErrorDialog(mConsoleInfo.getFrame(), mResource, + ex.getMessage(), CMSAdminUtil.ERROR_MESSAGE); + return false; + } + + + //LOAD UI FRAMEWORK + try { + mFramework = new CMSUIFramework(mConsoleInfo, mServerInfo); + } catch (EAdminException e) { + CMSAdminUtil.showErrorDialog(mConsoleInfo.getFrame(), mResource, + e.getMessage(), CMSAdminUtil.ERROR_MESSAGE); + return false; + } + + //show secure status + StatusItemSecureMode statusSecureMode = new StatusItemSecureMode(Framework.STATUS_SECURE_MODE); + statusSecureMode.setSecureMode(true); + mFramework.getFramework().addStatusItem(statusSecureMode, IStatusItem.LEFTFIRST); + statusSecureMode.setToolTipText(mServerInfo.getHost()+":"+mServerInfo.getPort()); + + //show login status + updateTitle (); + return true; + } + + /** + * Run the object + * @param viewInstance CMSPageFeeder object + * @param selectionList List of selected objects + */ + public boolean run(IPage viewInstance, IResourceObject selectionList[]) { + return run( viewInstance ); + } + + /** + * perform the specified action. The command string is specified either + * from the content menu or the menu bar. + * + * @param command Command String + */ + public void performAction(String command) { + + } + + /** + * Return the server icon. + * + * @return The Directory Server icon. + */ + public Icon getIcon() { + return mIconImage; + } + + public int getStatus() { + return mServerStatus; + } + + /** + * Return the current status of the server (running or not). + * + * @return The Certificate Server status. + */ + public int getServerStatus() { + Debug.println("Check server status"); + if (getConsoleInfo().getCurrentDN() == null) { + return STATUS_STARTED; + } else { + if ( mPort == 0) { + mServerStatus = STATUS_UNKNOWN; + return STATUS_UNKNOWN; + } + try { + ConsoleInfo info = getServerInstanceInfo(); + CMSStatus task = new CMSStatus(); + mConsoleInfo.put(CMSStatus.STATUS_TASK_CGI, mServerID); + mConsoleInfo.put("serverRoot",mServerRoot); + mConsoleInfo.put("servid", mServerID); + task.initialize(mConsoleInfo); + //task.setConsoleInfo( info ); + boolean status = task.run( null ); + if( status) { + mServerStatus = STATUS_STARTED; + return STATUS_STARTED; + } + else{ + mServerStatus = STATUS_STOPPED; + return STATUS_STOPPED; + } + } + catch (Exception e) { + String bob = e.toString(); + Debug.println(bob); + if (Debug.isEnabled()) + e.printStackTrace(); + return STATUS_UNKNOWN; + } + } + } + + + /** + * Return the current status of the server (running or not) + * by pinging the agent HTTPS port. + * + * @return The Certificate Server status. + */ + public boolean getStatusFromAgentPort() { + + if (mPort == 0) { + getInfo(getConsoleInfo().getCurrentDN()); + if (mPort == 0) { + //Debug.println("CMSAdmin: getServerStatus --> "+mServerStatus); + return false; + } + } + + //check if ssl port is functional + try { + if ((mServerInfo == null) || (mServerInfo.getPort() == 0)) { + String path = (String)mConsoleInfo.get("cmsPath"); + mServerInfo = new CMSServerInfo(mHost, mPort, "", "", + mServerID, mInstallationDate, mServerVersion, mServerRoot, path); + } + + mServerInfo.ping(); + + } catch (EAdminException e) { + Debug.println("CMSAdmin: getServerStatus() -"+e.toString()); + if (e.getMessageString().equals(CMSAdminResources.SERVER_NORESPONSE) || + e.getMessageString().equals(CMSAdminResources.SERVER_UNREACHABLE) || + e.getMessageString().equals(CMSAdminResources.IOEXCEPTION) || + e.getMessageString().equals(CMSAdminResources.UNKNOWNEXCEPTION) || + e.getMessageString().equals(CMSAdminResources.UNKNOWNHOST) ) { + // mServerStatus = STATUS_STOPPED; + return false; + } + Debug.println("CMSAdmin: getServerStatus() -UNKNOWN"); + // mServerStatus = STATUS_UNKNOWN; + return false; + } + + Debug.println("CMSAdmin: getServerStatus() -OK"); + // mServerStatus = STATUS_STARTED; + return true; + } + + /** + * The concrete class implementing this method will clone its + * configuration from the reference server. This supports using the + * GET method for cloning the server. + * + * @param referenceDN - DN of server to clone from. + */ + public void cloneFrom(String referenceDN) { + //XXX TBD + } + + /** + * Implements the IRemovableServerObject interface. + * @return true if the server was successfully removed, false otherwise + */ + + public boolean removeServer() { + Debug.println("-------------- removeServer() ==== --------------------"); + + Debug.println("getting console obj"); + ConsoleInfo info = getServerInstanceInfo(); + Debug.println("constuctor for remove"); + /* Fire off the Remove task */ + CMSRemove task = new CMSRemove(); + mConsoleInfo.put(CMSRemove.REMOVE_TASK_CGI, mServerID); + mConsoleInfo.put("serverRoot",mServerRoot); + mConsoleInfo.put("servid", mServerID); + Debug.println("initalizing remove"); + task.initialize(mConsoleInfo); + //task.setConsoleInfo( info ); + Debug.println("about to run remove rask"); + boolean status = task.run( null ); + Debug.println("remove run"); + Debug.println("Remove server status: "+ status); + String instance = (String) mConsoleInfo.get("ServerInstance"); + if (null == instance) { + instance = ""; + } + + if (true == status) { /* successfully called remove cgi */ + Debug.println("removing topology for the server"); + LDAPConnection ldc = mConsoleInfo.getLDAPConnection(); + Debug.println("got the ldap connection"); + String[] attrs = { "*", "numsubordinates" }; + String sieDN = mConsoleInfo.getCurrentDN(); + Debug.println("removeServer:sieDN:" + sieDN); + + LDAPEntry sieEntry = null; + try { + sieEntry = ldc.read( sieDN, attrs ); + Debug.println("read a ldap entry"); + } catch (Exception ex ) { + Debug.println( "removeServer <" + sieDN + "> " + ex); + + /* + args[1] = ex.toString(); + DSUtil.showErrorDialog(_info.getFrame(), "removeinstance", + args); + _removed = false; // remove failed + */ + return false; + } + if (sieEntry != null ) { + try { + Debug.println("Calling delete_sieTree"); + status = delete_sieTree(sieEntry ); + } catch (Exception ex ) { + Debug.println( "removeServer:Unable to delete the " + + "tree"); + /* + args[1] = ex.toString(); + DSUtil.showErrorDialog(_info.getFrame(), "removesie", + args); + _removed = false; // remove failed + */ + return false; + } + // Now we need to remove the reference of this server + Debug.println("calling remove_serverinstance"); + status = remove_serverInstance(sieDN); + } + /* + if ( status == false) { + args[1] = ""; + DSUtil.showErrorDialog(_info.getFrame(), "removesie", + args); + } else { + DSUtil.showInformationDialog(_info.getFrame(), "121", + (String)null) ; + } + + */ + } + // CMSAdminUtil.showMessageDialog(mConsoleInfo.getFrame(), mResource, PREFIX, + // "NOTIMPLEMENTED", CMSAdminUtil.ERROR_MESSAGE); + return status; + } + + + + private boolean delete_sieTree (LDAPEntry entry ) + throws LDAPException { + + LDAPConnection ldc = mConsoleInfo.getLDAPConnection(); + boolean ret = false; + + String dn = entry.getDN(); + if ( entryHasChildren( entry ) ) { + LDAPSearchResults search_results = null; + String[] attrs = { "numsubordinates" }; + search_results = ldc.search( dn, + LDAPConnection.SCOPE_ONE, + "(objectClass=*)", attrs, false ); + + while ( search_results.hasMoreElements() ) { + /* Get the next child */ + LDAPEntry child_entry = + (LDAPEntry)search_results.nextElement(); + ret = delete_sieTree( child_entry ); + + } + } + ldc.delete(dn); + return true; + } + + static boolean entryHasChildren( LDAPEntry entry ) { + boolean hasChildren = false; + LDAPAttribute attr = entry.getAttribute( + "numsubordinates" ); + if ( attr != null ) { + Enumeration e = attr.getStringValues(); + if ( e.hasMoreElements() ) { + String s = (String)e.nextElement(); + int count = Integer.parseInt( s ); + if ( count > 0 ) { + hasChildren = true; + } + } + } + return hasChildren; + } + + + private boolean remove_serverInstance (String sieDN ) { + + LDAPSearchResults search_results = null; + String baseDN =(String) mConsoleInfo.get("BaseDN"); + LDAPConnection ldc = mConsoleInfo.getLDAPConnection(); + String[] attrs = { "*", "uniquemember" }; + String filter = "(&(objectclass=groupOfUniquenames)(uniquemember=" + + sieDN+"))"; + + try { + search_results = ldc.search( baseDN, ldc.SCOPE_SUB, + filter, attrs, false); + } catch (LDAPException e) { + Debug.println( "Failed to search - " + e.toString() ); + return false; + } + LDAPEntry entry = null; + while ( search_results.hasMoreElements() ) { + // need to remove the reference to the sieDN from + // this entry. + + entry = (LDAPEntry)search_results.nextElement(); + String eDN = (String) entry.getDN(); + // Now we need to modify the entry to delete the + // reference to the serevr. + remove_intstanceFromEntry(ldc, eDN, sieDN); + } + return true; + } + + private boolean remove_intstanceFromEntry ( LDAPConnection ldc, + String eDN, String sieDN ) { + + LDAPModificationSet mods = new LDAPModificationSet(); + LDAPAttribute attUmember = new LDAPAttribute("uniquemember", sieDN); + Debug.println("DSAdmin:remove_intstanceFromEntry: Modifying entry:" + + eDN); + mods.add( LDAPModification.DELETE, attUmember ); + try { + ldc.modify(eDN, mods ); + } catch ( LDAPException e ) { + Debug.println ( "Modifying " + eDN + ", " + e); + return false; + } + return true; + } + + /*========================================================== + * private methods + *==========================================================*/ + + /** + * Extract a single string + * + * @param entry A Directory entry + * @param name Name of attribute to fetch + * @return A concatenated string + */ + private String getAttrVal( LDAPEntry entry, String name ) { + LDAPAttribute findAttr = + entry.getAttribute( name, LDAPUtil.getLDAPAttributeLocale() ); + if ( findAttr != null ) { + return LDAPUtil.flatting(findAttr); + } +/* + Debug.println( "Attribute " + name + " not found in " + + entry.getDN() ); +*/ + return null; + } + + /** + * get the attribute information to display in the information panel + * + * @param sDN DN for the entry. + */ + private void getInfo(String sDN) { + //String sBase = "cn=configuration, " + sDN; + if (sDN == null) { + mHost = (String)mConsoleInfo.get("cmsHost"); + mPort = Integer.parseInt((String)mConsoleInfo.get("cmsPort")); + } else { + String sBase = sDN; + try { + LDAPConnection ldc = mConsoleInfo.getLDAPConnection(); + if ( ldc == null ) { + Debug.println( "No connection ready in ConsoelInfo" ); + ldc = new LDAPConnection(); + ldc.connect( mConsoleInfo.getHost(), mConsoleInfo.getPort(), + mConsoleInfo.getAuthenticationDN(), + mConsoleInfo.getAuthenticationPassword()); + } + //Debug.println( "Fetching " + sBase + " from " + + // mConsoleInfo.getHost() + ":" + mConsoleInfo.getPort() ); + LDAPEntry entry = ldc.read( sBase ); + //Debug.println( "Got " + entry ); + + mHost = getAttrVal( entry, "serverHostName" ); + try { + String port = getAttrVal(entry, "nsserverport"); + if (port == null) + mPort = 0; + else + mPort = Integer.parseInt(port); + } catch (Exception e) { + mPort = 0; + } + + // get the attribute information for display purposes + mServerVersion = getAttrVal( entry, "serverVersionNumber" ); + mInstallationDate = getAttrVal( entry, "installationTimeStamp" ); + mServerID = getAttrVal( entry, "nsserverid" ); + mServerRoot = getAttrVal( entry, "serverroot" ); + Debug.println("CMSAdmin::PR_HOST = " + mHost); + mConsoleInfo.put(ConfigConstants.PR_HOST, mHost); + mConsoleInfo.put(ConfigConstants.PR_SERVER_ROOT, mServerRoot); + mConsoleInfo.put(ConfigConstants.PR_CERT_INSTANCE_NAME, mServerID); + } catch( Exception e) { + Debug.println( "Fetching " + sBase + " from " + + mConsoleInfo.getHost() + ":" + mConsoleInfo.getPort() + + ", " + e ); + } + + mAdminURL = mConsoleInfo.getAdminURL(); + + /* Extract the username part of the admin authentication DN */ + String[] rdns = LDAPDN.explodeDN( mConsoleInfo.getAuthenticationDN(), + true ); + String s = rdns[0].trim(); + mConsoleInfo.put( "AdminUsername", s ); + //getServerStatus(); + } + } + + /** + * Note: it would be better if this method were declared in the superclass, + * but having it here is better than nothing, since I need access to it + * for getServerStatus() . . . + */ + private IPage getViewInstance() { + return _viewInstance; + } + + public boolean isCloningEnabled() { + return false; + } + + public boolean isMigrationEnabled() { + return false; + } +} -- cgit