public List<ReplaySessionInfo> discoverSessions( final String appName, final int version, final int changelist, final String userString, final String metaString, final int limit) { List<ReplaySessionInfo> sessions = new ArrayList<ReplaySessionInfo>(); File[] sessionFiles = FileUtils.listFiles(""); if (sessionFiles == null) { return sessions; } // Search sessions within each version for (final File sessionEntry : sessionFiles) { if (!sessionEntry.isDirectory()) { continue; } try { sessions.add(getSessionInfo(sessionEntry.getName())); } catch (Exception e) { final long sessionAgeInSeconds = (System.currentTimeMillis() - sessionEntry.lastModified()) / 1000; if (sessionAgeInSeconds > 5) { // Don't worry about sessions that are really new, give the files a chance to settle down // before assuming their invalid ReplayLogger.log("FileDB.DiscoverSessions. Invalid session: " + sessionEntry.getName()); try { deleteSession(sessionEntry.getName()); } catch (Exception e2) { ReplayLogger.log( "FileDB.DiscoverSessions: Delete session failed " + sessionEntry.getName()); } } } } // Sort newest to oldest Collections.sort( sessions, new Comparator<ReplaySessionInfo>() { public int compare(ReplaySessionInfo s1, ReplaySessionInfo s2) { if (s1.bIsLive && !s2.bIsLive) { return -1; } else if (!s1.bIsLive && s2.bIsLive) { return 1; } return s2.createDate.compareTo(s1.createDate); } }); return sessions; }
public void quickCleanup() { // Loop over all of the sessions and clean up old ones for (final ReplaySessionInfo sessionEntry : discoverSessions(null, 0, 0, null, null, 0)) { if (sessionEntry.bIsLive && sessionEntry.GetRefreshTimeInSeconds() >= 60) { ReplayLogger.log( "FileDB.Cleanup: Marking incomplete live session: " + sessionEntry.sessionName); try { ReplaySessionInfo session = getSessionInfo(sessionEntry.sessionName); refreshSession( sessionEntry.sessionName, false, true, sessionEntry.numChunks, sessionEntry.demoTimeInMS, session.sizeInBytes); } catch (Exception e) { ReplayLogger.log( "FileDB.Cleanup: Failed to refresh, deleting stale live session: " + sessionEntry.sessionName); try { deleteSession(sessionEntry.sessionName); } catch (Exception e2) { ReplayLogger.log( "FileDB.Cleanup: Failed to delete session: " + sessionEntry.sessionName); } } } /* else if ( sessionEntry.Viewers != null ) { // If this session is fine, make sure any viewers are up to date for ( final ReplayViewer viewerEntry : sessionEntry.Viewers ) { if ( viewerEntry.GetRefreshTimeInSeconds() >= 60 ) { ReplayLogger.Log( "FileDB.Cleanup: Deleting stale viewer: " + sessionEntry.SessionName + "/" + viewerEntry.ViewerName ); try { ReplayDB.DeleteViewer( viewerEntry.SessionName, viewerEntry.ViewerName ); } catch ( Exception e2 ) { ReplayLogger.Log( "FileDB.Cleanup: Failed to delete viewer: " + sessionEntry.SessionName + "/" + viewerEntry.ViewerName ); } } } } */ } }
public void deleteSession(final String sessionName) throws ReplayException { if (!sessionExists(sessionName)) { throw new ReplayException("FileDB.DeleteSession: Session doesn't exists."); } final String sessionPath = getSessionPath(sessionName); final String viewerPath = getSessionViewerPath(sessionName); // Delete the files in the session directory FileUtils.deleteFilesInDirectory(sessionPath); // Delete the files in the viewer directory FileUtils.deleteFilesInDirectory(viewerPath); FileUtils.deleteFile(viewerPath); // Don't warn if it fails, it's not always created if (!FileUtils.deleteFile(sessionPath)) { ReplayLogger.log("DeleteSession: Failed to delete SessionPath: " + sessionPath); } }
public static void main(String[] args) throws Exception { ReplayProps.Init(); ReplayDB.init(); ReplayLogger.log(Level.INFO, "Log opened..."); org.eclipse.jetty.util.log.Log.setLog(ReplayLogger.replayLogger); final int quickTaskFrequencyInSeconds = ReplayProps.getInt("quickTaskFrequencyInSeconds", "10"); final int longTaskFrequencyInHours = ReplayProps.getInt("longTaskFrequencyInHours", "1"); timer = new Timer(); if (quickTaskFrequencyInSeconds != 0) { timer.schedule( new CleanupTask.QuickTask(), quickTaskFrequencyInSeconds * 1000, quickTaskFrequencyInSeconds * 1000); } if (quickTaskFrequencyInSeconds != 0) { timer.schedule( new CleanupTask.LongTask(), 60 * 60 * 1000 * longTaskFrequencyInHours, 60 * 60 * 1000 * longTaskFrequencyInHours); } final int httpPort = ReplayProps.getInt("httpPort", "80"); final Server server = new Server(httpPort); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS | ServletContextHandler.SECURITY); context.setContextPath("/"); server.setHandler(context); // Change default timeout to 45 seconds (from 30) /* ServerConnector http = new ServerConnector( server ); //http.setHost( "localhost" ); http.setPort( httpPort ); http.setIdleTimeout( 45000 ); server.addConnector( http ); */ final boolean bTestAuthorize = false; if (bTestAuthorize) { context.addServlet( new ServletHolder( new HttpServlet() { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final ServletInputStream inputStream = request.getInputStream(); FileUtils.ReplayOutputStream outputStream = FileUtils.getReplayOutputStream("authorize.txt", false); byte[] buffer = new byte[1024]; int readBytes = 0; while ((readBytes = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, readBytes); } inputStream.close(); outputStream.close(); response.setContentType("text/html"); response .getWriter() .println("<p>Worked: " + request.getContentType() + " </p><br>"); } }), "/j_security_check"); } context.addServlet(new ServletHolder(new Download()), "/download/*"); context.addServlet(new ServletHolder(new DownloadEvent()), "/downloadevent/*"); context.addServlet(new ServletHolder(new Upload()), "/upload/*"); context.addServlet(new ServletHolder(new UploadEvent()), "/uploadevent/*"); context.addServlet(new ServletHolder(new StartUploading()), "/startuploading/*"); context.addServlet(new ServletHolder(new StopUploading()), "/stopuploading/*"); context.addServlet(new ServletHolder(new StartDownloading()), "/startdownloading/*"); context.addServlet(new ServletHolder(new DeleteSession()), "/deletesession/*"); context.addServlet(new ServletHolder(new EnumerateSessions()), "/enumsessions/*"); context.addServlet(new ServletHolder(new EnumEvents()), "/enumevents/*"); context.addServlet(new ServletHolder(new RefreshViewer()), "/refreshviewer/*"); context.addServlet(new ServletHolder(new ViewFile()), "/viewfile/*"); if (ReplayProps.getInt("enableBuiltInWebServer", "1") == 1) { context.addServlet(new ServletHolder(new Index()), "/*"); } // Password protect the delete session page context.addServlet( new ServletHolder( new HttpServlet() { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); response .getWriter() .append( "<form method='POST' action='/j_security_check'>" + "<input type='text' name='j_username'/>" + "<input type='password' name='j_password'/>" + "<input type='submit' value='Login'/></form>"); } }), "/login"); final Constraint constraint = new Constraint(); constraint.setName(Constraint.__FORM_AUTH); constraint.setRoles(new String[] {"user", "admin", "moderator"}); constraint.setAuthenticate(true); final ConstraintMapping constraintMapping = new ConstraintMapping(); constraintMapping.setConstraint(constraint); constraintMapping.setPathSpec("/deletesession/*"); final ConstraintSecurityHandler securityHandler = new ConstraintSecurityHandler(); securityHandler.addConstraintMapping(constraintMapping); HashLoginService loginService = new HashLoginService(); loginService.putUser("usern", new Password("pass"), new String[] {"user"}); loginService.putUser("admin", new Password("pass"), new String[] {"admin"}); securityHandler.setLoginService(loginService); final FormAuthenticator authenticator = new FormAuthenticator("/login", "/login", false); securityHandler.setAuthenticator(authenticator); if (!bTestAuthorize) { context.setSecurityHandler(securityHandler); } server.start(); server.join(); ReplayDB.shutdown(); }