package com.owera.xaps.tr069; import java.util.List; import javax.servlet.http.HttpServletRequest; import com.owera.xaps.base.Log; import com.owera.xaps.dbi.Users; import com.owera.xaps.dbi.util.ProvisioningMessage; import com.owera.xaps.dbi.util.ProvisioningMessage.ErrorResponsibility; import com.owera.xaps.dbi.util.ProvisioningMessage.ProvOutput; import com.owera.xaps.dbi.util.ProvisioningMessage.ProvStatus; import com.owera.xaps.dbi.util.ProvisioningMode; import com.owera.xaps.dbi.util.SyslogClient; import com.owera.xaps.tr069.methods.TR069Method; import com.owera.xaps.tr069.xml.ParameterValueStruct; /** * Responsible for logging to the tr069-event log * @author Morten * */ public class SessionLogging { public static void log(HTTPReqResData reqRes) { try { SessionData sessionData = reqRes.getSessionData(); // The old logging to eventlog String methodsUsed = abbreviate(sessionData.getReqResList()); long diff = System.currentTimeMillis() - sessionData.getStartupTmsForSession().longValue(); String eventMsg = makeEventMsg(reqRes, diff, methodsUsed); Log.event(sessionData, eventMsg); // The new logging to syslog ProvisioningMessage pm = sessionData.getProvisioningMessage(); if (pm.getProvOutput() == null) pm.setProvOutput(ProvOutput.EMPTY); if (reqRes.getThrowable() != null) { pm.setProvStatus(ProvStatus.ERROR); pm.setErrorResponsibility(ErrorResponsibility.SERVER); pm.setErrorMessage(reqRes.getThrowable().getMessage()); } else if (pm.getProvStatus() == null) pm.setProvStatus(ProvStatus.OK); if (pm.getProvMode() == null) { if (sessionData.getUnit() != null) pm.setProvMode(sessionData.getUnit().getProvisioningMode()); else pm.setProvMode(ProvisioningMode.REGULAR); } pm.setSessionLength((int) diff); pm.setIpAddress(reqRes.getReq().getRemoteHost()); // We're not sending the facility-version, since the message is used in a report - where // the version of the TR-069 is much more interesting (will be added automatically be the syslog server) SyslogClient.send(pm.syslogMsg(16, null, Users.USER_ADMIN)); } catch (Throwable t) { Log.warn(Provisioning.class, "An error ocurred when logging at endOfSession. Does not affect provisioning", t); } } private static String abbreviate(List<HTTPReqResData> reqResList) { String methodsUsed = ""; for (int i = 0; i < reqResList.size(); i++) { HTTPReqResData reqRes = reqResList.get(i); HTTPReqData reqData = reqRes.getRequest(); HTTPResData resData = reqRes.getResponse(); String reqMethod = reqData.getMethod(); if (reqMethod == null) continue; String resMethod = resData.getMethod(); String reqShortname = TR069Method.abbrevMap.get(reqMethod); if (i > 0) { HTTPReqResData prevReqRes = reqResList.get(i - 1); String prevResMethod = prevReqRes.getResponse().getMethod(); if (prevResMethod != null) { if (!reqMethod.equals(TR069Method.EMPTY) && prevResMethod.equals(reqMethod)) reqShortname += "r"; } } if (reqData.getFault() != null) reqShortname += "(FC:" + reqData.getFault().getFaultCode() + ")"; String resShortname = TR069Method.abbrevMap.get(resMethod); if (!reqMethod.equals(TR069Method.EMPTY) && reqMethod.equals(resMethod)) resShortname += "r"; if (reqMethod.equals(TR069Method.SET_PARAMETER_VALUES) && !reqRes.getSessionData().isProvisioningAllowed()) reqShortname += "lim"; if (reqMethod.equals(TR069Method.INFORM)) reqShortname += "(" + reqRes.getSessionData().getEventCodes() + ")"; methodsUsed += "[" + reqShortname; if (reqRes.getThrowable() != null) methodsUsed += "-(F)" + resShortname + "] "; else methodsUsed += "-" + resShortname + "] "; } return methodsUsed; } private static String makeEventMsg(HTTPReqResData reqRes, long diff, String methodsUsed) { List<HTTPReqResData> reqResList = reqRes.getSessionData().getReqResList(); HttpServletRequest req = reqRes.getReq(); SessionData sessionData = reqRes.getSessionData(); String eventMsg = String.format("%1$-16s %2$6dms %3$-60s", req.getRemoteHost(), diff, methodsUsed); // String eventMsg = "[" + req.getRemoteHost() + "] [" + diff + " ms] [" + methodsUsed + "]"; String job = " "; if (sessionData.getJob() != null) job = String.format("%-6s", sessionData.getJob().getId()); eventMsg += job; String parameterList = ""; int paramsToCPE = 0; for (HTTPReqResData reqResItem : reqResList) { String resMethod = reqResItem.getResponse().getMethod(); if (resMethod != null && resMethod.equals(TR069Method.SET_PARAMETER_VALUES)) { paramsToCPE = sessionData.getToCPE().getParameterValueList().size(); for (ParameterValueStruct pvs : sessionData.getToCPE().getParameterValueList()) { parameterList += pvs.getName() + "=" + pvs.getValue() + ", "; } } } if (paramsToCPE > 0) { eventMsg += " [" + paramsToCPE + " params set to CPE: "; eventMsg += parameterList.substring(0, parameterList.length() - 2) + "]"; } return eventMsg; } }