forked from I2P_Developers/i2p.i2p
Compare commits
98 Commits
i2p-0.9.50
...
i2p-1.5.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e340fc885d | ||
|
|
63b3da265b | ||
|
|
03f2cbfc89 | ||
|
|
7f5e7e54c0 | ||
|
|
30aab77047 | ||
|
|
367a35e531 | ||
|
|
76a48f5983 | ||
|
|
6a1ad6bef5 | ||
|
|
ef947e2dbc | ||
|
|
de73dec4b8 | ||
|
|
4938e13f0e | ||
|
|
dc48afe89d | ||
|
|
15cfa147a6 | ||
|
|
7d1656c20f | ||
|
|
2cb0650980 | ||
|
|
cf38697774 | ||
|
|
f2b878d02a | ||
|
|
877b1f5f56 | ||
|
|
a634a9e3cf | ||
|
|
c652d597c9 | ||
|
|
9db50256a8 | ||
|
|
2edac95be9 | ||
|
|
d246689242 | ||
|
|
6eb1510324 | ||
|
|
24ef2b5189 | ||
|
|
2b3a0f0232 | ||
|
|
cd7c2efda8 | ||
|
|
ca879f04e3 | ||
|
|
369c40322e | ||
|
|
3244fe1b0f | ||
|
|
6b2a4a8fda | ||
|
|
83e67ad9d8 | ||
|
|
9f0d6c302f | ||
|
|
d42d41ce0a | ||
|
|
7ff6373d0c | ||
|
|
3bf3a4ff9d | ||
|
|
4c5823ecb7 | ||
|
|
8b95aa9652 | ||
|
|
71ccd10ba6 | ||
|
|
426fbcbfa3 | ||
|
|
a7d9ca920f | ||
|
|
f40eff6b7e | ||
|
|
187ebf4c4a | ||
|
|
1e7b13db66 | ||
|
|
bc13f64403 | ||
|
|
617fff175e | ||
|
|
8710aa0065 | ||
|
|
558aa6e421 | ||
|
|
1911132f11 | ||
|
|
373924e650 | ||
|
|
9c74cafd92 | ||
|
|
e88eed760d | ||
|
|
b7322e1647 | ||
|
|
bb19fcdac3 | ||
|
|
d71a472367 | ||
|
|
e5186b0f7b | ||
|
|
fd6219356d | ||
|
|
ea8597d1fb | ||
|
|
970be35084 | ||
|
|
c65b4689d0 | ||
|
|
7628168c3d | ||
|
|
65b57fed9f | ||
|
|
67288f27b6 | ||
|
|
10cc00a9c8 | ||
|
|
2cbb9b44ea | ||
|
|
f9e8fa8150 | ||
|
|
aa0e0b3a62 | ||
|
|
4c6aa8cfc1 | ||
|
|
010d1a9953 | ||
|
|
3fbfb689af | ||
|
|
2bb3cf046d | ||
|
|
988e0e796f | ||
|
|
d93e16e52e | ||
|
|
d5a499591d | ||
| 41c8f6d0d5 | |||
| b73d5d6557 | |||
|
|
4f12081b59 | ||
|
|
ad48ff61f3 | ||
|
|
4aef8d66e3 | ||
|
|
2f371301ad | ||
|
|
c2c922b665 | ||
|
|
aee9a3f639 | ||
|
|
d9c98580d1 | ||
|
|
8b4a93554f | ||
|
|
f9b5ee697c | ||
|
|
6dab5b44ae | ||
|
|
e7bef3f4e8 | ||
|
|
ff44ba4e07 | ||
|
|
b88c8a4f6a | ||
|
|
58aa95df87 | ||
|
|
56a1184da7 | ||
|
|
ecc8b2a1c6 | ||
|
|
288170a728 | ||
|
|
b9efc002c0 | ||
|
|
6926f5769e | ||
|
|
9036aa84f6 | ||
|
|
557c1d0f04 | ||
|
|
2bb14c317f |
@@ -627,6 +627,7 @@ source_lang = en
|
||||
trans.ar = apps/routerconsole/resources/docs/readme_ar.html
|
||||
trans.de = apps/routerconsole/resources/docs/readme_de.html
|
||||
trans.fr = apps/routerconsole/resources/docs/readme_fr.html
|
||||
trans.hu = apps/routerconsole/resources/docs/readme_hu.html
|
||||
;; Java converts id to in
|
||||
trans.id = apps/routerconsole/resources/docs/readme_in.html
|
||||
trans.it = apps/routerconsole/resources/docs/readme_it.html
|
||||
|
||||
@@ -271,7 +271,7 @@ Applications:
|
||||
See licenses/LICENSE-Apache2.0.txt
|
||||
See licenses/LICENSE-ECLIPSE-1.0.html
|
||||
|
||||
RRD4J 3.6 (jrobin.jar):
|
||||
RRD4J 3.8 (jrobin.jar):
|
||||
Copyright (c) 2001-2005 Sasa Markovic and Ciaran Treanor.
|
||||
Copyright (c) 2011 The OpenNMS Group, Inc.
|
||||
Copyright 2011 The RRD4J Authors.
|
||||
|
||||
@@ -4,19 +4,20 @@
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# Translators:
|
||||
# slrslr, 2021
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"PO-Revision-Date: 2017-06-30 21:32+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2021-07-08 09:41+0000\n"
|
||||
"Last-Translator: slrslr\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
||||
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:31
|
||||
#: src/net/i2p/desktopgui/ExternalTrayManager.java:59
|
||||
@@ -41,12 +42,12 @@ msgstr "Spouštím I2P Browser"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr ""
|
||||
msgstr "Nastavit I2P Systémovou Lištu"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
|
||||
msgid "Disable"
|
||||
msgstr ""
|
||||
msgstr "Zakázat"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
|
||||
@@ -61,26 +62,26 @@ msgstr "Zastavit I2P"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
msgid "Restart I2P Immediately"
|
||||
msgstr ""
|
||||
msgstr "Restartovat I2P Hned"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
|
||||
msgid "Stop I2P Immediately"
|
||||
msgstr ""
|
||||
msgstr "Zastavit I2P Hned"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
|
||||
msgid "Cancel I2P Shutdown"
|
||||
msgstr ""
|
||||
msgstr "Zrušit I2P Zastavení"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
|
||||
#, java-format
|
||||
msgid "Shutdown in {0}"
|
||||
msgstr ""
|
||||
msgstr "Zastavení za {0}"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
msgid "Shutdown imminent"
|
||||
msgstr ""
|
||||
msgstr "Vypínání"
|
||||
|
||||
#. status translations are in the console bundle
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
|
||||
@@ -90,4 +91,4 @@ msgstr "Síť"
|
||||
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:63
|
||||
msgid "I2P: Right-click for menu"
|
||||
msgstr ""
|
||||
msgstr "I2P: Pravé-kliknutí pro menu"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P desktopgui\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"POT-Creation-Date: 2021-08-11 15:33+0000\n"
|
||||
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
|
||||
"Last-Translator: duck <duck@mail.i2p>\n"
|
||||
"Language-Team: duck <duck@mail.i2p>\n"
|
||||
@@ -33,57 +33,57 @@ msgstr ""
|
||||
msgid "Starting"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:55
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:207
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:54
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:206
|
||||
msgid "Launch I2P Browser"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:75
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:227
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
|
||||
msgid "Disable"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:93
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:245
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:92
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:244
|
||||
msgid "Restart I2P"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:109
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:261
|
||||
msgid "Stop I2P"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:125
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:277
|
||||
msgid "Restart I2P Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:142
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:294
|
||||
msgid "Stop I2P Immediately"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:156
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:308
|
||||
msgid "Cancel I2P Shutdown"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:362
|
||||
#, java-format
|
||||
msgid "Shutdown in {0}"
|
||||
msgstr ""
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:365
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:364
|
||||
msgid "Shutdown imminent"
|
||||
msgstr ""
|
||||
|
||||
#. status translations are in the console bundle
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:370
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:369
|
||||
msgid "Network"
|
||||
msgstr ""
|
||||
|
||||
|
||||
@@ -4,13 +4,14 @@
|
||||
# To contribute translations, see http://www.i2p2.de/newdevelopers
|
||||
#
|
||||
# Translators:
|
||||
# Hunor Paksy <heds@cock.li>, 2018
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"PO-Revision-Date: 2017-06-30 21:32+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2021-06-20 09:44+0000\n"
|
||||
"Last-Translator: AdminLMH <lehetmashogy@i2pmail.org>\n"
|
||||
"Language-Team: Hungarian (http://www.transifex.com/otf/I2P/language/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -41,7 +42,7 @@ msgstr "I2P Böngésző Indítása"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:76
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:228
|
||||
msgid "Configure I2P System Tray"
|
||||
msgstr ""
|
||||
msgstr "I2P rendszertálca beállítások"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:77
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:229
|
||||
@@ -61,17 +62,17 @@ msgstr "I2P Leállítása"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
msgid "Restart I2P Immediately"
|
||||
msgstr ""
|
||||
msgstr "I2P Azonnali újraindítása"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:143
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:295
|
||||
msgid "Stop I2P Immediately"
|
||||
msgstr ""
|
||||
msgstr "I2P Azonnali megállítása"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:157
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:309
|
||||
msgid "Cancel I2P Shutdown"
|
||||
msgstr ""
|
||||
msgstr "I2P leállításának visszavonása"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:363
|
||||
#, java-format
|
||||
@@ -90,4 +91,4 @@ msgstr "Hálózat"
|
||||
#. Windows typically has tooltips; Linux (at least Ubuntu) doesn't
|
||||
#: src/net/i2p/desktopgui/TrayManager.java:63
|
||||
msgid "I2P: Right-click for menu"
|
||||
msgstr ""
|
||||
msgstr "I2P: Jobb-klikk a menüért"
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
# Translators:
|
||||
# 123hund123 <M8R-ra4r1r@mailinator.com>, 2011
|
||||
# Anders Nilsson <anders@devode.se>, 2016
|
||||
# Jonatan Nyberg, 2016-2017
|
||||
# Jonatan Nyberg, 2018
|
||||
# Jonatan Nyberg, 2017
|
||||
# Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2018
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-05-25 12:29+0000\n"
|
||||
"PO-Revision-Date: 2018-06-17 14:17+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg\n"
|
||||
"PO-Revision-Date: 2021-05-28 01:02+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -61,7 +61,7 @@ msgstr "Starta om I2P"
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:110
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:262
|
||||
msgid "Stop I2P"
|
||||
msgstr "Stoppar I2P"
|
||||
msgstr "Stoppa I2P"
|
||||
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:126
|
||||
#: src/net/i2p/desktopgui/InternalTrayManager.java:278
|
||||
|
||||
@@ -147,6 +147,7 @@
|
||||
<target name="warUpToDate">
|
||||
<uptodate property="war.uptodate" targetfile="../i2psnark.war" >
|
||||
<srcfiles dir= "." includes="build/obj/org/klomp/snark/web/*.class ../resources/**/* ../web.xml" />
|
||||
<srcfiles dir= "../resources" />
|
||||
</uptodate>
|
||||
</target>
|
||||
|
||||
|
||||
@@ -2363,6 +2363,7 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
String now = Long.toString(System.currentTimeMillis());
|
||||
config.setProperty(PROP_META_ADDED, now);
|
||||
config.setProperty(PROP_META_STAMP, now);
|
||||
config.setProperty(PROP_META_RUNNING, "true");
|
||||
// save
|
||||
synchronized (_configLock) {
|
||||
saveConfig();
|
||||
@@ -2495,7 +2496,8 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
public void run() {
|
||||
// don't bother delaying if auto start is false
|
||||
long delay = (60L * 1000) * getStartupDelayMinutes();
|
||||
if (delay > 0 && shouldAutoStart()) {
|
||||
boolean autostart = shouldAutoStart();
|
||||
if (delay > 0 && autostart) {
|
||||
int id = _messages.addMessageNoEscape(_t("Adding torrents in {0}", DataHelper.formatDuration2(delay)));
|
||||
try { Thread.sleep(delay); } catch (InterruptedException ie) {}
|
||||
// Remove that first message
|
||||
@@ -2523,7 +2525,7 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
if (doMagnets) {
|
||||
// first run only
|
||||
try {
|
||||
addMagnets();
|
||||
addMagnets(autostart);
|
||||
doMagnets = false;
|
||||
} catch (RuntimeException e) {
|
||||
_log.error("Error in the DirectoryMonitor", e);
|
||||
@@ -2671,7 +2673,7 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
*
|
||||
* @since 0.8.4
|
||||
*/
|
||||
private void addMagnets() {
|
||||
private void addMagnets(boolean autostart) {
|
||||
boolean changed = false;
|
||||
for (Iterator<?> iter = _config.keySet().iterator(); iter.hasNext(); ) {
|
||||
String k = (String) iter.next();
|
||||
@@ -2688,7 +2690,7 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
String tracker = config.getProperty(PROP_META_MAGNET_TR);
|
||||
String dir = config.getProperty(PROP_META_MAGNET_DIR);
|
||||
File dirf = (dir != null) ? (new File(dir)) : null;
|
||||
addMagnet(name, ih, tracker, false, dirf);
|
||||
addMagnet(name, ih, tracker, false, autostart, dirf, this);
|
||||
} else {
|
||||
iter.remove();
|
||||
changed = true;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2psnark\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:30+0000\n"
|
||||
"POT-Creation-Date: 2021-08-11 15:33+0000\n"
|
||||
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
|
||||
"Last-Translator: duck <duck@mail.i2p>\n"
|
||||
"Language-Team: duck <duck@mail.i2p>\n"
|
||||
@@ -23,19 +23,19 @@ msgid "No more torrents running."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/IdleChecker.java:77
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3060
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3071
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3042
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3053
|
||||
msgid "I2P tunnel closed."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/MagnetURI.java:50
|
||||
#: ../java/src/org/klomp/snark/MagnetURI.java:60
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2707
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2689
|
||||
msgid "Magnet"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:992
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1146
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:972
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1126
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:736
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1068
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1202
|
||||
@@ -44,230 +44,230 @@ msgstr ""
|
||||
msgid "No write permissions for data directory"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:995
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1139
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:975
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1119
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:730
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1049
|
||||
msgid "Data directory cannot be created"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1057
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1037
|
||||
#, java-format
|
||||
msgid "Total uploaders limit changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1059
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1039
|
||||
#, java-format
|
||||
msgid "Minimum total uploaders limit is {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1071
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1051
|
||||
#, java-format
|
||||
msgid "Up BW limit changed to {0}KBps"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1073
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1053
|
||||
#, java-format
|
||||
msgid "Minimum up bandwidth limit is {0}KBps"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1085
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1065
|
||||
#, java-format
|
||||
msgid "Startup delay changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1096
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1076
|
||||
#, java-format
|
||||
msgid "Refresh time changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1098
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1078
|
||||
msgid "Refresh disabled"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1114
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1094
|
||||
#, java-format
|
||||
msgid "Page size changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1124
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1104
|
||||
msgid "New files will be publicly readable"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1126
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1106
|
||||
msgid "New files will not be publicly readable"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1134
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1114
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1045
|
||||
msgid "Data directory must be an absolute path"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1138
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1118
|
||||
msgid "Data directory does not exist"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1141
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1121
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:732
|
||||
msgid "Not a directory"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1143
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1123
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:734
|
||||
msgid "Unreadable"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1150
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1130
|
||||
#, java-format
|
||||
msgid "Data directory changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1231
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1211
|
||||
msgid "I2CP and tunnel changes will take effect after stopping all torrents"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1235
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1215
|
||||
#, java-format
|
||||
msgid "I2CP options changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1241
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1221
|
||||
msgid "Disconnecting old I2CP destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1243
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1223
|
||||
#, java-format
|
||||
msgid "I2CP settings changed to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1248
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1228
|
||||
msgid ""
|
||||
"Unable to connect with the new settings, reverting to the old I2CP settings"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1252
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1232
|
||||
msgid "Unable to reconnect with the old settings!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1254
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1234
|
||||
msgid "Reconnected on the new I2CP destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1261
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1241
|
||||
#, java-format
|
||||
msgid "I2CP listener restarted for \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1274
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1254
|
||||
msgid "Enabled autostart"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1276
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1256
|
||||
msgid "Disabled autostart"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1283
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1263
|
||||
msgid "Enabled smart sort"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1285
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1265
|
||||
msgid "Disabled smart sort"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1292
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1272
|
||||
msgid "Enabled open trackers - torrent restart required to take effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1294
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1274
|
||||
msgid "Disabled open trackers - torrent restart required to take effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1301
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1281
|
||||
msgid "Enabled DHT."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1303
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1283
|
||||
msgid "Disabled DHT."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1305
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1285
|
||||
msgid "DHT change requires tunnel shutdown and reopen"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1312
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1292
|
||||
msgid "Enabled Ratings."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1314
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1294
|
||||
msgid "Disabled Ratings."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1321
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1301
|
||||
msgid "Enabled Comments."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1323
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1303
|
||||
msgid "Disabled Comments."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1336
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1316
|
||||
#, java-format
|
||||
msgid "Comments name set to {0}."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1343
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1323
|
||||
#, java-format
|
||||
msgid "{0} theme loaded."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1350
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1330
|
||||
msgid "Collapsible panels enabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1352
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1332
|
||||
msgid "Collapsible panels disabled."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1362
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1342
|
||||
msgid "Configuration unchanged."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1394
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1374
|
||||
msgid "Open Tracker list changed - torrent restart required to take effect."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1404
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1384
|
||||
msgid "Private tracker list changed - affects newly created torrents only."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1450
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1430
|
||||
#, java-format
|
||||
msgid "Unable to save the config to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1557
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1537
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1199
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1234
|
||||
#, java-format
|
||||
msgid "Torrent file deleted: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1560
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1540
|
||||
#, java-format
|
||||
msgid "Torrent file moved from {0} to {1}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1594
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2760
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2766
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2770
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1574
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2742
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2748
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2752
|
||||
#, java-format
|
||||
msgid "Error: Could not add the torrent {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1609
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1697
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2928
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1589
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1677
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2910
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:178
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1126
|
||||
#, java-format
|
||||
@@ -275,145 +275,145 @@ msgid "Torrent already running: {0}"
|
||||
msgstr ""
|
||||
|
||||
#. catch this here so we don't try do delete it below
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1619
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1599
|
||||
#, java-format
|
||||
msgid "Cannot open \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#. TODO - if the existing one is a magnet, delete it and add the metainfo instead?
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1638
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1793
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1882
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1618
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1773
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1862
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:166
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1115
|
||||
#, java-format
|
||||
msgid "Torrent with this info hash is already running: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1644
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1888
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1624
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1868
|
||||
#, java-format
|
||||
msgid "Torrent with the same data location is already running: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1650
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1630
|
||||
#, java-format
|
||||
msgid "ERROR - No I2P trackers in private torrent \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1652
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1632
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", will announce to I2P open trackers and "
|
||||
"DHT only."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1655
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1635
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", and open trackers are disabled, will "
|
||||
"announce to DHT only."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1657
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1637
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Warning - No I2P trackers in \"{0}\", and DHT and open trackers are "
|
||||
"disabled, you should enable open trackers or DHT before starting the torrent."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1683
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1663
|
||||
#, java-format
|
||||
msgid "Torrent in \"{0}\" is invalid"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1689
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1669
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:195
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1143
|
||||
#, java-format
|
||||
msgid "ERROR - Out of memory, cannot create torrent from {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1716
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1696
|
||||
msgid "Connecting to I2P"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1719
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1699
|
||||
msgid "Error connecting to I2P - check your I2CP settings!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1725
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1705
|
||||
#, java-format
|
||||
msgid "Torrent added and started: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1727
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1707
|
||||
#, java-format
|
||||
msgid "Torrent added: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1805
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1785
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:93
|
||||
#, java-format
|
||||
msgid "Fetching {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1811
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1791
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Open trackers are disabled and we have no DHT peers. Fetch of {0} may not "
|
||||
"succeed until you start another torrent, enable open trackers, or enable DHT."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1815
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1795
|
||||
#, java-format
|
||||
msgid "Adding {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1848
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1828
|
||||
#, java-format
|
||||
msgid "Download already running: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1898
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1908
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1934
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2636
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1878
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1888
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1914
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2618
|
||||
#, java-format
|
||||
msgid "Failed to copy torrent file to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2412
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2393
|
||||
#, java-format
|
||||
msgid "Too many files in \"{0}\" ({1})!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2414
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2395
|
||||
#, java-format
|
||||
msgid "Torrent file \"{0}\" cannot end in \".torrent\"!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2416
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2397
|
||||
#, java-format
|
||||
msgid "No pieces in \"{0}\"!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2418
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2399
|
||||
#, java-format
|
||||
msgid "Too many pieces in \"{0}\", limit is {1}!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2420
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2401
|
||||
#, java-format
|
||||
msgid "Pieces are too large in \"{0}\" ({1}B)!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2421
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2402
|
||||
#, java-format
|
||||
msgid "Limit is {0}B"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2423
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2404
|
||||
#, java-format
|
||||
msgid "Torrent \"{0}\" has no data!"
|
||||
msgstr ""
|
||||
@@ -425,82 +425,82 @@ msgstr ""
|
||||
#. for (int i = 0; i < lengths.size(); i++)
|
||||
#. System.out.println("File " + i + " is " + lengths.get(i) + " long.");
|
||||
#.
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2432
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2413
|
||||
#, java-format
|
||||
msgid "Torrents larger than {0}B are not supported yet \"{1}\"!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2449
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2430
|
||||
#, java-format
|
||||
msgid "Error: Could not remove the torrent {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2453
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2472
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2491
|
||||
#, java-format
|
||||
msgid "Torrent stopped: {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2511
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2492
|
||||
#, java-format
|
||||
msgid "Torrent removed: \"{0}\""
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2519
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2501
|
||||
#, java-format
|
||||
msgid "Adding torrents in {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2552
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2534
|
||||
#, java-format
|
||||
msgid "Up bandwidth limit is {0} KBps"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2577
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2559
|
||||
#, java-format
|
||||
msgid "Download finished: {0}"
|
||||
msgstr ""
|
||||
|
||||
#. addMessage(_t("Metainfo received for {0}", snark.getName()));
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2633
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2934
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2615
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2916
|
||||
#, java-format
|
||||
msgid "Starting up torrent {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2648
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2630
|
||||
#, java-format
|
||||
msgid "Error on torrent {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2933
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2915
|
||||
#: ../java/src/org/klomp/snark/web/FetchAndAdd.java:130
|
||||
msgid "Opening the I2P tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2953
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:2935
|
||||
msgid "Opening the I2P tunnel and starting all torrents."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3018
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3000
|
||||
msgid "Stopping all torrents and closing the I2P tunnel."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3045
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3027
|
||||
msgid "Closing I2P tunnel after notifying trackers."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3115
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3097
|
||||
#, java-format
|
||||
msgid "Finished recheck of torrent {0}, now {1} complete"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3117
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3099
|
||||
#, java-format
|
||||
msgid "Finished recheck of torrent {0}, unchanged"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3121
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:3103
|
||||
#, java-format
|
||||
msgid "Error checking the torrent {0}"
|
||||
msgstr ""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:30+0000\n"
|
||||
"PO-Revision-Date: 2021-05-14 01:18+0000\n"
|
||||
"PO-Revision-Date: 2021-06-07 03:18+0000\n"
|
||||
"Last-Translator: XMPPはいいぞ\n"
|
||||
"Language-Team: Japanese (http://www.transifex.com/otf/I2P/language/ja/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -57,7 +57,7 @@ msgstr "データディレクトリを作成できません"
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1057
|
||||
#, java-format
|
||||
msgid "Total uploaders limit changed to {0}"
|
||||
msgstr "合計アップローダー数の上限を{0}に変更しました"
|
||||
msgstr "合計アップローダー数の上限は{0}に変更されました"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1059
|
||||
#, java-format
|
||||
@@ -345,7 +345,7 @@ msgstr "I2Pに接続しています"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1719
|
||||
msgid "Error connecting to I2P - check your I2CP settings!"
|
||||
msgstr "I2Pへの接続にエラー - I2CP設定を確認して下さい!"
|
||||
msgstr "I2Pへの接続中にエラー - I2CP設定を確認して下さい!"
|
||||
|
||||
#: ../java/src/org/klomp/snark/SnarkManager.java:1725
|
||||
#, java-format
|
||||
@@ -837,7 +837,7 @@ msgstr "ダウンロードを削除しました: {0}"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1249
|
||||
#, java-format
|
||||
msgid "Data file deleted: {0}"
|
||||
msgstr "データファイル削除を削除しました: {0}"
|
||||
msgstr "データファイルを削除しました: {0}"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1251
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1261
|
||||
@@ -912,7 +912,7 @@ msgstr "トレント作成エラー - ファイルまたはディレクトリを
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2787
|
||||
msgid "Delete selected"
|
||||
msgstr "選択されたものを削除"
|
||||
msgstr "選択したものを削除"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1486
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2789
|
||||
@@ -1019,7 +1019,7 @@ msgstr[0] "{0}個のピアからダウンロード中"
|
||||
#, java-format
|
||||
msgid "Connected to {0} peer"
|
||||
msgid_plural "Connected to {0} peers"
|
||||
msgstr[0] "{0}個のピアへ接続しました"
|
||||
msgstr[0] "{0}個のピアに接続しました"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1758
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1759
|
||||
@@ -1032,7 +1032,7 @@ msgstr "停滞"
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
|
||||
#, java-format
|
||||
msgid "Connected to {0} of {1} peers in swarm"
|
||||
msgstr "スウォームにある{1}個中{0}個のピアへ接続しました"
|
||||
msgstr "スウォームにある{1}個中{0}個のピアに接続しました"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1769
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1770
|
||||
@@ -1057,7 +1057,7 @@ msgstr "コメント"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1858
|
||||
msgid "View files"
|
||||
msgstr "ファイルを見る"
|
||||
msgstr "ファイルを表示"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1860
|
||||
msgid "Open file"
|
||||
@@ -1377,7 +1377,7 @@ msgstr "半分の帯域幅を利用可能にすることを推奨します。"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2606
|
||||
msgid "View or change router bandwidth"
|
||||
msgstr "ルータの帯域幅を閲覧または変更"
|
||||
msgstr "ルータの帯域幅を表示または変更"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:2612
|
||||
msgid "Use open trackers also"
|
||||
@@ -1698,7 +1698,7 @@ msgstr "公開されるコメントと評価のための、あなたの作成者
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4008
|
||||
msgid "Enable viewing and posting comments for this torrent"
|
||||
msgstr "このトレントでコメントの閲覧と投稿を有効にする"
|
||||
msgstr "このトレントでコメントの表示と投稿を有効にする"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4031
|
||||
#, java-format
|
||||
@@ -1741,4 +1741,4 @@ msgstr "削除にマーク"
|
||||
|
||||
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:4143
|
||||
msgid "Delete Selected"
|
||||
msgstr "マークされたメッセージを削除しました"
|
||||
msgstr "選択したものを削除"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -97,8 +97,8 @@
|
||||
- Pre-gzip the css files.
|
||||
- LocalHTTPServer will convert the filenames, and gunzip if necessary.
|
||||
-->
|
||||
<gzip src="../../routerconsole/jsp/themes/console/light/console.css" destfile="./build/obj/net/i2p/i2ptunnel/resources/themes/console/light/console.css.gz" />
|
||||
<gzip src="../../routerconsole/jsp/themes/console/dark/console.css" destfile="./build/obj/net/i2p/i2ptunnel/resources/themes/console/dark/console.css.gz" />
|
||||
<gzip src="../../i2ptunnel/resources/proxy/css/light/proxy.css" destfile="./build/obj/net/i2p/i2ptunnel/resources/themes/console/light/proxy.css.gz" />
|
||||
<gzip src="../../i2ptunnel/resources/proxy/css/dark/proxy.css" destfile="./build/obj/net/i2p/i2ptunnel/resources/themes/console/dark/proxy.css.gz" />
|
||||
<jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" excludes="**/ui/*.class **/web/*.class" >
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" />
|
||||
@@ -122,6 +122,7 @@
|
||||
<target name="jarUpToDate">
|
||||
<uptodate property="jar.uptodate" targetfile="build/i2ptunnel.jar" >
|
||||
<srcfiles dir= "build/obj" includes="**/*.class" />
|
||||
<srcfiles dir= "../resources" />
|
||||
</uptodate>
|
||||
<condition property="shouldListChanges" >
|
||||
<and>
|
||||
|
||||
@@ -985,7 +985,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
|
||||
|
||||
if (first) {
|
||||
first = false;
|
||||
out.write("<br><br>\n<div id=\"jumplinks\">\n<h4>");
|
||||
out.write("<br>\n<div id=\"jumplinks\">\n<h4>");
|
||||
out.write(_t("Click a link below for an address helper from a jump service"));
|
||||
out.write("</h4>\n");
|
||||
} else {
|
||||
|
||||
@@ -300,7 +300,7 @@ public abstract class LocalHTTPServer {
|
||||
.append(_t("Your new encryption key"))
|
||||
.append("</title>\n" +
|
||||
"<link rel=\"shortcut icon\" href=\"http://proxy.i2p/themes/console/images/favicon.ico\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/console.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/proxy.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"</head><body>\n" +
|
||||
"<div class=logo>\n" +
|
||||
"<a href=\"")
|
||||
@@ -375,7 +375,7 @@ public abstract class LocalHTTPServer {
|
||||
"<html><head>"+
|
||||
"<title>" + _t("Redirecting to {0}", idn) + "</title>\n" +
|
||||
"<link rel=\"shortcut icon\" href=\"http://proxy.i2p/themes/console/images/favicon.ico\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/console.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/proxy.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"<meta http-equiv=\"Refresh\" content=\"1; url=" + url + "\">\n" +
|
||||
"</head><body>\n" +
|
||||
"<div class=logo>\n" +
|
||||
@@ -410,7 +410,7 @@ public abstract class LocalHTTPServer {
|
||||
"<html><head>"+
|
||||
"<title>" + _t("Redirecting to {0}", idn) + "</title>\n" +
|
||||
"<link rel=\"shortcut icon\" href=\"http://proxy.i2p/themes/console/images/favicon.ico\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/console.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"<link href=\"http://proxy.i2p/themes/console/default/proxy.css\" rel=\"stylesheet\" type=\"text/css\" >\n" +
|
||||
"<meta http-equiv=\"Refresh\" content=\"1; url=" + url + "\">\n" +
|
||||
"</head><body>\n" +
|
||||
"<div class=logo>\n" +
|
||||
|
||||
@@ -11,8 +11,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: Waseihou Watashi <waseihou@gmail.com>\n"
|
||||
"PO-Revision-Date: 2021-07-08 12:49+0000\n"
|
||||
"Last-Translator: slrslr\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -489,7 +489,7 @@ msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
msgstr "Cílová sada pronájmu nebyla nalezena"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
|
||||
msgid "Host"
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P i2ptunnel\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"POT-Creation-Date: 2021-08-11 15:33+0000\n"
|
||||
"PO-Revision-Date: 2010-06-15 14:09+0100\n"
|
||||
"Last-Translator: duck <duck@mail.i2p>\n"
|
||||
"Language-Team: duck <duck@mail.i2p>\n"
|
||||
@@ -21,7 +21,7 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:5 ../java/build/Proxy.java:11
|
||||
#: ../java/build/Proxy.java:40 ../java/build/Proxy.java:49
|
||||
#: ../java/build/Proxy.java:55 ../java/build/Proxy.java:91
|
||||
#: ../java/build/Proxy.java:97 ../java/build/Proxy.java:111
|
||||
#: ../java/build/Proxy.java:97
|
||||
msgid "Website Unreachable"
|
||||
msgstr ""
|
||||
|
||||
@@ -35,9 +35,9 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:151 ../java/build/Proxy.java:161
|
||||
#: ../java/build/Proxy.java:173 ../java/build/Proxy.java:186
|
||||
#: ../java/build/Proxy.java:198 ../java/build/Proxy.java:208
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:294
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:368
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:402
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:307
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:382
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:417
|
||||
msgid "Router Console"
|
||||
msgstr ""
|
||||
|
||||
@@ -64,9 +64,9 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:153 ../java/build/Proxy.java:163
|
||||
#: ../java/build/Proxy.java:175 ../java/build/Proxy.java:188
|
||||
#: ../java/build/Proxy.java:200 ../java/build/Proxy.java:210
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:297
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:310
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:383
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:418
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
@@ -80,9 +80,9 @@ msgstr ""
|
||||
#: ../java/build/Proxy.java:154 ../java/build/Proxy.java:164
|
||||
#: ../java/build/Proxy.java:176 ../java/build/Proxy.java:189
|
||||
#: ../java/build/Proxy.java:201 ../java/build/Proxy.java:211
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:298
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:369
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:403
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:383
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:418
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
@@ -117,9 +117,10 @@ msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:15 ../java/build/Proxy.java:27
|
||||
#: ../java/build/Proxy.java:48 ../java/build/Proxy.java:59
|
||||
#: ../java/build/Proxy.java:90 ../java/build/Proxy.java:110
|
||||
#: ../java/build/Proxy.java:118 ../java/build/Proxy.java:130
|
||||
#: ../java/build/Proxy.java:171 ../java/build/Proxy.java:196
|
||||
#: ../java/build/Proxy.java:90 ../java/build/Proxy.java:99
|
||||
#: ../java/build/Proxy.java:110 ../java/build/Proxy.java:118
|
||||
#: ../java/build/Proxy.java:130 ../java/build/Proxy.java:171
|
||||
#: ../java/build/Proxy.java:196 ../java/build/Proxy.java:217
|
||||
msgid "Could not find the following destination:"
|
||||
msgstr ""
|
||||
|
||||
@@ -279,10 +280,6 @@ msgid ""
|
||||
"not supported by your I2P or Java version."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:99 ../java/build/Proxy.java:217
|
||||
msgid "Could not connect to the following destination:"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:100 ../java/build/Proxy.java:106
|
||||
#: ../java/build/Proxy.java:185 ../java/build/Proxy.java:191
|
||||
msgid "Connection Reset"
|
||||
@@ -298,7 +295,7 @@ msgid ""
|
||||
"your access."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/build/Proxy.java:117
|
||||
#: ../java/build/Proxy.java:111 ../java/build/Proxy.java:117
|
||||
msgid "Warning: Authorization Required"
|
||||
msgstr ""
|
||||
|
||||
@@ -454,15 +451,15 @@ msgid ""
|
||||
"are not supported by your I2P or Java version."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:692
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:693
|
||||
msgid "This seems to be a bad destination:"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:693
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:694
|
||||
msgid "i2paddresshelper cannot help you with a destination like that!"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:765
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:766
|
||||
#, java-format
|
||||
msgid ""
|
||||
"To visit the destination in your address book, click <a href=\"{0}\">here</"
|
||||
@@ -470,229 +467,224 @@ msgid ""
|
||||
"\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:774
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:775
|
||||
#, java-format
|
||||
msgid "Destination for {0} in address book"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:777
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:778
|
||||
msgid "Conflicting address helper destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1226
|
||||
msgid "Corrupt Base32 address"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1306
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1443
|
||||
msgid "Host"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1441
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1502
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1447
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1509
|
||||
msgid "Base32"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1445
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
|
||||
msgid "Destination"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1451
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1458
|
||||
#, java-format
|
||||
msgid "Continue to {0} without saving"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1452
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1459
|
||||
msgid ""
|
||||
"You can browse to the site without saving it to the address book. The "
|
||||
"address will be remembered until you restart your I2P router."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1453
|
||||
msgid "Continue without saving"
|
||||
#. FIXME wasn't escaped
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1468
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1555
|
||||
msgid "Save & continue"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1470
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to website"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1471
|
||||
msgid ""
|
||||
"This address will be saved to your Router address book where your "
|
||||
"subscription-based addresses are stored."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1463
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1473
|
||||
msgid ""
|
||||
"If you want to keep track of sites you have added manually, add to your "
|
||||
"Local or Private address book instead."
|
||||
msgstr ""
|
||||
|
||||
#. FIXME wasn't escaped
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1466
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1548
|
||||
msgid "Save & continue"
|
||||
msgstr ""
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1473
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1481
|
||||
#, java-format
|
||||
msgid "Save {0} to local address book and continue to website"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1474
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1482
|
||||
msgid ""
|
||||
"This address will be saved to your Local address book. Select this option "
|
||||
"for addresses you wish to keep separate from the main router address book, "
|
||||
"but don't mind publishing."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1478
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1486
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to website"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1479
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1487
|
||||
msgid ""
|
||||
"This address will be saved to your Private address book, ensuring it is "
|
||||
"never published."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1507
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1514
|
||||
msgid "Base32 address requires lookup password"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1509
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1516
|
||||
msgid "Base32 address requires encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1511
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1518
|
||||
msgid "Base32 address requires encryption key and lookup password"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1513
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1520
|
||||
msgid "Base32 address decryption failure, check encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1524
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1531
|
||||
msgid "Generate"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1532
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1533
|
||||
msgid ""
|
||||
"You must either enter a PSK encryption key provided by the server operator, "
|
||||
"or generate a DH encryption key and send that to the server operator."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1527
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1534
|
||||
msgid "Ask the server operator for help."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1530
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1537
|
||||
msgid "Enter PSK encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1533
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1540
|
||||
msgid "Generate new DH encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1541
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1548
|
||||
msgid "Lookup password"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1542
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1549
|
||||
msgid "You must enter the password provided by the server operator."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:209
|
||||
#, java-format
|
||||
msgid "Added via address helper from {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:198
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:211
|
||||
msgid "Added via address helper"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:235
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:248
|
||||
msgid "Missing lookup password"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:249
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:262
|
||||
msgid "Missing private key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:254
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:267
|
||||
msgid "Invalid private key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:287
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:306
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:300
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:319
|
||||
msgid "Your new encryption key"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:301
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:314
|
||||
msgid "Address book"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:324
|
||||
msgid "Copy the key and send it to the server operator."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:313
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:326
|
||||
msgid "After you are granted permission, you may proceed to the website."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:334
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347
|
||||
msgid "Go back and fix the error"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:345
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:358
|
||||
msgid "router"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:360
|
||||
msgid "local"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:349
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:362
|
||||
msgid "private"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:362
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:396
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411
|
||||
#, java-format
|
||||
msgid "Redirecting to {0}"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:371
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:405
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:385
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:420
|
||||
msgid "Address Book"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:390
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} address book, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:391
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} address book, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:379
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:393
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:426
|
||||
msgid "Click here if you are not redirected automatically."
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:409
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:424
|
||||
#, java-format
|
||||
msgid "Saved the authentication for {0}, redirecting now."
|
||||
msgstr ""
|
||||
|
||||
@@ -5,13 +5,15 @@
|
||||
#
|
||||
# Translators:
|
||||
# Gergő Doma <domag02@gmail.com>, 2020
|
||||
# AdminLMH <lehetmashogy@i2pmail.org>, 2021
|
||||
# Nyul Csoki <csokinyul@i2pmail.org>, 2021
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: vargaviktor <viktor.varga@gmail.com>\n"
|
||||
"PO-Revision-Date: 2021-06-20 09:44+0000\n"
|
||||
"Last-Translator: AdminLMH <lehetmashogy@i2pmail.org>\n"
|
||||
"Language-Team: Hungarian (http://www.transifex.com/otf/I2P/language/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -108,7 +110,7 @@ msgstr "A weboldalt nem lehetett elérni."
|
||||
msgid ""
|
||||
"The website is offline, there is network congestion, or your router is not "
|
||||
"yet well-integrated with peers."
|
||||
msgstr "Lehet hogy a webhely jelenleg nem üzemel, vagy a hálózat túlzsúfolt, esetleg a routered még nincs jól integrálva az ügyfelekkel."
|
||||
msgstr "Lehet hogy a webhely jelenleg nem üzemel, vagy a hálózat túlzsúfolt, esetleg a routered még nem jól integrált társakkal."
|
||||
|
||||
#: ../java/build/Proxy.java:14 ../java/build/Proxy.java:58
|
||||
#: ../java/build/Proxy.java:109 ../java/build/Proxy.java:129
|
||||
@@ -331,49 +333,49 @@ msgstr "A kérésed az I2P-n kívüli helyre mutatott, de ahhoz nincs beállítv
|
||||
|
||||
#: ../java/build/Proxy.java:139
|
||||
msgid "Please configure an outproxy in I2PTunnel."
|
||||
msgstr ""
|
||||
msgstr "Kérlek állíts be egy kimenő proxyt az I2PAlagútban."
|
||||
|
||||
#: ../java/build/Proxy.java:140 ../java/build/Proxy.java:146
|
||||
msgid "Warning: Destination Key Conflict"
|
||||
msgstr ""
|
||||
msgstr "Figyelmeztetés: Úticél Kulcs Konfliktus"
|
||||
|
||||
#: ../java/build/Proxy.java:147
|
||||
msgid ""
|
||||
"The address helper link you followed specifies a different destination key "
|
||||
"than the entry in your address book."
|
||||
msgstr ""
|
||||
msgstr "A cím segédhivatkozás, amit követtél más úticél kulcsot ad, mint a bejegyzés a címjegyzékedben."
|
||||
|
||||
#: ../java/build/Proxy.java:148
|
||||
msgid ""
|
||||
"Someone could be trying to impersonate another website, or people have given"
|
||||
" two websites identical names."
|
||||
msgstr ""
|
||||
msgstr "Lehet, hogy valaki utánozni próbál egy másik weboldalt, vagy két ember két különböző oldalnak ugyanazt a nevet adta."
|
||||
|
||||
#: ../java/build/Proxy.java:149
|
||||
msgid ""
|
||||
"Resolve the conflict by deciding which key you trust, and then either ignore"
|
||||
" the address helper link, or delete the host entry from your address book "
|
||||
"and click the address helper link again."
|
||||
msgstr ""
|
||||
msgstr "Oldd meg a konfliktust azáltal, hogy eldöntöd, hogy melyik kulcsban bízol meg, és aztán vagy hagyad figyelmen kívül a cím segédhivatkozást, vagy töröld ki a gép bejegyzését a címjegyzékedből és kattints a cím segédhivatkozásra újra."
|
||||
|
||||
#: ../java/build/Proxy.java:150 ../java/build/Proxy.java:156
|
||||
msgid "Warning: Bad Address Helper"
|
||||
msgstr ""
|
||||
msgstr "Figyelmeztetés: Rossz Cím Segéd"
|
||||
|
||||
#: ../java/build/Proxy.java:157
|
||||
#, java-format
|
||||
msgid "The helper key in the URL ({0}i2paddresshelper={1}) is not resolvable."
|
||||
msgstr ""
|
||||
msgstr "A segédlukcs a következő URL-ben: ({0}i2paddresshelper={1}) nem feloldható."
|
||||
|
||||
#: ../java/build/Proxy.java:158
|
||||
msgid "It seems to be garbage data, or a mistyped Base 32 address."
|
||||
msgstr ""
|
||||
msgstr "Úgy tűnik, hogy hulladék adat, vagy félregépelt Base 32 cím."
|
||||
|
||||
#: ../java/build/Proxy.java:159
|
||||
msgid ""
|
||||
"Check your URL to try and fix the helper key to be a valid Base 32 hostname "
|
||||
"or Base 64 key."
|
||||
msgstr ""
|
||||
msgstr "Ellenőrizd az URL-t, hogy kipróbáld és kijavítsd a segédkulcsot, hogy érvényes Base 32 gépnév vagy Base 64 kulcs legyen."
|
||||
|
||||
#: ../java/build/Proxy.java:167
|
||||
msgid "The HTTP Outproxy was not found."
|
||||
@@ -383,15 +385,15 @@ msgstr "A HTTP proxy nincs bekapcsolva"
|
||||
msgid ""
|
||||
"It is offline, there is network congestion, or your router is not yet well-"
|
||||
"integrated with peers."
|
||||
msgstr ""
|
||||
msgstr "Nem elérhető, hálózati torlódás van, vagy a routered még nem jól integrált társakkal."
|
||||
|
||||
#: ../java/build/Proxy.java:172 ../java/build/Proxy.java:178
|
||||
msgid "Warning: Request Denied"
|
||||
msgstr ""
|
||||
msgstr "Figyelmeztetés: Kérés Elutasítva"
|
||||
|
||||
#: ../java/build/Proxy.java:179
|
||||
msgid "You attempted to connect to a non-I2P website or location."
|
||||
msgstr ""
|
||||
msgstr "Megpróbáltál egy nem I2P weboldalhoz vagy helyhez kapcsolódni."
|
||||
|
||||
#: ../java/build/Proxy.java:180
|
||||
msgid "Proxy Authorization Required"
|
||||
@@ -404,14 +406,14 @@ msgstr "I2P HTTP Proxy hitelesítés szükséges"
|
||||
#: ../java/build/Proxy.java:182
|
||||
msgid ""
|
||||
"This proxy is configured to require a username and password for access."
|
||||
msgstr ""
|
||||
msgstr "Ez a proxy úgy van beállítva, hogy az eléréshez felhasználónvet és jelszót kérjen."
|
||||
|
||||
#: ../java/build/Proxy.java:183
|
||||
#, java-format
|
||||
msgid ""
|
||||
"Please enter your username and password, or check your {0}router "
|
||||
"configuration{1} or {2}I2PTunnel configuration{3}."
|
||||
msgstr ""
|
||||
msgstr "Kérlek, add meg a felhasználónevedet és jelszavadat, ellenőrizd a {0}router beállításaidat{1} vagy {2}I2PAlagút beállításokat{3}."
|
||||
|
||||
#: ../java/build/Proxy.java:184
|
||||
#, java-format
|
||||
@@ -419,43 +421,43 @@ msgid ""
|
||||
"To disable authorization, remove the configuration "
|
||||
"{0}i2ptunnel.proxy.auth=basic{1}, then stop and restart the HTTP Proxy "
|
||||
"tunnel."
|
||||
msgstr ""
|
||||
msgstr "A hitelesítés kikapcsolásához távolítsd el a beállítást {0}i2ptunnel.proxy.auth=basic{1}, azután állítsd le és indítsd újra a HTTPS Proxy alagutat."
|
||||
|
||||
#: ../java/build/Proxy.java:192
|
||||
msgid "The connection to the proxy was reset."
|
||||
msgstr ""
|
||||
msgstr "A proxyhoz csatlakozás alaphelyzetbe került."
|
||||
|
||||
#: ../java/build/Proxy.java:193
|
||||
msgid ""
|
||||
"The proxy could be temporarily unavailable, too busy, or it has blocked your"
|
||||
" access."
|
||||
msgstr ""
|
||||
msgstr "Lehet, hogy a proxy átmenetileg nem elérhető, túlterhelt vagy letiltotta a hozzáférésedet."
|
||||
|
||||
#: ../java/build/Proxy.java:197 ../java/build/Proxy.java:203
|
||||
msgid "Warning: Non-HTTP Protocol"
|
||||
msgstr ""
|
||||
msgstr "Figyelmeztetés: Nem HTTP Protokol"
|
||||
|
||||
#: ../java/build/Proxy.java:204
|
||||
msgid "The request uses a bad protocol."
|
||||
msgstr ""
|
||||
msgstr "A kérés rossz protokolt használ."
|
||||
|
||||
#: ../java/build/Proxy.java:205
|
||||
msgid "The I2P HTTP Proxy supports HTTP and HTTPS requests only."
|
||||
msgstr ""
|
||||
msgstr "Az I2P HTTP Proxy csak HTTP és HTTPS kéréseket támogat."
|
||||
|
||||
#: ../java/build/Proxy.java:206
|
||||
msgid "Other protocols such as FTP are not allowed."
|
||||
msgstr ""
|
||||
msgstr "Más protokolok, pl. FTP, nincsenek engedélyezve."
|
||||
|
||||
#: ../java/build/Proxy.java:207 ../java/build/Proxy.java:213
|
||||
msgid "Outproxy Unreachable"
|
||||
msgstr ""
|
||||
msgstr "Kimenő proxy nem elérhető."
|
||||
|
||||
#: ../java/build/Proxy.java:214
|
||||
msgid ""
|
||||
"The HTTP outproxy was not reachable, because it uses encryption options that"
|
||||
" are not supported by your I2P or Java version."
|
||||
msgstr ""
|
||||
msgstr "A HTTP kimenő proxy nem volt elérhető, mert olyan titkosítási beállításokat használ, melyeket a te I2P vagy Java verziód nem támogat."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:692
|
||||
msgid "This seems to be a bad destination:"
|
||||
@@ -471,24 +473,24 @@ msgid ""
|
||||
"To visit the destination in your address book, click <a "
|
||||
"href=\"{0}\">here</a>. To visit the conflicting addresshelper destination, "
|
||||
"click <a href=\"{1}\">here</a>."
|
||||
msgstr ""
|
||||
msgstr "A címjegyzékedben való úticél eléréséhez kattints <a href=\"{0}\">ide</a>. Hogy ellátogass a konfliktusban lévő címsegéd úticélhoz, kattints <a href=\"{1}\">ide</a>."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:774
|
||||
#, java-format
|
||||
msgid "Destination for {0} in address book"
|
||||
msgstr ""
|
||||
msgstr "Úticél ide: {0} a címjegyzékben"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:777
|
||||
msgid "Conflicting address helper destination"
|
||||
msgstr ""
|
||||
msgstr "Konfliktusban lévő cím segéd úticél"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1224
|
||||
msgid "Corrupt Base32 address"
|
||||
msgstr ""
|
||||
msgstr "Korrupt Base32 cím"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1304
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
msgstr "Úticél kihasználási engedély nem található"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1437
|
||||
msgid "Host"
|
||||
@@ -497,7 +499,7 @@ msgstr "Hoszt"
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1441
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1502
|
||||
msgid "Base32"
|
||||
msgstr ""
|
||||
msgstr "Base32"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1445
|
||||
msgid "Destination"
|
||||
@@ -512,74 +514,74 @@ msgstr "Mentés nélkül tovább ide: {0}"
|
||||
msgid ""
|
||||
"You can browse to the site without saving it to the address book. The "
|
||||
"address will be remembered until you restart your I2P router."
|
||||
msgstr ""
|
||||
msgstr "Böngészheted az oldalt a címjegyzékbe való mentés nélkül. A cím megjegyzésre kerül, amíg az I2P routered újra nem lesz indítva."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1453
|
||||
msgid "Continue without saving"
|
||||
msgstr ""
|
||||
msgstr "Folytatás mentés nélkül"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1460
|
||||
#, java-format
|
||||
msgid "Save {0} to router address book and continue to website"
|
||||
msgstr ""
|
||||
msgstr "{0} mentése a router címjegyzékébe és tovább a weboldalra"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1461
|
||||
msgid ""
|
||||
"This address will be saved to your Router address book where your "
|
||||
"subscription-based addresses are stored."
|
||||
msgstr ""
|
||||
msgstr "Ez a cím el lesz mentve a Routered címjegyzékébe, ahol az előjegyzés-alapú címek vannak tárolva."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1463
|
||||
msgid ""
|
||||
"If you want to keep track of sites you have added manually, add to your "
|
||||
"Local or Private address book instead."
|
||||
msgstr ""
|
||||
msgstr "Ha nyomon szeretnéd követni azokat a kézzel hozzáadott oldalakat, inkább add hozzá a Helyi vagy Magán címjegyzékedhez."
|
||||
|
||||
#. FIXME wasn't escaped
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1466
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1548
|
||||
msgid "Save & continue"
|
||||
msgstr ""
|
||||
msgstr "Mentés és folytatás"
|
||||
|
||||
#. only blockfile supports multiple books
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1473
|
||||
#, java-format
|
||||
msgid "Save {0} to local address book and continue to website"
|
||||
msgstr ""
|
||||
msgstr "{0} mentése a helyi címjegyzékbe és tovább a weboldalra"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1474
|
||||
msgid ""
|
||||
"This address will be saved to your Local address book. Select this option "
|
||||
"for addresses you wish to keep separate from the main router address book, "
|
||||
"but don't mind publishing."
|
||||
msgstr ""
|
||||
msgstr "Ez a cím el lesz mentve a a Helyi címjegyzékedbe. Válaszd ezt a lehetőséget azokhoz a címekhez, melyeket külön szeretnél tartani a fő router címjegyzéktől, de nem bánod, ha közzé vannak téve."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1478
|
||||
#, java-format
|
||||
msgid "Save {0} to private address book and continue to website"
|
||||
msgstr ""
|
||||
msgstr "{0} mentése a magán címjegyzékbe és tovább a weboldalra"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1479
|
||||
msgid ""
|
||||
"This address will be saved to your Private address book, ensuring it is "
|
||||
"never published."
|
||||
msgstr ""
|
||||
msgstr "Ez a cím el lesz mentve a Magán címjegyzékedbe, biztosítva azt, hogy soha nem lesz közzétéve."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1507
|
||||
msgid "Base32 address requires lookup password"
|
||||
msgstr ""
|
||||
msgstr "Base32 cím kereső jelszót kér"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1509
|
||||
msgid "Base32 address requires encryption key"
|
||||
msgstr ""
|
||||
msgstr "Base32 cím titkosítási kulcsot kér"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1511
|
||||
msgid "Base32 address requires encryption key and lookup password"
|
||||
msgstr ""
|
||||
msgstr "Base32 cím titkosítási kulcsot és kereső jelszót kér"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1513
|
||||
msgid "Base32 address decryption failure, check encryption key"
|
||||
msgstr ""
|
||||
msgstr "Base32 cím titkosítás feloldása meghiúsult, ellenőrizd a titkosítási kulcsot"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1524
|
||||
msgid "Generate"
|
||||
@@ -587,33 +589,33 @@ msgstr "Generálás"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1525
|
||||
msgid "Encryption key"
|
||||
msgstr ""
|
||||
msgstr "Titkosítási kulcs"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1526
|
||||
msgid ""
|
||||
"You must either enter a PSK encryption key provided by the server operator, "
|
||||
"or generate a DH encryption key and send that to the server operator."
|
||||
msgstr ""
|
||||
msgstr "Kötelező megadnod vagy egy PSK titkosítási kulcsot, melyet a szerverüzemeltetője bocsátott rendelkezésedre, vagy létre kell hoznod egy DH titkosítási kulcsot és elküldened a szerver üzemeltetőjének."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1527
|
||||
msgid "Ask the server operator for help."
|
||||
msgstr ""
|
||||
msgstr "Kérj segítséget a szerver üzemeltetőjétől."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1530
|
||||
msgid "Enter PSK encryption key"
|
||||
msgstr ""
|
||||
msgstr "Add meg a PSK titkosítási kulcsot"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1533
|
||||
msgid "Generate new DH encryption key"
|
||||
msgstr ""
|
||||
msgstr "Új DH titkosítási kulcs létrehozása"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1541
|
||||
msgid "Lookup password"
|
||||
msgstr ""
|
||||
msgstr "Kereső jelszó"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1542
|
||||
msgid "You must enter the password provided by the server operator."
|
||||
msgstr ""
|
||||
msgstr "Meg kell adnod a jelszót, melyet a szerver üzemeltetője bocsátott a rendelkezésedre"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:196
|
||||
#, java-format
|
||||
@@ -626,20 +628,20 @@ msgstr "Címsegítőn keresztül hozzáadva"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:235
|
||||
msgid "Missing lookup password"
|
||||
msgstr ""
|
||||
msgstr "Hiányzó kereső jelszó"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:249
|
||||
msgid "Missing private key"
|
||||
msgstr ""
|
||||
msgstr "Hiányzó magánkulcs"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:254
|
||||
msgid "Invalid private key"
|
||||
msgstr ""
|
||||
msgstr "Érvénytelen magánkulcs"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:287
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:306
|
||||
msgid "Your new encryption key"
|
||||
msgstr ""
|
||||
msgstr "Az új titkosítási kulcsod"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:301
|
||||
msgid "Address book"
|
||||
@@ -647,15 +649,15 @@ msgstr "Címjegyzék"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:311
|
||||
msgid "Copy the key and send it to the server operator."
|
||||
msgstr ""
|
||||
msgstr "Másold ki a kulcsot és küldd el a szerver üzemeltetőjének."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:313
|
||||
msgid "After you are granted permission, you may proceed to the website."
|
||||
msgstr ""
|
||||
msgstr "Miután megkaptad az engedélyt, beléphetsz a weboldalra."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:334
|
||||
msgid "Go back and fix the error"
|
||||
msgstr ""
|
||||
msgstr "Menj vissza és javítsd ki a hibát"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:345
|
||||
msgid "router"
|
||||
@@ -663,7 +665,7 @@ msgstr "router"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:347
|
||||
msgid "local"
|
||||
msgstr ""
|
||||
msgstr "helyi"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:349
|
||||
msgid "private"
|
||||
@@ -683,12 +685,12 @@ msgstr "Címjegyzék"
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:376
|
||||
#, java-format
|
||||
msgid "Saved {0} to the {1} address book, redirecting now."
|
||||
msgstr ""
|
||||
msgstr "{0} mentve a {1} címjegyzékbe, átirányítás most."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:377
|
||||
#, java-format
|
||||
msgid "Failed to save {0} to the {1} address book, redirecting now."
|
||||
msgstr ""
|
||||
msgstr "{0} mentése a {1} címjegyzékbe nem sikerült, redirecting now."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:379
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:411
|
||||
@@ -698,4 +700,4 @@ msgstr "Kattints ide, amennyiben nem történt meg az automatikus átirányítá
|
||||
#: ../java/src/net/i2p/i2ptunnel/localServer/LocalHTTPServer.java:409
|
||||
#, java-format
|
||||
msgid "Saved the authentication for {0}, redirecting now."
|
||||
msgstr ""
|
||||
msgstr "Hitelesítés mentve ehhez: {0}, átirányítás most."
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
# cacapo <handelsehorisont@gmail.com>, 2015-2016
|
||||
# hottuna <i2p@robertfoss.se>, 2013
|
||||
# hottuna <i2p@robertfoss.se>, 2012
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2016-2017
|
||||
# Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2019-2020
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017
|
||||
# WinterFairy <winterfairy@riseup.net>, 2014
|
||||
@@ -18,8 +18,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: hottuna <i2p@robertfoss.se>\n"
|
||||
"PO-Revision-Date: 2021-06-23 09:38+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -541,7 +541,7 @@ msgstr ""
|
||||
msgid ""
|
||||
"If you want to keep track of sites you have added manually, add to your "
|
||||
"Local or Private address book instead."
|
||||
msgstr ""
|
||||
msgstr "Om du vill hålla reda på webbplatser som du har lagt till manuellt, lägg till i din lokala eller privata adressbok istället."
|
||||
|
||||
#. FIXME wasn't escaped
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1466
|
||||
@@ -571,7 +571,7 @@ msgstr "Spara {0} till privata adressboken och fortsätt till webbplatsen."
|
||||
msgid ""
|
||||
"This address will be saved to your Private address book, ensuring it is "
|
||||
"never published."
|
||||
msgstr ""
|
||||
msgstr "Den här adressen sparas i din privata adressbok, så att den aldrig publiceras."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java:1507
|
||||
msgid "Base32 address requires lookup password"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -18,7 +18,7 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-05 15:14+0000\n"
|
||||
"PO-Revision-Date: 2021-05-13 23:06+0000\n"
|
||||
"PO-Revision-Date: 2021-08-20 15:51+0000\n"
|
||||
"Last-Translator: ☆Verdulo\n"
|
||||
"Language-Team: Polish (http://www.transifex.com/otf/I2P/language/pl/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -1518,7 +1518,7 @@ msgstr "To są lokalne usługi dostarczane przez Twój węzeł."
|
||||
msgid ""
|
||||
"By default, most of your client services (email, HTTP proxy, IRC) will share"
|
||||
" the same set of tunnels and be listed as \"Shared Clients\"."
|
||||
msgstr "Domyślnie większość usług klienckich (el‑poczta, proxy HTTP, IRC) dzieli wspólny zestaw tuneli wyświetlany jako „współdzielone klienty”."
|
||||
msgstr "Domyślnie większość usług klienckich (e‑poczta, proxy HTTP, IRC) dzieli wspólny zestaw tuneli wyświetlany jako „współdzielone klienty”."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638
|
||||
|
||||
@@ -35,8 +35,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-14 21:15+0000\n"
|
||||
"POT-Creation-Date: 2021-05-05 15:14+0000\n"
|
||||
"PO-Revision-Date: 2021-06-09 17:59+0000\n"
|
||||
"Last-Translator: ValdikSS <iam@valdikss.org.ru>\n"
|
||||
"Language-Team: Russian (Russia) (http://www.transifex.com/otf/I2P/language/ru_RU/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -197,7 +197,7 @@ msgid "HTTP bidir"
|
||||
msgstr "HTTP bidir (экспериментальный двунаправленный режим, инструкцию спрашивайте у sponge)"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493
|
||||
msgid "Host not set"
|
||||
msgstr "Хост не задан"
|
||||
|
||||
@@ -207,7 +207,7 @@ msgstr "Некорректный адрес"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178
|
||||
msgid "Hidden Services Manager"
|
||||
@@ -235,16 +235,16 @@ msgstr "Настройки нового клиентского туннеля"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375
|
||||
msgid "Name"
|
||||
msgstr "Название"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462
|
||||
msgid "Type"
|
||||
msgstr "Тип"
|
||||
|
||||
@@ -258,8 +258,8 @@ msgstr "Имя туннеля, отображаемое в Менеджере т
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381
|
||||
msgid "Description"
|
||||
msgstr "Описание"
|
||||
@@ -315,7 +315,7 @@ msgstr "Точка доступа"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696
|
||||
@@ -434,7 +434,7 @@ msgid "b32 not recommended"
|
||||
msgstr "b32 не рекомендуется"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641
|
||||
msgid "Shared Client"
|
||||
msgstr "Общий клиент"
|
||||
|
||||
@@ -1188,7 +1188,7 @@ msgstr "Отправить ключ всем пользователям."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr "Зашифровано"
|
||||
|
||||
@@ -1528,152 +1528,164 @@ msgstr "Временной промежуток, после которого с
|
||||
msgid "Tunnels not initialized yet; please retry in a few moments."
|
||||
msgstr "Туннели еще не инициализированы, повторите запрос через некоторое время."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
msgid "These are the local services provided by your router."
|
||||
msgstr "Это локальные сервисы, предоставляемые вашим роутером."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165
|
||||
msgid ""
|
||||
"By default, most of your client services (email, HTTP proxy, IRC) will share"
|
||||
" the same set of tunnels and be listed as \"Shared Clients\"."
|
||||
msgstr "По умолчанию большинство ваших клиентских служб (электронная почта, HTTP-прокси, IRC) будут использовать один и тот же набор туннелей и будут отображаться как «Общие клиенты»."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638
|
||||
msgid "Status Messages"
|
||||
msgstr "Сообщения о состоянии"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181
|
||||
msgid "Refresh"
|
||||
msgstr "Обновить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192
|
||||
msgid "Clear"
|
||||
msgstr "Очистить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
|
||||
msgid "Global Tunnel Control"
|
||||
msgstr "Глобальное управление туннелями"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
|
||||
msgid "Tunnel Wizard"
|
||||
msgstr "Мастер туннелей"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209
|
||||
msgid "Stop All"
|
||||
msgstr "Остановить все"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213
|
||||
msgid "Start All"
|
||||
msgstr "Запустить все"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
|
||||
msgid "Restart All"
|
||||
msgstr "Перезапустить все"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220
|
||||
msgid "I2P Hidden Services"
|
||||
msgstr "Скрытые сервисы I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
msgid "Points at"
|
||||
msgstr "Указывает на"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289
|
||||
msgid "Preview"
|
||||
msgstr "Предпросмотр"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468
|
||||
msgid "Status"
|
||||
msgstr "Состояние"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470
|
||||
msgid "Control"
|
||||
msgstr "Управление"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
msgid "Edit Server Tunnel Settings for"
|
||||
msgstr "Изменение настроек серверного туннеля для"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256
|
||||
msgid "Test HTTPS server, bypassing I2P"
|
||||
msgstr "Тестирование HTTPS-сервера в обход I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264
|
||||
msgid "Test HTTP server, bypassing I2P"
|
||||
msgstr "Тестирование HTTP-сервера в обход I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
|
||||
msgid "Test HTTP server through I2P"
|
||||
msgstr "Тестирование HTTP-сервера через I2P"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294
|
||||
msgid "No Preview"
|
||||
msgstr "Предпросмотр недоступен"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515
|
||||
msgid "Starting..."
|
||||
msgstr "Запускается..."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:517
|
||||
msgid "Stop this Tunnel"
|
||||
msgstr "Остановить этот туннель"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558
|
||||
msgid "Stop"
|
||||
msgstr "Остановить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551
|
||||
msgid "Running"
|
||||
msgstr "Запущен"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568
|
||||
msgid "Stopped"
|
||||
msgstr "Остановлен"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:570
|
||||
msgid "Start this Tunnel"
|
||||
msgstr "Запустить этот туннель"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577
|
||||
msgid "Start"
|
||||
msgstr "Запустить"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595
|
||||
msgid "Destination"
|
||||
msgstr "Адрес назначения"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
|
||||
msgid "Hostname"
|
||||
msgstr "Имя узла"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
|
||||
msgid "Share your site using the hostname"
|
||||
msgstr "Поделитесь вашим сайтом с помощью этой ссылки"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433
|
||||
msgid "Copy the hostname to the clipboard"
|
||||
msgstr "Скопировать имя узла в буфер"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
|
||||
msgid "Copy Hostname"
|
||||
msgstr "Скопировать имя узла"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452
|
||||
msgid "New hidden service"
|
||||
msgstr "Новый скрытый сервис"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344
|
||||
@@ -1682,41 +1694,41 @@ msgstr "Новый скрытый сервис"
|
||||
msgid "Standard"
|
||||
msgstr "Стандартный"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677
|
||||
msgid "Create"
|
||||
msgstr "Создать"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr "Клиентские I2P-туннели"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464
|
||||
msgid "Interface"
|
||||
msgstr "Сетевой интерфейс"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479
|
||||
msgid "Edit Tunnel Settings for"
|
||||
msgstr "Изменение настроек туннеля для"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
|
||||
msgid "Standby"
|
||||
msgstr "Режим ожидания"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589
|
||||
msgid "Outproxy"
|
||||
msgstr "Outproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602
|
||||
msgid "internal plugin"
|
||||
msgstr "внутренний модуль"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621
|
||||
msgid "none"
|
||||
msgstr "нет"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673
|
||||
msgid "New client tunnel"
|
||||
msgstr "Новый клиентский туннель"
|
||||
|
||||
|
||||
@@ -12,8 +12,8 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-05 15:14+0000\n"
|
||||
"PO-Revision-Date: 2021-05-05 16:05+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"PO-Revision-Date: 2021-06-01 15:08+0000\n"
|
||||
"Last-Translator: Besnik Bleta <besnik@programeshqip.org>\n"
|
||||
"Language-Team: Albanian (http://www.transifex.com/otf/I2P/language/sq/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -453,7 +453,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1418
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1526
|
||||
msgid "Length"
|
||||
msgstr ""
|
||||
msgstr "Gjatësi"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:529
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1420
|
||||
@@ -593,7 +593,7 @@ msgstr ""
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1621
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1671
|
||||
msgid "Count"
|
||||
msgstr ""
|
||||
msgstr "Numër"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:635
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1623
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
# cacapo <handelsehorisont@gmail.com>, 2015
|
||||
# hottuna <i2p@robertfoss.se>, 2013
|
||||
# hottuna <i2p@robertfoss.se>, 2012
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2016-2017
|
||||
# Jonatan Nyberg <jonatan@autistici.org>, 2016-2017,2021
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2018-2020
|
||||
# efef6ec5b435a041fce803c7f8af77d2_2341d43, 2017
|
||||
# Martin Svensson <digitalmannen@gmail.com>, 2011-2012
|
||||
@@ -18,9 +18,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-02-05 14:31+0000\n"
|
||||
"PO-Revision-Date: 2021-02-05 15:27+0000\n"
|
||||
"Last-Translator: zzzi2p\n"
|
||||
"POT-Creation-Date: 2021-05-05 15:14+0000\n"
|
||||
"PO-Revision-Date: 2021-06-23 09:32+0000\n"
|
||||
"Last-Translator: Jonatan Nyberg <jonatan@autistici.org>\n"
|
||||
"Language-Team: Swedish (Sweden) (http://www.transifex.com/otf/I2P/language/sv_SE/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -77,7 +77,7 @@ msgstr "Tunnlar har inte initierats ännu, vänligen uppdatera om två minuter."
|
||||
msgid ""
|
||||
"Invalid form submission, probably because you used the 'back' or 'reload' "
|
||||
"button on your browser. Please resubmit."
|
||||
msgstr "Ogiltigt formulärbegäran, beror troligtvis på att du använde knappen \"tillbaka\" eller \"uppdatera\". Försök att skicka igen."
|
||||
msgstr "Ogiltig formulärbegäran, troligen för att du använde knappen \"tillbaka\" eller \"ladda om\" i din webbläsare. Vänligen försök att skicka igen."
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:189
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:316
|
||||
@@ -174,7 +174,7 @@ msgid "HTTP bidir"
|
||||
msgstr "HTTP-bidir"
|
||||
|
||||
#: ../java/src/net/i2p/i2ptunnel/web/IndexBean.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:450
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:493
|
||||
msgid "Host not set"
|
||||
msgstr "Ingen värd angiven"
|
||||
|
||||
@@ -184,7 +184,7 @@ msgstr "Ogiltig adress"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:168
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:153
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:159
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/register_jsp.java:185
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:178
|
||||
msgid "Hidden Services Manager"
|
||||
@@ -212,16 +212,16 @@ msgstr "Nya proxyinställningar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:260
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1115
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:417
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:460
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:375
|
||||
msgid "Name"
|
||||
msgstr "Namn"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:262
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1117
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:222
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:419
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:462
|
||||
msgid "Type"
|
||||
msgstr "Typ"
|
||||
|
||||
@@ -235,8 +235,8 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:270
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1125
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:393
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:605
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:395
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:648
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:381
|
||||
msgid "Description"
|
||||
msgstr "Beskrivning"
|
||||
@@ -292,7 +292,7 @@ msgstr "Anslutningspunkt"
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1171
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1209
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2402
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:423
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:466
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:487
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:510
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:696
|
||||
@@ -411,7 +411,7 @@ msgid "b32 not recommended"
|
||||
msgstr "b32 rekommenderas inte"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:465
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:598
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:641
|
||||
msgid "Shared Client"
|
||||
msgstr "Delad klient"
|
||||
|
||||
@@ -1161,7 +1161,7 @@ msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1756
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:1786
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:380
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:382
|
||||
msgid "Encrypted"
|
||||
msgstr ""
|
||||
|
||||
@@ -1501,152 +1501,164 @@ msgstr ""
|
||||
msgid "Tunnels not initialized yet; please retry in a few moments."
|
||||
msgstr "Tunnlarna är inte initialiserade ännu; försök igen strax."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:161
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
msgid "These are the local services provided by your router."
|
||||
msgstr "Det här är de lokala tjänsterna som tillhandahålls av din router."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:163
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:165
|
||||
msgid ""
|
||||
"By default, most of your client services (email, HTTP proxy, IRC) will share"
|
||||
" the same set of tunnels and be listed as \"Shared Clients\"."
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:175
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:177
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/ssl_jsp.java:638
|
||||
msgid "Status Messages"
|
||||
msgstr "Statusmeddelanden"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:179
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:181
|
||||
msgid "Refresh"
|
||||
msgstr "Uppdatera"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:190
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:192
|
||||
msgid "Clear"
|
||||
msgstr "Rensa"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:201
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
|
||||
msgid "Global Tunnel Control"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:203
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:205
|
||||
msgid "Tunnel Wizard"
|
||||
msgstr "Tunnel guide"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:207
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:209
|
||||
msgid "Stop All"
|
||||
msgstr "Stoppa alla"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:211
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:213
|
||||
msgid "Start All"
|
||||
msgstr "Starta alla"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:215
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:217
|
||||
msgid "Restart All"
|
||||
msgstr "Starta om alla"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:218
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:220
|
||||
msgid "I2P Hidden Services"
|
||||
msgstr "Dolda I2P-tjänster"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:224
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
msgid "Points at"
|
||||
msgstr "Pekar på"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:226
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:287
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:289
|
||||
msgid "Preview"
|
||||
msgstr "Förhandsvisning"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:228
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:425
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:468
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:230
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:427
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:232
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:470
|
||||
msgid "Control"
|
||||
msgstr "Kontroll"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:239
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:241
|
||||
msgid "Edit Server Tunnel Settings for"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:254
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:256
|
||||
msgid "Test HTTPS server, bypassing I2P"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:262
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:264
|
||||
msgid "Test HTTP server, bypassing I2P"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:283
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:285
|
||||
msgid "Test HTTP server through I2P"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:292
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:294
|
||||
msgid "No Preview"
|
||||
msgstr "Ingen förhandsvisning"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:302
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:305
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:469
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:472
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:304
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:512
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515
|
||||
msgid "Starting..."
|
||||
msgstr "Startar..."
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:307
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:474
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:309
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:328
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:517
|
||||
msgid "Stop this Tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:314
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:333
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:481
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:498
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:515
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:316
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:335
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:524
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:541
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:558
|
||||
msgid "Stop"
|
||||
msgstr "Stoppar"
|
||||
msgstr "Stoppa"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:321
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:324
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:505
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:508
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:323
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:326
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:548
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:551
|
||||
msgid "Running"
|
||||
msgstr "Kör"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:340
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:343
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:522
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:525
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:342
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:565
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:568
|
||||
msgid "Stopped"
|
||||
msgstr "Stoppad"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:345
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:527
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:347
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:570
|
||||
msgid "Start this Tunnel"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:352
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:354
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:577
|
||||
msgid "Start"
|
||||
msgstr "Starta"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:364
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:552
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:366
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:595
|
||||
msgid "Destination"
|
||||
msgstr "Destination"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:369
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:371
|
||||
msgid "Hostname"
|
||||
msgstr "Värdnamn"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:409
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:412
|
||||
msgid "Share your site using the hostname"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:433
|
||||
msgid "Copy the hostname to the clipboard"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
|
||||
msgid "Copy Hostname"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:452
|
||||
msgid "New hidden service"
|
||||
msgstr "Nya dolda tjänster"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:411
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:632
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:454
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:675
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:286
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:320
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/wizard_jsp.java:344
|
||||
@@ -1655,41 +1667,41 @@ msgstr "Nya dolda tjänster"
|
||||
msgid "Standard"
|
||||
msgstr "Standard"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:413
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:634
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:456
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:677
|
||||
msgid "Create"
|
||||
msgstr "Skapa"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:415
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:458
|
||||
msgid "I2P Client Tunnels"
|
||||
msgstr "I2P-klienttunnlar"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:421
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:464
|
||||
msgid "Interface"
|
||||
msgstr "Gränssnitt"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:436
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:479
|
||||
msgid "Edit Tunnel Settings for"
|
||||
msgstr ""
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:488
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:491
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:531
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:534
|
||||
msgid "Standby"
|
||||
msgstr "Vänteläge"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:546
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:589
|
||||
msgid "Outproxy"
|
||||
msgstr "Utproxy"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:559
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:602
|
||||
msgid "internal plugin"
|
||||
msgstr "internt insticksmodul"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:578
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:621
|
||||
msgid "none"
|
||||
msgstr "inga"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:630
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/index_jsp.java:673
|
||||
msgid "New client tunnel"
|
||||
msgstr "Ny klienttunnel"
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-05-05 15:14+0000\n"
|
||||
"PO-Revision-Date: 2021-05-05 17:35+0000\n"
|
||||
"PO-Revision-Date: 2021-08-01 12:26+0000\n"
|
||||
"Last-Translator: Kaya Zeren <kayazeren@gmail.com>\n"
|
||||
"Language-Team: Turkish (Turkey) (http://www.transifex.com/otf/I2P/language/tr_TR/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -1363,7 +1363,7 @@ msgstr "Hizmet sürekliliğini sağlamak için açık tutulacak tünel sayısı"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2296
|
||||
msgid "Period of inactivity before tunnel number is reduced"
|
||||
msgstr "Etkinlik olmadığında tünel sayısının azaltılması için beklenecek zaman aralığı"
|
||||
msgstr "İşlem yapılmadığında tünel sayısının azaltılması için beklenecek zaman aralığı"
|
||||
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2300
|
||||
#: ../jsp/WEB-INF/classes/net/i2p/i2ptunnel/jsp/edit_jsp.java:2366
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -13,7 +13,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Destination Key Conflict")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
@@ -14,7 +14,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<head>
|
||||
<title>_("Information: New Host Name")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body id="proxyNewAddressHelper">
|
||||
<div class="logo">
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Bad Address Helper")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Authorization Required")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -22,5 +22,5 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<div class="warning" id="warning">
|
||||
<h3>_("Warning: Authorization Required")</h3>
|
||||
<p>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Website Unreachable")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -24,5 +24,5 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<p>
|
||||
_("The Base32 address is invalid.")
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Invalid Request URI")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
286
apps/i2ptunnel/resources/proxy/css/dark/proxy.css
Normal file
286
apps/i2ptunnel/resources/proxy/css/dark/proxy.css
Normal file
@@ -0,0 +1,286 @@
|
||||
|
||||
body {
|
||||
margin: 5px 0px 0px;
|
||||
padding: 0px;
|
||||
text-align: center;
|
||||
background-color: rgb(31, 26, 36);
|
||||
color: rgb(230, 230, 231);
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
font-weight: normal;
|
||||
font-size: 8.5pt;
|
||||
line-height: 130%;
|
||||
font-family: 'Droid Sans', 'Noto Sans', Ubuntu, 'Segoe UI', 'Bitstream Vera Sans', 'DejaVu Sans', Verdana, 'Lucida Grande', Helvetica, sans-serif;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
border: 1px groove rgb(82, 75, 94);
|
||||
padding: 1px;
|
||||
font-size: 9pt;
|
||||
margin: 1px 0px;
|
||||
}
|
||||
|
||||
tr {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
tr:nth-child(odd) {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 4px 6px;
|
||||
color: rgb(230, 230, 231);
|
||||
vertical-align: middle;
|
||||
border-top-width: 1px;
|
||||
border-top-style: inset;
|
||||
border-top-color: rgb(41, 41, 41);
|
||||
}
|
||||
|
||||
td img {
|
||||
padding: 0px 1px 0px 2px;
|
||||
}
|
||||
|
||||
a:link {
|
||||
color: rgb(119, 120, 191);
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
color: rgb(119, 120, 191);
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
p {
|
||||
text-align: justify;
|
||||
line-height: 160%;
|
||||
}
|
||||
|
||||
p img:first-child {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: left;
|
||||
color: rgb(230, 230, 231);
|
||||
padding: 13px 15px;
|
||||
font-size: 17pt;
|
||||
font-weight: bold;
|
||||
font-style: normal;
|
||||
letter-spacing: 0.15em;
|
||||
text-shadow: rgb(0, 17, 0) 0px 0px 2px;
|
||||
white-space: normal;
|
||||
background-image: url(images/header.png);
|
||||
background-color: rgb(0, 0, 0);
|
||||
border: 1px solid rgb(41, 41, 41);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 0px;
|
||||
border-bottom-left-radius: 0px;
|
||||
line-height: 120%;
|
||||
min-width: 620px;
|
||||
box-shadow: rgb(0, 0, 0) 0px 1px 5px;
|
||||
margin: 0px 5px 0px 216px !important;
|
||||
background-position: 50% 50%;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 12pt;
|
||||
color: rgb(230, 230, 231);
|
||||
text-shadow: rgb(0, 17, 0) 0px 0px 2px;
|
||||
letter-spacing: 0.08em;
|
||||
word-spacing: 0.1em;
|
||||
padding: 10px;
|
||||
border: 1px solid rgb(41, 41, 41);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
vertical-align: middle;
|
||||
word-wrap: break-word;
|
||||
margin: 15px 0px 12px !important;
|
||||
}
|
||||
|
||||
h2 {
|
||||
box-shadow: rgb(0, 0, 0) 0px 0px 0px 1px inset;
|
||||
}
|
||||
|
||||
h1 {
|
||||
background-color: rgb(31, 26, 36);
|
||||
box-shadow: rgb(0, 0, 0) 0px 0px 0px 1px inset;
|
||||
text-shadow: rgb(0, 0, 0) 0px 1px 1px;
|
||||
border: 1px groove rgb(82, 75, 94);
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
hr {
|
||||
background-color: rgb(225, 219, 233);
|
||||
height: 1px;
|
||||
border: 0px solid rgb(82, 75, 94);
|
||||
margin: 20px 0px 10px;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
hr:last-child {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.right {
|
||||
text-align: right;
|
||||
margin: 0px 1px;
|
||||
display: inline-block;
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
.hostadd {
|
||||
height: 10rem;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.hostaddform {
|
||||
width: 48%;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.logo {
|
||||
float: left;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
color: rgb(34, 34, 34);
|
||||
margin: 0px 85px;
|
||||
border: 1px solid rgb(68, 68, 119);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
min-height: 165px;
|
||||
}
|
||||
|
||||
.logo hr {
|
||||
margin: 8px -10px;
|
||||
height: 1px;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
.warning hr {
|
||||
background-image: linear-gradient(to right, rgb(119, 120, 191), rgb(194, 196, 239));
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
width: 100%;
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.logo hr~a {
|
||||
margin: 3px 2px;
|
||||
}
|
||||
|
||||
.warning {
|
||||
padding: 10px 25px 20px 75px;
|
||||
text-align: start;
|
||||
margin: 0px 10px;
|
||||
min-height: 165px;
|
||||
}
|
||||
|
||||
.warning:not(old) {
|
||||
background-attachment: scroll, initial;
|
||||
background-origin: initial, initial;
|
||||
background-clip: initial, initial;
|
||||
background-size: 54px, 100%;
|
||||
background-position: 10px calc(50% + 32px);
|
||||
background-repeat: no-repeat;
|
||||
background-image: url(/themes/console/images/itoopie_sm.png);
|
||||
}
|
||||
|
||||
.warning h3 {
|
||||
text-align: left;
|
||||
padding: 10px 10px 8px;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
#jumplinks {
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
#jumplinks > a {
|
||||
border: black;
|
||||
border-top-style: none;
|
||||
border-top-width: medium;
|
||||
border-right-style: none;
|
||||
border-right-width: medium;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: medium;
|
||||
border-left-style: none;
|
||||
border-left-width: medium;
|
||||
border-style: outset;
|
||||
margin: 2px;
|
||||
float: none;
|
||||
display: inline-block;
|
||||
width: 96%;
|
||||
border-width: 1px;
|
||||
border-radius: 12px;
|
||||
vertical-align: middle;
|
||||
font-size: 1.1rem;
|
||||
text-align: start;
|
||||
padding-top: 1.5%;
|
||||
padding-bottom: 1.5%;
|
||||
padding-left: 1%;
|
||||
}
|
||||
|
||||
#jumplinks > a:hover {
|
||||
text-decoration: none;
|
||||
color: #da736b !important;
|
||||
border: 1px solid #da736b !important;
|
||||
box-shadow: inset 0 1px 1px 0 #eff;
|
||||
}
|
||||
|
||||
#jumplinks > h4 {
|
||||
text-align: left;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
element {
|
||||
height: 6em;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
width: 96%;
|
||||
}
|
||||
|
||||
table,
|
||||
tr,
|
||||
td {
|
||||
font-family: 'Droid Sans', 'Noto Sans', Ubuntu, 'Segoe UI', 'Lucida Grande', Verdana, Helvetica, sans-serif;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1500px) {
|
||||
body {
|
||||
font-size: 10pt !important;
|
||||
}
|
||||
h1 {
|
||||
margin-left: 242px !important;
|
||||
}
|
||||
}
|
||||
|
||||
305
apps/i2ptunnel/resources/proxy/css/light/proxy.css
Normal file
305
apps/i2ptunnel/resources/proxy/css/light/proxy.css
Normal file
@@ -0,0 +1,305 @@
|
||||
|
||||
|
||||
html {
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 6px;
|
||||
text-align: center;
|
||||
color: rgb(51, 51, 63);
|
||||
font-size: 9pt;
|
||||
line-height: 130%;
|
||||
background-color: rgb(246, 246, 250);
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
b {
|
||||
color: rgb(65, 70, 95);
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Droid Sans', 'Noto Sans', Ubuntu, 'Segoe UI', 'Lucida Grande', Verdana, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
* {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
img {
|
||||
border: none;
|
||||
}
|
||||
|
||||
.logo {
|
||||
float: left;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
color: rgb(34, 34, 34);
|
||||
margin: 0px 10px;
|
||||
border: 1px solid rgb(68, 68, 119);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
background-color: rgb(248, 248, 255);
|
||||
box-shadow: rgb(187, 187, 255) 0px 0px 0px 1px inset;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
min-height: 175px;
|
||||
}
|
||||
|
||||
.logo hr {
|
||||
margin: 8px -10px;
|
||||
background-color: rgb(119, 120, 191);
|
||||
height: 1px;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
.warning hr {
|
||||
background-image: linear-gradient(to right, rgb(119, 120, 191), rgb(194, 196, 239));
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
.logo a {
|
||||
width: 100%;
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
.logo hr~a {
|
||||
margin: 3px 2px;
|
||||
}
|
||||
|
||||
.warning {
|
||||
padding: 10px 25px 20px 75px;
|
||||
text-align: start;
|
||||
color: rgb(34, 34, 34);
|
||||
margin: 0px 10px;
|
||||
border: 1px solid rgb(68, 68, 119);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 2px;
|
||||
background-color: rgb(248, 248, 255);
|
||||
box-shadow: rgb(187, 187, 255) 0px 0px 0px 1px inset;
|
||||
min-height: 165px;
|
||||
}
|
||||
|
||||
.warning:not(old) {
|
||||
background-image: url(/themes/console/images/itoopie_sm.png), linear-gradient(rgba(248, 248, 255, 0.8), rgba(240, 240, 255, 0.8));
|
||||
background-attachment: scroll, initial;
|
||||
background-origin: initial, initial;
|
||||
background-clip: initial, initial;
|
||||
background-size: 54px, 100%;
|
||||
background-position: 10px calc(50% + 32px);
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
|
||||
.warning h3 {
|
||||
text-align: left;
|
||||
border-style: none none solid;
|
||||
border-bottom-width: 1px;
|
||||
border-bottom-color: rgb(68, 68, 119);
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 0px;
|
||||
border-bottom-left-radius: 0px;
|
||||
padding: 10px 10px 8px;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 800px) {
|
||||
.warning {
|
||||
margin: 114px 5px 0px !important;
|
||||
background-image: linear-gradient(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.298039)) !important;
|
||||
background-color: rgb(248, 248, 255) !important;
|
||||
padding-left: 25px !important;
|
||||
background-position: initial initial !important;
|
||||
background-repeat: initial initial !important;
|
||||
}
|
||||
.warning h3 {
|
||||
font-size: 10pt !important;
|
||||
}
|
||||
.logo {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
min-width: 430px;
|
||||
width: calc(100% - 40px) !important;
|
||||
margin: 10px 5px 0px !important;
|
||||
}
|
||||
.logo a:link:not(img) {
|
||||
display: inline-block;
|
||||
width: auto;
|
||||
margin: 0px 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.logo hr {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
@media screen and (min-height: 700px) {
|
||||
.warning {
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
}
|
||||
|
||||
.logo {
|
||||
background-color: rgb(246, 246, 250) !important;
|
||||
background-position: initial initial !important;
|
||||
background-repeat: initial initial !important;
|
||||
}
|
||||
|
||||
hr {
|
||||
color: rgb(17, 17, 51);
|
||||
background-color: rgb(17, 17, 51);
|
||||
height: 1px;
|
||||
border: 0px solid rgb(17, 17, 51);
|
||||
margin: 10px 0px;
|
||||
background-position: initial initial;
|
||||
background-repeat: initial initial;
|
||||
}
|
||||
|
||||
a,
|
||||
h3 {
|
||||
text-shadow: rgb(255, 255, 255) 0px 1px 1px;
|
||||
}
|
||||
|
||||
a:link {
|
||||
color: rgb(59, 107, 191);
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
outline: none;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: rgb(59, 107, 191);
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
outline: none;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
p {
|
||||
text-align: justify;
|
||||
line-height: 130%;
|
||||
}
|
||||
|
||||
h3 {
|
||||
padding: 7px 5px 6px 7px;
|
||||
border-top-left-radius: 0px;
|
||||
border-top-right-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
border-bottom-left-radius: 0px;
|
||||
font-size: 11pt;
|
||||
letter-spacing: 0.08em;
|
||||
word-spacing: 0.1em;
|
||||
color: rgb(65, 70, 95);
|
||||
border: 1px solid rgb(222, 226, 230);
|
||||
}
|
||||
|
||||
h3 {
|
||||
background-color: rgb(245, 245, 245) !important;
|
||||
background-position: initial initial !important;
|
||||
background-repeat: initial initial !important;
|
||||
}
|
||||
|
||||
.right {
|
||||
text-align: right;
|
||||
margin: 0px 1px;
|
||||
display: inline-block;
|
||||
width: 40%;
|
||||
}
|
||||
|
||||
.hostadd {
|
||||
height: 10rem;
|
||||
width: 100%;
|
||||
border-radius: 12px;
|
||||
background: #eef;
|
||||
}
|
||||
|
||||
.hostaddform {
|
||||
width: 48%;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#jumplinks {
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
#jumplinks > a {
|
||||
border: black;
|
||||
border-top-style: none;
|
||||
border-top-width: medium;
|
||||
border-right-style: none;
|
||||
border-right-width: medium;
|
||||
border-bottom-style: none;
|
||||
border-bottom-width: medium;
|
||||
border-left-style: none;
|
||||
border-left-width: medium;
|
||||
border-style: outset;
|
||||
margin: 2px;
|
||||
float: none;
|
||||
display: inline-block;
|
||||
width: 96%;
|
||||
border-width: 1px;
|
||||
border-radius: 12px;
|
||||
vertical-align: middle;
|
||||
font-size: 1.1rem;
|
||||
text-align: start;
|
||||
padding-top: 1.5%;
|
||||
padding-bottom: 1.5%;
|
||||
padding-left: 1%;
|
||||
background: #ddd;
|
||||
background: linear-gradient(to bottom, #eee, #fff);
|
||||
}
|
||||
|
||||
#jumplinks > a:hover {
|
||||
text-decoration: none;
|
||||
color: #19191f;
|
||||
border: 1px solid #f60 !important;
|
||||
background: #ddd;
|
||||
background: linear-gradient(to bottom, #eee, #fff);
|
||||
box-shadow: inset 0 0 0 1px #fff !important;
|
||||
filter: drop-shadow(0 0 1px rgba(204, 204, 204, 0.8));
|
||||
transition: ease border 0.7s;
|
||||
}
|
||||
|
||||
|
||||
#jumplinks > h4 {
|
||||
text-align: left;
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
element {
|
||||
height: 6em;
|
||||
min-width: 0;
|
||||
min-height: 0;
|
||||
width: 96%;
|
||||
}
|
||||
|
||||
table,
|
||||
tr,
|
||||
td {
|
||||
font-family: 'Droid Sans', 'Noto Sans', Ubuntu, 'Segoe UI', 'Lucida Grande', Verdana, Helvetica, sans-serif;
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1500px) {
|
||||
body {
|
||||
margin: 4px;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 1500px) {
|
||||
body {
|
||||
font-size: 10pt !important;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Request Denied")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Website Unreachable")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -27,5 +27,5 @@ _("The website is offline, there is network congestion, or your router is not ye
|
||||
<span>_("You may want to {0}retry{1}.", "<a href=\"\">", "</a>")</span>
|
||||
</p>
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Invalid Destination")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -28,5 +28,5 @@ _("The I2P host could also be offline.")
|
||||
<span>_("You may want to {0}retry{1}.", "<a href=\"\">", "</a>")</span>
|
||||
</p>
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -14,7 +14,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<head>
|
||||
<title>_("Website Unknown")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -34,6 +34,5 @@ _("Otherwise, find a Base 32 or address helper link, or use a jump service link
|
||||
_("Seeing this page often? See {0}the FAQ{1} for help in {2}adding some subscriptions{3} to your addressbook.", "<a href=\"http://127.0.0.1:7657/help#addressbooksubs\">", "</a>", "<a href=\"http://127.0.0.1:7657/susidns/config\">", "</a>")
|
||||
</p>
|
||||
<hr>
|
||||
<p>
|
||||
<b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -13,7 +13,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<head>
|
||||
<title>_("Outproxy Not Found")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -28,4 +28,5 @@ _("It is offline, there is network congestion, or your router is not yet well-in
|
||||
<span>_("You may want to {0}retry{1} as this will randomly reselect an outproxy from the pool you have defined {2}here{3} (if you have more than one configured).", "<a href=\"\">", "</a>", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr\">", "</a>")</span>
|
||||
_("If you continue to have trouble you may want to edit your outproxy list {0}here{1}.", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr/edit?tunnel=0\">", "</a>")
|
||||
</p>
|
||||
<hr><p><b>_("Could not find the following destination:")</b></p>
|
||||
<hr><span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Website Unreachable")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -24,5 +24,5 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<p>
|
||||
_("The website was not reachable, because it uses encryption options that are not supported by your I2P or Java version.")
|
||||
<hr>
|
||||
<p><b>_("Could not connect to the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Outproxy Unreachable")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -26,4 +26,5 @@ _("The HTTP outproxy was not reachable, because it uses encryption options that
|
||||
<span>_("You may want to {0}retry{1} as this will randomly reselect an outproxy from the pool you have defined {2}here{3} (if you have more than one configured).", "<a href=\"\">", "</a>", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr\">", "</a>")</span>
|
||||
_("If you continue to have trouble you may want to edit your outproxy list {0}here{1}.", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr/edit?tunnel=0\">", "</a>")
|
||||
</p>
|
||||
<hr><p><b>_("Could not connect to the following destination:")</b></p>
|
||||
<hr><span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Error: Request Denied")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<!-----------------------------
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Website Unreachable")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -27,5 +27,5 @@ _("The website is probably down, but there could also be network congestion.")
|
||||
<span>_("You may want to {0}retry{1}.", "<a href=\"\">", "</a>")</span>
|
||||
</p>
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Outproxy Not Found")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -27,4 +27,5 @@ _("The outproxy is probably down, but there could also be network congestion.")
|
||||
<span>_("You may want to {0}retry{1} as this will randomly reselect an outproxy from the pool you have defined {2}here{3} (if you have more than one configured).", "<a href=\"\">", "</a>", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr\">", "</a>")</span>
|
||||
_("If you continue to have trouble you may want to edit your outproxy list {0}here{1}.", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr/edit?tunnel=0\">", "</a>")
|
||||
</p>
|
||||
<hr><p><b>_("Could not find the following destination:")</b></p>
|
||||
<hr><span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: No Outproxy Configured")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Warning: Non-HTTP Protocol")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Connection Reset")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -27,5 +27,5 @@ _("The website could be temporarily unavailable, too busy, or it has blocked you
|
||||
<span>_("You may want to {0}retry{1}.", "<a href=\"\">", "</a>")</span>
|
||||
</p>
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
|
||||
@@ -12,7 +12,7 @@ Content-Security-Policy: default-src 'none'; style-src 'self' 'unsafe-inline' ht
|
||||
<html><head>
|
||||
<title>_("Connection Reset")</title>
|
||||
<link rel="shortcut icon" href="http://proxy.i2p/themes/console/images/favicon.ico">
|
||||
<link href="http://proxy.i2p/themes/console/default/console.css" rel="stylesheet" type="text/css">
|
||||
<link href="http://proxy.i2p/themes/console/default/proxy.css" rel="stylesheet" type="text/css">
|
||||
</head>
|
||||
<body>
|
||||
<div class="logo">
|
||||
@@ -28,5 +28,5 @@ _("The proxy could be temporarily unavailable, too busy, or it has blocked your
|
||||
_("If you continue to have trouble you may want to edit your outproxy list {0}here{1}.", "<a href=\"http://127.0.0.1:7657/i2ptunnelmgr/edit?tunnel=0\">", "</a>")
|
||||
</p>
|
||||
<hr>
|
||||
<p><b>_("Could not find the following destination:")</b>
|
||||
</p>
|
||||
<span><b>_("Could not find the following destination:")</b>
|
||||
</span>
|
||||
|
||||
@@ -462,6 +462,7 @@
|
||||
<target name="jarUpToDate">
|
||||
<uptodate property="jar.uptodate" targetfile="jettylib/jetty-i2p.jar" >
|
||||
<srcfiles dir= "build/obj" includes="**/*.class" />
|
||||
<srcfiles dir= "resources" />
|
||||
</uptodate>
|
||||
<condition property="shouldListChanges" >
|
||||
<and>
|
||||
|
||||
@@ -31,6 +31,7 @@ import java.util.Properties;
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.app.*;
|
||||
import static net.i2p.app.ClientAppState.*;
|
||||
import net.i2p.servlet.filters.XI2PLocationFilter;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.PortMapper;
|
||||
@@ -65,7 +66,6 @@ public class JettyStart implements ClientApp {
|
||||
private static final String GZIP_DIR = "eepsite-jetty9.3";
|
||||
private static final String GZIP_CONFIG = "jetty-gzip.xml";
|
||||
private static final String MIN_GZIP_HANDLER_VER = "9.3";
|
||||
|
||||
/**
|
||||
* All args must be XML file names.
|
||||
* Does not support any of the other argument types from org.mortbay.start.Main.
|
||||
@@ -179,6 +179,10 @@ public class JettyStart implements ClientApp {
|
||||
public void run() {
|
||||
for (LifeCycle lc : _jettys) {
|
||||
if (!lc.isRunning()) {
|
||||
if (lc instanceof Server) {
|
||||
Server server = (Server) lc;
|
||||
server.insertHandler(new XI2PLocationFilter());
|
||||
}
|
||||
try {
|
||||
lc.start();
|
||||
if (_context != null) {
|
||||
|
||||
@@ -21,9 +21,11 @@
|
||||
package net.i2p.servlet;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.text.Collator;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
@@ -40,6 +42,7 @@ import org.eclipse.jetty.util.URIUtil;
|
||||
import org.eclipse.jetty.util.resource.Resource;
|
||||
import org.eclipse.jetty.util.resource.ResourceCollection;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
|
||||
|
||||
/**
|
||||
@@ -192,7 +195,7 @@ public class I2PDefaultServlet extends DefaultServlet
|
||||
String[] ls = res.list();
|
||||
if (ls==null)
|
||||
return null;
|
||||
Arrays.sort(ls);
|
||||
DataHelper.sort(ls, new FileComparator(res));
|
||||
|
||||
String decodedBase = URIUtil.decodePath(base);
|
||||
String title = "Directory: "+deTag(decodedBase);
|
||||
@@ -270,6 +273,35 @@ public class I2PDefaultServlet extends DefaultServlet
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* I2P
|
||||
*
|
||||
* @since 0.9.51
|
||||
*/
|
||||
private static class FileComparator implements Comparator<String> {
|
||||
private final Comparator<Object> _coll;
|
||||
private final Resource _base;
|
||||
|
||||
public FileComparator(Resource base) {
|
||||
_base = base;
|
||||
_coll = Collator.getInstance(Locale.US);
|
||||
}
|
||||
|
||||
public int compare(String a, String b) {
|
||||
try {
|
||||
Resource ra = _base.addPath(a);
|
||||
Resource rb = _base.addPath(b);
|
||||
boolean da = ra.isDirectory();
|
||||
boolean db = rb.isDirectory();
|
||||
if (da && !db) return -1;
|
||||
if (!da && db) return 1;
|
||||
} catch (Exception e) {
|
||||
// see above
|
||||
}
|
||||
return _coll.compare(a, b);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copied unchanged from Resource.java
|
||||
*
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
package net.i2p.servlet.filters;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.File;
|
||||
import java.net.URISyntaxException;
|
||||
import java.net.URL;
|
||||
import java.net.URI;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import org.eclipse.jetty.server.Request;
|
||||
import org.eclipse.jetty.server.handler.HandlerWrapper;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.data.PrivateKeyFile;
|
||||
|
||||
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Adds a header, X-I2P-Location, to requests when they do **not** come in on an I2P hostname.
|
||||
* This header contains a URL that looks like: [scheme://][i2phostname.i2p][/path][?query]
|
||||
* and expresses the I2P-Equivalent URL of the clearnet query. Clients can use this to prompt
|
||||
* users to switch from a non-I2P host to an I2P host or to redirect them automatically. It
|
||||
* automatically enabled on the default I2P site located on port 7658 by default.
|
||||
*
|
||||
* @since 0.9.51
|
||||
*/
|
||||
public class XI2PLocationFilter extends HandlerWrapper {
|
||||
private String X_I2P_Location = null;
|
||||
private long lastFailure = -1;
|
||||
private static final long failTimeout = 600000;
|
||||
private static final String encodeUTF = StandardCharsets.UTF_8.toString();
|
||||
private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(XI2PLocationFilter.class);
|
||||
|
||||
|
||||
private synchronized void setLocation(String xi2plocation) {
|
||||
if (_log.shouldInfo())
|
||||
_log.info("Checking X-I2P-Location header prefix" + xi2plocation);
|
||||
if (X_I2P_Location != null)
|
||||
return ;
|
||||
if (xi2plocation == null)
|
||||
return ;
|
||||
if (xi2plocation.equals(""))
|
||||
return ;
|
||||
X_I2P_Location = xi2plocation;
|
||||
if (_log.shouldInfo())
|
||||
_log.info("Caching X-I2P-Location header prefix" + X_I2P_Location);
|
||||
}
|
||||
|
||||
private synchronized boolean shouldRecheck(){
|
||||
boolean settable = (X_I2P_Location == null);
|
||||
if (!settable) return settable;
|
||||
if (lastFailure == -1) {
|
||||
lastFailure = System.currentTimeMillis();
|
||||
if (_log.shouldDebug())
|
||||
_log.debug("New instance, attempting to set X-I2P-Location header for the first time");
|
||||
return settable;
|
||||
}
|
||||
if ((System.currentTimeMillis() - lastFailure) > failTimeout){
|
||||
lastFailure = System.currentTimeMillis();
|
||||
if (_log.shouldDebug())
|
||||
_log.debug("More than ten minutes since failing attempt to re-check X-I2P-Location header");
|
||||
return settable;
|
||||
}
|
||||
if (_log.shouldDebug())
|
||||
_log.debug("Not attempting to re-check X-I2P-Location header");
|
||||
return false;
|
||||
}
|
||||
|
||||
private synchronized String getXI2PLocation(String host, String port) {
|
||||
File configDir = I2PAppContext.getGlobalContext().getConfigDir();
|
||||
File tunnelConfig = new File(configDir, "i2ptunnel.config");
|
||||
boolean isSingleFile = tunnelConfig.exists();
|
||||
if (!isSingleFile) {
|
||||
File tunnelConfigD = new File(configDir, "i2ptunnel.config.d");
|
||||
File[] configFiles = tunnelConfigD.listFiles(new net.i2p.util.FileSuffixFilter(".config"));
|
||||
if (configFiles == null)
|
||||
return null;
|
||||
for (int fnum=0; fnum < configFiles.length; fnum++) {
|
||||
Properties tunnelProps = new Properties();
|
||||
try {
|
||||
DataHelper.loadProps(tunnelProps, configFiles[fnum]);
|
||||
String targetHost = tunnelProps.getProperty("targetHost");
|
||||
boolean hostmatch = (host.equals(targetHost) || "0.0.0.0".equals(targetHost) || "::".equals(targetHost));
|
||||
if ( hostmatch && port.equals(tunnelProps.getProperty("targetPort")) ) {
|
||||
String sh = tunnelProps.getProperty("spoofedHost");
|
||||
if (sh != null) {
|
||||
if (sh.endsWith(".i2p"))
|
||||
return sh;
|
||||
}
|
||||
String kf = tunnelProps.getProperty("privKeyFile");
|
||||
if (kf != null) {
|
||||
File keyFile = new File(kf);
|
||||
if (!keyFile.isAbsolute())
|
||||
keyFile = new File(configDir, kf);
|
||||
if (keyFile.exists()) {
|
||||
PrivateKeyFile pkf = new PrivateKeyFile(keyFile);
|
||||
try {
|
||||
Destination rv = pkf.getDestination();
|
||||
if (rv != null)
|
||||
return rv.toBase32();
|
||||
} catch (I2PException e) {
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("I2PException Unable to set X-I2P-Location, keys arent ready. This is probably safe to ignore and will go away after the first run." + e);
|
||||
return null;
|
||||
} catch (IOException e) {
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("IOE Unable to set X-I2P-Location, location is uninitialized due file not found. This probably means the keys aren't ready. This is probably safe to ignore." + e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("Unable to set X-I2P-Location, location is target not found in any I2PTunnel config file. This should never happen.");
|
||||
return null;
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
if (_log.shouldWarn())
|
||||
_log.warn("IOE Unable to set X-I2P-Location, location is uninitialized. This is probably safe to ignore. location='" + ioe + "'");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// don't bother
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private synchronized String headerContents(final HttpServletRequest httpRequest) {
|
||||
if (X_I2P_Location != null) {
|
||||
String scheme = httpRequest.getScheme();
|
||||
if (scheme == null)
|
||||
scheme = "";
|
||||
String path = httpRequest.getPathInfo();
|
||||
if (path == null)
|
||||
path = "";
|
||||
String query = httpRequest.getQueryString();
|
||||
if (query == null)
|
||||
query = "";
|
||||
try {
|
||||
if (query.equals("")) {
|
||||
URI uri = new URI(scheme, X_I2P_Location, path, null);
|
||||
String encodedURL = uri.toASCIIString();
|
||||
return encodedURL;
|
||||
} else {
|
||||
URI uri = new URI(scheme, X_I2P_Location, path, query, null);
|
||||
String encodedURL = uri.toASCIIString();
|
||||
return encodedURL;
|
||||
}
|
||||
}catch(URISyntaxException use){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handle(final String target, final Request request, final HttpServletRequest httpRequest, HttpServletResponse httpResponse)
|
||||
throws IOException, ServletException {
|
||||
final String hashHeader = httpRequest.getHeader("X-I2P-DestHash");
|
||||
|
||||
if (hashHeader == null) {
|
||||
if (shouldRecheck()) {
|
||||
String xi2plocation = getXI2PLocation(request.getLocalAddr(), String.valueOf(request.getLocalPort()));
|
||||
if (_log.shouldInfo())
|
||||
_log.info("Checking X-I2P-Location header IP " + request.getLocalAddr() + " port " + request.getLocalPort() + " prefix " + xi2plocation);
|
||||
setLocation(xi2plocation);
|
||||
}
|
||||
String headerURL = headerContents(httpRequest);
|
||||
if (headerURL != null) {
|
||||
if (_log.shouldInfo())
|
||||
_log.info("Checking X-I2P-Location header" + headerURL);
|
||||
httpResponse.addHeader("X-I2P-Location", headerURL);
|
||||
}
|
||||
}
|
||||
|
||||
_handler.handle(target, request, httpRequest, httpResponse);
|
||||
}
|
||||
}
|
||||
@@ -59,7 +59,7 @@
|
||||
<property name="workspace.changes.tr" value="" />
|
||||
<jar destfile="./build/jrobin.jar" basedir="./build/obj" includes="**/*.class">
|
||||
<manifest>
|
||||
<attribute name="Implementation-Version" value="3.5" />
|
||||
<attribute name="Implementation-Version" value="3.8" />
|
||||
<attribute name="Built-By" value="${build.built-by}" />
|
||||
<attribute name="Build-Date" value="${build.timestamp}" />
|
||||
<attribute name="Base-Revision" value="${workspace.version}" />
|
||||
|
||||
207
apps/jrobin/java/src/org/rrd4j/core/DataHolder.java
Normal file
207
apps/jrobin/java/src/org/rrd4j/core/DataHolder.java
Normal file
@@ -0,0 +1,207 @@
|
||||
package org.rrd4j.core;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.rrd4j.ConsolFun;
|
||||
import org.rrd4j.data.IPlottable;
|
||||
import org.rrd4j.data.Variable;
|
||||
|
||||
/**
|
||||
* @author Fabrice Bacchella
|
||||
* @since 3;7
|
||||
*/
|
||||
public interface DataHolder {
|
||||
|
||||
/**
|
||||
* Constant that defines the default {@link RrdDbPool} usage policy. Defaults to <code>false</code>
|
||||
* (i.e. the pool will not be used to fetch data from RRD files)
|
||||
*/
|
||||
public static final boolean DEFAULT_POOL_USAGE_POLICY = false;
|
||||
|
||||
/**
|
||||
* Returns boolean value representing {@link org.rrd4j.core.RrdDbPool RrdDbPool} usage policy.
|
||||
*
|
||||
* @return true, if the pool will be used internally to fetch data from RRD files, false otherwise.
|
||||
*/
|
||||
boolean isPoolUsed();
|
||||
|
||||
/**
|
||||
* Sets the {@link org.rrd4j.core.RrdDbPool RrdDbPool} usage policy.
|
||||
*
|
||||
* @param poolUsed true, if the pool will be used to fetch data from RRD files, false otherwise.
|
||||
*/
|
||||
void setPoolUsed(boolean poolUsed);
|
||||
|
||||
RrdDbPool getPool();
|
||||
|
||||
/**
|
||||
* Defines the {@link org.rrd4j.core.RrdDbPool RrdDbPool} to use. If not defined, but {{@link #setPoolUsed(boolean)}
|
||||
* set to true, the default {@link RrdDbPool#getInstance()} will be used.
|
||||
* @param pool an optional pool to use.
|
||||
*/
|
||||
void setPool(RrdDbPool pool);
|
||||
|
||||
/**
|
||||
* Set the time zone used for the legend.
|
||||
*
|
||||
* @param tz the time zone to set
|
||||
*/
|
||||
void setTimeZone(TimeZone tz);
|
||||
|
||||
TimeZone getTimeZone();
|
||||
|
||||
/**
|
||||
* Sets the time when the graph should end. Time in seconds since epoch
|
||||
* (1970-01-01) is required. Negative numbers are relative to the current time.
|
||||
*
|
||||
* @param time Ending time for the graph in seconds since epoch
|
||||
*/
|
||||
void setEndTime(long time);
|
||||
|
||||
/**
|
||||
* Returns ending timestamp.
|
||||
*
|
||||
* @return Ending timestamp in seconds
|
||||
*/
|
||||
long getEndTime();
|
||||
|
||||
/**
|
||||
* Sets the time when the graph should start. Time in seconds since epoch
|
||||
* (1970-01-01) is required. Negative numbers are relative to the current time.
|
||||
*
|
||||
* @param time Starting time for the graph in seconds since epoch
|
||||
*/
|
||||
void setStartTime(long time);
|
||||
|
||||
/**
|
||||
* Returns starting timestamp.
|
||||
*
|
||||
* @return Starting timestamp in seconds
|
||||
*/
|
||||
long getStartTime();
|
||||
|
||||
/**
|
||||
* Sets starting and ending time for the for the graph. Timestamps in seconds since epoch are
|
||||
* required. Negative numbers are relative to the current time.
|
||||
*
|
||||
* @param startTime Starting time in seconds since epoch
|
||||
* @param endTime Ending time in seconds since epoch
|
||||
*/
|
||||
void setTimeSpan(long startTime, long endTime);
|
||||
|
||||
/**
|
||||
* Set the step for timestamp interval.
|
||||
*/
|
||||
void setStep(long step);
|
||||
|
||||
/**
|
||||
* Returns the time step used for timestamp interval.
|
||||
*
|
||||
* @return Step used for data processing.
|
||||
*/
|
||||
long getStep();
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdPath Path to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
*/
|
||||
void datasource(String name, String rrdPath, String dsName,
|
||||
ConsolFun consolFun);
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdUri rrdUri to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
*/
|
||||
void datasource(String name, URI rrdUri, String dsName,
|
||||
ConsolFun consolFun);
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdPath Path to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
* @param backend Backend to be used while fetching data from a RRD file.
|
||||
*/
|
||||
void datasource(String name, String rrdPath, String dsName,
|
||||
ConsolFun consolFun, RrdBackendFactory backend);
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdUri URI to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
* @param backend Backend to be used while fetching data from a RRD file.
|
||||
*/
|
||||
void datasource(String name, URI rrdUri, String dsName,
|
||||
ConsolFun consolFun, RrdBackendFactory backend);
|
||||
|
||||
/**
|
||||
* Create a new virtual datasource by evaluating a mathematical
|
||||
* expression, specified in Reverse Polish Notation (RPN).
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rpnExpression RPN expression.
|
||||
*/
|
||||
void datasource(String name, String rpnExpression);
|
||||
|
||||
/**
|
||||
* Creates a datasource that performs a variable calculation on an
|
||||
* another named datasource to yield a single combined timestamp/value.
|
||||
*
|
||||
* Requires that the other datasource has already been defined; otherwise, it'll
|
||||
* end up with no data
|
||||
*
|
||||
* @param name - the new virtual datasource name
|
||||
* @param defName - the datasource from which to extract the percentile. Must be a previously
|
||||
* defined virtual datasource
|
||||
* @param var - a new instance of a Variable used to do the calculation
|
||||
*/
|
||||
void datasource(String name, String defName, Variable var);
|
||||
|
||||
/**
|
||||
* Creates a new (plottable) datasource. Datasource values are obtained from the given plottable
|
||||
* object.
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param plottable IPlottable object.
|
||||
*/
|
||||
void datasource(String name, IPlottable plottable);
|
||||
|
||||
/**
|
||||
* Creates a new 'fetched' datasource. Datasource values are obtained from the
|
||||
* given {@link org.rrd4j.core.FetchData} object.
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param fetchData FetchData object.
|
||||
*/
|
||||
void datasource(String name, FetchData fetchData);
|
||||
|
||||
/**
|
||||
* Creates a new 'fetched' datasource. Datasource values are obtained from the
|
||||
* given {@link org.rrd4j.core.FetchData} object.
|
||||
* Values will be extracted from the datasource dsName in the fetchData
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param dsName Source name in fetchData.
|
||||
* @param fetchData FetchData object.
|
||||
*/
|
||||
void datasource(String name, String dsName, FetchData fetchData);
|
||||
|
||||
}
|
||||
@@ -17,6 +17,7 @@ import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* Base (abstract) backend factory class which holds references to all concrete
|
||||
@@ -210,6 +211,15 @@ public abstract class RrdBackendFactory implements Closeable {
|
||||
activeFactories.clear();
|
||||
activeFactories.addAll(Arrays.asList(newFactories));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the current active factories as a stream.
|
||||
* @return
|
||||
* @since 3.7
|
||||
*/
|
||||
public static synchronized Stream<RrdBackendFactory> getActiveFactories() {
|
||||
return activeFactories.stream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add factories to the list of active factories, i.e. the factory used to resolve URI.
|
||||
|
||||
@@ -70,6 +70,7 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
* @return a new build RrdDb
|
||||
* @throws IOException in case of I/O error.
|
||||
* @throws IllegalArgumentException if the builder settings were incomplete
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted in pool usage
|
||||
*/
|
||||
public RrdDb build() throws IOException {
|
||||
if (rrdDef != null) {
|
||||
@@ -113,6 +114,7 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
*
|
||||
* @throws IOException in case of I/O error.
|
||||
* @throws IllegalArgumentException if the builder settings were incomplete
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted in pool usage
|
||||
*/
|
||||
public void doimport() throws IOException {
|
||||
if (rrdDef != null || (importer == null && externalPath == null)) {
|
||||
@@ -185,7 +187,8 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate the pool usage
|
||||
* Activate the pool usage. If the pool is not declared using
|
||||
* {@link #setPool(RrdDbPool)}, the singleton instance will be used.
|
||||
*
|
||||
* @return the same builder.
|
||||
*/
|
||||
@@ -195,18 +198,29 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pool that will be used if {@link #usePool} is true. If not defined,
|
||||
* the singleton instance will be used.
|
||||
* Set the pool that will be used and set usePool to true.
|
||||
*
|
||||
* @param pool true if a pool is going to be used
|
||||
* @return the same builder.
|
||||
*/
|
||||
public Builder setPool(RrdDbPool pool) {
|
||||
this.pool = pool;
|
||||
this.usePool = pool != null;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal method used to memorized the pool, without generating a loop
|
||||
* @param pool
|
||||
* @return
|
||||
*/
|
||||
Builder setPoolInternal(RrdDbPool pool) {
|
||||
this.pool = pool;
|
||||
this.usePool = false;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set when the builder will be used to import external data with a predefined source: XML or RRDTool.
|
||||
* @param externalPath an URI-like indication of RRD data to import
|
||||
* @return the same builder.
|
||||
@@ -396,6 +410,7 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
* </pre>
|
||||
*
|
||||
* @param rrdDef Object describing the structure of the new RRD file.
|
||||
* @return a new Rrdb created from the definition.
|
||||
* @throws java.io.IOException Thrown in case of I/O error.
|
||||
*/
|
||||
public static RrdDb of(RrdDef rrdDef) throws IOException {
|
||||
@@ -807,6 +822,7 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
* Closes RRD. No further operations are allowed on this RrdDb object.
|
||||
*
|
||||
* @throws java.io.IOException Thrown in case of I/O related error.
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted in pool usage.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public synchronized void close() throws IOException {
|
||||
@@ -1381,6 +1397,10 @@ public class RrdDb implements RrdUpdater<RrdDb>, Closeable {
|
||||
return backend.getUri();
|
||||
}
|
||||
|
||||
public URI getCanonicalUri() {
|
||||
return backend.getFactory().getCanonicalUri(getUri());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns backend object for this RRD which performs actual I/O operations.
|
||||
*
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
package org.rrd4j.core;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.UndeclaredThrowableException;
|
||||
import java.net.URI;
|
||||
import java.util.HashSet;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Semaphore;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.concurrent.locks.Condition;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* <p>This class should be used to synchronize access to RRD files
|
||||
* in a multithreaded environment. This class should be also used to prevent opening of
|
||||
* too many RRD files at the same time (thus avoiding operating system limits).
|
||||
* </p>
|
||||
* <p>It should not be called directly. Use {@link RrdDb.Builder#usePool()} instead.</p>
|
||||
* <p>It can also be used a factory for RrdDb, using a default backend factory.</p>
|
||||
* <p>In case of interruptions, it throws IllegalStateException.
|
||||
*/
|
||||
public class RrdDbPool {
|
||||
private static class RrdDbPoolSingletonHolder {
|
||||
@@ -38,8 +38,8 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* Initial capacity of the pool i.e. maximum number of simultaneously open RRD files. The pool will
|
||||
* never open too many RRD files at the same time.
|
||||
* Initial capacity of the pool i.e. maximum number of simultaneously open RRD. The pool will
|
||||
* never open too many RRD at the same time.
|
||||
*/
|
||||
public static final int INITIAL_CAPACITY = 200;
|
||||
|
||||
@@ -80,7 +80,7 @@ public class RrdDbPool {
|
||||
if (placeholder) {
|
||||
return String.format("RrdEntry [placeholder, uri=%s]", uri);
|
||||
} else {
|
||||
return String.format("RrdEntry [count=%d, rrdDb=%s, uri%s]", count, rrdDb, uri);
|
||||
return String.format("RrdEntry [count=%d, rrdDb=%s, uri %s]", count, rrdDb, uri);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -90,7 +90,6 @@ public class RrdDbPool {
|
||||
* or returns already existing one. Uses Initialization On Demand Holder idiom.
|
||||
*
|
||||
* @return Single instance of this class
|
||||
* @throws java.lang.RuntimeException Thrown if the default RRD backend is not derived from the {@link org.rrd4j.core.RrdFileBackendFactory}
|
||||
*/
|
||||
public static RrdDbPool getInstance() {
|
||||
return RrdDbPoolSingletonHolder.instance;
|
||||
@@ -109,7 +108,7 @@ public class RrdDbPool {
|
||||
private RrdBackendFactory defaultFactory;
|
||||
|
||||
/**
|
||||
* Constructor for RrdDbPool.
|
||||
* Constructor for RrdDbPool. It will use the default backend factory.
|
||||
* @since 3.5
|
||||
*/
|
||||
public RrdDbPool() {
|
||||
@@ -118,7 +117,7 @@ public class RrdDbPool {
|
||||
|
||||
/**
|
||||
* Constructor for RrdDbPool.
|
||||
* @param defaultFactory the default factory used when given simple path of a rrdDb.
|
||||
* @param defaultFactory the default factory used when given a simple path of a RRD.
|
||||
* @since 3.6
|
||||
*/
|
||||
public RrdDbPool(RrdBackendFactory defaultFactory) {
|
||||
@@ -130,36 +129,40 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of open RRD files.
|
||||
* Returns the number of open RRD.
|
||||
*
|
||||
* @return Number of currently open RRD files held in the pool.
|
||||
* @return Number of currently open RRD held in the pool.
|
||||
*/
|
||||
public int getOpenFileCount() {
|
||||
return pool.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of open file URI.
|
||||
* Returns an array of open RRD URI.
|
||||
*
|
||||
* @return Array with {@link URI} to open RRD files held in the pool.
|
||||
* @return Array with {@link URI} to open RRD held in the pool.
|
||||
*/
|
||||
public URI[] getOpenUri() {
|
||||
//Direct toarray from keySet can fail
|
||||
Set<URI> uris = new HashSet<>(pool.size());
|
||||
pool.forEach((k,v) -> uris.add(k));
|
||||
return uris.toArray(new URI[uris.size()]);
|
||||
return pool.keySet().stream().toArray(URI[]::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of open file path.
|
||||
* Returns an stream open RRD.
|
||||
*
|
||||
* @return Array with canonical path to open RRD files held in the pool.
|
||||
* @return Stream with canonical URI to open RRD path held in the pool.
|
||||
* @since 3.7
|
||||
*/
|
||||
public Stream<URI> getOpenUriStream() {
|
||||
return pool.keySet().stream();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of open RRD.
|
||||
*
|
||||
* @return Array with canonical path to open RRD path held in the pool.
|
||||
*/
|
||||
public String[] getOpenFiles() {
|
||||
//Direct toarray from keySet can fail
|
||||
Set<String> uris = new HashSet<>(pool.size());
|
||||
pool.forEach((k,v) -> uris.add(k.getPath()));
|
||||
return uris.toArray(new String[uris.size()]);
|
||||
return pool.keySet().stream().map(URI::getPath).toArray(String[]::new);
|
||||
}
|
||||
|
||||
private RrdEntry getEntry(URI uri, boolean cancreate) throws InterruptedException {
|
||||
@@ -260,8 +263,9 @@ public class RrdDbPool {
|
||||
try {
|
||||
usageWLock.lockInterruptibly();
|
||||
fullCondition.signalAll();
|
||||
} catch (InterruptedException ex) {
|
||||
throw new UndeclaredThrowableException(ex);
|
||||
} catch (InterruptedException e1) {
|
||||
// Lost slot available notification
|
||||
Thread.currentThread().interrupt();
|
||||
} finally {
|
||||
if (usageWLock.isHeldByCurrentThread()) {
|
||||
usageWLock.unlock();
|
||||
@@ -278,11 +282,12 @@ public class RrdDbPool {
|
||||
|
||||
/**
|
||||
* Releases RrdDb reference previously obtained from the pool. When a reference is released, its usage
|
||||
* count is decremented by one. If usage count drops to zero, the underlying RRD file will be closed.
|
||||
* count is decremented by one. If usage count drops to zero, the underlying RRD will be closed.
|
||||
*
|
||||
* @param rrdDb RrdDb reference to be returned to the pool
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
* @deprecated a db remember if it was open directly or from the pool, no need to manage it manually any more
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
* @deprecated A RrdDb remember if it was open directly or from a pool, no need to manage it manually any more
|
||||
*/
|
||||
@Deprecated
|
||||
public void release(RrdDb rrdDb) throws IOException {
|
||||
@@ -291,8 +296,7 @@ public class RrdDbPool {
|
||||
if (rrdDb == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
URI dburi = rrdDb.getUri();
|
||||
URI dburi = rrdDb.getCanonicalUri();
|
||||
RrdEntry ref = null;
|
||||
try {
|
||||
ref = getEntry(dburi, false);
|
||||
@@ -326,20 +330,19 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Requests a RrdDb reference for the given RRD file path.</p>
|
||||
* <p>Requests a RrdDb reference for the given RRD path.</p>
|
||||
* <ul>
|
||||
* <li>If the file is already open, previously returned RrdDb reference will be returned. Its usage count
|
||||
* <li>If the RRD is already open, previously returned RrdDb reference will be returned. Its usage count
|
||||
* will be incremented by one.
|
||||
* <li>If the file is not already open and the number of already open RRD files is less than
|
||||
* {@link #INITIAL_CAPACITY}, the file will be open and a new RrdDb reference will be returned.
|
||||
* If the file is not already open and the number of already open RRD files is equal to
|
||||
* {@link #INITIAL_CAPACITY}, the method blocks until some RRD file is closed.
|
||||
* <li>If the RRD is not already open and the number of already open RRD is less than
|
||||
* {@link #getCapacity()}, it will be opened and a new RrdDb reference will be returned.
|
||||
* If the RRD is not already open and the number of already open RRD is equal to
|
||||
* {@link #getCapacity()}, the method blocks until some RRD are closed.
|
||||
* </ul>
|
||||
* <p>The path is transformed internally to URI using the default factory, that is the reference that will
|
||||
* be used elsewhere.</p>
|
||||
* <p>The path is transformed to an URI using the default factory defined at the creation of the pool.</p>
|
||||
*
|
||||
* @param path Path to existing RRD file
|
||||
* @return reference for the give RRD file
|
||||
* @param path Path to existing RRD.
|
||||
* @return reference for the given RRD.
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
*/
|
||||
public RrdDb requestRrdDb(String path) throws IOException {
|
||||
@@ -347,23 +350,25 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Requests a RrdDb reference for the given RRD file path.</p>
|
||||
* <p>Requests a RrdDb reference for the given RRD URI.</p>
|
||||
* <ul>
|
||||
* <li>If the file is already open, previously returned RrdDb reference will be returned. Its usage count
|
||||
* <li>If the RRD is already open, previously returned RrdDb reference will be returned. Its usage count
|
||||
* will be incremented by one.
|
||||
* <li>If the file is not already open and the number of already open RRD files is less than
|
||||
* {@link #INITIAL_CAPACITY}, the file will be open and a new RrdDb reference will be returned.
|
||||
* If the file is not already open and the number of already open RRD files is equal to
|
||||
* {@link #INITIAL_CAPACITY}, the method blocks until some RRD file is closed.
|
||||
* <li>If the RRD is not already open and the number of already open RRD is less than
|
||||
* {@link #getCapacity()}, it will be opened and a new RrdDb reference will be returned.
|
||||
* If the RRD is not already open and the number of already open RRD is equal to
|
||||
* {@link #getCapacity()}, the method blocks until some RRD are closed.
|
||||
* </ul>
|
||||
* <p>
|
||||
* If the default backend factory for the pool can handle this URI, it will be used,
|
||||
* or else {@link RrdBackendFactory#findFactory(URI)} will be used to find the backend factory used.
|
||||
*
|
||||
* @param uri {@link URI} to existing RRD file
|
||||
* @return reference for the give RRD file
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
*/
|
||||
public RrdDb requestRrdDb(URI uri) throws IOException {
|
||||
RrdBackendFactory factory = RrdBackendFactory.findFactory(uri);
|
||||
return requestRrdDb(uri, factory);
|
||||
return requestRrdDb(uri, checkFactory(uri));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -412,7 +417,7 @@ public class RrdDbPool {
|
||||
// Someone might have already open it, rechecks
|
||||
if (ref.count == 0) {
|
||||
try {
|
||||
ref.rrdDb = RrdDb.getBuilder().setPath(factory.getPath(uri)).setBackendFactory(factory).setPool(this).build();
|
||||
ref.rrdDb = RrdDb.getBuilder().setPath(factory.getPath(uri)).setBackendFactory(factory).setPoolInternal(this).build();
|
||||
} catch (IOException | RuntimeException e) {
|
||||
passNext(ACTION.DROP, ref);
|
||||
throw e;
|
||||
@@ -427,17 +432,17 @@ public class RrdDbPool {
|
||||
}
|
||||
}
|
||||
|
||||
RrdDb requestRrdDb(RrdDef rrdDef, RrdBackendFactory backend) throws IOException {
|
||||
RrdDb requestRrdDb(RrdDef rrdDef, RrdBackendFactory factory) throws IOException {
|
||||
RrdEntry ref = null;
|
||||
try {
|
||||
URI uri = backend.getCanonicalUri(rrdDef.getUri());
|
||||
URI uri = factory.getCanonicalUri(rrdDef.getUri());
|
||||
ref = requestEmpty(uri);
|
||||
ref.rrdDb = RrdDb.getBuilder().setRrdDef(rrdDef).setBackendFactory(backend).setPool(this).build();
|
||||
ref.rrdDb = RrdDb.getBuilder().setRrdDef(rrdDef).setBackendFactory(factory).setPoolInternal(this).build();
|
||||
ref.count = 1;
|
||||
return ref.rrdDb;
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("request interrupted for new rrdDef " + rrdDef.getPath(), e);
|
||||
throw new IllegalStateException("request interrupted for new rrdDef " + rrdDef.getPath(), e);
|
||||
} catch (RuntimeException e) {
|
||||
passNext(ACTION.DROP, ref);
|
||||
ref = null;
|
||||
@@ -447,18 +452,18 @@ public class RrdDbPool {
|
||||
}
|
||||
}
|
||||
|
||||
private RrdDb requestRrdDb(RrdDb.Builder builder, URI uri, RrdBackendFactory backend)
|
||||
private RrdDb requestRrdDb(RrdDb.Builder builder, URI uri, RrdBackendFactory factory)
|
||||
throws IOException {
|
||||
RrdEntry ref = null;
|
||||
uri = backend.getCanonicalUri(uri);
|
||||
uri = factory.getCanonicalUri(uri);
|
||||
try {
|
||||
ref = requestEmpty(uri);
|
||||
ref.rrdDb = builder.setPath(uri).setBackendFactory(backend).setPool(this).build();
|
||||
ref.rrdDb = builder.setPath(uri).setBackendFactory(factory).setPoolInternal(this).build();
|
||||
ref.count = 1;
|
||||
return ref.rrdDb;
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("request interrupted for new rrd " + uri, e);
|
||||
throw new IllegalStateException("request interrupted for new rrd " + uri, e);
|
||||
} catch (RuntimeException e) {
|
||||
passNext(ACTION.DROP, ref);
|
||||
ref = null;
|
||||
@@ -468,46 +473,51 @@ public class RrdDbPool {
|
||||
}
|
||||
}
|
||||
|
||||
RrdDb requestRrdDb(URI uri, RrdBackendFactory backend, DataImporter importer) throws IOException {
|
||||
return requestRrdDb(RrdDb.getBuilder().setImporter(importer), uri, backend);
|
||||
RrdDb requestRrdDb(URI uri, RrdBackendFactory factory, DataImporter importer) throws IOException {
|
||||
return requestRrdDb(RrdDb.getBuilder().setImporter(importer), uri, factory);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Requests a RrdDb reference for the given RRD file definition object.</p>
|
||||
* <p>Requests a RrdDb reference for the given RRD definition object.</p>
|
||||
* <ul>
|
||||
* <li>If the file with the path specified in the RrdDef object is already open,
|
||||
* <li>If the RRD with the path specified in the RrdDef object is already open,
|
||||
* the method blocks until the file is closed.
|
||||
* <li>If the file is not already open and the number of already open RRD files is less than
|
||||
* {@link #INITIAL_CAPACITY}, a new RRD file will be created and a its RrdDb reference will be returned.
|
||||
* If the file is not already open and the number of already open RRD files is equal to
|
||||
* {@link #INITIAL_CAPACITY}, the method blocks until some RRD file is closed.
|
||||
* <li>If the RRD is not already open and the number of already open RRD is less than
|
||||
* {@link #getCapacity()}, a new RRD will be created and it's RrdDb reference will be returned.
|
||||
* If the RRD is not already open and the number of already open RRD is equal to
|
||||
* {@link #getCapacity()}, the method blocks until some RrdDb references are closed.
|
||||
* </ul>
|
||||
* <p>
|
||||
* If the factory defined when creating the pool can handle the URI, it will be used,
|
||||
* or else {@link RrdBackendFactory#findFactory(URI)} will be used.
|
||||
*
|
||||
* @param rrdDef Definition of the RRD file to be created
|
||||
* @return Reference to the newly created RRD file
|
||||
* @param rrdDef Definition of the RRD file to be created.
|
||||
* @return Reference to the newly created RRD file.
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public RrdDb requestRrdDb(RrdDef rrdDef) throws IOException {
|
||||
return requestRrdDb(rrdDef, RrdBackendFactory.findFactory(rrdDef.getUri()));
|
||||
return requestRrdDb(rrdDef, checkFactory(rrdDef.getUri()));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Requests a RrdDb reference for the given path. The file will be created from
|
||||
* <p>Requests a RrdDb reference for the given path. The RRD will be created from
|
||||
* external data (from XML dump or RRDTool's binary RRD file).</p>
|
||||
* <ul>
|
||||
* <li>If the file with the path specified is already open,
|
||||
* <li>If the RRD with the path specified is already open,
|
||||
* the method blocks until the file is closed.
|
||||
* <li>If the file is not already open and the number of already open RRD files is less than
|
||||
* {@link #INITIAL_CAPACITY}, a new RRD file will be created and a its RrdDb reference will be returned.
|
||||
* If the file is not already open and the number of already open RRD files is equal to
|
||||
* {@link #INITIAL_CAPACITY}, the method blocks until some RRD file is closed.
|
||||
* <li>If the RRD is not already open and the number of already open RRD is less than
|
||||
* {@link #getCapacity()}, a new RRD will be created and it's RrdDb reference will be returned.
|
||||
* If the RRD is not already open and the number of already open RRD is equal to
|
||||
* {@link #getCapacity()}, the method blocks until some RrdDb references are closed.
|
||||
* </ul>
|
||||
* <p>The path is transformed internally to an URI using the default factory of the pool.</p>
|
||||
* <p>The path is transformed to an URI using the default factory of the pool.</p>
|
||||
*
|
||||
* @param path Path to RRD file which should be created
|
||||
* @param sourcePath Path to external data which is to be converted to Rrd4j's native RRD file format
|
||||
* @return Reference to the newly created RRD file
|
||||
* @param path Path to the RRD that should be created.
|
||||
* @param sourcePath Path to external data which is to be converted to Rrd4j's native RRD file format.
|
||||
* @return Reference to the newly created RRD.
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public RrdDb requestRrdDb(String path, String sourcePath)
|
||||
throws IOException {
|
||||
@@ -516,35 +526,39 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Requests a RrdDb reference for the given path. The file will be created from
|
||||
* <p>Requests a RrdDb reference for the given URI. The RRD will be created from
|
||||
* external data (from XML dump or RRDTool's binary RRD file).</p>
|
||||
* <ul>
|
||||
* <li>If the file with the path specified is already open,
|
||||
* <li>If the RRD with the URI specified is already open,
|
||||
* the method blocks until the file is closed.
|
||||
* <li>If the file is not already open and the number of already open RRD files is less than
|
||||
* {@link #INITIAL_CAPACITY}, a new RRD file will be created and a its RrdDb reference will be returned.
|
||||
* If the file is not already open and the number of already open RRD files is equal to
|
||||
* {@link #INITIAL_CAPACITY}, the method blocks until some RRD file is closed.
|
||||
* <li>If the RRD is not already open and the number of already open RRD is less than
|
||||
* {@link #getCapacity()}, a new RRD will be created and it's RrdDb reference will be returned.
|
||||
* If the RRD is not already open and the number of already open RRD is equal to
|
||||
* {@link #getCapacity()}, the method blocks until some RrdDb references are closed.
|
||||
* </ul>
|
||||
* <p>The path is transformed internally to URI using the default factory, that is the reference that will
|
||||
* be used elsewhere.</p>
|
||||
* If the factory defined when creating the pool can handle the URI, it will be used,
|
||||
* or else {@link RrdBackendFactory#findFactory(URI)} will be used to choose the factory.
|
||||
*
|
||||
* @param uri Path to RRD file which should be created
|
||||
* @param uri URI to the RRD that should be created
|
||||
* @param sourcePath Path to external data which is to be converted to Rrd4j's native RRD file format
|
||||
* @return Reference to the newly created RRD file
|
||||
* @return Reference to the newly created RRD
|
||||
* @throws java.io.IOException Thrown in case of I/O error
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public RrdDb requestRrdDb(URI uri, String sourcePath)
|
||||
throws IOException {
|
||||
return requestRrdDb(RrdDb.getBuilder().setExternalPath(sourcePath), uri, RrdBackendFactory.findFactory(uri));
|
||||
return requestRrdDb(RrdDb.getBuilder().setExternalPath(sourcePath), uri, checkFactory(uri));
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the default factory to use when obtaining rrdDb from simple path and not URI.
|
||||
* Sets the default factory to use when obtaining RrdDb reference from simple path and not URI.
|
||||
*
|
||||
* @param defaultFactory The factory to used.
|
||||
* @throws IllegalStateException if done will the pool is not empty or the thread was interrupted.
|
||||
* @param defaultFactory The factory to use.
|
||||
* @throws IllegalStateException if called while the pool is not empty or the thread was interrupted
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
* @deprecated the pool is no longer a singleton, create a new pool instead of changing it.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setDefaultFactory(RrdBackendFactory defaultFactory) {
|
||||
try {
|
||||
usageWLock.lockInterruptibly();
|
||||
@@ -563,10 +577,10 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the maximum number of simultaneously open RRD files.
|
||||
* Sets the maximum number of simultaneously open RRD.
|
||||
*
|
||||
* @param newCapacity Maximum number of simultaneously open RRD files.
|
||||
* @throws IllegalStateException if done will the pool is not empty or the thread was interrupted.
|
||||
* @param newCapacity Maximum number of simultaneously open RRD.
|
||||
* @throws IllegalStateException if called while the pool is not empty or the thread was interrupted.
|
||||
*/
|
||||
public void setCapacity(int newCapacity) {
|
||||
try {
|
||||
@@ -587,9 +601,10 @@ public class RrdDbPool {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the maximum number of simultaneously open RRD files.
|
||||
* Returns the maximum number of simultaneously open RRD.
|
||||
*
|
||||
* @return maximum number of simultaneously open RRD files
|
||||
* @return maximum number of simultaneously open RRD
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public int getCapacity() {
|
||||
try {
|
||||
@@ -609,42 +624,76 @@ public class RrdDbPool {
|
||||
* Returns the number of usage for a RRD.
|
||||
*
|
||||
* @param rrdDb RrdDb reference for which informations is needed.
|
||||
* @return the number of request for this rrd
|
||||
* @throws java.io.IOException if any.
|
||||
* @return the number of request for this RRD.
|
||||
* @throws java.io.IOException if any
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public int getOpenCount(RrdDb rrdDb) throws IOException {
|
||||
return getOpenCount(rrdDb.getUri());
|
||||
return getCanonicalUriUsage(rrdDb.getCanonicalUri());
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of usage for a RRD.
|
||||
* <p>The path is transformed to an URI using the default factory.</p>
|
||||
*
|
||||
* @param path RRD's path for which informations is needed.
|
||||
* @return the number of request for this file
|
||||
* @throws java.io.IOException if any.
|
||||
* @return the number of request for this RRD.
|
||||
* @throws java.io.IOException if any
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public int getOpenCount(String path) throws IOException {
|
||||
return getOpenCount(defaultFactory.getUri(path));
|
||||
return getCanonicalUriUsage(defaultFactory.getCanonicalUri(defaultFactory.getUri(path)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the number of usage for a RRD.
|
||||
*
|
||||
* @param uri RRD's uri for which informations is needed.
|
||||
* @return the number of request for this file
|
||||
* @throws java.io.IOException if any.
|
||||
* @param uri RRD's URI for which informations is needed.
|
||||
* @return the number of request for this RRD.
|
||||
* @throws java.io.IOException if any
|
||||
* @throws java.lang.IllegalStateException if the thread was interrupted
|
||||
*/
|
||||
public int getOpenCount(URI uri) throws IOException {
|
||||
return getCanonicalUriUsage(checkFactory(uri).getCanonicalUri(uri));
|
||||
}
|
||||
|
||||
private int getCanonicalUriUsage(URI uri) {
|
||||
RrdEntry ref = null;
|
||||
try {
|
||||
ref = getEntry(uri, false);
|
||||
return Optional.ofNullable(ref).map(e -> e.count).orElse(0);
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("getOpenCount interrupted", e);
|
||||
throw new IllegalStateException("getOpenCount interrupted", e);
|
||||
} finally {
|
||||
passNext(ACTION.SWAP, ref);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Wait until the pool is empty and return a lock that prevent any additions of new RrdDb references until it's released.
|
||||
*
|
||||
* @since 3.7
|
||||
*
|
||||
* @param timeout the time to wait for the write lock
|
||||
* @param unit the time unit of the timeout argument
|
||||
* @return a lock to release when operations on this pool are finished.
|
||||
* @throws InterruptedException if interrupted whole waiting for the lock
|
||||
*/
|
||||
public Lock lockEmpty(long timeout, TimeUnit unit) throws InterruptedException {
|
||||
usageWLock.tryLock(timeout, unit);
|
||||
try {
|
||||
usage.acquire(maxCapacity);
|
||||
} catch (InterruptedException e) {
|
||||
usageWLock.unlock();
|
||||
Thread.currentThread().interrupt();
|
||||
throw e;
|
||||
}
|
||||
return usageWLock;
|
||||
}
|
||||
|
||||
private RrdBackendFactory checkFactory(URI uri) {
|
||||
return defaultFactory.canStore(uri) ? defaultFactory : RrdBackendFactory.findFactory(uri);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@ package org.rrd4j.core;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Optional;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* Backend to be used to store all RRD bytes in memory.
|
||||
@@ -9,14 +11,17 @@ import java.nio.ByteBuffer;
|
||||
*/
|
||||
public class RrdMemoryBackend extends ByteBufferBackend {
|
||||
|
||||
private ByteBuffer dbb = null;
|
||||
private final AtomicReference<ByteBuffer> refbb;
|
||||
/**
|
||||
* <p>Constructor for RrdMemoryBackend.</p>
|
||||
*
|
||||
* @param path a {@link java.lang.String} object.
|
||||
* @param refbb
|
||||
*/
|
||||
protected RrdMemoryBackend(String path) {
|
||||
protected RrdMemoryBackend(String path, AtomicReference<ByteBuffer> refbb) {
|
||||
super(path);
|
||||
this.refbb = refbb;
|
||||
Optional.ofNullable(refbb).map(r -> r.get()).ifPresent(this::setByteBuffer);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -24,13 +29,13 @@ public class RrdMemoryBackend extends ByteBufferBackend {
|
||||
if (length < 0 || length > Integer.MAX_VALUE) {
|
||||
throw new IllegalArgumentException("Illegal length: " + length);
|
||||
}
|
||||
dbb = ByteBuffer.allocate((int) length);
|
||||
setByteBuffer(dbb);
|
||||
refbb.set(ByteBuffer.allocate((int) length));
|
||||
setByteBuffer(refbb.get());
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getLength() throws IOException {
|
||||
return dbb.capacity();
|
||||
return Optional.ofNullable(refbb.get()).map(ByteBuffer::capacity).orElse(0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,8 +2,10 @@ package org.rrd4j.core;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
|
||||
/**
|
||||
* Factory class which creates actual {@link org.rrd4j.core.RrdMemoryBackend} objects. Rrd4j's support
|
||||
@@ -19,7 +21,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
@RrdBackendAnnotation(name="MEMORY", shouldValidateHeader=false)
|
||||
public class RrdMemoryBackendFactory extends RrdBackendFactory {
|
||||
|
||||
protected final Map<String, RrdMemoryBackend> backends = new ConcurrentHashMap<>();
|
||||
protected final Map<String, AtomicReference<ByteBuffer>> backends = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
@@ -27,15 +29,8 @@ public class RrdMemoryBackendFactory extends RrdBackendFactory {
|
||||
* Creates RrdMemoryBackend object.
|
||||
*/
|
||||
protected RrdBackend open(String id, boolean readOnly) throws IOException {
|
||||
RrdMemoryBackend backend;
|
||||
if (backends.containsKey(id)) {
|
||||
backend = backends.get(id);
|
||||
}
|
||||
else {
|
||||
backend = new RrdMemoryBackend(id);
|
||||
backends.put(id, backend);
|
||||
}
|
||||
return backend;
|
||||
AtomicReference<ByteBuffer> refbb = backends.computeIfAbsent(id, i -> new AtomicReference<ByteBuffer>());
|
||||
return new RrdMemoryBackend(id, refbb);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -47,6 +42,7 @@ public class RrdMemoryBackendFactory extends RrdBackendFactory {
|
||||
* {@inheritDoc}
|
||||
*
|
||||
* Method to determine if a memory storage with the given ID already exists.
|
||||
*
|
||||
*/
|
||||
protected boolean exists(String id) {
|
||||
return backends.containsKey(id);
|
||||
|
||||
@@ -86,7 +86,7 @@ public class RrdNioBackendFactory extends RrdFileBackendFactory {
|
||||
* Creates a new RrdNioBackendFactory with default settings.
|
||||
*/
|
||||
public RrdNioBackendFactory() {
|
||||
this(RrdNioBackendFactory.defaultSyncPeriod, DefaultSyncThreadPool.INSTANCE);
|
||||
this(RrdNioBackendFactory.defaultSyncPeriod, RrdNioBackendFactory.defaultSyncPeriod > 0 ? DefaultSyncThreadPool.INSTANCE : null);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -4,6 +4,9 @@ import java.io.IOException;
|
||||
|
||||
/**
|
||||
* Factory class which creates actual {@link org.rrd4j.core.RrdSafeFileBackend} objects.
|
||||
* <p>
|
||||
* Because of locking, each RrdDb can be open only once even from within the JVM. So usage
|
||||
* of the {@link org.rrd4j.core.RrdDbPool} is mandatory with this backend.
|
||||
*
|
||||
*/
|
||||
@RrdBackendAnnotation(name="SAFE", shouldValidateHeader=true, cachingAllowed=false)
|
||||
|
||||
@@ -31,7 +31,6 @@ import org.rrd4j.ConsolFun;
|
||||
* (files which are currently in use).
|
||||
*
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public class RrdToolkit {
|
||||
|
||||
private static final String SOURCE_AND_DESTINATION_PATHS_ARE_THE_SAME = "Source and destination paths are the same";
|
||||
@@ -472,11 +471,8 @@ public class RrdToolkit {
|
||||
if (arcDef.getRows() != newRows) {
|
||||
arcDef.setRows(newRows);
|
||||
rrdDef.setPath(destPath);
|
||||
RrdDb rrdDest = new RrdDb(rrdDef);
|
||||
try {
|
||||
try (RrdDb rrdDest = RrdDb.of(rrdDef)){
|
||||
rrdSource.copyStateTo(rrdDest);
|
||||
} finally {
|
||||
rrdDest.close();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -571,4 +567,3 @@ public class RrdToolkit {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -202,7 +202,7 @@ public class XmlWriter implements AutoCloseable {
|
||||
}
|
||||
|
||||
private static String escape(String s) {
|
||||
return s.replaceAll("<", "<").replaceAll(">", ">");
|
||||
return s.replace("<", "<").replace(">", ">");
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -2,8 +2,8 @@ package org.rrd4j.core.jrrd;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.rrd4j.data.LinearInterpolator;
|
||||
import org.rrd4j.data.Plottable;
|
||||
import org.rrd4j.data.LinearInterpolator;
|
||||
|
||||
/**
|
||||
* Models a chunk of result data from an RRDatabase.
|
||||
@@ -11,6 +11,7 @@ import org.rrd4j.data.Plottable;
|
||||
* @author <a href="mailto:ciaran@codeloop.com">Ciaran Treanor</a>
|
||||
* @version $Revision: 1.1 $
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public class DataChunk {
|
||||
|
||||
private static final String NEWLINE = System.getProperty("line.separator");
|
||||
|
||||
@@ -1,11 +1,13 @@
|
||||
package org.rrd4j.core.timespec;
|
||||
|
||||
import org.rrd4j.core.Util;
|
||||
import java.time.Instant;
|
||||
|
||||
/**
|
||||
* Class which parses at-style time specification (described in detail on the rrdfetch man page),
|
||||
* used in all RRDTool commands. This code is in most parts just a java port of Tobi's parsetime.c
|
||||
* code.
|
||||
*
|
||||
* For years written with two digits, any year before 38 will be post 2000.
|
||||
*
|
||||
*/
|
||||
public class TimeParser {
|
||||
@@ -102,7 +104,8 @@ public class TimeParser {
|
||||
* the scanner state to what it was at entry, and returns without setting anything.
|
||||
*/
|
||||
private void timeOfDay() {
|
||||
int hour, minute = 0;
|
||||
int hour = 0;
|
||||
int minute = 0;
|
||||
/* save token status in case we must abort */
|
||||
scanner.saveState();
|
||||
/* first pick out the time of day - we assume a HH (COLON|DOT) MM time */
|
||||
@@ -165,20 +168,13 @@ public class TimeParser {
|
||||
}
|
||||
|
||||
private void assignDate(long mday, long mon, long year) {
|
||||
if (year > 138) {
|
||||
if (year > 1970) {
|
||||
year -= 1900;
|
||||
}
|
||||
else {
|
||||
throw new IllegalArgumentException("Invalid year " + year + " (should be either 00-99 or >1900)");
|
||||
}
|
||||
if (year >= 0 && year < 38) {
|
||||
// 00-37 means post 2000
|
||||
year += 2000;
|
||||
}
|
||||
else if (year >= 0 && year < 38) {
|
||||
year += 100; /* Allow year 2000-2037 to be specified as */
|
||||
} /* 00-37 until the problem of 2038 year will */
|
||||
/* arise for unices with 32-bit time_t */
|
||||
if (year < 70) {
|
||||
throw new IllegalArgumentException("Won't handle dates before epoch (01/01/1970), sorry");
|
||||
else if (year >= 38 && year <= 99) {
|
||||
// 38-99 means 1938-1999
|
||||
year += 1900;
|
||||
}
|
||||
spec.year = (int) year;
|
||||
spec.month = (int) mon;
|
||||
@@ -186,7 +182,10 @@ public class TimeParser {
|
||||
}
|
||||
|
||||
private void day() {
|
||||
long mday = 0, wday, mon, year = spec.year;
|
||||
long mday = 0;
|
||||
long wday = 0;
|
||||
long mon = 0;
|
||||
long year = spec.year;
|
||||
switch (token.token_id) {
|
||||
case TimeToken.YESTERDAY:
|
||||
spec.day--;
|
||||
@@ -244,7 +243,7 @@ public class TimeParser {
|
||||
token = scanner.nextToken();
|
||||
break;
|
||||
}
|
||||
if (mon > 19700101 && mon < 24000101) { /*works between 1900 and 2400 */
|
||||
if (mon > 19000101 && mon < 24000101) { /*works between 1900 and 2400 */
|
||||
year = mon / 10000;
|
||||
mday = mon % 100;
|
||||
mon = (mon / 100) % 100;
|
||||
@@ -292,7 +291,7 @@ public class TimeParser {
|
||||
* @return Object representing parsed date/time.
|
||||
*/
|
||||
public TimeSpec parse() {
|
||||
long now = Util.getTime();
|
||||
long now = Instant.now().getEpochSecond();
|
||||
int hr = 0;
|
||||
/* this MUST be initialized to zero for midnight/noon/teatime */
|
||||
/* establish the default time reference */
|
||||
|
||||
@@ -7,11 +7,11 @@ class TimeScanner {
|
||||
private TimeToken token, token_save;
|
||||
|
||||
static final TimeToken[] WORDS = {
|
||||
new TimeToken("midnight", TimeToken.MIDNIGHT), /* 00:00:00 of today or tomorrow */
|
||||
new TimeToken("noon", TimeToken.NOON), /* 12:00:00 of today or tomorrow */
|
||||
new TimeToken("teatime", TimeToken.TEATIME), /* 16:00:00 of today or tomorrow */
|
||||
new TimeToken("am", TimeToken.AM), /* morning times for 0-12 clock */
|
||||
new TimeToken("pm", TimeToken.PM), /* evening times for 0-12 clock */
|
||||
new TimeToken("midnight", TimeToken.MIDNIGHT), /* 00:00:00 of today or tomorrow */
|
||||
new TimeToken("noon", TimeToken.NOON), /* 12:00:00 of today or tomorrow */
|
||||
new TimeToken("teatime", TimeToken.TEATIME), /* 16:00:00 of today or tomorrow */
|
||||
new TimeToken("am", TimeToken.AM), /* morning times for 0-12 clock */
|
||||
new TimeToken("pm", TimeToken.PM), /* evening times for 0-12 clock */
|
||||
new TimeToken("tomorrow", TimeToken.TOMORROW),
|
||||
new TimeToken("yesterday", TimeToken.YESTERDAY),
|
||||
new TimeToken("today", TimeToken.TODAY),
|
||||
@@ -62,33 +62,33 @@ class TimeScanner {
|
||||
new TimeToken(null, 0) /*** SENTINEL ***/
|
||||
};
|
||||
|
||||
static TimeToken[] MULTIPLIERS = {
|
||||
new TimeToken("second", TimeToken.SECONDS), /* seconds multiplier */
|
||||
new TimeToken("seconds", TimeToken.SECONDS), /* (pluralized) */
|
||||
new TimeToken("sec", TimeToken.SECONDS), /* (generic) */
|
||||
static final TimeToken[] MULTIPLIERS = {
|
||||
new TimeToken("second", TimeToken.SECONDS), /* seconds multiplier */
|
||||
new TimeToken("seconds", TimeToken.SECONDS), /* (pluralized) */
|
||||
new TimeToken("sec", TimeToken.SECONDS), /* (generic) */
|
||||
new TimeToken("s", TimeToken.SECONDS), /* (short generic) */
|
||||
new TimeToken("minute", TimeToken.MINUTES), /* minutes multiplier */
|
||||
new TimeToken("minutes", TimeToken.MINUTES), /* (pluralized) */
|
||||
new TimeToken("min", TimeToken.MINUTES), /* (generic) */
|
||||
new TimeToken("m", TimeToken.MONTHS_MINUTES), /* (short generic) */
|
||||
new TimeToken("hour", TimeToken.HOURS), /* hours ... */
|
||||
new TimeToken("hours", TimeToken.HOURS), /* (pluralized) */
|
||||
new TimeToken("hr", TimeToken.HOURS), /* (generic) */
|
||||
new TimeToken("h", TimeToken.HOURS), /* (short generic) */
|
||||
new TimeToken("day", TimeToken.DAYS), /* days ... */
|
||||
new TimeToken("minute", TimeToken.MINUTES), /* minutes multiplier */
|
||||
new TimeToken("minutes", TimeToken.MINUTES), /* (pluralized) */
|
||||
new TimeToken("min", TimeToken.MINUTES), /* (generic) */
|
||||
new TimeToken("m", TimeToken.MONTHS_MINUTES), /* (short generic) */
|
||||
new TimeToken("hour", TimeToken.HOURS), /* hours ... */
|
||||
new TimeToken("hours", TimeToken.HOURS), /* (pluralized) */
|
||||
new TimeToken("hr", TimeToken.HOURS), /* (generic) */
|
||||
new TimeToken("h", TimeToken.HOURS), /* (short generic) */
|
||||
new TimeToken("day", TimeToken.DAYS), /* days ... */
|
||||
new TimeToken("days", TimeToken.DAYS), /* (pluralized) */
|
||||
new TimeToken("d", TimeToken.DAYS), /* (short generic) */
|
||||
new TimeToken("week", TimeToken.WEEKS), /* week ... */
|
||||
new TimeToken("weeks", TimeToken.WEEKS), /* (pluralized) */
|
||||
new TimeToken("wk", TimeToken.WEEKS), /* (generic) */
|
||||
new TimeToken("w", TimeToken.WEEKS), /* (short generic) */
|
||||
new TimeToken("month", TimeToken.MONTHS), /* week ... */
|
||||
new TimeToken("d", TimeToken.DAYS), /* (short generic) */
|
||||
new TimeToken("week", TimeToken.WEEKS), /* week ... */
|
||||
new TimeToken("weeks", TimeToken.WEEKS), /* (pluralized) */
|
||||
new TimeToken("wk", TimeToken.WEEKS), /* (generic) */
|
||||
new TimeToken("w", TimeToken.WEEKS), /* (short generic) */
|
||||
new TimeToken("month", TimeToken.MONTHS), /* week ... */
|
||||
new TimeToken("months", TimeToken.MONTHS), /* (pluralized) */
|
||||
new TimeToken("mon", TimeToken.MONTHS), /* (generic) */
|
||||
new TimeToken("year", TimeToken.YEARS), /* year ... */
|
||||
new TimeToken("years", TimeToken.YEARS), /* (pluralized) */
|
||||
new TimeToken("yr", TimeToken.YEARS), /* (generic) */
|
||||
new TimeToken("y", TimeToken.YEARS), /* (short generic) */
|
||||
new TimeToken("mon", TimeToken.MONTHS), /* (generic) */
|
||||
new TimeToken("year", TimeToken.YEARS), /* year ... */
|
||||
new TimeToken("years", TimeToken.YEARS), /* (pluralized) */
|
||||
new TimeToken("yr", TimeToken.YEARS), /* (generic) */
|
||||
new TimeToken("y", TimeToken.YEARS), /* (short generic) */
|
||||
new TimeToken(null, 0) /*** SENTINEL ***/
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
package org.rrd4j.core.timespec;
|
||||
|
||||
import org.rrd4j.core.Util;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
@@ -33,7 +31,7 @@ public class TimeSpec {
|
||||
void localtime(long timestamp) {
|
||||
GregorianCalendar date = new GregorianCalendar();
|
||||
date.setTime(new Date(timestamp * 1000L));
|
||||
year = date.get(Calendar.YEAR) - 1900;
|
||||
year = date.get(Calendar.YEAR);
|
||||
month = date.get(Calendar.MONTH);
|
||||
day = date.get(Calendar.DAY_OF_MONTH);
|
||||
hour = date.get(Calendar.HOUR_OF_DAY);
|
||||
@@ -46,7 +44,7 @@ public class TimeSpec {
|
||||
GregorianCalendar gc;
|
||||
// absolute time, this is easy
|
||||
if (type == TYPE_ABSOLUTE) {
|
||||
gc = new GregorianCalendar(year + 1900, month, day, hour, min, sec);
|
||||
gc = new GregorianCalendar(year, month, day, hour, min, sec);
|
||||
}
|
||||
// relative time, we need a context to evaluate it
|
||||
else if (context != null && context.type == TYPE_ABSOLUTE) {
|
||||
@@ -77,7 +75,7 @@ public class TimeSpec {
|
||||
* @return Timestamp (in seconds, no milliseconds)
|
||||
*/
|
||||
public long getTimestamp() {
|
||||
return Util.getTimestamp(getTime());
|
||||
return getTime().toInstant().getEpochSecond();
|
||||
}
|
||||
|
||||
String dump() {
|
||||
@@ -133,7 +131,7 @@ public class TimeSpec {
|
||||
public static long[] getTimestamps(TimeSpec spec1, TimeSpec spec2) {
|
||||
Calendar[] gcs = getTimes(spec1, spec2);
|
||||
return new long[] {
|
||||
Util.getTimestamp(gcs[0]), Util.getTimestamp(gcs[1])
|
||||
gcs[0].toInstant().getEpochSecond(), gcs[1].toInstant().getEpochSecond()
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import java.util.Date;
|
||||
* <b>WARNING</b>: So far, this class cannot handle NaN datasource values
|
||||
* (an exception will be thrown by the constructor). Future releases might change this.
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public class CubicSplineInterpolator extends Plottable {
|
||||
private double[] x;
|
||||
private double[] y;
|
||||
|
||||
@@ -1,6 +1,22 @@
|
||||
package org.rrd4j.data;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.net.URI;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.TemporalAmount;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import org.rrd4j.ConsolFun;
|
||||
import org.rrd4j.core.DataHolder;
|
||||
import org.rrd4j.core.FetchData;
|
||||
import org.rrd4j.core.FetchRequest;
|
||||
import org.rrd4j.core.RrdBackendFactory;
|
||||
@@ -8,18 +24,6 @@ import org.rrd4j.core.RrdDb;
|
||||
import org.rrd4j.core.RrdDbPool;
|
||||
import org.rrd4j.core.Util;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
|
||||
/**
|
||||
* <p>Class which should be used for all calculations based on the data fetched from RRD files. This class
|
||||
* supports ordinary DEF datasources (defined in RRD files), CDEF datasources (RPN expressions evaluation),
|
||||
@@ -43,28 +47,24 @@ import java.util.TimeZone;
|
||||
* System.out.println(dp.dump());
|
||||
* </pre>
|
||||
*/
|
||||
public class DataProcessor {
|
||||
public class DataProcessor implements DataHolder {
|
||||
|
||||
/**
|
||||
* Constant representing the default number of pixels on a Rrd4j graph (will be used if
|
||||
* no other value is specified with {@link #setStep(long) setStep()} method.
|
||||
* Not used any more.
|
||||
*/
|
||||
@Deprecated
|
||||
public static final int DEFAULT_PIXEL_COUNT = 600;
|
||||
/** Constant <code>DEFAULT_PERCENTILE=95.0</code> */
|
||||
public static final double DEFAULT_PERCENTILE = 95.0; // %
|
||||
|
||||
private int pixelCount = DEFAULT_PIXEL_COUNT;
|
||||
private int pixelCount = 0;
|
||||
|
||||
/**
|
||||
* Constant that defines the default {@link RrdDbPool} usage policy. Defaults to <code>false</code>
|
||||
* (i.e. the pool will not be used to fetch data from RRD files)
|
||||
*/
|
||||
public static final boolean DEFAULT_POOL_USAGE_POLICY = false;
|
||||
private boolean poolUsed = DEFAULT_POOL_USAGE_POLICY;
|
||||
private RrdDbPool pool = null;
|
||||
|
||||
private final long tStart;
|
||||
private long tEnd, timestamps[];
|
||||
private long tStart;
|
||||
private long tEnd;
|
||||
private long timestamps[];
|
||||
private long lastRrdArchiveUpdateTime = 0;
|
||||
// this will be adjusted later
|
||||
private long step = 0;
|
||||
@@ -123,11 +123,24 @@ public class DataProcessor {
|
||||
this.tz = gc1.getTimeZone();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new DataProcessor object for the given time duration. The given duration will be
|
||||
* substracted from current time.
|
||||
*
|
||||
* @param d duration to substract.
|
||||
*/
|
||||
public DataProcessor(TemporalAmount d) {
|
||||
Instant now = Instant.now();
|
||||
this.tEnd = now.getEpochSecond();
|
||||
this.tStart = now.minus(d).getEpochSecond();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns boolean value representing {@link org.rrd4j.core.RrdDbPool RrdDbPool} usage policy.
|
||||
*
|
||||
* @return true, if the pool will be used internally to fetch data from RRD files, false otherwise.
|
||||
*/
|
||||
@Override
|
||||
public boolean isPoolUsed() {
|
||||
return poolUsed;
|
||||
}
|
||||
@@ -137,10 +150,12 @@ public class DataProcessor {
|
||||
*
|
||||
* @param poolUsed true, if the pool should be used to fetch data from RRD files, false otherwise.
|
||||
*/
|
||||
@Override
|
||||
public void setPoolUsed(boolean poolUsed) {
|
||||
this.poolUsed = poolUsed;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RrdDbPool getPool() {
|
||||
return pool;
|
||||
}
|
||||
@@ -150,6 +165,7 @@ public class DataProcessor {
|
||||
* set to true, the default {@link RrdDbPool#getInstance()} will be used.
|
||||
* @param pool an optional pool to use.
|
||||
*/
|
||||
@Override
|
||||
public void setPool(RrdDbPool pool) {
|
||||
this.pool = pool;
|
||||
}
|
||||
@@ -163,9 +179,6 @@ public class DataProcessor {
|
||||
* and similar methods. In other words, aggregated values will not change once you decide to change
|
||||
* the dimension of your graph.</p>
|
||||
*
|
||||
* The default number of pixels is defined by constant {@link #DEFAULT_PIXEL_COUNT}
|
||||
* and can be changed with a {@link #setPixelCount(int)} method.
|
||||
*
|
||||
* @param pixelCount The number of pixels. If you process RRD data in order to display it on the graph,
|
||||
* this should be the width of your graph.
|
||||
*/
|
||||
@@ -183,30 +196,22 @@ public class DataProcessor {
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Roughly corresponds to the --step option in RRDTool's graph/xport commands. Here is an explanation borrowed
|
||||
* from RRDTool:</p>
|
||||
* <p><i>"By default rrdgraph calculates the width of one pixel in the time
|
||||
* domain and tries to get data at that resolution from the RRD. With
|
||||
* this switch you can override this behavior. If you want rrdgraph to
|
||||
* get data at 1 hour resolution from the RRD, then you can set the
|
||||
* step to 3600 seconds. Note, that a step smaller than 1 pixel will
|
||||
* be silently ignored."</i></p>
|
||||
* <p>I think this option is not that useful, but it's here just for compatibility.</p>
|
||||
* @param step Time step at which data should be fetched from RRD files. If this method is not used,
|
||||
* the step will be equal to the smallest RRD step of all processed RRD files. If no RRD file is processed,
|
||||
* the step will be roughly equal to the with of one graph pixel (in seconds).
|
||||
* Once data are fetched, the step value will be used to generate values. If not defined, or set to 0, a optimal
|
||||
* step will be calculated.
|
||||
* @param step Default to 0.
|
||||
*/
|
||||
@Override
|
||||
public void setStep(long step) {
|
||||
this.step = step;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the time step used for data processing. Initially, this method returns zero.
|
||||
* Once {@link #processData()} is finished, the method will return the real value used for
|
||||
* all internal computations. Roughly corresponds to the --step option in RRDTool's graph/xport commands.
|
||||
* Once {@link #processData()} is finished, the method will return the time stamp interval.
|
||||
*
|
||||
* @return Step used for data processing.
|
||||
*/
|
||||
@Override
|
||||
public long getStep() {
|
||||
return step;
|
||||
}
|
||||
@@ -236,10 +241,12 @@ public class DataProcessor {
|
||||
this.fetchRequestResolution = fetchRequestResolution;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TimeZone getTimeZone() {
|
||||
return tz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setTimeZone(TimeZone tz) {
|
||||
this.tz = tz;
|
||||
}
|
||||
@@ -251,6 +258,7 @@ public class DataProcessor {
|
||||
* value will be calculated from the last update times of processed RRD files.
|
||||
*
|
||||
* @return Ending timestamp in seconds
|
||||
* @deprecated Uses {@link #getEndTime()} instead.
|
||||
*/
|
||||
public long getEndingTimestamp() {
|
||||
return tEnd;
|
||||
@@ -263,7 +271,7 @@ public class DataProcessor {
|
||||
*/
|
||||
public long[] getTimestamps() {
|
||||
if (timestamps == null) {
|
||||
throw new IllegalArgumentException("Timestamps not calculated yet");
|
||||
throw new IllegalStateException("Timestamps not calculated yet");
|
||||
}
|
||||
else {
|
||||
return timestamps;
|
||||
@@ -465,8 +473,24 @@ public class DataProcessor {
|
||||
*
|
||||
* @param name source name.
|
||||
* @param plottable class that extends Plottable class and is suited for graphing.
|
||||
* @deprecated Uses {@link #datasource(String, IPlottable)} instead
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, Plottable plottable) {
|
||||
datasource(name, plottable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a custom, {@link org.rrd4j.data.Plottable plottable} datasource (<b>PDEF</b>).
|
||||
* The datapoints should be made available by a class extending
|
||||
* {@link org.rrd4j.data.Plottable Plottable} class.
|
||||
*
|
||||
* @param name source name.
|
||||
* @param plottable class that extends Plottable class and is suited for graphing.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, IPlottable plottable) {
|
||||
PDef pDef = new PDef(name, plottable);
|
||||
sources.put(name, pDef);
|
||||
}
|
||||
@@ -492,8 +516,38 @@ public class DataProcessor {
|
||||
* @param name source name.
|
||||
* @param rpnExpression RPN expression containing comma delimited simple and complex
|
||||
* source names, RPN constants, functions and operators.
|
||||
* @deprecated Uses {@link #datasource(String, String)} instead
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String rpnExpression) {
|
||||
datasource(name, rpnExpression);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Adds complex source (<b>CDEF</b>).
|
||||
* Complex sources are evaluated using the supplied <code>RPN</code> expression.</p>
|
||||
* Complex source <code>name</code> can be used:
|
||||
* <ul>
|
||||
* <li>To specify sources for line, area and stack plots.</li>
|
||||
* <li>To define other complex sources.</li>
|
||||
* </ul>
|
||||
*
|
||||
* The supported RPN functions, operators and constants are detailed at
|
||||
* <a href="https://github.com/rrd4j/rrd4j/wiki/RPNFuncs" target="man">RRD4J's wiki</a>.
|
||||
* <p>
|
||||
* Rrd4j does not force you to specify at least one simple source name as RRDTool.
|
||||
* <p>
|
||||
* For more details on RPN see RRDTool's
|
||||
* <a href="http://oss.oetiker.ch/rrdtool/doc/rrdgraph_rpn.en.html" target="man">
|
||||
* rrdgraph man page</a>.
|
||||
*
|
||||
* @param name source name.
|
||||
* @param rpnExpression RPN expression containing comma delimited simple and complex
|
||||
* source names, RPN constants, functions and operators.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String rpnExpression) {
|
||||
CDef cDef = new CDef(name, rpnExpression);
|
||||
sources.put(name, cDef);
|
||||
}
|
||||
@@ -533,7 +587,7 @@ public class DataProcessor {
|
||||
|
||||
/**
|
||||
* Creates a datasource that performs a variable calculation on an
|
||||
* another named datasource to yield a single combined timestampe/value.
|
||||
* another named datasource to yield a single combined timestamp/value.
|
||||
*
|
||||
* Requires that the other datasource has already been defined; otherwise, it'll
|
||||
* end up with no data
|
||||
@@ -542,8 +596,28 @@ public class DataProcessor {
|
||||
* @param defName - the datasource from which to extract the percentile. Must be a previously
|
||||
* defined virtual datasource
|
||||
* @param var - a new instance of a Variable used to do the calculation
|
||||
* @deprecated Uses {@link #datasource(String, String, Variable)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String defName, Variable var) {
|
||||
datasource(name, defName, var);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a datasource that performs a variable calculation on an
|
||||
* another named datasource to yield a single combined timestamp/value.
|
||||
*
|
||||
* Requires that the other datasource has already been defined; otherwise, it'll
|
||||
* end up with no data
|
||||
*
|
||||
* @param name - the new virtual datasource name
|
||||
* @param defName - the datasource from which to extract the percentile. Must be a previously
|
||||
* defined virtual datasource
|
||||
* @param var - a new instance of a Variable used to do the calculation
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String defName, Variable var) {
|
||||
VDef sDef = new VDef(name, defName, var);
|
||||
sources.put(name, sDef);
|
||||
}
|
||||
@@ -560,9 +634,52 @@ public class DataProcessor {
|
||||
* @param file Path to RRD file.
|
||||
* @param dsName Datasource name defined in the RRD file.
|
||||
* @param consolFunc Consolidation function that will be used to extract data from the RRD
|
||||
* @deprecated Uses {@link #datasource(String, String, String, ConsolFun)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String file, String dsName, ConsolFun consolFunc) {
|
||||
Def def = new Def(name, file, dsName, consolFunc);
|
||||
datasource(name, file, dsName, consolFunc);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Adds simple datasource (<b>DEF</b>). Simple source <code>name</code>
|
||||
* can be used:</p>
|
||||
* <ul>
|
||||
* <li>To specify sources for line, area and stack plots.</li>
|
||||
* <li>To define complex sources
|
||||
* </ul>
|
||||
*
|
||||
* @param name source name.
|
||||
* @param file Path to RRD file.
|
||||
* @param dsName Datasource name defined in the RRD file.
|
||||
* @param consolFunc Consolidation function that will be used to extract data from the RRD
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String file, String dsName, ConsolFun consolFunc) {
|
||||
RrdBackendFactory factory = RrdBackendFactory.getDefaultFactory();
|
||||
Def def = new Def(name, factory.getUri(file), dsName, consolFunc, factory);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Adds simple datasource (<b>DEF</b>). Simple source <code>name</code>
|
||||
* can be used:</p>
|
||||
* <ul>
|
||||
* <li>To specify sources for line, area and stack plots.</li>
|
||||
* <li>To define complex sources
|
||||
* </ul>
|
||||
*
|
||||
* @param name source name.
|
||||
* @param rrdUri URI to RRD file.
|
||||
* @param dsName Datasource name defined in the RRD file.
|
||||
* @param consolFunc Consolidation function that will be used to extract data from the RRD
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, URI rrdUri, String dsName,
|
||||
ConsolFun consolFunc) {
|
||||
Def def = new Def(name, rrdUri, dsName, consolFunc, RrdBackendFactory.findFactory(rrdUri));
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
@@ -580,11 +697,12 @@ public class DataProcessor {
|
||||
* file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined
|
||||
* in the {@link org.rrd4j.ConsolFun ConsolFun} class).
|
||||
* @param backend Name of the RrdBackendFactory that should be used for this RrdDb.
|
||||
* @deprecated uses {@link #addDatasource(String, String, String, ConsolFun, RrdBackendFactory)} instead
|
||||
* @deprecated uses {@link #datasource(String, String, String, ConsolFun, RrdBackendFactory)} instead
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String file, String dsName, ConsolFun consolFunc, String backend) {
|
||||
Def def = new Def(name, file, dsName, consolFunc, RrdBackendFactory.getFactory(backend));
|
||||
RrdBackendFactory factory = RrdBackendFactory.getFactory(backend);
|
||||
Def def = new Def(name, factory.getUri(file), dsName, consolFunc, factory);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
@@ -602,9 +720,55 @@ public class DataProcessor {
|
||||
* file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined
|
||||
* in the {@link org.rrd4j.ConsolFun ConsolFun} class).
|
||||
* @param backend Name of the RrdBackendFactory that should be used for this RrdDb.
|
||||
* @deprecated uses {@link #datasource(String, String, String, ConsolFun, RrdBackendFactory)} instead
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String file, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) {
|
||||
Def def = new Def(name, file, dsName, consolFunc, backend);
|
||||
datasource(name, file, dsName, consolFunc, backend);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Adds simple source (<b>DEF</b>). Source <code>name</code> can be used:</p>
|
||||
* <ul>
|
||||
* <li>To specify sources for line, area and stack plots.</li>
|
||||
* <li>To define complex sources
|
||||
* </ul>
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param file Path to RRD file.
|
||||
* @param dsName Data source name defined in the RRD file.
|
||||
* @param consolFunc Consolidation function that will be used to extract data from the RRD
|
||||
* file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined
|
||||
* in the {@link org.rrd4j.ConsolFun ConsolFun} class).
|
||||
* @param backend Name of the RrdBackendFactory that should be used for this RrdDb.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String file, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) {
|
||||
Def def = new Def(name, backend.getUri(file), dsName, consolFunc, backend);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>Adds simple source (<b>DEF</b>). Source <code>name</code> can be used:</p>
|
||||
* <ul>
|
||||
* <li>To specify sources for line, area and stack plots.</li>
|
||||
* <li>To define complex sources
|
||||
* </ul>
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param uri URI to RRD file.
|
||||
* @param dsName Data source name defined in the RRD file.
|
||||
* @param consolFunc Consolidation function that will be used to extract data from the RRD
|
||||
* file ("AVERAGE", "MIN", "MAX" or "LAST" - these string constants are conveniently defined
|
||||
* in the {@link org.rrd4j.ConsolFun ConsolFun} class).
|
||||
* @param backend Name of the RrdBackendFactory that should be used for this RrdDb.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, URI uri, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) {
|
||||
Def def = new Def(name, uri, dsName, consolFunc, backend);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
@@ -614,8 +778,23 @@ public class DataProcessor {
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param fetchData Fetched data containing values for the given source name.
|
||||
* @deprecated Uses {@link #datasource(String, FetchData)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, FetchData fetchData) {
|
||||
datasource(name, fetchData);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds DEF datasource with datasource values already available in the FetchData object. This method is
|
||||
* used internally by Rrd4j and probably has no purpose outside of it.
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param fetchData Fetched data containing values for the given source name.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, FetchData fetchData) {
|
||||
Def def = new Def(name, fetchData);
|
||||
sources.put(name, def);
|
||||
}
|
||||
@@ -628,12 +807,30 @@ public class DataProcessor {
|
||||
* @param name Source name.
|
||||
* @param dsName Source name in the fetch data.
|
||||
* @param fetchData Fetched data containing values for the given source name.
|
||||
* @deprecated Uses {@link #datasource(String, String, FetchData)} instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void addDatasource(String name, String dsName, FetchData fetchData) {
|
||||
Def def = new Def(name, dsName, fetchData);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds DEF datasource with datasource values already available in the FetchData object. This method is
|
||||
* used internally by Rrd4j and probably has no purpose outside of it.
|
||||
* The values will be extracted from dsName in fetchData.
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param dsName Source name in the fetch data.
|
||||
* @param fetchData Fetched data containing values for the given source name.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String dsName, FetchData fetchData) {
|
||||
Def def = new Def(name, dsName, fetchData);
|
||||
sources.put(name, def);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////
|
||||
// CALCULATIONS
|
||||
/////////////////////////////////////////////////////////////////
|
||||
@@ -711,7 +908,8 @@ public class DataProcessor {
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates timestamps which correspond to individual pixels on the graph.
|
||||
* Calculates timestamps which correspond to individual pixels on the graph. It also
|
||||
* set the timestampsPerPixel value.
|
||||
*
|
||||
* @param pixelCount Graph width
|
||||
* @return Array of timestamps
|
||||
@@ -772,35 +970,60 @@ public class DataProcessor {
|
||||
// PRIVATE METHODS
|
||||
|
||||
private void extractDefs() {
|
||||
List<Def> defList = new ArrayList<Def>();
|
||||
for (Source source : sources.values()) {
|
||||
if (source instanceof Def) {
|
||||
defList.add((Def) source);
|
||||
}
|
||||
}
|
||||
defSources = defList.toArray(new Def[defList.size()]);
|
||||
defSources = sources.values().stream().filter(s -> s instanceof Def).toArray(Def[]::new);
|
||||
}
|
||||
|
||||
private void fetchRrdData() throws IOException {
|
||||
long tEndFixed = (tEnd == 0) ? Util.getTime() : tEnd;
|
||||
for (int i = 0; i < defSources.length; i++) {
|
||||
if (!defSources[i].isLoaded()) {
|
||||
// not fetched yet
|
||||
Set<String> dsNames = new HashSet<String>();
|
||||
dsNames.add(defSources[i].getDsName());
|
||||
// look for all other datasources with the same path and the same consolidation function
|
||||
for (int j = i + 1; j < defSources.length; j++) {
|
||||
if (defSources[i].isCompatibleWith(defSources[j])) {
|
||||
dsNames.add(defSources[j].getDsName());
|
||||
RrdDb[] batchRrd = new RrdDb[defSources.length];
|
||||
Map<URI, RrdDb> openRrd = new HashMap<>(defSources.length);
|
||||
Set<RrdDb> newDb = new HashSet<>(defSources.length);
|
||||
try {
|
||||
// Storing of the RrdDb in a array to batch open/close, useful if a pool
|
||||
// is used.
|
||||
int d = 0;
|
||||
for (Def def: defSources) {
|
||||
URI curi = def.getCanonicalUri();
|
||||
batchRrd[d++] = openRrd.computeIfAbsent(curi, uri -> {
|
||||
if (! def.isLoaded()) {
|
||||
RrdBackendFactory backend = def.getBackend();
|
||||
try {
|
||||
RrdDb rrdDb = RrdDb.getBuilder().setPath(curi).setBackendFactory(backend).readOnly().setPool(pool).setUsePool(poolUsed).build();
|
||||
newDb.add(rrdDb);
|
||||
return rrdDb;
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
} else {
|
||||
return def.getRrdDb();
|
||||
}
|
||||
});
|
||||
}
|
||||
for (int i = 0; i < defSources.length; i++) {
|
||||
if (batchRrd[i] == null) {
|
||||
// The rrdDb failed to open, skip it
|
||||
continue;
|
||||
}
|
||||
// now we have everything
|
||||
try (RrdDb rrd = getRrd(defSources[i])){
|
||||
lastRrdArchiveUpdateTime = Math.max(lastRrdArchiveUpdateTime, rrd.getLastArchiveUpdateTime());
|
||||
FetchRequest req = rrd.createFetchRequest(defSources[i].getConsolFun(),
|
||||
tStart, tEndFixed, fetchRequestResolution);
|
||||
if (!defSources[i].isLoaded()) {
|
||||
// not fetched yet
|
||||
Set<String> dsNames = new HashSet<String>();
|
||||
dsNames.add(defSources[i].getDsName());
|
||||
// look for all other datasources with the same path and the same consolidation function
|
||||
for (int j = i + 1; j < defSources.length; j++) {
|
||||
if (defSources[i].isCompatibleWith(defSources[j])) {
|
||||
dsNames.add(defSources[j].getDsName());
|
||||
}
|
||||
}
|
||||
// now we have everything
|
||||
lastRrdArchiveUpdateTime = Math.max(
|
||||
lastRrdArchiveUpdateTime,
|
||||
batchRrd[i].getLastArchiveUpdateTime());
|
||||
FetchRequest req = batchRrd[i].createFetchRequest(
|
||||
defSources[i].getConsolFun(), tStart, tEndFixed,
|
||||
fetchRequestResolution);
|
||||
req.setFilter(dsNames);
|
||||
FetchData data = req.fetchData();
|
||||
assert data != null;
|
||||
defSources[i].setFetchData(data);
|
||||
for (int j = i + 1; j < defSources.length; j++) {
|
||||
if (defSources[i].isCompatibleWith(defSources[j])) {
|
||||
@@ -809,6 +1032,15 @@ public class DataProcessor {
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (UncheckedIOException ex){
|
||||
throw ex.getCause();
|
||||
} finally {
|
||||
newDb.forEach(t -> {
|
||||
try {
|
||||
t.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -831,7 +1063,8 @@ public class DataProcessor {
|
||||
private void chooseOptimalStep() {
|
||||
long newStep = Long.MAX_VALUE;
|
||||
for (Def defSource : defSources) {
|
||||
long fetchStep = defSource.getFetchStep(), tryStep = fetchStep;
|
||||
long fetchStep = defSource.getFetchStep();
|
||||
long tryStep = fetchStep;
|
||||
if (step > 0) {
|
||||
tryStep = Math.min(newStep, (((step - 1) / fetchStep) + 1) * fetchStep);
|
||||
}
|
||||
@@ -841,9 +1074,13 @@ public class DataProcessor {
|
||||
// step resolved from a RRD file
|
||||
step = newStep;
|
||||
}
|
||||
else {
|
||||
// choose step based on the number of pixels (useful for plottable datasources)
|
||||
else if (pixelCount != 0) {
|
||||
// Only calculated sources. But requested in a graph. So use the graph
|
||||
// width as an hint
|
||||
step = Math.max((tEnd - tStart) / pixelCount, 1);
|
||||
} else if (step <= 0) {
|
||||
// If step was not given, just 1
|
||||
step = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -884,12 +1121,6 @@ public class DataProcessor {
|
||||
}
|
||||
}
|
||||
|
||||
private RrdDb getRrd(Def def) throws IOException {
|
||||
String path = def.getPath();
|
||||
RrdBackendFactory backend = def.getBackend();
|
||||
return RrdDb.getBuilder().setPath(path).setBackendFactory(backend).readOnly().setUsePool(poolUsed).setPool(pool).build();
|
||||
}
|
||||
|
||||
private static String format(String s, int length) {
|
||||
StringBuilder b = new StringBuilder(s);
|
||||
for (int i = 0; i < length - s.length(); i++) {
|
||||
@@ -898,4 +1129,46 @@ public class DataProcessor {
|
||||
return b.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void setEndTime(long time) {
|
||||
this.tEnd = time;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public long getEndTime() {
|
||||
return tEnd;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setStartTime(long time) {
|
||||
this.tStart = time;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public long getStartTime() {
|
||||
return tStart;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void setTimeSpan(long startTime, long endTime) {
|
||||
this.tStart = startTime;
|
||||
this.tEnd = endTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
package org.rrd4j.data;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
|
||||
import org.rrd4j.ConsolFun;
|
||||
import org.rrd4j.core.FetchData;
|
||||
import org.rrd4j.core.RrdBackendFactory;
|
||||
import org.rrd4j.core.Util;
|
||||
|
||||
import java.io.IOException;
|
||||
import org.rrd4j.core.RrdDb;
|
||||
|
||||
class Def extends Source {
|
||||
private final String path;
|
||||
private final URI rrdUri;
|
||||
private final String dsName;
|
||||
private final RrdBackendFactory backend;
|
||||
private final ConsolFun consolFun;
|
||||
@@ -20,34 +21,26 @@ class Def extends Source {
|
||||
|
||||
Def(String name, String dsName, FetchData fetchData) {
|
||||
this(name,
|
||||
fetchData.getRequest().getParentDb().getPath(),
|
||||
fetchData.getRequest().getParentDb().getCanonicalUri(),
|
||||
dsName, fetchData.getRequest().getConsolFun(),
|
||||
fetchData.getRequest().getParentDb().getRrdBackend().getFactory()
|
||||
);
|
||||
this.fetchData = fetchData;
|
||||
}
|
||||
|
||||
Def(String name, String path, String dsName, ConsolFun consolFunc) {
|
||||
this(name, path, dsName, consolFunc, null);
|
||||
}
|
||||
|
||||
Def(String name, String path, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) {
|
||||
Def(String name, URI rrdUri, String dsName, ConsolFun consolFunc, RrdBackendFactory backend) {
|
||||
super(name);
|
||||
this.path = path;
|
||||
this.rrdUri = backend.getCanonicalUri(rrdUri);
|
||||
this.dsName = dsName;
|
||||
this.consolFun = consolFunc;
|
||||
this.backend = backend;
|
||||
}
|
||||
|
||||
String getPath() {
|
||||
return path;
|
||||
URI getCanonicalUri() throws IOException {
|
||||
return rrdUri;
|
||||
}
|
||||
|
||||
String getCanonicalPath() throws IOException {
|
||||
return Util.getCanonicalPath(path);
|
||||
}
|
||||
|
||||
String getDsName() {
|
||||
String getDsName() {
|
||||
return dsName;
|
||||
}
|
||||
|
||||
@@ -60,12 +53,16 @@ class Def extends Source {
|
||||
}
|
||||
|
||||
boolean isCompatibleWith(Def def) throws IOException {
|
||||
return getCanonicalPath().equals(def.getCanonicalPath()) &&
|
||||
return getCanonicalUri().equals(def.getCanonicalUri()) &&
|
||||
getConsolFun() == def.consolFun &&
|
||||
((backend == null && def.backend == null) ||
|
||||
(backend != null && def.backend != null && backend.equals(def.backend)));
|
||||
}
|
||||
|
||||
RrdDb getRrdDb() {
|
||||
return fetchData.getRequest().getParentDb();
|
||||
}
|
||||
|
||||
void setFetchData(FetchData fetchData) {
|
||||
this.fetchData = fetchData;
|
||||
}
|
||||
|
||||
20
apps/jrobin/java/src/org/rrd4j/data/IPlottable.java
Normal file
20
apps/jrobin/java/src/org/rrd4j/data/IPlottable.java
Normal file
@@ -0,0 +1,20 @@
|
||||
package org.rrd4j.data;
|
||||
|
||||
/**
|
||||
* Interface to be used for custom datasources.
|
||||
*
|
||||
* <p>If you wish to use a custom datasource in a graph, you should create a class implementing this interface
|
||||
* that represents that datasource, and then pass this class on to the RrdGraphDef.</p>
|
||||
* @since 3.7
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface IPlottable {
|
||||
/**
|
||||
* Retrieves datapoint value based on a given timestamp.
|
||||
* Use this method if you only have one series of data in this class.
|
||||
*
|
||||
* @param timestamp Timestamp in seconds for the datapoint.
|
||||
* @return Double value of the datapoint.
|
||||
*/
|
||||
public double getValue(long timestamp);
|
||||
}
|
||||
@@ -15,6 +15,7 @@ import java.util.Date;
|
||||
* Interpolation method handles NaN datasource
|
||||
* values gracefully.</p>
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public class LinearInterpolator extends Plottable {
|
||||
|
||||
/**
|
||||
|
||||
@@ -64,4 +64,3 @@ class Normalizer {
|
||||
return values;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
package org.rrd4j.data;
|
||||
|
||||
class PDef extends Source implements NonRrdSource {
|
||||
private final Plottable plottable;
|
||||
private final IPlottable plottable;
|
||||
|
||||
PDef(String name, Plottable plottable) {
|
||||
PDef(String name, IPlottable plottable2) {
|
||||
super(name);
|
||||
this.plottable = plottable;
|
||||
this.plottable = plottable2;
|
||||
}
|
||||
|
||||
/** {@inheritDoc} */
|
||||
|
||||
@@ -5,8 +5,10 @@ package org.rrd4j.data;
|
||||
*
|
||||
* <p>If you wish to use a custom datasource in a graph, you should create a class implementing this interface
|
||||
* that represents that datasource, and then pass this class on to the RrdGraphDef.</p>
|
||||
* @deprecated use implementations of {@link IPlottable} instead
|
||||
*/
|
||||
public abstract class Plottable {
|
||||
@Deprecated
|
||||
public abstract class Plottable implements IPlottable {
|
||||
/**
|
||||
* Retrieves datapoint value based on a given timestamp.
|
||||
* Use this method if you only have one series of data in this class.
|
||||
@@ -14,7 +16,5 @@ public abstract class Plottable {
|
||||
* @param timestamp Timestamp in seconds for the datapoint.
|
||||
* @return Double value of the datapoint.
|
||||
*/
|
||||
public double getValue(long timestamp) {
|
||||
return Double.NaN;
|
||||
}
|
||||
public abstract double getValue(long timestamp);
|
||||
}
|
||||
|
||||
@@ -26,6 +26,10 @@ public abstract class Variable {
|
||||
this.value = value;
|
||||
this.timestamp = timestamp;
|
||||
}
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Value [value=" + value + ", timestamp=" + timestamp + "]";
|
||||
}
|
||||
};
|
||||
|
||||
public static final Value INVALIDVALUE = new Value(0, Double.NaN);
|
||||
@@ -33,7 +37,7 @@ public abstract class Variable {
|
||||
private Value val = null;
|
||||
|
||||
/**
|
||||
* Used to calculate the needed value from a source, this method call fill.
|
||||
* Used to calculate the needed value from a source, this method call the abstract method {@link #fill(long[], double[], long, long)}.
|
||||
* @param s
|
||||
* @param start
|
||||
* @param end
|
||||
@@ -44,8 +48,8 @@ public abstract class Variable {
|
||||
int last = -1;
|
||||
// Iterate over array, stop then end cursor reach start or when both start and end has been found
|
||||
// It also stop if cursor cross other side boundary
|
||||
for(int i = 0, j = s.timestamps.length - 1 ; ( last == -1 && j > first ) || ( first == -1 && ( last == -1 || i < last ) ) ; i++, j--) {
|
||||
if(first == -1) {
|
||||
for (int i = 0, j = s.timestamps.length - 1 ; i < s.timestamps.length && j >= 0 ; i++, j--) {
|
||||
if (first == -1) {
|
||||
long leftdown = Math.max(s.timestamps[i] - step, start);
|
||||
long rightdown = Math.min(s.timestamps[i], end);
|
||||
if(rightdown > leftdown) {
|
||||
@@ -53,34 +57,35 @@ public abstract class Variable {
|
||||
}
|
||||
}
|
||||
|
||||
if(last == -1) {
|
||||
if (last == -1) {
|
||||
long leftup = Math.max(s.timestamps[j] - step, start);
|
||||
long rightup = Math.min(s.timestamps[j], end);
|
||||
if(rightup > leftup ) {
|
||||
if (rightup > leftup ) {
|
||||
last = j;
|
||||
}
|
||||
}
|
||||
if ((( last != -1 || j <= first ) && ( first != -1 || ( last != -1 && i >= last )))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( first == -1 || last == -1) {
|
||||
throw new RuntimeException("Invalid range");
|
||||
}
|
||||
if(s instanceof VDef) {
|
||||
if (first == -1 || last == -1) {
|
||||
val = INVALIDVALUE;
|
||||
} else if (s instanceof VDef) {
|
||||
// Already a variable, just check if it fits
|
||||
Value v = ((VDef) s).getValue();
|
||||
// No time stamp, or not time stamped value, keep it
|
||||
if(v.timestamp == 0) {
|
||||
if (v.timestamp == 0) {
|
||||
val = v;
|
||||
}
|
||||
else {
|
||||
if(v.timestamp < end && v.timestamp > start) {
|
||||
if (v.timestamp < end && v.timestamp > start) {
|
||||
val = v;
|
||||
}
|
||||
else {
|
||||
val = new Value(0, Double.NaN);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
long[] timestamps = new long[ last - first + 1];
|
||||
System.arraycopy(s.timestamps, first, timestamps, 0, timestamps.length);
|
||||
double[] values = new double[ last - first + 1];
|
||||
@@ -115,8 +120,8 @@ public abstract class Variable {
|
||||
public static class FIRST extends Variable {
|
||||
@Override
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
for(int i = 0; i < values.length; i++) {
|
||||
if( timestamps[i] > start && timestamps[i] < end && ! Double.isNaN(values[i])) {
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
if (timestamps[i] > start && timestamps[i] < end && ! Double.isNaN(values[i])) {
|
||||
return new Value(timestamps[i], values[i]);
|
||||
}
|
||||
}
|
||||
@@ -131,8 +136,8 @@ public abstract class Variable {
|
||||
public static class LAST extends Variable {
|
||||
@Override
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
for(int i = values.length - 1 ; i >=0 ; i--) {
|
||||
if( ! Double.isNaN(values[i]) ) {
|
||||
for (int i = values.length - 1 ; i >=0 ; i--) {
|
||||
if (! Double.isNaN(values[i]) ) {
|
||||
return new Value(timestamps[i], values[i]);
|
||||
}
|
||||
}
|
||||
@@ -149,11 +154,11 @@ public abstract class Variable {
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
long timestamp = 0;
|
||||
double value = Double.NaN;
|
||||
for(int i = values.length -1 ; i >=0 ; i--) {
|
||||
if(! Double.isNaN(values[i]) && Double.isNaN(value)) {
|
||||
for (int i = values.length -1 ; i >=0 ; i--) {
|
||||
if (! Double.isNaN(values[i]) && Double.isNaN(value)) {
|
||||
timestamp = timestamps[i];
|
||||
value = values[i];
|
||||
} else if( ! Double.isNaN(values[i]) && value > values[i]) {
|
||||
} else if ( ! Double.isNaN(values[i]) && value > values[i]) {
|
||||
timestamp = timestamps[i];
|
||||
value = values[i];
|
||||
}
|
||||
@@ -171,11 +176,11 @@ public abstract class Variable {
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
long timestamp = 0;
|
||||
double value = Double.NaN;
|
||||
for(int i = values.length -1 ; i >=0 ; i--) {
|
||||
if(! Double.isNaN(values[i]) && Double.isNaN(value)) {
|
||||
for (int i = values.length -1 ; i >=0 ; i--) {
|
||||
if (! Double.isNaN(values[i]) && Double.isNaN(value)) {
|
||||
timestamp = timestamps[i];
|
||||
value = values[i];
|
||||
} else if(!Double.isNaN(values[i]) && value < values[i]) {
|
||||
} else if (!Double.isNaN(values[i]) && value < values[i]) {
|
||||
timestamp = timestamps[i];
|
||||
value = values[i];
|
||||
}
|
||||
@@ -193,7 +198,7 @@ public abstract class Variable {
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
double value = Double.NaN;
|
||||
|
||||
for(double tempVal: values) {
|
||||
for (double tempVal: values) {
|
||||
value = Util.sum(value, tempVal);
|
||||
}
|
||||
return new Value(0, value * (timestamps[1] - timestamps[0]) );
|
||||
@@ -217,8 +222,7 @@ public abstract class Variable {
|
||||
}
|
||||
if (! Double.isNaN(value) && count > 0) {
|
||||
value = value / count;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
value = Double.NaN;
|
||||
}
|
||||
return new Value(0, value);
|
||||
@@ -237,21 +241,20 @@ public abstract class Variable {
|
||||
double M = 0.0;
|
||||
double S = 0.0;
|
||||
// See Knuth TAOCP vol 2, 3rd edition, page 232 and http://www.johndcook.com/standard_deviation.html
|
||||
for(double cursVal: values) {
|
||||
if(Double.isNaN(cursVal))
|
||||
for (double cursVal: values) {
|
||||
if (Double.isNaN(cursVal))
|
||||
continue;
|
||||
count++;
|
||||
if(count == 1) {
|
||||
if (count == 1) {
|
||||
M = cursVal;
|
||||
S = 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
double dM = cursVal - M;
|
||||
M += dM/count;
|
||||
S += dM * (cursVal - M);
|
||||
}
|
||||
}
|
||||
if(count > 1) {
|
||||
if (count > 1) {
|
||||
value = Math.sqrt( S/(count - 1) );
|
||||
}
|
||||
return new Value(0, value);
|
||||
@@ -303,9 +306,9 @@ public abstract class Variable {
|
||||
static final class ComparPercentElemen implements Comparator<PercentElem>, Serializable {
|
||||
@Override
|
||||
public final int compare(PercentElem arg0, PercentElem arg1) {
|
||||
if(Double.isNaN(arg0.value) && Double.isNaN(arg1.value))
|
||||
if (Double.isNaN(arg0.value) && Double.isNaN(arg1.value))
|
||||
return Long.signum(arg0.timestamp - arg1.timestamp);
|
||||
else if(Double.isNaN(arg0.value))
|
||||
else if (Double.isNaN(arg0.value))
|
||||
return -1;
|
||||
else if (Double.isNaN(arg1.value))
|
||||
return +1;
|
||||
@@ -344,12 +347,12 @@ public abstract class Variable {
|
||||
protected Value fill(long[] timestamps, double[] values, long start, long end) {
|
||||
// valuesSet will be a set with NaN packet at the start
|
||||
SortedSet<PercentElem> valuesSet = new TreeSet<PercentElem>(new ComparPercentElemen());
|
||||
for(int i = 0 ; i < values.length ; i++) {
|
||||
for (int i = 0 ; i < values.length ; i++) {
|
||||
valuesSet.add(new PercentElem(i, timestamps[i], values[i]));
|
||||
}
|
||||
|
||||
//If not with nan, just drop all nan (inferior to min value)
|
||||
if( ! withNaN) {
|
||||
if (! withNaN) {
|
||||
valuesSet = valuesSet.tailSet(new PercentElem(0, 0, Double.NEGATIVE_INFINITY ));
|
||||
}
|
||||
|
||||
@@ -435,7 +438,7 @@ public abstract class Variable {
|
||||
double lslslope;
|
||||
double lslint;
|
||||
|
||||
for(int i = 0; i < values.length; i++) {
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
double value = values[i];
|
||||
|
||||
if (!Double.isNaN(value)) {
|
||||
@@ -449,7 +452,7 @@ public abstract class Variable {
|
||||
lslstep++;
|
||||
}
|
||||
double divisor = (SUMx * SUMx - cnt * SUMxx);
|
||||
if(cnt > 0 && divisor != 0) {
|
||||
if (cnt > 0 && divisor != 0) {
|
||||
/* Bestfit line by linear least squares method */
|
||||
lslslope = (SUMx * SUMy - cnt * SUMxy) / divisor;
|
||||
lslint = (SUMy - lslslope * SUMx) / cnt;
|
||||
@@ -478,7 +481,7 @@ public abstract class Variable {
|
||||
double SUMyy = 0.0;
|
||||
double lslcorrel;
|
||||
|
||||
for(int i = 0; i < values.length; i++) {
|
||||
for (int i = 0; i < values.length; i++) {
|
||||
double value = values[i];
|
||||
|
||||
if (!Double.isNaN(value)) {
|
||||
@@ -492,7 +495,7 @@ public abstract class Variable {
|
||||
}
|
||||
lslstep++;
|
||||
}
|
||||
if(cnt > 0) {
|
||||
if (cnt > 0) {
|
||||
/* Bestfit line by linear least squares method */
|
||||
lslcorrel =
|
||||
(SUMxy - (SUMx * SUMy) / cnt) /
|
||||
|
||||
@@ -11,6 +11,6 @@ class CDef extends Source {
|
||||
}
|
||||
|
||||
void requestData(DataProcessor dproc) {
|
||||
dproc.addDatasource(name, rpnExpression);
|
||||
dproc.datasource(name, rpnExpression);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,42 +1,29 @@
|
||||
package org.rrd4j.graph;
|
||||
|
||||
import org.rrd4j.data.DataProcessor;
|
||||
|
||||
import java.net.URI;
|
||||
|
||||
import org.rrd4j.ConsolFun;
|
||||
import org.rrd4j.core.RrdBackendFactory;
|
||||
|
||||
class Def extends Source {
|
||||
private final String rrdPath, dsName;
|
||||
|
||||
private final URI rrdUri;
|
||||
private final String dsName;
|
||||
private final RrdBackendFactory backend;
|
||||
|
||||
private final ConsolFun consolFun;
|
||||
|
||||
Def(String name, String rrdPath, String dsName, ConsolFun consolFun) {
|
||||
this(name, rrdPath, dsName, consolFun, (RrdBackendFactory)null);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
Def(String name, String rrdPath, String dsName, ConsolFun consolFun, String backend) {
|
||||
Def(String name, URI rrdUri, String dsName, ConsolFun consolFun, RrdBackendFactory backend) {
|
||||
super(name);
|
||||
this.rrdPath = rrdPath;
|
||||
this.dsName = dsName;
|
||||
this.consolFun = consolFun;
|
||||
this.backend = RrdBackendFactory.getFactory(backend);
|
||||
}
|
||||
|
||||
Def(String name, String rrdPath, String dsName, ConsolFun consolFun, RrdBackendFactory backend) {
|
||||
super(name);
|
||||
this.rrdPath = rrdPath;
|
||||
this.rrdUri = rrdUri;
|
||||
this.dsName = dsName;
|
||||
this.consolFun = consolFun;
|
||||
this.backend = backend;
|
||||
}
|
||||
|
||||
void requestData(DataProcessor dproc) {
|
||||
if (backend == null) {
|
||||
dproc.addDatasource(name, rrdPath, dsName, consolFun);
|
||||
}
|
||||
else {
|
||||
dproc.addDatasource(name, rrdPath, dsName, consolFun, backend);
|
||||
}
|
||||
dproc.datasource(name, rrdUri, dsName, consolFun, backend);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
package org.rrd4j.graph;
|
||||
|
||||
import org.rrd4j.data.DataProcessor;
|
||||
import org.rrd4j.data.Plottable;
|
||||
import org.rrd4j.data.IPlottable;
|
||||
|
||||
class PDef extends Source {
|
||||
private Plottable plottable;
|
||||
private IPlottable plottable;
|
||||
|
||||
PDef(String name, Plottable plottable) {
|
||||
PDef(String name, IPlottable plottable) {
|
||||
super(name);
|
||||
this.plottable = plottable;
|
||||
}
|
||||
|
||||
void requestData(DataProcessor dproc) {
|
||||
dproc.addDatasource(name, plottable);
|
||||
dproc.datasource(name, plottable);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ class PrintText extends CommentText {
|
||||
resolvedText = String.format(l, resolvedText, c);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("can't format '" + resolvedText + "'", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
resolvedText = "-";
|
||||
|
||||
@@ -23,13 +23,18 @@ import org.rrd4j.graph.DownSampler.DataSet;
|
||||
*/
|
||||
public class RrdGraph implements RrdGraphConstants {
|
||||
private static final double[] SENSIBLE_VALUES = {
|
||||
1000.0, 900.0, 800.0, 750.0, 700.0, 600.0, 500.0, 400.0, 300.0, 250.0, 200.0, 125.0, 100.0,
|
||||
90.0, 80.0, 75.0, 70.0, 60.0, 50.0, 40.0, 30.0, 25.0, 20.0, 10.0,
|
||||
9.0, 8.0, 7.0, 6.0, 5.0, 4.0, 3.5, 3.0, 2.5, 2.0, 1.8, 1.5, 1.2, 1.0,
|
||||
1000.0, 900.0, 800.0, 750.0, 700.0,
|
||||
600.0, 500.0, 400.0, 300.0, 250.0,
|
||||
200.0, 125.0, 100.0, 90.0, 80.0,
|
||||
75.0, 70.0, 60.0, 50.0, 40.0, 30.0,
|
||||
25.0, 20.0, 10.0, 9.0, 8.0,
|
||||
7.0, 6.0, 5.0, 4.0, 3.5, 3.0,
|
||||
2.5, 2.0, 1.8, 1.5, 1.2, 1.0,
|
||||
0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0, -1
|
||||
};
|
||||
|
||||
private static final char[] SYMBOLS = {'a', 'f', 'p', 'n', 'µ', 'm', ' ', 'k', 'M', 'G', 'T', 'P', 'E'};
|
||||
private static final int SYMBOLS_CENTER = 8;
|
||||
private static final char[] SYMBOLS = {'y', 'z', 'a', 'f', 'p', 'n', 'µ', 'm', ' ', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'};
|
||||
|
||||
final RrdGraphDef gdef;
|
||||
final ImageParameters im;
|
||||
@@ -122,13 +127,14 @@ public class RrdGraph implements RrdGraphConstants {
|
||||
fetchData();
|
||||
resolveTextElements();
|
||||
if (gdef.shouldPlot() && !lazy) {
|
||||
initializeLimits();
|
||||
calculatePlotValues();
|
||||
findMinMaxValues();
|
||||
identifySiUnit();
|
||||
expandValueRange();
|
||||
removeOutOfRangeRules();
|
||||
removeOutOfRangeSpans();
|
||||
initializeLimits();
|
||||
mapper = new Mapper(this);
|
||||
placeLegends();
|
||||
createImageWorker();
|
||||
drawBackground();
|
||||
@@ -436,8 +442,6 @@ public class RrdGraph implements RrdGraphConstants {
|
||||
im.yorigin = PADDING_TOP + im.ysize;
|
||||
}
|
||||
|
||||
mapper = new Mapper(this);
|
||||
|
||||
if (!gdef.onlyGraph && gdef.title != null) {
|
||||
im.yorigin += getFontHeight(FONTTAG_TITLE) + PADDING_TITLE;
|
||||
}
|
||||
@@ -575,7 +579,6 @@ public class RrdGraph implements RrdGraphConstants {
|
||||
im.unitsexponent = gdef.unitsExponent;
|
||||
im.base = gdef.base;
|
||||
if (!gdef.logarithmic) {
|
||||
int symbcenter = 6;
|
||||
double digits;
|
||||
if (im.unitsexponent != Integer.MAX_VALUE) {
|
||||
digits = Math.floor(im.unitsexponent / 3.0);
|
||||
@@ -584,8 +587,8 @@ public class RrdGraph implements RrdGraphConstants {
|
||||
digits = Math.floor(Math.log(Math.max(Math.abs(im.minval), Math.abs(im.maxval))) / Math.log(im.base));
|
||||
}
|
||||
im.magfact = Math.pow(im.base, digits);
|
||||
if (((digits + symbcenter) < SYMBOLS.length) && ((digits + symbcenter) >= 0)) {
|
||||
im.symbol = SYMBOLS[(int) digits + symbcenter];
|
||||
if (((digits + SYMBOLS_CENTER) < SYMBOLS.length) && ((digits + SYMBOLS_CENTER) >= 0)) {
|
||||
im.symbol = SYMBOLS[(int) digits + SYMBOLS_CENTER];
|
||||
}
|
||||
else {
|
||||
im.symbol = '?';
|
||||
@@ -655,7 +658,11 @@ public class RrdGraph implements RrdGraphConstants {
|
||||
|
||||
private void fetchData() throws IOException {
|
||||
dproc = new DataProcessor(gdef.startTime, gdef.endTime);
|
||||
dproc.setPoolUsed(gdef.poolUsed);
|
||||
dproc.setPixelCount(im.xsize);
|
||||
if (gdef.poolUsed) {
|
||||
dproc.setPoolUsed(gdef.poolUsed);
|
||||
dproc.setPool(gdef.getPool());
|
||||
}
|
||||
dproc.setTimeZone(gdef.tz);
|
||||
if (gdef.step > 0) {
|
||||
dproc.setStep(gdef.step);
|
||||
|
||||
@@ -1,13 +1,39 @@
|
||||
package org.rrd4j.graph;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.BasicStroke;
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.FontFormatException;
|
||||
import java.awt.Stroke;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UncheckedIOException;
|
||||
import java.net.URL;
|
||||
import java.util.Calendar;
|
||||
import java.util.Locale;
|
||||
import java.util.Optional;
|
||||
import java.util.Properties;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* Class to represent various constants used for graphing. No methods are specified.
|
||||
* <p>
|
||||
* The fonts settings can be changed use some on the following properties, sorted by increased priority.
|
||||
* <ol>
|
||||
* <li><code>org.rrd4j.fonts.properties</code></li>
|
||||
* <li><code>org.rrd4j.fonts.properties.url</code></li>
|
||||
* <li><code>org.rrd4j.font.plain</code></li>
|
||||
* <li><code>org.rrd4j.font.bold</code></li>
|
||||
* <li><code>org.rrd4j.font.plain.url</code></li>
|
||||
* <li><code>org.rrd4j.font.bold.url</code></li>
|
||||
* </ol>
|
||||
*
|
||||
* If either <code>org.rrd4j.fonts.properties</code> or <code>org.rrd4j.fonts.properties.url</code> is used, the file provided contains any other property of lower priority .
|
||||
* The last four properties defines directly the plain or bold font. All properties URL related (<code>org.rrd4j.fonts.url</code>, <code>org.rrd4j.font.plain.url</code> and
|
||||
* <code>org.rrd4j.font.bold.url</code>) download data from an URL. They are useful when those data are provided by the file system, defined by the OS.
|
||||
* The others search for the data in the classpath. So it's easy to provided font-pack as a jar that's put before RRD44J's jar.
|
||||
* <p>
|
||||
* The default settings uses <code>org.rrd4j.fonts.properties</code> looking for the file <code>/rrd4jfonts.properties</code> in the classpath.
|
||||
*/
|
||||
public interface RrdGraphConstants {
|
||||
/**
|
||||
@@ -265,10 +291,70 @@ public interface RrdGraphConstants {
|
||||
double DEFAULT_BASE = 1000;
|
||||
|
||||
/**
|
||||
* Font constructor, to use embedded fonts
|
||||
* The file that contains font configuration searched in the class path. The default value is <code>/rrd4jfonts.properties</code>
|
||||
*/
|
||||
public static final String PROPERTYFONTSPROPERTIES = "org.rrd4j.fonts.properties";
|
||||
/**
|
||||
* A possible URL to a configuration file.
|
||||
*/
|
||||
public static final String PROPERTYFONTSURL = "org.rrd4j.fonts.properties.url";
|
||||
/**
|
||||
* The name of the plain font, used to define the {@link #DEFAULT_SMALL_FONT} and the {@link GATOR_FONT}. To be found in the classpath.
|
||||
*/
|
||||
public static final String PROPERTYFONTPLAIN = "org.rrd4j.font.plain";
|
||||
/**
|
||||
* The name of the bold font, used to define the {@link #DEFAULT_LARGE_FONT}. To be found in the classpath.
|
||||
*/
|
||||
public static final String PROPERTYFONTBOLD = "org.rrd4j.font.bold";
|
||||
/**
|
||||
* An URL to the plain font, used to define the {@link #DEFAULT_SMALL_FONT} and the {@link GATOR_FONT}.
|
||||
*/
|
||||
public static final String PROPERTYFONTPLAINURL = "org.rrd4j.font.plain.url";
|
||||
/**
|
||||
* An URL to the bold font, used to define the {@link #DEFAULT_LARGE_FONT}.
|
||||
*/
|
||||
public static final String PROPERTYFONTBOLDURL = "org.rrd4j.font.bold.url";
|
||||
|
||||
/**
|
||||
* Font constructor, to use embedded fonts. Not really useful outside internal use for RRD4J.
|
||||
*/
|
||||
static class FontConstructor {
|
||||
private static final Properties fileProps = new Properties();
|
||||
static {
|
||||
refreshConf();
|
||||
}
|
||||
private FontConstructor() {}
|
||||
|
||||
/**
|
||||
* Used for tests
|
||||
*/
|
||||
static void refreshConf() {
|
||||
fileProps.clear();
|
||||
Optional.ofNullable(System.getProperty(PROPERTYFONTSPROPERTIES, "/rrd4jfonts.properties"))
|
||||
.filter(s -> ! s.isEmpty())
|
||||
.map(RrdGraphConstants.class::getResourceAsStream)
|
||||
.ifPresent(t -> {
|
||||
try {
|
||||
fileProps.load(t);
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
});
|
||||
Optional.ofNullable(System.getProperty(PROPERTYFONTSURL))
|
||||
.filter(s -> ! s.isEmpty())
|
||||
.ifPresent(t -> {
|
||||
try {
|
||||
fileProps.load(new URL(t).openStream());
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
});
|
||||
for (String prop: new String[] {PROPERTYFONTPLAIN, PROPERTYFONTBOLD, PROPERTYFONTPLAINURL, PROPERTYFONTBOLDURL}) {
|
||||
Optional.ofNullable(System.getProperty(prop))
|
||||
.filter(s -> ! s.isEmpty())
|
||||
.ifPresent(s -> fileProps.put(prop, s));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the default RRD4J's default font for the given strength
|
||||
@@ -278,14 +364,22 @@ public interface RrdGraphConstants {
|
||||
*/
|
||||
public static Font getFont(int type, int size) {
|
||||
/*
|
||||
String fontPath;
|
||||
if (type == Font.BOLD)
|
||||
fontPath = "/DejaVuSansMono-Bold.ttf";
|
||||
else
|
||||
fontPath = "/DejaVuSansMono.ttf";
|
||||
|
||||
try (InputStream fontstream = RrdGraphConstants.class.getResourceAsStream(fontPath)) {
|
||||
return Font.createFont(Font.TRUETYPE_FONT, fontstream).deriveFont(type == Font.BOLD ? Font.BOLD : Font.PLAIN, size);
|
||||
Function<String, InputStream> fontStream = null;
|
||||
String fontPath = fileProps.getProperty(type == Font.BOLD ? PROPERTYFONTBOLDURL : PROPERTYFONTPLAINURL);
|
||||
if (fontPath!= null) {
|
||||
fontStream = s -> {
|
||||
try {
|
||||
return new URL(s).openStream();
|
||||
} catch (IOException e) {
|
||||
throw new UncheckedIOException(e);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
fontPath = fileProps.getProperty(type == Font.BOLD ? PROPERTYFONTBOLD : PROPERTYFONTPLAIN);
|
||||
fontStream = RrdGraphConstants.class::getResourceAsStream;
|
||||
}
|
||||
try (InputStream fontstream = fontStream.apply(fontPath)) {
|
||||
return Font.createFont(Font.TRUETYPE_FONT, fontstream).deriveFont((float)size);
|
||||
} catch (FontFormatException | IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,10 @@ import java.awt.Stroke;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.time.Instant;
|
||||
import java.time.temporal.TemporalAmount;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
@@ -17,11 +20,13 @@ import java.util.TimeZone;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.rrd4j.ConsolFun;
|
||||
import org.rrd4j.core.DataHolder;
|
||||
import org.rrd4j.core.FetchData;
|
||||
import org.rrd4j.core.RrdBackendFactory;
|
||||
import org.rrd4j.core.RrdDbPool;
|
||||
import org.rrd4j.core.Util;
|
||||
import org.rrd4j.data.DataProcessor;
|
||||
import org.rrd4j.data.Plottable;
|
||||
import org.rrd4j.data.IPlottable;
|
||||
import org.rrd4j.data.Variable;
|
||||
|
||||
/**
|
||||
@@ -52,7 +57,7 @@ import org.rrd4j.data.Variable;
|
||||
* without forcing a newline, you can use the special tag \J at the end of
|
||||
* the string to disable the auto justification.</p>
|
||||
*/
|
||||
public class RrdGraphDef implements RrdGraphConstants {
|
||||
public class RrdGraphDef implements RrdGraphConstants, DataHolder {
|
||||
|
||||
/**
|
||||
* <p>Implementations of this class can be used to generate image than can be
|
||||
@@ -96,7 +101,8 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
}
|
||||
}
|
||||
|
||||
boolean poolUsed = false; // ok
|
||||
boolean poolUsed = DEFAULT_POOL_USAGE_POLICY;
|
||||
private RrdDbPool pool = null;
|
||||
boolean antiAliasing = false; // ok
|
||||
boolean textAntiAliasing = false; // ok
|
||||
String filename = RrdGraphConstants.IN_MEMORY_IMAGE; // ok
|
||||
@@ -173,17 +179,47 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
/**
|
||||
* Creates RrdGraphDef object and sets default time span (default ending time is 'now',
|
||||
* default starting time is 'end-1day'.
|
||||
* @deprecated Uses default value that will be probably overriden.
|
||||
*/
|
||||
@Deprecated
|
||||
public RrdGraphDef() {
|
||||
setTimeSpan(Util.getTimestamps(DEFAULT_START, DEFAULT_END));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates RrdGraphDef object.
|
||||
* @since 3.7
|
||||
*/
|
||||
public RrdGraphDef(long t1, long t2) {
|
||||
if ((t1 < t2 && t1 > 0 && t2 > 0) || (t1 > 0 && t2 == 0)) {
|
||||
this.startTime = t1;
|
||||
this.endTime = t2;
|
||||
}
|
||||
else {
|
||||
throw new IllegalArgumentException("Invalid timestamps specified: " + t1 + ", " + t2);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new DataProcessor object for the given time duration. The given duration will be
|
||||
* substracted from current time.
|
||||
*
|
||||
* @param d duration to substract.
|
||||
* @since 3.7
|
||||
*/
|
||||
public RrdGraphDef(TemporalAmount d) {
|
||||
Instant now = Instant.now();
|
||||
this.endTime = now.getEpochSecond();
|
||||
this.startTime = now.minus(d).getEpochSecond();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the time when the graph should begin. Time in seconds since epoch
|
||||
* (1970-01-01) is required. Negative numbers are relative to the current time.
|
||||
*
|
||||
* @param time Starting time for the graph in seconds since epoch
|
||||
*/
|
||||
@Override
|
||||
public void setStartTime(long time) {
|
||||
this.startTime = time;
|
||||
if (time <= 0) {
|
||||
@@ -197,6 +233,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*
|
||||
* @param time Ending time for the graph in seconds since epoch
|
||||
*/
|
||||
@Override
|
||||
public void setEndTime(long time) {
|
||||
this.endTime = time;
|
||||
if (time <= 0) {
|
||||
@@ -211,6 +248,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param startTime Starting time in seconds since epoch
|
||||
* @param endTime Ending time in seconds since epoch
|
||||
*/
|
||||
@Override
|
||||
public void setTimeSpan(long startTime, long endTime) {
|
||||
setStartTime(startTime);
|
||||
setEndTime(endTime);
|
||||
@@ -234,10 +272,36 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*
|
||||
* @param poolUsed true, if RrdDbPool class should be used. False otherwise.
|
||||
*/
|
||||
@Override
|
||||
public void setPoolUsed(boolean poolUsed) {
|
||||
this.poolUsed = poolUsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public boolean isPoolUsed() {
|
||||
return poolUsed;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public RrdDbPool getPool() {
|
||||
return pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void setPool(RrdDbPool pool) {
|
||||
this.poolUsed = true;
|
||||
this.pool = pool;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the name of the graph to generate. Since Rrd4j outputs GIFs, PNGs,
|
||||
* and JPEGs it's recommended that the filename end in either .gif,
|
||||
@@ -781,6 +845,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*
|
||||
* @param step Desired time step (don't use this method if you don't know what you're doing).
|
||||
*/
|
||||
@Override
|
||||
public void setStep(long step) {
|
||||
this.step = step;
|
||||
}
|
||||
@@ -821,7 +886,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* font is selected.
|
||||
*
|
||||
* @param smallFont Default font for graphing. Use only monospaced fonts.
|
||||
* @deprecated Use {@link Variable} based method instead.
|
||||
* @deprecated Use {@link FontTag} based method instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setSmallFont(final Font smallFont) {
|
||||
@@ -832,7 +897,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* Sets title font.
|
||||
*
|
||||
* @param largeFont Font to be used for graph title.
|
||||
* @deprecated Use {@link Variable} based method instead.
|
||||
* @deprecated Use {@link FontTag} based method instead.
|
||||
*/
|
||||
@Deprecated
|
||||
public void setLargeFont(final Font largeFont) {
|
||||
@@ -948,8 +1013,27 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String rrdPath, String dsName, ConsolFun consolFun) {
|
||||
sources.add(new Def(name, rrdPath, dsName, consolFun));
|
||||
RrdBackendFactory factory = RrdBackendFactory.getDefaultFactory();
|
||||
sources.add(new Def(name, factory.getUri(rrdPath), dsName, consolFun, factory));
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)} or
|
||||
* {@link #gprint(String, ConsolFun, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdUri URI to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, URI rrdUri, String dsName,
|
||||
ConsolFun consolFun) {
|
||||
sources.add(new Def(name, rrdUri, dsName, consolFun, RrdBackendFactory.findFactory(rrdUri)));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -967,7 +1051,8 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*/
|
||||
@Deprecated
|
||||
public void datasource(String name, String rrdPath, String dsName, ConsolFun consolFun, String backend) {
|
||||
sources.add(new Def(name, rrdPath, dsName, consolFun, RrdBackendFactory.getFactory(backend)));
|
||||
RrdBackendFactory factory = RrdBackendFactory.getFactory(backend);
|
||||
sources.add(new Def(name, factory.getUri(rrdPath), dsName, consolFun, factory));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -981,8 +1066,27 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
* @param backend Backend to be used while fetching data from a RRD file.
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String rrdPath, String dsName, ConsolFun consolFun, RrdBackendFactory backend) {
|
||||
sources.add(new Def(name, rrdPath, dsName, consolFun, backend));
|
||||
sources.add(new Def(name, backend.getUri(rrdPath), dsName, consolFun, backend));
|
||||
}
|
||||
|
||||
/**
|
||||
* Defines virtual datasource. This datasource can then be used
|
||||
* in other methods like {@link #datasource(String, String)} or
|
||||
* {@link #gprint(String, ConsolFun, String)}.
|
||||
*
|
||||
* @param name Source name
|
||||
* @param rrdUri Path to RRD file
|
||||
* @param dsName Datasource name in the specified RRD file
|
||||
* @param consolFun Consolidation function (AVERAGE, MIN, MAX, LAST)
|
||||
* @param backend Backend to be used while fetching data from a RRD file.
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, URI rrdUri, String dsName,
|
||||
ConsolFun consolFun, RrdBackendFactory backend) {
|
||||
sources.add(new Def(name, rrdUri, dsName, consolFun, backend));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -992,6 +1096,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param name Source name
|
||||
* @param rpnExpression RPN expression.
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String rpnExpression) {
|
||||
sources.add(new CDef(name, rpnExpression));
|
||||
}
|
||||
@@ -1010,6 +1115,19 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
datasource(name, defName, consolFun.getVariable());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a datasource that performs a variable calculation on an
|
||||
* another named datasource to yield a single combined timestamp/value.
|
||||
*
|
||||
* Requires that the other datasource has already been defined; otherwise, it'll
|
||||
* end up with no data
|
||||
*
|
||||
* @param name - the new virtual datasource name
|
||||
* @param defName - the datasource from which to extract the percentile. Must be a previously
|
||||
* defined virtual datasource
|
||||
* @param var - a new instance of a Variable used to do the calculation
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String defName, Variable var) {
|
||||
sources.add(new VDef(name, defName, var));
|
||||
}
|
||||
@@ -1020,8 +1138,10 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*
|
||||
* @param name Source name.
|
||||
* @param plottable Plottable object.
|
||||
* @since 3.7
|
||||
*/
|
||||
public void datasource(String name, Plottable plottable) {
|
||||
@Override
|
||||
public void datasource(String name, IPlottable plottable) {
|
||||
sources.add(new PDef(name, plottable));
|
||||
}
|
||||
|
||||
@@ -1032,6 +1152,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param name Source name.
|
||||
* @param fetchData FetchData object.
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, FetchData fetchData) {
|
||||
sources.add(new TDef(name, name, fetchData));
|
||||
}
|
||||
@@ -1045,6 +1166,7 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
* @param dsName Source name in fetchData.
|
||||
* @param fetchData FetchData object.
|
||||
*/
|
||||
@Override
|
||||
public void datasource(String name, String dsName, FetchData fetchData) {
|
||||
sources.add(new TDef(name, dsName, fetchData));
|
||||
}
|
||||
@@ -1723,10 +1845,19 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
*
|
||||
* @param tz the time zone to set
|
||||
*/
|
||||
@Override
|
||||
public void setTimeZone(TimeZone tz) {
|
||||
this.tz = tz;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public TimeZone getTimeZone() {
|
||||
return this.tz;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the Stroke used to draw grid
|
||||
*
|
||||
@@ -1784,4 +1915,28 @@ public class RrdGraphDef implements RrdGraphConstants {
|
||||
return colors[element.ordinal()];
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public long getEndTime() {
|
||||
return this.endTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public long getStartTime() {
|
||||
return this.startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 3.7
|
||||
*/
|
||||
@Override
|
||||
public long getStep() {
|
||||
return this.step;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ class TDef extends Source {
|
||||
|
||||
@Override
|
||||
void requestData(DataProcessor dproc) {
|
||||
dproc.addDatasource(name, dsName, fetchData);
|
||||
dproc.datasource(name, dsName, fetchData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class VDef extends Source {
|
||||
}
|
||||
|
||||
void requestData(DataProcessor dproc) {
|
||||
dproc.addDatasource(name, defName, var);
|
||||
dproc.datasource(name, defName, var);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -5,19 +5,20 @@
|
||||
#
|
||||
# Translators:
|
||||
# A5h8d0wf0x <littleslyfoxie28@gmail.com>, 2014
|
||||
# slrslr, 2021
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-03-29 14:30+0000\n"
|
||||
"PO-Revision-Date: 2017-06-30 21:32+0000\n"
|
||||
"Last-Translator: kytv <killyourtv@i2pmail.org>\n"
|
||||
"PO-Revision-Date: 2021-07-08 12:50+0000\n"
|
||||
"Last-Translator: slrslr\n"
|
||||
"Language-Team: Czech (http://www.transifex.com/otf/I2P/language/cs/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: cs\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:69
|
||||
msgid "Message timeout"
|
||||
@@ -42,53 +43,53 @@ msgstr "Schůze uzavřena"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:84
|
||||
msgid "Invalid message"
|
||||
msgstr ""
|
||||
msgstr "Neplatná zpráva"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:87
|
||||
msgid "Invalid message options"
|
||||
msgstr ""
|
||||
msgstr "Neplatné vlastnosti zprávy"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:90
|
||||
msgid "Buffer overflow"
|
||||
msgstr ""
|
||||
msgstr "Přetečení vyrovnávací paměti"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:93
|
||||
msgid "Message expired"
|
||||
msgstr ""
|
||||
msgstr "Zpráva vypršela"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:96
|
||||
msgid "Local lease set invalid"
|
||||
msgstr ""
|
||||
msgstr "Nastavení místního pronájmu je neplatné"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:99
|
||||
msgid "No local tunnels"
|
||||
msgstr ""
|
||||
msgstr "Žádné místní tunely"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:102
|
||||
msgid "Unsupported encryption options"
|
||||
msgstr ""
|
||||
msgstr "Nepodporované vlastnosti šifrování"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:105
|
||||
msgid "Invalid destination"
|
||||
msgstr ""
|
||||
msgstr "Neplatný cíl"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:111
|
||||
msgid "Destination lease set expired"
|
||||
msgstr ""
|
||||
msgstr "Vypršela platnost sady cílového pronájmu"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:114
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
msgstr "Cílová sada pronájmu nebyla nalezena"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:117
|
||||
msgid "Local destination shutdown"
|
||||
msgstr ""
|
||||
msgstr "Vypnutí místního cíle"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:120
|
||||
msgid "Connection was reset"
|
||||
msgstr ""
|
||||
msgstr "Spojení bylo resetováno"
|
||||
|
||||
#. Translate this one here, can't do it later
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:127
|
||||
msgid "Failure code"
|
||||
msgstr ""
|
||||
msgstr "Kód selhání"
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P streaming\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-03-29 14:30+0000\n"
|
||||
"POT-Creation-Date: 2021-08-11 15:33+0000\n"
|
||||
"Language: en\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -75,15 +75,15 @@ msgstr ""
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:117
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:121
|
||||
msgid "Local destination shutdown"
|
||||
msgstr ""
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:120
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:124
|
||||
msgid "Connection was reset"
|
||||
msgstr ""
|
||||
|
||||
#. Translate this one here, can't do it later
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:127
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:131
|
||||
msgid "Failure code"
|
||||
msgstr ""
|
||||
|
||||
@@ -5,13 +5,14 @@
|
||||
#
|
||||
# Translators:
|
||||
# Hunor Paksy <heds@cock.li>, 2018
|
||||
# Nyul Csoki <csokinyul@i2pmail.org>, 2021
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: I2P\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2015-03-29 14:30+0000\n"
|
||||
"PO-Revision-Date: 2018-12-15 20:02+0000\n"
|
||||
"Last-Translator: Hunor Paksy <heds@cock.li>\n"
|
||||
"PO-Revision-Date: 2021-06-20 09:47+0000\n"
|
||||
"Last-Translator: AdminLMH <lehetmashogy@i2pmail.org>\n"
|
||||
"Language-Team: Hungarian (http://www.transifex.com/otf/I2P/language/hu/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -38,7 +39,7 @@ msgstr "Helyi hálózati hiba"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:81
|
||||
msgid "Session closed"
|
||||
msgstr ""
|
||||
msgstr "Munkafázis lezárva"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:84
|
||||
msgid "Invalid message"
|
||||
@@ -58,7 +59,7 @@ msgstr "Üzenet lejárt"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:96
|
||||
msgid "Local lease set invalid"
|
||||
msgstr ""
|
||||
msgstr "Helyi cél névbejegyzés információ érvénytelen"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:99
|
||||
msgid "No local tunnels"
|
||||
@@ -74,11 +75,11 @@ msgstr "Érvénytelen célállomás"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:111
|
||||
msgid "Destination lease set expired"
|
||||
msgstr ""
|
||||
msgstr "Távoli cél névbejegyzés információ lejárt"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:114
|
||||
msgid "Destination lease set not found"
|
||||
msgstr ""
|
||||
msgstr "Úticél kihasználási engedély nem található"
|
||||
|
||||
#: ../java/src/net/i2p/client/streaming/I2PSocketException.java:117
|
||||
msgid "Local destination shutdown"
|
||||
|
||||
@@ -371,6 +371,7 @@
|
||||
<uptodate property="war.uptodate" targetfile="build/routerconsole.war" >
|
||||
<srcfiles dir= "../jsp" excludes="web.xml, web-fragment.xml, *.css, **/*.java, *.jsp, *.jsi" />
|
||||
<srcfiles dir= "build/obj" includes="net/i2p/router/web/helpers/*.class net/i2p/router/web/servlets/*.class" />
|
||||
<srcfiles dir= "../resources" />
|
||||
</uptodate>
|
||||
<condition property="shouldListChanges" >
|
||||
<and>
|
||||
|
||||
@@ -62,6 +62,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
private final Log _log;
|
||||
private final Collection<RegisteredUpdater> _registeredUpdaters;
|
||||
private final Collection<RegisteredChecker> _registeredCheckers;
|
||||
private final Map<Integer, UpdatePostProcessor> _registeredPostProcessors;
|
||||
/** active checking tasks */
|
||||
private final Collection<UpdateTask> _activeCheckers;
|
||||
/** active updating tasks, pointing to the next ones to try */
|
||||
@@ -78,6 +79,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
private volatile ClientAppState _state = UNINITIALIZED;
|
||||
|
||||
private volatile String _status;
|
||||
private volatile boolean _externalRestartPending;
|
||||
|
||||
private static final long DEFAULT_MAX_TIME = 3*60*60*1000L;
|
||||
private static final long DEFAULT_CHECK_TIME = 60*1000;
|
||||
@@ -95,6 +97,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
_log = ctx.logManager().getLog(ConsoleUpdateManager.class);
|
||||
_registeredUpdaters = new ConcurrentHashSet<RegisteredUpdater>();
|
||||
_registeredCheckers = new ConcurrentHashSet<RegisteredChecker>();
|
||||
_registeredPostProcessors = new ConcurrentHashMap<Integer, UpdatePostProcessor>(2);
|
||||
_activeCheckers = new ConcurrentHashSet<UpdateTask>();
|
||||
_downloaders = new ConcurrentHashMap<UpdateTask, List<RegisteredUpdater>>();
|
||||
_available = new ConcurrentHashMap<UpdateItem, VersionAvailable>();
|
||||
@@ -563,6 +566,16 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A router update had been downloaded and handled by an UpdatePostProcessor.
|
||||
* It will provide wrapper-like function to install the update and restart after shutdown.
|
||||
*
|
||||
* @since 0.9.51
|
||||
*/
|
||||
public boolean isExternalRestartPending() {
|
||||
return _externalRestartPending;
|
||||
}
|
||||
|
||||
/**
|
||||
* Install a plugin. Non-blocking.
|
||||
* If returns true, then call isUpdateInProgress() in a loop
|
||||
@@ -756,6 +769,20 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
_log.info("Unregistering " + rc);
|
||||
_registeredCheckers.remove(rc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a post-processor for this UpdateType and SU3File file type.
|
||||
*
|
||||
* @param type only ROUTER_SIGNED_SU3 and ROUTER_DEV_SU3 are currently supported
|
||||
* @param fileType a SU3File TYPE_xxx constant, 1-255, TYPE_ZIP not supported.
|
||||
* @since 0.9.51
|
||||
*/
|
||||
public void register(UpdatePostProcessor upp, UpdateType type, int fileType) {
|
||||
Integer key = Integer.valueOf(type.toString().hashCode() ^ fileType);
|
||||
UpdatePostProcessor old = _registeredPostProcessors.put(key, upp);
|
||||
if (old != null && _log.shouldLog(Log.WARN))
|
||||
_log.warn("Duplicate registration " + upp);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by the Updater, either after check() was called, or it found out on its own.
|
||||
@@ -1102,7 +1129,8 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
_log.info("Updater " + task + " for " + task.getType() + " complete");
|
||||
boolean rv = false;
|
||||
switch (task.getType()) {
|
||||
UpdateType utype = task.getType();
|
||||
switch (utype) {
|
||||
case TYPE_DUMMY:
|
||||
case NEWS:
|
||||
case NEWS_SU3:
|
||||
@@ -1110,13 +1138,13 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
break;
|
||||
|
||||
case ROUTER_SIGNED:
|
||||
rv = handleSudFile(task.getURI(), actualVersion, file);
|
||||
rv = handleRouterFile(task.getURI(), actualVersion, file, utype);
|
||||
if (rv)
|
||||
notifyDownloaded(task.getType(), task.getID(), actualVersion);
|
||||
break;
|
||||
|
||||
case ROUTER_SIGNED_SU3:
|
||||
rv = handleSu3File(task.getURI(), actualVersion, file);
|
||||
rv = handleRouterFile(task.getURI(), actualVersion, file, utype);
|
||||
if (rv)
|
||||
notifyDownloaded(task.getType(), task.getID(), actualVersion);
|
||||
break;
|
||||
@@ -1130,7 +1158,7 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
break;
|
||||
|
||||
case ROUTER_DEV_SU3:
|
||||
rv = handleSu3File(task.getURI(), actualVersion, file);
|
||||
rv = handleRouterFile(task.getURI(), actualVersion, file, utype);
|
||||
if (rv) {
|
||||
_context.router().saveConfig(PROP_DEV_SU3_AVAILABLE, null);
|
||||
notifyDownloaded(task.getType(), task.getID(), actualVersion);
|
||||
@@ -1325,47 +1353,50 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
}
|
||||
|
||||
/**
|
||||
* Process sud, su2, or su3.
|
||||
* Only for router updates.
|
||||
*
|
||||
* @return success
|
||||
*/
|
||||
private boolean handleSudFile(URI uri, String actualVersion, File f) {
|
||||
return handleRouterFile(uri, actualVersion, f, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return success
|
||||
* @since 0.9.9
|
||||
*/
|
||||
private boolean handleSu3File(URI uri, String actualVersion, File f) {
|
||||
return handleRouterFile(uri, actualVersion, f, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Process sud, su2, or su3
|
||||
* @return success
|
||||
* @since 0.9.9
|
||||
*/
|
||||
private boolean handleRouterFile(URI uri, String actualVersion, File f, boolean isSU3) {
|
||||
private boolean handleRouterFile(URI uri, String actualVersion, File f, UpdateType updateType) {
|
||||
boolean isSU3 = updateType == ROUTER_SIGNED_SU3 || updateType == ROUTER_DEV_SU3;
|
||||
String url = uri.toString();
|
||||
updateStatus("<b>" + _t("Update downloaded") + "</b>");
|
||||
File to = new File(_context.getRouterDir(), Router.UPDATE_FILE);
|
||||
String err;
|
||||
String err = null;
|
||||
// Process the file
|
||||
if (isSU3) {
|
||||
SU3File up = new SU3File(_context, f);
|
||||
File temp = new File(_context.getTempDir(), "su3out-" + _context.random().nextLong() + ".zip");
|
||||
File temp = new File(_context.getTempDir(), "su3out-" + _context.random().nextLong());
|
||||
try {
|
||||
if (up.verifyAndMigrate(temp)) {
|
||||
String ver = up.getVersionString();
|
||||
int type = up.getContentType();
|
||||
if (ver == null || VersionComparator.comp(RouterVersion.VERSION, ver) >= 0)
|
||||
if (ver == null || VersionComparator.comp(RouterVersion.VERSION, ver) >= 0) {
|
||||
err = "Old version " + ver;
|
||||
else if (type != SU3File.CONTENT_ROUTER)
|
||||
} else if (type != SU3File.CONTENT_ROUTER) {
|
||||
err = "Bad su3 content type " + type;
|
||||
else if (!FileUtil.copy(temp, to, true, false))
|
||||
err = "Failed copy to " + to;
|
||||
else
|
||||
err = null; // success
|
||||
} else {
|
||||
int ftype = up.getFileType();
|
||||
if (ftype == SU3File.TYPE_ZIP) {
|
||||
// standard update, copy to i2pupdate.zip in config dir
|
||||
if (!FileUtil.copy(temp, to, true, false))
|
||||
err = "Failed copy to " + to;
|
||||
} else if ((ftype == SU3File.TYPE_DMG && SystemVersion.isMac()) ||
|
||||
(ftype == SU3File.TYPE_EXE && SystemVersion.isWindows())) {
|
||||
Integer key = Integer.valueOf(updateType.toString().hashCode() ^ ftype);
|
||||
UpdatePostProcessor upp = _registeredPostProcessors.get(key);
|
||||
if (upp != null) {
|
||||
upp.updateDownloadedandVerified(updateType, ftype, actualVersion, temp);
|
||||
_externalRestartPending = true;
|
||||
} else {
|
||||
err = "Unsupported su3 file type " + ftype;
|
||||
}
|
||||
} else {
|
||||
err = "Unsupported su3 file type " + ftype;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = "Signature failed, signer " + DataHelper.stripHTML(up.getSignerString()) +
|
||||
' ' + up.getSigType();
|
||||
@@ -1406,6 +1437,8 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
}
|
||||
|
||||
/**
|
||||
* Only for router updates
|
||||
*
|
||||
* @param Long.toString(timestamp)
|
||||
* @return success
|
||||
*/
|
||||
@@ -1755,6 +1788,10 @@ public class ConsoleUpdateManager implements UpdateManager, RouterApp {
|
||||
buf.append("<div class=\"debug_container\">");
|
||||
toString(buf, _registeredUpdaters);
|
||||
buf.append("</div>");
|
||||
buf.append("<h3>Registered PostProcessors</h3>");
|
||||
buf.append("<div class=\"debug_container\">");
|
||||
toString(buf, _registeredPostProcessors.values());
|
||||
buf.append("</div>");
|
||||
buf.append("<h3>Active Checkers</h3>");
|
||||
buf.append("<div class=\"debug_container\">");
|
||||
toString(buf, _activeCheckers);
|
||||
|
||||
@@ -25,7 +25,7 @@ class NewsHandler extends UpdateHandler implements Checker {
|
||||
* NOTE: If you change, also change in Android:
|
||||
* app/src/main/java/net/i2p/android/apps/NewsFetcher.java
|
||||
*
|
||||
* @since 0.7.14 not configurable
|
||||
* @since 0.7.14, configurable since 0.9.51
|
||||
*/
|
||||
// psi.i2p
|
||||
//private static final String BACKUP_NEWS_URL = "http://avviiexdngd32ccoy4kuckvc3mkf53ycvzbz6vz75vzhv4tbpk5a.b32.i2p/news.xml";
|
||||
@@ -35,7 +35,8 @@ class NewsHandler extends UpdateHandler implements Checker {
|
||||
//private static final String BACKUP_NEWS_URL_SU3 = "http://ivk5a6wfjar6hjucjmnbcea5inwmwg5b3hsv72x77xwyhbeaajja.b32.i2p/news/news.su3";
|
||||
// idk
|
||||
private static final String BACKUP_NEWS_URL = "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/news.atom.xml";
|
||||
private static final String BACKUP_NEWS_URL_SU3 = "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/news.su3";
|
||||
private static final String DEFAULT_BACKUP_NEWS_URL_SU3 = "http://dn3tvalnjz432qkqsvpfdqrwpqkw3ye4n4i2uyfr4jexvo3sp5ka.b32.i2p/news/news.su3";
|
||||
private static final String PROP_BACKUP_NEWS_URL_SU3 = "router.backupNewsURL";
|
||||
|
||||
public NewsHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
|
||||
super(ctx, mgr);
|
||||
@@ -58,7 +59,7 @@ class NewsHandler extends UpdateHandler implements Checker {
|
||||
} catch (URISyntaxException use) {}
|
||||
try {
|
||||
//updateSources.add(new URI(BACKUP_NEWS_URL));
|
||||
updateSources.add(new URI(BACKUP_NEWS_URL_SU3));
|
||||
updateSources.add(new URI(_context.getProperty(PROP_BACKUP_NEWS_URL_SU3, DEFAULT_BACKUP_NEWS_URL_SU3)));
|
||||
} catch (URISyntaxException use) {}
|
||||
UpdateRunner update = new NewsFetcher(_context, _mgr, updateSources);
|
||||
return update;
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
package net.i2p.router.web;
|
||||
|
||||
import java.text.DateFormat;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
@@ -65,9 +63,6 @@ public class NewsFeedHelper extends HelperBase {
|
||||
}
|
||||
}
|
||||
if (!entries.isEmpty()) {
|
||||
DateFormat fmt = DateFormat.getDateInstance(DateFormat.MEDIUM);
|
||||
// the router sets the JVM time zone to UTC but saves the original here so we can get it
|
||||
fmt.setTimeZone(SystemVersion.getSystemTimeZone(ctx));
|
||||
int i = 0;
|
||||
for (NewsEntry entry : entries) {
|
||||
if (i < start)
|
||||
@@ -77,9 +72,8 @@ public class NewsFeedHelper extends HelperBase {
|
||||
break;
|
||||
buf.append("<div class=\"newsentry\"><h3>");
|
||||
if (entry.updated > 0) {
|
||||
Date date = new Date(entry.updated);
|
||||
buf.append("<span class=\"newsDate\">")
|
||||
.append(fmt.format(date))
|
||||
.append(DataHelper.formatDate(entry.updated))
|
||||
.append("</span> ");
|
||||
}
|
||||
if (entry.link != null)
|
||||
|
||||
@@ -69,6 +69,18 @@ public class NewsHelper extends ContentHelper {
|
||||
mgr.getUpdateAvailable(ROUTER_SIGNED_SU3) != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* A router update had been downloaded and handled by an UpdatePostProcessor.
|
||||
* It will provide wrapper-like function to install the update and restart after shutdown.
|
||||
*
|
||||
* @since 0.9.51
|
||||
*/
|
||||
public static boolean isExternalRestartPending() {
|
||||
ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance();
|
||||
if (mgr == null) return false;
|
||||
return mgr.isExternalRestartPending();
|
||||
}
|
||||
|
||||
/**
|
||||
* Release update only.
|
||||
* Available version, will be null if already downloaded.
|
||||
|
||||
@@ -125,7 +125,7 @@ class SummaryRenderer {
|
||||
long start = end - (period * periodCount);
|
||||
ImageOutputStream ios = null;
|
||||
try {
|
||||
RrdGraphDef def = new RrdGraphDef();
|
||||
RrdGraphDef def = new RrdGraphDef(start/1000, end/1000);
|
||||
|
||||
// Override defaults
|
||||
def.setColor(ElementsNames.back, BACK_COLOR);
|
||||
@@ -165,7 +165,6 @@ class SummaryRenderer {
|
||||
boolean localTime = !_context.getBooleanProperty(GraphConstants.PROP_UTC);
|
||||
if (localTime)
|
||||
def.setTimeZone(SystemVersion.getSystemTimeZone(_context));
|
||||
def.setTimeSpan(start/1000, end/1000);
|
||||
def.setMinValue(0d);
|
||||
String name = _listener.getRate().getRateStat().getName();
|
||||
// heuristic to set K=1024
|
||||
|
||||
@@ -6,6 +6,7 @@ import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.web.ConfigServiceHandler;
|
||||
import net.i2p.router.web.ContextHelper;
|
||||
import net.i2p.router.web.Messages;
|
||||
import net.i2p.router.web.NewsHelper;
|
||||
import net.i2p.util.RandomSource;
|
||||
|
||||
/**
|
||||
@@ -92,7 +93,7 @@ public class ConfigRestartBean {
|
||||
buf.append("</h4><hr>");
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET2);
|
||||
} else {
|
||||
if (ctx.hasWrapper())
|
||||
if (ctx.hasWrapper() || NewsHelper.isExternalRestartPending())
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET3);
|
||||
else
|
||||
buttons(ctx, buf, urlBase, systemNonce, SET4);
|
||||
|
||||
@@ -50,7 +50,7 @@ public class HomeHelper extends HelperBase {
|
||||
|
||||
/** @since 0.9.44 */
|
||||
static final String DEFAULT_CONFIG =
|
||||
_x("Configure Homepage") + S + _x("Configure the contents of this page") + S + "/confighome" + S + I + "info/home.png" + S +
|
||||
//_x("Configure Homepage") + S + _x("Configure the contents of this page") + S + "/confighome" + S + I + "info/home.png" + S +
|
||||
_x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "info/bandwidth.png" + S +
|
||||
// FIXME wasn't escaped
|
||||
//_x("Configure UI") + S + _x("Select console theme & language & set optional console password").replace("&", "&") + S + "/configui" + S + I + "info/ui.png" + S +
|
||||
|
||||
@@ -1012,7 +1012,7 @@ class NetDbRenderer {
|
||||
buf.append("<br><b class=\"netdb_transport\">").append(DataHelper.stripHTML(style)).append(":</b>");
|
||||
if (debug) {
|
||||
int cost = addr.getCost();
|
||||
if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10)))
|
||||
if (!((style.equals("SSU") && cost == 5) || (style.startsWith("NTCP") && cost == 10)))
|
||||
buf.append(" <span class=\"netdb_name\">").append(_t("cost")).append("</span>: <span class=\"netdb_info\">").append("" + cost).append("</span> ");
|
||||
}
|
||||
Map<Object, Object> p = addr.getOptionsMap();
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user