tor-commits
Threads by month
- ----- 2026 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 1 participants
- 216132 discussions
[metrics-web/master] Remove website parts that were deprecated 10 months ago.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 3ddc1b1ece1151b7ee2c4f9f83229f3aa674a2ca
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 12:23:59 2012 +0100
Remove website parts that were deprecated 10 months ago.
relay.html was changed to say "Sorry, this page has been discontinued." in
February 2012 and was overlooked when removing similar website parts in
March 2012. Removing it now.
---
etc/web.xml | 11 -----------
src/org/torproject/ernie/web/RelayServlet.java | 24 ------------------------
web/WEB-INF/relay.jsp | 23 -----------------------
3 files changed, 0 insertions(+), 58 deletions(-)
diff --git a/etc/web.xml b/etc/web.xml
index c7262ef..176b84f 100644
--- a/etc/web.xml
+++ b/etc/web.xml
@@ -128,17 +128,6 @@
</servlet-mapping>
<servlet>
- <servlet-name>Relay</servlet-name>
- <servlet-class>
- org.torproject.ernie.web.RelayServlet
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>Relay</servlet-name>
- <url-pattern>/relay.html</url-pattern>
- </servlet-mapping>
-
- <servlet>
<servlet-name>RelaySearch</servlet-name>
<servlet-class>
org.torproject.ernie.web.RelaySearchServlet
diff --git a/src/org/torproject/ernie/web/RelayServlet.java b/src/org/torproject/ernie/web/RelayServlet.java
deleted file mode 100644
index 6f120e5..0000000
--- a/src/org/torproject/ernie/web/RelayServlet.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Copyright 2011, 2012 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.ernie.web;
-
-import java.io.IOException;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-public class RelayServlet extends HttpServlet {
-
- private static final long serialVersionUID = 2375986581752040224L;
-
- public void doGet(HttpServletRequest request,
- HttpServletResponse response) throws IOException, ServletException {
-
- /* Forward the request to the JSP. */
- request.getRequestDispatcher("WEB-INF/relay.jsp").forward(
- request, response);
- }
-}
-
diff --git a/web/WEB-INF/relay.jsp b/web/WEB-INF/relay.jsp
deleted file mode 100644
index 952133a..0000000
--- a/web/WEB-INF/relay.jsp
+++ /dev/null
@@ -1,23 +0,0 @@
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
- <title>Tor Metrics Portal: Relay</title>
- <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
- <link href="/css/stylesheet-ltr.css" type="text/css" rel="stylesheet">
- <link href="/images/favicon.ico" type="image/x-icon" rel="shortcut icon">
-</head>
-<body>
- <div class="center">
- <%@ include file="banner.jsp"%>
- <div class="main-column">
- <h2>Tor Metrics Portal: Relay</h2>
- <br>
- <p>Sorry, this page has been discontinued.</p>
- </div>
- </div>
- <div class="bottom" id="bottom">
- <%@ include file="footer.jsp"%>
- </div>
-</body>
-</html>
1
0
commit 851fb63c3d5b59f9d70fa0e32fe3dc98922d8164
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 11:03:49 2012 +0100
Let Eclipse organize imports.
---
.../torproject/ernie/web/ResearchDataServlet.java | 2 --
1 files changed, 0 insertions(+), 2 deletions(-)
diff --git a/src/org/torproject/ernie/web/ResearchDataServlet.java b/src/org/torproject/ernie/web/ResearchDataServlet.java
index 8eaab66..8132af9 100644
--- a/src/org/torproject/ernie/web/ResearchDataServlet.java
+++ b/src/org/torproject/ernie/web/ResearchDataServlet.java
@@ -2,9 +2,7 @@
* See LICENSE for licensing information */
package org.torproject.ernie.web;
-import java.io.BufferedReader;
import java.io.File;
-import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
1
0
[metrics-web/master] Split up SanitizedBridgesReader in two parts.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 6ca961262f87f90fd075e69f2eae4483b32a6e1c
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 13:23:40 2012 +0100
Split up SanitizedBridgesReader in two parts.
---
.../ernie/cron/BridgeStatsFileHandler.java | 98 +++++++++++++++-
.../ernie/cron/ConsensusStatsFileHandler.java | 65 ++++++++++-
src/org/torproject/ernie/cron/Main.java | 36 +++---
.../ernie/cron/SanitizedBridgesReader.java | 130 --------------------
4 files changed, 182 insertions(+), 147 deletions(-)
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 70a6a6f..4534d2f 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -18,6 +18,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
@@ -28,6 +29,13 @@ import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
+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.ServerDescriptor;
+
/**
* Determines estimates of bridge users per country and day from the
* extra-info descriptors that bridges publish. In a first step, the
@@ -105,12 +113,26 @@ public class BridgeStatsFileHandler {
private SimpleDateFormat dateTimeFormat;
+ private File bridgesDir;
+
+ private File statsDirectory;
+
+ private boolean keepImportHistory;
+
/**
* Initializes this class, including reading in intermediate results
* files <code>stats/bridge-stats-raw</code> and
* <code>stats/hashed-relay-identities</code>.
*/
- public BridgeStatsFileHandler(String connectionURL) {
+ public BridgeStatsFileHandler(String connectionURL,
+ File bridgesDir, File statsDirectory, boolean keepImportHistory) {
+
+ if (bridgesDir == null || statsDirectory == null) {
+ throw new IllegalArgumentException();
+ }
+ this.bridgesDir = bridgesDir;
+ this.statsDirectory = statsDirectory;
+ this.keepImportHistory = keepImportHistory;
/* Initialize set of known countries. */
this.countries = new TreeSet<String>();
@@ -328,6 +350,80 @@ public class BridgeStatsFileHandler {
}
}
+ public void importSanitizedBridges() {
+ if (bridgesDir.exists()) {
+ logger.fine("Importing files in directory " + bridgesDir + "/...");
+ DescriptorReader reader =
+ DescriptorSourceFactory.createDescriptorReader();
+ reader.addDirectory(bridgesDir);
+ if (keepImportHistory) {
+ reader.setExcludeFiles(new File(statsDirectory,
+ "bridge-descriptor-history"));
+ }
+ Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() != null) {
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (descriptor instanceof ServerDescriptor) {
+ this.addServerDescriptor((ServerDescriptor) descriptor);
+ } else if (descriptor instanceof ExtraInfoDescriptor) {
+ this.addExtraInfoDescriptor(
+ (ExtraInfoDescriptor) descriptor);
+ }
+ }
+ }
+ }
+ logger.info("Finished importing bridge descriptors.");
+ }
+ }
+
+ private void addServerDescriptor(ServerDescriptor descriptor) {
+ if (descriptor.getPlatform() != null &&
+ descriptor.getPlatform().startsWith("Tor 0.2.2")) {
+ this.addZeroTwoTwoDescriptor(descriptor.getFingerprint(),
+ descriptor.getPublishedMillis());
+ }
+ }
+
+ private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
+ if (!this.isKnownRelay(descriptor.getFingerprint())) {
+ if (descriptor.getGeoipStartTimeMillis() >= 0 &&
+ descriptor.getGeoipClientOrigins() != null) {
+ long seconds = (descriptor.getPublishedMillis()
+ - descriptor.getGeoipStartTimeMillis()) / 1000L;
+ double allUsers = 0.0D;
+ Map<String, String> obs = new HashMap<String, String>();
+ for (Map.Entry<String, Integer> e :
+ descriptor.getGeoipClientOrigins().entrySet()) {
+ String country = e.getKey();
+ double users = ((double) e.getValue() - 4) * 86400.0D
+ / ((double) seconds);
+ allUsers += users;
+ obs.put(country, String.format("%.2f", users));
+ }
+ obs.put("zy", String.format("%.2f", allUsers));
+ this.addObs(descriptor.getFingerprint(),
+ descriptor.getPublishedMillis(), obs);
+ }
+ if (descriptor.getBridgeStatsEndMillis() >= 0 &&
+ descriptor.getBridgeIps() != null) {
+ double allUsers = 0.0D;
+ Map<String, String> obs = new HashMap<String, String>();
+ for (Map.Entry<String, Integer> e :
+ descriptor.getBridgeIps().entrySet()) {
+ String country = e.getKey();
+ double users = (double) e.getValue() - 4;
+ allUsers += users;
+ obs.put(country, String.format("%.2f", users));
+ }
+ obs.put("zy", String.format("%.2f", allUsers));
+ this.addObs(descriptor.getFingerprint(),
+ descriptor.getBridgeStatsEndMillis(), obs);
+ }
+ }
+ }
+
/**
* Writes the list of hashed relay identities and bridge user numbers as
* observed by single bridges to disk, aggregates per-day statistics for
diff --git a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
index 1babb94..1fcbf19 100644
--- a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
@@ -25,6 +25,13 @@ import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
+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.NetworkStatusEntry;
+
/**
* Generates statistics on the average number of relays and bridges per
* day. Accepts parse results from <code>RelayDescriptorParser</code> and
@@ -68,13 +75,28 @@ public class ConsensusStatsFileHandler {
private SimpleDateFormat dateTimeFormat;
+ private File bridgesDir;
+
+ private File statsDirectory;
+
+ private boolean keepImportHistory;
+
/**
* Initializes this class, including reading in intermediate results
* files <code>stats/consensus-stats-raw</code> and
* <code>stats/bridge-consensus-stats-raw</code> and final results file
* <code>stats/consensus-stats</code>.
*/
- public ConsensusStatsFileHandler(String connectionURL) {
+ public ConsensusStatsFileHandler(String connectionURL,
+ File bridgesDir, File statsDirectory,
+ boolean keepImportHistory) {
+
+ if (bridgesDir == null || statsDirectory == null) {
+ throw new IllegalArgumentException();
+ }
+ this.bridgesDir = bridgesDir;
+ this.statsDirectory = statsDirectory;
+ this.keepImportHistory = keepImportHistory;
/* Initialize local data structures to hold intermediate and final
* results. */
@@ -153,6 +175,47 @@ public class ConsensusStatsFileHandler {
}
}
+ public void importSanitizedBridges() {
+ if (bridgesDir.exists()) {
+ logger.fine("Importing files in directory " + bridgesDir + "/...");
+ DescriptorReader reader =
+ DescriptorSourceFactory.createDescriptorReader();
+ reader.addDirectory(bridgesDir);
+ if (keepImportHistory) {
+ reader.setExcludeFiles(new File(statsDirectory,
+ "bridge-descriptor-history"));
+ }
+ Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() != null) {
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (descriptor instanceof BridgeNetworkStatus) {
+ this.addBridgeNetworkStatus(
+ (BridgeNetworkStatus) descriptor);
+ }
+ }
+ }
+ }
+ logger.info("Finished importing bridge descriptors.");
+ }
+ }
+
+ private void addBridgeNetworkStatus(BridgeNetworkStatus status) {
+ int runningBridges = 0, runningEc2Bridges = 0;
+ for (NetworkStatusEntry statusEntry :
+ status.getStatusEntries().values()) {
+ if (statusEntry.getFlags().contains("Running")) {
+ runningBridges++;
+ if (statusEntry.getNickname().startsWith("ec2bridge")) {
+ runningEc2Bridges++;
+ }
+ }
+ }
+ this.addBridgeConsensusResults(status.getPublishedMillis(),
+ runningBridges, runningEc2Bridges);
+ }
+
/**
* Aggregates the raw observations on relay and bridge numbers and
* writes both raw and aggregate observations to disk.
diff --git a/src/org/torproject/ernie/cron/Main.java b/src/org/torproject/ernie/cron/Main.java
index 6c98602..457433f 100644
--- a/src/org/torproject/ernie/cron/Main.java
+++ b/src/org/torproject/ernie/cron/Main.java
@@ -35,7 +35,10 @@ public class Main {
// Prepare bridge stats file handler
BridgeStatsFileHandler bsfh = config.getWriteBridgeStats() ?
new BridgeStatsFileHandler(
- config.getRelayDescriptorDatabaseJDBC()) : null;
+ config.getRelayDescriptorDatabaseJDBC(),
+ new File(config.getSanitizedBridgesDirectory()),
+ statsDirectory, config.getKeepSanitizedBridgesImportHistory()) :
+ null;
// Import relay descriptors
if (config.getImportDirectoryArchives()) {
@@ -54,26 +57,29 @@ public class Main {
rddi.closeConnection();
}
+ // Import sanitized bridges and write updated stats files to disk
+ if (bsfh != null) {
+ if (config.getImportSanitizedBridges()) {
+ bsfh.importSanitizedBridges();
+ }
+ bsfh.writeFiles();
+ bsfh = null;
+ }
+
// Prepare consensus stats file handler (used for stats on running
// bridges only)
ConsensusStatsFileHandler csfh = config.getWriteBridgeStats() ?
new ConsensusStatsFileHandler(
- config.getRelayDescriptorDatabaseJDBC()) : null;
-
- // Import bridge descriptors
- if (config.getWriteBridgeStats() &&
- config.getImportSanitizedBridges()) {
- new SanitizedBridgesReader(csfh, bsfh,
- new File(config.getSanitizedBridgesDirectory()),
- statsDirectory, config.getKeepSanitizedBridgesImportHistory());
- }
+ config.getRelayDescriptorDatabaseJDBC(),
+ new File(config.getSanitizedBridgesDirectory()),
+ statsDirectory, config.getKeepSanitizedBridgesImportHistory()) :
+ null;
- // Write updated stats files to disk
- if (bsfh != null) {
- bsfh.writeFiles();
- bsfh = null;
- }
+ // Import sanitized bridges and write updated stats files to disk
if (csfh != null) {
+ if (config.getImportSanitizedBridges()) {
+ csfh.importSanitizedBridges();
+ }
csfh.writeFiles();
csfh = null;
}
diff --git a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java b/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
deleted file mode 100644
index da22e56..0000000
--- a/src/org/torproject/ernie/cron/SanitizedBridgesReader.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/* Copyright 2011, 2012 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.ernie.cron;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.logging.Logger;
-
-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;
-
-public class SanitizedBridgesReader {
- private ConsensusStatsFileHandler csfh;
- private BridgeStatsFileHandler bsfh;
- private Logger logger;
- public SanitizedBridgesReader(ConsensusStatsFileHandler csfh,
- BridgeStatsFileHandler bsfh, File bridgesDir, File statsDirectory,
- boolean keepImportHistory) {
-
- if (csfh == null || bsfh == null || bridgesDir == null ||
- statsDirectory == null) {
- throw new IllegalArgumentException();
- }
-
- this.csfh = csfh;
- this.bsfh = bsfh;
- this.logger =
- Logger.getLogger(SanitizedBridgesReader.class.getName());
-
- if (bridgesDir.exists()) {
- logger.fine("Importing files in directory " + bridgesDir + "/...");
- DescriptorReader reader =
- DescriptorSourceFactory.createDescriptorReader();
- reader.addDirectory(bridgesDir);
- if (keepImportHistory) {
- reader.setExcludeFiles(new File(statsDirectory,
- "bridge-descriptor-history"));
- }
- Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
- while (descriptorFiles.hasNext()) {
- DescriptorFile descriptorFile = descriptorFiles.next();
- if (descriptorFile.getDescriptors() != null) {
- for (Descriptor descriptor : descriptorFile.getDescriptors()) {
- if (descriptor instanceof BridgeNetworkStatus) {
- this.addBridgeNetworkStatus(
- (BridgeNetworkStatus) descriptor);
- } else if (descriptor instanceof ServerDescriptor) {
- this.addServerDescriptor((ServerDescriptor) descriptor);
- } else if (descriptor instanceof ExtraInfoDescriptor) {
- this.addExtraInfoDescriptor(
- (ExtraInfoDescriptor) descriptor);
- }
- }
- }
- }
- logger.info("Finished importing bridge descriptors.");
- }
- }
-
- private void addBridgeNetworkStatus(BridgeNetworkStatus status) {
- int runningBridges = 0, runningEc2Bridges = 0;
- for (NetworkStatusEntry statusEntry :
- status.getStatusEntries().values()) {
- if (statusEntry.getFlags().contains("Running")) {
- runningBridges++;
- if (statusEntry.getNickname().startsWith("ec2bridge")) {
- runningEc2Bridges++;
- }
- }
- }
- this.csfh.addBridgeConsensusResults(status.getPublishedMillis(),
- runningBridges, runningEc2Bridges);
- }
-
- private void addServerDescriptor(ServerDescriptor descriptor) {
- if (descriptor.getPlatform() != null &&
- descriptor.getPlatform().startsWith("Tor 0.2.2")) {
- this.bsfh.addZeroTwoTwoDescriptor(descriptor.getFingerprint(),
- descriptor.getPublishedMillis());
- }
- }
-
- private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
- if (!this.bsfh.isKnownRelay(descriptor.getFingerprint())) {
- if (descriptor.getGeoipStartTimeMillis() >= 0 &&
- descriptor.getGeoipClientOrigins() != null) {
- long seconds = (descriptor.getPublishedMillis()
- - descriptor.getGeoipStartTimeMillis()) / 1000L;
- double allUsers = 0.0D;
- Map<String, String> obs = new HashMap<String, String>();
- for (Map.Entry<String, Integer> e :
- descriptor.getGeoipClientOrigins().entrySet()) {
- String country = e.getKey();
- double users = ((double) e.getValue() - 4) * 86400.0D
- / ((double) seconds);
- allUsers += users;
- obs.put(country, String.format("%.2f", users));
- }
- obs.put("zy", String.format("%.2f", allUsers));
- this.bsfh.addObs(descriptor.getFingerprint(),
- descriptor.getPublishedMillis(), obs);
- }
- if (descriptor.getBridgeStatsEndMillis() >= 0 &&
- descriptor.getBridgeIps() != null) {
- double allUsers = 0.0D;
- Map<String, String> obs = new HashMap<String, String>();
- for (Map.Entry<String, Integer> e :
- descriptor.getBridgeIps().entrySet()) {
- String country = e.getKey();
- double users = (double) e.getValue() - 4;
- allUsers += users;
- obs.put(country, String.format("%.2f", users));
- }
- obs.put("zy", String.format("%.2f", allUsers));
- this.bsfh.addObs(descriptor.getFingerprint(),
- descriptor.getBridgeStatsEndMillis(), obs);
- }
-
- }
- }
-}
-
1
0
[metrics-web/master] Split off code that imports conn-bi-direct stats.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit e8794217eeec2d22e1d0bb1fb87e5a8f1950e80f
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 14:45:08 2012 +0100
Split off code that imports conn-bi-direct stats.
---
src/org/torproject/ernie/cron/Main.java | 12 +
.../ernie/cron/PerformanceStatsImporter.java | 271 ++++++++++++++++++++
.../cron/RelayDescriptorDatabaseImporter.java | 102 +-------
3 files changed, 286 insertions(+), 99 deletions(-)
diff --git a/src/org/torproject/ernie/cron/Main.java b/src/org/torproject/ernie/cron/Main.java
index a3f38e6..fb4a450 100644
--- a/src/org/torproject/ernie/cron/Main.java
+++ b/src/org/torproject/ernie/cron/Main.java
@@ -62,6 +62,18 @@ public class Main {
bsfh.importRelayDescriptors();
}
rddi.closeConnection();
+
+ // Import conn-bi-direct statistics.
+ PerformanceStatsImporter psi = new PerformanceStatsImporter(
+ config.getWriteRelayDescriptorDatabase() ?
+ config.getRelayDescriptorDatabaseJDBC() : null,
+ config.getWriteRelayDescriptorsRawFiles() ?
+ config.getRelayDescriptorRawFilesDirectory() : null,
+ new File(config.getDirectoryArchivesDirectory()),
+ statsDirectory,
+ config.getKeepDirectoryArchiveImportHistory());
+ psi.importRelayDescriptors();
+ psi.closeConnection();
}
// Import sanitized bridges and write updated stats files to disk
diff --git a/src/org/torproject/ernie/cron/PerformanceStatsImporter.java b/src/org/torproject/ernie/cron/PerformanceStatsImporter.java
new file mode 100644
index 0000000..32d5911
--- /dev/null
+++ b/src/org/torproject/ernie/cron/PerformanceStatsImporter.java
@@ -0,0 +1,271 @@
+/* Copyright 2012 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.ernie.cron;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.TimeZone;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+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;
+
+public class PerformanceStatsImporter {
+
+ /**
+ * How many records to commit with each database transaction.
+ */
+ private final long autoCommitCount = 500;
+
+ /**
+ * Keep track of the number of records committed before each transaction
+ */
+ private int rbsCount = 0;
+
+ /**
+ * Relay descriptor database connection.
+ */
+ private Connection conn;
+
+ /**
+ * Prepared statement to check whether a given conn-bi-direct stats
+ * string has been imported into the database before.
+ */
+ private PreparedStatement psBs;
+
+ /**
+ * Prepared statement to insert a conn-bi-direct stats string into the
+ * database.
+ */
+ private PreparedStatement psB;
+
+ /**
+ * Logger for this class.
+ */
+ private Logger logger;
+
+ /**
+ * Directory for writing raw import files.
+ */
+ private String rawFilesDirectory;
+
+ /**
+ * Raw import file containing conn-bi-direct stats strings.
+ */
+ private BufferedWriter connBiDirectOut;
+
+ /**
+ * Date format to parse timestamps.
+ */
+ private SimpleDateFormat dateTimeFormat;
+
+ private boolean importIntoDatabase;
+ private boolean writeRawImportFiles;
+
+ private File archivesDirectory;
+ private File statsDirectory;
+ private boolean keepImportHistory;
+
+ /**
+ * Initialize database importer by connecting to the database and
+ * preparing statements.
+ */
+ public PerformanceStatsImporter(String connectionURL,
+ String rawFilesDirectory, File archivesDirectory,
+ File statsDirectory, boolean keepImportHistory) {
+
+ if (archivesDirectory == null ||
+ statsDirectory == null) {
+ throw new IllegalArgumentException();
+ }
+ this.archivesDirectory = archivesDirectory;
+ this.statsDirectory = statsDirectory;
+ this.keepImportHistory = keepImportHistory;
+
+ /* Initialize logger. */
+ this.logger = Logger.getLogger(
+ RelayDescriptorDatabaseImporter.class.getName());
+
+ if (connectionURL != null) {
+ try {
+ /* Connect to database. */
+ this.conn = DriverManager.getConnection(connectionURL);
+
+ /* Turn autocommit off */
+ this.conn.setAutoCommit(false);
+
+ /* Prepare statements. */
+ this.psBs = conn.prepareStatement("SELECT COUNT(*) "
+ + "FROM connbidirect WHERE source = ? AND statsend = ?");
+ this.psB = conn.prepareStatement("INSERT INTO connbidirect "
+ + "(source, statsend, seconds, belownum, readnum, writenum, "
+ + "bothnum) VALUES (?, ?, ?, ?, ?, ?, ?)");
+ this.importIntoDatabase = true;
+ } catch (SQLException e) {
+ this.logger.log(Level.WARNING, "Could not connect to database or "
+ + "prepare statements.", e);
+ }
+ }
+
+ /* Remember where we want to write raw import files. */
+ if (rawFilesDirectory != null) {
+ this.rawFilesDirectory = rawFilesDirectory;
+ this.writeRawImportFiles = true;
+ }
+
+ /* Initialize date format, so that we can format timestamps. */
+ this.dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ this.dateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+
+ /**
+ * Insert a conn-bi-direct stats string into the database.
+ */
+ private void addConnBiDirect(String source, long statsEndMillis,
+ long seconds, long below, long read, long write, long both) {
+ String statsEnd = this.dateTimeFormat.format(statsEndMillis);
+ if (this.importIntoDatabase) {
+ try {
+ Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
+ Timestamp statsEndTimestamp = new Timestamp(statsEndMillis);
+ this.psBs.setString(1, source);
+ this.psBs.setTimestamp(2, statsEndTimestamp, cal);
+ ResultSet rs = psBs.executeQuery();
+ rs.next();
+ if (rs.getInt(1) == 0) {
+ this.psB.clearParameters();
+ this.psB.setString(1, source);
+ this.psB.setTimestamp(2, statsEndTimestamp, cal);
+ this.psB.setLong(3, seconds);
+ this.psB.setLong(4, below);
+ this.psB.setLong(5, read);
+ this.psB.setLong(6, write);
+ this.psB.setLong(7, both);
+ this.psB.executeUpdate();
+ rbsCount++;
+ if (rbsCount % autoCommitCount == 0) {
+ this.conn.commit();
+ }
+ }
+ } catch (SQLException e) {
+ this.logger.log(Level.WARNING, "Could not add conn-bi-direct "
+ + "stats string. We won't make any further SQL requests in "
+ + "this execution.", e);
+ this.importIntoDatabase = false;
+ }
+ }
+ if (this.writeRawImportFiles) {
+ try {
+ if (this.connBiDirectOut == null) {
+ new File(rawFilesDirectory).mkdirs();
+ this.connBiDirectOut = new BufferedWriter(new FileWriter(
+ rawFilesDirectory + "/connbidirect.sql"));
+ this.connBiDirectOut.write(" COPY connbidirect (source, "
+ + "statsend, seconds, belownum, readnum, writenum, "
+ + "bothnum) FROM stdin;\n");
+ }
+ this.connBiDirectOut.write(source + "\t" + statsEnd + "\t"
+ + seconds + "\t" + below + "\t" + read + "\t" + write + "\t"
+ + both + "\n");
+ } catch (IOException e) {
+ this.logger.log(Level.WARNING, "Could not write conn-bi-direct "
+ + "stats string to raw database import file. We won't make "
+ + "any further attempts to write raw import files in this "
+ + "execution.", e);
+ this.writeRawImportFiles = false;
+ }
+ }
+ }
+
+ void importRelayDescriptors() {
+ if (archivesDirectory.exists()) {
+ logger.fine("Importing files in directory " + archivesDirectory
+ + "/...");
+ DescriptorReader reader =
+ DescriptorSourceFactory.createDescriptorReader();
+ reader.addDirectory(archivesDirectory);
+ if (keepImportHistory) {
+ reader.setExcludeFiles(new File(statsDirectory,
+ "connbidirect-relay-descriptor-history"));
+ }
+ Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() != null) {
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (descriptor instanceof ExtraInfoDescriptor) {
+ this.addExtraInfoDescriptor(
+ (ExtraInfoDescriptor) descriptor);
+ }
+ }
+ }
+ }
+ }
+
+ logger.info("Finished importing relay descriptors.");
+ }
+
+ private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
+ if (descriptor.getConnBiDirectStatsEndMillis() >= 0L) {
+ this.addConnBiDirect(descriptor.getFingerprint(),
+ descriptor.getConnBiDirectStatsEndMillis(),
+ descriptor.getConnBiDirectStatsIntervalLength(),
+ descriptor.getConnBiDirectBelow(),
+ descriptor.getConnBiDirectRead(),
+ descriptor.getConnBiDirectWrite(),
+ descriptor.getConnBiDirectBoth());
+ }
+ }
+
+ /**
+ * Close the relay descriptor database connection.
+ */
+ void closeConnection() {
+
+ /* Log stats about imported descriptors. */
+ this.logger.info(String.format("Finished importing relay "
+ + "descriptors: %d conn-bi-direct stats lines", rbsCount));
+
+ /* Commit any stragglers before closing. */
+ if (this.conn != null) {
+ try {
+ this.conn.commit();
+ } catch (SQLException e) {
+ this.logger.log(Level.WARNING, "Could not commit final records "
+ + "to database", e);
+ }
+ try {
+ this.conn.close();
+ } catch (SQLException e) {
+ this.logger.log(Level.WARNING, "Could not close database "
+ + "connection.", e);
+ }
+ }
+
+ /* Close raw import files. */
+ try {
+ if (this.connBiDirectOut != null) {
+ this.connBiDirectOut.write("\\.\n");
+ this.connBiDirectOut.close();
+ }
+ } catch (IOException e) {
+ this.logger.log(Level.WARNING, "Could not close one or more raw "
+ + "database import files.", e);
+ }
+ }
+}
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index c9d9bc4..05c663f 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -60,7 +60,6 @@ public final class RelayDescriptorDatabaseImporter {
private int rrsCount = 0;
private int rcsCount = 0;
private int rvsCount = 0;
- private int rbsCount = 0;
private int rqsCount = 0;
/**
@@ -94,12 +93,6 @@ public final class RelayDescriptorDatabaseImporter {
private PreparedStatement psCs;
/**
- * Prepared statement to check whether a given conn-bi-direct stats
- * string has been imported into the database before.
- */
- private PreparedStatement psBs;
-
- /**
* Prepared statement to check whether a given dirreq stats string has
* been imported into the database before.
*/
@@ -141,12 +134,6 @@ public final class RelayDescriptorDatabaseImporter {
private PreparedStatement psC;
/**
- * Prepared statement to insert a conn-bi-direct stats string into the
- * database.
- */
- private PreparedStatement psB;
-
- /**
* Prepared statement to insert a given dirreq stats string into the
* database.
*/
@@ -183,11 +170,6 @@ public final class RelayDescriptorDatabaseImporter {
private BufferedWriter consensusOut;
/**
- * Raw import file containing conn-bi-direct stats strings.
- */
- private BufferedWriter connBiDirectOut;
-
- /**
* Raw import file containing dirreq stats.
*/
private BufferedWriter dirReqOut;
@@ -260,8 +242,6 @@ public final class RelayDescriptorDatabaseImporter {
+ "FROM descriptor WHERE descriptor = ?");
this.psCs = conn.prepareStatement("SELECT COUNT(*) "
+ "FROM consensus WHERE validafter = ?");
- this.psBs = conn.prepareStatement("SELECT COUNT(*) "
- + "FROM connbidirect WHERE source = ? AND statsend = ?");
this.psQs = conn.prepareStatement("SELECT COUNT(*) "
+ "FROM dirreq_stats WHERE source = ? AND statsend = ?");
this.psR = conn.prepareStatement("INSERT INTO statusentry "
@@ -282,9 +262,6 @@ public final class RelayDescriptorDatabaseImporter {
+ "?)}");
this.psC = conn.prepareStatement("INSERT INTO consensus "
+ "(validafter, rawdesc) VALUES (?, ?)");
- this.psB = conn.prepareStatement("INSERT INTO connbidirect "
- + "(source, statsend, seconds, belownum, readnum, writenum, "
- + "bothnum) VALUES (?, ?, ?, ?, ?, ?, ?)");
this.psQ = conn.prepareStatement("INSERT INTO dirreq_stats "
+ "(source, statsend, seconds, country, requests) VALUES "
+ "(?, ?, ?, ?, ?)");
@@ -882,66 +859,6 @@ public final class RelayDescriptorDatabaseImporter {
}
/**
- * Insert a conn-bi-direct stats string into the database.
- */
- public void addConnBiDirect(String source, long statsEndMillis,
- long seconds, long below, long read, long write, long both) {
- String statsEnd = this.dateTimeFormat.format(statsEndMillis);
- if (this.importIntoDatabase) {
- try {
- this.addDateToScheduledUpdates(statsEndMillis);
- Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
- Timestamp statsEndTimestamp = new Timestamp(statsEndMillis);
- this.psBs.setString(1, source);
- this.psBs.setTimestamp(2, statsEndTimestamp, cal);
- ResultSet rs = psBs.executeQuery();
- rs.next();
- if (rs.getInt(1) == 0) {
- this.psB.clearParameters();
- this.psB.setString(1, source);
- this.psB.setTimestamp(2, statsEndTimestamp, cal);
- this.psB.setLong(3, seconds);
- this.psB.setLong(4, below);
- this.psB.setLong(5, read);
- this.psB.setLong(6, write);
- this.psB.setLong(7, both);
- this.psB.executeUpdate();
- rbsCount++;
- if (rbsCount % autoCommitCount == 0) {
- this.conn.commit();
- }
- }
- } catch (SQLException e) {
- this.logger.log(Level.WARNING, "Could not add conn-bi-direct "
- + "stats string. We won't make any further SQL requests in "
- + "this execution.", e);
- this.importIntoDatabase = false;
- }
- }
- if (this.writeRawImportFiles) {
- try {
- if (this.connBiDirectOut == null) {
- new File(rawFilesDirectory).mkdirs();
- this.connBiDirectOut = new BufferedWriter(new FileWriter(
- rawFilesDirectory + "/connbidirect.sql"));
- this.connBiDirectOut.write(" COPY connbidirect (source, "
- + "statsend, seconds, belownum, readnum, writenum, "
- + "bothnum) FROM stdin;\n");
- }
- this.connBiDirectOut.write(source + "\t" + statsEnd + "\t"
- + seconds + "\t" + below + "\t" + read + "\t" + write + "\t"
- + both + "\n");
- } catch (IOException e) {
- this.logger.log(Level.WARNING, "Could not write conn-bi-direct "
- + "stats string to raw database import file. We won't make "
- + "any further attempts to write raw import files in this "
- + "execution.", e);
- this.writeRawImportFiles = false;
- }
- }
- }
-
- /**
* Adds observations on the number of directory requests by country as
* seen on a directory at a given date to the database.
*/
@@ -1081,15 +998,6 @@ public final class RelayDescriptorDatabaseImporter {
descriptor.getDirreqStatsEndMillis(),
descriptor.getDirreqStatsIntervalLength(), obs);
}
- if (descriptor.getConnBiDirectStatsEndMillis() >= 0L) {
- this.addConnBiDirect(descriptor.getFingerprint(),
- descriptor.getConnBiDirectStatsEndMillis(),
- descriptor.getConnBiDirectStatsIntervalLength(),
- descriptor.getConnBiDirectBelow(),
- descriptor.getConnBiDirectRead(),
- descriptor.getConnBiDirectWrite(),
- descriptor.getConnBiDirectBoth());
- }
List<String> bandwidthHistoryLines = new ArrayList<String>();
if (descriptor.getWriteHistory() != null) {
bandwidthHistoryLines.add(descriptor.getWriteHistory().getLine());
@@ -1121,9 +1029,9 @@ public final class RelayDescriptorDatabaseImporter {
this.logger.info(String.format("Finished importing relay "
+ "descriptors: %d consensuses, %d network status entries, %d "
+ "votes, %d server descriptors, %d extra-info descriptors, %d "
- + "bandwidth history elements, %d dirreq stats elements, and %d "
- + "conn-bi-direct stats lines", rcsCount, rrsCount, rvsCount,
- rdsCount, resCount, rhsCount, rqsCount, rbsCount));
+ + "bandwidth history elements, and %d dirreq stats elements",
+ rcsCount, rrsCount, rvsCount, rdsCount, resCount, rhsCount,
+ rqsCount));
/* Insert scheduled updates a second time, just in case the refresh
* run has started since inserting them the first time in which case
@@ -1179,10 +1087,6 @@ public final class RelayDescriptorDatabaseImporter {
this.consensusOut.write("\\.\n");
this.consensusOut.close();
}
- if (this.connBiDirectOut != null) {
- this.connBiDirectOut.write("\\.\n");
- this.connBiDirectOut.close();
- }
} catch (IOException e) {
this.logger.log(Level.WARNING, "Could not close one or more raw "
+ "database import files.", e);
1
0
[metrics-web/master] Stop importing raw consensuses and server descriptors.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 1f2e10e5c1d0636335b521a33ef876778c13ded7
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 16:11:14 2012 +0100
Stop importing raw consensuses and server descriptors.
---
db/tordir.sql | 2 -
.../cron/RelayDescriptorDatabaseImporter.java | 48 +++++--------------
2 files changed, 13 insertions(+), 37 deletions(-)
diff --git a/db/tordir.sql b/db/tordir.sql
index 5f533c4..3749774 100644
--- a/db/tordir.sql
+++ b/db/tordir.sql
@@ -19,7 +19,6 @@ CREATE TABLE descriptor (
published TIMESTAMP WITHOUT TIME ZONE NOT NULL,
uptime BIGINT,
extrainfo CHARACTER(40),
- rawdesc BYTEA NOT NULL,
CONSTRAINT descriptor_pkey PRIMARY KEY (descriptor)
);
@@ -131,7 +130,6 @@ CREATE TRIGGER insert_statusentry_trigger
-- Contains all of the consensuses published by the directories.
CREATE TABLE consensus (
validafter TIMESTAMP WITHOUT TIME ZONE NOT NULL,
- rawdesc BYTEA NOT NULL,
CONSTRAINT consensus_pkey PRIMARY KEY (validafter)
);
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index 1bbd8d9..5d2724a 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -256,12 +256,12 @@ public final class RelayDescriptorDatabaseImporter {
+ "(descriptor, nickname, address, orport, dirport, "
+ "fingerprint, bandwidthavg, bandwidthburst, "
+ "bandwidthobserved, platform, published, uptime, "
- + "extrainfo, rawdesc) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
- + "?, ?, ?, ?)");
+ + "extrainfo) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
+ + "?)");
this.csH = conn.prepareCall("{call insert_bwhist(?, ?, ?, ?, ?, "
+ "?)}");
this.psC = conn.prepareStatement("INSERT INTO consensus "
- + "(validafter, rawdesc) VALUES (?, ?)");
+ + "(validafter) VALUES (?)");
this.psQ = conn.prepareStatement("INSERT INTO dirreq_stats "
+ "(source, statsend, seconds, country, requests) VALUES "
+ "(?, ?, ?, ?, ?)");
@@ -454,7 +454,7 @@ public final class RelayDescriptorDatabaseImporter {
String address, int orPort, int dirPort, String relayIdentifier,
long bandwidthAvg, long bandwidthBurst, long bandwidthObserved,
String platform, long published, long uptime,
- String extraInfoDigest, byte[] rawDescriptor) {
+ String extraInfoDigest) {
if (this.importIntoDatabase) {
try {
this.addDateToScheduledUpdates(published);
@@ -484,7 +484,6 @@ public final class RelayDescriptorDatabaseImporter {
this.psD.setTimestamp(11, new Timestamp(published), cal);
this.psD.setLong(12, uptime);
this.psD.setString(13, extraInfoDigest);
- this.psD.setBytes(14, rawDescriptor);
this.psD.executeUpdate();
rdsCount++;
if (rdsCount % autoCommitCount == 0) {
@@ -509,8 +508,7 @@ public final class RelayDescriptorDatabaseImporter {
this.descriptorOut.write(" COPY descriptor (descriptor, "
+ "nickname, address, orport, dirport, fingerprint, "
+ "bandwidthavg, bandwidthburst, bandwidthobserved, "
- + "platform, published, uptime, extrainfo, rawdesc) FROM "
- + "stdin;\n");
+ + "platform, published, uptime, extrainfo) FROM stdin;\n");
}
this.descriptorOut.write(descriptor.toLowerCase() + "\t"
+ nickname + "\t" + address + "\t" + orPort + "\t" + dirPort
@@ -521,17 +519,9 @@ public final class RelayDescriptorDatabaseImporter {
+ "\t" + this.dateTimeFormat.format(published) + "\t"
+ (uptime >= 0 ? uptime : "\\N") + "\t"
+ (extraInfoDigest != null ? extraInfoDigest : "\\N")
- + "\t");
- this.descriptorOut.write(PGbytea.toPGString(rawDescriptor).
- replaceAll("\\\\", "\\\\\\\\") + "\n");
+ + "\n");
} catch (UnsupportedEncodingException e) {
// US-ASCII is supported for sure
- } catch (SQLException e) {
- this.logger.log(Level.WARNING, "Could not write server "
- + "descriptor to raw database import file. We won't make "
- + "any further attempts to write raw import files in this "
- + "execution.", e);
- this.writeRawImportFiles = false;
} catch (IOException e) {
this.logger.log(Level.WARNING, "Could not write server "
+ "descriptor to raw database import file. We won't make "
@@ -547,7 +537,7 @@ public final class RelayDescriptorDatabaseImporter {
*/
public void addExtraInfoDescriptor(String extraInfoDigest,
String nickname, String fingerprint, long published,
- byte[] rawDescriptor, List<String> bandwidthHistoryLines) {
+ List<String> bandwidthHistoryLines) {
if (!bandwidthHistoryLines.isEmpty()) {
this.addBandwidthHistory(fingerprint.toLowerCase(), published,
bandwidthHistoryLines);
@@ -803,7 +793,7 @@ public final class RelayDescriptorDatabaseImporter {
/**
* Insert network status consensus into database.
*/
- public void addConsensus(long validAfter, byte[] rawDescriptor) {
+ public void addConsensus(long validAfter) {
if (this.importIntoDatabase) {
try {
this.addDateToScheduledUpdates(validAfter);
@@ -815,7 +805,6 @@ public final class RelayDescriptorDatabaseImporter {
if (rs.getInt(1) == 0) {
this.psC.clearParameters();
this.psC.setTimestamp(1, validAfterTimestamp, cal);
- this.psC.setBytes(2, rawDescriptor);
this.psC.executeUpdate();
rcsCount++;
if (rcsCount % autoCommitCount == 0) {
@@ -835,19 +824,11 @@ public final class RelayDescriptorDatabaseImporter {
new File(rawFilesDirectory).mkdirs();
this.consensusOut = new BufferedWriter(new FileWriter(
rawFilesDirectory + "/consensus.sql"));
- this.consensusOut.write(" COPY consensus (validafter, rawdesc) "
+ this.consensusOut.write(" COPY consensus (validafter) "
+ "FROM stdin;\n");
}
String validAfterString = this.dateTimeFormat.format(validAfter);
- this.consensusOut.write(validAfterString + "\t");
- this.consensusOut.write(PGbytea.toPGString(rawDescriptor).
- replaceAll("\\\\", "\\\\\\\\") + "\n");
- } catch (SQLException e) {
- this.logger.log(Level.WARNING, "Could not write network status "
- + "consensus to raw database import file. We won't make "
- + "any further attempts to write raw import files in this "
- + "execution.", e);
- this.writeRawImportFiles = false;
+ this.consensusOut.write(validAfterString + "\n");
} catch (IOException e) {
this.logger.log(Level.WARNING, "Could not write network status "
+ "consensus to raw database import file. We won't make "
@@ -967,8 +948,7 @@ public final class RelayDescriptorDatabaseImporter {
statusEntry.getBandwidth(), statusEntry.getPortList(),
statusEntry.getStatusEntryBytes());
}
- this.addConsensus(consensus.getValidAfterMillis(),
- consensus.getRawDescriptorBytes());
+ this.addConsensus(consensus.getValidAfterMillis());
}
private void addServerDescriptor(ServerDescriptor descriptor) {
@@ -978,8 +958,7 @@ public final class RelayDescriptorDatabaseImporter {
descriptor.getFingerprint(), descriptor.getBandwidthRate(),
descriptor.getBandwidthBurst(), descriptor.getBandwidthObserved(),
descriptor.getPlatform(), descriptor.getPublishedMillis(),
- descriptor.getUptime(), descriptor.getExtraInfoDigest(),
- descriptor.getRawDescriptorBytes());
+ descriptor.getUptime(), descriptor.getExtraInfoDigest());
}
private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
@@ -1016,8 +995,7 @@ public final class RelayDescriptorDatabaseImporter {
this.addExtraInfoDescriptor(descriptor.getExtraInfoDigest(),
descriptor.getNickname(),
descriptor.getFingerprint().toLowerCase(),
- descriptor.getPublishedMillis(),
- descriptor.getRawDescriptorBytes(), bandwidthHistoryLines);
+ descriptor.getPublishedMillis(), bandwidthHistoryLines);
}
/**
1
0
[metrics-web/master] Use a distinct import history file for each importer.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 2c9c339af667350504bb021af0f87429ba6aadfb
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 15:26:21 2012 +0100
Use a distinct import history file for each importer.
---
.../ernie/cron/BridgeStatsFileHandler.java | 4 ++--
.../ernie/cron/ConsensusStatsFileHandler.java | 2 +-
.../ernie/cron/PerformanceStatsImporter.java | 2 +-
.../cron/RelayDescriptorDatabaseImporter.java | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 085394c..89d65a3 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -374,7 +374,7 @@ public class BridgeStatsFileHandler {
reader.addDirectory(bridgesDir);
if (keepBridgeDescriptorImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
- "bridge-descriptor-history"));
+ "bridge-stats-bridge-descriptor-history"));
}
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
while (descriptorFiles.hasNext()) {
@@ -449,7 +449,7 @@ public class BridgeStatsFileHandler {
reader.addDirectory(archivesDirectory);
if (keepRelayDescriptorImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
- "relay-descriptor-history"));
+ "bridge-stats-relay-descriptor-history"));
}
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
while (descriptorFiles.hasNext()) {
diff --git a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
index 1fcbf19..934401b 100644
--- a/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/ConsensusStatsFileHandler.java
@@ -183,7 +183,7 @@ public class ConsensusStatsFileHandler {
reader.addDirectory(bridgesDir);
if (keepImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
- "bridge-descriptor-history"));
+ "consensus-stats-bridge-descriptor-history"));
}
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
while (descriptorFiles.hasNext()) {
diff --git a/src/org/torproject/ernie/cron/PerformanceStatsImporter.java b/src/org/torproject/ernie/cron/PerformanceStatsImporter.java
index 32d5911..105426b 100644
--- a/src/org/torproject/ernie/cron/PerformanceStatsImporter.java
+++ b/src/org/torproject/ernie/cron/PerformanceStatsImporter.java
@@ -201,7 +201,7 @@ public class PerformanceStatsImporter {
reader.addDirectory(archivesDirectory);
if (keepImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
- "connbidirect-relay-descriptor-history"));
+ "performance-stats-relay-descriptor-history"));
}
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
while (descriptorFiles.hasNext()) {
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index 05c663f..1bbd8d9 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -929,7 +929,7 @@ public final class RelayDescriptorDatabaseImporter {
reader.addDirectory(archivesDirectory);
if (keepImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
- "relay-descriptor-history"));
+ "database-importer-relay-descriptor-history"));
}
Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
while (descriptorFiles.hasNext()) {
1
0
[metrics-web/master] Implement an own config file parser for ExoneraTor.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 1936362e79e747decd0b28a9145042a369e6e5db
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 14:10:10 2012 +0100
Implement an own config file parser for ExoneraTor.
---
.../ernie/cron/ExoneraTorDatabaseImporter.java | 27 +++++++++++++++++--
1 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
index 2e6916a..5d007c2 100644
--- a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
@@ -57,9 +57,30 @@ public class ExoneraTorDatabaseImporter {
/* Learn JDBC string and directory to parse descriptors from. */
private static void readConfiguration() {
- Configuration config = new Configuration();
- jdbcString = config.getExoneraTorDatabaseJdbc();
- importDirString = config.getExoneraTorImportDirectory();
+ File configFile = new File("config");
+ if (!configFile.exists()) {
+ System.err.println("Could not find config file. Exiting.");
+ System.exit(1);
+ }
+ String line = null;
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(configFile));
+ while ((line = br.readLine()) != null) {
+ if (line.startsWith("#") || line.length() < 1) {
+ continue;
+ } else if (line.startsWith("ExoneraTorDatabaseJdbc")) {
+ jdbcString = line.split(" ")[1];
+ } else if (line.startsWith("ExoneraTorImportDirectory")) {
+ importDirString = line.split(" ")[1];
+ } else {
+ /* Ignore unrecognized configuration keys. */
+ }
+ }
+ br.close();
+ } catch (IOException e) {
+ System.err.println("Could not parse config file. Exiting.");
+ System.exit(1);
+ }
}
/* Database connection. */
1
0
13 Dec '12
commit af7f95dcc86328b558f4711a9b8e4b72688df27f
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 13:50:33 2012 +0100
Split up ArchiveReader in two parts.
---
src/org/torproject/ernie/cron/ArchiveReader.java | 173 --------------------
.../ernie/cron/BridgeStatsFileHandler.java | 68 +++++++-
src/org/torproject/ernie/cron/Main.java | 15 ++-
.../cron/RelayDescriptorDatabaseImporter.java | 135 +++++++++++++++-
4 files changed, 207 insertions(+), 184 deletions(-)
diff --git a/src/org/torproject/ernie/cron/ArchiveReader.java b/src/org/torproject/ernie/cron/ArchiveReader.java
deleted file mode 100644
index 9126787..0000000
--- a/src/org/torproject/ernie/cron/ArchiveReader.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/* Copyright 2011, 2012 The Tor Project
- * See LICENSE for licensing information */
-package org.torproject.ernie.cron;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Logger;
-
-import org.apache.commons.codec.DecoderException;
-import org.apache.commons.codec.binary.Hex;
-import org.apache.commons.codec.digest.DigestUtils;
-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.RelayNetworkStatusConsensus;
-import org.torproject.descriptor.ServerDescriptor;
-
-/**
- * Read in all files in a given directory and pass buffered readers of
- * them to the relay descriptor parser.
- */
-public class ArchiveReader {
-
- /**
- * Stats file handler that accepts parse results for bridge statistics.
- */
- private BridgeStatsFileHandler bsfh;
-
- /**
- * Relay descriptor database importer that stores relay descriptor
- * contents for later evaluation.
- */
- private RelayDescriptorDatabaseImporter rddi;
-
- /**
- * Logger for this class.
- */
- private Logger logger;
-
- public ArchiveReader(RelayDescriptorDatabaseImporter rddi,
- BridgeStatsFileHandler bsfh, File archivesDirectory,
- File statsDirectory, boolean keepImportHistory) {
-
- if (archivesDirectory == null ||
- statsDirectory == null) {
- throw new IllegalArgumentException();
- }
-
- this.rddi = rddi;
- this.bsfh = bsfh;
-
- this.logger = Logger.getLogger(ArchiveReader.class.getName());
- if (archivesDirectory.exists()) {
- logger.fine("Importing files in directory " + archivesDirectory
- + "/...");
- DescriptorReader reader =
- DescriptorSourceFactory.createDescriptorReader();
- reader.addDirectory(archivesDirectory);
- if (keepImportHistory) {
- reader.setExcludeFiles(new File(statsDirectory,
- "relay-descriptor-history"));
- }
- Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
- while (descriptorFiles.hasNext()) {
- DescriptorFile descriptorFile = descriptorFiles.next();
- if (descriptorFile.getDescriptors() != null) {
- for (Descriptor descriptor : descriptorFile.getDescriptors()) {
- if (descriptor instanceof RelayNetworkStatusConsensus) {
- this.addRelayNetworkStatusConsensus(
- (RelayNetworkStatusConsensus) descriptor);
- } else if (descriptor instanceof ServerDescriptor) {
- this.addServerDescriptor((ServerDescriptor) descriptor);
- } else if (descriptor instanceof ExtraInfoDescriptor) {
- this.addExtraInfoDescriptor(
- (ExtraInfoDescriptor) descriptor);
- }
- }
- }
- }
- }
-
- logger.info("Finished importing relay descriptors.");
- }
-
- private void addRelayNetworkStatusConsensus(
- RelayNetworkStatusConsensus consensus) {
- for (NetworkStatusEntry statusEntry :
- consensus.getStatusEntries().values()) {
- this.rddi.addStatusEntry(consensus.getValidAfterMillis(),
- statusEntry.getNickname(),
- statusEntry.getFingerprint().toLowerCase(),
- statusEntry.getDescriptor().toLowerCase(),
- statusEntry.getPublishedMillis(), statusEntry.getAddress(),
- statusEntry.getOrPort(), statusEntry.getDirPort(),
- statusEntry.getFlags(), statusEntry.getVersion(),
- statusEntry.getBandwidth(), statusEntry.getPortList(),
- statusEntry.getStatusEntryBytes());
- try {
- this.bsfh.addHashedRelay(DigestUtils.shaHex(Hex.decodeHex(
- statusEntry.getFingerprint().toCharArray())).toUpperCase());
- } catch (DecoderException e) {
- }
- }
- this.rddi.addConsensus(consensus.getValidAfterMillis(),
- consensus.getRawDescriptorBytes());
- }
-
- private void addServerDescriptor(ServerDescriptor descriptor) {
- this.rddi.addServerDescriptor(descriptor.getServerDescriptorDigest(),
- descriptor.getNickname(), descriptor.getAddress(),
- descriptor.getOrPort(), descriptor.getDirPort(),
- descriptor.getFingerprint(), descriptor.getBandwidthRate(),
- descriptor.getBandwidthBurst(), descriptor.getBandwidthObserved(),
- descriptor.getPlatform(), descriptor.getPublishedMillis(),
- descriptor.getUptime(), descriptor.getExtraInfoDigest(),
- descriptor.getRawDescriptorBytes());
- }
-
- private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
- if (descriptor.getDirreqV3Reqs() != null) {
- int allUsers = 0;
- Map<String, String> obs = new HashMap<String, String>();
- for (Map.Entry<String, Integer> e :
- descriptor.getDirreqV3Reqs().entrySet()) {
- String country = e.getKey();
- int users = e.getValue() - 4;
- allUsers += users;
- obs.put(country, "" + users);
- }
- obs.put("zy", "" + allUsers);
- this.rddi.addDirReqStats(descriptor.getFingerprint(),
- descriptor.getDirreqStatsEndMillis(),
- descriptor.getDirreqStatsIntervalLength(), obs);
- }
- if (descriptor.getConnBiDirectStatsEndMillis() >= 0L) {
- this.rddi.addConnBiDirect(descriptor.getFingerprint(),
- descriptor.getConnBiDirectStatsEndMillis(),
- descriptor.getConnBiDirectStatsIntervalLength(),
- descriptor.getConnBiDirectBelow(),
- descriptor.getConnBiDirectRead(),
- descriptor.getConnBiDirectWrite(),
- descriptor.getConnBiDirectBoth());
- }
- List<String> bandwidthHistoryLines = new ArrayList<String>();
- if (descriptor.getWriteHistory() != null) {
- bandwidthHistoryLines.add(descriptor.getWriteHistory().getLine());
- }
- if (descriptor.getReadHistory() != null) {
- bandwidthHistoryLines.add(descriptor.getReadHistory().getLine());
- }
- if (descriptor.getDirreqWriteHistory() != null) {
- bandwidthHistoryLines.add(
- descriptor.getDirreqWriteHistory().getLine());
- }
- if (descriptor.getDirreqReadHistory() != null) {
- bandwidthHistoryLines.add(
- descriptor.getDirreqReadHistory().getLine());
- }
- this.rddi.addExtraInfoDescriptor(descriptor.getExtraInfoDigest(),
- descriptor.getNickname(),
- descriptor.getFingerprint().toLowerCase(),
- descriptor.getPublishedMillis(),
- descriptor.getRawDescriptorBytes(), bandwidthHistoryLines);
- }
-}
-
diff --git a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
index 4534d2f..085394c 100644
--- a/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
+++ b/src/org/torproject/ernie/cron/BridgeStatsFileHandler.java
@@ -29,11 +29,16 @@ import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
+import org.apache.commons.codec.DecoderException;
+import org.apache.commons.codec.binary.Hex;
+import org.apache.commons.codec.digest.DigestUtils;
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.RelayNetworkStatusConsensus;
import org.torproject.descriptor.ServerDescriptor;
/**
@@ -117,7 +122,11 @@ public class BridgeStatsFileHandler {
private File statsDirectory;
- private boolean keepImportHistory;
+ private boolean keepBridgeDescriptorImportHistory;
+
+ private File archivesDirectory;
+
+ private boolean keepRelayDescriptorImportHistory;
/**
* Initializes this class, including reading in intermediate results
@@ -125,14 +134,21 @@ public class BridgeStatsFileHandler {
* <code>stats/hashed-relay-identities</code>.
*/
public BridgeStatsFileHandler(String connectionURL,
- File bridgesDir, File statsDirectory, boolean keepImportHistory) {
+ File bridgesDir, File statsDirectory,
+ boolean keepBridgeDescriptorImportHistory, File archivesDirectory,
+ boolean keepRelayDescriptorImportHistory) {
- if (bridgesDir == null || statsDirectory == null) {
- throw new IllegalArgumentException();
+ if (bridgesDir == null || statsDirectory == null ||
+ archivesDirectory == null || statsDirectory == null) {
+ throw new IllegalArgumentException();
}
this.bridgesDir = bridgesDir;
this.statsDirectory = statsDirectory;
- this.keepImportHistory = keepImportHistory;
+ this.keepBridgeDescriptorImportHistory =
+ keepBridgeDescriptorImportHistory;
+ this.archivesDirectory = archivesDirectory;
+ this.keepRelayDescriptorImportHistory =
+ keepRelayDescriptorImportHistory;
/* Initialize set of known countries. */
this.countries = new TreeSet<String>();
@@ -356,7 +372,7 @@ public class BridgeStatsFileHandler {
DescriptorReader reader =
DescriptorSourceFactory.createDescriptorReader();
reader.addDirectory(bridgesDir);
- if (keepImportHistory) {
+ if (keepBridgeDescriptorImportHistory) {
reader.setExcludeFiles(new File(statsDirectory,
"bridge-descriptor-history"));
}
@@ -424,6 +440,46 @@ public class BridgeStatsFileHandler {
}
}
+ public void importRelayDescriptors() {
+ if (archivesDirectory.exists()) {
+ logger.fine("Importing files in directory " + archivesDirectory
+ + "/...");
+ DescriptorReader reader =
+ DescriptorSourceFactory.createDescriptorReader();
+ reader.addDirectory(archivesDirectory);
+ if (keepRelayDescriptorImportHistory) {
+ reader.setExcludeFiles(new File(statsDirectory,
+ "relay-descriptor-history"));
+ }
+ Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() != null) {
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (descriptor instanceof RelayNetworkStatusConsensus) {
+ this.addRelayNetworkStatusConsensus(
+ (RelayNetworkStatusConsensus) descriptor);
+ }
+ }
+ }
+ }
+ }
+
+ logger.info("Finished importing relay descriptors.");
+ }
+
+ private void addRelayNetworkStatusConsensus(
+ RelayNetworkStatusConsensus consensus) {
+ for (NetworkStatusEntry statusEntry :
+ consensus.getStatusEntries().values()) {
+ try {
+ this.addHashedRelay(DigestUtils.shaHex(Hex.decodeHex(
+ statusEntry.getFingerprint().toCharArray())).toUpperCase());
+ } catch (DecoderException e) {
+ }
+ }
+ }
+
/**
* Writes the list of hashed relay identities and bridge user numbers as
* observed by single bridges to disk, aggregates per-day statistics for
diff --git a/src/org/torproject/ernie/cron/Main.java b/src/org/torproject/ernie/cron/Main.java
index 457433f..a3f38e6 100644
--- a/src/org/torproject/ernie/cron/Main.java
+++ b/src/org/torproject/ernie/cron/Main.java
@@ -37,7 +37,9 @@ public class Main {
new BridgeStatsFileHandler(
config.getRelayDescriptorDatabaseJDBC(),
new File(config.getSanitizedBridgesDirectory()),
- statsDirectory, config.getKeepSanitizedBridgesImportHistory()) :
+ statsDirectory, config.getKeepSanitizedBridgesImportHistory(),
+ new File(config.getDirectoryArchivesDirectory()),
+ config.getKeepDirectoryArchiveImportHistory()) :
null;
// Import relay descriptors
@@ -49,11 +51,16 @@ public class Main {
config.getWriteRelayDescriptorDatabase() ?
config.getRelayDescriptorDatabaseJDBC() : null,
config.getWriteRelayDescriptorsRawFiles() ?
- config.getRelayDescriptorRawFilesDirectory() : null) : null;
- new ArchiveReader(rddi, bsfh,
+ config.getRelayDescriptorRawFilesDirectory() : null,
new File(config.getDirectoryArchivesDirectory()),
statsDirectory,
- config.getKeepDirectoryArchiveImportHistory());
+ config.getKeepDirectoryArchiveImportHistory()) : null;
+ if (rddi != null) {
+ rddi.importRelayDescriptors();
+ }
+ if (bsfh != null) {
+ bsfh.importRelayDescriptors();
+ }
rddi.closeConnection();
}
diff --git a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
index 3e7e694..c9d9bc4 100644
--- a/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
+++ b/src/org/torproject/ernie/cron/RelayDescriptorDatabaseImporter.java
@@ -16,8 +16,11 @@ import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Calendar;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -28,6 +31,14 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import org.postgresql.util.PGbytea;
+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.RelayNetworkStatusConsensus;
+import org.torproject.descriptor.ServerDescriptor;
/**
* Parse directory data.
@@ -207,12 +218,25 @@ public final class RelayDescriptorDatabaseImporter {
private boolean importIntoDatabase;
private boolean writeRawImportFiles;
+ private File archivesDirectory;
+ private File statsDirectory;
+ private boolean keepImportHistory;
+
/**
* Initialize database importer by connecting to the database and
* preparing statements.
*/
public RelayDescriptorDatabaseImporter(String connectionURL,
- String rawFilesDirectory) {
+ String rawFilesDirectory, File archivesDirectory,
+ File statsDirectory, boolean keepImportHistory) {
+
+ if (archivesDirectory == null ||
+ statsDirectory == null) {
+ throw new IllegalArgumentException();
+ }
+ this.archivesDirectory = archivesDirectory;
+ this.statsDirectory = statsDirectory;
+ this.keepImportHistory = keepImportHistory;
/* Initialize logger. */
this.logger = Logger.getLogger(
@@ -979,6 +1003,115 @@ public final class RelayDescriptorDatabaseImporter {
}
}
+ public void importRelayDescriptors() {
+ if (archivesDirectory.exists()) {
+ logger.fine("Importing files in directory " + archivesDirectory
+ + "/...");
+ DescriptorReader reader =
+ DescriptorSourceFactory.createDescriptorReader();
+ reader.addDirectory(archivesDirectory);
+ if (keepImportHistory) {
+ reader.setExcludeFiles(new File(statsDirectory,
+ "relay-descriptor-history"));
+ }
+ Iterator<DescriptorFile> descriptorFiles = reader.readDescriptors();
+ while (descriptorFiles.hasNext()) {
+ DescriptorFile descriptorFile = descriptorFiles.next();
+ if (descriptorFile.getDescriptors() != null) {
+ for (Descriptor descriptor : descriptorFile.getDescriptors()) {
+ if (descriptor instanceof RelayNetworkStatusConsensus) {
+ this.addRelayNetworkStatusConsensus(
+ (RelayNetworkStatusConsensus) descriptor);
+ } else if (descriptor instanceof ServerDescriptor) {
+ this.addServerDescriptor((ServerDescriptor) descriptor);
+ } else if (descriptor instanceof ExtraInfoDescriptor) {
+ this.addExtraInfoDescriptor(
+ (ExtraInfoDescriptor) descriptor);
+ }
+ }
+ }
+ }
+ }
+
+ logger.info("Finished importing relay descriptors.");
+ }
+
+ private void addRelayNetworkStatusConsensus(
+ RelayNetworkStatusConsensus consensus) {
+ for (NetworkStatusEntry statusEntry :
+ consensus.getStatusEntries().values()) {
+ this.addStatusEntry(consensus.getValidAfterMillis(),
+ statusEntry.getNickname(),
+ statusEntry.getFingerprint().toLowerCase(),
+ statusEntry.getDescriptor().toLowerCase(),
+ statusEntry.getPublishedMillis(), statusEntry.getAddress(),
+ statusEntry.getOrPort(), statusEntry.getDirPort(),
+ statusEntry.getFlags(), statusEntry.getVersion(),
+ statusEntry.getBandwidth(), statusEntry.getPortList(),
+ statusEntry.getStatusEntryBytes());
+ }
+ this.addConsensus(consensus.getValidAfterMillis(),
+ consensus.getRawDescriptorBytes());
+ }
+
+ private void addServerDescriptor(ServerDescriptor descriptor) {
+ this.addServerDescriptor(descriptor.getServerDescriptorDigest(),
+ descriptor.getNickname(), descriptor.getAddress(),
+ descriptor.getOrPort(), descriptor.getDirPort(),
+ descriptor.getFingerprint(), descriptor.getBandwidthRate(),
+ descriptor.getBandwidthBurst(), descriptor.getBandwidthObserved(),
+ descriptor.getPlatform(), descriptor.getPublishedMillis(),
+ descriptor.getUptime(), descriptor.getExtraInfoDigest(),
+ descriptor.getRawDescriptorBytes());
+ }
+
+ private void addExtraInfoDescriptor(ExtraInfoDescriptor descriptor) {
+ if (descriptor.getDirreqV3Reqs() != null) {
+ int allUsers = 0;
+ Map<String, String> obs = new HashMap<String, String>();
+ for (Map.Entry<String, Integer> e :
+ descriptor.getDirreqV3Reqs().entrySet()) {
+ String country = e.getKey();
+ int users = e.getValue() - 4;
+ allUsers += users;
+ obs.put(country, "" + users);
+ }
+ obs.put("zy", "" + allUsers);
+ this.addDirReqStats(descriptor.getFingerprint(),
+ descriptor.getDirreqStatsEndMillis(),
+ descriptor.getDirreqStatsIntervalLength(), obs);
+ }
+ if (descriptor.getConnBiDirectStatsEndMillis() >= 0L) {
+ this.addConnBiDirect(descriptor.getFingerprint(),
+ descriptor.getConnBiDirectStatsEndMillis(),
+ descriptor.getConnBiDirectStatsIntervalLength(),
+ descriptor.getConnBiDirectBelow(),
+ descriptor.getConnBiDirectRead(),
+ descriptor.getConnBiDirectWrite(),
+ descriptor.getConnBiDirectBoth());
+ }
+ List<String> bandwidthHistoryLines = new ArrayList<String>();
+ if (descriptor.getWriteHistory() != null) {
+ bandwidthHistoryLines.add(descriptor.getWriteHistory().getLine());
+ }
+ if (descriptor.getReadHistory() != null) {
+ bandwidthHistoryLines.add(descriptor.getReadHistory().getLine());
+ }
+ if (descriptor.getDirreqWriteHistory() != null) {
+ bandwidthHistoryLines.add(
+ descriptor.getDirreqWriteHistory().getLine());
+ }
+ if (descriptor.getDirreqReadHistory() != null) {
+ bandwidthHistoryLines.add(
+ descriptor.getDirreqReadHistory().getLine());
+ }
+ this.addExtraInfoDescriptor(descriptor.getExtraInfoDigest(),
+ descriptor.getNickname(),
+ descriptor.getFingerprint().toLowerCase(),
+ descriptor.getPublishedMillis(),
+ descriptor.getRawDescriptorBytes(), bandwidthHistoryLines);
+ }
+
/**
* Close the relay descriptor database connection.
*/
1
0
[metrics-web/master] Disable relay flags graph on hourly detail.
by karsten@torproject.org 13 Dec '12
by karsten@torproject.org 13 Dec '12
13 Dec '12
commit 1f8f8ea57dd0636b28fa1fa56bd3306ec848f27a
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Dec 13 10:16:38 2012 +0100
Disable relay flags graph on hourly detail.
Implements #7652.
---
etc/web.xml | 3 ---
.../ernie/web/GraphParameterChecker.java | 2 +-
src/org/torproject/ernie/web/RObjectGenerator.java | 1 -
web/WEB-INF/network.jsp | 4 ----
4 files changed, 1 insertions(+), 9 deletions(-)
diff --git a/etc/web.xml b/etc/web.xml
index 903f23d..c7262ef 100644
--- a/etc/web.xml
+++ b/etc/web.xml
@@ -169,9 +169,6 @@
<url-pattern>/relayflags.png</url-pattern>
<url-pattern>/relayflags.pdf</url-pattern>
<url-pattern>/relayflags.svg</url-pattern>
- <url-pattern>/relayflags-hour.png</url-pattern>
- <url-pattern>/relayflags-hour.pdf</url-pattern>
- <url-pattern>/relayflags-hour.svg</url-pattern>
<url-pattern>/versions.png</url-pattern>
<url-pattern>/versions.pdf</url-pattern>
<url-pattern>/versions.svg</url-pattern>
diff --git a/src/org/torproject/ernie/web/GraphParameterChecker.java b/src/org/torproject/ernie/web/GraphParameterChecker.java
index d2386dd..e93f9ea 100644
--- a/src/org/torproject/ernie/web/GraphParameterChecker.java
+++ b/src/org/torproject/ernie/web/GraphParameterChecker.java
@@ -50,7 +50,7 @@ public class GraphParameterChecker {
this.knownParameterValues = new HashMap<String, String>();
this.knownParameterValues.put("flag",
"Running,Exit,Guard,Fast,Stable");
- this.knownParameterValues.put("granularity", "day,hour");
+ this.knownParameterValues.put("granularity", "day");
StringBuilder sb = new StringBuilder("all");
for (String[] country : Countries.getInstance().getCountryList()) {
sb.append("," + country[0]);
diff --git a/src/org/torproject/ernie/web/RObjectGenerator.java b/src/org/torproject/ernie/web/RObjectGenerator.java
index be01d0b..086d321 100644
--- a/src/org/torproject/ernie/web/RObjectGenerator.java
+++ b/src/org/torproject/ernie/web/RObjectGenerator.java
@@ -71,7 +71,6 @@ public class RObjectGenerator implements ServletContextListener {
this.availableCsvFiles.add("platforms");
this.availableCsvFiles.add("relaycountries");
this.availableCsvFiles.add("relayflags");
- this.availableCsvFiles.add("relayflags-hour");
this.availableCsvFiles.add("torperf");
this.availableCsvFiles.add("torperf-failures");
this.availableCsvFiles.add("versions");
diff --git a/web/WEB-INF/network.jsp b/web/WEB-INF/network.jsp
index cc783d5..a43c46e 100644
--- a/web/WEB-INF/network.jsp
+++ b/web/WEB-INF/network.jsp
@@ -114,10 +114,6 @@ average number of relays with these flags assigned.</p>
<input type="checkbox" name="flag" value="Guard"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Guard')}"> checked</c:if>> Guard
<input type="checkbox" name="flag" value="Stable"<c:if test="${fn:length(relayflags_flag) == 0 or fn:contains(fn:join(relayflags_flag, ','), 'Stable')}"> checked</c:if>> Stable
</p><p>
- Granularity:
- <input type="radio" name="granularity" value="day" <c:if test="${fn:length(relayflags_granularity) == 0 or relayflags_granularity[0] eq 'day'}"> checked</c:if>> 1 day
- <input type="radio" name="granularity" value="hour" <c:if test="${relayflags_granularity[0] eq 'hour'}"> checked</c:if>> 1 hour
- </p><p>
<input class="submit" type="submit" value="Update graph">
</p>
</div>
1
0
[translation/vidalia_completed] Update translations for vidalia_completed
by translation@torproject.org 13 Dec '12
by translation@torproject.org 13 Dec '12
13 Dec '12
commit d692ed1cb865c32ffebb2914a319d5aa2574d534
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Dec 13 07:15:23 2012 +0000
Update translations for vidalia_completed
---
he/vidalia_he.po | 344 +++++++++++++++++++++++++++---------------------------
1 files changed, 172 insertions(+), 172 deletions(-)
diff --git a/he/vidalia_he.po b/he/vidalia_he.po
index a2e081b..2f61536 100644
--- a/he/vidalia_he.po
+++ b/he/vidalia_he.po
@@ -1,4 +1,4 @@
-#
+# Translators:
# Translators:
# Amichay P. K. <am1chay.p.k(a)gmail.com>, 2011.
# <arab.with.nargila(a)gmail.com>, 2012.
@@ -13,14 +13,14 @@ msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2012-03-21 17:52+0000\n"
-"PO-Revision-Date: 2012-07-22 13:45+0000\n"
+"PO-Revision-Date: 2012-12-13 07:09+0000\n"
"Last-Translator: GenghisKhan <genghiskhan(a)gmx.ca>\n"
"Language-Team: translations(a)vidalia-project.net\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: he\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Vidalia ts2po 0.2\n"
msgctxt "AboutDialog"
@@ -54,7 +54,7 @@ msgstr "בחרת באימות 'סיסמה', אך לא ציינת סיסמה."
msgctxt "AdvancedPage"
msgid "Select Tor Configuration File"
-msgstr "בחירת קובץ הגדרות Tor"
+msgstr "בחר קובץ תצורת Tor"
msgctxt "AdvancedPage"
msgid "File Not Found"
@@ -74,7 +74,7 @@ msgstr "לא יכול ליצור %1 [%2]"
msgctxt "AdvancedPage"
msgid "Select a Directory to Use for Tor Data"
-msgstr "בחירת ספריה לשימוש עבור מידע של Tor"
+msgstr "בחר ספריה לשימוש עבור נתונים של Tor"
msgctxt "AdvancedPage"
msgid "Unable to remove Tor Service"
@@ -118,15 +118,15 @@ msgstr ":"
msgctxt "AdvancedPage"
msgid "Tor Configuration File"
-msgstr "קובץ הגדרות Tor"
+msgstr "קובץ תצורת Tor"
msgctxt "AdvancedPage"
msgid "Start the Tor software with the specified configuration file (torrc)"
-msgstr "הפעלת Tor באמצעות קובץ ההגדרות המצוין (torrc)"
+msgstr "התחל את Tor באמצעות קובץ התצורה המצוין (torrc)"
msgctxt "AdvancedPage"
msgid "Select path to your configuration file"
-msgstr "בחירת נתיב אל קובץ ההגדרות"
+msgstr "בחר נתיב אל קובץ ההגדרות"
msgctxt "AdvancedPage"
msgid "Browse"
@@ -134,23 +134,23 @@ msgstr "עיון"
msgctxt "AdvancedPage"
msgid "Data Directory"
-msgstr "מדור מידע"
+msgstr "מדור נתונים"
msgctxt "AdvancedPage"
msgid "Store data for the Tor software in the following directory"
-msgstr "אחסון מידע עבור Tor במדור זה"
+msgstr "אחסן נתונים עבור התוכנה Tor במדור הבא"
msgctxt "AdvancedPage"
msgid "Select the directory used to store data for the Tor software"
-msgstr "בחירת המדור שישמש לאחסון מידע עבור Tor"
+msgstr "בחר את המדור שישמש לאחסון נתונים עבור התוכנה Tor"
msgctxt "AdvancedPage"
msgid "Tor Control"
-msgstr "שליטה ב-Tor"
+msgstr "בקרת Tor"
msgctxt "AdvancedPage"
msgid "Use TCP connection (ControlPort)"
-msgstr "שימוש בחיבור TCP (ControlPort)"
+msgstr "השתמש בחיבור TCP (ControlPort)"
msgctxt "AdvancedPage"
msgid "Path:"
@@ -158,11 +158,11 @@ msgstr "נתיב:"
msgctxt "AdvancedPage"
msgid "Use Unix domain socket (ControlSocket)"
-msgstr "שימוש ב-Unix domain socket (ControlSocket)"
+msgstr "השתמש ב-Unix domain socket (ControlSocket)"
msgctxt "AdvancedPage"
msgid "Edit current torrc"
-msgstr "עריכת קובץ torrc נוכחי"
+msgstr "ערוך קובץ torrc נוכחי"
msgctxt "AdvancedPage"
msgid "NOTE: this will edit the currently loaded torrc"
@@ -170,7 +170,7 @@ msgstr "לתשומת לבך: פעולה זו תערוך את קובץ torrc שט
msgctxt "AdvancedPage"
msgid "ControlSocket path doesn't exist."
-msgstr "נתיב הקרת Socket אינו קיים."
+msgstr "נתיב בקרת Socket אינו קיים."
msgctxt "AdvancedPage"
msgid ""
@@ -182,7 +182,7 @@ msgctxt "AdvancedPage"
msgid ""
"The specified Tor data directory location contains characters that cannot be"
" represented in your system's current 8-bit character encoding."
-msgstr "מיקום מדור מידע Tor שצוין מכיל תווים שלא ניתן להציגם בקידוד 8-bit הנוכחי של מערכתך."
+msgstr "מיקום מדור נתוני Tor שצוין מכיל תווים שלא ניתן להציגם בקידוד 8-bit הנוכחי של מערכתך."
msgctxt "AdvancedPage"
msgid "Warning"
@@ -198,25 +198,25 @@ msgstr "קובץ תצורת Tor (torrc);;כל הקבצים (*)"
msgctxt "AdvancedPage"
msgid "Select a file to use for Tor socket path"
-msgstr "בחירת קובץ לשימוש עבור Tor socket path"
+msgstr "בחר קובץ לשימוש עבור Tor socket path"
msgctxt "AdvancedPage"
msgid "Configure ControlPort automatically"
-msgstr "הגדרה אוטומטית של בקרת־יציאה (ControlPort)"
+msgstr "הגדר בקרת־יציאה (ControlPort) אוטומטית"
msgctxt "AdvancedPage"
msgid ""
"You've checked the autoconfiguration option for the ControlPort, but "
"provided no Data Directory. Please add one, or uncheck the \"Configure "
"ControlPort automatically\" option."
-msgstr "בחרת באפשרות תצורה אוטומטית עבור בקרת יציאה, אולם לא סיפקת מידע מדור. נא להוסיף אחד, או לכבות את האפשרות \"הגדרה אוטומטית של בקרת־יציאה\"."
+msgstr "בחרת באפשרות תצורה אוטומטית עבור בקרת יציאה, אולם לא סיפקת מדור נתונים. נא להוסיף אחד, או לכבות את האפשרות \"הגדר בקרת־יציאה אוטומטית\"."
msgctxt "AdvancedPage"
msgid ""
"Vidalia was unable to remove the Tor service.\n"
"\n"
"You may need to remove it manually."
-msgstr "Vidalia לא מסוגל היה להסיר את Tor.\n\nייתכן שעליך להסיר אותו ידנית."
+msgstr "Vidalia לא היה מסוגל להסיר את Tor.\n\nייתכן שעליך להסיר אותו ידנית."
msgctxt "AppearancePage"
msgid "Language"
@@ -224,7 +224,7 @@ msgstr "שפה"
msgctxt "AppearancePage"
msgid "Choose the language used in Vidalia"
-msgstr "בחירת שפה לשימוש ביישום Vidalia"
+msgstr "בחר את השפה לשימוש ביישום Vidalia"
msgctxt "AppearancePage"
msgid "Style"
@@ -232,11 +232,11 @@ msgstr "סגנון"
msgctxt "AppearancePage"
msgid "Choose Vidalia's interface style"
-msgstr "בחירת סגנון הממשק של Vidalia"
+msgstr "בחר את סגנון הממשק של Vidalia"
msgctxt "AppearancePage"
msgid "Vidalia was unable to load the selected language translation."
-msgstr "Vidalia לא מסוגל היה לטעון את קבצי התרגום הנבחרים."
+msgstr "Vidalia לא היה מסוגל לטעון את קבצי התרגום הנבחרים."
msgctxt "AppearancePage"
msgid ""
@@ -245,15 +245,15 @@ msgstr "העדפות סמל מערכת (שינויים יכנסו לתוקף ב
msgctxt "AppearancePage"
msgid "Show the Tray Icon and Dock Icon (default)"
-msgstr "הצגת סמל המגש וסמל הרציף (ברירת מחדל)"
+msgstr "הצג את סמל המגש ואת סמל הרציף (ברירת מחדל)"
msgctxt "AppearancePage"
msgid "Hide the Tray Icon"
-msgstr "הסתרת סמל המגש"
+msgstr "הסתר את סמל המגש"
msgctxt "AppearancePage"
msgid "Hide the Dock Icon"
-msgstr "הסתרת סמל הרציף"
+msgstr "הסתר את סמל הרציף"
msgctxt "BandwidthGraph"
msgid "Since:"
@@ -261,15 +261,15 @@ msgstr "מאז:"
msgctxt "BandwidthGraph"
msgid "Hide Settings"
-msgstr "הסתרת הגדרות"
+msgstr "הסתר הגדרות"
msgctxt "BandwidthGraph"
msgid "Show Settings"
-msgstr "הצגת הגדרות"
+msgstr "הצג הגדרות"
msgctxt "BandwidthGraph"
msgid "Tor Bandwidth Usage"
-msgstr "שימוש רוחב פס של Tor"
+msgstr "ניצול רוחב פס של Tor"
msgctxt "BandwidthGraph"
msgid "Reset"
@@ -293,7 +293,7 @@ msgstr "סגנון"
msgctxt "BandwidthGraph"
msgid "Changes the transparency of the Bandwidth Graph"
-msgstr "שינוי את השקיפות של גרף רוחב הפס"
+msgstr "משנה את השקיפות של גרף רוחב הפס"
msgctxt "BandwidthGraph"
msgid "100"
@@ -305,7 +305,7 @@ msgstr "% אטום"
msgctxt "BandwidthGraph"
msgid "Save"
-msgstr "שמירה"
+msgstr "שמור"
msgctxt "BandwidthGraph"
msgid "Cancel"
@@ -329,7 +329,7 @@ msgstr "טוען כעת רשימת גשרים..."
msgctxt "BridgeDownloaderProgressDialog"
msgid "Downloading Bridges"
-msgstr "טוען גשרים כעת..."
+msgstr "טוען כעת גשרים..."
msgctxt "BridgeDownloaderProgressDialog"
msgid "Unable to download bridges: %1"
@@ -337,7 +337,7 @@ msgstr "לא מסוגל לטעון גשרים: %1"
msgctxt "BridgeDownloaderProgressDialog"
msgid "Retrying bridge request..."
-msgstr "מנסה שוב בקשת גשר כעת..."
+msgstr "מנסה כעת בקשת גשר פעם נוספת..."
msgctxt "BridgeUsageDialog"
msgid "Country"
@@ -345,7 +345,7 @@ msgstr "מדינה"
msgctxt "BridgeUsageDialog"
msgid "# Clients"
-msgstr "# לקוחות"
+msgstr "מס׳ לקוחות"
msgctxt "BridgeUsageDialog"
msgid "Clients from the following countries have used your relay since %1"
@@ -353,7 +353,7 @@ msgstr "לקוחות מן המדינות הבאות השתמשו בממסרך מ
msgctxt "BridgeUsageDialog"
msgid "Bridge Usage Summary"
-msgstr "סיכום שימוש בגשר"
+msgstr "סיכום ניצול גשר"
msgctxt "BridgeUsageDialog"
msgid "Client Summary"
@@ -365,7 +365,7 @@ msgstr "חדש"
msgctxt "Circuit"
msgid "Open"
-msgstr "פתוח"
+msgstr "פתח"
msgctxt "Circuit"
msgid "Building"
@@ -377,7 +377,7 @@ msgstr "נכשל"
msgctxt "Circuit"
msgid "Closed"
-msgstr "סגירה"
+msgstr "סגור"
msgctxt "Circuit"
msgid "Unknown"
@@ -487,7 +487,7 @@ msgstr "שגיאה בעת שליחת פקודת בקרה. (%1)"
msgctxt "ControlSocket"
msgid "Socket disconnected while attempting to read a line of data."
-msgstr "Socket נסגר במהלך ניסיון לקרוא שורת מידע."
+msgstr "Socket נסגר במהלך ניסיון לקרוא שורת נתונים."
msgctxt "ControlSocket"
msgid "Invalid control reply. [%1]"
@@ -1313,7 +1313,7 @@ msgctxt "CrashReportDialog"
msgid ""
"We were unable to automatically restart Vidalia. Please restart Vidalia "
"manually."
-msgstr "אין ביכולתנו לאתחל את Vidalia באופן אוטומטי. נא לאתחל את Vidalia ידנית."
+msgstr "לא היה ביכולתנו לאתחל את Vidalia באופן אוטומטי. נא לאתחל את Vidalia ידנית."
msgctxt "CrashReportDialog"
msgid "Please fill a ticket in:"
@@ -1344,11 +1344,11 @@ msgstr "קבצי הרצה (*.exe)"
msgctxt "GeneralPage"
msgid "Select Path to Tor"
-msgstr "בחירת נתיב אל Tor"
+msgstr "בחר נתיב אל Tor"
msgctxt "GeneralPage"
msgid "Select Proxy Executable"
-msgstr "בחירת קובץ הרצה לפרוקסי"
+msgstr "בחר קובץ הרצה לפרוקסי"
msgctxt "GeneralPage"
msgid "You must specify the name of your Tor executable."
@@ -1492,11 +1492,11 @@ msgstr "Ctrl+F"
msgctxt "HelpBrowser"
msgid "Close"
-msgstr "סגירה"
+msgstr "סגור"
msgctxt "HelpBrowser"
msgid "Close Vidalia Help"
-msgstr "סגירת עזרה - Vidalia"
+msgstr "סגירת עזרה של Vidalia"
msgctxt "HelpBrowser"
msgid "Esc"
@@ -1536,7 +1536,7 @@ msgstr "חיפוש"
msgctxt "HelpBrowser"
msgid "Searching for:"
-msgstr "מחפש:"
+msgstr "מחפש עבור:"
msgctxt "HelpBrowser"
msgid "Found Documents"
@@ -1637,7 +1637,7 @@ msgstr "Unknown"
msgctxt "MainWindow"
msgid "Start Tor"
-msgstr "הפעלת Tor"
+msgstr "התחל את Tor"
msgctxt "MainWindow"
msgid "Exit"
@@ -1721,7 +1721,7 @@ msgstr "שגיאה בעת הפעלת דפדפן"
msgctxt "MainWindow"
msgid "Vidalia was unable to start the configured web browser"
-msgstr "Vidalia לא מסוגל היה להפעיל את דפדפן הרשת המוגדר"
+msgstr "Vidalia לא היה מסוגל להפעיל את דפדפן הרשת המוגדר"
msgctxt "MainWindow"
msgid "Error starting IM client"
@@ -1729,7 +1729,7 @@ msgstr "שגיאה בעת הפעלת לקוח מסרים מידיים"
msgctxt "MainWindow"
msgid "Vidalia was unable to start the configured IM client"
-msgstr "Vidalia לא מסוגל היה להפעיל את לקוח המסרים המידיים המוגדר"
+msgstr "Vidalia לא היה מסוגל להפעיל את לקוח המסרים המידיים המוגדר"
msgctxt "MainWindow"
msgid "Error starting proxy server"
@@ -1737,7 +1737,7 @@ msgstr "שגיאה בעת הפעלת שרת פרוקסי"
msgctxt "MainWindow"
msgid "Vidalia was unable to start the configured proxy server"
-msgstr "Vidalia לא מסוגל היה להפעיל את שרת הפרוקסי המוגדר"
+msgstr "Vidalia לא היה מסוגל להפעיל את שרת הפרוקסי המוגדר"
msgctxt "MainWindow"
msgid "Connecting to a relay directory"
@@ -1797,15 +1797,15 @@ msgstr "החיבור נדחה"
msgctxt "MainWindow"
msgid "connection timeout"
-msgstr "החיבור התעכב"
+msgstr "החיבור פקע"
msgctxt "MainWindow"
msgid "read/write error"
-msgstr "שגיאה בקריאה/כתיבה"
+msgstr "שגיאת קריאה/כתיבה"
msgctxt "MainWindow"
msgid "no route to host"
-msgstr "אין נתיב אל השרת"
+msgstr "אין נתיב לארח"
msgctxt "MainWindow"
msgid "insufficient resources"
@@ -1829,29 +1829,29 @@ msgstr "עצור את Tor עכשיו"
msgctxt "MainWindow"
msgid "Stop Tor"
-msgstr "עצירת Tor"
+msgstr "עצור את Tor"
msgctxt "MainWindow"
msgid "Starting the Tor software"
-msgstr "מפעיל את Tor כעת"
+msgstr "מפעיל כעת את Tor"
msgctxt "MainWindow"
msgid "Starting Tor"
-msgstr "מפעיל את Tor כעת"
+msgstr "מפעיל כעת את Tor"
msgctxt "MainWindow"
msgid "Error Starting Tor"
-msgstr "שגיאה בעת הפעלת Tor"
+msgstr "שגיאה בהפעלת Tor"
msgctxt "MainWindow"
msgid ""
"Vidalia was unable to start Tor. Check your settings to ensure the correct "
"name and location of your Tor executable is specified."
-msgstr "Vidalia לא הצליח להפעיל את Tor. נא לבדוק את ההגדרות ולוודא שהשם ומיקום קובץ הרצת Tor שצוינו אכן תקפים."
+msgstr "Vidalia לא הצליח להתחיל את Tor. נא לבדוק את ההגדרות ולוודא שהשם ומיקום קובץ הרצת Tor שצוינו אכן תקפים."
msgctxt "MainWindow"
msgid "Connecting to Tor"
-msgstr "מתחבר אל Tor כעת"
+msgstr "מתחבר כעת אל Tor"
msgctxt "MainWindow"
msgid "Connection Error"
@@ -1867,7 +1867,7 @@ msgstr "שגיאה במהלך כיבוי"
msgctxt "MainWindow"
msgid "Vidalia was unable to stop the Tor software."
-msgstr "Vidalia לא מסוגל היה לעצור את היישום Tor."
+msgstr "Vidalia לא היה מסוגל לעצור את היישום Tor."
msgctxt "MainWindow"
msgid "Unexpected Error"
@@ -1885,7 +1885,7 @@ msgctxt "MainWindow"
msgid ""
"The Tor software requires Vidalia to send the contents of an authentication "
"cookie, but Vidalia was unable to find one."
-msgstr "היישום Tor דורש מן Vidalia לשלוח את התכנים של עוגיית אימות, אך Vidalia לא מסוגל היה למצוא עוגייה שכזאת."
+msgstr "היישום Tor דורש מן Vidalia לשלוח את התכנים של עוגיית אימות, אך Vidalia לא היה מסוגל למצוא עוגייה שכזאת."
msgctxt "MainWindow"
msgid "Would you like to browse for the file 'control_auth_cookie' yourself?"
@@ -1893,7 +1893,7 @@ msgstr "האם ברצונך לציין את המיקום של הקובץ 'contro
msgctxt "MainWindow"
msgid "Data Directory"
-msgstr "מדור מידע"
+msgstr "מדור נתונים"
msgctxt "MainWindow"
msgid "Control Cookie (control_auth_cookie)"
@@ -1907,7 +1907,7 @@ msgctxt "MainWindow"
msgid ""
"Vidalia was unable to register for some events. Many of Vidalia's features "
"may be unavailable."
-msgstr "Vidalia לא מסוגל היה להירשם למספר אירועים. כתוצאה מכך תכונות רבות של Vidalia לא יהיו זמינות."
+msgstr "Vidalia לא היה מסוגל להירשם למספר אירועים. כתוצאה מכך תכונות רבות של Vidalia לא יהיו זמינות."
msgctxt "MainWindow"
msgid "Authentication Error"
@@ -1915,7 +1915,7 @@ msgstr "שגיאה בהזדהות"
msgctxt "MainWindow"
msgid "Vidalia was unable to authenticate to the Tor software. (%1)"
-msgstr "Vidalia לא מסוגל היה לאמת את Tor. (%1)"
+msgstr "Vidalia לא היה מסוגל לאמת את Tor. (%1)"
msgctxt "MainWindow"
msgid "Please check your control port authentication settings."
@@ -1929,7 +1929,7 @@ msgctxt "MainWindow"
msgid ""
"The currently installed version of Tor is out of date or no longer "
"recommended. Please visit the Tor website to download the latest version."
-msgstr "גרסת Tor הנוכחית מיושנת ולא מומלצת יותר לשימוש. אנא בקר באתר Tor על מנת להוריד את הגרסה האחרונה."
+msgstr "גרסת Tor הנוכחית מיושנת ולא מומלצת יותר לשימוש. אנא בקר באתר Tor על מנת להוריד את הגרסא האחרונה."
msgctxt "MainWindow"
msgid "Tor website: %1"
@@ -1951,7 +1951,7 @@ msgstr "כשלון ב-Port Forwarding"
msgctxt "MainWindow"
msgid "Vidalia was unable to configure automatic port forwarding."
-msgstr "Vidalia לא מסוגל היה להתקין port forwarding באופן אוטומטי."
+msgstr "Vidalia לא היה מסוגל להתקין port forwarding באופן אוטומטי."
msgctxt "MainWindow"
msgid "Vidalia Control Panel"
@@ -1963,7 +1963,7 @@ msgstr "מצב"
msgctxt "MainWindow"
msgid "Vidalia Shortcuts"
-msgstr "קיצורי־דרך Vidalia"
+msgstr "קיצורי דרך Vidalia"
msgctxt "MainWindow"
msgid "Setup Relaying"
@@ -1971,19 +1971,19 @@ msgstr "הגדרת ממסור"
msgctxt "MainWindow"
msgid "Set up a relay and help the network grow"
-msgstr "הגדרת ממסר וסיוע לצמיחת הרשת"
+msgstr "הגדר ממסר וסיוע לצמיחת הרשת"
msgctxt "MainWindow"
msgid "View the Network"
-msgstr "הצגת הרשת"
+msgstr "הצג את הרשת"
msgctxt "MainWindow"
msgid "View a map of the Tor network"
-msgstr "הצגת מפה של רשת Tor"
+msgstr "הצג מפה של רשת Tor"
msgctxt "MainWindow"
msgid "Use a New Identity"
-msgstr "שימוש בזהות חדשה"
+msgstr "השתמש בזהות חדשה"
msgctxt "MainWindow"
msgid "Make subsequent connections appear new"
@@ -1991,23 +1991,23 @@ msgstr "גרום לחיבורים הבאים להיראות כחדשים"
msgctxt "MainWindow"
msgid "View recent bandwidth usage"
-msgstr "הצגת השימוש האחרון ברוחב הפס"
+msgstr "הצג ניצול אחרון של רוחב פס"
msgctxt "MainWindow"
msgid "View log message history"
-msgstr "הצגת היסטורית יומן ההודעות"
+msgstr "הצג היסטוריית יומן הודעות"
msgctxt "MainWindow"
msgid "View help documentation"
-msgstr "הצגת מסמכי עזרה"
+msgstr "הצג מסמכי עזרה"
msgctxt "MainWindow"
msgid "Configure Vidalia"
-msgstr "הגדרת Vidalia"
+msgstr "הגדר את Vidalia"
msgctxt "MainWindow"
msgid "View version and license information"
-msgstr "הצגת מידע גרסה ורישיון"
+msgstr "הצג מידע גרסא ורישיון"
msgctxt "MainWindow"
msgid "Exit Vidalia"
@@ -2015,32 +2015,32 @@ msgstr "יציאה מן Vidalia"
msgctxt "MainWindow"
msgid "Show this window on startup"
-msgstr "הצגת חלון זה בעת אתחול"
+msgstr "הצג חלון זה בעת אתחול"
msgctxt "MainWindow"
msgid "Hide"
-msgstr "הסתרה"
+msgstr "הסתר"
msgctxt "MainWindow"
msgid "Hide this window"
-msgstr "הסתרת חלון זה"
+msgstr "הסתר חלון זה"
msgctxt "MainWindow"
msgid "Password Reset Failed"
-msgstr "אתחול סיסמה נכשל"
+msgstr "איפוס סיסמה נכשל"
msgctxt "MainWindow"
msgid ""
"Vidalia tried to reset Tor's control password, but was not able to restart "
"the Tor software. Please check your Task Manager to ensure there are no "
"other Tor processes running."
-msgstr "Vidalia ניסה לאפס את סיסמת לוח הבקרה של Tor, אך לא מסוגל היה לאתחל את היישום Tor. נא לוודא באמצעות מנהל המשימות שלך שאין עוד תהליכים פעילים של Tor."
+msgstr "Vidalia ניסה לאפס את סיסמת לוח הבקרה של Tor, אך לא היה מסוגל לאתחל את היישום Tor. נא לוודא באמצעות מנהל המשימות שלך שאין עוד תהליכים פעילים של Tor."
msgctxt "MainWindow"
msgid ""
"The currently installed version of Tor is out of date or no longer "
"recommended."
-msgstr "גרסת Tor שמותקנת כעת הינה מיושנת ולא מומלצת עוד לשימוש."
+msgstr "גרסת Tor שמותקנת כעת הינה מיושנת או שזו לא מומלצת עוד לשימוש."
msgctxt "MainWindow"
msgid ""
@@ -2059,7 +2059,7 @@ msgstr "Tor סגר אוטומטית את החיבור על מנת לשמור
msgctxt "MainWindow"
msgid "Update Failed"
-msgstr "עידכון Tor זמין"
+msgstr "עדכון נכשל"
msgctxt "MainWindow"
msgid "Your software is up to date"
@@ -2116,7 +2116,7 @@ msgctxt "MainWindow"
msgid ""
"Your relay is shutting down.\n"
"Click 'Stop' again to stop your relay now."
-msgstr "ממסרך מתכבה כעת.\nניתן ללחוץ על 'עצור' כדי לעצורו כעת."
+msgstr "ממסרך מתכבה כעת.\nניתן ללחוץ על 'עצור' כדי לעוצרו כעת."
msgctxt "MainWindow"
msgid ""
@@ -2173,11 +2173,11 @@ msgstr "עליך להכניס שם קובץ על מנת לשמור הודעות
msgctxt "MessageLog"
msgid "Select Log File"
-msgstr "בחירת קובץ יומן"
+msgstr "בחר קובץ יומן"
msgctxt "MessageLog"
msgid "Save Log Messages"
-msgstr "שמירת הודעות יומן"
+msgstr "שמור הודעות יומן"
msgctxt "MessageLog"
msgid "Text Files (*.txt)"
@@ -2221,7 +2221,7 @@ msgstr "גודל היסטוריה..."
msgctxt "MessageLog"
msgid "Set maximum number of messages to display"
-msgstr "הגדרת מספר ההודעות המירבי להצגה"
+msgstr "הגדר מספר הודעות מרבי להצגה"
msgctxt "MessageLog"
msgid "Clear"
@@ -2229,7 +2229,7 @@ msgstr "איפוס"
msgctxt "MessageLog"
msgid "Clear all messages from the Message Log (Ctrl+E)"
-msgstr "מחיקת כל ההודעות מן יומן ההודעות (Ctrl+E)"
+msgstr "מחק כל ההודעות מן יומן ההודעות (Ctrl+E)"
msgctxt "MessageLog"
msgid "Ctrl+E"
@@ -2237,11 +2237,11 @@ msgstr "Ctrl+E"
msgctxt "MessageLog"
msgid "Copy"
-msgstr "העתקה"
+msgstr "העתק"
msgctxt "MessageLog"
msgid "Copy the selected messages to the clipboard (Ctrl+C)"
-msgstr "העתקת ההודעות הנבחרות אל לוח־הגזירה (Ctrl+C)"
+msgstr "העתק את ההודעות הנבחרות אל לוח־גזירה (Ctrl+C)"
msgctxt "MessageLog"
msgid "Ctrl+C"
@@ -2253,7 +2253,7 @@ msgstr "בחר הכל"
msgctxt "MessageLog"
msgid "Select all messages (Ctrl+A)"
-msgstr "בחירת כל ההודעות (Ctrl+A)"
+msgstr "בחר את כל ההודעות (Ctrl+A)"
msgctxt "MessageLog"
msgid "Ctrl+A"
@@ -2265,15 +2265,15 @@ msgstr "שמור הכל"
msgctxt "MessageLog"
msgid "Save all messages to a file"
-msgstr "שמירת כל ההודעות אל קובץ"
+msgstr "שמור את כל ההודעות אל קובץ"
msgctxt "MessageLog"
msgid "Save Selected"
-msgstr "שמירת הודעות הנבחרות"
+msgstr "שמור הודעות הנבחרות"
msgctxt "MessageLog"
msgid "Save selected messages to a file"
-msgstr "שמירת הודעות נבחרות אל קובץ"
+msgstr "שמור הודעות נבחרות אל קובץ"
msgctxt "MessageLog"
msgid "Settings"
@@ -2281,7 +2281,7 @@ msgstr "הגדרות"
msgctxt "MessageLog"
msgid "Adjust Message Log Settings"
-msgstr "התאמת הגדרות יומן הודעות"
+msgstr "התאם הגדרות יומן הודעות"
msgctxt "MessageLog"
msgid "Ctrl+T"
@@ -2293,7 +2293,7 @@ msgstr "עזרה"
msgctxt "MessageLog"
msgid "Show the help browser"
-msgstr "הצגת דפדפן העזרה"
+msgstr "הצג דפדפן העזרה"
msgctxt "MessageLog"
msgid "F1"
@@ -2301,7 +2301,7 @@ msgstr "F1"
msgctxt "MessageLog"
msgid "Close"
-msgstr "סגירה"
+msgstr "סגור"
msgctxt "MessageLog"
msgid "Close the Message Log"
@@ -2313,11 +2313,11 @@ msgstr "Esc"
msgctxt "MessageLog"
msgid "Find"
-msgstr "מציאה"
+msgstr "מצא"
msgctxt "MessageLog"
msgid "Find all messages containing the search text (Ctrl+F)"
-msgstr "מציאת את כל ההודעות המכילות את תמליל החיפוש (Ctrl+F)"
+msgstr "מצא את כל ההודעות המכילות את תמליל החיפוש (Ctrl+F)"
msgctxt "MessageLog"
msgid "Ctrl+F"
@@ -2329,7 +2329,7 @@ msgstr "זמן"
msgctxt "MessageLog"
msgid "Type"
-msgstr "סוג"
+msgstr "טיפוס"
msgctxt "MessageLog"
msgid "Message"
@@ -2337,11 +2337,11 @@ msgstr "הודעה"
msgctxt "MessageLog"
msgid "Saves the current Message Log settings"
-msgstr "שמירת הגדרות יומן ההודעות הנוכחיות"
+msgstr "שמור הגדרות יומן הודעות הנוכחיות"
msgctxt "MessageLog"
msgid "Save Settings"
-msgstr "שמירת הגדרות"
+msgstr "שמור הגדרות"
msgctxt "MessageLog"
msgid "Cancels changes made to settings"
@@ -2393,11 +2393,11 @@ msgstr "עיון"
msgctxt "MessageLog"
msgid "Enable automatically saving all new log messages to a file"
-msgstr "אפשור שמירה אוטומטית של כל ההודעות החדשות אל קובץ"
+msgstr "אפשר שמירה אוטומטית של כל ההודעות החדשות אל קובץ"
msgctxt "MessageLog"
msgid "Automatically save new log messages to a file"
-msgstr "שמירה אוטומטית של הודעות יומן חדשות לקובץ"
+msgstr "שמור אוטומטית של הודעות יומן חדשות לקובץ"
msgctxt "MessageLog"
msgid "Basic"
@@ -2413,7 +2413,7 @@ msgstr "מתקדם"
msgctxt "MessageLog"
msgid "Always Save New Log Messages"
-msgstr "שמירה תמידית של הודעות יומן חדשות"
+msgstr "שמור תמיד הודעות יומן חדשות"
msgctxt "MessageLog"
msgid ""
@@ -2452,7 +2452,7 @@ msgid ""
"Cannot write file %1\n"
"\n"
"%2."
-msgstr "לא ניתן לכתוב את הקובץ %1\n\n%2."
+msgstr "לא ניתן לכתוב קובץ %1\n\n%2."
msgctxt "NetViewer"
msgid "Tor Network Map"
@@ -2460,11 +2460,11 @@ msgstr "מפת רשת Tor"
msgctxt "NetViewer"
msgid "Refresh"
-msgstr "רענון"
+msgstr "רענן"
msgctxt "NetViewer"
msgid "Refresh the list of Tor relays and connections"
-msgstr "עדכון רשימת הממסרים והחיבורים של Tor"
+msgstr "רענן רשימת הממסרים והחיבורים של Tor"
msgctxt "NetViewer"
msgid "Ctrl+R"
@@ -2476,11 +2476,11 @@ msgstr "עזרה"
msgctxt "NetViewer"
msgid "Show the network map help"
-msgstr "הצגת העזרה של מפת רשת"
+msgstr "הצג את העזרה של מפת רשת"
msgctxt "NetViewer"
msgid "Show network map help"
-msgstr "הצגת עזרת מפת רשת"
+msgstr "הצג עזרת מפת רשת"
msgctxt "NetViewer"
msgid "F1"
@@ -2488,11 +2488,11 @@ msgstr "F1"
msgctxt "NetViewer"
msgid "Close"
-msgstr "סגירה"
+msgstr "סגור"
msgctxt "NetViewer"
msgid "Close the network map"
-msgstr "סגירת מפת הרשת"
+msgstr "סגור את מפת הרשת"
msgctxt "NetViewer"
msgid "Esc"
@@ -2500,7 +2500,7 @@ msgstr "Esc"
msgctxt "NetViewer"
msgid "Zoom In"
-msgstr "הקרבה"
+msgstr "הקרב"
msgctxt "NetViewer"
msgid "Zoom in on the network map"
@@ -2512,7 +2512,7 @@ msgstr "+"
msgctxt "NetViewer"
msgid "Zoom Out"
-msgstr "הרחקה"
+msgstr "הרחק"
msgctxt "NetViewer"
msgid "Zoom out on the network map"
@@ -2548,11 +2548,11 @@ msgstr "לא ידוע"
msgctxt "NetViewer"
msgid "Full Screen"
-msgstr "מסך־מלא"
+msgstr "מסך מלא"
msgctxt "NetViewer"
msgid "View the network map as a full screen window"
-msgstr "הצגת מפת הרשת במסך־מלא"
+msgstr "הצג את מפת הרשת במסך מלא"
msgctxt "NetViewer"
msgid "Ctrl+F"
@@ -2560,7 +2560,7 @@ msgstr "Ctrl+F"
msgctxt "NetworkPage"
msgid "Copy (Ctrl+C)"
-msgstr "העתקה (Ctrl+C)"
+msgstr "העתק (Ctrl+C)"
msgctxt "NetworkPage"
msgid ""
@@ -2584,7 +2584,7 @@ msgstr "בודק אם הרשת המקומית זקוקה לפרוקסי על מ
msgctxt "NetworkPage"
msgid "I use a proxy to access the Internet"
-msgstr "אני משתמש בפרוקסי בכדי לגשת אל האינטרנט"
+msgstr "אני עושה שימוש בפרוקסי בכדי לגשת אל האינטרנט"
msgctxt "NetworkPage"
msgid "Proxy Settings"
@@ -2626,7 +2626,7 @@ msgctxt "NetworkPage"
msgid ""
"Check to encrypt directory requests and, optionally, use bridge relays to "
"access the Tor network"
-msgstr "בחר/י באפשרות זו כדי להצפין בקשות מדור וגם, אפשרי, לעשות שימוש בגשר ממסרים כדי לגשת אל רשת Tor"
+msgstr "בחר באפשרות זו כדי להצפין בקשות מדור וגם, אפשרי, לעשות שימוש בגשר ממסרים כדי לגשת אל רשת Tor"
msgctxt "NetworkPage"
msgid "My ISP blocks connections to the Tor network"
@@ -2638,15 +2638,15 @@ msgstr "הגדרות גשר"
msgctxt "NetworkPage"
msgid "Add a Bridge:"
-msgstr "הוספת גשר:"
+msgstr "הוסף גשר:"
msgctxt "NetworkPage"
msgid "Remove the selected bridges from the list"
-msgstr "הסרת הגשרים הנבחרים מן הרשימה"
+msgstr "הסר את הגשרים הנבחרים מן הרשימה"
msgctxt "NetworkPage"
msgid "Copy the selected bridges to the clipboard"
-msgstr "העתקת הגשרים הנבחרים אל לוח-הגזירה"
+msgstr "העתק את הגשרים הנבחרים אל לוח-הגזירה"
msgctxt "NetworkPage"
msgid "Find Bridges Now"
@@ -2668,7 +2668,7 @@ msgstr "גשרים חדשים אינם זמינים כעת. ניתן להמתי
msgctxt "NetworkPage"
msgid "Click Help to see other methods of finding new bridges."
-msgstr "לחצו על עזרה לקבלת מידע נוסף על דרכים שונות למציאת גשרים חדשים."
+msgstr "לחץ על עזרה לקבלת מידע נוסף על דרכים שונות למציאת גשרים חדשים."
msgctxt "NetworkPage"
msgid "Address:"
@@ -2676,11 +2676,11 @@ msgstr "כתובת:"
msgctxt "NetworkPage"
msgid "Type:"
-msgstr "סוג:"
+msgstr "טיפוס:"
msgctxt "NetworkPage"
msgid "You must select the proxy type."
-msgstr "עליך לבחור את סוג הפרוקסי."
+msgstr "עליך לבחור את טיפוס הפרוקסי."
msgctxt "NetworkPage"
msgid "SOCKS 4"
@@ -2744,7 +2744,7 @@ msgstr "עודכן לאחרונה:"
msgctxt "RouterDescriptorView"
msgid "Copy"
-msgstr "העתקה"
+msgstr "העתק"
msgctxt "RouterInfoDialog"
msgid "Hibernating"
@@ -2772,7 +2772,7 @@ msgstr "סיכום"
msgctxt "RouterInfoDialog"
msgid "Name:"
-msgstr "כינוי:"
+msgstr "שם:"
msgctxt "RouterInfoDialog"
msgid "Status:"
@@ -2840,7 +2840,7 @@ msgstr "העתקה"
msgctxt "RouterListWidget"
msgid "Nickname"
-msgstr "כינוי"
+msgstr "שם כינוי"
msgctxt "RouterListWidget"
msgid "Fingerprint"
@@ -2868,7 +2868,7 @@ msgstr "גשר ממסרך אינו מורץ כעת."
msgctxt "ServerPage"
msgid "You must specify at least a relay nickname and port."
-msgstr "עליך לציין לפחות כינוי ויציאת ממסור."
+msgstr "עליך לציין לפחות שם כינוי ויציאת ממסור."
msgctxt "ServerPage"
msgid "Run as a client only"
@@ -2880,7 +2880,7 @@ msgstr "יציאת ממסר:"
msgctxt "ServerPage"
msgid "Enable to mirror the relay directory"
-msgstr "אפשור הכפלת מדור הממסר"
+msgstr "אפשר את הכפלת מדור הממסר"
msgctxt "ServerPage"
msgid "Attempt to automatically configure port forwarding"
@@ -2892,7 +2892,7 @@ msgstr "בדיקה"
msgctxt "ServerPage"
msgid "Show help topic on port forwarding"
-msgstr "הצגת נושאי עזרה אודות port forwarding"
+msgstr "הצג נושאי עזרה אודות port forwarding"
msgctxt "ServerPage"
msgid "Directory Port:"
@@ -2916,7 +2916,7 @@ msgstr "יציאה שבאמצעותה משתמשים וממסרים אחרים
msgctxt "ServerPage"
msgid "Nickname:"
-msgstr "כינוי:"
+msgstr "שם כינוי:"
msgctxt "ServerPage"
msgid "Basic Settings"
@@ -2954,11 +2954,11 @@ msgstr "נתון אישית"
msgctxt "ServerPage"
msgid "Select the entry that most closely resembles your Internet connection"
-msgstr "בחירת הרשומה הדומה ביותר לחיבור האינטרנט שלך"
+msgstr "בחר את הרשומה הדומה ביותר לחיבור האינטרנט שלך"
msgctxt "ServerPage"
msgid "Show help topic on bandwidth rate limits"
-msgstr "הצגת עזרה בנוגע להגבלות שיעור רוחב פס"
+msgstr "הצג עזרה בנוגע להגבלות שיעור רוחב פס"
msgctxt "ServerPage"
msgid "Average Rate"
@@ -2966,7 +2966,7 @@ msgstr "קצב ממוצע"
msgctxt "ServerPage"
msgid "Long-term average bandwidth limit"
-msgstr "הגבלת רוחב פס ממוצע לטווח ארוך"
+msgstr "מגבלת רוחב פס ממוצע לטווח ארוך"
msgctxt "ServerPage"
msgid "KB/s"
@@ -2978,7 +2978,7 @@ msgstr "קצב מרבי"
msgctxt "ServerPage"
msgid "Peak bandwidth rate limit"
-msgstr "הגבלת שיעור רוחב פס מרבי"
+msgstr "הגבל שיעור רוחב פס מרבי"
msgctxt "ServerPage"
msgid ""
@@ -3040,7 +3040,7 @@ msgstr "אתרי רשת"
msgctxt "ServerPage"
msgid "Show help topic on exit policies"
-msgstr "הצגת עזרה בנוגע למדיניות יציאה"
+msgstr "הצג עזרה בנוגע למדיניות יציאה"
msgctxt "ServerPage"
msgid ""
@@ -3068,7 +3068,7 @@ msgstr "זוהי הזהות של גשר ממסרך שביכולתך להעניק
msgctxt "ServerPage"
msgid "Copy your bridge relay's identity to the clipboard"
-msgstr "העתקת הזהות של גשר ממסרך אל לוח־הגזירה"
+msgstr "העתק את הזהות של גשר ממסרך אל לוח־גזירה"
msgctxt "ServerPage"
msgid "No Recent Usage"
@@ -3082,7 +3082,7 @@ msgctxt "ServerPage"
msgid ""
"Leave your relay running so clients have a better chance of finding and "
"using it."
-msgstr "השאירו את הממסר פועל, כך שללקוחות יהיו סיכויים טובים יותר למצוא אותו ולהשתמש בו."
+msgstr "השאר את הממסר פועל, כך שללקוחות יהיו סיכויים טובים יותר למצוא אותו ולהשתמש בו."
msgctxt "ServerPage"
msgid "Bridge History"
@@ -3104,7 +3104,7 @@ msgstr "התשובה המחוזרת היתה: %1"
msgctxt "ServerPage"
msgid "Help censored users reach the Tor network"
-msgstr "סיוע למשתמשים מצונזרים לגשת אל רשת Tor (גרסה 0.2.0.8-alpha ומעלה)"
+msgstr "סיוע למשתמשים מצונזרים לגשת אל רשת Tor (גרסא 0.2.0.8-alpha ומעלה)"
msgctxt "ServerPage"
msgid "<a href=\"#bridgeUsage\">Who has used my bridge?</a>"
@@ -3128,7 +3128,7 @@ msgstr "תעבורת ממסר בתוך רשת Tor (ממסר שאינו-יציא
msgctxt "ServerPage"
msgid "Mirror the Relay Directory"
-msgstr "הכפלת מדור הממסר"
+msgstr "הכפל את מדור הממסר"
msgctxt "ServerPage"
msgid ""
@@ -3156,7 +3156,7 @@ msgstr "נא לבחור שירות."
msgctxt "ServicePage"
msgid "Select Service Directory"
-msgstr "בחירת מדור שירות"
+msgstr "בחר מדור שירות"
msgctxt "ServicePage"
msgid "Virtual Port may only contain valid port numbers [1..65535]."
@@ -3200,19 +3200,19 @@ msgstr "מופעל"
msgctxt "ServicePage"
msgid "Add new service to list"
-msgstr "הוספת שירות חדש אל הרשימה"
+msgstr "הוסף שירות חדש אל הרשימה"
msgctxt "ServicePage"
msgid "Remove selected service from list"
-msgstr "הסרת השירות הנבחר מן הרשימה"
+msgstr "הסר השירות הנבחר מן הרשימה"
msgctxt "ServicePage"
msgid "Copy onion address of selected service to clipboard"
-msgstr "העתקת כתובת בצל של השירות הנבחר אל לוח־הגזירה"
+msgstr "העתק כתובת בצל של השירות הנבחר אל לוח־גזירה"
msgctxt "ServicePage"
msgid "Browse in local file system and choose directory for selected service"
-msgstr "עיון במערכת הקבצים המקומית ובחירת מדור עבור השירות הנבחר"
+msgstr "עיין במערכת הקבצים המקומית ובחר מדור עבור השירות הנבחר"
msgctxt "ServicePage"
msgid "Created by Tor"
@@ -3220,7 +3220,7 @@ msgstr "נוצר על ידי Tor"
msgctxt "StatusEventWidget"
msgid "Copy to Clipboard"
-msgstr "העתקה אל לוח־גזירה"
+msgstr "העתק אל לוח־גזירה"
msgctxt "StatusEventWidget"
msgid "The Tor Software is Running"
@@ -3228,7 +3228,7 @@ msgstr "היישום Tor מורץ כעת"
msgctxt "StatusEventWidget"
msgid "You are currently running version \"%1\" of the Tor software."
-msgstr "הינך עושה כעת שימוש בגריסה \"%1\" של Tor."
+msgstr "הינך עושה כעת שימוש בגרסא \"%1\" של Tor."
msgctxt "StatusEventWidget"
msgid "The Tor Software is not Running"
@@ -3239,7 +3239,7 @@ msgid ""
"Click \"Start Tor\" in the Vidalia Control Panel to restart the Tor "
"software. If Tor exited unexpectedly, select the \"Advanced\" tab above for "
"details about any errors encountered."
-msgstr "לחצו על \"הפעלת Tor\" בלוח הבקרה של Vidalia כדי לאתחל את התוכנה Tor. במידה והתוכנה Tor מסתיימת באופן לא צפוי, בחרו בלשונית \"מתקדם\" למעלה עבור פרטים אודות כל שגיאה שהתרחשה."
+msgstr "לחץ על \"התחל את Tor\" בלוח הבקרה של Vidalia כדי לאתחל את התוכנה Tor. במידה והתוכנה Tor מסתיימת באופן לא צפוי, בחרו בלשונית \"מתקדם\" למעלה עבור פרטים אודות כל שגיאה שהתרחשה."
msgctxt "StatusEventWidget"
msgid ""
@@ -3247,7 +3247,7 @@ msgid ""
"longer recommended. Please upgrade to the most recent version of the "
"software, which may contain important security, reliability and performance "
"fixes."
-msgstr "ברשותך קיימת גרסה \"%1\" של התוכנה Tor, שאיננה מומלצת עוד. נא לשדרג אל הגרסה האחרונה ביותר של התוכנה, שעשויה להכיל תיקוני אבטחה, אמינות וגם ביצועים חשובים."
+msgstr "ברשותך קיימת גרסא \"%1\" של התוכנה Tor, שאיננה מומלצת עוד. נא לשדרג אל הגרסא האחרונה ביותר של התוכנה, שעשויה להכיל תיקוני אבטחה, אמינות וגם ביצועים חשובים."
msgctxt "StatusEventWidget"
msgid ""
@@ -3255,7 +3255,7 @@ msgid ""
"longer work with the current Tor network. Please upgrade to the most recent "
"version of the software, which may contain important security, reliability "
"and performance fixes."
-msgstr "ברשותך קיימת גרסה \"%1\" של התוכנה Tor, שייתכן ולא תעבוד עם רשת Tor הנוכחית. נא לשדרג אל הגרסה האחרונה ביותר של התוכנה, שעשויה להכיל תיקוני אבטחה, אמינות וגם ביצועים חשובים."
+msgstr "ברשותך קיימת גרסא \"%1\" של התוכנה Tor, שייתכן ולא תעבוד עם רשת Tor הנוכחית. נא לשדרג אל הגרסא האחרונה ביותר של התוכנה, שעשויה להכיל תיקוני אבטחה, אמינות וגם ביצועים חשובים."
msgctxt "StatusEventWidget"
msgid "Your Tor Software is Out-of-date"
@@ -3461,7 +3461,7 @@ msgid ""
"see an increase in network traffic shown by the Bandwidth Graph within a few"
" hours as more clients learn about your relay. Thank you for contributing to"
" the Tor network!"
-msgstr "ממסרך מקוון עתה והינו זמין לשימוש עבור לקוחות Tor. הינך צפוי/ה לראות בתוך מספר שעות עלייה בתעבורת רשת התקשורת המוצגת בגרף רוחב הפס כשיותר לקוחות ילמדו אודות ממסרך. רב תודות לך עבור תרומתך למען רשת Tor!"
+msgstr "ממסרך מקוון עתה והינו זמין לשימוש עבור לקוחות Tor. הינך צפוי לראות בתוך מספר שעות עלייה בתעבורת רשת התקשורת המוצגת בגרף רוחב הפס כשיותר לקוחות ילמדו אודות ממסרך. רב תודות לך עבור תרומתך למען רשת Tor!"
msgctxt "Stream"
msgid "New"
@@ -3469,7 +3469,7 @@ msgstr "חדש"
msgctxt "Stream"
msgid "Resolving"
-msgstr "מתרגם כעת"
+msgstr "פותר כעת"
msgctxt "Stream"
msgid "Connecting"
@@ -3509,7 +3509,7 @@ msgstr "השירות Tor אינו מותקן."
msgctxt "TorService"
msgid "Unable to start the Tor service."
-msgstr "לא ניתן להפעייל את השירות Tor."
+msgstr "לא ניתן להתחיל את השירות Tor."
msgctxt "TorSettings"
msgid "Failed to hash the control password."
@@ -3523,27 +3523,27 @@ msgctxt "TorrcDialog"
msgid ""
"Save settings. If unchecked it will only apply settings to the current Tor "
"instance."
-msgstr "שמירת הגדרות. במידה ואפשרות זו איננה מסומנת, זו תוחל רק על תהליך Tor הנוכחי בלבד."
+msgstr "שמור הגדרות. במידה ואפשרות זו איננה מסומנת, זו תוחל רק על תהליך Tor הנוכחי בלבד."
msgctxt "TorrcDialog"
msgid "Cut"
-msgstr "גזירה"
+msgstr "גזור"
msgctxt "TorrcDialog"
msgid "Copy"
-msgstr "העתקה"
+msgstr "העתק"
msgctxt "TorrcDialog"
msgid "Paste"
-msgstr "הדבקה"
+msgstr "הדבק"
msgctxt "TorrcDialog"
msgid "Undo"
-msgstr "ביטול"
+msgstr "בטל"
msgctxt "TorrcDialog"
msgid "Redo"
-msgstr "ביצוע־חוזר"
+msgstr "בצע שוב"
msgctxt "TorrcDialog"
msgid "Select All"
@@ -3637,29 +3637,29 @@ msgctxt "UpdateProcess"
msgid ""
"Vidalia was unable to check for available software updates because it could "
"not find '%1'."
-msgstr "Vidalia לא מסוגל היה לחפש עדכוני תוכנה מכיוון שלא ניתן היה למצוא את '%1'."
+msgstr "Vidalia לא היה מסוגל לחפש עדכוני תוכנה מכיוון שלא ניתן היה למצוא את '%1'."
msgctxt "UpdateProcess"
msgid ""
"Vidalia was unable to check for available software updates because Tor's "
"update process exited unexpectedly."
-msgstr "Vidalia לא מסוגל היה לחפש עדכוני תוכנה מכיוון שהיישום Tor נסגר בפתאומיות."
+msgstr "Vidalia לא היה מסוגל לחפש עדכוני תוכנה מכיוון שהיישום Tor נסגר בפתאומיות."
msgctxt "UpdateProgressDialog"
msgid "Checking for available updates..."
-msgstr "מחפש כעת עבור עדכונים זמינים..."
+msgstr "בודק כעת עבור עדכונים זמינים..."
msgctxt "UpdateProgressDialog"
msgid "Hide"
-msgstr "הסתרה"
+msgstr "הסתר"
msgctxt "UpdateProgressDialog"
msgid "Downloading updates..."
-msgstr "מוריד עדכונים כעת..."
+msgstr "מוריד כעת עדכונים..."
msgctxt "UpdateProgressDialog"
msgid "Installing updated software..."
-msgstr "מתקין עדכונים כעת..."
+msgstr "מתקין כעת עדכונים..."
msgctxt "UpdateProgressDialog"
msgid "Done! Your software is now up to date."
@@ -3675,7 +3675,7 @@ msgstr "עדכוני תוכנה"
msgctxt "UpdateProgressDialog"
msgid "Checking for updates..."
-msgstr "בודק עדכונים כעת..."
+msgstr "בודק כעת עבור עדכונים..."
msgctxt "UpdateProgressDialog"
msgid "Cancel"
@@ -3703,7 +3703,7 @@ msgstr "חבילה"
msgctxt "UpdatesAvailableDialog"
msgid "Version"
-msgstr "גרסה"
+msgstr "גרסא"
msgctxt "VMessageBox"
msgid "OK"
@@ -3731,11 +3731,11 @@ msgstr "ניסיון חוזר"
msgctxt "VMessageBox"
msgid "Show Log"
-msgstr "הצגת יומן"
+msgstr "הצג יומן"
msgctxt "VMessageBox"
msgid "Show Settings"
-msgstr "הצגת הגדרות"
+msgstr "הצג הגדרות"
msgctxt "VMessageBox"
msgid "Continue"
@@ -3767,7 +3767,7 @@ msgstr "איפוס מוחלט של כל ההגדרות המאוחסנות של V
msgctxt "Vidalia"
msgid "Sets the directory Vidalia uses for data files."
-msgstr "הגדרת הספרייה שבשימוש על ידי Vidalia לקבצי מידע."
+msgstr "הגדרת הספרייה שבשימוש על ידי Vidalia לקבצי נתונים."
msgctxt "Vidalia"
msgid "Sets the name and location of Vidalia's pidfile."
@@ -3791,7 +3791,7 @@ msgstr "הגדרת השפה של Vidalia."
msgctxt "Vidalia"
msgid "Vidalia Usage Information"
-msgstr "מידע שימוש עבור Vidalia"
+msgstr "מידע שימוש של Vidalia"
msgctxt "Vidalia"
msgid "Unable to open log file '%1': %2"
@@ -3826,7 +3826,7 @@ msgstr "%1 שניות"
msgctxt "stringutil.h"
msgid "%1 B/s"
-msgstr "%1 ביתים/ש"
+msgstr "%1 בתים/ש"
msgctxt "stringutil.h"
msgid "%1 KB/s"
1
0