[tor-commits] [collector/master] Rename Torperf class and package to Onionperf.

karsten at torproject.org karsten at torproject.org
Fri Apr 28 14:18:43 UTC 2017


commit 0a324223d90c2aac1c5198a7f8c9c00548ee1f0b
Author: iwakeh <iwakeh at torproject.org>
Date:   Thu Apr 27 09:49:30 2017 +0000

    Rename Torperf class and package to Onionperf.
---
 src/main/java/org/torproject/collector/Main.java   |   4 +-
 .../collector/onionperf/OnionperfDownloader.java   | 304 ++++++++++++++++++++
 .../collector/torperf/TorperfDownloader.java       | 307 ---------------------
 3 files changed, 306 insertions(+), 309 deletions(-)

diff --git a/src/main/java/org/torproject/collector/Main.java b/src/main/java/org/torproject/collector/Main.java
index 9ce709a..95da01a 100644
--- a/src/main/java/org/torproject/collector/Main.java
+++ b/src/main/java/org/torproject/collector/Main.java
@@ -12,8 +12,8 @@ import org.torproject.collector.cron.Scheduler;
 import org.torproject.collector.cron.ShutdownHook;
 import org.torproject.collector.exitlists.ExitListDownloader;
 import org.torproject.collector.index.CreateIndexJson;
+import org.torproject.collector.onionperf.OnionperfDownloader;
 import org.torproject.collector.relaydescs.ArchiveWriter;
-import org.torproject.collector.torperf.TorperfDownloader;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,7 +50,7 @@ public class Main {
     collecTorMains.put(Key.ExitlistsActivated, ExitListDownloader.class);
     collecTorMains.put(Key.UpdateindexActivated, CreateIndexJson.class);
     collecTorMains.put(Key.RelaydescsActivated, ArchiveWriter.class);
-    collecTorMains.put(Key.TorperfActivated, TorperfDownloader.class);
+    collecTorMains.put(Key.TorperfActivated, OnionperfDownloader.class);
   }
 
   private static Configuration conf = new Configuration();
diff --git a/src/main/java/org/torproject/collector/onionperf/OnionperfDownloader.java b/src/main/java/org/torproject/collector/onionperf/OnionperfDownloader.java
new file mode 100644
index 0000000..7453234
--- /dev/null
+++ b/src/main/java/org/torproject/collector/onionperf/OnionperfDownloader.java
@@ -0,0 +1,304 @@
+/* Copyright 2012-2017 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.collector.onionperf;
+
+import org.torproject.collector.conf.Configuration;
+import org.torproject.collector.conf.ConfigurationException;
+import org.torproject.collector.conf.Key;
+import org.torproject.collector.cron.CollecTorMain;
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorParseException;
+import org.torproject.descriptor.DescriptorParser;
+import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.TorperfResult;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.StandardCopyOption;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.Stack;
+import java.util.TimeZone;
+import java.util.TreeSet;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/** Download download .tpf files from OnionPerf hosts. */
+public class OnionperfDownloader extends CollecTorMain {
+
+  private static final Logger logger = LoggerFactory.getLogger(
+      OnionperfDownloader.class);
+
+  private static final String TORPERF = "torperf";
+
+  public OnionperfDownloader(Configuration config) {
+    super(config);
+  }
+
+  /** File containing the download history, which is necessary, because
+   * OnionPerf does not delete older .tpf files, but which enables us to do
+   * so. */
+  private File onionPerfDownloadedFile;
+
+  /** Full URLs of .tpf files downloaded in the current or in past
+   * executions. */
+  private SortedSet<String> downloadedTpfFiles = new TreeSet<>();
+
+  /** Base URLs of configured OnionPerf hosts. */
+  private URL[] onionPerfHosts = null;
+
+  /** Directory for storing archived .tpf files. */
+  private File archiveDirectory = null;
+
+  /** Directory for storing recent .tpf files. */
+  private File recentDirectory = null;
+
+  @Override
+  public String module() {
+    return TORPERF;
+  }
+
+  @Override
+  protected String syncMarker() {
+    return "TorperfFiles";
+  }
+
+  @Override
+  protected void startProcessing() throws ConfigurationException {
+    this.onionPerfDownloadedFile =
+        new File(config.getPath(Key.StatsPath).toFile(),
+        "onionperf-downloaded");
+    this.onionPerfHosts = config.getUrlArray(Key.OnionPerfHosts);
+    this.readDownloadedOnionPerfTpfFiles();
+    this.archiveDirectory = new File(config.getPath(Key.OutputPath).toFile(),
+        TORPERF);
+    this.recentDirectory = new File(config.getPath(Key.RecentPath).toFile(),
+        TORPERF);
+    for (URL baseUrl : this.onionPerfHosts) {
+      this.downloadFromOnionPerfHost(baseUrl);
+    }
+    this.writeDownloadedOnionPerfTpfFiles();
+    this.cleanUpRsyncDirectory();
+  }
+
+  private void readDownloadedOnionPerfTpfFiles() {
+    if (!this.onionPerfDownloadedFile.exists()) {
+      return;
+    }
+    try (BufferedReader br = new BufferedReader(new FileReader(
+          this.onionPerfDownloadedFile))) {
+      String line;
+      while ((line = br.readLine()) != null) {
+        this.downloadedTpfFiles.add(line);
+      }
+    } catch (IOException e) {
+      logger.info("Unable to read download history file '"
+          + this.onionPerfDownloadedFile.getAbsolutePath() + "'.  Ignoring "
+          + "download history and downloading all available .tpf files.");
+      this.downloadedTpfFiles.clear();
+    }
+  }
+
+  private void downloadFromOnionPerfHost(URL baseUrl) {
+    logger.info("Downloading from OnionPerf host {}", baseUrl);
+    List<String> tpfFileNames =
+        this.downloadOnionPerfDirectoryListing(baseUrl);
+    String source = baseUrl.getHost().split("\\.")[0];
+    for (String tpfFileName : tpfFileNames) {
+      this.downloadAndParseOnionPerfTpfFile(baseUrl, source, tpfFileName);
+    }
+  }
+
+  /** Pattern for links contained in directory listings. */
+  private static final Pattern TPF_FILE_URL_PATTERN =
+      Pattern.compile(".*<a href=\"([^\"]+\\.tpf)\">.*");
+
+  private List<String> downloadOnionPerfDirectoryListing(URL baseUrl) {
+    List<String> tpfFileUrls = new ArrayList<>();
+    try (BufferedReader br = new BufferedReader(new InputStreamReader(
+        baseUrl.openStream()))) {
+      String line;
+      while ((line = br.readLine()) != null) {
+        Matcher matcher = TPF_FILE_URL_PATTERN.matcher(line);
+        if (matcher.matches() && !matcher.group(1).startsWith("/")) {
+          tpfFileUrls.add(matcher.group(1));
+        }
+      }
+    } catch (IOException e) {
+      logger.warn("Unable to download directory listing from '{}'.  Skipping "
+          + "this OnionPerf host.", baseUrl);
+      tpfFileUrls.clear();
+    }
+    return tpfFileUrls;
+  }
+
+  private static final DateFormat DATE_FORMAT;
+
+  static {
+    DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
+    DATE_FORMAT.setLenient(false);
+    DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
+  }
+
+  private void downloadAndParseOnionPerfTpfFile(URL baseUrl, String source,
+      String tpfFileName) {
+    URL tpfFileUrl;
+    try {
+      tpfFileUrl = new URL(baseUrl, tpfFileName);
+    } catch (MalformedURLException e1) {
+      logger.warn("Unable to put together base URL '{}' and .tpf file path "
+          + "'{}' to a URL.  Skipping.", baseUrl, tpfFileName);
+      return;
+    }
+
+    /* Skip if we successfully downloaded this file before. */
+    if (this.downloadedTpfFiles.contains(tpfFileUrl.toString())) {
+      return;
+    }
+
+    /* Verify file name before downloading: source-filesize-yyyy-MM-dd.tpf */
+    String[] tpfFileNameParts = tpfFileName.split("-");
+    if (!tpfFileName.startsWith(source + "-")
+        || tpfFileName.length() < "s-f-yyyy-MM-dd".length()
+        || tpfFileNameParts.length < 5) {
+      logger.warn("Invalid .tpf file name '{}{}'.  Skipping.", baseUrl,
+          tpfFileName);
+      return;
+    }
+    int fileSize = 0;
+    String date = null;
+    try {
+      fileSize = Integer.parseInt(
+          tpfFileNameParts[tpfFileNameParts.length - 4]);
+      date = tpfFileName.substring(tpfFileName.length() - 14,
+          tpfFileName.length() - 4);
+      DATE_FORMAT.parse(date);
+    } catch (NumberFormatException | ParseException e) {
+      logger.warn("Invalid .tpf file name '{}{}'.  Skipping.", baseUrl,
+          tpfFileName, e);
+      return;
+    }
+
+    /* Download file contents to temporary file. */
+    File tempFile = new File(this.recentDirectory, "." + tpfFileName);
+    tempFile.getParentFile().mkdirs();
+    try (InputStream is = new URL(baseUrl + tpfFileName).openStream()) {
+      Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
+    } catch (IOException e) {
+      logger.warn("Unable to download '{}{}' to temporary file '{}'.  "
+          + "Skipping.", baseUrl, tpfFileName, tempFile, e);
+      return;
+    }
+
+    /* Validate contained descriptors. */
+    DescriptorParser descriptorParser =
+        DescriptorSourceFactory.createDescriptorParser();
+    List<Descriptor> descriptors;
+    try {
+      descriptors = descriptorParser.parseDescriptors(
+          Files.readAllBytes(tempFile.toPath()), tpfFileName);
+    } catch (IOException | DescriptorParseException e) {
+      logger.warn("OnionPerf file '{}{}' could not be parsed.  "
+          + "Skipping.", baseUrl, tpfFileName, e);
+      tempFile.delete();
+      return;
+    }
+    String message = null;
+    for (Descriptor descriptor : descriptors) {
+      if (!(descriptor instanceof TorperfResult)) {
+        message = "File contains descriptors other than Torperf results.";
+        break;
+      }
+      TorperfResult torperf = (TorperfResult) descriptor;
+      if (!source.equals(torperf.getSource())) {
+        message = "File contains Torperf result from another source.";
+        break;
+      }
+      if (fileSize != torperf.getFileSize()) {
+        message = "File contains Torperf result from another file size.";
+        break;
+      }
+      if (!date.equals(DATE_FORMAT.format(torperf.getStartMillis()))) {
+        message = "File contains Torperf result from another date.";
+        break;
+      }
+    }
+    if (null != message) {
+      logger.warn("OnionPerf file '{}{}' was found to be invalid: {}.  "
+          + "Skipping.", baseUrl, tpfFileName, message);
+      tempFile.delete();
+      return;
+    }
+
+    /* Copy/move files in place. */
+    File archiveFile = new File(this.archiveDirectory,
+         date.replaceAll("-", "/") + "/" + tpfFileName);
+    archiveFile.getParentFile().mkdirs();
+    try {
+      Files.copy(tempFile.toPath(), archiveFile.toPath(),
+          StandardCopyOption.REPLACE_EXISTING);
+    } catch (IOException e) {
+      logger.warn("Unable to copy OnionPerf file {} to {}.  Skipping.",
+          tempFile, archiveFile, e);
+      tempFile.delete();
+      return;
+    }
+    File recentFile = new File(this.recentDirectory, tpfFileName);
+    tempFile.renameTo(recentFile);
+
+    /* Add to download history to avoid downloading it again. */
+    this.downloadedTpfFiles.add(baseUrl + tpfFileName);
+  }
+
+  private void writeDownloadedOnionPerfTpfFiles() {
+    this.onionPerfDownloadedFile.getParentFile().mkdirs();
+    try (BufferedWriter bw = new BufferedWriter(new FileWriter(
+          this.onionPerfDownloadedFile))) {
+      for (String line : this.downloadedTpfFiles) {
+        bw.write(line);
+        bw.newLine();
+      }
+    } catch (IOException e) {
+      logger.warn("Unable to write download history file '{}'.  This may "
+          + "result in ignoring history and downloading all available .tpf "
+          + "files in the next execution.",
+          this.onionPerfDownloadedFile.getAbsolutePath(), e);
+    }
+  }
+
+  /** Delete all files from the rsync directory that have not been modified
+   * in the last three days. */
+  public void cleanUpRsyncDirectory() throws ConfigurationException {
+    long cutOffMillis = System.currentTimeMillis()
+        - 3L * 24L * 60L * 60L * 1000L;
+    Stack<File> allFiles = new Stack<>();
+    allFiles.add(new File(config.getPath(Key.RecentPath).toFile(), TORPERF));
+    while (!allFiles.isEmpty()) {
+      File file = allFiles.pop();
+      if (file.isDirectory()) {
+        allFiles.addAll(Arrays.asList(file.listFiles()));
+      } else if (file.lastModified() < cutOffMillis) {
+        file.delete();
+      }
+    }
+  }
+}
+
diff --git a/src/main/java/org/torproject/collector/torperf/TorperfDownloader.java b/src/main/java/org/torproject/collector/torperf/TorperfDownloader.java
deleted file mode 100644
index b4f91fd..0000000
--- a/src/main/java/org/torproject/collector/torperf/TorperfDownloader.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/* Copyright 2012-2017 The Tor Project
- * See LICENSE for licensing information */
-
-package org.torproject.collector.torperf;
-
-import org.torproject.collector.conf.Configuration;
-import org.torproject.collector.conf.ConfigurationException;
-import org.torproject.collector.conf.Key;
-import org.torproject.collector.cron.CollecTorMain;
-import org.torproject.descriptor.Descriptor;
-import org.torproject.descriptor.DescriptorParseException;
-import org.torproject.descriptor.DescriptorParser;
-import org.torproject.descriptor.DescriptorSourceFactory;
-import org.torproject.descriptor.TorperfResult;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.nio.file.Files;
-import java.nio.file.StandardCopyOption;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.Stack;
-import java.util.TimeZone;
-import java.util.TreeSet;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/* Download possibly truncated Torperf .data and .extradata files from
- * configured sources, append them to the files we already have, and merge
- * the two files into the .tpf format;
- * also download .tpf files from OnionPerf hosts. */
-public class TorperfDownloader extends CollecTorMain {
-
-  private static final Logger logger = LoggerFactory.getLogger(
-      TorperfDownloader.class);
-
-  private static final String TORPERF = "torperf";
-
-  public TorperfDownloader(Configuration config) {
-    super(config);
-  }
-
-  /** File containing the download history, which is necessary, because
-   * OnionPerf does not delete older .tpf files, but which enables us to do
-   * so. */
-  private File onionPerfDownloadedFile;
-
-  /** Full URLs of .tpf files downloaded in the current or in past
-   * executions. */
-  private SortedSet<String> downloadedTpfFiles = new TreeSet<>();
-
-  /** Base URLs of configured OnionPerf hosts. */
-  private URL[] onionPerfHosts = null;
-
-  /** Directory for storing archived .tpf files. */
-  private File archiveDirectory = null;
-
-  /** Directory for storing recent .tpf files. */
-  private File recentDirectory = null;
-
-  @Override
-  public String module() {
-    return TORPERF;
-  }
-
-  @Override
-  protected String syncMarker() {
-    return "TorperfFiles";
-  }
-
-  @Override
-  protected void startProcessing() throws ConfigurationException {
-    this.onionPerfDownloadedFile =
-        new File(config.getPath(Key.StatsPath).toFile(),
-        "onionperf-downloaded");
-    this.onionPerfHosts = config.getUrlArray(Key.OnionPerfHosts);
-    this.readDownloadedOnionPerfTpfFiles();
-    this.archiveDirectory = new File(config.getPath(Key.OutputPath).toFile(),
-        TORPERF);
-    this.recentDirectory = new File(config.getPath(Key.RecentPath).toFile(),
-        TORPERF);
-    for (URL baseUrl : this.onionPerfHosts) {
-      this.downloadFromOnionPerfHost(baseUrl);
-    }
-    this.writeDownloadedOnionPerfTpfFiles();
-    this.cleanUpRsyncDirectory();
-  }
-
-  private void readDownloadedOnionPerfTpfFiles() {
-    if (!this.onionPerfDownloadedFile.exists()) {
-      return;
-    }
-    try (BufferedReader br = new BufferedReader(new FileReader(
-          this.onionPerfDownloadedFile))) {
-      String line;
-      while ((line = br.readLine()) != null) {
-        this.downloadedTpfFiles.add(line);
-      }
-    } catch (IOException e) {
-      logger.info("Unable to read download history file '"
-          + this.onionPerfDownloadedFile.getAbsolutePath() + "'.  Ignoring "
-          + "download history and downloading all available .tpf files.");
-      this.downloadedTpfFiles.clear();
-    }
-  }
-
-  private void downloadFromOnionPerfHost(URL baseUrl) {
-    logger.info("Downloading from OnionPerf host {}", baseUrl);
-    List<String> tpfFileNames =
-        this.downloadOnionPerfDirectoryListing(baseUrl);
-    String source = baseUrl.getHost().split("\\.")[0];
-    for (String tpfFileName : tpfFileNames) {
-      this.downloadAndParseOnionPerfTpfFile(baseUrl, source, tpfFileName);
-    }
-  }
-
-  /** Pattern for links contained in directory listings. */
-  private static final Pattern TPF_FILE_URL_PATTERN =
-      Pattern.compile(".*<a href=\"([^\"]+\\.tpf)\">.*");
-
-  private List<String> downloadOnionPerfDirectoryListing(URL baseUrl) {
-    List<String> tpfFileUrls = new ArrayList<>();
-    try (BufferedReader br = new BufferedReader(new InputStreamReader(
-        baseUrl.openStream()))) {
-      String line;
-      while ((line = br.readLine()) != null) {
-        Matcher matcher = TPF_FILE_URL_PATTERN.matcher(line);
-        if (matcher.matches() && !matcher.group(1).startsWith("/")) {
-          tpfFileUrls.add(matcher.group(1));
-        }
-      }
-    } catch (IOException e) {
-      logger.warn("Unable to download directory listing from '{}'.  Skipping "
-          + "this OnionPerf host.", baseUrl);
-      tpfFileUrls.clear();
-    }
-    return tpfFileUrls;
-  }
-
-  private static final DateFormat DATE_FORMAT;
-
-  static {
-    DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
-    DATE_FORMAT.setLenient(false);
-    DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
-  }
-
-  private void downloadAndParseOnionPerfTpfFile(URL baseUrl, String source,
-      String tpfFileName) {
-    URL tpfFileUrl;
-    try {
-      tpfFileUrl = new URL(baseUrl, tpfFileName);
-    } catch (MalformedURLException e1) {
-      logger.warn("Unable to put together base URL '{}' and .tpf file path "
-          + "'{}' to a URL.  Skipping.", baseUrl, tpfFileName);
-      return;
-    }
-
-    /* Skip if we successfully downloaded this file before. */
-    if (this.downloadedTpfFiles.contains(tpfFileUrl.toString())) {
-      return;
-    }
-
-    /* Verify file name before downloading: source-filesize-yyyy-MM-dd.tpf */
-    String[] tpfFileNameParts = tpfFileName.split("-");
-    if (!tpfFileName.startsWith(source + "-")
-        || tpfFileName.length() < "s-f-yyyy-MM-dd".length()
-        || tpfFileNameParts.length < 5) {
-      logger.warn("Invalid .tpf file name '{}{}'.  Skipping.", baseUrl,
-          tpfFileName);
-      return;
-    }
-    int fileSize = 0;
-    String date = null;
-    try {
-      fileSize = Integer.parseInt(
-          tpfFileNameParts[tpfFileNameParts.length - 4]);
-      date = tpfFileName.substring(tpfFileName.length() - 14,
-          tpfFileName.length() - 4);
-      DATE_FORMAT.parse(date);
-    } catch (NumberFormatException | ParseException e) {
-      logger.warn("Invalid .tpf file name '{}{}'.  Skipping.", baseUrl,
-          tpfFileName, e);
-      return;
-    }
-
-    /* Download file contents to temporary file. */
-    File tempFile = new File(this.recentDirectory, "." + tpfFileName);
-    tempFile.getParentFile().mkdirs();
-    try (InputStream is = new URL(baseUrl + tpfFileName).openStream()) {
-      Files.copy(is, tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
-    } catch (IOException e) {
-      logger.warn("Unable to download '{}{}' to temporary file '{}'.  "
-          + "Skipping.", baseUrl, tpfFileName, tempFile, e);
-      return;
-    }
-
-    /* Validate contained descriptors. */
-    DescriptorParser descriptorParser =
-        DescriptorSourceFactory.createDescriptorParser();
-    List<Descriptor> descriptors;
-    try {
-      descriptors = descriptorParser.parseDescriptors(
-          Files.readAllBytes(tempFile.toPath()), tpfFileName);
-    } catch (IOException | DescriptorParseException e) {
-      logger.warn("OnionPerf file '{}{}' could not be parsed.  "
-          + "Skipping.", baseUrl, tpfFileName, e);
-      tempFile.delete();
-      return;
-    }
-    String message = null;
-    for (Descriptor descriptor : descriptors) {
-      if (!(descriptor instanceof TorperfResult)) {
-        message = "File contains descriptors other than Torperf results.";
-        break;
-      }
-      TorperfResult torperf = (TorperfResult) descriptor;
-      if (!source.equals(torperf.getSource())) {
-        message = "File contains Torperf result from another source.";
-        break;
-      }
-      if (fileSize != torperf.getFileSize()) {
-        message = "File contains Torperf result from another file size.";
-        break;
-      }
-      if (!date.equals(DATE_FORMAT.format(torperf.getStartMillis()))) {
-        message = "File contains Torperf result from another date.";
-        break;
-      }
-    }
-    if (null != message) {
-      logger.warn("OnionPerf file '{}{}' was found to be invalid: {}.  "
-          + "Skipping.", baseUrl, tpfFileName, message);
-      tempFile.delete();
-      return;
-    }
-
-    /* Copy/move files in place. */
-    File archiveFile = new File(this.archiveDirectory,
-         date.replaceAll("-", "/") + "/" + tpfFileName);
-    archiveFile.getParentFile().mkdirs();
-    try {
-      Files.copy(tempFile.toPath(), archiveFile.toPath(),
-          StandardCopyOption.REPLACE_EXISTING);
-    } catch (IOException e) {
-      logger.warn("Unable to copy OnionPerf file {} to {}.  Skipping.",
-          tempFile, archiveFile, e);
-      tempFile.delete();
-      return;
-    }
-    File recentFile = new File(this.recentDirectory, tpfFileName);
-    tempFile.renameTo(recentFile);
-
-    /* Add to download history to avoid downloading it again. */
-    this.downloadedTpfFiles.add(baseUrl + tpfFileName);
-  }
-
-  private void writeDownloadedOnionPerfTpfFiles() {
-    this.onionPerfDownloadedFile.getParentFile().mkdirs();
-    try (BufferedWriter bw = new BufferedWriter(new FileWriter(
-          this.onionPerfDownloadedFile))) {
-      for (String line : this.downloadedTpfFiles) {
-        bw.write(line);
-        bw.newLine();
-      }
-    } catch (IOException e) {
-      logger.warn("Unable to write download history file '{}'.  This may "
-          + "result in ignoring history and downloading all available .tpf "
-          + "files in the next execution.",
-          this.onionPerfDownloadedFile.getAbsolutePath(), e);
-    }
-  }
-
-  /** Delete all files from the rsync directory that have not been modified
-   * in the last three days. */
-  public void cleanUpRsyncDirectory() throws ConfigurationException {
-    long cutOffMillis = System.currentTimeMillis()
-        - 3L * 24L * 60L * 60L * 1000L;
-    Stack<File> allFiles = new Stack<>();
-    allFiles.add(new File(config.getPath(Key.RecentPath).toFile(), TORPERF));
-    while (!allFiles.isEmpty()) {
-      File file = allFiles.pop();
-      if (file.isDirectory()) {
-        allFiles.addAll(Arrays.asList(file.listFiles()));
-      } else if (file.lastModified() < cutOffMillis) {
-        file.delete();
-      }
-    }
-  }
-}
-





More information about the tor-commits mailing list