package org.ovirt.engine.core.register; import java.io.IOException; import java.io.PrintWriter; import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.ovirt.engine.core.bll.interfaces.BackendInternal; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.VDSType; import org.ovirt.engine.core.common.queries.RegisterVdsParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.LogCompat; import org.ovirt.engine.core.compat.LogFactoryCompat; import org.ovirt.engine.core.dal.VdcBllMessages; import org.ovirt.engine.core.utils.ejb.BeanProxyType; import org.ovirt.engine.core.utils.ejb.BeanType; import org.ovirt.engine.core.utils.ejb.EjbUtils; public class RegisterServlet extends HttpServlet { private static final long serialVersionUID = 2156012277778558480L; public static final String MASK = "255.255.255.0"; public static final String VDS_IP = "vds_ip"; public static final String VDS_NAME = "vds_name"; public static final String VDS_ID = "vds_unique_id"; public static final String PORT = "port"; public static final String OTP = "ticket"; private SimpleDateFormat m_sdfFormatter; private static LogCompat log = LogFactoryCompat.getLog(RegisterServlet.class); @Override public void init() throws ServletException { // yyyy-MM-ddTHH:mm:ss m_sdfFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); m_sdfFormatter.setTimeZone(TimeZone.getTimeZone("UTC")); } private VdcQueryReturnValue runQuery(HttpServletRequest request) { VdcQueryReturnValue fReturn = null; // TODO: should be BackendLocal BackendInternal backend = null; RegisterVdsParameters params = null; // Implement basic sanity: check each parameter exists String strIP = ""; String strName = ""; String strID = ""; int nPort = -1; String otpMessage = ""; try { backend = (BackendInternal) EjbUtils.findBean(BeanType.BACKEND, BeanProxyType.LOCAL); strIP = request.getParameterValues(VDS_IP)[0]; strName = request.getParameterValues(VDS_NAME)[0]; strID = request.getParameterValues(VDS_ID)[0]; nPort = Integer.parseInt(request.getParameterValues(PORT)[0]); String[] otpValues = request.getParameterValues(OTP); String otpString = (otpValues != null && otpValues.length > 0) ? otpValues[0] : null; Long otp = null; // if OTP was provided, assume registering oVirt host if (StringUtils.isNotBlank(otpString)) { otp = Long.parseLong(otpString); otpMessage = ", OTP is set."; } log.debug("Using the following parameters to call query:\nIP: " + strIP + ", Name: " + strName + ", UUID: " + strID + ", Port: " + nPort + otpMessage); params = new RegisterVdsParameters(Guid.Empty, strIP, strName, strID, nPort, MASK, Guid.Empty, VDSType.oVirtNode); params.setOtp(otp); fReturn = backend.runInternalQuery(VdcQueryType.RegisterVds, params); if (fReturn == null) { log.error("Got NULL from backend.RunQuery!"); } } catch (Throwable t) { log.error("Caught exception while trying to run query: ", t); log.error("Parameters used to call query:\nIP: " + strIP + ", Name: " + strName + ", UUID: " + strID + ", Port: " + nPort + otpMessage); fReturn = null; } return fReturn; } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); try { VdcQueryReturnValue runQuery = runQuery(request); if (runQuery != null && succeddedOrOther(runQuery)) { out.print(m_sdfFormatter.format(new Date())); log.info("Succeeded to run RegisterVds."); } else { response.setStatus(500); log.error("Failed to run RegisterVds."); } } catch (Exception e) { response.setStatus(500); log.error("Error calling runQuery: ", e); } finally { out.close(); } } private boolean succeddedOrOther(VdcQueryReturnValue runQuery) { if (runQuery.getSucceeded()) { return true; } else if (VdcBllMessages.VDS_STATUS_NOT_VALID_FOR_UPDATE.name().equals(runQuery.getExceptionString())) { log.debug("host was't updated due to its status - ignoring and reporting succesful registration."); return true; } else { return false; } } }