示例#1
0
  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;
  }
示例#2
0
  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 );
      			}
      		}
      	}
      }
      */
    }
  }
示例#3
0
  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();
  }