Compare commits

..

98 Commits

Author SHA1 Message Date
zzz
e340fc885d 1.5.0 / API 0.9.51 release 2021-08-23 10:34:39 -04:00
zzz
63b3da265b javadoc fix 2021-08-23 09:21:24 -04:00
zzz
03f2cbfc89 bump -10 for review 2021-08-20 13:58:51 -04:00
zzz
7f5e7e54c0 Add Hungarian readme
fix routerconsole po files failing testscript
2021-08-20 13:19:42 -04:00
zzz
30aab77047 Pull translations from Transifex 2021-08-20 12:56:07 -04:00
zzz
367a35e531 refresh Debian patches 2021-08-20 09:28:29 -04:00
zzz
76a48f5983 GeoIP 2021-08-01
BuildTime update
2021-08-20 09:08:43 -04:00
idk
6a1ad6bef5 line up margin for unordered list on susidns.css 2021-08-18 16:50:08 -04:00
zzz
ef947e2dbc spelling fix 2021-08-14 09:38:42 -04:00
zzz
de73dec4b8 Crypto: Fix corruption of EC and DSA private keys on Java 17
Update test to try all key types
2021-08-13 10:15:24 -04:00
zzz
4938e13f0e poupdate-source 2021-08-11 11:38:49 -04:00
zzz
dc48afe89d Remove dead links 2021-08-11 08:18:40 -04:00
idk
15cfa147a6 Add descriptions of the address book section to the front page in susidns. This is the last string change I intend to check in for this cycle. 2021-08-10 16:10:07 -04:00
zzz
7d1656c20f UPnP: Fix construction of absolute URLs
where the service relative URL is an absolute path
and the location absolute URL is below the top level.
Fixes communication with "Freebox" UPnP routers.
ref: http://zzz.i2p/topics/3157
2021-08-07 08:39:05 -04:00
zzz
2cb0650980 javadoc fix 2021-08-03 08:37:41 -04:00
zzz
cf38697774 Update: Show restart button after an update is handled by a post-processor 2021-08-02 11:36:38 -04:00
zzz
f2b878d02a Data: Remove unused static field deprecated long ago 2021-07-30 12:17:15 -04:00
zzz
877b1f5f56 Build: Add resources to dependencies
remove unused systray icons
2021-07-30 10:35:12 -04:00
zzz
a634a9e3cf Util: DoH server list update 2021-07-30 10:12:59 -04:00
zzz
c652d597c9 Tunnels: Prop. 157 updates
- Enable handling
- Remove option to disable garlic reply
- Add option to enable sending
2021-07-29 09:51:21 -04:00
zzz
9db50256a8 Console: whitespace fix 2021-07-28 11:11:46 -04:00
zzz
2edac95be9 Tunnels: Updates for proposal 157
- Fix compatibility check for OB tunnels
- Add test code to send STBM to explicit peers
- Skip too-many-tunnels check when in test mode
- Cleanups and Log tweaks
2021-07-28 11:09:51 -04:00
idk
d246689242 Address some font size, section size, and spacing issues on proxy.css 2021-07-23 17:01:52 -04:00
zzz
6eb1510324 Transport: Fix UPnP IPv6 NPE
ref: http://zzz.i2p/topics/3153
2021-07-23 11:07:59 -04:00
zzz
24ef2b5189 Prop. 157 fix for ChaCha20 IV
after testing with i2pd
2021-07-22 15:15:26 -04:00
zzz
2b3a0f0232 bump -5 2021-07-20 10:52:33 -04:00
zzz
cd7c2efda8 build doc update 2021-07-20 10:50:13 -04:00
zzz
ca879f04e3 javadoc 2021-07-20 10:49:14 -04:00
zzz
369c40322e Make method static 2021-07-20 10:47:50 -04:00
zzz
3244fe1b0f Tunnels: Add check for prop. 157 layer enc. type 2021-07-20 10:44:38 -04:00
zzz
6b2a4a8fda Streaming: remove unneeded returns 2021-07-20 10:39:59 -04:00
zzz
83e67ad9d8 Sybil: Increase min display points 2021-07-20 10:37:08 -04:00
zzz
9f0d6c302f Router: New blocklist entries
as reported by drzed
2021-07-20 10:34:57 -04:00
zzz
d42d41ce0a Util: Check java versions up to 17 2021-07-20 10:33:53 -04:00
zzz
7ff6373d0c Output stream to string optimizations 2021-07-20 10:31:52 -04:00
zzz
3bf3a4ff9d NetDB: Increase min ff version to 0.9.38
previously was .38 for LS2 stores/lookups only
2021-07-20 10:26:17 -04:00
idk
4c5823ecb7 remove console.css lines from build.xml 2021-07-20 09:22:36 -04:00
idk
8b95aa9652 Merge branch 'proxy-css' into 'master'
Proxy Error Page CSS

Closes #330

See merge request i2p-hackers/i2p.i2p!34
2021-07-19 18:30:52 +00:00
idk
71ccd10ba6 Proxy Error Page CSS 2021-07-19 18:30:52 +00:00
zzz
426fbcbfa3 Prop 157 updates
- Fix registration of reply key/tag with SKM
- Allow OTBRM down client tunnel
- Disable tunnel hop throttles for allowLocal
- Various cleanups
2021-07-18 14:22:57 -04:00
zzz
a7d9ca920f Prop 157 updates
- Don't require AES keys for short records
- Derive keys from noise ck
- Use derived keys to garlic-encrypt reply at OBEP
- Register reply key with SKM
- Only use short message for client tunnels if client supports EC
- Set nonce for chacha/poly reply record
- Add tagsReceived() for single tag to MuxedSKM
- Add extended TunnelCreatorConfig.toStringFull()
- BRR toString() enhancements
- Test enhancements
2021-07-16 12:28:04 -04:00
idk
f40eff6b7e Merge branch 'master' of 127.0.0.1:i2p-hackers/i2p.i2p 2021-07-14 15:34:45 -04:00
idk
187ebf4c4a remove echelon.i2p from the English-language readme.html 2021-07-14 14:43:35 -04:00
zzz
1e7b13db66 HopConfig: Remove unused reply fields
previously moved to TunnelCreatorConfig
toString() enhancements
2021-07-14 10:51:57 -04:00
zzz
bc13f64403 Prop. 157 javadoc updates 2021-07-13 11:32:11 -04:00
zzz
617fff175e Tunnels: Prop. 157 updates
- remove ITBM
- remove plaintext slot from OTBRM
2021-07-13 09:47:30 -04:00
zzz
8710aa0065 Fix package for new "filter" 2021-07-13 08:23:32 -04:00
idk
558aa6e421 Merge branch 'x-i2p-location' into 'master'
Adds an X-I2P-Location header filter to the default I2P site

See merge request i2p-hackers/i2p.i2p!22
2021-07-12 14:21:23 +00:00
idk
1911132f11 Adds an X-I2P-Location header filter to the default I2P site 2021-07-12 14:21:23 +00:00
zzz
373924e650 Streaming: Reduce immediate ack delay 2021-07-07 08:31:17 -04:00
zzz
9c74cafd92 UPnP: IPv6 address validation fix 2021-07-02 07:51:01 -04:00
zzz
e88eed760d Streaming: Minor cleanups
- Remove unused stream.trend stat
- Optimization of getting first value from TreeMap
- Only notify reader of input stream when new data available
2021-06-27 11:50:20 -04:00
zzz
b7322e1647 Tests: Add resources to test jars
Fix duplicate classes in i2ptest.jar
Change classpath in routertest.jar to point to i2ptest.jar
2021-06-22 10:00:44 -04:00
zzz
bb19fcdac3 Tunnels: Changes for new build messages (Prop. 157)
- Remove ITBM, change record length from 236 to 218 bytes
- Fix check of blank record in BuildReplyHandler
- Fix offset constants for short record in BuildRequestRecord
- Fix BuildMessageTestStandalone test 6 (short inbound)
- ITBM class removal TODO
2021-06-22 09:06:40 -04:00
zzz
d71a472367 fix deprecation in test 2021-06-21 12:06:29 -04:00
zzz
e5186b0f7b Improve error handling on sort 2021-06-20 09:39:12 -04:00
zzz
fd6219356d Jetty: Case-insensitive sort on directory listing, put directories first 2021-06-20 09:28:10 -04:00
zzz
ea8597d1fb Console: Add preliminary Permissions-Policy header
other places TODO
2021-06-18 09:58:57 -04:00
zzz
970be35084 Transport: Remove 4/6 caps config
since 0.9.50 is out.
Log tweaks
2021-06-18 09:23:22 -04:00
zzz
c65b4689d0 SSU: Fix handling of bad peer test responses
Always abort test with an unknown result,
to prevent false firewalled indication.
Log tweaks
2021-06-18 09:11:42 -04:00
zzz
7628168c3d Tunnels: Consolidate tunnel key generation
in BuildRequestor.createTunnelBuildMessage()
to prep for derived keys in prop. 157
2021-06-17 12:58:46 -04:00
zzz
65b57fed9f minor css fix on /stats 2021-06-16 09:50:39 -04:00
zzz
67288f27b6 Crypto: Increase key pools for slow machines
Increase EDH key pool for all
Return unused EDH keys to XDH pool
ref: http://zzz.i2p/topics/3139
2021-06-16 09:50:04 -04:00
zzz
10cc00a9c8 Console: Format news dates using DataHelper 2021-06-16 09:08:44 -04:00
zzz
2cbb9b44ea Unused field 2021-06-16 09:00:53 -04:00
zzz
f9e8fa8150 Tunnels: Continue work on prop. 157
- Add new internal-only ShortTunnelBuildReplyMessage,
  for processing of STBM as a reply.
- Add support for inbound tunnel tests to TunnelBuildMessageStandalone.
  The ITBM test is WIP.
- Add checks for unset plaintext record in ITBM and OTBRM
2021-06-13 15:28:48 -04:00
zzz
aa0e0b3a62 Tunnels: Change class of TunnelPoolSettings random key
from Hash to SessionKey. It's not a Hash.
2021-06-13 11:34:17 -04:00
zzz
4c6aa8cfc1 Tests: Add serialize/deserialize test for STBM/OTBRM 2021-06-13 10:52:42 -04:00
zzz
010d1a9953 Tunnels: Continue work on new build messages (proposal #157)
WIP, still disabled, proposal not complete

- Use ChaCha20 to encrypt/decrypt records
- Add OTBRM methods for plaintext record
- Add OTBRM checks for correct plaintext slot number
- Add BRR checks to prevent use of nonexistent AES key/IV
- Set plaintext reply at OBEP in BuildHandler
- Allow OTBRM in InboundMessageDistributor
- Remove timing measurements in BuildMessageProcessor.decrypt()
- Add test to BuildMessageTestStandalone for outbound build
- Add check for all replies to BuildMessageTestStandalone
- Log tweaks
2021-06-13 10:31:02 -04:00
zzz
3fbfb689af Tests: Add ECIES test to BuildMessageTestStandalone 2021-06-12 16:20:07 -04:00
zzz
2bb3cf046d Tests: Fix BuildMessageTestStandalone 2021-06-12 15:42:47 -04:00
zzz
988e0e796f Tests: Fixup tunnel test after build classes move 2021-06-12 10:45:18 -04:00
zzz
d93e16e52e UPnP: Bind to IPv6 addresses for search responses
Older miniupnpd 2.0 will send a SSDP search response with an IPv6 location to a IPv4 address,
but newer ones 2.2 won't. So we need to also bind to an IPv6 address for the SSDP search
to receive the router's IPv6 location. Then we can bind to our public IPv6 address
for a port forward and it will work when miniupnpd is configured for "secure".

Also, don't bind a POST request to a mismatched v4/v6 address.
2021-06-11 09:29:16 -04:00
zzz
d5a499591d Update: Make backup news URL configurable (see gitlab MR !33) 2021-06-10 12:36:52 -04:00
zzz
41c8f6d0d5 Merge branch 'dmg' into 'master'
Add support for dmg and exe updates

See merge request i2p-hackers/i2p.i2p!33
2021-06-10 16:18:31 +00:00
zzz
b73d5d6557 Add support for dmg and exe updates 2021-06-10 16:18:31 +00:00
zzz
4f12081b59 Tunnels: Move 3 build classes from tunnel to tunnel/pool
and make package private, so all the tunnel build classes are in one place.
2021-06-08 12:47:28 -04:00
zzz
ad48ff61f3 Console: Change all config page headers to "Configuration" 2021-06-08 10:25:00 -04:00
zzz
4aef8d66e3 Console: Remove "configure homepage" item from /home 2021-06-08 10:19:18 -04:00
zzz
2f371301ad NetDB: Prevent rare deadlock in rebuildRouterInfo()
by making it always nonblocking.
as reported by drzed
2021-06-08 10:06:41 -04:00
zzz
c2c922b665 Tunnels: Switch from SHA256 to SipHash for arbitrary deterministic sort
of peers. For efficiency.
ref: http://zzz.i2p/topics/3082
thx: jogger
2021-06-08 09:44:17 -04:00
zzz
aee9a3f639 Tunnels: Extend use of high cap peers in expl. tunnels at startup, after extended downtime 2021-06-08 09:28:15 -04:00
zzz
d9c98580d1 Continue implementation of short tunnel build messages (proposal 157)
- Generate and parse short record format
- Encrypt and decrypt short records
- Register handlers for 3 new messages ITBM/STBM/OTBRM
- Send ITBM/STBM if all hops support it (disabled)
- Reply with OTBRM at OBEP if STBM received (disabled)
- Send STBM at IBGW if ITBM received (disabled)
- Add logic for when to send new messages
- ChaCha encryption of other short records
- Fix compare logic in ITBM parser (ticket #2814)

All is still preliminary, disabled, untested; proposal is still incomplete

Still todo:
- Fill in plaintext record for ITBM/OTBRM
- OTBRM key/tag
2021-06-08 08:43:40 -04:00
zzz
8b4a93554f Router: Fix JobQueue getLastJobBegin() and getLastJobEnd() (ticket #2809) 2021-06-01 09:32:21 -04:00
zzz
f9b5ee697c Transport: Consolidate now() calls 2021-06-01 09:01:40 -04:00
zzz
6dab5b44ae unused import 2021-06-01 08:53:29 -04:00
zzz
e7bef3f4e8 Console: Fix deprecation in rrd4j 2021-06-01 08:51:16 -04:00
zzz
ff44ba4e07 i2psnark: Fix autostart for magnets 2021-06-01 08:50:18 -04:00
zzz
b88c8a4f6a UPnP: Fix IPv6 address check (ticket #2811) 2021-05-23 07:38:28 -04:00
zzz
58aa95df87 Router: Increase rekey probability 2021-05-21 09:52:26 -04:00
zzz
56a1184da7 Build: Update RRD4J version in manifest 2021-05-21 09:48:21 -04:00
zzz
ecc8b2a1c6 Console: Don't show default cost for NTCP2 either 2021-05-21 09:47:43 -04:00
zzz
288170a728 Console: Remove unused H cap from legend 2021-05-21 09:02:58 -04:00
zzz
b9efc002c0 RRD4J 3.8
Merged in our previous javadoc fixes
Their updated font-selector code remains commented
out in RrdGraphConstants.getFont()
Now requires Java 8
2021-05-21 07:36:57 -04:00
zzz
6926f5769e Systray: Drop unused BrowserChooser 2021-05-20 09:04:26 -04:00
zzz
9036aa84f6 Build: Remove broken list-changes targets 2021-05-20 08:56:21 -04:00
zzz
557c1d0f04 Console: Make the /confighome headers match the home page headers
Fix padding on file chooser buttons
2021-05-20 08:47:20 -04:00
zzz
2bb14c317f Debian files for 0.9.50
checklist updates
2021-05-19 09:50:47 -04:00
332 changed files with 49619 additions and 47130 deletions

View File

@@ -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

View File

@@ -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.

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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 {

View File

@@ -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" +

View File

@@ -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"

View File

@@ -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 ""

View File

@@ -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."

View File

@@ -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

View File

@@ -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 (elpoczta, proxy HTTP, IRC) dzieli wspólny zestaw tuneli wyświetlany jako „współdzielone klienty”."
msgstr "Domyślnie większość usług klienckich (epoczta, 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

View File

@@ -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 "Новый клиентский туннель"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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">

View File

@@ -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">

View File

@@ -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">

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">

View 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;
}
}

View 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;
}
}

View File

@@ -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">

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>
<!-----------------------------

View File

@@ -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>

View File

@@ -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>

View File

@@ -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">

View File

@@ -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">

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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) {

View File

@@ -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
*

View File

@@ -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);
}
}

View File

@@ -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}" />

View 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);
}

View File

@@ -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.

View File

@@ -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.
*

View File

@@ -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);
}
}

View File

@@ -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);
}
/**

View File

@@ -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);

View File

@@ -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);
}
/**

View File

@@ -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)

View File

@@ -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 {
}
}

View File

@@ -202,7 +202,7 @@ public class XmlWriter implements AutoCloseable {
}
private static String escape(String s) {
return s.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
return s.replace("<", "&lt;").replace(">", "&gt;");
}
@Override

View File

@@ -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");

View File

@@ -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 */

View File

@@ -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 ***/
};

View File

@@ -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()
};
}
}

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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;
}

View 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);
}

View File

@@ -15,6 +15,7 @@ import java.util.Date;
* Interpolation method handles NaN datasource
* values gracefully.</p>
*/
@SuppressWarnings("deprecation")
public class LinearInterpolator extends Plottable {
/**

View File

@@ -64,4 +64,3 @@ class Normalizer {
return values;
}
}

View File

@@ -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} */

View File

@@ -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);
}

View File

@@ -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) /

View File

@@ -11,6 +11,6 @@ class CDef extends Source {
}
void requestData(DataProcessor dproc) {
dproc.addDatasource(name, rpnExpression);
dproc.datasource(name, rpnExpression);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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 = "-";

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -16,7 +16,7 @@ class TDef extends Source {
@Override
void requestData(DataProcessor dproc) {
dproc.addDatasource(name, dsName, fetchData);
dproc.datasource(name, dsName, fetchData);
}
}

View File

@@ -14,7 +14,7 @@ class VDef extends Source {
}
void requestData(DataProcessor dproc) {
dproc.addDatasource(name, defName, var);
dproc.datasource(name, defName, var);
}
}

View File

@@ -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í"

View File

@@ -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 ""

View File

@@ -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"

View File

@@ -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>

View File

@@ -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);

View File

@@ -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;

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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);

View File

@@ -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("&", "&amp;") + S + "/configui" + S + I + "info/ui.png" + S +

View File

@@ -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("&nbsp;<span class=\"netdb_name\">").append(_t("cost")).append("</span>: <span class=\"netdb_info\">").append("" + cost).append("</span>&nbsp;");
}
Map<Object, Object> p = addr.getOptionsMap();

Some files were not shown because too many files have changed in this diff Show More