[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [metrics-tasks/master] Add code to count bridges by transport (#9187).
commit 4a2472ef566f5be4f9f1589c22ff0eeca2ee2ca4
Author: Karsten Loesing <karsten.loesing@xxxxxxx>
Date: Fri Oct 11 17:47:22 2013 +0200
Add code to count bridges by transport (#9187).
---
task-9187/.gitignore | 8 ++
task-9187/R/plot-pt-bridges.R | 14 +++
task-9187/src/CountBridgesByTransport.java | 172 ++++++++++++++++++++++++++++
3 files changed, 194 insertions(+)
diff --git a/task-9187/.gitignore b/task-9187/.gitignore
new file mode 100644
index 0000000..5694d63
--- /dev/null
+++ b/task-9187/.gitignore
@@ -0,0 +1,8 @@
+Rplots.pdf
+bin/
+in/
+pt-bridges.csv
+pt-bridges.png
+.classpath
+.project
+
diff --git a/task-9187/R/plot-pt-bridges.R b/task-9187/R/plot-pt-bridges.R
new file mode 100644
index 0000000..b7c380f
--- /dev/null
+++ b/task-9187/R/plot-pt-bridges.R
@@ -0,0 +1,14 @@
+# Usage (from parent directory):
+# R --slave -f R/plot-pt-bridges.R
+require(ggplot2)
+b <- read.csv("pt-bridges.csv", stringsAsFactors = FALSE)
+b <- b[substr(b$published, 1, 10) > substr(min(b$published), 1, 10), ]
+ggplot(b, aes(x = as.POSIXct(published), y = bridges,
+ colour = transport)) +
+geom_line() +
+scale_x_datetime("") +
+scale_y_continuous("") +
+scale_colour_hue("") +
+ggtitle("Running bridges by pluggable transport\n")
+ggsave("pt-bridges.png", width = 8, height = 5, dpi = 100)
+
diff --git a/task-9187/src/CountBridgesByTransport.java b/task-9187/src/CountBridgesByTransport.java
new file mode 100644
index 0000000..3ed22d6
--- /dev/null
+++ b/task-9187/src/CountBridgesByTransport.java
@@ -0,0 +1,172 @@
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TimeZone;
+import java.util.TreeMap;
+
+import org.torproject.descriptor.BridgeNetworkStatus;
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorFile;
+import org.torproject.descriptor.DescriptorReader;
+import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.ExtraInfoDescriptor;
+import org.torproject.descriptor.NetworkStatusEntry;
+import org.torproject.descriptor.ServerDescriptor;
+
+/*
+ * Parses sanitized bridge descriptors to count bridges by transport.
+ *
+ * Usage: download and extract sanitized bridge descriptors to these
+ * subdirectories:
+ *
+ * in/statuses/ (bridge network statuses)
+ * in/server-descriptors/ (bridge server descriptors)
+ * in/extra-infos/ (bridge extra-info descriptors)
+ *
+ * Alternatively, if you're too lazy to extract tarballs, just put them in
+ * one of the three directories and make symbolic links in the other two.
+ * This will take somewhat longer to execute, because we're going through
+ * all tarballs three times.
+ *
+ * Run with a few GB heap space, e.g., java -Xmx4g ...
+ *
+ * Results will be written to pt-bridges.csv.
+ */
+public class CountBridgesByTransport {
+ public static void main(String[] args) throws Exception {
+
+ System.out.println(new Date().toString() + " Starting.");
+
+ /* Parse extra-info descriptors to get a mapping from "extra-info
+ * descriptor identifier" to "list of transports". */
+ System.out.println(new Date().toString() + " Parsing extra-info "
+ + "descriptors.");
+ Map<String, List<String>> extraInfos =
+ new HashMap<String, List<String>>();
+ DescriptorReader descriptorReader =
+ DescriptorSourceFactory.createDescriptorReader();
+ descriptorReader.addDirectory(new File("in/extra-infos"));
+ Iterator<DescriptorFile> descriptorFiles =
+ descriptorReader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() == null) {
+ continue;
+ }
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (!(descriptor instanceof ExtraInfoDescriptor)) {
+ continue;
+ }
+ ExtraInfoDescriptor extraInfoDescriptor =
+ (ExtraInfoDescriptor) descriptor;
+ if (extraInfoDescriptor.getTransports() == null ||
+ extraInfoDescriptor.getTransports().isEmpty()) {
+ continue;
+ }
+ String extraInfoDigest = extraInfoDescriptor.getExtraInfoDigest();
+ List<String> transports = extraInfoDescriptor.getTransports();
+ extraInfos.put(extraInfoDigest, transports);
+ }
+ }
+
+ /* Parse server descriptors to get a mapping from "server descriptor
+ * identifier" to "extra-info descriptor", but store it as "list of
+ * transports". */
+ System.out.println(new Date().toString() + " Parsing server "
+ + "descriptors.");
+ Map<String, List<String>> serverDescriptors =
+ new HashMap<String, List<String>>();
+ descriptorReader = DescriptorSourceFactory.createDescriptorReader();
+ descriptorReader.addDirectory(new File("in/server-descriptors"));
+ descriptorFiles = descriptorReader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() == null) {
+ continue;
+ }
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (!(descriptor instanceof ServerDescriptor)) {
+ continue;
+ }
+ ServerDescriptor serverDescriptor = (ServerDescriptor) descriptor;
+ if (serverDescriptor.getExtraInfoDigest() == null) {
+ continue;
+ }
+ String serverDescriptorDigest =
+ serverDescriptor.getServerDescriptorDigest();
+ String extraInfoDigest = serverDescriptor.getExtraInfoDigest();
+ if (extraInfos.containsKey(extraInfoDigest)) {
+ List<String> transports = extraInfos.get(extraInfoDigest);
+ serverDescriptors.put(serverDescriptorDigest, transports);
+ }
+ }
+ }
+
+ /* Parse statuses, look up server descriptor identifiers and save
+ * number of running bridges by transport to disk as result. */
+ System.out.println(new Date().toString() + " Parsing statuses.");
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ "pt-bridges.csv"));
+ bw.write("published,transport,bridges\n");
+ SimpleDateFormat dateTimeFormat = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss");
+ dateTimeFormat.setLenient(false);
+ dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ descriptorReader = DescriptorSourceFactory.createDescriptorReader();
+ descriptorReader.addDirectory(new File("in/statuses"));
+ descriptorFiles = descriptorReader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() == null) {
+ continue;
+ }
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (!(descriptor instanceof BridgeNetworkStatus)) {
+ continue;
+ }
+ BridgeNetworkStatus status = (BridgeNetworkStatus) descriptor;
+ SortedMap<String, Integer> bridgesByTransport =
+ new TreeMap<String, Integer>();
+ for (NetworkStatusEntry entry :
+ status.getStatusEntries().values()) {
+ if (!entry.getFlags().contains("Running")) {
+ continue;
+ }
+ if (serverDescriptors.containsKey(entry.getDescriptor())) {
+ List<String> transports =
+ serverDescriptors.get(entry.getDescriptor());
+ for (String transport : transports) {
+ if (!bridgesByTransport.containsKey(transport)) {
+ bridgesByTransport.put(transport, 0);
+ }
+ bridgesByTransport.put(transport,
+ bridgesByTransport.get(transport) + 1);
+ }
+ }
+ }
+ if (bridgesByTransport.isEmpty()) {
+ continue;
+ }
+ String publishedString = dateTimeFormat.format(
+ status.getPublishedMillis());
+ for (Map.Entry<String, Integer> e :
+ bridgesByTransport.entrySet()) {
+ String transport = e.getKey();
+ int bridges = e.getValue();
+ bw.write(publishedString + "," + transport + "," + bridges
+ + "\n");
+ }
+ }
+ }
+ bw.close();
+
+ System.out.println(new Date().toString() + " Terminating.");
+ }
+}
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits