Compare commits

...

348 commits

Author SHA1 Message Date
Stan Grishin
20b3600d4d
Merge pull request #4796 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: bugfix: default values for ListValue
2021-02-09 17:59:07 -08:00
Stan Grishin
19f304cd96 luci-app-simple-adblock: bugfix: default values for ListValue
Signed-off-by: Stan Grishin <stangri@melmac.net>
2021-02-10 01:12:34 +00:00
Stan Grishin
0656431081
Merge pull request #4767 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: add nextdns.io and quad 101 providers
2021-02-05 10:46:43 -08:00
Stan Grishin
e41efc3ee3 luci-app-https-dns-proxy: add nextdns.io and quad 101 providers
Signed-off-by: Stan Grishin <stangri@melmac.net>
2021-02-05 05:52:57 +00:00
Stan Grishin
d7dc59a154
Merge pull request #4731 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: DSCP tagging support
2021-01-13 04:04:22 -08:00
Stan Grishin
52f7b0ef4d luci-app-https-dns-proxy: DSCP tagging support
Signed-off-by: Stan Grishin <stangri@melmac.net>
2021-01-13 12:02:06 +00:00
Stan
1259bb147f
Merge pull request #4683 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: README URL update
2020-12-21 09:52:52 -08:00
Stan Grishin
7d58cea58c luci-app-simple-adblock: README URL update
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-12-21 11:47:01 -06:00
Stan
6fbb5966f4
Merge pull request #4680 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: WebUI for dnsmasq config update, quad9 bootstrap IPv6
2020-12-21 09:39:56 -08:00
Stan Grishin
ca5ddba3ad luci-app-https-dns-proxy: WebUI for dnsmasq config update, quad9 bootstrap IPv6
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-12-21 11:34:45 -06:00
Hannu Nyman
ab22243b49 treewide: i18n - backport and sync translations
Backport translations from master and 19.07.
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-11-14 15:40:09 +02:00
Hannu Nyman
3864cced13 luci-app-hd-idle: rename .po files to match app name
Rename .po(t) files from hd_idle.po to hd-idle.po
in order to get them noticed in weblate.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 74c17ea84c)
2020-11-01 14:26:15 +02:00
Hannu Nyman
4a5217f93e treewide: i18n - backport and sync translations
Backport translations from master and 19.07.
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-10-31 20:36:31 +02:00
Hannu Nyman
423a5b19fd timezone data: update to 2020d
Update timezone data to 2020d

2020b: http://mm.icann.org/pipermail/tz-announce/2020-October/000059.html
     Macquarie Island has stayed in sync with Tasmania since 2011.
     Casey, Antarctica is at +08 in winter and +11 in summer.

2020c: http://mm.icann.org/pipermail/tz-announce/2020-October/000060.html

2020d: http://mm.icann.org/pipermail/tz-announce/2020-October/000062.html
     Palestine ends DST earlier than predicted, on 2020-10-24.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit ce3402a453)
2020-10-31 20:24:55 +02:00
Hannu Nyman
479154eb34 treewide: i18n - backport and sync translations
Backport translations from master and 19.07.
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-09-28 16:41:40 +03:00
Stan
baa4f38333
Merge pull request #4459 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: ACL-related update
2020-09-21 11:41:54 -07:00
Stan Grishin
80157d34a8 luci-app-vpnbypass: ACL update
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-09-21 18:34:19 +00:00
Stan
07edc55cdd
Merge pull request #4450 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: support for config auto-update
2020-09-20 21:30:45 -07:00
Stan Grishin
d6c95855de luci-app-simple-adblock: support for config auto-update
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-09-20 00:26:30 +00:00
Hannu Nyman
8401f59e03 luci-base: tweak busybox top regex to accept 'm' in large VSZ
Tweak the lua regex string for process list, so that processes
with extremely large memory sizes (over 100 MB) are matched.
For those large processes busybox top shows a MB value like '234m'
instead of a normal kB value like 234000.

Fixes #4425

Reference to https://github.com/openwrt/luci/issues/4425#issuecomment-694073479

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 4f2ecd88fd)
2020-09-19 08:58:05 +03:00
Liangbin Lian
dc51a2f845 luci-app-uhttpd: i18n - fix zh-cn translation
Signed-off-by: Liangbin Lian <jjm2473@gmail.com>
2020-09-15 19:08:15 +03:00
Hannu Nyman
adfc142841 treewide: i18n - backport and sync translations
Backport translations from master and 19.07.
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-08-29 21:40:51 +03:00
Stan
2223f8b397
Merge pull request #4393 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: add DNSPod.cn DoH
2020-08-27 14:38:58 -07:00
Stan Grishin
523770c5aa luci-app-https-dns-proxy: add DNSPod.cn DoH
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-08-27 21:37:04 +00:00
Stan
16dfb55ace
Merge pull request #4319 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: fix bootstrap_dns for cloudflare security
2020-07-31 02:53:11 -07:00
Stan Grishin
ac723a12a5 luci-app-https-dns-proxy: fix bootstrap_dns for cloudflare security
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-07-31 09:37:10 +00:00
Stan
774c92e08a
Merge pull request #4312 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: add OpenDNS servers
2020-07-29 02:45:26 -07:00
Stan Grishin
0c92a924cd luci-app-https-dns-proxy: add OpenDNS servers
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-07-29 09:41:42 +00:00
jjm2473
23f30cf9ca ucitrack: fix bug for exec with params
In file `/etc/config/ucitrack`
```
config fstab
        option exec '/sbin/block mount'
```
`/sbin/block mount` never be called after fstab changed.

Signed-off-by: jjm2473 <1129525450@qq.com>
(cherry picked from commit 97780a9ce1)
2020-07-19 19:48:13 +02:00
Hannu Nyman
c215f31619 treewide: i18n - backport translations
Backport translations from master & 19.07.
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-07-18 14:26:51 +03:00
Stan Grishin
5d4442fae2 luci-app-https-dns-proxy: bugfix: remove eDNS support
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-06-25 13:10:22 -07:00
Hannu Nyman
058c3e2387 treewide: i18n - backport translations
Backport translations from master and 19.07.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-06-24 23:31:51 +03:00
Hannu Nyman
5af651b614 treewide: i18n - backport translations
Backport translations from 19.07 and master.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-06-17 21:41:49 +03:00
Jo-Philipp Wich
563bd75178
Merge pull request #4107 from fanck0605/patch-1
[18.06] luci-app-ddns: remove duplicate help.gif
2020-06-16 17:12:57 +02:00
Stan Grishin
f541468525 luci-app-simple-adblock: racially-neutral names
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-06-13 15:13:51 -07:00
Stan
a972bdb9b9
Merge pull request #4103 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: bugfix: proper processing of failed downloads; decrease reliance on shell commands; proper acl.d file
2020-06-03 08:27:48 -07:00
Stan
ca50085e4a
Merge pull request #4119 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: decrease reliance on shell commands; proper acl.d file; add cloudflare family/protect
2020-06-02 06:18:40 -07:00
Stan Grishin
f990543f8c luci-app-https-dns-proxy: decrease reliance on shell commands; proper acl.d file; add cloudflare family/protect
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-05-30 11:41:26 +00:00
Chuck
e5c2e49610 luci-app-ddns: remove duplicate help.gif
class `cbi-value-description` already contains help.gif
it's not necessary to add one manually

Signed-off-by: Chuck <fanck0605@qq.com>
2020-05-27 21:08:28 -07:00
Hannu Nyman
a1994dac44
Merge pull request #4104 from fanck0605/patch-2
[18.06] luci-app-ddns: fix huge typo in luasrc/tools/ddns.lua
2020-05-27 12:46:01 +03:00
leonghui
69d17199e8 luci-app-ddns: fix typo for has_curlssl()
Fixes the incorrect message "HTTPS not supported please disable !" when curl with https support is present.
grep returns exit code 0 when a match is found.

This cherry-picks commit 199d4b1d5c

Signed-off-by: Leong Hui Wong <wong.leonghui@gmail.com>
Signed-off-by: Chuck <fanck0605@qq.com>
2020-05-27 01:45:18 -07:00
yangfl
d4424f8847 luci-app-ddns: fix huge typo in luasrc/tools/ddns.lua
This cherry-picks commit d81c8d0e6b

Signed-off-by: David Yang <mmyangfl@gmail.com>
Signed-off-by: Chuck <fanck0605@qq.com>
2020-05-27 01:43:09 -07:00
Stan Grishin
cdfb78685c luci-app-simple-adblock: bugfix: proper processing of failed dowloads; decrease reliance on shell commands; proper acl.d file
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-05-27 00:38:40 +00:00
Hannu Nyman
f5f1ea3316 treewide: i18n - backport translations
Backport translations from 19.07 and master.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-05-25 18:13:39 +03:00
Hannu Nyman
bacf57bad1 treewide: i18n - sync translations and backport from 19.07 and master
* sync translations
* backport applicable translations from 19.07 and master

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-05-15 17:12:25 +03:00
Hannu Nyman
de2df034e1 build: add i18n-merge-openwrt-19.07
Support backporting translation strings from 19.07 to 18.06 by adding a script for that.

Targeted workflow is:
1) sync 18.06 to apps
2) backport 19.07 translations
3) re-sync 18.06 just in case
4) backport master translations
5) re-sync 18.06 just in case

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2020-05-15 17:12:25 +03:00
Hannu Nyman
b4dbbb432e build/i18n-merge-master: ignore apps deleted in master
Refine the code to ignore apps that have been deleted from master
but still exist in release branches. E.g. luci-app-samba

Previously the unhandled git error from non-existing master
mangled the .po files in the release branch: the 18n header was
removed and all non-ASCII chars were deleted from translation.

Fix this by processing only those files where 'git show' succeeds.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit e4baee8d25)
2020-05-15 17:12:25 +03:00
Jo-Philipp Wich
9b69e8f9cc build: add script to merge master translation into branches
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit cab574958c)
2020-05-15 17:12:25 +03:00
Hannu Nyman
733734ab20
Merge pull request #3953 from sunnyqeen/openwrt-18.06
luci-mod-admin-full: fixed ipv6 address display in the overview page of luci 18.06
2020-05-14 10:19:34 +03:00
sunnyqeen
3e26f34ad8 luci-mod-admin-full: fixed ipv6 address display in the overview page of luci
Signed-off-by: sunnyqeen <sunnyqeen@gmail.com>
2020-05-14 00:10:18 +02:00
Florian Eckert
6d9a0488d6 luci-app-commands: do not escape pipe on cmd line
fixes #4036

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 8120e1d484)
2020-05-13 16:05:08 +02:00
Hannu Nyman
ae3949669b timezone data: update to 2020a
Update timezone data to 2020a

http://mm.icann.org/pipermail/tz-announce/2020-April/000058.html

2020a:
    Morocco springs forward on 2020-05-31, not 2020-05-24.
    Canada's Yukon advanced to -07 year-round on 2020-03-08.
    America/Nuuk renamed from America/Godthab.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit e5fe16c9ea)
2020-05-09 09:50:01 +03:00
Stan
786dd7928d
Merge pull request #4003 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: better localizeable resources
2020-05-03 12:49:28 -07:00
Stan Grishin
292c6d7bb0 luci-app-vpnbypass: better localizeable resources
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-05-03 09:12:54 +00:00
Stan
bbf8e1e76d
Merge pull request #3999 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: bugfix: remove escaped double-quotes from translateable resources
2020-05-02 09:21:01 -07:00
Stan
a2185b378d
Merge pull request #3993 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: bugfix: remove escaped double-quotes from translateable resources
2020-05-02 09:17:21 -07:00
Stan Grishin
0c35ed08e5 luci-app-simple-adblock: bugfix: remove escaped double-quotes from translateable resources
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-05-02 16:01:06 +00:00
Stan Grishin
a1c1e2d336 luci-app-https-dns-proxy: bugfix: remove escaped double-quotes from translateable resources
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-05-02 15:32:01 +00:00
Hannu Nyman
1e59ed1799
Merge pull request #3961 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: add CIRA Canadian Shiled
2020-04-24 17:32:23 +03:00
Stan Grishin
f8a3ce0be5 luci-app-https-dns-proxy: add CIRA Canadian Shiled
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-24 10:06:16 +00:00
Hannu Nyman
7cc22e1a65
Merge pull request #3945 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: bugfix: get package version from opkg
2020-04-21 19:48:36 +03:00
Stan Grishin
805cf64805 luci-app-simple-adblock: bugfix: get package version from opkg
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-21 00:51:41 +00:00
Hannu Nyman
103da80a18 luci-app-advanced-reboot: fix syntax
Add the missing ")" to lines 45 and 54.
Fixes 75a4a80c1d
Fixes #3903

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 2c812fbd58)
2020-04-12 09:02:42 +03:00
Hannu Nyman
9e850c7633
Merge pull request #3900 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: improve i18n
2020-04-11 15:39:46 +03:00
Stan Grishin
9778609d68 luci-app-simple-adblock: improve i18n
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-11 11:39:43 +00:00
Hannu Nyman
a461961ae1
Merge pull request #3879 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: bring up-to-date with master
2020-04-11 10:51:12 +03:00
Stan Grishin
a89e4ce332 luci-app-advanced-reboot: improve localization by moving from translate to translatef
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-11 01:11:49 +00:00
Hannu Nyman
35c14af547
Merge pull request #3854 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: Move help links to providers files, Add LibreDNS
2020-04-07 10:18:17 +03:00
Stan Grishin
b3184860e1 luci-app-https-dns-proxy: Move help links to providers files, Add LibreDNS.
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-06 14:00:33 +00:00
Hannu Nyman
3252808722
Merge pull request #3830 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: better service control & buttons styling
2020-04-03 15:57:25 +03:00
Hannu Nyman
be69e1ac46
Merge pull request #3827 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: better service control & buttons styling
2020-04-03 15:56:33 +03:00
Hannu Nyman
e0a6127cea
Merge pull request #3822 from stangri/18.06-luci-app-simple-adblock
[18..06] luci-app-simple-adblock: better service control & buttons styling
2020-04-03 15:51:12 +03:00
Stan Grishin
6d2a667205 luci-app-https-dns-proxy: better service control & buttons styling
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-03 12:50:35 +00:00
Stan Grishin
b27d5e0a90 luci-app-vpnbypass: better service control & buttons styling
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-03 12:32:47 +00:00
Stan Grishin
a06b27d5f8 luci-app-simple-adblock: better service control & buttons styling
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-04-03 12:25:40 +00:00
Hannu Nyman
13bc6982bd
Merge pull request #3794 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: better status/error display, better service control
2020-03-29 10:02:06 +03:00
Stan Grishin
a9f8500720 luci-app-simple-adblock: better status/error display
Signed-off-by: Stan Grishin <stangri@melmac.net>
2020-03-29 05:22:51 +00:00
Jo-Philipp Wich
4fc4c794a0 luci-base: iface_get_network(): fix condition
Fixes: #3717
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2020-03-04 08:19:01 +01:00
Jo-Philipp Wich
e513230622 luci-base: iface_get_network(): fix condition
Fixes: #3715
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2020-03-03 20:36:54 +01:00
Jo-Philipp Wich
41e2258d6d luci-base: cbi.js: fix unintended number sign overflow in format
Fixes: #3003
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit 6d9a23af60)
2020-01-29 14:41:34 +01:00
Hannu Nyman
868abc1a56
Merge pull request #3423 from stangri/18.06-luci-app-https-dns-proxy
[18.06] luci-app-https-dns-proxy: package name change, support for RFC8484 binary
2019-12-19 20:53:11 +02:00
Stan Grishin
6070efe485 luci-app-https-dns-proxy: package name change, support for RFC8484 binary
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-12-19 11:43:05 -07:00
Hannu Nyman
3a3d8f4939 i18n: sync translations
Sync translations.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2019-11-30 11:35:52 +02:00
Florian Eckert
f01d93b331
Merge pull request #3368 from stangri/18.06-luci-app-advanced-reboot
luci-app-advanced-reboot: better information for snapshots
2019-11-28 07:25:40 +01:00
Stan Grishin
8b4d454ac6 luci-app-advanced-reboot: better information for snapshots
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-11-27 08:32:46 -07:00
Hannu Nyman
ab9c8128d8
Merge pull request #3338 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: add logger messages, README update
2019-11-20 08:24:47 +02:00
Stan Grishin
b6e00b7a21 luci-app-advanced-reboot: add logger messages, README update
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-11-19 16:55:51 -07:00
Hannu Nyman
af8310fd15
Merge pull request #3335 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: bugfix: luci error on reboot, logger errors
2019-11-19 19:29:53 +02:00
Stan Grishin
71e229e2cb luci-app-advanced-reboot: bugfix: luci error on reboot, logger errors
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-11-19 09:54:37 -07:00
Jo-Philipp Wich
7a3f0dd6d4 treewide: fix "Unhandled token" errors with Lua CBI maps
The `data-type` attribute is used to bind datatype validators to a widget
while some templates used the same attribute to denote the name of the
underlying widget.

Change the `data-type` attributes referring to the widget name to
`data-widget` in order to stop the JS token error spam.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit 13e9e3e9e8)
2019-11-16 18:28:39 +01:00
Hannu Nyman
9866be5204
Merge pull request #3313 from stangri/18.06-luci-app-advanced-reboot
luci-app-advanced-reboot: show OpenWrt info on compatible NAND routers
2019-11-16 11:22:50 +02:00
Stan Grishin
10cdd01378 luci-app-advanced-reboot: show OpenWrt info on compatible NAND routers
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-11-15 16:42:13 -07:00
Jo-Philipp Wich
3961268597 luci-app-firewall: fix stored XSS in rule-details.lua
A previous fix to this file failed to address a second instance of the
same issue.

Fixes: c048f23ba ("luci-app-firewall: fix stored XSS in rule- and forward detail pages")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-11-15 19:05:05 +01:00
Jo-Philipp Wich
ca98eae724 luci-compat: add transitional package
Add an empty luci-compat package to allow forward compatibility with
openwrt-19.07 and master for packages that support all three branches.

Ref: https://forum.openwrt.org/t/luci-compat-and-18-06/48369
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-11-14 11:21:09 +01:00
Jo-Philipp Wich
bc060f931b luci-app-nlbwon: fix parsing relative interval values from config
Fixes: #3302
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 2e8aa301aa)
2019-11-13 17:10:21 +01:00
Jo-Philipp Wich
ef819b5039 luci-lib-jsonc: store large JSON integer values as Lua doubles
Fixes: #3293
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 8da8f38bf9)
2019-11-13 09:12:30 +01:00
Jo-Philipp Wich
bc17ef673f luci-mod-admin-full: proper SSID escaping in wifi join and iface overview
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-11-05 14:32:09 +01:00
Yousong Zhou
a32190c0b2 luci-mod-system: validate log_ip as "host" instead of just ipaddr
Fixes FS#2444

A replicate of commit 90051b685 on master branch

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
2019-11-04 03:03:13 +00:00
Florian Eckert
50788da24e
Merge pull request #3246 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: bugfix: call to action has no parent node
2019-10-29 06:25:47 +01:00
Stan Grishin
f6bf361ec5 luci-app-vpnbypass: bugfix: call to action has no parent node
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-10-28 16:35:10 -07:00
Jo-Philipp Wich
9a1a190aee
Merge pull request #3225 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: better service control buttons
2019-10-28 10:14:53 +01:00
Florian Eckert
fbefeed973 luci-app-openvpn: fix traceback for undefined fs value
This will fix the traceback for undefined fs value.
The bug was added by the cherry-pick commit
ca781af2f8 from master branch.

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
2019-10-24 09:16:19 +02:00
Florian Eckert
ca781af2f8 luci-app-openvpn: add missing proto param for ipv6
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 18037444b5)
Update commit to apply cleanly
2019-10-23 09:18:39 +02:00
Stan Grishin
205de70600 luci-app-vpnbypass: better service control buttons
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-10-20 15:42:34 -07:00
Whitronic
ceb1f80710
luci-proto-vpnc: expose defaultroute option in proto_vpnc.lua
Sometimes people only want the VPN connection to be a route to a specific
network, not the default gateway for all traffic.

I've tested this on my router and works fine!

Submitted-by: Whitronic <joao.f.vieira@gmail.com>
[reword commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit f4212285d4)
2019-10-20 07:34:44 +02:00
Florian Eckert
42c1228875
Merge pull request #3213 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: bugfix: properly restart dnsmasq
2019-10-18 16:58:06 +02:00
Stan Grishin
11421536cd luci-app-vpnbypass: bugfix: properly restart dnsmasq
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-10-18 07:14:40 -07:00
Florian Eckert
afee71bd60
Merge pull request #3171 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: bugfix: fix invalid <br> entries
2019-10-14 11:36:32 +02:00
Stan Grishin
3b6317db27 luci-app-simple-adblock: bugfix: fix invalid <br> entries
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-10-10 05:12:33 -07:00
Jo-Philipp Wich
ee38da958a luci-base: fix CSRF prevention for arcombine targets
The dispatcher failed to propagate the child target post security
requirements to the arcombine() dispatch target so far - fix this
by recursively testing the post security requirements.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit f8c6eb67cd)
2019-10-09 09:57:51 +02:00
Florian Eckert
48f58d9e35
Merge pull request #3138 from stangri/18.06-luci-app-vpnbypass
luci-app-vpnbypass: fix dispatcher bug when VPN node is present
2019-10-02 08:24:47 +02:00
Stan Grishin
4ac8e206e4 luci-app-vpnbypass: fix dispatcher bug when VPN node is present
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-10-01 18:22:47 -07:00
Hannu Nyman
f8775ee5fe timezone data: update to 2019c
Update timezone data to 2019c

http://mm.icann.org/pipermail/tz-announce/2019-September/000057.html

2019c:
* Fiji observes DST from 2019-11-10 to 2020-01-12.
* Norfolk Island starts observing Australian-style DST.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit cf887ba62f)
2019-09-28 21:56:44 +03:00
Hannu Nyman
a79659fdda
Merge pull request #3113 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: dnsmasq.ipset option support
2019-09-24 19:30:42 +03:00
Stan Grishin
f72558b55e luci-app-simple-adblock: dnsmasq.ipset option support
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-09-24 09:17:06 -07:00
Hannu Nyman
825daeb199
Merge pull request #3045 from stangri/18.06-luci-app-vpnbypass
[18.06] luci-app-vpnbypass: better start/stop controls, create entry in the VPN menu if it exists
2019-09-20 21:01:58 +03:00
Jo-Philipp Wich
c048f23bad luci-app-firewall: fix stored XSS in rule- and forward detail pages
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 2a143f4777)
2019-09-13 13:24:14 +02:00
Jo-Philipp Wich
14d2f9b216 luci-base: html escape values in uci changes display
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 7513a4ca35)
2019-09-10 17:20:27 +02:00
Jo-Philipp Wich
ff4c722a21 luci-base, luci-mod-network: fix bridge state change quirks
Fixes: #2997
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit fe0e4f8b4d)
2019-09-10 17:20:27 +02:00
Stan Grishin
c731cc24bb luci-app-vpnbypass: better start/stop controls, create entry in the VPN menu if it exists
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-09-07 10:36:45 -07:00
Dirk Brenken
38f5f4b970
Merge pull request #3027 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: dns resolver value bugfix (#3000)
2019-08-29 15:26:13 +02:00
Stan Grishin
a631579969 luci-app-simple-adblock: dns resolver value bugfix (#3000)
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-08-29 06:21:35 -07:00
Hannu Nyman
668c820fed
Merge pull request #3015 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: bugfix for when network.lan.ipaddr is a table
2019-08-27 16:55:55 +03:00
Hannu Nyman
924cbef577
Merge pull request #3018 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: delete extra file
2019-08-27 16:54:53 +03:00
Stan Grishin
557988815d luci-app-simple-adblock: delete extra file
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-08-26 23:18:59 -07:00
Stan Grishin
88e87f6d2c luci-app-advanced-reboot: bugfix for when network.lan.ipaddr is a table
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-08-26 23:07:49 -07:00
Jo-Philipp Wich
7995ef34b5 luci-mod-system: prevent clearing rc.local on unrelated submit actions
Fixes: #2760
Fixes: 1c09ee5e4 ("luci-mod-system: fix SimpleForm usage on file editing pages")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 1aa13ed51e)
2019-08-21 17:50:08 +02:00
Hannu Nyman
cb54693a77
Merge pull request #2991 from stangri/18.06-luci-app-simple-adblock
[18.06] luci-app-simple-adblock: support for varios DNS resolvers/options
2019-08-18 20:14:33 +03:00
Hannu Nyman
4608d789f2
Merge pull request #2988 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: support for Linksys EA8300
2019-08-18 20:13:25 +03:00
Stan Grishin
0545392d50 [18.06] luci-app-simple-adblock: support for varios DNS resolvers/options
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-08-17 06:15:19 -07:00
Stan Grishin
3c25ab8f7b [18.06] luci-app-advanced-reboot: luci-app-advanced-reboot: support for Linksys EA8300
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-08-17 04:29:16 -07:00
Jo-Philipp Wich
44683453b9 protocols: fix contains_interface() implementation in several backends
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 1fc8d021ed)
2019-08-06 15:21:17 +02:00
Jo-Philipp Wich
0cbc51f297 luci-lib-ip: support specifying source address in route()
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit d73553e530)
2019-08-06 15:21:17 +02:00
Jo-Philipp Wich
89e029c59f luci-base: index.html: add extend cache-control directive
Fixes: #2942
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 1fe45a9344)
2019-08-01 15:44:52 +02:00
xiongjie
44efaf5777 luci-base: redirect root path to /cgi-bin/luci/
Fix openwrt/luci#1062
Signed-off-by: MonwF <boluo2@gmail.com>
(cherry picked from commit fd3d2b468f)
2019-08-01 15:44:51 +02:00
Jo-Philipp Wich
28ab21dd8d luci-base: handle application/json replies with charset specification
On my router, the response header Content-Type is
`application/json; charset=UTF-8` instead of `application/json`, so
almost every feature is broken.

Fixes: #2851
Suggested-by: zhanhb <6323014+zhanhb@users.noreply.github.com>
[reword commit subject]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-07-26 12:46:39 +02:00
Jo-Philipp Wich
a388be0f28 luci-proto-ppp: align keepalive defaults with current OpenWrt
Disabling LCP echos by *not* setting "option keepalive" was broken in
OpenWrt since https://dev.archive.openwrt.org/ticket/2373.html so setting
"0" in LuCI had the effect of reverting back to "5, 1" while the help
suggested otherwise.

Support for "keepalive 0" was fixed with https://git.openwrt.org/555c59230
so align LuCI now to emit "option keepalive 0" instead of removing the
option when entering "0" in the gui.

Fixes #2112
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit 1b2065d0be)
2019-07-19 21:04:34 +02:00
Hannu Nyman
35357e4e41
Merge pull request #2841 from stangri/18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: fix README url in Makefile
2019-07-09 18:26:54 +03:00
Stan Grishin
0dab6af45a [18.06] luci-app-advanced-reboot: fix README url in Makefile
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-07-08 12:43:38 -07:00
Anton Kikin
9c5162d596 Fix a overview page style issue for various themes
Fixed a overview page style issue with interface boxes for
bootstrap, material and rosy themes.

The issue only appears in the Chrome browser and lies in the
fact that the block with the device name and MAC address gets
out of the  interface block.

Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(backported from commit 5d26fec0bf)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2019-07-08 18:24:38 +02:00
Hannu Nyman
7d8df17dfa
Merge pull request #2831 from stangri/openwrt-18.06-luci-app-advanced-reboot
[18.06] luci-app-advanced-reboot: kernel version length bugfix + add routers
2019-07-07 08:53:14 +03:00
Stan Grishin
e277f936db [18.06] luci-app-advanced-reboot: kernel version length bugfix + add routers
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-07-06 14:51:42 -07:00
Yousong Zhou
dbaae4a815 luci-base: hide autocomplete-preventing password input with bigger offset
Fixes openwrt/luci#2624

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
(cherry picked from commit 3a24c2dbaa)
2019-07-06 15:10:25 +00:00
Yousong Zhou
4235fb0125 luci-base: nowrap for password input and reveal button
Fixes openwrt/luci#2624

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
(cherry-picked from commit 609f5290c8)
2019-07-06 15:10:25 +00:00
Jo-Philipp Wich
9e3f710cac luci-base: remove fake password field from tab order
Set a negative tabindex on the dummy password field to not break the form
tab order flow.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
(cherry picked from commit 8c77975d1b)
2019-07-06 15:10:03 +00:00
Hannu Nyman
b836c15a3d
Merge pull request #2827 from stangri/openwrt-18.06-luci-app-simple-adblock
luci-app-simple-adblock: sync with the latest version of simple-adblock
2019-07-06 09:26:55 +03:00
Stan Grishin
8d88f77dc6 luci-app-simple-adblock: sync with the latest version of simple-adblock
Signed-off-by: Stan Grishin <stangri@melmac.net>
2019-07-05 08:44:03 -07:00
Hannu Nyman
cbc000bc5c timezone data: update to 2019b
Update timezone data to 2019b

http://mm.icann.org/pipermail/tz-announce/2018-December/000055.html
http://mm.icann.org/pipermail/tz/2019-July/028249.html

2019a:
* Palestine "springs forward" on 2019-03-30 instead of 2019-03-23.
* Brazil no longer observes DST.

2019b:
* Palestine's 2019 spring-forward transition was on 03-29, not 03-30.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 2f769ee087)
2019-07-05 18:03:07 +03:00
Jo-Philipp Wich
0593f93526 lucihttp: update to latest Git HEAD
a34a17d src: allow overriding buffer size from cli in multipart tester
730a46f lib: fix potentially lost bytes in boundary parsing across buffer limits
8734af2 lib: add buffer tracing to multipart parser
913051b src: add file dump option to multipart test utility
c419539 src: allow specifying custom buffer sizes in multipart testcases
f6e0564 lib: fix handling of empty multipart fields

Fixes: #2816
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 66c8ebfeff)
2019-07-05 08:28:26 +02:00
Hannu Nyman
9bab4ba393 luci-base: show niced processes on Status/Processes page
Modify the process status filter to allow also the processes
with a nice value to be visible on the Status/Processes page.

Filter out the top process itself.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 1c80eb1962)
2019-06-30 19:57:31 +03:00
Jo-Philipp Wich
4d6d8bc5b0
Merge pull request #2776 from pmelange/18x-freifunk-profiles-dns-server-update
18.06.x freifunk community-profiles: update profiles to use the new digitalcourage nameservers
2019-06-19 10:54:54 +02:00
pmelange
e84dc64f9a community-profiles: update profiles to use the new digitalcourage nameservers
The old digitalcourage nameservers 85.214.20.141 and 2a01:238:42f6:ac00:2a29:4f7f:b6d:ef46
will be retired in 2020.  The new nameservers are 46.182.19.48 and 2a02:2970:1002::18.

The change is announced https://digitalcourage.de/support/zensurfreier-dns-server

This fixes https://github.com/freifunk/openwrt-packages/issues/11

This is cherry-picked from 2c4a93e646

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-06-18 12:49:37 +02:00
Hannu Nyman
1d599a7d88 treewide: fix datetype/datatype typo
Fix the "datetype" typo also in 18.06

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2019-06-16 18:05:09 +03:00
Jo-Philipp Wich
115c4e3751 lucihttp: fix library packaging after 0dd887883
Adjust ABI_VERSION and install recipes accordingly.

Fixes: 0dd887883 ("lucihttp: update to latest Git HEAD")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit c8e9578586)
2019-06-05 19:44:54 +02:00
Jo-Philipp Wich
9fc05682f6 luci-mod-system: fix SimpleForm usage on file editing pages
When a value identical to the stored one is submitted, the CBI framework
will not emit an option write event and therfore not store the value in
the form data dictionary passed to SimpleForm.handle().

This usage pattern usally works be accident for file editor views such
as admin_system/crontab because \r\n windows style line endings are
substituted with unix \n ones before writing the data, defeating the
equality check in CBI.

When a single line without trailing newline is submitted however, the
CBI will not see a difference to the data stored in the file and clear
out the value on subsequent saves.

This commit alignes the logic used by various SimpleForm views to
behave identically and predictable:

 - File data is handled in the SimpleForm.handle() callback
 - The forcewrite property is used to disable equality checks
 - Submission of an empty string empties the backing file

Fixes: #2737
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 1c09ee5e42)
2019-06-05 16:16:48 +02:00
Jo-Philipp Wich
0dd8878837 lucihttp: update to latest Git HEAD
f6e0564 lib: fix handling of empty multipart fields
91c01c3 lib: fix multipart state transition in boundary parsing

Fixes: #2737
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit 15608fd2e5)
2019-06-05 16:16:41 +02:00
Jo-Philipp Wich
7e9de0d25f themes: don't reset theme on package upgrades
Fixes: #2743
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit 5fd071aadb)
2019-06-03 16:53:02 +02:00
Jo-Philipp Wich
84692e5bf6 luci-mod-admin-network: fix VLAN "add" button for empty switches
Fixes OpenWrt FS#2270.

Ref: https://bugs.openwrt.org/index.php?do=details&task_id=2270
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 6b7afabcdd)
2019-05-07 08:56:03 +02:00
pmelange
b99e77d5c3 remove artifacts from de3be23883
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-03-20 17:02:50 +01:00
pmelange
5248d3719e freifunk profile_berlin: add default section for 802.11s
mesh_id is set to "Mesh-Freifunk-Berlin"

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-03-19 01:27:20 +01:00
pmelange
de3be23883 freifunk-common: add default configuration for 802.11s interfaces
The defaults are

config 'defaults' 'wifi_iface_80211s'
       option 'mode' 'mesh'
       option 'encryption' 'none'
       option 'mesh_id' 'Mesh-Freifunk'
       option 'mesh_fwding' '0'

The decision for the name of the section can be found here:
https://github.com/freifunk/openwrt-packages/pull/3

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-03-19 01:27:20 +01:00
Paul Spooren
071e540e37 luci-app-attendedsysupgrade: refactor and format
* Reuse `request_dict` between requests.
* used vim Autoformat plugin to make the javascript code nice.
* add board_name as it eventually replaces board/model in requests

Signed-off-by: Paul Spooren <mail@aparcar.org>
2019-03-18 12:25:24 +01:00
Paul Spooren
76cf6533d0 luci-app-attendedsysupgrade: update to new api
there was a major rewrite of the database structure

Signed-off-by: Paul Spooren <mail@aparcar.org>
2019-02-20 16:28:18 +01:00
Jo-Philipp Wich
30d9bc02b2 luci-app-nlbwmon: Fixed incorrect period parameter/display
Switch from using the unreliable string data constructor syntax to
a more explicit year / month / day variant and pass through the
period value as-is in order to ensure that the proper start date
is requested from the backend.

This should fix issues with prevent the display of older data
periods in the nlbwmon gui.

Ref: https://github.com/jow-/nlbwmon/issues/25
Ref: https://github.com/openwrt/luci/pull/2496
Suggested-by: Aktanusa <chanam.geo@yahoo.com>
[squashed commits, add a more thorough commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(backported from commit bd56c1aac6)
2019-02-15 12:21:09 +01:00
Jo-Philipp Wich
23029f5163 treewide: avoid double-escaping CBI section labels
Since the section labels are already HTML-escaped implicitely by the
striptags() function, we must not escape them again in attr() or
ifattr().

Fixes: #2524
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit eda8f02dac)
2019-02-12 08:35:02 +01:00
Jo-Philipp Wich
28e852f4e0 luci-base: dispatcher: support raw values in attr() and ifattr()
Extend the attr() and ifattr() template functions to take an optional
further parameter indicating that the passed value should not be escaped.

This is needed for cases where the input already is escaped through
other means, e.g. when the value was previously filtered through the
striptags() template helper.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 4141243762)
2019-02-12 08:34:01 +01:00
Hannu Nyman
a0ae6c97f3
Merge pull request #2504 from aparcar/openwrt-18.06
luci-app-attendedsysupgrade: fixup error_box
2019-02-03 11:46:02 +02:00
Paul Spooren
ac90b1bc37 luci-app-attendedsysupgrade: fixup error_box
Signed-off-by: Paul Spooren <mail@aparcar.org>
2019-02-03 01:20:13 +01:00
Hannu Nyman
449d5ad6d5
Merge pull request #2494 from aparcar/18.06-unify
18.06: luci-app-attendedsysupgrade: new api, unify status
2019-02-02 16:09:05 +02:00
Paul Spooren
98ae788eb3 luci-app-attendedsysupgrade: new api, unify status
to distinguish between installed packages and requested packages, the
API call is now "installed" instead of "packages".

The clients now decide on their own if they want http or https,
therefore the server doesn't reply with full links, only the path.

Add missing variable declarations in JavaScript code

Fix typos in UI strings

Also unify "info_box" and "error_box" to "status_box"

Signed-off-by: Paul Spooren <mail@aparcar.org>
2019-02-02 14:39:31 +01:00
Jo-Philipp Wich
4c45a52592 luci-mod-rpc: drop "secret" value from rpc session objects
Drop the "secret" value from RPC session objects in order to make them
compatible with ordinary web sessions used by the LuCI web interface.

That secret value was never used for anything and is the only difference
compared to normal LuCI login sessions.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 766643fcf1)
2019-01-30 16:52:18 +01:00
Josef Schlehofer
43959e3abd
luci-app-lxc: add aarch64 to target map
Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
(cherry picked from commit f335624407)
2019-01-30 15:41:48 +01:00
James Buren
3ff3b9e860
luci-app-lxc: add i686 to target map
Add i686 to target map so i386 container templates are usable.

Signed-off-by: James Buren <ryuo@ryuo.xyz>
(cherry picked from commit 9630e7e994)
2019-01-30 15:41:21 +01:00
Anton Kikin
6f6641d97d luci-base: fix UCI changelog markup mistake
Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit 43c7cb344c)
2019-01-20 12:34:55 +01:00
Jo-Philipp Wich
a11f4ac2eb treewide: rework uci change display
- Use native rpcd uci changes format instead of incompletely converting
   back and forth between the old and the new format
 - Rework uci changelog template to print the equivalent uci commands
   for the various changes
 - Rework theme headers to properly count the uncomitted changes
 - Rework theme CSS to properly style new changelog

Fixes: #2170

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 849d153851)
2019-01-20 12:28:39 +01:00
Jo-Philipp Wich
f1a5b179dd luci-base: fix cbi dropdown quirks with MS Edge
On MS Edge, the behaviour of "value" attributes on "li" elements is
unreliable, so use the "data-" prefix to circumvent the problem.

Ref: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/19320991/
Fixes: #2224
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 9e6949849d)
2019-01-20 12:00:37 +01:00
Jo-Philipp Wich
1f423b1141
Merge pull request #2451 from pmelange/backport/PR2450-luci_mod-freifunk_basics
Backport 18.06: luci-mod-freifunk: fix the list of community profiles
2019-01-11 16:14:56 +01:00
Jo-Philipp Wich
8fe6f04d61
Merge pull request #2449 from pmelange/backport/PR2448-luci_mod-freifunk_get_all
Backport 18.06: luci-mod-freifunk: replace calls to get_all() with separate get() calls
2019-01-11 16:14:37 +01:00
pmelange
14456d30fb luci-mod-freifunk: fix the list of community profiles
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-01-11 14:00:15 +01:00
pmelange
fb9721244c luci-mod-freifunk: replace calls to get_all() with separate get() calls
The get_all() function has changed and how it was used before no
longer works properly.  These changes not only change to individual
get() calls, but actually adds to the readability of the code and reduces
file size.

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2019-01-11 13:01:42 +01:00
Hannu Nyman
04d60f2144 timezone data: update to 2018i
Update timezone data to 2018i

http://mm.icann.org/pipermail/tz-announce/2018-December/000053.html
http://mm.icann.org/pipermail/tz-announce/2018-December/000054.html

2018h:
* Qyzylorda, Kazakhstan moved from +06 to +05 on 2018-12-21.
* New zone Asia/Qostanay because Qostanay, Kazakhstan didn't move.
* Metlakatla, Alaska observes PST this winter only.
* Guess Morocco will continue to adjust clocks around Ramadan.
* Add predictions for Iran from 2038 through 2090.

2018i:
* São Tomé and Príncipe switches from +01 to +00 on 2019-01-01.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit c7776c8959)
2019-01-02 21:35:08 +02:00
Jo-Philipp Wich
3dea6b5bc7
Merge pull request #2355 from pmelange/freifunk_backport_18.06
Freifunk-berlin backport 18.06 - OLSR changes and community profiles
2018-12-07 00:09:43 +01:00
pmelange
12534ad03f luci-app-olsr: reenable the "auto refresh" feature
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 21:31:56 +01:00
pmelange
a3bfc596bf luci-app-olsr change ccs style to use class "left" instead of "style=text-align: left"
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 21:31:44 +01:00
pmelange
94a1673fc5 luci-app-olsr: make cosmetic changes.
modify the status tables so that then headers and columns align, values
left justified.

Additionally, add the openwrt style interface name to the interfaces table,
change huge  ETX numbers to 'infinate', and add the german translation for
'Selected'.

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 21:31:27 +01:00
Philipp Borgers
68fb3b279a community-profiles: change subnet of mesh_network option for Berlin
The mesh_network option is used to check the user input. The wizard
checks if the input ip address is part of the mesh_network. We use
multiple /16 networks. There is no support for multiple ranges so we the
10.0.0.0/8.

For reference the ip list:

https://wiki.freifunk.net/IP-Netze

Signed-off-by: Philipp Borgers <borgers@mi.fu-berlin.de>
2018-12-06 19:14:50 +01:00
Philipp Borgers
02bd34be15 get rid of library version numbers in luci olsrd code
Signed-off-by: Philipp Borgers <borgers@mi.fu-berlin.de>
2018-12-06 19:14:23 +01:00
Martin Hübner
e98580b058 community-profiles: create profile for Fürstenwalde
New profile for Fürstenwalde. At the moment we use parts of the Berlin-
infrastructure. Thus I have not changed the ip-address-related things.

Signed-off-by: Martin Hübner <martin.hubner@web.de>
[reword and rewrap commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-12-06 19:13:59 +01:00
pmelange
f7e420150f luci-app-olsr: convert olsr.lua and smartgw.htm to new json plugin
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:06:48 +01:00
pmelange
bfad302463 luci-app-olsr: convert mid.htm to new json plugin
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:06:40 +01:00
pmelange
34d13c0c67 luci-app-olsr: convert interfaces.htm to new json plugin
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:06:23 +01:00
pmelange
2dd31c4ff2 luci-app-olsr: convert olsr.lua and overview.htm to new json plugin
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:06:11 +01:00
pmelange
12b0b31bb3 luci-base: network.lua add ipv6-prefix-assignment support to get_status_by_address
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:06:04 +01:00
pmelange
bcfd7cf05a luci-app-olsr: cbi remove library version numbers in library search results
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:05:39 +01:00
pmelange
63a72b3bff freifunk profiles: add nameserver 80.67.169.40 from www.fdn.fr/actions/dns
Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
2018-12-06 19:04:53 +01:00
mmouselli
60dfc7348e luci-app-olsr-services: Don't use the nameservice with a specific version.
The "Services" menu option of olsr on the top of the web interface
is not there.

A specific version of the App name was in the controller service
Removing the limitation will fix the problem

https://github.com/freifunk-berlin/firmware/issues/594

Signed-off-by: mmouselli <m.mouselli@syseleven.de>
2018-12-06 19:00:17 +01:00
Hannu Nyman
5e8708345e luci-mod-network: adapt to current 802.11r defaults
The default for 802.11r option ft_psk_generate_local
was changed a few months ago by openwrt/openwrt@3cc56a5

That change was a bit awkward, as it made hostapd to
overlook the possibly existing r0kh values by default
unless the user explicitly disables the new default.

Adapt LuCI by changing the default for ft_psk_generate_local
into 'enabled'.

But ensure that LuCI does not delete the existing key values
by not making the r0kh and r1kh fields to depend on this.

Note that this is just a quick fix for the wrong default value
causing problems, but not yet a complete fix for all the options.
In the long run it might be better to make the detail options
to depend on local generation.

Reference also to LuCI PR #2102

Adapted from commit 26e903c74 in master

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-11-25 09:27:05 +02:00
Jo-Philipp Wich
3787301e3f applications: drop luci-app-asterisk
This application was never useful to begin with, drop it to avoid
further confusion.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit cf36215228)
2018-11-16 19:39:40 +02:00
Hannu Nyman
44f91bb26c
Merge pull request #2278 from sotux/openwrt-18.06
i18n: update Simplified Chinese translation for openwrt-18.06
2018-11-14 16:33:03 +02:00
Zheng Qian
3dc653cd8c i18n: luci-app-uhttpd: add initial Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-11-14 10:26:55 +08:00
Zheng Qian
d6925de333 i18n: luci-base: update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-11-14 10:26:55 +08:00
Zheng Qian
1fe70f3b4d i18n: luci-app-firewall: update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-11-14 08:52:22 +08:00
Hannu Nyman
8e1579c557 luci-app-adblock: sync translations
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-11-10 00:32:36 +02:00
Hannu Nyman
59383800ef luci-app-travelmate: sync translations
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-11-09 23:58:21 +02:00
Hannu Nyman
0cfd99cb0f i18n: sync translations
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-11-09 23:35:09 +02:00
Martin Schiller
9f94fe3a77 i18n: luci-app-firewall: cleanup multiple definitions in uk/firewall.po
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
2018-11-09 23:26:29 +02:00
Martin Schiller
197827ffe4 i18n: luci-app-addblock: cleanup multiple definitions in zh-cn/adblock.po
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
2018-11-09 23:26:29 +02:00
Martin Schiller
01fe783494 i18n: fix german base.po
Signed-off-by: Martin Schiller <ms@dev.tdt.de>
2018-11-09 23:26:29 +02:00
Hannu Nyman
b3d4b84aaf timezone data: update to 2018g
Update timezone data to 2018g

http://mm.icann.org/pipermail/tz-announce/2018-October/000052.html

 * Morocco switches to permanent +01 on 2018-10-27.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 111ebe2f62)
2018-10-30 19:48:38 +02:00
Hannu Nyman
463fb04116 timezone data: update to 2018f
Update timezone data to 2018f

http://mm.icann.org/pipermail/tz-announce/2018-October/000051.html

   Volgograd moves from +03 to +04 on 2018-10-28.
   Fiji ends DST 2019-01-13, not 2019-01-20.
   Most of Chile changes DST dates, effective 2019-04-06.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 651937c166)
2018-10-25 18:48:33 +03:00
Dirk Brenken
55ebe88f4c
luci-app-openvpn: remove obsolete config options
* remove obsolete config options according to
  openwrt/openwrt@89b8ba9, fix for #2135
* whitespace/intendation fixes
* replace fieldset leftover with div
* fix finally recipe options transfer to regular config with "Add"

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit c2656a7220)
2018-10-11 13:46:37 +02:00
Dirk Brenken
b3cbe89b29
luci-app-openvpn: fix template based config creation
* minimal fix to bring back openvpn config creation based on
openvpn_recipes template, fix for #2146

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit 1eb3f734c7)
2018-10-11 13:40:58 +02:00
Hannu Nyman
69325c11b5 timezone data: update to 2018e
Update timezone data to 2018e

http://mm.icann.org/pipermail/tz-announce/2018-May/000050.html

  North Korea switches back to +09 on 2018-05-05.
  The main format uses negative DST again, for Ireland

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 701f6b0819)
2018-10-09 18:25:33 +03:00
Dirk Brenken
9541751f7a
luci-app-adblock: sync with adblock 3.5.5
* fix cornercase issues in runtime information/json parsing

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit 4e56083833)
2018-09-04 21:47:22 +02:00
Jo-Philipp Wich
650375611f
Merge pull request #2109 from kagurazakakotori/openwrt-18.06
luci-app-adblock: fix chinese translation
2018-08-23 19:20:37 +02:00
Kagurazaka Kotori
4f4b28b789
luci-app-adblock: fix chinese translation
simply add a </a> tag to stop the link filling the whole page

Signed-off-by: Kagurazaka Kotori <kagurazakakotori@gmail.com>
2018-08-24 01:16:43 +08:00
Jo-Philipp Wich
f64b152344 luci-app-firewall: allow "open ports" when no wan zone exists
Arguably this makes little if no wan zone exists but prefer consistency
over heuristics and always render the "open port" shortcut.

Fixes #2056
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit bf123fb7c4)
2018-08-16 10:52:26 +02:00
Ansuel Smith
f4da0b8cfb luci-mod-admin-full: applyreboot doesn't reload page
The applyreboot page doesn't reload the page onload of the loding gif. This adds the right function.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit 442ece768d)
2018-08-16 10:52:22 +02:00
Ansuel Smith
e0599d5064 luci-mod-admin-full: fix broken applyreboot page
This improve applyreboot page and fix problem with luci-nginx that doesn't refresh the page when the router reboot.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit 327e284b74)
2018-08-16 10:52:14 +02:00
Ansuel Smith
f9121fd86c luci-theme-material: fix theme for applyreboot page changes
This rename style.css to casade.css (like the other themes) and fix the css to display the header even in the applyreboot page

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit 35da63fa9a)
2018-08-16 10:52:09 +02:00
Jo-Philipp Wich
199eac4166 luci-base: mark password template dummy field as hidden
Mark the dummy input field as aria-hidden, should fix #2063.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 98d4eb1695)
2018-08-16 10:51:33 +02:00
Gregory L. Dietsche
a49e4e4d56 Correct grammar in apply_widget.htm
This patch corrects "to get" to "to be" in apply_widget.htm
This shell command was used to find and make the change in
all impacted files:

find . -type f -exec sed -i 's/Waiting for configuration to get applied/Waiting for configuration to be applied/g' {} +

Signed-off-by: Gregory L. Dietsche <gregory.dietsche@cuw.edu>
(cherry picked from commit abfe45ff61)
2018-08-07 16:38:26 +02:00
yangfl
8bb4873326 luci-base: update Chinese translation
Signed-off-by: David Yang <mmyangfl@gmail.com>
(cherry picked from commit c51f0d9714)
2018-08-07 16:38:20 +02:00
Krystian Kozak
8407d90aa1 luci-base: update Polish translation
Updated Polish translations.

Signed-off-by: Krystian Kozak <krystian.kozak20@gmail.com>
(cherry picked from commit 10f12d7f6a)
2018-08-07 16:38:14 +02:00
Krystian Kozak
5d1d6915ca luci-base: update Polish translation
Updated Polish translations.

Signed-off-by: Krystian Kozak <krystian.kozak20@gmail.com>
(cherry picked from commit 6dbdc2cae8)
2018-08-07 16:37:46 +02:00
Alan Swanson
3d5d9dc574 luci-mod-admin-full: Fix DSL Stats display of dB statistics
Line attenuation, signal attenuation, noise margin and aggregate transmit
power really need to show decimal digits. Fixes commit 88713f6 from issue

(cherry picked from commit 4b3d20cda4)
[rewrapped commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-08-04 20:06:14 +02:00
Hannu Nyman
7d69fa6a50
Merge pull request #2018 from chris5560/18.06-ddns
luci-app-ddns[18.06]: remove myself as PKG_MAINTAINER
2018-08-01 19:44:34 +03:00
Hannu Nyman
2da3f93feb
Merge pull request #2016 from chris5560/openwrt-18.06
luci-app-radicale[18.06]: remove myself as PKG_MAINTAINER
2018-08-01 19:44:11 +03:00
Jo-Philipp Wich
5ec72617ee luci-theme-bootstrap: fix CSS regression in kernel/system log pages
An unrelated removed some crucial fixes due to improper rebasing.

Fixes: 7ba4eb1a4 ("luci-theme-bootstrap: add styling for input-adjacent buttons")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 176e246998)
2018-07-31 17:26:48 +02:00
Dirk Brenken
9beff0720e
luci-app-adblock: "final" fixes
during intense testing with different browsers (Chrome/Firefox/partly IE
in a VM) I found & fixed some more minor things:

* remove needless hook & include from overview page
* fix possible JS error in Runtime Information
* Align CSS color with "LuCI standard"

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit b8f8394681)
2018-07-31 15:45:47 +02:00
Dirk Brenken
cc4310817e
luci-app-travelmate: "final" fixes
during intense testing with different browsers (Chrome/Firefox/partly IE
in a VM) I found & fixed some more minor things:

* re-add accidently removed "apply_on_parse" attribute in overview cbi
* fixed a corner case where the "Restart" button not works correctly
* Removed leftovers from last commit

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit af25cf4879)
2018-07-31 15:32:07 +02:00
Jaymin Patel
e290fe917d fix compilation failure when luasrcdiet is being copied to non existing directory
Signed-off-by: Jaymin Patel <jem.patel@gmail.com>
(cherry picked from commit bb336671ff)
2018-07-31 06:58:01 +02:00
Hannu Nyman
1983dc615e
Merge pull request #2014 from dibdot/travelmate-18.06
luci-app-travelmate: backport 1.2.1 to 18.06 branch
2018-07-30 23:07:41 +03:00
Hannu Nyman
d844d51323
Merge pull request #2013 from dibdot/adblock-18.06
luci-app-adblock: backport 3.5.4 to 18.06 branch
2018-07-30 23:07:27 +03:00
Christian Schoenebeck
7f5b296e30 luci-app-ddns[18.06]: remove myself as PKG_MAINTAINER
remove myself as PKG_MAINTAINER

Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
2018-07-30 21:58:32 +02:00
Christian Schoenebeck
b0dce7a681 luci-app-radicale[18.06]: remove myself as PKG_MAINTAINER
remove myself as PKG_MAINTAINER

Signed-off-by: Christian Schoenebeck <christian.schoenebeck@gmail.com>
2018-07-30 21:51:08 +02:00
Dirk Brenken
56266d0707 luci-app-travelmate: backport 1.2.1 to 18.06 branch
Signed-off-by: Dirk Brenken <dev@brenken.org>
2018-07-30 13:40:13 +02:00
Dirk Brenken
bf5dd58377 luci-app-adblock: backport 3.5.4 to 18.06 branch
Signed-off-by: Dirk Brenken <dev@brenken.org>
2018-07-30 13:27:38 +02:00
Jo-Philipp Wich
6df9a57ef0 luci-theme-openwrt: style tweaks for DSL status display
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 6d74a82bf6)
2018-07-29 21:12:59 +02:00
Jo-Philipp Wich
c26709a850 luci-theme-bootstrap: style tweak for DSL status display
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 765816d07d)
2018-07-29 21:12:59 +02:00
Jo-Philipp Wich
db5bde618b luci-mod-admin-full: rework DSL Status display
Fixes #2003.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit 88713f6456)
2018-07-29 21:12:59 +02:00
Jo-Philipp Wich
d05f442ad5 luci-mod-admin-full: fix style glitch on packages page
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit a0b4d2adb6)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
ea09513095 luci-base: fix luasrcdiet
- Stage required libraries as well
 - Remove not existing make target
 - Override library search path

Fixes: b5d5e5bf1 ("luci-base: update luasrcdiet")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 63fbf5a805)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
680a6d2ad3 luci-proto-relay: propagate up state, do not forward netifd errors
Due to historical reasons, the relayd daemon configuration resides in the
form of a fake "config interface" section in /etc/config/network without
actually registering a protocol handler.

This causes netifd to emit an "INVALID_PROTO" error for the interface
which is technically correct, but confusing for LuCI users.

This situation needs to be resolved upstream by either moving relayd
configuration out of the network config, or by converting the relayd
service into a proper protocol handler.

Until this happens, do not report any netifd errors since we're not
operating on an actual interface.

While we're at it, also propagate the protocol up state from the fake
virtual device to ensure that LuCI displays the relay bridge as "up"
when all relayed interfaces are up as well.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit aae187dedf)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
520afa4c39 luci-base: fix footer template
Move the apply widget markup before the final </html> tag to avoid XHTML
errors with the OpenWrt theme.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 350be23eb9)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
7e5331f154 treewide: rework rollback/apply workflow
Rework the apply confirmation mechanism to be session agnostic in order to
circumvent cross domain restrictions which prevent the JS code from issuing
apply confirm requests in some cases, e.g. when changing the LAN IP.

Confirmation calls may now be done from unauthenticated pages, as long as a
matching confirmation token is sent along with the request.

The reasoning behind this is that there is little security impact in
confirming pending apply sessions, especially since those sessions can only
be initiated while being authenticated.

After this change, LuCI will now launch a confirmation process on every
rendered page when a rollback is pending. The confirmation will happen
regardless of whether the user is logged in or not, or if the current page
is a CBI form or static template.

A confirmation request now also requires a random one-time token which is
rendered along with the confirmation JavaScript code in order to succeed.

This token is not meant to provide security but to ensure that the confirm
was triggered from an interactive browser session and not some background
HTTP requests that happened to end up in the admin ui.

As a consequence, the different apply/confirm/rollback code paths in CBI
maps and the UCI change/revert pages have been consolidated into one common
implementation residing in the common global theme agnostic footer template.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit e5a1ac0228)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
64e3fe9f6b luci-base: xhr.js: decode JSON for POST requests as well
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 98217f8f8d)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
186228e365 luci-base: utils: support multiple return values in util.ubus()
This is needed to deal with ubus methods that return multiple results,
e.g. session/list

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 9ead1e29a6)
2018-07-28 17:14:22 +02:00
Jo-Philipp Wich
58bd130a80 luci-mod-admin-full: abbreviate "MAC-Address" as "MAC" to align with rest
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 8a1bc1814f)
2018-07-26 20:31:35 +02:00
Jo-Philipp Wich
198474f690 luci-mod-admin-full: fix wifi overview display when no networks are defined
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 80706cbafb)
2018-07-26 20:31:33 +02:00
pmelange
667f73a428 ff_olsrd_watchdog: delete existing tunnels
When OLSRd crashes, the old tunnels still exist.  This can lead to unexpected behaviour.
The tunnels to be removed start with "tnl_"

See freifunk-berlin/firmware#522

Signed-off-by: pmelange <isprotejesvalkata@gmail.com>
(cherry picked from commit 5d0b720f8b)
2018-07-26 20:31:27 +02:00
Jo-Philipp Wich
df614ffd43 luci-base: strip superfluous space in additional field markup
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit c27a77756c)
2018-07-26 20:31:05 +02:00
Jo-Philipp Wich
867fcff8bb luci-theme-openwrt: fix button placement quirk
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit efc1a5261a)
2018-07-26 20:31:05 +02:00
Jo-Philipp Wich
97b3e5773d luci-base: cbi.js: fade to-be-deleted section when hovering delete button
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 590d1cc74f)
2018-07-26 20:31:05 +02:00
Jo-Philipp Wich
6cf7d11e15 luci-base: cbi.js: use adjacent button dynlist add/remove buttons
Change the cbi.js code to create  a div based button element instead of an
image button.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 875b561875)
2018-07-26 20:30:44 +02:00
Jo-Philipp Wich
d7d15f6c5c luci-base: rework reveal/hide CBI password template button
Also add a hidden type password field to prevent browser autocompleters
from entering the login passwords into fields liek the wireless WPA key
field.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit b6dd0ecd6c)
2018-07-26 20:30:44 +02:00
Jo-Philipp Wich
97e647bb25 luci-theme-bootstrap: add styling for input-adjacent buttons
Also add styling for CBI column title references.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 7ba4eb1a42)
2018-07-26 20:30:44 +02:00
Jo-Philipp Wich
b8a0b617ad luci-theme-openwrt: add styling for input-adjacent buttons
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 2287e79a5c)
2018-07-26 20:30:44 +02:00
Jo-Philipp Wich
516ce4af78 luci-mod-admin-full: unify "Alias interface" and "Alias Interface" strings
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit 4105c78ff9)
2018-07-26 20:29:51 +02:00
Jo-Philipp Wich
bcb8d8969c luci: do not depend on uhttpd-mod-ubus
We do not need this module at all, yet.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 1602313f5c)
2018-07-26 20:28:43 +02:00
Jo-Philipp Wich
024fa3cf30 luci-theme-openwrt: support rendering tblsection cell descriptions
Add support for rendering the "data-description" attribute when rendering
decomposed tables for small screen resolutions.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit e3f76c255a)
2018-07-26 20:28:36 +02:00
Jo-Philipp Wich
81682971dc luci-base: add description annotations to tblsection cells
Add a "data-description" attribute to CBI fields which have a description
set, this allows responsive design themes to render a field description
when decomposing the table grid.

Also reuse the precalculated "typename" property if it exists, instead of
deriving it from the template name yet again.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 8e0ee137a6)
2018-07-26 20:28:30 +02:00
Krystian Kozak
03b6d77ee3 luci-base: update Polish translation
Updated Polish translations.

Signed-off-by: Krystian Kozak <krystian.kozak20@gmail.com>
(cherry picked from commit a900d61d91)
2018-07-26 20:26:58 +02:00
Dmitry Tunin
ffed0206b9 luci-proto-ncm: remove unrelated options
This removes all options 100% unrelated to NCM protocol.
Some options like 'dns' are not currently used by connection scripts,
but may be used in the future.

Signed-off-by: Dmitry Tunin <hanipouspilot@gmail.com>
(cherry picked from commit 6d03051e95)
2018-07-26 20:26:54 +02:00
Dmitry Tunin
a6b2b29dc6 luci-proto-ncm: add pdptype option
Signed-off-by: Dmitry Tunin <hanipouspilot@gmail.com>
(cherry picked from commit 58fd0749de)
2018-07-26 20:26:50 +02:00
Jo-Philipp Wich
cd72e1d973
Merge pull request #1992 from sotux/openwrt-18.06_zh_CN
luci-base: zh_CN: Update Simplified Chinese translation
2018-07-26 20:23:30 +02:00
Dirk Brenken
7501bf6f5b
Merge pull request #1996 from EricLuehrsen/unbound_1806_doc
[openwrt-18.06] luci-app-unbound: point documentation to 18.06 branch
2018-07-25 06:30:00 +02:00
Zheng Qian
d6f8ac1a76 luci-base: zh_CN: Update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-07-25 11:25:45 +08:00
Eric Luehrsen
ad0d3f5031 luci-app-unbound: point documentation to 18.06 branch
Signed-off-by: Eric Luehrsen <ericluehrsen@gmail.com>
2018-07-24 23:21:00 -04:00
Jo-Philipp Wich
14c73faf31 collections: drop nginx support for 18.06
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-21 14:25:00 +02:00
Jo-Philipp Wich
1d32ea9b03 luci-mod-admin-full: fix check for traceroute6
Since busybox has moved traceroute6 from /usr/bin/ to /bin/, we need to
check both locations.

Fixes #1973.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit e4a86478e6)
2018-07-21 14:20:05 +02:00
Anton Kikin
9724d76619 luci-base: fix Russian translation
More correct translation of the 'instance'.

Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit bf6275c85e)
2018-07-21 14:02:12 +02:00
Olimjon
4c87b8345c luci-app-upnp: update Russian translation
Signed-off-by: Kudratov O <olimko98@gmail.com>
(cherry picked from commit c03bc0f533)
2018-07-21 14:02:08 +02:00
Olimjon
ed4f4644ee Update Russian translation
[backported from 6a151eb70e]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-21 14:01:27 +02:00
Stan Grishin
4b267cecfd luci-app-simple-adblock: remove extra controller file
Signed-off-by: Stan Grishin <stangri@melmac.net>
(cherry picked from commit aaddcac5b0)
2018-07-21 13:59:03 +02:00
Yurii
968f9dc0aa luci-base: update Ukrainian translation
Updated with the latest resync translation, corrections and additions.

Signed-off-by: Yurii yuripet@gmail.com
(cherry picked from commit 4fa9115de6)
2018-07-21 13:58:29 +02:00
Yurii
11e9a5503e luci-app-upnp: update Ukrainian translation
Signed-off-by: Yurii yuripet@gmail.com
(cherry picked from commit 9a6026b3d5)
2018-07-21 13:58:24 +02:00
Yurii
18c8e1fe58 luci-app-wol: update Ukrainian translation
Corrections and additions.

Signed-off-by: Yurii yuripet@gmail.com
(cherry picked from commit 2d946363b3)
2018-07-21 13:58:20 +02:00
Jo-Philipp Wich
c81359898e luci-base: fix bad CSS class names in table section template
The previous refactoring of the template caused the row stripying CSS
classes to be interpolated in such a way, that a separating space to
previous CSS classes was missing, leading to not rendered row names
and other side effects.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-20 11:38:35 +02:00
Jo-Philipp Wich
39401a7615 luci-app-ocserv: remove unneeded br element from template
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 985a7db408)
2018-07-20 09:11:01 +02:00
Jo-Philipp Wich
5b34fbaab7 luci-app-ocserv: update user status template
- Use cbi_update_table() helper to refresh user list
- Cleanup markup and remove uneeded CSS classes

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit f4ba55532f)
2018-07-20 09:08:38 +02:00
INAGAKI Hiroshi
5bbf669c85 luci-base: update Japanese translation
Updated Japanese translations.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(cherry picked from commit 72517887cb)
2018-07-20 08:56:08 +02:00
INAGAKI Hiroshi
da600939fc i18n: sync translations
Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(backported from commit 86660f92d1)
2018-07-20 08:55:45 +02:00
Dmitry Tunin
beb9ab2daa luci-proto-ncm: add modem default mode
Signed-off-by: Dmitry Tunin <hanipouspilot@gmail.com>
(cherry picked from commit 57439d8daa)
2018-07-20 08:48:39 +02:00
Ansuel Smith
16837a5d0c luci-admin-full: add further wifi options
This commit adds option to disable scan for 40mhz channel, permit to tweak
beacon interval and other advanced settings.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
[fix whitespace, add range constraint to dtim_period, add dtim_period
 to local vars, reword commit message]
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit 39cabc0361)
2018-07-20 08:48:39 +02:00
Ansuel Smith
758c66b9da luci-admin-full: add dnsmasq allservers option
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit 7ff8d15e24)
2018-07-20 08:48:39 +02:00
Stan Grishin
69a4c258f4 luci-app-simple-adblock: change style of button to important
Signed-off-by: Stan Grishin <stangri@melmac.net>
(cherry picked from commit 3471e37b3b)
2018-07-20 08:01:23 +02:00
Stan Grishin
b9166ca964 luci-app-advanced-reboot: change style of buttons to important
Signed-off-by: Stan Grishin <stangri@melmac.net>
(cherry picked from commit 4f921594bb)
2018-07-20 08:01:19 +02:00
Anton Kikin
5fc6bc7d90 luci-app-ddns: update and improve Russian translation
Update existing not quite correct translations.

Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit 628745044b)
2018-07-20 08:01:16 +02:00
Anton Kikin
d3bfc5d03e luci-base: fix a typo in Russian translation
Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit 4aad4a75ba)
2018-07-20 08:01:12 +02:00
Jo-Philipp Wich
91238dccc7 luci-theme-bootstrap: allow pointer events on readonly textareas and dropdowns
This is required to scroll and select text.

Fixes #1965
Fixes 887d0a685 ("luci-theme-bootstrap: cleanup CSS")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit a68006245d)
2018-07-20 08:01:04 +02:00
Jo-Philipp Wich
5d4c365f13 luci-theme-openwrt: fix another instance of misplaced page action button
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 369553cd14)
2018-07-20 08:00:49 +02:00
Jo-Philipp Wich
8d88802b83 luci-mod-admin-full: use incremental background scanning for wireless join
The previous approach of synchroneously scanning while building the result
page was suboptimal since it frequently led to connection resets when
accessing LuCI via wireless.

It also exhibited problems when accessed via SSL on recent Firefox versions
where the page were only loaded partially.

Rework the wireless scanning to gather scan results in a background process
and put them into the ubus session data area where they can be readily
accessed without causing network interruptions.

Subsequently rebuild the wireless join page to use XHR polling to
incrementally fetch updated scan results.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 9b4efaefa1)
2018-07-20 08:00:45 +02:00
Jo-Philipp Wich
5ea795a4b8 luci-theme-openwrt: fixes for page action button placement
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 68dae07225)
2018-07-20 07:56:53 +02:00
Jo-Philipp Wich
fbc02d33a3 luci-theme-bootstrap: various fixes
- Styling fixes for table hover rows, striping and title row coloring
- Fixes for page action button placement

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 29f542fa62)
2018-07-20 07:56:50 +02:00
Jo-Philipp Wich
0b44d33dd7 luci-mod-admin-full: properly reset internal device form field
In some cases the hidden internal device field was not reset, e.g. after
aborting a wifi scan and using the browser back buttons to navigate to the
overview page again.

In such a case, the previous device hidden field was still present and a new
one getting created, causing further wireless scan attempts to get invoked
with multiple radio names as parameter which fails.

Fix this issue by using the new generic cbi_submit() helper any by dropping
the faulty wifi_action() function.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 90f9c59a2d)
2018-07-20 07:56:46 +02:00
Jo-Philipp Wich
d7c868a05e luci-base: rework CBI footer template
- Make sure that hitting enter in the form hits the CBI save action and not
  apply or cancel
- Hide action panel if no actions are available
- CLeanup code

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit c09e154560)
2018-07-20 07:56:38 +02:00
Jo-Philipp Wich
bea5187f3d luci-base: rework tblsection template
- Hide empty title and description rows
- Correct row striping offset
- Cleanup code

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit f1fb7122e3)
2018-07-20 07:56:35 +02:00
Jo-Philipp Wich
24b924bfe4 luci-base: rework simpleform template
- Ensure that pressing enter in the form triggers the submit action and
  not a cbi skip or cancel
- Hide page actions when empty
- Cleanup code

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit bc562294b9)
2018-07-20 07:56:31 +02:00
Jo-Philipp Wich
392fd02383 luci-base: cbi.js: add cbi_submit() helper
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 7b43e81c9b)
2018-07-20 07:56:12 +02:00
Jo-Philipp Wich
c0612e8208 luci-mod-admin-full: offer "Cancel" button in iface add dialog
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 9bdd097f53)
2018-07-20 07:55:59 +02:00
Jo-Philipp Wich
94b6aa2a8e luci-base: remove unused icons
- The wifi_big.png / wifi_big_disabled.png icons were used on the wireless
   overview page which now uses badges with normal sized icons
 - The encryption.png / encryption_disabled.png icons were never used at all

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 92360f2d5b)
2018-07-17 20:52:24 +02:00
Anton Kikin
53686fd492 luci-base: update and improve Russian translation
Add missing translations and update existing not quite correct translations.
Replaced hyphens on em dashes where it is required by the Russian rules.

Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit de74dcec1b)
2018-07-17 20:52:24 +02:00
Anton Kikin
0b00ceef01 luci-base: fix Russian translation
Removed redundant <br> tags from translations.

Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit efb38849d9)
2018-07-17 20:52:24 +02:00
Stan Grishin
984a1afcf7 luci-app-simple-adblock: new start/stop button, better integration with simple-adblock
Signed-off-by: Stan Grishin <stangri@melmac.net>
(cherry picked from commit 768a72597c)
2018-07-17 20:52:24 +02:00
Yurii
a7e1edf936 luci-app-upnp: update Ukrainian translation
Corrections translation.

Signed-off-by: Yurii yuripet@gmail.com
(cherry picked from commit 4f5e1c7da5)
2018-07-17 20:52:24 +02:00
Yurii
8d882e5593 luci-base: update Ukrainian translation
Updated with the latest resync translation, corrections and additions translation.

Signed-off-by: Yurii yuripet@gmail.com
(cherry picked from commit 3859d444db)
2018-07-17 20:52:23 +02:00
amitabha
b49c62b2eb base.po: Update chinese translations.
Fix some Chinese translations.
Signed-off-by: Angus Ding <angus.ding@gmail.com>
(cherry picked from commit 92404498a1)
2018-07-17 20:52:23 +02:00
Anton Kikin
bf2c25e440 luci-base: fix Russian translation
Signed-off-by: Anton Kikin <a.kikin@tano-systems.com>
(cherry picked from commit 6f29acdfb7)
2018-07-17 20:52:23 +02:00
Daniel Dickinson
edbcdef15c luci-base: Avoid block umount on fstab apply
Default behaviour of changes to fstab (Mount Points) was
to use /etc/init.d/fstab restart, however this unmounts
filesystems via block umount which can cause the device
to fail, so replace the initscript call with an exec
of 'block mount'.

Signed-off-by: Daniel Dickinson <lede@cshore.thecshore.com>
(cherry picked from commit 33b279c475)
2018-07-17 20:47:48 +02:00
Jo-Philipp Wich
efff0139be luci-base: resync translations
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-17 20:46:54 +02:00
Jo-Philipp Wich
b8b87182f6 luco-proto-ipv6: allow multiple prefixes for 6in4 and dhcpv6
Fixes FS#1361.
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit 60e7ea2fc8)
2018-07-17 16:20:15 +02:00
Jo-Philipp Wich
4da137e892 luci-base: fix field section add button/input field names
Some CBI map models, mainly the Network -> VLAN page, expect a valid
previous section ID in their Section:create() callback.

Previous refactoring of the tblsection markup broke this behaviour as
the "section" loop variable was accidentally localized, causing it to
be undefined outside of the loop body which caused the section add
button and name input fields to get rendered with a wrong "name"
attribute.

Fix this by moving the "section" variable declaration out of the loop
and by readding references to it in the non-anonymous section add case.

Fixes FS#1657
Fixes 002c4d1d5 ("luci-base: add "Name" label to autogenerated title column")
Signed-off-by: Jo-Philipp Wich <jo@mein.io>

(cherry picked from commit fcc9cd6a9a)
2018-07-16 17:35:07 +02:00
Jo-Philipp Wich
911219898f luci-mod-admin-full: fix changing alias interface ifnames
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-15 17:35:28 +02:00
Jo-Philipp Wich
9cc24e6c62 luci-base: fix handling alias interfaces in ifacelist widget
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-15 17:35:28 +02:00
Jo-Philipp Wich
cd8fc00130 luci-base: luci.model.network: recognize alias interfaces
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-15 17:35:28 +02:00
Jo-Philipp Wich
d03537c2dd luci-mod-admin-full: improve interface overview display
Remove the guessing of primary interfaces for now as we cannot yet properly
track parent / child interface relations.

Instead, add tooltips to the interface icons displaying detailed physical
layer information per netdev.

For dynamic or true alias interfaces (using "@" notation), skip the
reporting of MAC and traffic stats.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-15 17:35:28 +02:00
Jo-Philipp Wich
8a7cd70d4d luci-theme-bootstrap: small style fix for link buttons
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-15 17:35:28 +02:00
Jo-Philipp Wich
98adc98f75 luci-mod-admin-full: fix wifi add and scan actions
Due to conversion to CBI, the inline forms are now nested and thus do not
work anymore.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit f6ffc3d739)
2018-07-15 13:31:56 +02:00
Jo-Philipp Wich
f974cfe093 luci-base: update german translation
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(backported from commit f29b2a2652)
2018-07-15 12:29:39 +02:00
Krystian Kozak
16aa088cab luci-base: update Polish translation
Updated Polish translations.

Signed-off-by: Krystian Kozak <krystian.kozak20@gmail.com>
(backported from commit 77b8aa50e0)
2018-07-15 12:28:47 +02:00
Jo-Philipp Wich
fb817df836 openwrt-18.06: merge master
Due to a huge number of fixes and diverging development histories, I decided
to completely merge the current LuCI master into the 18.06 release branch to
have a common code base for upcoming maintenance releases.

Some LuCI apps have minor style glitches yet but I do not deem them to be
release critical as non-default components need to be opkg-installed anyway
and the package repositories are continuously refreshed, so we do not need
to fix everything for OpenWrt 18.06.0-rc2.

The most important changes introduced by this merge are:

1) New HTTP handling library in C

  The new library should vastly reduce the required RAM for processing
  large POST bodies while implementing some slightly more strict parsing
  logic.

2) Apply/Rollback workflow

  The ubus rpcd based apply/rollback handling will automatically revert
  config changes if access to the device is lost for a certain period
  of time, this is mainly intended for preventing issues with bad
  config settings and the like.

  The feature is not 100% error-proof yet but it successfully prevents a
  large number of issues already. For final, the handling of the firewall
  conntrack cache needs to be fixed yet as adding "lockout" firewall rules
  is not yet catched due to the open HTTP session allowed by netfilter
  conntrack

3) Template markup and theme style modifications

  A large number of changes have been made to the markup in the various
  templates, mainly to allow for responsive styling of tables.

  The only theme currently making full use of that is the non-default
  OpenWrt theme which will break table rows into disjunct boxes on
  very narrow screens.

  The changes have been tested on IE 11, MS Edge, Firefox, Chrome, an
  iPhone 5s, iPhone 6 and iPad Air.

4) Initial LuCI support for displaying virtual dynamic network interfaces

  Some protocol handlers will spawn purely dynamic sub-interfaces which
  are not present in UCI. Such interfaces have been invisible in LuCI so
  far which caused confusion especialy wrt. missing IP addresses etc.

  LuCI will now display such dynamic interfaces on the interface overview.

5) Initial LuCI support for display interface runtime error information

  LuCI will now expose interface error information stored in the ubus
  runtime information by protocol handlers.

  This is mainly useful to get notified of low level problems like
  bad SIM codes are missing APN information.

6) Various XSS and CSRF bypass fixes

  A number of code places performing inadequate markup escaping have been
  fixed and the dispatcher CSRF token enforcement rules have been reworked
  to actually catch all POST security cases.

7) Initial support for running under nginx

  Various bugs have been fixed to allow LuCI to function under nginx using
  a FastCGI wrapper.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
2018-07-13 17:22:53 +02:00
Hannu Nyman
4ba85e3d82 luci-app-transmission: fix typo
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-06-29 18:20:09 +03:00
Hannu Nyman
c379f00e86
Merge pull request #1878 from sotux/openwrt-18.06_zh_CN
luci-app-firewall: zh_CN: change better translation for offloading
2018-06-12 19:56:38 +03:00
Zheng Qian
21a1cc9d9b luci-app-firewall: zh_CN: change better translation for offloading
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-06-12 12:06:34 +08:00
Hannu Nyman
ef35d85971
Merge pull request #1873 from sotux/openwrt-18.06
update Openwrt 18.06 Simplified Chinese translation
2018-06-09 16:43:55 +03:00
Zheng Qian
d1c436df3f luci-app-upnp: zh_CN: update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-06-09 21:38:17 +08:00
Zheng Qian
987a3a0a82 luci-app-firewall: zh_CN: update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-06-09 21:38:01 +08:00
Zheng Qian
4e9271d5e8 luci-base: zh_CN: update Simplified Chinese translation
Signed-off-by: Zheng Qian <sotux82@gmail.com>
2018-06-09 21:38:01 +08:00
Hannu Nyman
29b4c7146b
Merge pull request #1840 from EricLuehrsen/openwrt-18.06
[openwrt-18.06] luci-app-unbound: provide transparent defaults with documentation
2018-05-29 11:29:28 +03:00
Eric Luehrsen
452c95cdc7 luci-app-unbound: provide transparent defaults with documentation
Signed-off-by: Eric Luehrsen <ericluehrsen@hotmail.com>
2018-05-29 00:01:07 -04:00
Yousong Zhou
485f411b4e shadowsocks-libev: fix enumerating server and ss_redir sections
The issue existed since the first revision of the rewrite and was
exposed by commit 4024d4f (luci-base: switch to ubus uci operations)

A quick scan of the current repo indicates that these are the only sites
of wrong call pattern

Fixes openwrt/packages#6113

Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
2018-05-28 11:21:56 +08:00
Ansuel Smith
e1ab470f4c luci-base: fix broken translation
Currently this translation refer to an old string, sync to the new one.

Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
(cherry picked from commit c29ffe4dfc)
2018-05-27 22:09:05 +03:00
INAGAKI Hiroshi
f569e7fc6a luci-app-firewall: update Japanese translation
Added Japanese translations for offloading options.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(cherry picked from commit a3be234992)
2018-05-27 19:27:40 +03:00
INAGAKI Hiroshi
2742a1efa6 luci-app-firewall: sync translations
Synchronized translations with sources.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(cherry picked from commit b4d484e372)
2018-05-27 19:27:28 +03:00
Hannu Nyman
1a918d8fae luci-app-firewall: expose flow offloading options
Expose options related to routing/NAT flow offloading
feature in firewall3. Offloading is available in kernel 4.14+

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
(cherry picked from commit 177224c14a)
2018-05-27 19:26:39 +03:00
INAGAKI Hiroshi
deae048c94 luci-app-mwan3: update Japanese translation
Updated Japanese translations.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(cherry picked from commit e050337c51)
2018-05-27 19:22:40 +03:00
INAGAKI Hiroshi
9699dd7d33 luci-app-adblock: update Japanese translation
Updated Japanese translations.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>

(cherry picked from commit d3c1951cbb
adapted for small difference betwenn master and 18.06)
2018-05-27 19:14:24 +03:00
Dirk Brenken
d843063e4a luci-app-travelmate: fix url ampersand encoding
* fix ampersand encoding in wireless stations overview

Signed-off-by: Dirk Brenken <dev@brenken.org>
(cherry picked from commit 85342e2c03)
2018-05-27 19:07:46 +03:00
INAGAKI Hiroshi
fdb008123f luci-app-travelmate: update Japanese translation
Updated Japanese translations.

Signed-off-by: INAGAKI Hiroshi <musashino.open@gmail.com>
(cherry picked from commit af19588b9e)
2018-05-27 19:07:35 +03:00
Hannu Nyman
1341412893 i18n: one more fix for Polish translation
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-05-25 17:10:04 +03:00
Hannu Nyman
c5459f52f4 i18n: sync, fix and cleanup translations
* sync translations (aiccu removal)
* remove some other old strings
* fix Polish translation

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-05-25 16:52:30 +03:00
Florian Eckert
690c7c71dc luci-proto-ipv6: remove outdated aiccu proto support
Remove outdated package for luci proto section.
See commit:
441f8a3ed1

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 9e3fb2c585)
2018-05-25 16:47:18 +03:00
Hannu Nyman
b2a247a1e9 i18n: sync tranlations
Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2018-05-20 19:45:33 +03:00
Helge Mader
7ebf84a17b luci-app-ddns: fix HTML page rendering in globals section
Signed-off-by: Helge Mader <ma@dev.tdt.de>

(cherry picked from commit 7a9957e727)
2018-05-16 16:43:04 +03:00
Rixerx
1faa9a3cb6 luci-base: update Polish translation
Signed-off-by: Rixerx <krystian.kozak20@gmail.com>
(cherry picked from commit 3782e74cf8)
2018-05-16 16:42:26 +03:00
Florian Eckert
211d7bb9e4 luci-app-mwan3: add quality check options
Add new quality_check feature

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 9a93359d42)
2018-05-16 16:41:05 +03:00
Florian Eckert
9105d78603 luci-app-mwan3: add dependecy to size option
This option is only valid if track-method is set to "ping".

Signed-off-by: Florian Eckert <fe@dev.tdt.de>
(cherry picked from commit 2c6faaecd1)
2018-05-16 16:40:52 +03:00
882 changed files with 30351 additions and 37729 deletions

View file

@ -3,9 +3,12 @@
module("luci.controller.adblock", package.seeall)
local sys = require("luci.sys")
local util = require("luci.util")
local templ = require("luci.template")
local http = require("luci.http")
local i18n = require("luci.i18n")
local json = require("luci.jsonc")
local uci = require("luci.model.uci").cursor()
function index()
if not nixio.fs.access("/etc/config/adblock") then
@ -13,24 +16,56 @@ function index()
end
entry({"admin", "services", "adblock"}, firstchild(), _("Adblock"), 30).dependent = false
entry({"admin", "services", "adblock", "tab_from_cbi"}, cbi("adblock/overview_tab", {hideresetbtn=true, hidesavebtn=true}), _("Overview"), 10).leaf = true
entry({"admin", "services", "adblock", "logfile"}, call("logread"), _("View Logfile"), 20).leaf = true
entry({"admin", "services", "adblock", "log"}, template("adblock/logread"), _("View Logfile"), 20).leaf = true
entry({"admin", "services", "adblock", "advanced"}, firstchild(), _("Advanced"), 100)
entry({"admin", "services", "adblock", "advanced", "blacklist"}, form("adblock/blacklist_tab"), _("Edit Blacklist"), 110).leaf = true
entry({"admin", "services", "adblock", "advanced", "whitelist"}, form("adblock/whitelist_tab"), _("Edit Whitelist"), 120).leaf = true
entry({"admin", "services", "adblock", "advanced", "configuration"}, form("adblock/configuration_tab"), _("Edit Configuration"), 130).leaf = true
entry({"admin", "services", "adblock", "advanced", "query"}, template("adblock/query"), _("Query domains"), 140).leaf = true
entry({"admin", "services", "adblock", "advanced", "result"}, call("queryData"), nil, 150).leaf = true
entry({"admin", "services", "adblock", "logread"}, call("logread"), nil).leaf = true
entry({"admin", "services", "adblock", "status"}, call("status_update"), nil).leaf = true
entry({"admin", "services", "adblock", "action"}, call("adb_action"), nil).leaf = true
end
function adb_action(name)
if name == "do_suspend" then
luci.sys.call("/etc/init.d/adblock suspend >/dev/null 2>&1")
elseif name == "do_resume" then
luci.sys.call("/etc/init.d/adblock resume >/dev/null 2>&1")
elseif name == "do_refresh" then
luci.sys.call("/etc/init.d/adblock reload >/dev/null 2>&1")
end
luci.http.prepare_content("text/plain")
luci.http.write("0")
end
function status_update()
local rt_file
local content
rt_file = uci:get("adblock", "global", "adb_rtfile") or "/tmp/adb_runtime.json"
if nixio.fs.access(rt_file) then
content = json.parse(nixio.fs.readfile(rt_file) or "")
http.prepare_content("application/json")
http.write_json(content)
end
end
function logread()
local logfile
local content
if nixio.fs.access("/var/log/messages") then
logfile = util.trim(util.exec("grep -F 'adblock-' /var/log/messages"))
content = util.trim(util.exec("grep -F 'adblock-' /var/log/messages"))
else
logfile = util.trim(util.exec("logread -e 'adblock-'"))
content = util.trim(util.exec("logread -e 'adblock-'"))
end
templ.render("adblock/logread", {title = i18n.translate("Adblock Logfile"), content = logfile})
if content == "" then
content = "No adblock related logs yet!"
end
http.write(content)
end
function queryData(domain)

View file

@ -1,19 +1,19 @@
-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
local fs = require("nixio.fs")
local util = require("luci.util")
local uci = require("luci.model.uci").cursor()
local adbinput = uci:get("adblock", "blacklist", "adb_src") or "/etc/adblock/adblock.blacklist"
local fs = require("nixio.fs")
local util = require("luci.util")
local uci = require("luci.model.uci").cursor()
local input = uci:get("adblock", "blacklist", "adb_src") or "/etc/adblock/adblock.blacklist"
if not fs.access(adbinput) then
if not fs.access(input) then
m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
m.reset = false
m.submit = false
return m
end
if fs.stat(adbinput).size >= 102400 then
if fs.stat(input).size >= 102400 then
m = SimpleForm("error", nil,
translate("The file size is too large for online editing in LuCI (&ge; 100 KB). ")
.. translate("Please edit this file directly in a terminal session."))
@ -28,7 +28,7 @@ m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
translatef("This form allows you to modify the content of the adblock blacklist (%s).<br />", adbinput)
translatef("This form allows you to modify the content of the adblock blacklist (%s). ", input)
.. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
f = s:option(TextValue, "data")
@ -37,11 +37,15 @@ f.rows = 20
f.rmempty = true
function f.cfgvalue()
return fs.readfile(adbinput) or ""
return fs.readfile(input) or ""
end
function f.write(self, section, data)
return fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
return fs.writefile(input, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
end
function f.remove(self, section, value)
return fs.writefile(input, "")
end
function s.handle(self, state, data)

View file

@ -1,18 +1,18 @@
-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
local fs = require("nixio.fs")
local util = require("luci.util")
local adbinput = "/etc/config/adblock"
local fs = require("nixio.fs")
local util = require("luci.util")
local input = "/etc/config/adblock"
if not fs.access(adbinput) then
if not fs.access(input) then
m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
m.reset = false
m.submit = false
return m
end
if fs.stat(adbinput).size >= 102400 then
if fs.stat(input).size >= 102400 then
m = SimpleForm("error", nil,
translate("The file size is too large for online editing in LuCI (&ge; 100 KB). ")
.. translate("Please edit this file directly in a terminal session."))
@ -34,11 +34,15 @@ f.rows = 20
f.rmempty = true
function f.cfgvalue()
return fs.readfile(adbinput) or ""
return fs.readfile(input) or ""
end
function f.write(self, section, data)
return fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
return fs.writefile(input, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
end
function f.remove(self, section, value)
return fs.writefile(input, "")
end
function s.handle(self, state, data)

View file

@ -1,69 +1,27 @@
-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
local fs = require("nixio.fs")
local uci = require("luci.model.uci").cursor()
local sys = require("luci.sys")
local util = require("luci.util")
local dump = util.ubus("network.interface", "dump", {})
local json = require("luci.jsonc")
local adbinput = uci:get("adblock", "global", "adb_rtfile") or "/tmp/adb_runtime.json"
local fs = require("nixio.fs")
local uci = require("luci.model.uci").cursor()
local util = require("luci.util")
local dump = util.ubus("network.interface", "dump", {})
m = Map("adblock", translate("Adblock"),
translate("Configuration of the adblock package to block ad/abuse domains by using DNS. ")
.. translatef("For further information "
.. "<a href=\"%s\" target=\"_blank\">"
.. "check the online documentation</a>", "https://github.com/openwrt/packages/blob/master/net/adblock/files/README.md"))
m.apply_on_parse = true
function m.on_apply(self)
luci.sys.call("/etc/init.d/adblock reload >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
end
-- Main adblock options
s = m:section(NamedSection, "global", "adblock")
local parse = json.parse(fs.readfile(adbinput) or "")
if parse then
status = parse.data.adblock_status
version = parse.data.adblock_version
domains = parse.data.overall_domains
fetch = parse.data.fetch_utility
backend = parse.data.dns_backend
rundate = parse.data.last_rundate
end
o1 = s:option(Flag, "adb_enabled", translate("Enable Adblock"))
o1.default = o1.disabled
o1.rmempty = false
btn = s:option(Button, "", translate("Suspend / Resume Adblock"))
if parse and status == "enabled" then
btn.inputtitle = translate("Suspend")
btn.inputstyle = "reset"
btn.disabled = false
function btn.write()
luci.sys.call("/etc/init.d/adblock suspend >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
end
elseif parse and status == "paused" then
btn.inputtitle = translate("Resume")
btn.inputstyle = "apply"
btn.disabled = false
function btn.write()
luci.sys.call("/etc/init.d/adblock resume >/dev/null 2>&1")
luci.http.redirect(luci.dispatcher.build_url("admin", "services", "adblock"))
end
else
btn.inputtitle = translate("-------")
btn.inputstyle = "button"
btn.disabled = true
end
o2 = s:option(ListValue, "adb_dns", translate("DNS Backend (DNS Directory)"),
translate("List of supported DNS backends with their default list export directory.<br />")
translate("List of supported DNS backends with their default list export directory. ")
.. translate("To overwrite the default path use the 'DNS Directory' option in the extra section below."))
o2:value("dnsmasq", "dnsmasq (/tmp)")
o2:value("unbound", "unbound (/var/lib/unbound)")
@ -85,7 +43,7 @@ o3.default = "uclient-fetch"
o3.rmempty = false
o4 = s:option(ListValue, "adb_trigger", translate("Startup Trigger"),
translate("List of available network interfaces. Usually the startup will be triggered by the 'wan' interface.<br />")
translate("List of available network interfaces. Usually the startup will be triggered by the 'wan' interface. ")
.. translate("Choose 'none' to disable automatic startups, 'timed' to use a classic timeout (default 30 sec.) or select another trigger interface."))
o4:value("none")
o4:value("timed")
@ -101,66 +59,8 @@ o4.rmempty = false
-- Runtime information
ds = m:section(NamedSection, "global", "adblock", translate("Runtime Information"))
dv1 = ds:option(DummyValue, "", translate("Adblock Status"))
dv1.template = "adblock/runtime"
if parse == nil then
dv1.value = translate("n/a")
else
if status == "error" then
dv1.value = translate("error")
elseif status == "disabled" then
dv1.value = translate("disabled")
elseif status == "paused" then
dv1.value = translate("paused")
elseif status == "running" then
dv1.value = translate("running")
else
dv1.value = translate("enabled")
end
end
dv2 = ds:option(DummyValue, "", translate("Adblock Version"))
dv2.template = "adblock/runtime"
if parse == nil then
dv2.value = translate("n/a")
else
dv2.value = version
end
dv3 = ds:option(DummyValue, "", translate("Download Utility (SSL Library)"),
translate("For SSL protected blocklist sources you need a suitable SSL library, e.g. 'libustream-ssl' or 'built-in'."))
dv3.template = "adblock/runtime"
if parse == nil then
dv3.value = translate("n/a")
else
dv3.value = fetch
end
dv4 = ds:option(DummyValue, "", translate("DNS Backend (DNS Directory)"))
dv4.template = "adblock/runtime"
if parse == nil then
dv4.value = translate("n/a")
else
dv4.value = backend
end
dv5 = ds:option(DummyValue, "", translate("Overall Domains"))
dv5.template = "adblock/runtime"
if parse == nil then
dv5.value = translate("n/a")
else
dv5.value = domains
end
dv6 = ds:option(DummyValue, "", translate("Last Run"))
dv6.template = "adblock/runtime"
if parse == nil then
dv6.value = translate("n/a")
else
dv6.value = rundate
end
ds = s:option(DummyValue, "_dummy")
ds.template = "adblock/runtime"
-- Blocklist table
@ -197,46 +97,54 @@ e1 = e:option(Flag, "adb_debug", translate("Verbose Debug Logging"),
e1.default = e1.disabled
e1.rmempty = false
e2 = e:option(Flag, "adb_forcedns", translate("Force Local DNS"),
translate("Redirect all DNS queries from 'lan' zone to the local resolver."))
e2 = e:option(Flag, "adb_nice", translate("Low Priority Service"),
translate("Set the nice level to 'low priority' and the adblock background processing will take less resources from the system. ")
..translate("This change requires a manual service stop/re-start to take effect."))
e2.default = e2.disabled
e2.disabled = "0"
e2.enabled = "10"
e2.rmempty = false
e3 = e:option(Flag, "adb_forcesrt", translate("Force Overall Sort"),
translate("Enable memory intense overall sort / duplicate removal on low memory devices (&lt; 64 MB free RAM)"))
e3 = e:option(Flag, "adb_forcedns", translate("Force Local DNS"),
translate("Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp and tcp protocol on ports 53, 853 and 5353."))
e3.default = e3.disabled
e3.rmempty = false
e4 = e:option(Flag, "adb_backup", translate("Enable Blocklist Backup"),
translate("Create compressed blocklist backups, they will be used in case of download errors or during startup in backup mode."))
e4 = e:option(Flag, "adb_forcesrt", translate("Force Overall Sort"),
translate("Enable memory intense overall sort / duplicate removal on low memory devices (&lt; 64 MB free RAM)"))
e4.default = e4.disabled
e4.rmempty = false
e5 = e:option(Value, "adb_backupdir", translate("Backup Directory"),
e5 = e:option(Flag, "adb_backup", translate("Enable Blocklist Backup"),
translate("Create compressed blocklist backups, they will be used in case of download errors or during startup in backup mode."))
e5.default = e5.disabled
e5.rmempty = false
e6 = e:option(Value, "adb_backupdir", translate("Backup Directory"),
translate("Target directory for adblock backups. Please use only non-volatile disks, e.g. an external usb stick."))
e5:depends("adb_backup", 1)
e5.datatype = "directory"
e5.default = "/mnt"
e6:depends("adb_backup", 1)
e6.datatype = "directory"
e6.default = "/mnt"
e5.rmempty = true
e6 = e:option(Flag, "adb_backup_mode", translate("Backup Mode"),
e7 = e:option(Flag, "adb_backup_mode", translate("Backup Mode"),
translate("Do not automatically update blocklists during startup, use blocklist backups instead."))
e6:depends("adb_backup", 1)
e6.default = e6.disabled
e6.rmempty = true
e7:depends("adb_backup", 1)
e7.default = e7.disabled
e7.rmempty = true
e7 = e:option(Value, "adb_maxqueue", translate("Max. Download Queue"),
translate("Size of the download queue to handle downloads &amp; list processing in parallel (default '4').<br />")
e8 = e:option(Value, "adb_maxqueue", translate("Max. Download Queue"),
translate("Size of the download queue to handle downloads &amp; list processing in parallel (default '4'). ")
.. translate("For further performance improvements you can raise this value, e.g. '8' or '16' should be safe."))
e7.default = 4
e7.datatype = "range(1,32)"
e7.rmempty = false
e8.default = 4
e8.datatype = "range(1,32)"
e8.rmempty = false
e8 = e:option(Flag, "adb_jail", translate("'Jail' Blocklist Creation"),
translate("Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all domains except those listed in the whitelist file.<br />")
e9 = e:option(Flag, "adb_jail", translate("'Jail' Blocklist Creation"),
translate("Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all domains except those listed in the whitelist file. ")
.. translate("You can use this restrictive blocklist manually e.g. for guest wifi or kidsafe configurations."))
e8.default = e8.disabled
e8.rmempty = true
e9.default = e9.disabled
e9.rmempty = true
e9 = e:option(Flag, "adb_dnsflush", translate("Flush DNS Cache"),
translate("Flush DNS Cache after adblock processing."))
@ -244,13 +152,13 @@ e9.default = e9.disabled
e9.rmempty = true
e10 = e:option(Flag, "adb_notify", translate("Email Notification"),
translate("Send notification emails in case of a processing error or if domain count is &le; 0.<br />")
translate("Send notification emails in case of a processing error or if domain count is &le; 0. ")
.. translate("Please note: this needs additional 'msmtp' package installation and setup."))
e10.default = e10.disabled
e10.rmempty = true
e11 = e:option(Value, "adb_notifycnt", translate("Email Notification Count"),
translate("Raise the minimum email notification count, to get emails if the overall count is less or equal to the given limit (default 0),<br />")
translate("Raise the minimum email notification count, to get emails if the overall count is less or equal to the given limit (default 0), ")
.. translate("e.g. to receive an email notification with every adblock update set this value to 150000."))
e11.default = 0
e11.datatype = "min(0)"

View file

@ -1,19 +1,19 @@
-- Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
-- This is free software, licensed under the Apache License, Version 2.0
local fs = require("nixio.fs")
local util = require("luci.util")
local uci = require("luci.model.uci").cursor()
local adbinput = uci:get("adblock", "global", "adb_whitelist") or "/etc/adblock/adblock.whitelist"
local fs = require("nixio.fs")
local util = require("luci.util")
local uci = require("luci.model.uci").cursor()
local input = uci:get("adblock", "global", "adb_whitelist") or "/etc/adblock/adblock.whitelist"
if not fs.access(adbinput) then
if not fs.access(input) then
m = SimpleForm("error", nil, translate("Input file not found, please check your configuration."))
m.reset = false
m.submit = false
return m
end
if fs.stat(adbinput).size >= 102400 then
if fs.stat(input).size >= 102400 then
m = SimpleForm("error", nil,
translate("The file size is too large for online editing in LuCI (&ge; 100 KB). ")
.. translate("Please edit this file directly in a terminal session."))
@ -28,7 +28,7 @@ m.submit = translate("Save")
m.reset = false
s = m:section(SimpleSection, nil,
translatef("This form allows you to modify the content of the adblock whitelist (%s).<br />", adbinput)
translatef("This form allows you to modify the content of the adblock whitelist (%s). ", input)
.. translate("Please add only one domain per line. Comments introduced with '#' are allowed - ip addresses, wildcards and regex are not."))
f = s:option(TextValue, "data")
@ -37,11 +37,15 @@ f.rows = 20
f.rmempty = true
function f.cfgvalue()
return fs.readfile(adbinput) or ""
return fs.readfile(input) or ""
end
function f.write(self, section, data)
return fs.writefile(adbinput, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
return fs.writefile(input, "\n" .. util.trim(data:gsub("\r\n", "\n")) .. "\n")
end
function f.remove(self, section, value)
return fs.writefile(input, "")
end
function s.handle(self, state, data)

View file

@ -4,81 +4,65 @@ This is free software, licensed under the Apache License, Version 2.0
-%>
<%-
local rowcnt = 1
function rowstyle()
rowcnt = rowcnt + 1
return (rowcnt % 2) + 1
end
function width(o)
if o.width then
if type(o.width) == 'number' then
return ' style="width:%dpx"' % o.width
end
return ' style="width:%s"' % o.width
end
return ''
end
local anonclass = (not self.anonymous or self.sectiontitle) and "named" or "anonymous"
-%>
<style type="text/css">
.table.cbi-section-table .th,
.table.cbi-section-table .td,
.cbi-section-table-cell,
.cbi-section-table-row
.cbi-section-table-row,
.tr[data-title]::before
{
text-align:left;
vertical-align:top;
margin-right:auto;
margin-left:0px;
padding-left:2px;
line-height:20px;
text-align: left;
vertical-align: top;
margin-left: 0px;
padding-left: 2px;
}
.table.cbi-section-table .th
{
white-space:nowrap;
white-space: nowrap;
}
.table.cbi-section-table input
{
width:7em;
width: 7em;
}
.cbi-section-table-row > .cbi-value-field [data-dynlist] > input,
.table.cbi-section-table input
{
width: 7em;
}
.cbi-input-text
{
text-align:left;
padding-left:2px;
outline:none;
box-shadow:none;
background:transparent;
height:20px;
width:10em;
text-align: left;
padding-left: 2px;
outline: none;
box-shadow: none;
background: transparent;
width: 7em;
}
</style>
<%-
local anonclass = (not self.anonymous or self.sectiontitle) and "named" or "anonymous"
local titlename = ifattr(not self.anonymous or self.sectiontitle, "data-title", translate("Name"))
-%>
<fieldset class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<div class="cbi-section" id="cbi-<%=self.config%>-<%=self.sectiontype%>">
<% if self.title then -%>
<legend><%=self.title%></legend>
<h3><%=self.title%></h3>
<%- end %>
<div class="cbi-section-descr"><%=self.description%></div>
<div class="cbi-section-node">
<div class="table cbi-section-table">
<div class="tr cbi-section-table-titles <%=anonclass%>"<%=titlename%>>
<div class="tr cbi-section-table-titles <%=anonclass%>">
<%- for i, k in pairs(self.children) do -%>
<div class="th cbi-section-table-cell"<%=width(k)%>>
<div class="th cbi-section-table-cell">
<%-=k.title-%>
</div>
<%- end -%>
</div>
<%- local isempty = true
<%- local section, scope, isempty = true
for i, k in ipairs(self:cfgsections()) do
local section = k
local sectionname = striptags((type(self.sectiontitle) == "function") and self:sectiontitle(section) or k)
local sectiontitle = ifattr(sectionname and (not self.anonymous or self.sectiontitle), "data-title", sectionname)
section = k
local sectionname = striptags((type(self.sectiontitle) == "function") and self:sectiontitle(section) or k)
local sectiontitle = ifattr(sectionname and (not self.anonymous or self.sectiontitle), "data-title", sectionname, true)
isempty = false
scope = { valueheader = "cbi/cell_valueheader", valuefooter = "cbi/cell_valuefooter" }
-%>
@ -95,4 +79,4 @@ end
<%- end -%>
</div>
</div>
</fieldset>
</div>

View file

@ -4,17 +4,47 @@ This is free software, licensed under the Apache License, Version 2.0
-%>
<%+header%>
<div class="cbi-map">
<fieldset class="cbi-section">
<div class="cbi-section-descr"><%:This form shows the syslog output, pre-filtered for adblock related messages only.%></div>
<textarea id="logread_id" style="width: 100%; height: 450px; border: 1px solid #cccccc; padding: 5px; font-size: 12px; font-family: monospace; resize: none;" readonly="readonly" wrap="off" rows="<%=content:cmatch("\n")+2%>"><%=content:pcdata()%></textarea>
</fieldset>
</div>
<style type="text/css">
select[readonly],
textarea[readonly]
{
width: 100%;
height: 450px;
border: 1px solid #cccccc;
padding: 5px;
font-size: 12px;
font-family: monospace;
resize: none;
pointer-events: auto;
cursor: auto;
}
</style>
<script type="text/javascript">
var textarea = document.getElementById('logread_id');
textarea.scrollTop = textarea.scrollHeight;
//<![CDATA[
function log_update()
{
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "adblock", "logread")%>', null,
function(x)
{
if (!x)
{
return;
}
var view = document.getElementById("view_id");
view.value = x.responseText;
view.scrollTop = view.scrollHeight;
});
}
window.onload = log_update();
//]]>
</script>
<div class="cbi-map">
<div class="cbi-section">
<div class="cbi-section-descr"><%:The syslog output, pre-filtered for adblock related messages only.%></div>
<textarea id="view_id" readonly="readonly" wrap="off" value=""></textarea>
</div>
</div>
<%+footer%>

View file

@ -1,5 +1,5 @@
<%#
Copyright 2017 Dirk Brenken (dev@brenken.org)
Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
This is free software, licensed under the Apache License, Version 2.0
-%>
@ -12,7 +12,7 @@ This is free software, licensed under the Apache License, Version 2.0
function update_status(data)
{
var domain = data.value;
var input = document.getElementById('query_input');
var input = document.getElementById('query_input');
var output = document.getElementById('query_output');
if (input && output)
@ -45,20 +45,20 @@ This is free software, licensed under the Apache License, Version 2.0
<form method="post" action="<%=REQUEST_URI%>">
<div class="cbi-map">
<fieldset class="cbi-section">
<div class="cbi-section">
<div class="cbi-section-descr"><%:This form allows you to query active block lists for certain domains, e.g. for whitelisting.%></div>
<div style="width:33%; float:left;">
<input style="margin: 5px 0" type="text" value="google.com" name="input" />
<input type="text" value="google.com" name="input" />
<input type="button" value="<%:Query%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.input)" />
</div>
<br style="clear:both" />
<br />
</fieldset>
</div>
</div>
<fieldset class="cbi-section" style="display:none">
<legend id="query_input"><%:Collecting data...%></legend>
<div class="cbi-section" style="display:none">
<h3 id="query_input"><%:Collecting data...%></h3>
<span id="query_output"></span>
</fieldset>
</div>
</form>
<%+footer%>

View file

@ -3,8 +3,199 @@ Copyright 2017-2018 Dirk Brenken (dev@brenken.org)
This is free software, licensed under the Apache License, Version 2.0
-%>
<%+cbi/valueheader%>
<style type="text/css">
.runtime
{
color: #37c;
font-weight: bold;
display: inline-block;
width: 100%;
padding-top: 0.5rem;
}
</style>
<input name="runtime" id="runtime" type="text" class="cbi-input-text" style="outline:none;border:none;box-shadow:none;background:transparent;color:#0069d6;font-weight:bold;line-height:30px;height:30px;width:20em;" value="<%=self:cfgvalue(section)%>" disabled="disabled" />
<script type="text/javascript">
//<![CDATA[
function status_update(json)
{
var btn1 = document.getElementById("btn1");
var btn1_running = document.getElementById("btn1_running");
var btn2 = document.getElementById("btn2");
var btn2_running = document.getElementById("btn2_running");
var input = json.data.adblock_status || "-";
<%+cbi/valuefooter%>
document.getElementById("value_1").innerHTML = input;
if (input === "enabled")
{
btn1.value = "<%:Suspend%>";
btn1.name = "do_suspend";
btn2.value = "<%:Refresh%>";
btn2.name = "do_refresh";
btn1.disabled = false;
running(btn1_running, 0);
btn2.disabled = false;
running(btn2_running, 0);
}
else if (input === "paused")
{
btn1.value = "<%:Resume%>";
btn1.name = "do_resume";
btn2.value = "<%:Refresh%>";
btn2.name = "do_refresh";
btn1.disabled = false;
running(btn1_running, 0);
btn2.disabled = false;
running(btn2_running, 0);
}
else
{
btn1.value = "<%:Suspend%>";
btn1.name = "do_suspend";
btn2.value = "<%:Refresh%>";
btn2.name = "do_refresh";
btn1.disabled = true;
btn2.disabled = true;
}
document.getElementById("value_2").innerHTML = json.data.adblock_version || "-";
document.getElementById("value_3").innerHTML = json.data.fetch_utility || "-";
document.getElementById("value_4").innerHTML = json.data.dns_backend || "-";
document.getElementById("value_5").innerHTML = json.data.overall_domains || "-";
document.getElementById("value_6").innerHTML = json.data.last_rundate || "-";
}
function btn_action(action)
{
var btn1 = document.getElementById("btn1");
var btn1_running = document.getElementById("btn1_running");
var btn2 = document.getElementById("btn2");
var btn2_running = document.getElementById("btn2_running");
btn1.disabled = true;
btn2.disabled = true;
if (action.name === "do_refresh")
{
running(btn2_running, 1);
}
else
{
running(btn1_running, 1);
}
new XHR.get('<%=luci.dispatcher.build_url("admin", "services", "adblock")%>/action/' + action.name, null,
function(x)
{
if (!x)
{
return;
}
});
}
function running(element, state)
{
if (state === 1)
{
var running_html = '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" width="16" height="16" style="vertical-align:middle" />';
element.innerHTML = running_html;
}
else
{
element.innerHTML = '';
}
}
function reset_view()
{
document.getElementById("btn1").value = "<%:Suspend%>";
document.getElementById("btn1").name = "do_suspend";
document.getElementById("btn2").value = "<%:Refresh%>";
document.getElementById("btn2").name = "do_refresh";
document.getElementById("btn1").disabled = true;
document.getElementById("btn2").disabled = true;
document.getElementById("value_1").innerHTML = "-";
document.getElementById("value_2").innerHTML = "-";
document.getElementById("value_3").innerHTML = "-";
document.getElementById("value_4").innerHTML = "-";
document.getElementById("value_5").innerHTML = "-";
document.getElementById("value_6").innerHTML = "-";
}
XHR.get('<%=luci.dispatcher.build_url("admin", "services", "adblock", "status")%>', null,
function(x, json_info)
{
if (!x || !json_info || !json_info.data)
{
reset_view();
return;
}
status_update(json_info);
});
XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "services", "adblock", "status")%>', null,
function(x, json_info)
{
if (!x || !json_info || !json_info.data)
{
reset_view();
return;
}
status_update(json_info);
});
//]]>
</script>
<h3><%:Runtime Information%></h3>
<div class="cbi-value" id="status_1">
<label class="cbi-value-title" for="status_1"><%:Adblock Status%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_1">-</span>
</div>
</div>
<div class="cbi-value" id="status_2">
<label class="cbi-value-title" for="status_2"><%:Adblock Version%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_2">-</span>
</div>
</div>
<div class="cbi-value" id="status_3">
<label class="cbi-value-title" for="status_3"><%:Download Utility (SSL Library)%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_3">-</span>
</div>
</div>
<div class="cbi-value" id="status_4">
<label class="cbi-value-title" for="status_4"><%:DNS Backend (DNS Directory)%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_4">-</span>
</div>
</div>
<div class="cbi-value" id="status_5">
<label class="cbi-value-title" for="status_5"><%:Overall Domains%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_5">-</span>
</div>
</div>
<div class="cbi-value" id="status_6">
<label class="cbi-value-title" for="status_6"><%:Last Run%></label>
<div class="cbi-value-field">
<span class="runtime" id="value_6">-</span>
</div>
</div>
<hr />
<div class="cbi-value" id="button_1">
<label class="cbi-value-title" for="button_1"><%:Suspend / Resume Adblock%></label>
<div class="cbi-value-field">
<input class="cbi-button cbi-button-reset" id="btn1" type="button" value="" onclick="btn_action(this)" />
<span id="btn1_running" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>
</div>
</div>
<p />
<div class="cbi-value" id="button_2">
<label class="cbi-value-title" for="button_2"><%:Refresh Blocklist Sources%></label>
<div class="cbi-value-field">
<input class="cbi-button cbi-button-apply" id="btn2" type="button" value="" onclick="btn_action(this)" />
<span id="btn2_running" style="display:inline-block; width:16px; height:16px; margin:0 5px"></span>
</div>
</div>

View file

@ -1,33 +1,31 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 17/09/2017\n"
"Last-Translator: Bubu83 <bubu83@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.3\n"
"PO-Revision-Date: 2020-11-12 02:29+0000\n"
"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.4-dev\n"
msgid "'Jail' Blocklist Creation"
msgstr ""
msgid "-------"
msgstr ""
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
msgstr ""
"<b>Attenzione:</b> al fine di prevenire errori OOM su dispositivi con meno "
"di 64 MB RAM disponibili, per favore selezionane solamente alcune!"
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Registro Adblock"
msgid "Adblock Status"
msgstr "Status Adblock"
@ -41,7 +39,7 @@ msgid "Advanced"
msgstr "Avanzato"
msgid "Archive Categories"
msgstr ""
msgstr "Archivia Categorie"
msgid "Backup Directory"
msgstr "Directory del Backup"
@ -53,11 +51,11 @@ msgid "Blocklist Sources"
msgstr "Fonti lista di Blocco"
msgid "Blocklist not found!"
msgstr ""
msgstr "Lista di Blocco non trovata!"
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -68,7 +66,7 @@ msgstr ""
"classico timeout (default 30 sec.) o seleziona un'altra interfaccia di avvio."
msgid "Collecting data..."
msgstr "Raccogliendo dati..."
msgstr "Raccolta dati..."
msgid ""
"Configuration of the adblock package to block ad/abuse domains by using DNS."
@ -82,7 +80,7 @@ msgid ""
msgstr ""
msgid "DNS Backend (DNS Directory)"
msgstr ""
msgstr "Backend DNS (Directory DNS)"
msgid "DNS Directory"
msgstr "Directory DNS"
@ -98,10 +96,10 @@ msgstr ""
"della lista di blocco."
msgid "Download Utility"
msgstr ""
msgstr "Utilità di Scaricamento"
msgid "Download Utility (SSL Library)"
msgstr ""
msgstr "Utilità di scaricamento (Libreria SSL)"
msgid "Edit Blacklist"
msgstr "Modifica Lista Nera"
@ -140,25 +138,24 @@ msgid "Extra Options"
msgstr "Opzioni Extra"
msgid "Flush DNS Cache"
msgstr ""
msgstr "Pulisci Cache DNS"
msgid "Flush DNS Cache after adblock processing."
msgstr ""
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
msgstr ""
"Per saperne di più, <a href=\"%s\" target=\"_blank\">consultare la "
"documentazione su internet</a>"
msgid ""
"For further performance improvements you can raise this value, e.g. '8' or "
"'16' should be safe."
msgstr ""
"Per mingliorare le performance in futuro puoi aumentare questo valore, '8' o "
"'16' dovrebbero essere sicuri."
msgid "Force Local DNS"
msgstr "Forza DNS Locale"
@ -167,7 +164,7 @@ msgid "Force Overall Sort"
msgstr "Forza Ordinamento Globale"
msgid "Full path to the whitelist file."
msgstr ""
msgstr "Percorso completo del file della whitelist."
msgid "Input file not found, please check your configuration."
msgstr "File di input non trovato, per favore controlla la tua configurazione."
@ -177,21 +174,26 @@ msgstr "Ultimo Avvio"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
"Elenco delle interfacce di rete disponibili. Di solito l'avvio verrà "
"attivato dall'interfaccia 'wan'."
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
"List of supported DNS backends with their default list export directory."
msgstr ""
"Lista dei backend DNS supportati con la loro directory di default di esporto "
"della lista.<br />"
"Elenco di backend DNS supportati con la directory di esportazione "
"dell'elenco predefinito."
msgid "List of supported and fully pre-configured download utilities."
msgstr ""
"Elenco delle utility di download supportate e completamente preconfigurate."
msgid "Loading"
msgstr "Caricando"
msgstr "Caricamento"
msgid "Low Priority Service"
msgstr "Serviio a bassa priorità"
msgid "Max. Download Queue"
msgstr ""
@ -234,12 +236,19 @@ msgstr "Interrogazione domini"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
"Reindirizza tutte le richieste DNS dalla zona 'lan' al risolvitore locale."
msgid "Refresh"
msgstr "Ricaricare"
msgid "Refresh Blocklist Sources"
msgstr "Aggiorna fonti Blocklist"
msgid "Resume"
msgstr "Riprendi"
@ -255,12 +264,17 @@ msgstr "Salva"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
msgid "Startup Trigger"
@ -283,19 +297,26 @@ msgstr "Directory per la lista di blocco generata 'adb_list.overall'."
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr ""
"L'output di syslog, pre-filtrato solo per i messaggi relativi ad adblock."
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
"Per rendere effettiva questa modifica è necessario arrestare/riavviare il "
"servizio manualmente."
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
"Questo form ti consente di modificare il contenuto della lista nera di "
"adblock (%s).<br />"
"Questo modulo consente di modificare il contenuto della lista nera di blocco "
"degli annunci (%s)."
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
"Questo form ti consente di modificare il contenuto della lista bianca di "
"adblock (%s).<br />"
"Questo modulo consente di modificare il contenuto della whitelist di blocco "
"degli annunci (%s)."
msgid ""
"This form allows you to modify the content of the main adblock configuration "
@ -311,13 +332,6 @@ msgstr ""
"Questo form ti consente di interrogare le liste di blocco attive per "
"determinati domini, p.e. per metterli nella lista bianca."
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr ""
"Questo form mostra l'output del registro, prefiltrato per messaggi relativi "
"solo ad adblock."
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -338,7 +352,7 @@ msgid "Waiting for command to complete..."
msgstr "Aspettando che il comando venga completato..."
msgid "Whitelist File"
msgstr ""
msgstr "File lista bianca"
msgid "Yes"
msgstr "Sì"
@ -348,31 +362,32 @@ msgid ""
"kidsafe configurations."
msgstr ""
msgid "disabled"
msgstr "disabilitato"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
msgid "enabled"
msgstr "abilitato"
#~ msgid "Adblock Logfile"
#~ msgstr "Registro Adblock"
msgid "error"
msgstr "errore"
#~ msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
#~ msgstr ""
#~ "Reindirizza tutte le richieste DNS dalla zona 'lan' al risolvitore locale."
msgid "n/a"
msgstr "n/d"
#~ msgid "disabled"
#~ msgstr "disabilitato"
msgid "paused"
msgstr "in pausa"
#~ msgid "enabled"
#~ msgstr "abilitato"
msgid "running"
msgstr ""
#~ msgid "error"
#~ msgstr "errore"
#~ msgid "Invalid domain specified!"
#~ msgstr "Dominio invalido specificato!"
#~ msgid "n/a"
#~ msgstr "n/d"
#~ msgid "paused"
#~ msgstr "in pausa"
#~ msgid "Available blocklist sources."
#~ msgstr "Fonti lista di blocco disponibili."
@ -384,11 +399,6 @@ msgstr ""
#~ "Le selezioni degli URL delle liste e categorie Shallalist sono "
#~ "configurabili nella sezione 'Avanzato'.<br />"
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr ""
#~ "La grandezza del file è troppo grande per modificarla online in LuCI "
#~ "(&gt; 512 KB)."
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or the wget 'built-in'."

View file

@ -1,22 +1,21 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: INAGAKI Hiroshi <musashino.open@gmail.com>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.7\n"
"PO-Revision-Date: 2020-11-04 00:26+0000\n"
"Last-Translator: RyotaGamer <21ryotagamer@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "'Jail' Blocklist Creation"
msgstr "'Jail' ブロックリストの作成"
msgid "-------"
msgstr "(利用不可)"
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
@ -27,9 +26,6 @@ msgstr ""
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Adblock ログファイル"
msgid "Adblock Status"
msgstr "Adblock ステータス"
@ -43,7 +39,7 @@ msgid "Advanced"
msgstr "詳細設定"
msgid "Archive Categories"
msgstr ""
msgstr "アーカイブ カテゴリ"
msgid "Backup Directory"
msgstr "バックアップ先 ディレクトリ"
@ -55,14 +51,14 @@ msgid "Blocklist Sources"
msgstr "ブロックリスト提供元"
msgid "Blocklist not found!"
msgstr ""
msgstr "ブロックリストが見つかりません!"
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
"ホワイトリストに存在しない全ドメインへのアクセスをブロックするために、追加で "
"'Jail' リスト (/tmp/adb_list.jail) を作成します。<br />"
"'Jail' リスト (/tmp/adb_list.jail) を作成します。"
msgid ""
"Choose 'none' to disable automatic startups, 'timed' to use a classic "
@ -106,7 +102,7 @@ msgstr ""
"ブロックリストを使用します。"
msgid "Download Utility"
msgstr "ダウンロード ユーティリティ"
msgstr "ダウンロードユーティリティ"
msgid "Download Utility (SSL Library)"
msgstr "ダウンロード ユーティリティSSL ライブラリ)"
@ -155,13 +151,6 @@ msgstr "DNS キャッシュのクリア"
msgid "Flush DNS Cache after adblock processing."
msgstr "Adblock 処理の後に DNS キャッシュをクリアします。"
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
"SSLで保護されているブロックリストの取得には、適切なSSL ライブラリが必要です。"
"例: 'libustream-ssl' または 'built-in'"
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
@ -193,17 +182,16 @@ msgstr "最終実行"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
"利用可能なネットワーク インターフェースの一覧です。通常、 'wan' インター"
"フェースによりスタートアップがトリガされます。<br />"
"利用可能なネットワーク インターフェースの一覧です。通常、スタートアップは "
"'wan' インターフェースによってトリガされます。"
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
"List of supported DNS backends with their default list export directory."
msgstr ""
"サポートされる DNS バックエンドと、それぞれのデフォルトのリスト出力先ディレク"
"トリのリストです<br />"
"サポートされる DNS バックエンドと、それぞれのデフォルトのリスト出力先の一覧で"
"す。"
msgid "List of supported and fully pre-configured download utilities."
msgstr "サポートされ、かつ設定済のダウンロード ユーティリティの一覧です。"
@ -211,6 +199,9 @@ msgstr "サポートされ、かつ設定済のダウンロード ユーティ
msgid "Loading"
msgstr "読込中"
msgid "Low Priority Service"
msgstr "優先度が低いサービス"
msgid "Max. Download Queue"
msgstr "ダウンロード キューの上限"
@ -251,20 +242,27 @@ msgstr "ドメインの検索"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
"メール通知を行うドメイン カウントの下限を設定します。全体カウントが指定された"
"値以下の場合、メールを受け取ります(規定値: 0<br />"
"値以下の場合、メールを受け取ります(規定値: 0。"
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
"'lan' ゾーンからの全 DNS クエリを、ローカル リゾルバにリダイレクトします。"
msgid "Refresh"
msgstr "リフレッシュ"
msgid "Refresh Blocklist Sources"
msgstr "ブロックリスト提供元のリフレッシュ"
msgid "Resume"
msgstr "再開"
msgid "Runtime Information"
msgstr "実行情報"
msgstr "ランタイム情報"
msgid "SSL req."
msgstr "SSL 必須"
@ -274,16 +272,20 @@ msgstr "保存"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr "処理エラーまたはドメイン カウントが0以下の場合、メールを送信します。"
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
"処理エラーまたはドメイン カウントが0以下の場合、メールを送信します。<br />"
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
"ダウンロードの制御とリストの処理を同時並行的に行うダウンロード キューのサイ"
"です(既定値: '4')。<br />"
"ダウンロードの制御とリストの処理を同時並行的に行うダウンロードキューのサイ"
"ズです。(規定値: '4'"
msgid "Startup Trigger"
msgstr "スタートアップ トリガ"
@ -309,19 +311,23 @@ msgstr ""
"LuCI上でのオンライン編集を行うには、ファイルサイズが大きすぎます (&ge; 100 "
"KB)。"
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr "Adblock に関連するメッセージのみが抽出された、システムログ出力です。"
msgid "This change requires a manual service stop/re-start to take effect."
msgstr "この変更の反映には、手動でのサービスの停止 / 再起動が必要です。"
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
"このフォームでは、Adblock ブラックリスト (%s) の内容を変更することができま"
"す。<br />"
"す。"
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
"このフォームでは、Adblock ホワイトリスト (%s) の内容を変更することができま"
"す。<br />"
"す。"
msgid ""
"This form allows you to modify the content of the main adblock configuration "
@ -337,13 +343,6 @@ msgstr ""
"このフォームでは、現在有効なリスト内で特定のドメインを検索することができま"
"す。例: ホワイトリスト内"
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr ""
"このフォームには、システムログ内の Adblock に関連するメッセージのみが表示され"
"ます。"
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -376,32 +375,46 @@ msgstr ""
"この制約の厳しいブロックリストを、ゲスト WiFi や子供の安全を守る設定などに手"
"動で利用することができます。"
msgid "disabled"
msgstr "無効"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
"例: Adblock のアップデート毎にメールを受け取るには、150000 に設定します。"
msgid "enabled"
msgstr "有効"
#~ msgid "-------"
#~ msgstr "(利用不可)"
msgid "error"
msgstr "エラー"
msgid "n/a"
msgstr "利用不可"
msgid "paused"
msgstr "一時停止"
msgid "running"
msgstr "実行中"
#~ msgid "Adblock Logfile"
#~ msgstr "Adblock ログファイル"
#~ msgid "Categories"
#~ msgstr "カテゴリー"
#~ msgid "Invalid domain specified!"
#~ msgstr "無効なドメインが指定されています!"
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or 'built-in'."
#~ msgstr ""
#~ "SSLで保護されているブロックリストの取得には、適切なSSL ライブラリが必要で"
#~ "す。例: 'libustream-ssl' または 'built-in'"
#~ msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
#~ msgstr ""
#~ "'lan' ゾーンからの全 DNS クエリを、ローカル リゾルバにリダイレクトします。"
#~ msgid "disabled"
#~ msgstr "無効"
#~ msgid "enabled"
#~ msgstr "有効"
#~ msgid "error"
#~ msgstr "エラー"
#~ msgid "n/a"
#~ msgstr "利用不可"
#~ msgid "paused"
#~ msgstr "一時停止"
#~ msgid "running"
#~ msgstr "実行中"

View file

@ -15,9 +15,6 @@ msgstr ""
msgid "'Jail' Blocklist Creation"
msgstr ""
msgid "-------"
msgstr ""
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
@ -26,9 +23,6 @@ msgstr ""
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Arquivo de log do Adblock"
msgid "Adblock Status"
msgstr ""
@ -60,7 +54,7 @@ msgstr ""
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -145,11 +139,6 @@ msgstr ""
msgid "Flush DNS Cache after adblock processing."
msgstr ""
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
@ -177,12 +166,11 @@ msgstr ""
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
"List of supported DNS backends with their default list export directory."
msgstr ""
msgid "List of supported and fully pre-configured download utilities."
@ -191,6 +179,9 @@ msgstr ""
msgid "Loading"
msgstr "Carregando"
msgid "Low Priority Service"
msgstr ""
msgid "Max. Download Queue"
msgstr ""
@ -229,10 +220,18 @@ msgstr "Consulta de domínios"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
msgid "Refresh"
msgstr ""
msgid "Refresh Blocklist Sources"
msgstr ""
msgid "Resume"
@ -249,12 +248,17 @@ msgstr "Salvar"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
msgid "Startup Trigger"
@ -277,19 +281,25 @@ msgstr ""
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr ""
"Esse formulário mostra a saída do syslog, pré-filtrado para mensagens do "
"adblock apenas."
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
"Esse formulário permite que você modifique o conteúdo das listas de bloqueio "
"do adblock (%s).<br />"
"do adblock (%s)."
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
"Esse formulário permite que você modifique o conteúdo das listas de "
"permissão do adblock (%s).<br />"
"permissão do adblock (%s)."
msgid ""
"This form allows you to modify the content of the main adblock configuration "
@ -305,13 +315,6 @@ msgstr ""
"Esse formulário permite que você consulte listas de blocos ativos para "
"certos domínios, e.x. para listas de permissão."
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr ""
"Esse formulário mostra a saída do syslog, pré-filtrado para mensagens do "
"adblock apenas."
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -340,40 +343,20 @@ msgid ""
"kidsafe configurations."
msgstr ""
msgid "disabled"
msgstr ""
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
msgid "enabled"
msgstr ""
#~ msgid "Adblock Logfile"
#~ msgstr "Arquivo de log do Adblock"
msgid "error"
msgstr ""
msgid "n/a"
msgstr "n/d"
msgid "paused"
msgstr ""
msgid "running"
msgstr ""
#~ msgid "Invalid domain specified!"
#~ msgstr "Domínio especificado inválido!"
#~ msgid "n/a"
#~ msgstr "n/d"
#~ msgid "Available blocklist sources."
#~ msgstr "Fontes de listas de bloqueio disponíveis."
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr ""
#~ "O tamanho do arquivo é muito grande para edição online no LuCI (&gt; 512 "
#~ "KB)."
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or the wget 'built-in'."

View file

@ -1,79 +1,77 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: LuCI: adblock\n"
"POT-Creation-Date: 2017-10-22 13:00+0300\n"
"PO-Revision-Date: 2018-02-07 00:23+0300\n"
"Language-Team: http://cyber-place.ru\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"Last-Translator: Vladimir aka sunny <picfun@ya.ru>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"PO-Revision-Date: 2020-10-09 00:10+0000\n"
"Last-Translator: Artem <KovalevArtem.ru@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.3-dev\n"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
msgid "'Jail' Blocklist Creation"
msgstr "Создание Черного<br />списка 'Jail'"
msgid "-------"
msgstr "-------"
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
msgstr ""
"<b>Внимание:</b> Для предотвращения переполнения оперативной памяти, на "
"устройствах с менее 64 MB, выбирайте только необходимый минимум списков!"
msgid "Adblock"
msgstr "AdBlock"
msgid "Adblock Logfile"
msgstr "Ведение системного журала Adblock-ом"
msgstr "Adblock Блокировщик рекламы"
msgid "Adblock Status"
msgstr "Состояние Adblock-а"
msgstr "Состояние Adblock"
msgid "Adblock Version"
msgstr "Версия Adblock-а"
msgstr "Версия Adblock"
msgid "Additional trigger delay in seconds before adblock processing begins."
msgstr "Дополнительная задержка в секундах до начала работы Adblock-a."
msgstr "Дополнительная задержка в секундах до начала работы Adblock."
msgid "Advanced"
msgstr "Дополнительно"
msgid "Archive Categories"
msgstr ""
msgstr "Категории списков"
msgid "Backup Directory"
msgstr "Папка для бэкапа"
msgstr "Папка для резервных копий"
msgid "Backup Mode"
msgstr "Режим сохранения бекапа"
#, fuzzy
msgid "Blocklist Sources"
msgstr "Источники списков блокировки"
msgstr "Источники черных списков"
msgid "Blocklist not found!"
msgstr ""
msgstr "Список блокировок не найден!"
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
"Создать дополнительный Черный список 'Jail' (/tmp/adb_list.jail), чтобы "
"заблокировать доступ ко всем доменам, кроме тех что перечислены в файле "
"Белого списка.<br />"
"Белого списка."
msgid ""
"Choose 'none' to disable automatic startups, 'timed' to use a classic "
"timeout (default 30 sec.) or select another trigger interface."
msgstr ""
"Выберите 'none', чтобы отключить автоматический старт, 'timed', чтобы "
"использовать дефолтную задержку (по умолчанию 30 сек.) или выберите другой "
"интерфейс запуска."
"использовать стандартную задержку (по умолчанию 30 сек.) или выберите другой "
"интерфейс для запуска."
msgid "Collecting data..."
msgstr "Сбор данных..."
@ -81,15 +79,15 @@ msgstr "Сбор данных..."
msgid ""
"Configuration of the adblock package to block ad/abuse domains by using DNS."
msgstr ""
"Настройка Adblock. Приложения для блокировки ненадежных или добавления "
"доверенных доменов используя DNS. "
"Настройка Adblock. Приложения для блокировки рекламных или ненадежных "
"доменов используя DNS."
msgid ""
"Create compressed blocklist backups, they will be used in case of download "
"errors or during startup in backup mode."
msgstr ""
"Создавайте сжатые резервные копии списков блокировки, они будут "
"использоваться в случае ошибок загрузки или при запуске в ручном режиме."
"Создание сжатых резервных копий списков блокировок, они будут использоваться "
"в случае ошибок загрузки или при запуске в ручном режиме."
msgid "DNS Backend (DNS Directory)"
msgstr "DNS бэкенд (папка DNS)"
@ -104,14 +102,14 @@ msgid ""
"Do not automatically update blocklists during startup, use blocklist backups "
"instead."
msgstr ""
"Не обновляйте списки блокировок автоматически во время запуска, вместо этого "
"используйте резервные копии списков блокировок."
"Не обновлять списки блокировок автоматически во время запуска, вместо этого "
"использовать резервные копии списков блокировок."
msgid "Download Utility"
msgstr "Скачать утилиту"
msgstr "Утилита для скачивания"
msgid "Download Utility (SSL Library)"
msgstr "Загрузить утилиту (библиотека SSL)"
msgstr "Утилита для скачивания (с библиотекой SSL)"
msgid "Edit Blacklist"
msgstr "Редактировать Черный список"
@ -123,26 +121,28 @@ msgid "Edit Whitelist"
msgstr "Редактировать Белый список"
msgid "Email Notification"
msgstr "Уведомление на email"
msgstr "Email уведомления"
msgid "Email Notification Count"
msgstr "Кол-во уведомлений на email"
msgstr "Кол-во email уведомлений"
msgid "Enable Adblock"
msgstr "Включить Adblock"
msgid "Enable Blocklist Backup"
msgstr "Включить сохранение<br />списка блокировок"
msgstr "Бэкап списка блокировок"
msgid ""
"Enable memory intense overall sort / duplicate removal on low memory devices "
"(&lt; 64 MB free RAM)"
msgstr ""
"Включите полную сортировку / удаление дубликатов памяти на устройствах с "
"низким объемом памяти (&lt; 64 MB свободной оперативной памяти)."
"Включить полную сортировку / удаление дубликатов в памяти. Используйте на "
"устройствах с низким объемом памяти (&lt; 64 MB свободной оперативной "
"памяти)."
msgid "Enable verbose debug logging in case of any processing error."
msgstr "Включите подробное ведение журнала отладки в случае ошибки обработки."
msgstr ""
"Включить ведение подробного журнала для отладки в случае ошибок обработки."
msgid "Enabled"
msgstr "Включено"
@ -154,14 +154,7 @@ msgid "Flush DNS Cache"
msgstr "Очистка кэша DNS"
msgid "Flush DNS Cache after adblock processing."
msgstr "Очистки DNS-кэша после обработки Adblock-ом."
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
"Для SSL-защищенных источников списков блокировки, вам нужны подходящие SSL "
"библиотеки, например 'libustream-ssl' или 'built-in'."
msgstr "Очистка DNS-кэша после обработки Adblock-ом."
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
@ -174,46 +167,49 @@ msgid ""
"For further performance improvements you can raise this value, e.g. '8' or "
"'16' should be safe."
msgstr ""
"Для повышения производительности вы можете увеличить это значение, например "
"значения '8' или '16' повысят безопасность."
"<br />Для повышения производительности вы можете увеличить это значение, "
"например значения '8' или '16' должны быть безопасными."
msgid "Force Local DNS"
msgstr "Назначить локальный DNS"
msgstr "Локальный DNS"
msgid "Force Overall Sort"
msgstr "Назначить полную сортировку"
msgstr "Принудительная полная сортировка"
msgid "Full path to the whitelist file."
msgstr "Полный путь к файлу Белого списка."
msgid "Input file not found, please check your configuration."
msgstr "Config файл не найден, настройте config файл."
msgstr "Config файл не найден, пожалуйста, проверьте ваши настройки."
msgid "Last Run"
msgstr "Последнее время запуска"
msgstr "Последний запуск"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
"Список доступных сетевых интерфейсов. По умолчанию установлен 'wan' "
"интерфейс.<br />"
"Список доступных сетевых интерфейсов. \tОбычно запускается wan интерфейсом."
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
"List of supported DNS backends with their default list export directory."
msgstr ""
"Список поддерживаемых серверов DNS перемещается в папку по умолчанию.<br />"
"Список поддерживаемых бэкэндов DNS с каталогом экспортных директорий по "
"умолчанию."
msgid "List of supported and fully pre-configured download utilities."
msgstr ""
"Список поддерживаемых и полностью предварительно настроенных утилит загрузки."
"Список поддерживаемых и полностью предварительно настроенных утилит для "
"скачивания."
msgid "Loading"
msgstr "Загрузка"
msgid "Low Priority Service"
msgstr "Низкий приоритет службы"
msgid "Max. Download Queue"
msgstr "Максимальное значение очереди загрузки"
msgstr "Макс. очередь загрузки"
msgid "No"
msgstr "Нет"
@ -225,20 +221,20 @@ msgstr ""
"подходят для вас."
msgid "Overall Domains"
msgstr "Итоговые домены"
msgstr "Всего доменов"
msgid "Overview"
msgstr "Главное меню"
msgstr "Обзор"
msgid ""
"Please add only one domain per line. Comments introduced with '#' are "
"allowed - ip addresses, wildcards and regex are not."
msgstr ""
"Добавляйте только один домен в строке. Комментарии вводятся используя '#' "
"разрешенные - ip адреса, метасимволы и нерегулярные выражения."
"Добавляйте только один домен на строку. Комментарии вводятся используя '#'. "
"IP адреса, wildcard и регулярные выражения запрещены."
msgid "Please edit this file directly in a terminal session."
msgstr "Отредактируйте данный файл, строго в терминале."
msgstr "Редактируйте данный файл только в терминале."
msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
@ -252,14 +248,21 @@ msgstr "Запрос доменов"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
"Увеличьте количество уведомлений по email, чтобы получить сообщения, если "
"общее количество меньше или равно заданному пределу (по умолчанию 0),<br />"
"Увеличьте количество email уведомлений, чтобы получить сообщения, если общее "
"количество меньше или равно заданному пределу (по умолчанию 0),"
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
"Перенаправлять все DNS запросы с интерфейса 'lan' на обработку Adblock-ом."
msgid "Refresh"
msgstr "Обновить"
msgid "Refresh Blocklist Sources"
msgstr "Обновить источники списков блокировок"
msgid "Resume"
msgstr "Возобновить"
@ -275,20 +278,23 @@ msgstr "Сохранить"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
"Отправлять email уведомления в случае ошибки обработки или если количество "
"обработанных доменов равно 0."
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
"Отправлять по email уведомления в случае ошибки обработки или если домен "
"&le; 0.<br />"
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
msgstr ""
"Значение очереди загрузки для выполнения параллельных загрузок (по умолчанию "
"'4').<br />"
"parallel (default '4')."
msgstr "Размер очереди параллельных загрузок &amp; ('4' по умолчанию)."
msgid "Startup Trigger"
msgstr "Назначить"
msgstr "Автозапуск после"
msgid "Suspend"
msgstr "Приостановить"
@ -300,61 +306,64 @@ msgid ""
"Target directory for adblock backups. Please use only non-volatile disks, e."
"g. an external usb stick."
msgstr ""
"Назначить папку для резервного копирования Adblock. Используйте такие "
"накопители, как usb флешка."
"Папка для бэкапов списков блокировок. Используйте такие накопители, как usb "
"флешка."
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "Назначить папку для создания списка блокировки 'adb_list.overall'."
msgstr "Папка для созданного списка блокировки 'adb_list.overall'."
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
"Этот файл слишком большой для редактирования в Web-интерфейсе LuCI (&ge; 100 "
"KB)."
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr ""
"Вывод системного журнала, предварительно отфильтрованный только для "
"сообщений, связанных с adblock."
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
"Это изменение требует ручной остановки и повторного запуска, чтобы вступить "
"в силу."
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
"Страница позволяет изменять содержимое Черного списка Adblock (%s).<br />"
msgstr "Эта форма позволяет изменять содержимое черного списка adblock (%s)."
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
"Страница позволяет изменять содержимое Белого списка Adblock (%s).<br />"
msgstr "Эта форма позволяет изменять содержимое белого списка adblock (%s)."
msgid ""
"This form allows you to modify the content of the main adblock configuration "
"file (/etc/config/adblock)."
msgstr ""
"Страница позволяет изменять содержимое главного config файла Adblock-a (/etc/"
"Данное поле позволяет изменять содержимое config файла Adblock-a (/etc/"
"config/adblock)."
msgid ""
"This form allows you to query active block lists for certain domains, e.g. "
"for whitelisting."
msgstr ""
"Страница позволяет запросить домены для конкретных списков, например для "
"Данное поле позволяет запросить домены для конкретных списков, например для "
"Белого списка."
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr "Страница системного журнала. Только сообщения связанные с Adblock."
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
msgstr ""
"Чтобы заменить дефолтный путь, используйте строку ниже 'Папка DNS' в разделе "
"Чтобы заменить путь по умолчанию, используйте пункт 'Папка DNS' в разделе "
"'Дополнительные настройки'."
msgid "Trigger Delay"
msgstr "Задержка запуска"
msgid "Verbose Debug Logging"
msgstr "Подробное ведение<br />журнала отладки"
msgstr "Подробный журнал отладки"
msgid "View Logfile"
msgstr "Показать системный журнал"
msgstr "Системный журнал"
msgid "Waiting for command to complete..."
msgstr "Ожидание завершения выполнения команды..."
@ -372,33 +381,47 @@ msgstr ""
"Вы можете вручную настраивать и использовать этот Черный список, например "
"для гостевой wifi сети или режима родительского контроля."
msgid "disabled"
msgstr "отключено"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
"например, чтобы получать уведомления по электронной почте при каждом "
"обновлении Adblock-а установите значение 150000."
"например, чтобы получать email уведомления при каждом обновлении Adblock-а "
"установите значение 150000."
msgid "enabled"
msgstr "включено"
#~ msgid "-------"
#~ msgstr "-------"
msgid "error"
msgstr "ошибка"
#~ msgid "Adblock Logfile"
#~ msgstr "Системный журнал Adblock"
msgid "n/a"
msgstr "нет данных"
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or 'built-in'."
#~ msgstr ""
#~ "Для SSL-защищенных источников списков блокировки, вам нужны подходящие "
#~ "SSL библиотеки, например 'libustream-ssl' или 'built-in'."
msgid "paused"
msgstr "остановлено"
#~ msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
#~ msgstr ""
#~ "Перенаправлять все DNS запросы с интерфейса 'lan' на обработку Adblock-ом."
msgid "running"
msgstr "работает"
#~ msgid "disabled"
#~ msgstr "отключено"
#~ msgid "Invalid domain specified!"
#~ msgstr "Задан недопустимый домен!"
#~ msgid "enabled"
#~ msgstr "включено"
#~ msgid "error"
#~ msgstr "ошибка"
#~ msgid "n/a"
#~ msgstr "нет данных"
#~ msgid "paused"
#~ msgstr "приостановлено"
#~ msgid "running"
#~ msgstr "работает"
#~ msgid "Available blocklist sources."
#~ msgstr "Источники списков блокировки. "
@ -430,10 +453,5 @@ msgstr "работает"
#~ msgid "Please update your adblock config file to use this package.<br />"
#~ msgstr "Обновите config файл Adblock, чтобы использовать этот пакет.<br />"
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr ""
#~ "Размер файла слишком большой, для онлайн редактирования в LuCI (&gt; 512 "
#~ "KB)."
#~ msgid "This section contains no values yet"
#~ msgstr "Здесь не содержатся необходимые значения"

View file

@ -1,23 +1,28 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgstr ""
"PO-Revision-Date: 2020-09-23 14:41+0000\n"
"Last-Translator: Kristoffer Grundström <dsmusicever@gmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadblock/sv/>\n"
"Language: sv\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3-dev\n"
msgid "'Jail' Blocklist Creation"
msgstr ""
msgid "-------"
msgstr "-------"
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
msgstr ""
"<b>Varning:</b> För att förhindra OOM-undantag på enheter med lågt minne med "
"mindre än 64 MB ledigt RAM-minne, välj bara några av dem!"
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Adblock's loggfil"
msgid "Adblock Status"
msgstr "Status för Adblock"
@ -26,12 +31,14 @@ msgstr "Version av Adblock"
msgid "Additional trigger delay in seconds before adblock processing begins."
msgstr ""
"Ytterligare trigger fördröjning i sekunder innan Adblock-bearbetningen "
"påbörjas."
msgid "Advanced"
msgstr "Avancerat"
msgid "Archive Categories"
msgstr ""
msgstr "Arkiv kategorier"
msgid "Backup Directory"
msgstr "Säkerhetskopiera mapp"
@ -43,11 +50,11 @@ msgid "Blocklist Sources"
msgstr "Källor för blockeringslistor"
msgid "Blocklist not found!"
msgstr ""
msgstr "Blocklista hittades inte!"
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -89,7 +96,7 @@ msgstr ""
"säkerhetskopierade blockeringslistor istället."
msgid "Download Utility"
msgstr ""
msgstr "Ladda ner verktyget"
msgid "Download Utility (SSL Library)"
msgstr "Nerladdningsprogram (SSL-bibliotek)"
@ -121,7 +128,7 @@ msgid ""
msgstr ""
msgid "Enable verbose debug logging in case of any processing error."
msgstr ""
msgstr "Aktivera utförlig felsökningsloggning vid eventuella bearbetningsfel."
msgid "Enabled"
msgstr "Aktiverad"
@ -130,25 +137,24 @@ msgid "Extra Options"
msgstr "Extra alternativ"
msgid "Flush DNS Cache"
msgstr ""
msgstr "Töm DNS-cache"
msgid "Flush DNS Cache after adblock processing."
msgstr ""
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
msgstr ""
"För ytterligare information <a href=\"%s\" target=\"_blank\">läs online-"
"dokumentationen</a>"
msgid ""
"For further performance improvements you can raise this value, e.g. '8' or "
"'16' should be safe."
msgstr ""
"För ytterligare prestandaförbättringar kan du höja detta värde, t.ex. \"8\" "
"eller \"16\" bör vara säkra."
msgid "Force Local DNS"
msgstr "Tvinga lokal DNS"
@ -157,7 +163,7 @@ msgid "Force Overall Sort"
msgstr ""
msgid "Full path to the whitelist file."
msgstr ""
msgstr "Full sökväg till vitliste-filen."
msgid "Input file not found, please check your configuration."
msgstr ""
@ -168,22 +174,26 @@ msgstr "Kördes senast"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
"Lista över tillgängliga nätverksgränssnitt. Vanligtvis kommer uppstarten att "
"utlösas av gränssnittet 'wan'."
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
msgstr ""
"List of supported DNS backends with their default list export directory."
msgstr "Lista med stödda DNS-backends med deras standardlista exportkatalog."
msgid "List of supported and fully pre-configured download utilities."
msgstr ""
msgstr "Lista över stödda och helt förkonfigurerade nedladdningsverktyg."
msgid "Loading"
msgstr "Laddar"
msgid "Low Priority Service"
msgstr "Lågprioriterad tjänst"
msgid "Max. Download Queue"
msgstr ""
msgstr "Max. Nedladdningskö"
msgid "No"
msgstr "Nej"
@ -191,9 +201,10 @@ msgstr "Nej"
msgid ""
"Options for further tweaking in case the defaults are not suitable for you."
msgstr ""
"Alternativ för ytterligare finjustering om standardvärdena inte passar dig."
msgid "Overall Domains"
msgstr ""
msgstr "Övergripande domäner"
msgid "Overview"
msgstr "Översikt"
@ -202,6 +213,8 @@ msgid ""
"Please add only one domain per line. Comments introduced with '#' are "
"allowed - ip addresses, wildcards and regex are not."
msgstr ""
"Lägg bara till en domän per rad. Kommentarer introducerade med '#' är "
"tillåtna - ip-adresser, jokertecken och regex är inte."
msgid "Please edit this file directly in a terminal session."
msgstr "Vänligen redigera den här filen direkt i en terminal-session."
@ -218,10 +231,18 @@ msgstr "Fråga efter domäner"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
msgid "Refresh"
msgstr "Uppdatera"
msgid "Refresh Blocklist Sources"
msgstr ""
msgid "Resume"
@ -238,12 +259,17 @@ msgstr "Spara"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
msgid "Startup Trigger"
@ -266,19 +292,23 @@ msgstr ""
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr ""
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
"Det här formuläret tillåter dig att förändra innehållet i adblock's "
"svartlista (%s).<br />"
"svartlista (%s)."
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
"Det här formuläret tillåter dig att förändra innehållet i adblock's vitlista "
"(%s).<br />"
"(%s)."
msgid ""
"This form allows you to modify the content of the main adblock configuration "
@ -292,11 +322,6 @@ msgid ""
"for whitelisting."
msgstr ""
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr ""
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -325,120 +350,25 @@ msgid ""
"kidsafe configurations."
msgstr ""
msgid "disabled"
msgstr "inaktiverad"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
msgid "enabled"
msgstr "aktiverad"
#~ msgid "-------"
#~ msgstr "-------"
msgid "error"
msgstr "fel"
#~ msgid "Adblock Logfile"
#~ msgstr "Adblock's loggfil"
msgid "n/a"
msgstr "n/a"
#~ msgid "disabled"
#~ msgstr "inaktiverad"
msgid "paused"
msgstr "pausad"
#~ msgid "enabled"
#~ msgstr "aktiverad"
msgid "running"
msgstr ""
#~ msgid "error"
#~ msgstr "fel"
#~ msgid "Invalid domain specified!"
#~ msgstr "Ogiltig domän angiven!"
#~ msgid "Available blocklist sources."
#~ msgstr "Tillgängliga källor för blockeringslistor"
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr ""
#~ "Filstorleken är för stor för online-redigering i LuCi (&gt; 512 KB)."
#~ msgid ""
#~ "Caution: Please don't select big lists or many lists at once on low "
#~ "memory devices to prevent OOM exceptions!"
#~ msgstr ""
#~ "Försiktig: Vänligen välj inte stora listor eller många listor på samma "
#~ "gång för enheter med lite minne för att undvika OOM-undantag!"
#~ msgid ""
#~ "For further information <a href=\"%s\" target=\"_blank\">see online "
#~ "documentation</a>"
#~ msgstr ""
#~ "För mer information <a href=\"%s\" target=\"_blank\">se dokumentationen "
#~ "på internet</a>"
#~ msgid "Manual / Backup mode"
#~ msgstr "Manuell / Säkerhetskopieringsläge"
#~ msgid "Please update your adblock config file to use this package."
#~ msgstr ""
#~ "Vänligen uppdatera din adblock's konfigurationsfil till att använda det "
#~ "här paketet."
#~ msgid "Blocked domains (overall)"
#~ msgstr "Blockerade domäner (övergripande)"
#~ msgid "DNS backend"
#~ msgstr "Bakände för DNS"
#~ msgid "Enable verbose debug logging"
#~ msgstr "Aktivera utförlig loggning för avlusning"
#~ msgid "Last rundate"
#~ msgstr "Senaste kördatum"
#~ msgid "Redirect all DNS queries to the local resolver."
#~ msgstr "Dirigera om alla DNS-förfrågningar till den lokala "
#~ msgid "Resume adblock"
#~ msgstr "Återuppta adblock"
#~ msgid "Status"
#~ msgstr "Status"
#~ msgid "Suspend adblock"
#~ msgstr "Upphäv adblock"
#~ msgid "active"
#~ msgstr "aktiv"
#~ msgid "no domains blocked"
#~ msgstr "inga domäner blockerades"
#~ msgid "suspended"
#~ msgstr "upphävd"
#~ msgid "."
#~ msgstr "."
#~ msgid "For further information"
#~ msgstr "För mer information"
#~ msgid "Backup options"
#~ msgstr "Alternativ för säkerhetskopiering"
#~ msgid "Available blocklist sources ("
#~ msgstr "Tillgängliga källor för blockeringslistor ("
#~ msgid "Global options"
#~ msgstr "Globala alternativ"
#~ msgid "Whitelist file"
#~ msgstr "Vitlista fil"
#~ msgid "see list details"
#~ msgstr "se listans detaljer"
#~ msgid "Count"
#~ msgstr "Räkna"
#~ msgid "Do not write status info to flash"
#~ msgstr "Skriv inte status info till flash"
#~ msgid "Redirect all DNS queries to the local resolver"
#~ msgstr "Dirigera om alla DNS-förfrågning till den lokala resolvern"
#~ msgid "n/a"
#~ msgstr "n/a"

View file

@ -4,9 +4,6 @@ msgstr "Content-Type: text/plain; charset=UTF-8"
msgid "'Jail' Blocklist Creation"
msgstr ""
msgid "-------"
msgstr ""
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
@ -15,9 +12,6 @@ msgstr ""
msgid "Adblock"
msgstr ""
msgid "Adblock Logfile"
msgstr ""
msgid "Adblock Status"
msgstr ""
@ -47,7 +41,7 @@ msgstr ""
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -128,11 +122,6 @@ msgstr ""
msgid "Flush DNS Cache after adblock processing."
msgstr ""
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
@ -160,12 +149,11 @@ msgstr ""
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
"List of supported DNS backends with their default list export directory."
msgstr ""
msgid "List of supported and fully pre-configured download utilities."
@ -174,6 +162,9 @@ msgstr ""
msgid "Loading"
msgstr ""
msgid "Low Priority Service"
msgstr ""
msgid "Max. Download Queue"
msgstr ""
@ -210,10 +201,18 @@ msgstr ""
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
msgid "Refresh"
msgstr ""
msgid "Refresh Blocklist Sources"
msgstr ""
msgid "Resume"
@ -230,12 +229,17 @@ msgstr ""
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
msgid "Startup Trigger"
@ -258,14 +262,18 @@ msgstr ""
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr ""
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr ""
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr ""
msgid ""
@ -278,11 +286,6 @@ msgid ""
"for whitelisting."
msgstr ""
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr ""
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -311,25 +314,7 @@ msgid ""
"kidsafe configurations."
msgstr ""
msgid "disabled"
msgstr ""
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
msgid "enabled"
msgstr ""
msgid "error"
msgstr ""
msgid "n/a"
msgstr ""
msgid "paused"
msgstr ""
msgid "running"
msgstr ""

View file

@ -18,21 +18,16 @@ msgstr ""
msgid "'Jail' Blocklist Creation"
msgstr "“Jail” 拦截名单创建"
msgid "-------"
msgstr "-------"
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
msgstr ""
"<b>注意:</b>为防止在小于 64M 空闲内存的设备上出现内存不足异常,请只选择其中的几个!"
"<b>注意:</b>为防止在小于 64M 空闲内存的设备上出现内存不足异常,请只选择其中"
"的几个!"
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Adblock 日志文件"
msgid "Adblock Status"
msgstr "Adblock 状态"
@ -62,7 +57,7 @@ msgstr ""
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -82,8 +77,7 @@ msgstr "Adblock 配置工具,通过 DNS 来拦截广告和阻止域名。"
msgid ""
"Create compressed blocklist backups, they will be used in case of download "
"errors or during startup in backup mode."
msgstr ""
"创建压缩的拦截列表备份,它们将在下载错误或备份模式启动期间使用。"
msgstr "创建压缩的拦截列表备份,它们将在下载错误或备份模式启动期间使用。"
msgid "DNS Backend (DNS Directory)"
msgstr "DNS 后端DNS 目录)"
@ -129,8 +123,7 @@ msgstr "启用 Blocklist 备份"
msgid ""
"Enable memory intense overall sort / duplicate removal on low memory devices "
"(&lt; 64 MB free RAM)"
msgstr ""
"在低内存设备上启用积极的内存整体排序/重复移除(&lt; 64 MB 空闲内存)"
msgstr "在低内存设备上启用积极的内存整体排序/重复移除(&lt; 64 MB 空闲内存)"
msgid "Enable verbose debug logging in case of any processing error."
msgstr "在出现任何处理错误的情况下启用详细调试日志记录。"
@ -147,24 +140,15 @@ msgstr "清空 DNS 缓存"
msgid "Flush DNS Cache after adblock processing."
msgstr "在 adblock 进程启动后清空 DNS 缓存。"
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
"对受 SSL 保护的拦截列表源,您需要一个合适的 SSL 库,如 “libustream-ssl” 或 "
"“built-in”。"
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
msgstr ""
"进一步信息<a href=\"%s\" target=\"_blank\">请访问在线文档"
msgstr "进一步信息<a href=\"%s\" target=\"_blank\">请访问在线文档</a>"
msgid ""
"For further performance improvements you can raise this value, e.g. '8' or "
"'16' should be safe."
msgstr ""
"为了进一步提高性能您可以提高此值例如8 或 16 应该是安全的。"
msgstr "为了进一步提高性能您可以提高此值例如8 或 16 应该是安全的。"
msgid "Force Local DNS"
msgstr "强制本地 DNS"
@ -183,14 +167,12 @@ msgstr "最后运行"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
msgstr ""
"可用网络接口列表。通常启动将由 “wan” 接口触发。<br />"
"by the 'wan' interface."
msgstr "可用网络接口列表。通常启动将由 “wan” 接口触发。"
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
msgstr "支持的 DNS 后端列表及其默认列表导出目录。<br />"
"List of supported DNS backends with their default list export directory."
msgstr "支持的 DNS 后端列表及其默认列表导出目录。"
msgid "List of supported and fully pre-configured download utilities."
msgstr "支持和完全预配置的下载工具列表。"
@ -198,6 +180,9 @@ msgstr "支持和完全预配置的下载工具列表。"
msgid "Loading"
msgstr "加载中"
msgid "Low Priority Service"
msgstr ""
msgid "Max. Download Queue"
msgstr "最大下载队列"
@ -226,8 +211,7 @@ msgstr "请在终端会话中直接编辑此文件。"
msgid ""
"Please note: this needs additional 'msmtp' package installation and setup."
msgstr ""
"请注意:这需要额外的 “msmtp” 软件包安装和设置。"
msgstr "请注意:这需要额外的 “msmtp” 软件包安装和设置。"
msgid "Query"
msgstr "查询"
@ -237,12 +221,21 @@ msgstr "查询域"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
"如果总数小于或等于给定限制(默认为 0请提高最小电子邮件通知数以获取电子邮件。"
"如果总数小于或等于给定限制(默认为 0请提高最小电子邮件通知数以获取电子"
"邮件。"
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgstr "将所有 DNS 查询从“lan”区域重定向到本地解析器。"
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
msgid "Refresh"
msgstr ""
msgid "Refresh Blocklist Sources"
msgstr ""
msgid "Resume"
msgstr "恢复"
@ -258,15 +251,18 @@ msgstr "保存"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr "如果发生错误或域计数 &le; 0发送通知电子邮件。"
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
"如果发生错误或域计数 &le; 0发送通知电子邮件。<br />"
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
msgstr ""
"处理下载队列的大小 amp; 并行处理列表(默认 “4”。<br />"
"parallel (default '4')."
msgstr "处理下载队列的大小 amp; 并行处理列表(默认 “4”。"
msgid "Startup Trigger"
msgstr "启动触发器"
@ -280,24 +276,26 @@ msgstr "暂停/恢复 Adblock"
msgid ""
"Target directory for adblock backups. Please use only non-volatile disks, e."
"g. an external usb stick."
msgstr ""
"adblock 备份的目标目录。 请仅使用非易失性磁盘,例如:一个外置 U 盘。"
msgstr "adblock 备份的目标目录。 请仅使用非易失性磁盘,例如:一个外置 U 盘。"
msgid "Target directory for the generated blocklist 'adb_list.overall'."
msgstr "生成的 blocklist 'adb_list.overall'的目标目录。"
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr "文件过大,无法使用 LuCI 的在线编辑(&ge; 100 KB。"
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr "此表单显示系统日志输出,仅针对 adblock 相关的消息进行了预筛选。"
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
"文件过大,无法使用 LuCI 的在线编辑(&ge; 100 KB。"
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr "此表单允许您修改 adblock 黑名单(%s的内容。<br />"
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr "此表单允许您修改 adblock 白名单(%s的内容。<br />"
msgid ""
@ -310,11 +308,6 @@ msgid ""
"for whitelisting."
msgstr "此表单允许您查询某些域的活动块列表,例如用于列出白名单。"
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr "此表单显示系统日志输出,仅针对 adblock 相关的消息进行了预筛选。"
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -344,28 +337,44 @@ msgid ""
msgstr ""
"您可以手动使用此限制性拦截列表,例如:为客人提供 wifi 或 kidsafe 配置。"
msgid "disabled"
msgstr "已禁用"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr "例如:要接收每个 adblock 更新的电子邮件通知时将此值设置为150000。"
msgid "enabled"
msgstr "已启用"
#~ msgid "-------"
#~ msgstr "-------"
msgid "error"
msgstr "错误"
#~ msgid "Adblock Logfile"
#~ msgstr "Adblock 日志文件"
msgid "n/a"
msgstr "不可用"
#~ msgid ""
#~ "For SSL protected blocklist sources you need a suitable SSL library, e.g. "
#~ "'libustream-ssl' or 'built-in'."
#~ msgstr ""
#~ "对受 SSL 保护的拦截列表源,您需要一个合适的 SSL 库,如 “libustream-ssl” "
#~ "或 “built-in”。"
msgid "paused"
msgstr "已暂停"
#~ msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
#~ msgstr "将所有 DNS 查询从“lan”区域重定向到本地解析器。"
msgid "running"
msgstr "运行中"
#~ msgid "disabled"
#~ msgstr "已禁用"
#~ msgid "enabled"
#~ msgstr "已启用"
#~ msgid "error"
#~ msgstr "错误"
#~ msgid "n/a"
#~ msgstr "不可用"
#~ msgid "paused"
#~ msgstr "已暂停"
#~ msgid "running"
#~ msgstr "运行中"
#~ msgid "Invalid domain specified!"
#~ msgstr "无效域名!"
@ -377,6 +386,3 @@ msgstr "运行中"
#~ "List URLs and Shallalist category selections are configurable in the "
#~ "'Advanced' section.<br />"
#~ msgstr "列表 URL 和 Shallalist 类别选择可在“高级”选项卡中配置。<br />"
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr "文件大小太大,无法在 LuCI&gt; 512 KB中进行在线编辑。"

View file

@ -18,9 +18,6 @@ msgstr ""
msgid "'Jail' Blocklist Creation"
msgstr ""
msgid "-------"
msgstr "-------"
msgid ""
"<b>Caution:</b> To prevent OOM exceptions on low memory devices with less "
"than 64 MB free RAM, please only select a few of them!"
@ -29,9 +26,6 @@ msgstr ""
msgid "Adblock"
msgstr "Adblock"
msgid "Adblock Logfile"
msgstr "Adblock 日誌檔案"
msgid "Adblock Status"
msgstr "Adblock 狀態"
@ -61,7 +55,7 @@ msgstr ""
msgid ""
"Builds an additional 'Jail' list (/tmp/adb_list.jail) to block access to all "
"domains except those listed in the whitelist file.<br />"
"domains except those listed in the whitelist file."
msgstr ""
msgid ""
@ -144,11 +138,6 @@ msgstr ""
msgid "Flush DNS Cache after adblock processing."
msgstr ""
msgid ""
"For SSL protected blocklist sources you need a suitable SSL library, e.g. "
"'libustream-ssl' or 'built-in'."
msgstr ""
msgid ""
"For further information <a href=\"%s\" target=\"_blank\">check the online "
"documentation</a>"
@ -176,13 +165,12 @@ msgstr "最後執行"
msgid ""
"List of available network interfaces. Usually the startup will be triggered "
"by the 'wan' interface.<br />"
"by the 'wan' interface."
msgstr ""
msgid ""
"List of supported DNS backends with their default list export directory.<br /"
">"
msgstr "支援的 DNS 後端列表及其預設列表匯出目錄。<br />"
"List of supported DNS backends with their default list export directory."
msgstr "支援的 DNS 後端列表及其預設列表匯出目錄。"
msgid "List of supported and fully pre-configured download utilities."
msgstr ""
@ -190,6 +178,9 @@ msgstr ""
msgid "Loading"
msgstr "載入中"
msgid "Low Priority Service"
msgstr ""
msgid "Max. Download Queue"
msgstr ""
@ -228,11 +219,19 @@ msgstr "查詢域"
msgid ""
"Raise the minimum email notification count, to get emails if the overall "
"count is less or equal to the given limit (default 0),<br />"
"count is less or equal to the given limit (default 0),"
msgstr ""
msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
msgstr "將所有 DNS 查詢從“lan”區域重定向到本地解析器。"
msgid ""
"Redirect all DNS queries from 'lan' zone to the local resolver, apply to udp "
"and tcp protocol on ports 53, 853 and 5353."
msgstr ""
msgid "Refresh"
msgstr ""
msgid "Refresh Blocklist Sources"
msgstr ""
msgid "Resume"
msgstr "恢復"
@ -248,12 +247,17 @@ msgstr "儲存"
msgid ""
"Send notification emails in case of a processing error or if domain count is "
"&le; 0.<br />"
"&le; 0."
msgstr ""
msgid ""
"Set the nice level to 'low priority' and the adblock background processing "
"will take less resources from the system."
msgstr ""
msgid ""
"Size of the download queue to handle downloads &amp; list processing in "
"parallel (default '4').<br />"
"parallel (default '4')."
msgstr ""
msgid "Startup Trigger"
@ -276,15 +280,19 @@ msgstr "生成的 blocklist 'adb_list.overall'的目標目錄。"
msgid "The file size is too large for online editing in LuCI (&ge; 100 KB)."
msgstr ""
msgid "The syslog output, pre-filtered for adblock related messages only."
msgstr "此表單顯示系統日誌輸出,僅針對 adblock 相關的訊息進行了預篩選。"
msgid "This change requires a manual service stop/re-start to take effect."
msgstr ""
msgid ""
"This form allows you to modify the content of the adblock blacklist (%s)."
"<br />"
msgstr "此表單允許您修改 adblock 黑名單(%s的內容。<br />"
msgstr "此表單允許您修改 adblock 黑名單(%s的內容。"
msgid ""
"This form allows you to modify the content of the adblock whitelist (%s)."
"<br />"
msgstr "此表單允許您修改 adblock 白名單(%s的內容。<br />"
msgstr "此表單允許您修改 adblock 白名單(%s的內容。"
msgid ""
"This form allows you to modify the content of the main adblock configuration "
@ -296,11 +304,6 @@ msgid ""
"for whitelisting."
msgstr "此表單允許您查詢某些域的活動塊列表,例如用於列出白名單。"
msgid ""
"This form shows the syslog output, pre-filtered for adblock related messages "
"only."
msgstr "此表單顯示系統日誌輸出,僅針對 adblock 相關的訊息進行了預篩選。"
msgid ""
"To overwrite the default path use the 'DNS Directory' option in the extra "
"section below."
@ -329,31 +332,34 @@ msgid ""
"kidsafe configurations."
msgstr ""
msgid "disabled"
msgstr "已禁用"
msgid ""
"e.g. to receive an email notification with every adblock update set this "
"value to 150000."
msgstr ""
msgid "enabled"
msgstr "已啟用"
#~ msgid "-------"
#~ msgstr "-------"
msgid "error"
msgstr "錯誤"
#~ msgid "Adblock Logfile"
#~ msgstr "Adblock 日誌檔案"
msgid "n/a"
msgstr "不可用"
#~ msgid "Redirect all DNS queries from 'lan' zone to the local resolver."
#~ msgstr "將所有 DNS 查詢從“lan”區域重定向到本地解析器。"
msgid "paused"
msgstr "已暫停"
#~ msgid "disabled"
#~ msgstr "已禁用"
msgid "running"
msgstr ""
#~ msgid "enabled"
#~ msgstr "已啟用"
#~ msgid "Invalid domain specified!"
#~ msgstr "無效域名!"
#~ msgid "error"
#~ msgstr "錯誤"
#~ msgid "n/a"
#~ msgstr "不可用"
#~ msgid "paused"
#~ msgstr "已暫停"
#~ msgid "Available blocklist sources."
#~ msgstr "可用的 blocklist 來源。"
@ -362,6 +368,3 @@ msgstr ""
#~ "List URLs and Shallalist category selections are configurable in the "
#~ "'Advanced' section.<br />"
#~ msgstr "列表 URL 和 Shallalist 類別選擇可在“高階”選項卡中配置。<br />"
#~ msgid "The file size is too large for online editing in LuCI (&gt; 512 KB)."
#~ msgstr "檔案大小太大,無法在 LuCI&gt; 512 KB中進行線上編輯。"

View file

@ -1,19 +1,19 @@
# Copyright (c) 2017 Stan Grishin (stangri@melmac.net)
# Copyright 2017-2018 Stan Grishin (stangri@melmac.net)
# This is free software, licensed under the GNU General Public License v3.
include $(TOPDIR)/rules.mk
PKG_LICENSE:=GPL-3.0+
PKG_LICENSE:=GPL-3.0-or-later
PKG_MAINTAINER:=Stan Grishin <stangri@melmac.net>
LUCI_TITLE:=Advanced Linksys Reboot Web UI
LUCI_DESCRIPTION:=Provides Web UI (found under System/Advanced Reboot) to reboot supported Linksys and ZyXEL routers to\
an altnerative partition. Also provides Web UI to shut down (power off) your device. Supported dual-partition\
routers are listed at https://github.com/stangri/openwrt-luci/blob/luci-app-advanced-reboot/applications/luci-app-advanced-reboot/README.md
an alternative partition. Also provides Web UI to shut down (power off) your device. Supported dual-partition\
routers are listed at https://github.com/openwrt/luci/blob/master/applications/luci-app-advanced-reboot/README.md
LUCI_DEPENDS:=+luci-mod-admin-full
LUCI_DEPENDS:=+luci-compat +luci-mod-admin-full
LUCI_PKGARCH:=all
PKG_RELEASE:=32
PKG_RELEASE:=52
include ../../luci.mk

View file

@ -1,13 +1,18 @@
# Advanced Reboot Web UI (luci-app-advanced-reboot)
## Description
This package allows you to reboot to an alternative partition on the supported (dual-partition) routers and to power off (power down) your OpenWrt/LEDE Project device.
This package allows you to reboot to an alternative partition on the supported (dual-partition) routers and to power off (power down) your OpenWrt device.
## Supported Devices
Currently supported dual-partition devices include:
- Linksys EA3500
- Linksys E4200v2
- Linksys EA4500
- Linksys EA6350v3
- Linksys EA8300
- Linksys EA8500
- Linksys WRT1200AC
- Linksys WRT1900AC
@ -17,22 +22,58 @@ Currently supported dual-partition devices include:
- Linksys WRT32X
- ZyXEL NBG6817
If you're interested in having your device supported, please post in [LEDE Project Forum Support Thread](https://forum.lede-project.org/t/web-ui-to-reboot-to-another-partition-dual-partition-routers/3423).
If your device is not in the list above, however it is a [dual-firmware device](https://openwrt.org/tag/dual_firmware?do=showtag&tag=dual_firmware) and you're interested in having your device supported, please post in [OpenWrt Forum Support Thread](https://forum.openwrt.org/t/web-ui-to-reboot-to-another-partition-dual-partition-routers/3423).
## Screenshot (luci-app-advanced-reboot)
![screenshot](https://raw.githubusercontent.com/stangri/openwrt_packages/master/screenshots/luci-app-advanced-reboot/screenshot01.png "screenshot")
![screenshot](https://raw.githubusercontent.com/stangri/openwrt_packages/master/screenshots/luci-app-advanced-reboot/screenshot02.png "screenshot")
## How to install
Install ```luci-app-advanced-reboot``` from Web UI or connect to your router via ssh and run the following commands:
```sh
opkg update
opkg install luci-app-advanced-reboot
```
If the ```luci-app-advanced-reboot``` package is not found in the official feed/repo for your version of OpenWrt/LEDE Project, you will need to [add a custom repo to your router](https://github.com/stangri/openwrt_packages/blob/master/README.md#on-your-router) first.
## Notes/Known Issues
- When you reboot to a different partition, your current settings (WiFi SSID/password, etc.) will not apply to a different partition. Different partitions might have completely different settings and even firmware.
- If you reboot to a partition which doesn't allow you to switch boot partitions (like stock vendor firmware), you might not be able to boot back to OpenWrt/LEDE Project unless you reflash it, losing all the settings.
- If you reboot to a partition which doesn't allow you to switch boot partitions (like stock vendor firmware), you might not be able to boot back to OpenWrt unless you reflash it, losing all the settings.
- Some devices allow you to trigger reboot to an alternative partition by interrupting boot 3 times in a row (by resetting/switching off the device or pulling power). As these methods might be different for different devices, do your own homework.
- Newer versions of this package try to mount alternative partition on compatible NAND routers in order to retrieve detailed firmware information. When that happens, it is normal to have messages similar to the below in the system log:
```sh
Tue Nov 19 15:45:03 2019 user.notice luci-app-advanced-reboot: attempting to mount alternative partition (mtd6)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.673826] ubi2: attaching mtd6
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.876698] ubi2: scanning is finished
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.885267] ubi2: attached mtd6 (name "rootfs1", size 74 MiB)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.891063] ubi2: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.898011] ubi2: min./max. I/O unit sizes: 2048/2048, sub-page size 2048
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.904878] ubi2: VID header offset: 2048 (aligned 2048), data offset: 4096
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.911928] ubi2: good PEBs: 592, bad PEBs: 0, corrupted PEBs: 0
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.917962] ubi2: user volume: 2, internal volumes: 1, max. volumes count: 128
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.925252] ubi2: max/mean erase counter: 48/32, WL threshold: 4096, image sequence number: 1659081076
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.934623] ubi2: available PEBs: 0, total reserved PEBs: 592, PEBs reserved for bad PEB handling: 40
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.944346] ubi2: background thread "ubi_bgt2d" started, PID 26780
Tue Nov 19 15:45:03 2019 kern.info kernel: [30392.952596] block ubiblock2_0: created from ubi2:0 (rootfs)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30392.964083] UBIFS (ubi2:1): background thread "ubifs_bgt2_1" started, PID 26787
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.009298] UBIFS (ubi2:1): UBIFS: mounted UBI device 2, volume 1, name "rootfs_data"
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.017185] UBIFS (ubi2:1): LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.027213] UBIFS (ubi2:1): FS size: 61075456 bytes (58 MiB, 481 LEBs), journal size 3047424 bytes (2 MiB, 24 LEBs)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.037733] UBIFS (ubi2:1): reserved for root: 2884744 bytes (2817 KiB)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.044389] UBIFS (ubi2:1): media format: w4/r0 (latest is w5/r0), UUID 76F0C52C-6197-4E00-B306-747262B06545, small LPT model
Tue Nov 19 15:45:03 2019 user.notice luci-app-advanced-reboot: attempting to unmount alternative partition (mtd6)
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.132743] UBIFS (ubi2:1): un-mount UBI device 2
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.137481] UBIFS (ubi2:1): background thread "ubifs_bgt2_1" stops
Tue Nov 19 15:45:03 2019 kern.info kernel: [30393.390961] block ubiblock2_0: released
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.396576] ubi2: detaching mtd6
Tue Nov 19 15:45:03 2019 kern.notice kernel: [30393.400117] ubi2: mtd6 is detached
```
## Thanks
I'd like to thank everyone who helped create, test and troubleshoot this package. Without help from [@hnyman](https://github.com/hnyman), [@jpstyves](https://github.com/jpstyves) and many contributions from [@slh](https://github.com/pkgadd) it wouldn't have been possible.
I'd like to thank everyone who helped create, test and troubleshoot this package. Without help from [@hnyman](https://github.com/hnyman), [@jpstyves](https://github.com/jpstyves), [@imi2003](https://github.com/imi2003), [@jeffsf](https://github.com/jeffsf) and many contributions from [@slh](https://github.com/pkgadd) it wouldn't have been possible.

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "EA9500",
boardName = "linksys-panamera",
partition1MTD = "mtd3",
partition2MTD = "mtd6",
labelOffset = 28,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = nil,
bootEnv2Partition1Value = nil,
bootEnv2Partition2Value = nil
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "E4200v2/EA4500",
boardName = "linksys-viper",
partition1MTD = "mtd3",
partition2MTD = "mtd5",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,15 @@
return {
vendorName = "Linksys",
deviceName = "EA3500",
boardName = "linksys-audi",
partition1MTD = "mtd3",
partition2MTD = "mtd5",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "EA6350v3",
boardName = "linksys-ea6350v3",
partition1MTD = "mtd10",
partition2MTD = "mtd12",
labelOffset = 192,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = nil,
bootEnv2Partition1Value = nil,
bootEnv2Partition2Value = nil
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "EA8300",
boardName = "linksys-ea8300",
partition1MTD = "mtd10",
partition2MTD = "mtd12",
labelOffset = 192,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = nil,
bootEnv2Partition1Value = nil,
bootEnv2Partition2Value = nil
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "EA8500",
boardName = "linksys-ea8500",
partition1MTD = "mtd13",
partition2MTD = "mtd15",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = nil,
bootEnv2Partition1Value = nil,
bootEnv2Partition2Value = nil
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT1200AC",
boardName = "linksys-caiman",
partition1MTD = "mtd4",
partition2MTD = "mtd6",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT1900AC",
boardName = "linksys-mamba",
partition1MTD = "mtd4",
partition2MTD = "mtd6",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT1900ACS",
boardName = "linksys-shelby",
partition1MTD = "mtd4",
partition2MTD = "mtd6",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT1900ACv2",
boardName = "linksys-cobra",
partition1MTD = "mtd4",
partition2MTD = "mtd6",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT3200ACM",
boardName = "linksys-rango",
partition1MTD = "mtd5",
partition2MTD = "mtd7",
labelOffset = 32,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "Linksys",
deviceName = "WRT32X",
boardName = "linksys-venom",
partition1MTD = "mtd5",
partition2MTD = "mtd7",
labelOffset = nil,
bootEnv1 = "boot_part",
bootEnv1Partition1Value = 1,
bootEnv1Partition2Value = 2,
bootEnv2 = "bootcmd",
bootEnv2Partition1Value = "run nandboot",
bootEnv2Partition2Value = "run altnandboot"
}

View file

@ -0,0 +1,14 @@
return {
vendorName = "ZyXEL",
deviceName = "NBG6817",
boardName = "nbg6817",
partition1MTD = "mmcblk0p4",
partition2MTD = "mmcblk0p7",
labelOffset = 32,
bootEnv1 = nil,
bootEnv1Partition1Value = 255,
bootEnv1Partition2Value = 1,
bootEnv2 = nil,
bootEnv2Partition1Value = nil,
bootEnv2Partition2Value = nil
}

View file

@ -1,202 +1,295 @@
-- Copyright 2017 Stan Grishin <stangri@melmac.net>
-- Copyright 2017-2018 Stan Grishin <stangri@melmac.net>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.advanced_reboot", package.seeall)
devices = {
-- deviceName, boardName, partition1, partition2, offset, envVar1, envVar1Value1, envVar1Value2, envVar2, envVar2Value1, envVar2Value2
{"Linksys EA3500", "linksys-audi", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys E4200v2/EA4500", "linksys-viper", "mtd3", "mtd5", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys EA8500", "ea8500", "mtd13", "mtd15", 32, "boot_part", 1, 2},
-- {"Linksys EA9500", "linksys-panamera", "mtd3", "mtd6", 28, "boot_part", 1, 2},
{"Linksys WRT1200AC", "linksys-caiman", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys WRT1900AC", "linksys-mamba", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys WRT1900ACv2", "linksys-cobra", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys WRT1900ACS", "linksys-shelby", "mtd4", "mtd6", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys WRT3200ACM", "linksys-rango", "mtd5", "mtd7", 32, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"Linksys WRT32X", "linksys-venom", "mtd5", "mtd7", nil, "boot_part", 1, 2, "bootcmd", "run nandboot", "run altnandboot"},
{"ZyXEL NBG6817","nbg6817","mmcblk0p4","mmcblk0p7", 32, nil, 255, 1}
}
local util = require "luci.util"
local fs = require "nixio.fs"
local sys = require "luci.sys"
local http = require "luci.http"
local dispatcher = require "luci.dispatcher"
local i18n = require "luci.i18n"
local ltemplate = require "luci.template"
local ip = require "luci.ip"
local http = require "luci.http"
local sys = require "luci.sys"
local dispatcher = require "luci.dispatcher"
local uci = require "luci.model.uci".cursor()
local packageName = "advanced-reboot"
local devices_dir = "/usr/lib/lua/luci/" .. packageName .. "/devices/"
errorMessage = nil
rom_board_name = luci.util.trim(luci.sys.exec("cat /tmp/sysinfo/board_name"))
for i=1, #devices do
device_board_name = devices[i][2]:gsub('%p','')
if rom_board_name and rom_board_name:gsub('%p',''):match(device_board_name) then
device_name = devices[i][1]
partition_one_mtd = devices[i][3] or nil
partition_two_mtd = devices[i][4] or nil
partition_skip = devices[i][5] or nil
boot_envvar1 = devices[i][6] or nil
boot_envvar1_partition_one = tonumber(devices[i][7]) or nil
boot_envvar1_partition_two = tonumber(devices[i][8]) or nil
boot_envvar2 = devices[i][9] or nil
boot_envvar2_partition_one = devices[i][10] or nil
boot_envvar2_partition_two = devices[i][11] or nil
if partition_one_mtd and partition_skip then
partition_one_label = luci.util.trim(luci.sys.exec("dd if=/dev/" .. partition_one_mtd .. " bs=1 skip=" .. partition_skip .. " count=25" .. " 2>/dev/null"))
n, partition_one_version = string.match(partition_one_label, '(Linux)-([%d|.]+)')
end
if partition_two_mtd and partition_skip then
partition_two_label = luci.util.trim(luci.sys.exec("dd if=/dev/" .. partition_two_mtd .. " bs=1 skip=" .. partition_skip .. " count=25" .. " 2>/dev/null"))
n, partition_two_version = string.match(partition_two_label, '(Linux)-([%d|.]+)')
end
if partition_one_label and string.find(partition_one_label, "LEDE") then partition_one_os = "LEDE" end
if partition_one_label and string.find(partition_one_label, "OpenWrt") then partition_one_os = "OpenWrt" end
if partition_one_label and string.find(partition_one_label, "Linksys") then partition_one_os = "Linksys" end
if partition_two_label and string.find(partition_two_label, "LEDE") then partition_two_os = "LEDE" end
if partition_two_label and string.find(partition_two_label, "OpenWrt") then partition_two_os = "OpenWrt" end
if partition_two_label and string.find(partition_two_label, "Linksys") then partition_two_os = "Linksys" end
if device_name and device_name == "ZyXEL NBG6817" then
if not partition_one_os then partition_one_os = "ZyXEL" end
if not partition_two_os then partition_two_os = "ZyXEL" end
end
if device_name and device_name == "Linksys WRT32X" then
if not partition_one_os then partition_one_os = "Unknown/Compressed" end
if not partition_two_os then partition_two_os = "Unknown/Compressed" end
end
if not partition_one_os then partition_one_os = "Unknown" end
if not partition_two_os then partition_two_os = "Unknown" end
if partition_one_os and partition_one_version then partition_one_os = partition_one_os .. " (Linux " .. partition_one_version .. ")" end
if partition_two_os and partition_two_version then partition_two_os = partition_two_os .. " (Linux " .. partition_two_version .. ")" end
function logger(t)
util.exec("logger -t " .. packageName .. " '" .. tostring(t) .. "'")
end
if device_name and device_name == "ZyXEL NBG6817" then
if not zyxelFlagPartition then zyxelFlagPartition = luci.util.trim(luci.sys.exec("source /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end
if not zyxelFlagPartition then
errorMessage = errorMessage .. luci.i18n.translate("Unable to find Dual Boot Flag Partition." .. " ")
luci.util.perror(luci.i18n.translate("Unable to find Dual Boot Flag Partition."))
else
current_partition = tonumber(luci.sys.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'"))
end
else
if nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then
current_partition = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1)))
end
end
other_partition = current_partition == boot_envvar1_partition_two and boot_envvar1_partition_one or boot_envvar1_partition_two
end
function is_alt_mountable(p1_mtd, p2_mtd)
if p1_mtd:sub(1,3) == "mtd" and
p2_mtd:sub(1,3) == "mtd" and
fs.access("/usr/sbin/ubiattach") and
fs.access("/usr/sbin/ubiblock") and
fs.access("/bin/mount") then
return true
else
return false
end
end
function get_partition_os_info(op_ubi)
local cp_info, op_info
if fs.access("/etc/os-release") then
cp_info = util.trim(util.exec('. /etc/os-release && echo "$PRETTY_NAME"'))
if cp_info:find("SNAPSHOT") then
cp_info = util.trim(util.exec('. /etc/os-release && echo "$OPENWRT_RELEASE"'))
end
end
logger(i18n.translatef("attempting to mount alternative partition (mtd%s)", tostring(op_ubi)))
alt_partition_unmount(op_ubi)
alt_partition_mount(op_ubi)
if fs.access("/alt/rom/etc/os-release") then
op_info = util.trim(util.exec('. /alt/rom/etc/os-release && echo "$PRETTY_NAME"'))
if op_info:find("SNAPSHOT") then
op_info = util.trim(util.exec('. /alt/rom/etc/os-release && echo "$OPENWRT_RELEASE"'))
end
end
logger(i18n.translatef("attempting to unmount alternative partition (mtd%s)", tostring(op_ubi)))
alt_partition_unmount(op_ubi)
return cp_info, op_info
end
function alt_partition_mount(op_ubi)
local ubi_dev
util.exec('for i in rom overlay firmware; do [ ! -d "$i" ] && mkdir -p "/alt/${i}"; done')
ubi_dev = tostring(util.exec("ubiattach -m " .. tostring(op_ubi)))
_, _, ubi_dev = ubi_dev:find("UBI device number (%d+)")
if not ubi_dev then
util.exec("ubidetach -m " .. tostring(op_ubi))
return
end
util.exec("ubiblock --create /dev/ubi" .. ubi_dev .. "_0")
util.exec("mount -t squashfs -o ro /dev/ubiblock" .. ubi_dev .. "_0 /alt/rom")
util.exec("mount -t ubifs /dev/ubi" .. ubi_dev .. "_1 /alt/overlay")
-- util.exec("mount -t overlay overlay -o noatime,lowerdir=/alt/rom,upperdir=/alt/overlay/upper,workdir=/alt/overlay/work /alt/firmware")
end
function alt_partition_unmount(op_ubi)
local i
local mtdCount = tonumber(util.exec("ubinfo | grep 'Present UBI devices' | grep -c ','"))
mtdCount = mtdCount and mtdCount + 1 or 10
-- util.exec("[ -d /alt/firmware ] && umount /alt/firmware")
util.exec("[ -d /alt/overlay ] && umount /alt/overlay")
util.exec("[ -d /alt/rom ] && umount /alt/rom")
for i = 0, mtdCount do
if not fs.access("/sys/devices/virtual/ubi/ubi" .. tostring(i) .. "/mtd_num") then break end
ubi_mtd = tonumber(util.trim(util.exec("cat /sys/devices/virtual/ubi/ubi" .. i .. "/mtd_num")))
if ubi_mtd and ubi_mtd == op_ubi then
util.exec("ubiblock --remove /dev/ubi" .. tostring(i) .. "_0")
util.exec("ubidetach -m " .. tostring(op_ubi))
util.exec('rm -rf /alt')
end
end
end
function obtain_device_info()
local p, boardName, n, p1_label, p1_version, p2_label, p2_version, p1_os, p2_os
local errorMessage, current_partition
local op_ubi, cp_info, op_info, zyxelFlagPartition
local romBoardName = util.trim(util.exec("cat /tmp/sysinfo/board_name"))
for filename in fs.dir(devices_dir) do
local p_func = loadfile(devices_dir .. filename)
setfenv(p_func, { _ = i18n.translate })
p = p_func()
boardName = p.boardName:gsub('%p','')
if romBoardName and romBoardName:gsub('%p',''):match(boardName) then
if p.labelOffset then
if p.partition1MTD then
p1_label = util.trim(util.exec("dd if=/dev/" .. p.partition1MTD .. " bs=1 skip=" .. p.labelOffset .. " count=128" .. " 2>/dev/null"))
n, p1_version = p1_label:match('(Linux)-([%d|.]+)')
end
if p.partition2MTD then
p2_label = util.trim(util.exec("dd if=/dev/" .. p.partition2MTD .. " bs=1 skip=" .. p.labelOffset .. " count=128" .. " 2>/dev/null"))
n, p2_version = p2_label:match('(Linux)-([%d|.]+)')
end
if p1_label and p1_label:find("LEDE") then p1_os = "LEDE" end
if p1_label and p1_label:find("OpenWrt") then p1_os = "OpenWrt" end
if p1_label and p.vendorName and p1_label:find(p.vendorName) then p1_os = p.vendorName end
if p2_label and p2_label:find("LEDE") then p2_os = "LEDE" end
if p2_label and p2_label:find("OpenWrt") then p2_os = "OpenWrt" end
if p2_label and p.vendorName and p2_label:find(p.vendorName) then p2_os = p.vendorName end
if not p1_os then p1_os = p.vendorName .. "/" .. i18n.translate("Unknown") end
if not p2_os then p2_os = p.vendorName .. "/" .. i18n.translate("Unknown") end
if p1_os and p1_version then p1_os = p1_os .. " (Linux " .. p1_version .. ")" end
if p2_os and p2_version then p2_os = p2_os .. " (Linux " .. p2_version .. ")" end
else
p1_os = p.vendorName .. "/" .. i18n.translate("Unknown") .. " (" .. i18n.translate("Compressed") .. ")"
p2_os = p.vendorName .. "/" .. i18n.translate("Unknown") .. " (" .. i18n.translate("Compressed") .. ")"
end
if p.bootEnv1 then
if fs.access("/usr/sbin/fw_printenv") and fs.access("/usr/sbin/fw_setenv") then
current_partition = tonumber(util.trim(util.exec("fw_printenv -n " .. p.bootEnv1)))
end
else
if not zyxelFlagPartition then zyxelFlagPartition = util.trim(util.exec(". /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end
if zyxelFlagPartition then
current_partition = tonumber(util.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'"))
else
errorMessage = errorMessage or i18n.translate("Unable to find Dual Boot Flag Partition.")
util.perror(i18n.translate("Unable to find Dual Boot Flag Partition."))
end
end
if is_alt_mountable(p.partition1MTD, p.partition2MTD) then
if current_partition == p.bootEnv1Partition1Value then
op_ubi = tonumber(p.partition2MTD:sub(4)) + 1
else
op_ubi = tonumber(p.partition1MTD:sub(4)) + 1
end
local cp_info, op_info = get_partition_os_info(op_ubi)
if current_partition == p.bootEnv1Partition1Value then
p1_os = cp_info or p1_os
p2_os = op_info or p2_os
else
p1_os = op_info or p1_os
p2_os = cp_info or p2_os
end
end
return romBoardName, p.vendorName .. " " .. p.deviceName, p.bootEnv1, p.bootEnv1Partition1Value, p1_os, p.bootEnv1Partition2Value, p2_os, p.bootEnv2, p.bootEnv2Partition1Value, p.bootEnv2Partition1Value, current_partition
end
end
return romBoardName, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil
end
function index()
entry({"admin", "system", "advanced_reboot"}, template("advanced_reboot/advanced_reboot"), _("Advanced Reboot"), 90)
entry({"admin", "system", "advanced_reboot", "reboot"}, post("action_reboot"))
entry({"admin", "system", "advanced_reboot", "alternative_reboot"}, post("action_altreboot"))
entry({"admin", "system", "advanced_reboot", "power_off"}, post("action_poweroff"))
entry({"admin", "system", "advanced_reboot"}, call("action_template"), _("Advanced Reboot"), 90)
entry({"admin", "system", "advanced_reboot", "reboot"}, post("action_reboot"))
entry({"admin", "system", "advanced_reboot", "alternative_reboot"}, post("action_altreboot"))
entry({"admin", "system", "advanced_reboot", "power_off"}, post("action_poweroff"))
end
function action_template()
local romBoardName, device_name, bev1, bev1p1, p1_os, bev1p2, p2_os, bev2, bev2p1, bev2p2, current_partition = obtain_device_info()
ltemplate.render("advanced_reboot/advanced_reboot",{
romBoardName=romBoardName,
device_name=device_name,
bev1p1=bev1p1,
p1_os=p1_os,
bev1p2=bev1p2,
p2_os=p2_os,
current_partition=current_partition,
errorMessage=errorMessage})
end
function action_reboot()
local uci = require "luci.model.uci".cursor()
luci.template.render("admin_system/applyreboot", {
title = luci.i18n.translate("Rebooting..."),
msg = luci.i18n.translate("The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = luci.ip.new(uci:get("network", "lan", "ipaddr")) or "192.168.1.1"
})
luci.sys.reboot()
ltemplate.render("advanced_reboot/applyreboot", {
title = i18n.translate("Rebooting..."),
msg = i18n.translate("The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = ip.new(util.imatch(uci:get("network", "lan", "ipaddr"))() or "192.168.1.1")
})
sys.reboot()
end
function action_altreboot()
local uci = require "luci.model.uci".cursor()
local zyxelFlagPartition, zyxelBootFlag, zyxelNewBootFlag, errorCode, curEnvSetting, newEnvSetting
errorMessage = nil
errorCode = 0
if luci.http.formvalue("cancel") then
luci.http.redirect(luci.dispatcher.build_url('admin/system/advanced_reboot'))
return
end
local step = tonumber(luci.http.formvalue("step") or 1)
if step == 1 then
if device_name and nixio.fs.access("/usr/sbin/fw_printenv") and nixio.fs.access("/usr/sbin/fw_setenv") then
luci.template.render("advanced_reboot/alternative_reboot",{})
else
luci.template.render("advanced_reboot/advanced_reboot",{errorMessage = luci.i18n.translate("No access to fw_printenv or fw_printenv!")})
end
elseif step == 2 then
if boot_envvar1 or boot_envvar2 then -- Linksys devices
if boot_envvar1 then
curEnvSetting = tonumber(luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar1)))
if not curEnvSetting then
errorMessage = errorMessage .. luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar1 .. ". "
luci.util.perror(luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar1 .. ".")
else
newEnvSetting = curEnvSetting == boot_envvar1_partition_one and boot_envvar1_partition_two or boot_envvar1_partition_one
errorCode = luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar1 .. " " .. newEnvSetting)
if errorCode ~= 0 then
errorMessage = errorMessage .. luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar1 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ". "
luci.util.perror(luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar1 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ".")
end
end
end
if boot_envvar2 then
curEnvSetting = luci.util.trim(luci.sys.exec("/usr/sbin/fw_printenv -n " .. boot_envvar2))
if not curEnvSetting then
errorMessage = errorMessage .. luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar2 .. ". "
luci.util.perror(luci.i18n.translate("Unable to obtain firmware environment variable") .. ": " .. boot_envvar2 .. ".")
else
newEnvSetting = curEnvSetting == boot_envvar2_partition_one and boot_envvar2_partition_two or boot_envvar2_partition_one
errorCode = luci.sys.call("/usr/sbin/fw_setenv " .. boot_envvar2 .. " '" .. newEnvSetting .. "'")
if errorCode ~= 0 then
errorMessage = errorMessage .. luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar2 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ". "
luci.util.perror(luci.i18n.translate("Unable to set firmware environment variable") .. ": " .. boot_envvar2 .. " " .. luci.i18n.translate("to") .. " " .. newEnvSetting .. ".")
end
end
end
else -- NetGear device
if not zyxelFlagPartition then zyxelFlagPartition = luci.util.trim(luci.sys.exec("source /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end
if not zyxelFlagPartition then
errorMessage = errorMessage .. luci.i18n.translate("Unable to find Dual Boot Flag Partition." .. " ")
luci.util.perror(luci.i18n.translate("Unable to find Dual Boot Flag Partition."))
else
zyxelBootFlag = tonumber(luci.sys.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'"))
zyxelNewBootFlag = zyxelBootFlag and zyxelBootFlag == 1 and "\\xff" or "\\x01"
if zyxelNewBootFlag then
errorCode = luci.sys.call("printf \"" .. zyxelNewBootFlag .. "\" >" .. zyxelFlagPartition )
if errorCode ~= 0 then
errorMessage = errorMessage .. luci.i18n.translate("Unable to set Dual Boot Flag Partition entry for partition") .. ": " .. zyxelFlagPartition .. ". "
luci.util.perror(luci.i18n.translate("Unable to set Dual Boot Flag Partition entry for partition") .. ": " .. zyxelFlagPartition .. ".")
end
end
end
end
if not errorMessage then
luci.template.render("admin_system/applyreboot", {
title = luci.i18n.translate("Rebooting..."),
msg = luci.i18n.translate("The system is rebooting to an alternative partition now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = luci.ip.new(uci:get("network", "lan", "ipaddr")) or "192.168.1.1"
})
luci.sys.reboot()
else
luci.template.render("advanced_reboot/advanced_reboot",{
rom_board_name=rom_board_name,
device_name=device_name,
boot_envvar1_partition_one=boot_envvar1_partition_one,
partition_one_os=partition_one_os,
boot_envvar1_partition_two=boot_envvar1_partition_two,
partition_two_os=partition_two_os,
current_partition=current_partition,
errorMessage = errorMessage})
end
end
local romBoardName, device_name, bev1, bev1p1, p1_os, bev1p2, p2_os, bev2, bev2p1, bev2p2, current_partition = obtain_device_info()
local zyxelFlagPartition, zyxelBootFlag, zyxelNewBootFlag, errorCode, curEnvSetting, newEnvSetting
errorMessage = nil
errorCode = 0
if http.formvalue("cancel") then
http.redirect(dispatcher.build_url('admin/system/advanced_reboot'))
return
end
local step = tonumber(http.formvalue("step") or 1)
if step == 1 then
if fs.access("/usr/sbin/fw_printenv") and fs.access("/usr/sbin/fw_setenv") then
ltemplate.render("advanced_reboot/alternative_reboot",{})
else
ltemplate.render("advanced_reboot/advanced_reboot",{errorMessage = i18n.translate("No access to fw_printenv or fw_printenv!")})
end
elseif step == 2 then
if bev1 or bev2 then -- Linksys devices
if bev1 then
curEnvSetting = tonumber(util.trim(util.exec("fw_printenv -n " .. bev1)))
if not curEnvSetting then
errorMessage = errorMessage .. i18n.translatef("Unable to obtain firmware environment variable: %s.", bev1)
util.perror(i18n.translatef("Unable to obtain firmware environment variable: %s.", bev1))
else
newEnvSetting = curEnvSetting == bev1p1 and bev1p2 or bev1p1
errorCode = sys.call("fw_setenv " .. bev1 .. " " .. newEnvSetting)
if errorCode ~= 0 then
errorMessage = errorMessage or "" .. i18n.translatef("Unable to set firmware environment variable: %s to %s.", bev1, newEnvSetting)
util.perror(i18n.translatef("Unable to set firmware environment variable: %s to %s.", bev1, newEnvSetting))
end
end
end
if bev2 then
curEnvSetting = util.trim(util.exec("fw_printenv -n " .. bev2))
if not curEnvSetting then
errorMessage = errorMessage or "" .. i18n.translatef("Unable to obtain firmware environment variable: %s.", bev2)
util.perror(i18n.translatef("Unable to obtain firmware environment variable: %s.", bev2))
else
newEnvSetting = curEnvSetting == bev2p1 and bev2p2 or bev2p1
errorCode = sys.call("fw_setenv " .. bev2 .. " '" .. newEnvSetting .. "'")
if errorCode ~= 0 then
errorMessage = errorMessage or "" .. i18n.translatef("Unable to set firmware environment variable: %s to %s.", bev2, newEnvSetting)
util.perror(i18n.translatef("Unable to set firmware environment variable: %s to %s.", bev2, newEnvSetting))
end
end
end
else -- NetGear device
if not zyxelFlagPartition then zyxelFlagPartition = util.trim(util.exec(". /lib/functions.sh; find_mtd_part 0:DUAL_FLAG")) end
if not zyxelFlagPartition then
errorMessage = errorMessage .. i18n.translate("Unable to find Dual Boot Flag Partition." .. " ")
util.perror(i18n.translate("Unable to find Dual Boot Flag Partition."))
else
zyxelBootFlag = tonumber(util.exec("dd if=" .. zyxelFlagPartition .. " bs=1 count=1 2>/dev/null | hexdump -n 1 -e '1/1 \"%d\"'"))
zyxelNewBootFlag = zyxelBootFlag and zyxelBootFlag == 1 and "\\xff" or "\\x01"
if zyxelNewBootFlag then
errorCode = sys.call("printf \"" .. zyxelNewBootFlag .. "\" >" .. zyxelFlagPartition )
if errorCode ~= 0 then
errorMessage = errorMessage or "" .. i18n.translatef("Unable to set Dual Boot Flag Partition entry for partition: %s.", zyxelFlagPartition)
util.perror(i18n.translatef("Unable to set Dual Boot Flag Partition entry for partition: %s.", zyxelFlagPartition))
end
end
end
end
if not errorMessage then
ltemplate.render("advanced_reboot/applyreboot", {
title = i18n.translate("Rebooting..."),
msg = i18n.translate("The system is rebooting to an alternative partition now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = ip.new(util.imatch(uci:get("network", "lan", "ipaddr"))() or "192.168.1.1")
})
sys.reboot()
else
ltemplate.render("advanced_reboot/advanced_reboot",{
romBoardName=romBoardName,
device_name=device_name,
bev1p1=bev1p1,
p1_os=p1_os,
bev1p2=bev1p2,
p2_os=p2_os,
current_partition=current_partition,
errorMessage = errorMessage})
end
end
end
function action_poweroff()
local uci = require "luci.model.uci".cursor()
if luci.http.formvalue("cancel") then
luci.http.redirect(luci.dispatcher.build_url('admin/system/advanced_reboot'))
return
end
local step = tonumber(luci.http.formvalue("step") or 1)
if step == 1 then
if nixio.fs.access("/sbin/poweroff") then
luci.template.render("advanced_reboot/power_off",{})
else
luci.template.render("advanced_reboot/advanced_reboot",{})
end
elseif step == 2 then
luci.template.render("admin_system/applyreboot", {
title = luci.i18n.translate("Shutting down..."),
msg = luci.i18n.translate("The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = luci.ip.new(uci:get("network", "lan", "ipaddr")) or "192.168.1.1"
})
luci.sys.call("/sbin/poweroff")
end
if http.formvalue("cancel") then
http.redirect(dispatcher.build_url('admin/system/advanced_reboot'))
return
end
local step = tonumber(http.formvalue("step") or 1)
if step == 1 then
if fs.access("/sbin/poweroff") then
ltemplate.render("advanced_reboot/power_off",{})
else
ltemplate.render("advanced_reboot/advanced_reboot",{})
end
elseif step == 2 then
ltemplate.render("advanced_reboot/applyreboot", {
title = i18n.translate("Shutting down..."),
msg = i18n.translate("The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It might be necessary to renew the address of your computer to reach the device again, depending on your settings."),
addr = ip.new(util.imatch(uci:get("network", "lan", "ipaddr"))() or "192.168.1.1")
})
sys.call("/sbin/poweroff")
end
end

View file

@ -1,7 +1,7 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008-2015 Jo-Philipp Wich <jow@openwrt.org>
Copyright 2017 Stan Grishin <stangri@melmac.net>
Copyright 2017-2020 Stan Grishin <stangri@melmac.net>
Licensed to the public under the Apache License 2.0.
-%>
@ -20,70 +20,70 @@
<%- if device_name then -%>
<fieldset class="cbi-section">
<legend><%=device_name%><%: Partitions%></legend>
<div class="table cbi-section-table" id="partitions">
<div class="tr cbi-section-table-titles">
<div class="th cbi-section-table-cell"><%:Partition%></div>
<div class="th cbi-section-table-cell"><%:Status%></div>
<div class="th cbi-section-table-cell"><%:Firmware/OS (Kernel)%></div>
<div class="th cbi-section-table-cell"><%:Action%></div>
</div>
<div class="tr cbi-section-table-row">
<div class="td">
<%=string.format("%X", boot_envvar1_partition_one)%>
</div>
<div class="td">
<%- if boot_envvar1_partition_one == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
</div>
<div class="td">
<%=partition_one_os%>
</div>
<div class="td">
<%- if boot_envvar1_partition_one == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="reboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to current partition%>" />
</form>
<%- else -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
</div>
</div>
<div class="tr cbi-section-table-row">
<div class="td">
<%=string.format("%X", boot_envvar1_partition_two)%>
</div>
<div class="td">
<%- if boot_envvar1_partition_two == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
</div>
<div class="td">
<%=partition_two_os%>
</div>
<div class="td">
<%- if boot_envvar1_partition_two == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="reboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to current partition%>" />
</form>
<%- else -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
</div>
</div>
</div>
<legend><%=device_name%><%: Partitions%></legend>
<div class="table cbi-section-table" id="partitions">
<div class="tr cbi-section-table-titles">
<div class="th cbi-section-table-cell"><%:Partition%></div>
<div class="th cbi-section-table-cell"><%:Status%></div>
<div class="th cbi-section-table-cell"><%:Firmware%></div>
<div class="th cbi-section-table-cell"><%:Reboot%></div>
</div>
<div class="tr cbi-section-table-row cbi-rowstyle-<%- if bev1p1 == current_partition then -%><%=1%><%- else -%><%=2%><%- end -%>">
<div class="td">
<%=string.format("%X", bev1p1)%>
</div>
<div class="td">
<%- if bev1p1 == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
</div>
<div class="td">
<%=p1_os%>
</div>
<div class="td">
<%- if bev1p1 == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="reboot-button" type="submit" class="cbi-button cbi-button-apply important" value="<%:Reboot to current partition%>" />
</form>
<%- else -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply important" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
</div>
</div>
<div class="tr cbi-section-table-row cbi-rowstyle-<%- if bev1p2 == current_partition then -%><%=1%><%- else -%><%=2%><%- end -%>">
<div class="td">
<%=string.format("%X", bev1p2)%>
</div>
<div class="td">
<%- if bev1p2 == current_partition then -%><%:Current%><%- else -%><%:Alternative%><%- end -%>
</div>
<div class="td">
<%=p2_os%>
</div>
<div class="td">
<%- if bev1p2 == current_partition then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="reboot-button" type="submit" class="cbi-button cbi-button-apply important" value="<%:Reboot to current partition%>" />
</form>
<%- else -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/alternative_reboot')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="altreboot-button" type="submit" class="cbi-button cbi-button-apply important" value="<%:Reboot to alternative partition...%>" />
</form>
<%- end -%>
</div>
</div>
</div>
</fieldset>
<%- else -%>
<%- if rom_board_name then -%>
<p class="alert-message warning"><%=pcdata(translatef("Warning: Device (%s) is unknown or isn't a dual-partition device!", rom_board_name))%></p>
<%- else -%>
<p class="alert-message warning"><%:Warning: Unable to obtain device information!%></p>
<%- end -%>
<%- if rom_board_name then -%>
<p class="alert-message warning"><%=pcdata(translatef("Warning: Device (%s) is unknown or isn't a dual-partition device!", rom_board_name))%></p>
<%- else -%>
<p class="alert-message warning"><%=pcdata(translatef("Warning: Unable to obtain device information!"))%></p>
<%- end -%>
<%- end -%>
<hr />
@ -91,10 +91,10 @@
<%- if nixio.fs.access("/sbin/poweroff") then -%>
<form method="post" action="<%=url('admin/system/advanced_reboot/power_off')%>">
<input type="hidden" name="token" value="<%=token%>" />
<input id="poweroff-button" type="submit" class="cbi-button cbi-button-apply" value="<%:Perform power off...%>" />
<input id="poweroff-button" type="submit" class="cbi-button cbi-button-apply important" value="<%:Perform power off...%>" />
</form>
<%- else -%>
<p class="alert-message warning"><%:Warning: This system does not support powering off!%></p>
<p class="alert-message warning"><%:Warning: This system does not support powering off!%></p>
<%- end -%>
<%+footer%>

View file

@ -1,7 +1,7 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
Copyright 2017 Stan Grishin <stangri@melmac.net>
Copyright 2017-2018 Stan Grishin <stangri@melmac.net>
Licensed to the public under the Apache License 2.0.
-%>
@ -10,10 +10,10 @@
<h2 name="content"><%:Reboot Device to an Alternative Partition%> - <%:Confirm%></h2>
<p>
<%_ WARNING: An alternative partition might have its own settings and completely different firmware.<br /><br />
As your network configuration and WiFi SSID/password on alternative partition might be different,
you might have to adjust your computer settings to be able to access your device once it reboots.<br /><br />
Please also be aware that alternative partition firmware might not provide an easy way to switch active partition
and boot back to the currently active partition.<br /><br />
As your network configuration and WiFi SSID/password on alternative partition might be different,
you might have to adjust your computer settings to be able to access your device once it reboots.<br /><br />
Please also be aware that alternative partition firmware might not provide an easy way to switch active partition
and boot back to the currently active partition.<br /><br />
Click "Proceed" below to reboot device to an alternative partition. %>
</p>
@ -21,8 +21,8 @@
<form class="inline" action="<%=REQUEST_URI%>" method="post">
<input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="step" value="2" />
<input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
<input class="cbi-button cbi-button-reset important" name="cancel" type="submit" value="<%:Cancel%>" />
<input class="cbi-button cbi-button-apply important" type="submit" value="<%:Proceed%>" />
</form>
</div>

View file

@ -0,0 +1,53 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<html>
<head>
<title><%=luci.sys.hostname()%> - <%= title or translate("Rebooting...") %></title>
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css?v=git-19.271.68204-f8775ee" />
<script type="text/javascript" src="<%=resource%>/xhr.js?v=git-19.271.68204-f8775ee"></script>
<script type="text/javascript">//<![CDATA[
var interval = window.setInterval(function() {
var img = new Image();
var target = ('https:' == document.location.protocol ? 'https://' : 'http://') + <%=addr and "'%s'" % addr or "window.location.host"%>;
img.onload = function() {
window.clearInterval(interval);
window.location.replace(target);
};
img.src = target + '<%=resource%>/icons/loading.gif?' + Math.random();
}, 5000);
//]]></script>
</head>
<body>
<header>
<div class="fill">
<div class="container">
<p class="brand"><%=luci.sys.hostname() or "?"%></p>
</div>
</div>
</header>
&#160;
<div class="main">
<div id="maincontainer">
<div id="maincontent" class="container">
<h2 name="content" id="applyreboot-container" ><%:System%> - <%= title or translate("Rebooting...") %></h2>
<div class="cbi-section" id="applyreboot-section">
<div>
<%= msg or translate("Changes applied.") %>
</div>
<div>
<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" />
<%:Waiting for changes to be applied...%>
</div>
</div>
</div>
</div>
</div>
</body>
</html>

View file

@ -1,7 +1,7 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008-2009 Jo-Philipp Wich <jow@openwrt.org>
Copyright 2017 Stan Grishin <stangri@melmac.net>
Copyright 2017-2018 Stan Grishin <stangri@melmac.net>
Licensed to the public under the Apache License 2.0.
-%>
@ -17,8 +17,8 @@
<form class="inline" action="<%=REQUEST_URI%>" method="post">
<input type="hidden" name="token" value="<%=token%>" />
<input type="hidden" name="step" value="2" />
<input class="cbi-button cbi-button-reset" name="cancel" type="submit" value="<%:Cancel%>" />
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Proceed%>" />
<input class="cbi-button cbi-button-reset important" name="cancel" type="submit" value="<%:Cancel%>" />
<input class="cbi-button cbi-button-apply important" type="submit" value="<%:Proceed%>" />
</form>
</div>

View file

@ -1,20 +1,18 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: LuCI: advanced-reboot\n"
"POT-Creation-Date: 2017-11-30 15:20+0300\n"
"PO-Revision-Date: 2018-01-05 19:53+0300\n"
"Language-Team: http://cyber-place.ru\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"Last-Translator: Vladimir aka sunny <picfun@ya.ru>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"PO-Revision-Date: 2020-10-29 08:32+0000\n"
"Last-Translator: sergio <sergio+it@outerface.net>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadvanced-reboot/ru/>\n"
"Language: ru\n"
msgid "Action"
msgstr "Действие"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "Advanced Reboot"
msgstr "Дополнительная перезагрузка"
@ -22,11 +20,14 @@ msgstr "Дополнительная перезагрузка"
msgid "Alternative"
msgstr "Альтернатива"
msgid "Alternative reboot cancelled."
msgstr "Альтернативная перезагрузка отменена."
msgid "Cancel"
msgstr "Отменить"
msgstr "Отмена"
msgid "Changes applied."
msgstr "Изменения установлены."
msgid "Compressed"
msgstr "Сжатый"
msgid "Confirm"
msgstr "Подтвердить"
@ -37,8 +38,11 @@ msgstr "Текущий"
msgid "ERROR:"
msgstr "ОШИБКА:"
msgid "Firmware/OS (Kernel)"
msgstr "Прошивка/ОС (Ядро)"
msgid "Firmware"
msgstr "Прошивка"
msgid "Loading"
msgstr "Загрузка"
msgid "No access to fw_printenv or fw_printenv!"
msgstr "Нет доступа к fw_printenv или fw_printenv!"
@ -58,6 +62,9 @@ msgstr "Отключить питание устройства"
msgid "Proceed"
msgstr "Продолжить"
msgid "Reboot"
msgstr "Перезагрузка"
msgid "Reboot Device to an Alternative Partition"
msgstr "Перезагрузить устройство в альтернативный раздел"
@ -71,21 +78,24 @@ msgid "Rebooting..."
msgstr "Перезагрузка..."
msgid "Shutting down..."
msgstr "Отключается..."
msgstr "Выключение..."
msgid "Status"
msgstr "Состояние"
msgid "System"
msgstr "Система"
msgid ""
"The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
"few minutes before you try to reconnect. It might be necessary to renew the "
"address of your computer to reach the device again, depending on your "
"settings."
msgstr ""
"Система перезагружается сейчас.<br /> НЕ ОТКЛЮЧАЙТЕ ПИТАНИЕ УСТРОЙСТВА!<br /"
"> Подождите несколько минут, прежде чем попытаться установить соединение "
"снова. Возможно, потребуется обновить адрес компьютера для повторного "
"доступа к устройству в зависимости от ваших настроек."
"Система перезагружается.<br /> НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!<br /> Подождите "
"несколько минут, прежде чем попытаться установить соединение снова. "
"Возможно, потребуется обновить адрес компьютера для повторного доступа к "
"устройству в зависимости от настроек."
msgid ""
"The system is rebooting to an alternative partition now.<br /> DO NOT POWER "
@ -93,31 +103,34 @@ msgid ""
"might be necessary to renew the address of your computer to reach the device "
"again, depending on your settings."
msgstr ""
"Система перезагружается на альтернативный раздел сейчас.<br /> НЕ ОТКЛЮЧАЙТЕ "
"ПИТАНИЕ УСТРОЙСТВА!<br /> Подождите несколько минут, прежде чем попытаться "
"установить соединение снова. Возможно, потребуется обновить адрес компьютера "
"для повторного доступа к устройству в зависимости от ваших настроек."
"Система перезагружается на альтернативный раздел.<br /> НЕ ВЫКЛЮЧАЙТЕ "
"УСТРОЙСТВО!<br /> Подождите несколько минут и попробуйте переустановить "
"соединение. В зависимости от настроек может потребоваться обновить адрес "
"компьютера для доступа к устройству."
msgid ""
"The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It "
"might be necessary to renew the address of your computer to reach the device "
"again, depending on your settings."
msgstr ""
"Система сейчас отключается.<br /> НЕ ОТКЛЮЧАЙТЕ ПИТАНИЕ УСТРОЙСТВА!<br /> "
"Возможно, потребуется обновить адрес компьютера для повторного доступа к "
"устройству в зависимости от настроек."
"Система завершает работу.<br /> НЕ ВЫКЛЮЧАЙТЕ УСТРОЙСТВО!<br /> Возможно, "
"потребуется обновить адрес компьютера для повторного доступа к устройству в "
"зависимости от настроек."
msgid "Unable to find Dual Boot Flag Partition."
msgstr "Невозможно найти Dual Boot раздел."
msgid "Unable to obtain firmware environment variable"
msgstr "Невозможно получить переменную среды прошивки"
msgid "Unable to obtain firmware environment variable: %s."
msgstr "Невозможно получить переменную окружения прошивки: %s."
msgid "Unable to set Dual Boot Flag Partition entry for partition"
msgstr "Невозможно использовать Dual Boot раздел."
msgid "Unable to set Dual Boot Flag Partition entry for partition: %s."
msgstr "Невозможно установить точку входа Dual Boot для раздела: %s."
msgid "Unable to set firmware environment variable"
msgstr "Невозможно установить переменную среды прошивки"
msgid "Unable to set firmware environment variable: %s to %s."
msgstr "Невозможно установить переменную окружения прошивки: %s в %s."
msgid "Unknown"
msgstr "Неизвестно"
msgid ""
"WARNING: An alternative partition might have its own settings and completely "
@ -148,16 +161,26 @@ msgstr ""
"которое не поддерживает выключение питания.<br /><br /> Нажмите \"Продолжить"
"\" ниже, чтобы выключить устройство."
msgid "Waiting for changes to be applied..."
msgstr "Ждём установления изменений..."
msgid "Warning: Device (%s) is unknown or isn't a dual-partition device!"
msgstr ""
"Внимание: Устройство (%s) не известно или не имеет двойной раздел памяти!"
msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
"Внимание: Есть несохраненные изменения, которые будут потеряны при "
"Внимание: Есть не сохраненные изменения, которые будут потеряны при "
"перезагрузке!"
msgid "Warning: This system does not have two partitions!"
msgstr "Внимание: Эта система не имеет двух разделов!"
msgid "Warning: This system does not support powering off!"
msgstr "Внимание: Эта система не поддерживает отключение питания!"
msgid "to"
msgstr ""
msgid "Warning: Unable to obtain device information!"
msgstr "Внимание: Невозможно получить информацию об устройстве!"
msgid "attempting to mount alternative partition (mtd%s)"
msgstr "попытка монтирования альтернативного раздела (mtd%s)"
msgid "attempting to unmount alternative partition (mtd%s)"
msgstr "попытка размонтирования альтернативного раздела (mtd%s)"

View file

@ -1,8 +1,14 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgid "Action"
msgstr "Åtgärd"
msgstr ""
"PO-Revision-Date: 2020-08-20 15:36+0000\n"
"Last-Translator: Luna Jernberg <droidbittin@gmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsadvanced-reboot/sv/>\n"
"Language: sv\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1-dev\n"
msgid "Advanced Reboot"
msgstr "Avancerad omstart"
@ -10,12 +16,15 @@ msgstr "Avancerad omstart"
msgid "Alternative"
msgstr "Alternativ"
msgid "Alternative reboot cancelled."
msgstr ""
msgid "Cancel"
msgstr "Avbryt"
msgid "Changes applied."
msgstr "Ändringar tillämpade. "
msgid "Compressed"
msgstr ""
msgid "Confirm"
msgstr "Bekräfta"
@ -23,13 +32,16 @@ msgid "Current"
msgstr "Nuvarande"
msgid "ERROR:"
msgstr ""
msgstr "FEL:"
msgid "Firmware/OS (Kernel)"
msgstr "Inre mjukvara/OS (Kärna)"
msgid "Firmware"
msgstr "Firmware"
msgid "Loading"
msgstr "Laddar"
msgid "No access to fw_printenv or fw_printenv!"
msgstr ""
msgstr "Ingen åtkomst till fw_printenv eller fw_printenv! "
msgid "Partition"
msgstr "Partition"
@ -46,6 +58,9 @@ msgstr "Stäng av enhet"
msgid "Proceed"
msgstr "Fortsätt"
msgid "Reboot"
msgstr "Starta om"
msgid "Reboot Device to an Alternative Partition"
msgstr "Starta om enheten till en alternativ partition"
@ -64,12 +79,18 @@ msgstr "Stänger av..."
msgid "Status"
msgstr "Status"
msgid "System"
msgstr "System"
msgid ""
"The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
"few minutes before you try to reconnect. It might be necessary to renew the "
"address of your computer to reach the device again, depending on your "
"settings."
msgstr ""
"Systemet startar om nu. <br /> STÄNG INTE AV ENHETEN!<br /> Vänta ett par "
"minuter innan du försöker ansluta. Du kan behöva förnya adressen på din "
"dator för att nå enheten igen, beroende på inställningarna."
msgid ""
"The system is rebooting to an alternative partition now.<br /> DO NOT POWER "
@ -77,6 +98,10 @@ msgid ""
"might be necessary to renew the address of your computer to reach the device "
"again, depending on your settings."
msgstr ""
"Systemet startar om till en alternativ partition nu.<br />STÄNG INTE AV "
"ENHETEN!<br /> Vänta ett par minuter innan du försöker ansluta. Du kan "
"behöva förnya adressen på din dator för att nå enheten igen, beroende på "
"inställningarna. "
msgid ""
"The system is shutting down now.<br /> DO NOT POWER OFF THE DEVICE!<br /> It "
@ -88,15 +113,18 @@ msgstr ""
"att nå enheten igen."
msgid "Unable to find Dual Boot Flag Partition."
msgstr "Det gick inte att hitta Dual Boot Flag Partition."
msgid "Unable to obtain firmware environment variable: %s."
msgstr ""
msgid "Unable to obtain firmware environment variable"
msgid "Unable to set Dual Boot Flag Partition entry for partition: %s."
msgstr ""
msgid "Unable to set Dual Boot Flag Partition entry for partition"
msgid "Unable to set firmware environment variable: %s to %s."
msgstr ""
msgid "Unable to set firmware environment variable"
msgid "Unknown"
msgstr ""
msgid ""
@ -109,6 +137,15 @@ msgid ""
"back to the currently active partition.<br /><br /> Click \"Proceed\" below "
"to reboot device to an alternative partition."
msgstr ""
"VARNING: En alternativ partition kan ha sina egna inställningar och helt "
"annan firmware.<br /> <br />Eftersom din nätverkskonfiguration och WiFi "
"SSID / lösenord på alternativ partition kan vara annorlunda, kan du behöva "
"justera dina datorinställningar för att kunna nå din enhet igen efter "
"omstart.\n"
"<br /> <br /> Tänk också på att en alternativ partition firmware kanske inte "
"är ett enkelt sätt att växla aktiv partition och starta tillbaka till den "
"aktiva partitionen. <br /> <br / > Klicka på \"Fortsätt\" nedan för att "
"starta om enheten till en alternativ partition."
msgid ""
"WARNING: Power off might result in a reboot on a device which doesn't "
@ -119,15 +156,26 @@ msgstr ""
"stöd för avstängning.<br /><br /> Klicka på \"Fortsätt\" nedanför för att "
"stänga av din enhet."
msgid "Waiting for changes to be applied..."
msgstr "Väntar på att ändringarna ska bli verkställda..."
msgid "Warning: Device (%s) is unknown or isn't a dual-partition device!"
msgstr ""
"Varning: Enheten (% s) är okänd eller är inte en enhet med dubbla "
"partitioner!"
msgid "Warning: There are unsaved changes that will get lost on reboot!"
msgstr ""
"Varning: Det finns osparade ändringar som kommer att förloras vid omstart!"
msgid "Warning: This system does not have two partitions!"
msgstr "Varning: Det här systemet har inte två partitioner!"
msgid "Warning: This system does not support powering off!"
msgstr "Varning: Det här systemet har inte stöd för avstängning!"
msgid "to"
msgid "Warning: Unable to obtain device information!"
msgstr "Varning: Det går inte att få information om enheten!"
msgid "attempting to mount alternative partition (mtd%s)"
msgstr ""
msgid "attempting to unmount alternative partition (mtd%s)"
msgstr ""

View file

@ -1,12 +1,6 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
msgid ") is unknown or isn't a dual-partition device!"
msgstr ""
msgid "Action"
msgstr ""
msgid "Advanced Reboot"
msgstr ""
@ -16,6 +10,12 @@ msgstr ""
msgid "Cancel"
msgstr ""
msgid "Changes applied."
msgstr ""
msgid "Compressed"
msgstr ""
msgid "Confirm"
msgstr ""
@ -25,7 +25,10 @@ msgstr ""
msgid "ERROR:"
msgstr ""
msgid "Firmware/OS (Kernel)"
msgid "Firmware"
msgstr ""
msgid "Loading"
msgstr ""
msgid "No access to fw_printenv or fw_printenv!"
@ -46,6 +49,9 @@ msgstr ""
msgid "Proceed"
msgstr ""
msgid "Reboot"
msgstr ""
msgid "Reboot Device to an Alternative Partition"
msgstr ""
@ -64,6 +70,9 @@ msgstr ""
msgid "Status"
msgstr ""
msgid "System"
msgstr ""
msgid ""
"The system is rebooting now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
"few minutes before you try to reconnect. It might be necessary to renew the "
@ -87,13 +96,16 @@ msgstr ""
msgid "Unable to find Dual Boot Flag Partition."
msgstr ""
msgid "Unable to obtain firmware environment variable"
msgid "Unable to obtain firmware environment variable: %s."
msgstr ""
msgid "Unable to set Dual Boot Flag Partition entry for partition"
msgid "Unable to set Dual Boot Flag Partition entry for partition: %s."
msgstr ""
msgid "Unable to set firmware environment variable"
msgid "Unable to set firmware environment variable: %s to %s."
msgstr ""
msgid "Unknown"
msgstr ""
msgid ""
@ -113,7 +125,10 @@ msgid ""
"device."
msgstr ""
msgid "Warning: Device ("
msgid "Waiting for changes to be applied..."
msgstr ""
msgid "Warning: Device (%s) is unknown or isn't a dual-partition device!"
msgstr ""
msgid "Warning: There are unsaved changes that will get lost on reboot!"
@ -125,5 +140,8 @@ msgstr ""
msgid "Warning: Unable to obtain device information!"
msgstr ""
msgid "to"
msgid "attempting to mount alternative partition (mtd%s)"
msgstr ""
msgid "attempting to unmount alternative partition (mtd%s)"
msgstr ""

View file

@ -0,0 +1,5 @@
#!/bin/sh
rm -rf /var/luci-modulecache/; rm -f /var/luci-indexcache;
exit 0

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2014-06-02 21:34+0200\n"
"Last-Translator: Alex <alexhenrie24@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2019-10-20 13:07+0000\n"
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
"Language-Team: Catalan <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/ca/>\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.9.1-dev\n"
msgid "AHCP Server"
msgstr "Servidor AHCP"
@ -51,7 +52,7 @@ msgid "Announced prefixes"
msgstr "Prefixos anunciats"
msgid "Collecting data..."
msgstr "Recopilant informació..."
msgstr "Sestan recollint dades…"
msgid "Forwarder"
msgstr "Retransmissor"

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2014-04-23 23:01+0200\n"
"Last-Translator: koli <lukas.koluch@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-02-04 05:03+0000\n"
"Last-Translator: Pavel Borecki <pavel.borecki@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/cs/>\n"
"Language: cs\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Pootle 2.0.6\n"
"X-Generator: Weblate 3.11-dev\n"
msgid "AHCP Server"
msgstr "AHCP Server"
@ -33,7 +34,7 @@ msgid "Address"
msgstr "Adresa"
msgid "Advanced Settings"
msgstr "Pokročilé nastavení"
msgstr "Pokročilá nastavení"
msgid "Age"
msgstr "Stáří"
@ -48,7 +49,7 @@ msgid "Announced prefixes"
msgstr "Oznámené předčíslí"
msgid "Collecting data..."
msgstr "Probíhá shromažďování dat..."
msgstr "Shromažďování údajů…"
msgid "Forwarder"
msgstr "Přesměrování"
@ -63,7 +64,7 @@ msgid "IPv4 only"
msgstr "pouze IPv4"
msgid "IPv6 only"
msgstr "Pouze IPv6"
msgstr "pouze IPv6"
msgid "Lease directory"
msgstr "Zapůjčené adresáře"
@ -72,7 +73,7 @@ msgid "Lease validity time"
msgstr "Doba platnosti zapujčení"
msgid "Log file"
msgstr "Soubor protokolu"
msgstr "Soubor pro záznam událostí"
msgid "Multicast address"
msgstr "Vícesměrové adresy"
@ -90,13 +91,13 @@ msgid "Served interfaces"
msgstr "Obsluhované rozhraní"
msgid "Server"
msgstr "Servr"
msgstr "Server"
msgid "Specifies the announced IPv4 and IPv6 NTP servers"
msgstr "Specifikuje ohlášené IPv4 a IPv6 NTP servery"
msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "Specifikuje ohlášené IPv4 a IPv6 názvové servery"
msgstr "Specifikuje ohlášené IPv4 a IPv6 name servery"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr "Specifikuje ohlášené IPv4 a IPv6 sítě předpony v CIDR notaci"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-01-30 18:21+0200\n"
"Last-Translator: DAC324 <gerd_roethig@web.de>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-07-11 21:29+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2-dev\n"
msgid "AHCP Server"
msgstr "AHCP Server"
msgstr "AHCP-Server"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
@ -100,7 +100,7 @@ msgstr "Konfiguriert die bekannt gegebenen IPv4- und IPv6-DNS-Server"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr ""
"Konfiguriert die bekannt gegebenen IPv4- und IPv6-Netzwerkprefixe. Angabe in "
"CIDR-Notation."
"CIDR-Notation"
msgid "The AHCP Service is not running."
msgstr "Der AHCP-Dienst läuft nicht."

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-03-18 16:25+0200\n"
"Last-Translator: Vasilis <acinonyx@openwrt.gr>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-04-25 16:36+0000\n"
"Last-Translator: george k <norhorn@gmail.com>\n"
"Language-Team: Greek <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/el/>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.4\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.2-dev\n"
msgid "AHCP Server"
msgstr "Εξυπηρετητής AHCP"
@ -20,6 +21,11 @@ msgid ""
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"Το AHCP είναι ένα πρωτόκολλο αυτόματης διαμόρφωσης για δίκτυα με διευθύνσεις "
"IPv6 και διπλού πρωτοκόλλου IPv6/IPv4 σχεδιασμένο για αντικατάσταση τoυ "
"αυτόματου εντοπισμού του δρομολογητή ή του DHCP, όταν είναι δύσκολο να "
"λειτουργήσει ένας διακομιστής σε κάθε τομέα μετάδοσης, για παράδειγμα για "
"κινητά ad-hoc δίκτυα."
msgid "Active AHCP Leases"
msgstr "Ενεργά AHCP Leases"
@ -28,22 +34,22 @@ msgid "Address"
msgstr "Διεύθυνση"
msgid "Advanced Settings"
msgstr ""
msgstr "Ρυθμίσεις για προχωρημένους"
msgid "Age"
msgstr ""
msgstr "Ηλικία"
msgid "Announced DNS servers"
msgstr ""
msgstr "Ενεργοί διακομιστές DNS"
msgid "Announced NTP servers"
msgstr ""
msgstr "Ενεργοί διακομιστές NTP"
msgid "Announced prefixes"
msgstr ""
msgstr "Ενεργά προθέματα δικτύου"
msgid "Collecting data..."
msgstr "Συλλέγονται δεδομένα..."
msgstr "Συλλογή δεδομένων..."
msgid "Forwarder"
msgstr "Προωθητής"
@ -55,14 +61,13 @@ msgid "IPv4 and IPv6"
msgstr "IPv4 και IPv6"
msgid "IPv4 only"
msgstr "μόνο IPv4"
msgstr "Μόνο IPv4"
msgid "IPv6 only"
msgstr "μόνο IPv6"
msgstr "Μόνο IPv6"
#, fuzzy
msgid "Lease directory"
msgstr "Κατάλογος leases"
msgstr "Κατάλογος δεσμευμένων διευθύνσεων"
msgid "Lease validity time"
msgstr "Χρόνος εγκυρότητας lease"
@ -74,7 +79,7 @@ msgid "Multicast address"
msgstr "Διεύθυνση multicast"
msgid "Operation mode"
msgstr ""
msgstr "Τρόπος λειτουργίας"
msgid "Port"
msgstr "Θύρα"
@ -86,7 +91,7 @@ msgid "Served interfaces"
msgstr "Εξυπηρετούμενες διεπαφές"
msgid "Server"
msgstr "Εξυπηρετητής"
msgstr "Διακομιστής"
msgid "Specifies the announced IPv4 and IPv6 NTP servers"
msgstr "Καθορίζει τους εξυπηρετητές NTP σε IPv4 και IPv6 που ανακοινώνονται"
@ -94,21 +99,19 @@ msgstr "Καθορίζει τους εξυπηρετητές NTP σε IPv4 κα
msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "Καθορίζει τους εξυπηρετητές DNS σε IPv4 και IPv6 που ανακοινώνονται"
#, fuzzy
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr ""
"Καθορίζει τα προθέματα διευθύνσεων IPv4 και IPv6 που ανακοινώνονται, σε "
"μορφή CIDR"
"Καθορίζει ποιες διευθύνσεις δικτύου IPv4 και IPv6 θα ανακοινωθούν, σε μορφή "
"CIDR"
msgid "The AHCP Service is not running."
msgstr ""
msgstr "Η υπηρεσία AHCP δεν εκτελείται."
msgid "The AHCP Service is running with ID %s."
msgstr ""
msgstr "Η υπηρεσία AHCP εκτελείται με ID %s."
#, fuzzy
msgid "There are no active leases."
msgstr "Δεν υπάρχουν ενεργά leases"
msgstr "Δεν υπάρχουν ενεργές συνδέσεις."
msgid "Unique ID file"
msgstr "Αρχείο μοναδικού αναγνωριστικού"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-04-15 11:31+0200\n"
"Last-Translator: madanadam <madanadam@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-11-04 00:26+0000\n"
"Last-Translator: Igor Benek-Lins <beneklins@protonmail.ch>\n"
"Language-Team: English <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/en/>\n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.4\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "AHCP Server"
msgstr "AHCP Server"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
@ -22,7 +22,7 @@ msgid ""
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery and DHCP on "
"networks designed to be used in place of router discovery or DHCP on "
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."

View file

@ -1,34 +1,36 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-09-14 19:30+0200\n"
"Last-Translator: José Vicente <josevteg@gmail.com>\n"
"Language-Team: none\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2020-10-31 10:05+0000\n"
"Last-Translator: Franco Castillo <castillofrancodamian@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/es/>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "AHCP Server"
msgstr "Servidor AHCP"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"AHCP es un protocolo de autoconfiguración para redes con IPv6 o duales IPv6/"
"IPv4 diseñado para ser usado en lugar de router discovery o DHCP en redes en "
"las que es difícil o imposible configurar un servidor en cada capa de enlace "
"del dominio de propagación como las redes móviles ad-hoc."
"AHCP es un protocolo de configuración automática para redes IPv6 e IPv4/IPv6 "
"diseñado para utilizarse en sustitución del descubrimiento de enrutador y "
"DHCP en redes donde es difícil o imposible configurar un servidor en todos "
"los dominios de difusión de capas de enlaces; por ejemplo, en redes «ad hoc» "
"móviles."
# "Lease" en el sentido usado en DHCP no tiene una traducción clara en español y se puede usar la misma palabra en que en inglés.
msgid "Active AHCP Leases"
msgstr "Cesiones activas AHCP"
msgstr "Concesiones AHCP activas"
msgid "Address"
msgstr "Dirección"
@ -40,7 +42,7 @@ msgid "Age"
msgstr "Vida"
msgid "Announced DNS servers"
msgstr "Servidores DNS declarados"
msgstr "Servidores DNS anunciados"
msgid "Announced NTP servers"
msgstr "Servidores NTP declarados"
@ -49,7 +51,7 @@ msgid "Announced prefixes"
msgstr "Prefijos declarados"
msgid "Collecting data..."
msgstr "Obteniendo datos..."
msgstr "Recolectando datos…"
msgid "Forwarder"
msgstr "Transmisor"
@ -67,13 +69,13 @@ msgid "IPv6 only"
msgstr "Sólo IPv6"
msgid "Lease directory"
msgstr "Directorio de cesiones"
msgstr "Directorio de direcciones"
msgid "Lease validity time"
msgstr "Tiempo de validez de la cesión"
msgid "Log file"
msgstr "Fichero de registro"
msgstr "Archivo de registro"
msgid "Multicast address"
msgstr "Dirección multicast"
@ -109,7 +111,7 @@ msgid "The AHCP Service is running with ID %s."
msgstr "El Servicio AHCP está funcionando con el ID %s."
msgid "There are no active leases."
msgstr "No hay cesiones activas."
msgstr "No hay ninguna concesión activa."
msgid "Unique ID file"
msgstr "ID único de fichero"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-11-06 13:06+0200\n"
"Last-Translator: hogsim <hogsim@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-05-10 12:47+0000\n"
"Last-Translator: viking76 <liaudetgael@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.1-dev\n"
msgid "AHCP Server"
msgstr "Serveur AHCP"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
@ -22,7 +22,7 @@ msgid ""
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"AHCP est un protocole d'auto-configuration pour les réseaux IPv6 et double-"
"pile IPv6/IPv4, destiné à remplacer la recherche de routeur et le service "
"pile IPv6/IPv4, destiné à remplacer la recherche de routeur ou le service "
"DHCP sur des réseaux où il est difficile, voire impossible de configurer un "
"tel serveur pour tous les domaines de diffusion au niveau lien, par exemple "
"pour des réseaux ad-hoc mobiles."
@ -37,7 +37,7 @@ msgid "Advanced Settings"
msgstr "Paramètres avancés"
msgid "Age"
msgstr "Age"
msgstr "Âge"
msgid "Announced DNS servers"
msgstr "Serveurs DNS publiés"
@ -73,7 +73,7 @@ msgid "Lease validity time"
msgstr "Date de validité d'un bail"
msgid "Log file"
msgstr "Fichier journal"
msgstr "Fichier de journal"
msgid "Multicast address"
msgstr "Adresse multidiffusion"

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-09-10 03:44+0200\n"
"Last-Translator: Snoof <sagim9@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-10-17 15:26+0000\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/he/>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"X-Generator: Weblate 4.3.1-dev\n"
msgid "AHCP Server"
msgstr "שרת AHCP"
@ -49,7 +50,7 @@ msgid "Announced prefixes"
msgstr "קידומות מוכרזות"
msgid "Collecting data..."
msgstr "אוסף נתונים..."
msgstr "נאספים נתונים…"
msgid "Forwarder"
msgstr ""

View file

@ -1,31 +1,33 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-03-31 15:46+0200\n"
"Last-Translator: juhosg <juhosg@openwrt.org>\n"
"Language-Team: none\n"
"Report-Msgid-Bugs-To: https://github.com/openwrt/luci/issues\n"
"POT-Creation-Date: 2020-01-05 23:41+0000\n"
"PO-Revision-Date: 2020-08-12 21:32+0000\n"
"Last-Translator: Balázs Úr <balazs@urbalazs.hu>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/hu/>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.4\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2-dev\n"
msgid "AHCP Server"
msgstr "AHCP kiszolgáló"
msgstr "AHCP-kiszolgáló"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"Az AHCP egy olyan automatikus konfigurációs protokoll IPv6 és kettős IPv6/"
"IPv4 hálózatokhoz, mely a DHCP és a router dicovery protokoll helyett "
"használható olyan hálózatokok ahol nehéz vagy lehetetlen beállítani külön "
"kiszolgálót minden kapcsolati réteg tartományon belül, mint például a mobil "
"eseti hálózatok."
"Az AHCP egy automatikus beállítási protokoll IPv6 és kettős IPv6/IPv4 "
"hálózatokhoz, amelyet az útválasztó-felfedezés vagy DHCP helyett történő "
"használathoz terveztek olyan hálózatokon, ahol nehéz vagy lehetetlen "
"beállítani egy kiszolgálót minden egyes kapcsolati réteg üzenetszórásos "
"tartományán belül, például mobil eseti hálózatoknál."
msgid "Active AHCP Leases"
msgstr "Aktív AHCP bérletek"
@ -34,46 +36,46 @@ msgid "Address"
msgstr "Cím"
msgid "Advanced Settings"
msgstr "Haladó beállítások"
msgstr "Speciális beállítások"
msgid "Age"
msgstr "Kor"
msgstr "Életkor"
msgid "Announced DNS servers"
msgstr "Bejelentett névkiszolgálók"
msgstr "Bejelentett DNS-kiszolgálók"
msgid "Announced NTP servers"
msgstr "Bejelentett NTP kiszolgálók"
msgstr "Bejelentett NTP-kiszolgálók"
msgid "Announced prefixes"
msgstr "Bejelentett előtagok"
msgid "Collecting data..."
msgstr "Adatok összegyűjtése..."
msgstr "Adatok összegyűjtése"
msgid "Forwarder"
msgstr "Továbbító"
msgid "General Setup"
msgstr "Általános beállítások"
msgstr "Általános beállítás"
msgid "IPv4 and IPv6"
msgstr "IPv4 és IPv6"
msgid "IPv4 only"
msgstr "csak IPv4"
msgstr "Csak IPv4"
msgid "IPv6 only"
msgstr "csak IPv6"
msgstr "Csak IPv6"
msgid "Lease directory"
msgstr "Bérlet könytár"
msgstr "Bérlet könyvtár"
msgid "Lease validity time"
msgstr "Bérlet érvényességi ideje"
msgid "Log file"
msgstr "Napló fájl"
msgstr "Naplófájl"
msgid "Multicast address"
msgstr "Multicast cím"
@ -85,32 +87,32 @@ msgid "Port"
msgstr "Port"
msgid "Protocol family"
msgstr "Protokoll család"
msgstr "Protokollcsalád"
msgid "Served interfaces"
msgstr "Kiszolgált interfészek"
msgstr "Kiszolgált csatolók"
msgid "Server"
msgstr "Kiszolgáló"
msgid "Specifies the announced IPv4 and IPv6 NTP servers"
msgstr "A bejelentett IPv4 és IPv6 NTP kiszolgálók részletezése"
msgstr "Meghatározza a bejelentett IPv4 és IPv6 NTP-kiszolgálókat"
msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "A bejelentett IPv4 és IPv6 névkiszolgálók részletezése"
msgstr "Meghatározza a bejelentett IPv4 és IPv6 névkiszolgálókat"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr ""
"A bejelentett IPv4 és IPv6 hálózati előtagok részletezése CIDR jelölésben"
"Meghatározza a bejelentett IPv4 és IPv6 hálózati előtagokat CIDR jelölésben"
msgid "The AHCP Service is not running."
msgstr "Az AHCP szolgáltatás nem fut"
msgstr "Az AHCP szolgáltatás nem fut."
msgid "The AHCP Service is running with ID %s."
msgstr "Az AHCP szolgáltatás fut, azonosítója:%s."
msgstr "Az AHCP szolgáltatás fut ezzel az azonosítóval: %s."
msgid "There are no active leases."
msgstr "Nincsenek aktív bérletek."
msgid "Unique ID file"
msgstr "Egyedi azonosító fájl"
msgstr "Egyedi azonosítófájl"

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-02-03 12:53+0200\n"
"Last-Translator: Francesco <3gasas@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-11-12 02:29+0000\n"
"Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.4-dev\n"
msgid "AHCP Server"
msgstr "Server AHCP"
@ -48,13 +49,13 @@ msgid "Announced prefixes"
msgstr "Prefissi indicati"
msgid "Collecting data..."
msgstr "Raccolta dei dati..."
msgstr "Raccolta dati..."
msgid "Forwarder"
msgstr "Mittente"
msgid "General Setup"
msgstr "Setup Generale"
msgstr "Configurazione generale"
msgid "IPv4 and IPv6"
msgstr "IPv4 e IPv6"
@ -81,7 +82,7 @@ msgid "Operation mode"
msgstr "Modalità di funzionamento"
msgid "Port"
msgstr "Porta"
msgstr "Port"
msgid "Protocol family"
msgstr "Protocollo famiglia"

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-04-19 07:54+0200\n"
"Last-Translator: Kentaro <kentaro.matsuyama@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-11-14 12:48+0000\n"
"Last-Translator: RyotaGamer <21ryotagamer@gmail.com>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/ja/>\n"
"Language: ja\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Pootle 2.0.4\n"
"X-Generator: Weblate 4.4-dev\n"
msgid "AHCP Server"
msgstr "AHCPサーバー"
@ -40,7 +41,7 @@ msgid "Age"
msgstr "Age"
msgid "Announced DNS servers"
msgstr "通知するDNSサーバー"
msgstr "アナウンスされたDNSサーバー"
msgid "Announced NTP servers"
msgstr "通知するNTPサーバー"
@ -49,7 +50,7 @@ msgid "Announced prefixes"
msgstr "通知するプレフィクス"
msgid "Collecting data..."
msgstr "データ収集中です..."
msgstr "データ収集中..."
msgid "Forwarder"
msgstr "転送"
@ -108,7 +109,7 @@ msgid "The AHCP Service is not running."
msgstr "AHCP サービスは稼働していません。"
msgid "The AHCP Service is running with ID %s."
msgstr "AHCP サービスは稼働中です。(ID %s)"
msgstr "AHCP サービスは ID %s で稼働中です。"
msgid "There are no active leases."
msgstr "有効なリースはありません。"

View file

@ -1,11 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"PO-Revision-Date: 2019-12-16 23:24+0000\n"
"Last-Translator: Pusak Hitam <thegame.gamesky@gmail.com>\n"
"Language-Team: Malay <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/ms/>\n"
"Language: ms\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.10-dev\n"
msgid "AHCP Server"
msgstr ""
@ -39,7 +44,7 @@ msgid "Announced prefixes"
msgstr ""
msgid "Collecting data..."
msgstr ""
msgstr "Mengumpul data..."
msgid "Forwarder"
msgstr ""

View file

@ -1,31 +1,31 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-04-14 16:40+0200\n"
"Last-Translator: Tomecki <przykryweczka@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-05-02 15:56+0000\n"
"Last-Translator: Marcin Net <marcin.net@linux.pl>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/pl/>\n"
"Language: pl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.4\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.1-dev\n"
msgid "AHCP Server"
msgstr "Serwer AHCP"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"AHCP to protokół automatycznej konfiguracji sieci IPv6 i IPv6/IPv4 "
"przeznaczone do stosowania zamiast DHCP w sieciach, w których jest trudne "
"lub wręcz niemożliwe, aby skonfigurować serwer w każdej warstwie łącza "
"domeny rozgłoszeniowej, na przykład w mobilnych sieciach ad-hoc."
"AHCP jest protokołem autokonfiguracji dla sieci IPv6 i dual-stack IPv6/IPv4, "
"przeznaczonym do wykorzystania w miejsce wykrywania routera lub DHCP w "
"sieciach, w których konfiguracja serwera w każdej domenie nadawczej warstwy "
"łączącej, np. w sieciach mobilnych ad-hoc, jest trudna lub niemożliwa."
msgid "Active AHCP Leases"
msgstr "Aktywne dzierżawy AHCP"
@ -40,7 +40,7 @@ msgid "Age"
msgstr "Wiek"
msgid "Announced DNS servers"
msgstr "Rozgłaszane serwery DNS"
msgstr "Rozgłaszaj serwery DNS"
msgid "Announced NTP servers"
msgstr "Rozgłaszane serwery NTP"
@ -49,16 +49,16 @@ msgid "Announced prefixes"
msgstr "Rozgłaszane prefiksy"
msgid "Collecting data..."
msgstr "Zbieranie informacji..."
msgstr "Trwa zbieranie danych..."
msgid "Forwarder"
msgstr "Przekierowanie"
msgstr "Przekazywanie"
msgid "General Setup"
msgstr "Ustawienia podstawowe"
msgstr "Ustawienia ogólne"
msgid "IPv4 and IPv6"
msgstr "IPv4 oraz IPv6"
msgstr "IPv4 i IPv6"
msgid "IPv4 only"
msgstr "Tylko IPv4"
@ -70,7 +70,7 @@ msgid "Lease directory"
msgstr "Katalog dzierżaw"
msgid "Lease validity time"
msgstr "Czas dzierżawy"
msgstr "Czas ważności dzierżawy"
msgid "Log file"
msgstr "Plik dziennika"
@ -94,13 +94,13 @@ msgid "Server"
msgstr "Serwer"
msgid "Specifies the announced IPv4 and IPv6 NTP servers"
msgstr "Określa rozgłaszane adresy IPv4/6 serwerów NTP"
msgstr "Określa rozgłaszane adresy IPv4/IPv6 serwerów NTP"
msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "Określa rozgłaszane adresy IPv4/6 serwerów nazw"
msgstr "Określa rozgłaszane adresy IPv4/IPv6 serwerów nazw"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr "Określa rozgłaszane prefiksy sieciowe w notacji CIDR"
msgstr "Określa rozgłaszane prefiksy sieciowe IPv4 i IPv6 w notacji CIDR"
msgid "The AHCP Service is not running."
msgstr "Usługa AHCP nie jest uruchomiona."

View file

@ -1,30 +1,30 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-06-02 21:12+0200\n"
"Last-Translator: joao.f.vieira <joao.f.vieira@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-05-02 10:21+0000\n"
"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/pt/>\n"
"Language: pt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.1-dev\n"
msgid "AHCP Server"
msgstr "Servidor AHCP"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
"networks where it is difficult or impossible to configure a server within "
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"O AHCP é um protocolo de auto-configuração para redes IPv6 e IPv6/IPv4 dual-"
"stack foi desenhado para ser usado no lugar do router discovery e DHCP nas "
"redes onde é difícil ou impossível configurar o servidor dentro de cada "
"camada de ligação no dominio de broadcast, por exemplo, redes ad-hoc móveis."
"O AHCP é um protocolo de auto configuração para IPv6 e redes dual-stack de "
"IPv6/IPv4, projetado para ser utilizado em vez da descoberta de roteador ou "
"DHCP em redes onde é difícil ou impossível configurar um servidor dentro de "
"cada domínio de broadcast no link-layer, por exemplo, redes móveis ad-hoc."
msgid "Active AHCP Leases"
msgstr "Concessões AHCP Ativas"
@ -48,7 +48,7 @@ msgid "Announced prefixes"
msgstr "Prefixos anunciados"
msgid "Collecting data..."
msgstr "A obter dados..."
msgstr "A recolher dados..."
msgid "Forwarder"
msgstr "Encaminhador"
@ -72,7 +72,7 @@ msgid "Lease validity time"
msgstr "Prazo de validade das concessões"
msgid "Log file"
msgstr "Ficheiro log"
msgstr "Ficheiro de log"
msgid "Multicast address"
msgstr "Endereço de multicast"
@ -107,10 +107,10 @@ msgid "The AHCP Service is not running."
msgstr "O serviço AHCP não está a correr."
msgid "The AHCP Service is running with ID %s."
msgstr "O serviço AHCP está a correr com o ID %s"
msgstr "O serviço AHCP está executado com o ID %s."
msgid "There are no active leases."
msgstr "Não existem concessões activas."
msgstr "Não existem concessões ativas."
msgid "Unique ID file"
msgstr "Ficheiro de ID único"

View file

@ -1,16 +1,17 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2014-06-28 19:14+0200\n"
"Last-Translator: xxvirusxx <condor20_05@yahoo.it>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-01-10 12:22+0000\n"
"Last-Translator: Alexandru Stan <alex9457sn@gmail.com>\n"
"Language-Team: Romanian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/ro/>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2);;\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2;\n"
"X-Generator: Weblate 3.10.1\n"
msgid "AHCP Server"
msgstr "Server AHCP"
@ -49,13 +50,13 @@ msgid "Announced prefixes"
msgstr "Prefixe anuntate"
msgid "Collecting data..."
msgstr "Colectare date.."
msgstr "Colectare date..."
msgid "Forwarder"
msgstr "Forwarder"
msgid "General Setup"
msgstr "Configurare generala"
msgstr "Configurare generală"
msgid "IPv4 and IPv6"
msgstr "IPv4 si IPv6"

View file

@ -2,16 +2,17 @@ msgid ""
msgstr ""
"Project-Id-Version: LuCI: ahcp\n"
"POT-Creation-Date: 2013-09-05 15:29+0200\n"
"PO-Revision-Date: 2018-01-24 14:59+0300\n"
"Last-Translator: Vladimir aka sunny <picfun@ya.ru>\n"
"Language-Team: http://cyber-place.ru\n"
"PO-Revision-Date: 2020-06-07 13:45+0000\n"
"Last-Translator: Artem <KovalevArtem.ru@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Poedit 1.8.7.1\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.1-dev\n"
"X-Poedit-SourceCharset: UTF-8\n"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
@ -77,7 +78,7 @@ msgid "Lease validity time"
msgstr "Срок действия аренды"
msgid "Log file"
msgstr "Файл журнала"
msgstr "Файл журнала приложения"
msgid "Multicast address"
msgstr "Адрес мультивещания"
@ -98,13 +99,13 @@ msgid "Server"
msgstr "Сервер"
msgid "Specifies the announced IPv4 and IPv6 NTP servers"
msgstr "Задайте IPv4 и IPv6 NTP сервера."
msgstr "Задайте IPv4 и IPv6 NTP серверы"
msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "Задайте IPv4 и IPv6 DNS сервера."
msgstr "Задайте IPv4 и IPv6 DNS серверы"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr "Задайте IPv4 и IPv6 префиксы сети в нотации CIDR."
msgstr "Задайте IPv4 и IPv6 префиксы сети в нотации CIDR"
msgid "The AHCP Service is not running."
msgstr "Служба AHCP не запущена."

View file

@ -1,12 +1,16 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-04-04 17:34+0000\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/sk/>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.0-dev\n"
msgid "AHCP Server"
msgstr ""
@ -22,10 +26,10 @@ msgid "Active AHCP Leases"
msgstr ""
msgid "Address"
msgstr ""
msgstr "Adresa"
msgid "Advanced Settings"
msgstr ""
msgstr "Pokročilé nastavenia"
msgid "Age"
msgstr ""
@ -40,19 +44,19 @@ msgid "Announced prefixes"
msgstr ""
msgid "Collecting data..."
msgstr ""
msgstr "Zbieram dáta..."
msgid "Forwarder"
msgstr ""
msgid "General Setup"
msgstr ""
msgstr "Všeobecné nastavenie"
msgid "IPv4 and IPv6"
msgstr ""
msgid "IPv4 only"
msgstr ""
msgstr "Iba IPv4"
msgid "IPv6 only"
msgstr ""
@ -73,7 +77,7 @@ msgid "Operation mode"
msgstr ""
msgid "Port"
msgstr ""
msgstr "Port"
msgid "Protocol family"
msgstr ""

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2014-04-27 22:52+0200\n"
"Last-Translator: Umeaboy <hamnisdude@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-08-20 15:36+0000\n"
"Last-Translator: Luna Jernberg <droidbittin@gmail.com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/sv/>\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.2.1-dev\n"
msgid "AHCP Server"
msgstr "AHCP-server"
@ -22,8 +23,8 @@ msgid ""
msgstr ""
"AHCP är ett autokonfigurationsprotokoll för IPv6 och dual-stack IPv6/IPv4- "
"nätverk designade för att användas vid upptäckt av router eller DHCP på "
"nätverk där det är svårt eller omöjligt att ställa in en server inom "
"varje sändningslänkslags-domän, till exempel mobila ad-hocnätverk."
"nätverk där det är svårt eller omöjligt att ställa in en server inom varje "
"sändningslänkslags-domän, till exempel mobila ad-hocnätverk."
msgid "Active AHCP Leases"
msgstr "Aktiva AHCP-hyror"
@ -71,7 +72,7 @@ msgid "Lease validity time"
msgstr "Giltighetstid för hyran"
msgid "Log file"
msgstr "Logg-fil"
msgstr "Loggfil"
msgid "Multicast address"
msgstr "Multicast-adress"
@ -98,7 +99,8 @@ msgid "Specifies the announced IPv4 and IPv6 name servers"
msgstr "Specificerar de aviserade IPv4 och IPv6 namn-servrarna"
msgid "Specifies the announced IPv4 and IPv6 network prefixes in CIDR notation"
msgstr "Specificerar de aviserade IPv4 och IPv6 nätverksprefixen i CIDR-noteringen"
msgstr ""
"Specificerar de aviserade IPv4 och IPv6 nätverksprefixen i CIDR-noteringen"
msgid "The AHCP Service is not running."
msgstr "AHCP-tjänsten körs inte."
@ -107,7 +109,7 @@ msgid "The AHCP Service is running with ID %s."
msgstr "AHCP-tjänsten körs med ID %s."
msgid "There are no active leases."
msgstr "Det finns inga aktiva hyror."
msgstr "Det finns inga aktiva kontrakt."
msgid "Unique ID file"
msgstr "Unik ID-fil"

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-11-25 14:51+0200\n"
"Last-Translator: qbilay <qbilay@mynet.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-09-25 07:41+0000\n"
"Last-Translator: Oğuz Ersen <oguzersen@protonmail.com>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/tr/>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Pootle 2.0.6\n"
"X-Generator: Weblate 4.3-dev\n"
msgid "AHCP Server"
msgstr "AHCP Sunucusu"
@ -47,7 +48,7 @@ msgid "Announced prefixes"
msgstr ""
msgid "Collecting data..."
msgstr "Veriler toplanıyor..."
msgstr "Veri alınıyor..."
msgid "Forwarder"
msgstr ""
@ -80,7 +81,7 @@ msgid "Operation mode"
msgstr "Çalışma Modu"
msgid "Port"
msgstr "Port"
msgstr "Bağlantı noktası"
msgid "Protocol family"
msgstr "Protokol Ailesi"

View file

@ -1,21 +1,21 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2012-04-28 21:17+0200\n"
"Last-Translator: Yurii <yuripet@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-10-27 21:26+0000\n"
"Last-Translator: Yevhen Chebotarev <gekinadres@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/uk/>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%"
"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: Pootle 2.0.6\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "AHCP Server"
msgstr "Сервер AHCP"
#, fuzzy
msgid ""
"AHCP is an autoconfiguration protocol for IPv6 and dual-stack IPv6/IPv4 "
"networks designed to be used in place of router discovery or DHCP on "
@ -23,8 +23,10 @@ msgid ""
"every link-layer broadcast domain, for example mobile ad-hoc networks."
msgstr ""
"AHCP є протоколом автоматичної конфігурації мереж IPv6 та IPv6/IPv4, що "
"разраблений для використання замість DHCP. Наприклад, він використовується у "
"стільникових ad-hoc мережах."
"розроблений для використання замість DHCP та протоколів виявлення "
"маршрутизаторів в мережах, де складно чи неможливо налаштувати сервер в "
"середині кожної широкомовної зони канального рівня, наприклад в мобільних ad-"
"hoc мережах."
msgid "Active AHCP Leases"
msgstr "Активні оренди AHCP"
@ -33,13 +35,13 @@ msgid "Address"
msgstr "Адреса"
msgid "Advanced Settings"
msgstr "Додаткові параметри"
msgstr "Розширені налаштування"
msgid "Age"
msgstr "Вік"
msgid "Announced DNS servers"
msgstr "Оголошені DNS-сервери"
msgstr "Оголошено DNS-сервери"
msgid "Announced NTP servers"
msgstr "Оголошені NTP-сервери"
@ -54,16 +56,16 @@ msgid "Forwarder"
msgstr "Спрямовувач"
msgid "General Setup"
msgstr "Загальні параметри"
msgstr "Загальні налаштування"
msgid "IPv4 and IPv6"
msgstr "IPv4 та IPv6"
msgid "IPv4 only"
msgstr "Тільки IPv4"
msgstr "Лише IPv4"
msgid "IPv6 only"
msgstr "Тільки IPv6"
msgstr "Лише IPv6"
msgid "Lease directory"
msgstr "Каталог оренд"
@ -72,7 +74,7 @@ msgid "Lease validity time"
msgstr "Термін дії оренди"
msgid "Log file"
msgstr "Файл журналу"
msgstr "Файл звіту"
msgid "Multicast address"
msgstr "Групова адреса"
@ -103,7 +105,7 @@ msgstr ""
"Дозволяє вказати оголошувані IPv4 та IPv6 префікси мережі в нотації CIDR"
msgid "The AHCP Service is not running."
msgstr "Сервіс AHCP не запущено"
msgstr "Сервіс AHCP не запущено."
msgid "The AHCP Service is running with ID %s."
msgstr "Сервіс AHCP запущено з ID %s."

View file

@ -1,15 +1,16 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"PO-Revision-Date: 2013-12-05 04:46+0200\n"
"Last-Translator: Thành <tienthanh.dqc@gmail.com>\n"
"Language-Team: none\n"
"PO-Revision-Date: 2020-10-26 20:34+0000\n"
"Last-Translator: 0x2f0713 <namhaiha0308@gmail.com>\n"
"Language-Team: Vietnamese <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsahcp/vi/>\n"
"Language: vi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Pootle 2.0.6\n"
"X-Generator: Weblate 4.3.2-dev\n"
msgid "AHCP Server"
msgstr "AHCP Server"
@ -33,7 +34,7 @@ msgid "Address"
msgstr "Địa chỉ"
msgid "Advanced Settings"
msgstr "Thiết lập nâng cao"
msgstr "Cài đặt nâng cao"
msgid "Age"
msgstr "Thời gian thuê"
@ -48,7 +49,7 @@ msgid "Announced prefixes"
msgstr "Quảng bá tiền tố"
msgid "Collecting data..."
msgstr "Đang kết xuất dữ liệu..."
msgstr "Đang lấy dữ liệu..."
msgid "Forwarder"
msgstr "Chuyển tiếp"

View file

@ -135,7 +135,7 @@ o = s:taboption("task", Value, "max_concurrent_downloads", translate("Max concur
o.placeholder = "5"
o = s:taboption("task", Value, "max_connection_per_server", translate("Max connection per server"), "1-16")
o.datetype = "range(1, 16)"
o.datatype = "range(1, 16)"
o.placeholder = "1"
o = s:taboption("task", Value, "min_split_size", translate("Min split size"), "1M-1024M")

View file

@ -1,17 +1,18 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: LuCI: aria2\n"
"POT-Creation-Date: 2017-11-30 23:45+0300\n"
"PO-Revision-Date: 2018-01-31 18:33+0300\n"
"Language-Team: http://cyber-place.ru\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.8.7.1\n"
"Last-Translator: Vladimir aka sunny <picfun@ya.ru>\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"PO-Revision-Date: 2020-09-29 14:41+0000\n"
"Last-Translator: sergio <sergio+it@outerface.net>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsaria2/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.3-dev\n"
"Project-Info: Это технический перевод, не дословный. Главное-удобный русский "
"интерфейс, все проверялось в графическом режиме, совместим с другими apps\n"
@ -107,7 +108,7 @@ msgid "Log file is in the config file dir."
msgstr "Файл системного журнала находится в папке с config файлом."
msgid "Log level"
msgstr "Записывать в журнал"
msgstr "Уровень журналирования"
msgid "Max concurrent downloads"
msgstr "Максимальное количество одновременных загрузок"
@ -128,7 +129,7 @@ msgid "No Authentication"
msgstr "Без проверки подлинности"
msgid "Notice"
msgstr "Заметка"
msgstr "Сообщение"
msgid "Off"
msgstr "Выключено"
@ -182,7 +183,7 @@ msgid "RPC username"
msgstr "Логин для доступа к удаленному управлению (RPC)"
msgid "Run daemon as user"
msgstr "Запуск демона<br />от имени пользователя"
msgstr "Запуск демона от имени пользователя"
msgid "Sec"
msgstr "Секунды"

View file

@ -1,5 +1,15 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8\n"
msgstr ""
"PO-Revision-Date: 2020-02-13 10:27+0000\n"
"Last-Translator: Kristoffer Grundström <kristoffer.grundstrom1983@gmail."
"com>\n"
"Language-Team: Swedish <https://hosted.weblate.org/projects/openwrt/"
"luciapplicationsaria2/sv/>\n"
"Language: sv\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.11-dev\n"
msgid "\"Falloc\" is not available in all cases."
msgstr ""
@ -8,7 +18,7 @@ msgid "<abbr title=\"Distributed Hash Table\">DHT</abbr> enabled"
msgstr ""
msgid "<abbr title=\"Local Peer Discovery\">LPD</abbr> enabled"
msgstr ""
msgstr "<abbr title=\"Local Peer Discovery\">LPD</abbr> aktiverat"
msgid "Additional Bt tracker enabled"
msgstr ""
@ -43,7 +53,7 @@ msgid "Config file directory"
msgstr "Ställ in fil-mapp"
msgid "Debug"
msgstr "Avlusa"
msgstr "Felsök"
msgid "Default download directory"
msgstr "Standard nerladdningsmapp"
@ -166,7 +176,7 @@ msgid "RPC username"
msgstr "RPC-användarnamn"
msgid "Run daemon as user"
msgstr "Kör daemonen som användare"
msgstr "Kör daemon som användare"
msgid "Sec"
msgstr "Sek"

View file

@ -1,13 +0,0 @@
#
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for Asterisk
include ../../luci.mk
# call BuildPackage - OpenWrt buildroot signature

View file

@ -1,746 +0,0 @@
-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
module("luci.asterisk", package.seeall)
require("luci.asterisk.cc_idd")
local _io = require("io")
local uci = require("luci.model.uci").cursor()
local sys = require("luci.sys")
local util = require("luci.util")
AST_BIN = "/usr/sbin/asterisk"
AST_FLAGS = "-r -x"
--- LuCI Asterisk - Resync uci context
function uci_resync()
uci = luci.model.uci.cursor()
end
--- LuCI Asterisk io interface
-- Handles low level io.
-- @type module
io = luci.util.class()
--- Execute command and return output
-- @param command String containing the command to execute
-- @return String containing the command output
function io.exec(command)
local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
assert(fh, "Failed to invoke asterisk")
local buffer = fh:read("*a")
fh:close()
return buffer
end
--- Execute command and invoke given callback for each readed line
-- @param command String containing the command to execute
-- @param callback Function to call back for each line
-- @return Always true
function io.execl(command, callback)
local ln
local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
assert(fh, "Failed to invoke asterisk")
repeat
ln = fh:read("*l")
callback(ln)
until not ln
fh:close()
return true
end
--- Execute command and return an iterator that returns one line per invokation
-- @param command String containing the command to execute
-- @return Iterator function
function io.execi(command)
local fh = _io.popen( "%s %s %q" %{ AST_BIN, AST_FLAGS, command }, "r" )
assert(fh, "Failed to invoke asterisk")
return function()
local ln = fh:read("*l")
if not ln then fh:close() end
return ln
end
end
--- LuCI Asterisk - core status
core = luci.util.class()
--- Retrive version string.
-- @return String containing the reported asterisk version
function core.version(self)
local version = io.exec("core show version")
return version:gsub(" *\n", "")
end
--- LuCI Asterisk - SIP information.
-- @type module
sip = luci.util.class()
--- Get a list of known SIP peers
-- @return Table containing each SIP peer
function sip.peers(self)
local head = false
local peers = { }
for line in io.execi("sip show peers") do
if not head then
head = true
elseif not line:match(" sip peers ") then
local online, delay, id, uid
local name, host, dyn, nat, acl, port, status =
line:match("(.-) +(.-) +([D ]) ([N ]) (.) (%d+) +(.+)")
if host == '(Unspecified)' then host = nil end
if port == '0' then port = nil else port = tonumber(port) end
dyn = ( dyn == 'D' and true or false )
nat = ( nat == 'N' and true or false )
acl = ( acl ~= ' ' and true or false )
online, delay = status:match("(OK) %((%d+) ms%)")
if online == 'OK' then
online = true
delay = tonumber(delay)
elseif status ~= 'Unmonitored' then
online = false
delay = 0
else
online = nil
delay = 0
end
id, uid = name:match("(.+)/(.+)")
if not ( id and uid ) then
id = name .. "..."
uid = nil
end
peers[#peers+1] = {
online = online,
delay = delay,
name = id,
user = uid,
dynamic = dyn,
nat = nat,
acl = acl,
host = host,
port = port
}
end
end
return peers
end
--- Get informations of given SIP peer
-- @param peer String containing the name of the SIP peer
function sip.peer(peer)
local info = { }
local keys = { }
for line in io.execi("sip show peer " .. peer) do
if #line > 0 then
local key, val = line:match("(.-) *: +(.*)")
if key and val then
key = key:gsub("^ +",""):gsub(" +$", "")
val = val:gsub("^ +",""):gsub(" +$", "")
if key == "* Name" then
key = "Name"
elseif key == "Addr->IP" then
info.address, info.port = val:match("(.+) Port (.+)")
info.port = tonumber(info.port)
elseif key == "Status" then
info.online, info.delay = val:match("(OK) %((%d+) ms%)")
if info.online == 'OK' then
info.online = true
info.delay = tonumber(info.delay)
elseif status ~= 'Unmonitored' then
info.online = false
info.delay = 0
else
info.online = nil
info.delay = 0
end
end
if val == 'Yes' or val == 'yes' or val == '<Set>' then
val = true
elseif val == 'No' or val == 'no' then
val = false
elseif val == '<Not set>' or val == '(none)' then
val = nil
end
keys[#keys+1] = key
info[key] = val
end
end
end
return info, keys
end
--- LuCI Asterisk - Internal helpers
-- @type module
tools = luci.util.class()
--- Convert given value to a list of tokens. Split by white space.
-- @param val String or table value
-- @return Table containing tokens
function tools.parse_list(v)
local tokens = { }
v = type(v) == "table" and v or { v }
for _, v in ipairs(v) do
if type(v) == "string" then
for v in v:gmatch("(%S+)") do
tokens[#tokens+1] = v
end
end
end
return tokens
end
--- Convert given list to a collection of hyperlinks
-- @param list Table of tokens
-- @param url String pattern or callback function to construct urls (optional)
-- @param sep String containing the seperator (optional, default is ", ")
-- @return String containing the html fragment
function tools.hyperlinks(list, url, sep)
local html
local function mkurl(p, t)
if type(p) == "string" then
return p:format(t)
elseif type(p) == "function" then
return p(t)
else
return '#'
end
end
list = list or { }
url = url or "%s"
sep = sep or ", "
for _, token in ipairs(list) do
html = ( html and html .. sep or '' ) ..
'<a href="%s">%s</a>' %{ mkurl(url, token), token }
end
return html or ''
end
--- LuCI Asterisk - International Direct Dialing Prefixes
-- @type module
idd = luci.util.class()
--- Lookup the country name for the given IDD code.
-- @param country String containing IDD code
-- @return String containing the country name
function idd.country(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if type(v[3]) == "table" then
for _, v2 in ipairs(v[3]) do
if v2 == tostring(c) then
return v[1]
end
end
elseif v[3] == tostring(c) then
return v[1]
end
end
end
--- Lookup the country code for the given IDD code.
-- @param country String containing IDD code
-- @return Table containing the country code(s)
function idd.cc(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if type(v[3]) == "table" then
for _, v2 in ipairs(v[3]) do
if v2 == tostring(c) then
return type(v[2]) == "table"
and v[2] or { v[2] }
end
end
elseif v[3] == tostring(c) then
return type(v[2]) == "table"
and v[2] or { v[2] }
end
end
end
--- Lookup the IDD code(s) for the given country.
-- @param idd String containing the country name
-- @return Table containing the IDD code(s)
function idd.idd(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if v[1]:lower():match(c:lower()) then
return type(v[3]) == "table"
and v[3] or { v[3] }
end
end
end
--- Populate given CBI field with IDD codes.
-- @param field CBI option object
-- @return (nothing)
function idd.cbifill(o)
for i, v in ipairs(cc_idd.CC_IDD) do
o:value("_%i" % i, util.pcdata(v[1]))
end
o.formvalue = function(...)
local val = luci.cbi.Value.formvalue(...)
if val:sub(1,1) == "_" then
val = tonumber((val:gsub("^_", "")))
if val then
return type(cc_idd.CC_IDD[val][3]) == "table"
and cc_idd.CC_IDD[val][3] or { cc_idd.CC_IDD[val][3] }
end
end
return val
end
o.cfgvalue = function(...)
local val = luci.cbi.Value.cfgvalue(...)
if val then
val = tools.parse_list(val)
for i, v in ipairs(cc_idd.CC_IDD) do
if type(v[3]) == "table" then
if v[3][1] == val[1] then
return "_%i" % i
end
else
if v[3] == val[1] then
return "_%i" % i
end
end
end
end
return val
end
end
--- LuCI Asterisk - Country Code Prefixes
-- @type module
cc = luci.util.class()
--- Lookup the country name for the given CC code.
-- @param country String containing CC code
-- @return String containing the country name
function cc.country(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if type(v[2]) == "table" then
for _, v2 in ipairs(v[2]) do
if v2 == tostring(c) then
return v[1]
end
end
elseif v[2] == tostring(c) then
return v[1]
end
end
end
--- Lookup the international dialing code for the given CC code.
-- @param cc String containing CC code
-- @return String containing IDD code
function cc.idd(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if type(v[2]) == "table" then
for _, v2 in ipairs(v[2]) do
if v2 == tostring(c) then
return type(v[3]) == "table"
and v[3] or { v[3] }
end
end
elseif v[2] == tostring(c) then
return type(v[3]) == "table"
and v[3] or { v[3] }
end
end
end
--- Lookup the CC code(s) for the given country.
-- @param country String containing the country name
-- @return Table containing the CC code(s)
function cc.cc(c)
for _, v in ipairs(cc_idd.CC_IDD) do
if v[1]:lower():match(c:lower()) then
return type(v[2]) == "table"
and v[2] or { v[2] }
end
end
end
--- Populate given CBI field with CC codes.
-- @param field CBI option object
-- @return (nothing)
function cc.cbifill(o)
for i, v in ipairs(cc_idd.CC_IDD) do
o:value("_%i" % i, util.pcdata(v[1]))
end
o.formvalue = function(...)
local val = luci.cbi.Value.formvalue(...)
if val:sub(1,1) == "_" then
val = tonumber((val:gsub("^_", "")))
if val then
return type(cc_idd.CC_IDD[val][2]) == "table"
and cc_idd.CC_IDD[val][2] or { cc_idd.CC_IDD[val][2] }
end
end
return val
end
o.cfgvalue = function(...)
local val = luci.cbi.Value.cfgvalue(...)
if val then
val = tools.parse_list(val)
for i, v in ipairs(cc_idd.CC_IDD) do
if type(v[2]) == "table" then
if v[2][1] == val[1] then
return "_%i" % i
end
else
if v[2] == val[1] then
return "_%i" % i
end
end
end
end
return val
end
end
--- LuCI Asterisk - Dialzone
-- @type module
dialzone = luci.util.class()
--- Parse a dialzone section
-- @param zone Table containing the zone info
-- @return Table with parsed information
function dialzone.parse(z)
if z['.name'] then
return {
trunks = tools.parse_list(z.uses),
name = z['.name'],
description = z.description or z['.name'],
addprefix = z.addprefix,
matches = tools.parse_list(z.match),
intlmatches = tools.parse_list(z.international),
countrycode = z.countrycode,
localzone = z.localzone,
localprefix = z.localprefix
}
end
end
--- Get a list of known dial zones
-- @return Associative table of zones and table of zone names
function dialzone.zones()
local zones = { }
local znames = { }
uci:foreach("asterisk", "dialzone",
function(z)
zones[z['.name']] = dialzone.parse(z)
znames[#znames+1] = z['.name']
end)
return zones, znames
end
--- Get a specific dial zone
-- @param name Name of the dial zone
-- @return Table containing zone information
function dialzone.zone(n)
local zone
uci:foreach("asterisk", "dialzone",
function(z)
if z['.name'] == n then
zone = dialzone.parse(z)
end
end)
return zone
end
--- Find uci section hash for given zone number
-- @param idx Zone number
-- @return String containing the uci hash pointing to the section
function dialzone.ucisection(i)
local hash
local index = 1
i = tonumber(i)
uci:foreach("asterisk", "dialzone",
function(z)
if not hash and index == i then
hash = z['.name']
end
index = index + 1
end)
return hash
end
--- LuCI Asterisk - Voicemailbox
-- @type module
voicemail = luci.util.class()
--- Parse a voicemail section
-- @param zone Table containing the mailbox info
-- @return Table with parsed information
function voicemail.parse(z)
if z.number and #z.number > 0 then
local v = {
id = '%s@%s' %{ z.number, z.context or 'default' },
number = z.number,
context = z.context or 'default',
name = z.name or z['.name'] or 'OpenWrt',
zone = z.zone or 'homeloc',
password = z.password or '0000',
email = z.email or '',
page = z.page or '',
dialplans = { }
}
uci:foreach("asterisk", "dialplanvoice",
function(s)
if s.dialplan and #s.dialplan > 0 and
s.voicebox == v.number
then
v.dialplans[#v.dialplans+1] = s.dialplan
end
end)
return v
end
end
--- Get a list of known voicemail boxes
-- @return Associative table of boxes and table of box numbers
function voicemail.boxes()
local vboxes = { }
local vnames = { }
uci:foreach("asterisk", "voicemail",
function(z)
local v = voicemail.parse(z)
if v then
local n = '%s@%s' %{ v.number, v.context }
vboxes[n] = v
vnames[#vnames+1] = n
end
end)
return vboxes, vnames
end
--- Get a specific voicemailbox
-- @param number Number of the voicemailbox
-- @return Table containing mailbox information
function voicemail.box(n)
local box
n = n:gsub("@.+$","")
uci:foreach("asterisk", "voicemail",
function(z)
if z.number == tostring(n) then
box = voicemail.parse(z)
end
end)
return box
end
--- Find all voicemailboxes within the given dialplan
-- @param plan Dialplan name or table
-- @return Associative table containing extensions mapped to mailbox info
function voicemail.in_dialplan(p)
local plan = type(p) == "string" and p or p.name
local boxes = { }
uci:foreach("asterisk", "dialplanvoice",
function(s)
if s.extension and #s.extension > 0 and s.dialplan == plan then
local box = voicemail.box(s.voicebox)
if box then
boxes[s.extension] = box
end
end
end)
return boxes
end
--- Remove voicemailbox and associated extensions from config
-- @param box Voicemailbox number or table
-- @param ctx UCI context to use (optional)
-- @return Boolean indicating success
function voicemail.remove(v, ctx)
ctx = ctx or uci
local box = type(v) == "string" and v or v.number
local ok1 = ctx:delete_all("asterisk", "voicemail", {number=box})
local ok2 = ctx:delete_all("asterisk", "dialplanvoice", {voicebox=box})
return ( ok1 or ok2 ) and true or false
end
--- LuCI Asterisk - MeetMe Conferences
-- @type module
meetme = luci.util.class()
--- Parse a meetme section
-- @param room Table containing the room info
-- @return Table with parsed information
function meetme.parse(r)
if r.room and #r.room > 0 then
local v = {
room = r.room,
pin = r.pin or '',
adminpin = r.adminpin or '',
description = r._description or '',
dialplans = { }
}
uci:foreach("asterisk", "dialplanmeetme",
function(s)
if s.dialplan and #s.dialplan > 0 and s.room == v.room then
v.dialplans[#v.dialplans+1] = s.dialplan
end
end)
return v
end
end
--- Get a list of known meetme rooms
-- @return Associative table of rooms and table of room numbers
function meetme.rooms()
local mrooms = { }
local mnames = { }
uci:foreach("asterisk", "meetme",
function(r)
local v = meetme.parse(r)
if v then
mrooms[v.room] = v
mnames[#mnames+1] = v.room
end
end)
return mrooms, mnames
end
--- Get a specific meetme room
-- @param number Number of the room
-- @return Table containing room information
function meetme.room(n)
local room
uci:foreach("asterisk", "meetme",
function(r)
if r.room == tostring(n) then
room = meetme.parse(r)
end
end)
return room
end
--- Find all meetme rooms within the given dialplan
-- @param plan Dialplan name or table
-- @return Associative table containing extensions mapped to room info
function meetme.in_dialplan(p)
local plan = type(p) == "string" and p or p.name
local rooms = { }
uci:foreach("asterisk", "dialplanmeetme",
function(s)
if s.extension and #s.extension > 0 and s.dialplan == plan then
local room = meetme.room(s.room)
if room then
rooms[s.extension] = room
end
end
end)
return rooms
end
--- Remove meetme room and associated extensions from config
-- @param room Voicemailbox number or table
-- @param ctx UCI context to use (optional)
-- @return Boolean indicating success
function meetme.remove(v, ctx)
ctx = ctx or uci
local room = type(v) == "string" and v or v.number
local ok1 = ctx:delete_all("asterisk", "meetme", {room=room})
local ok2 = ctx:delete_all("asterisk", "dialplanmeetme", {room=room})
return ( ok1 or ok2 ) and true or false
end
--- LuCI Asterisk - Dialplan
-- @type module
dialplan = luci.util.class()
--- Parse a dialplan section
-- @param plan Table containing the plan info
-- @return Table with parsed information
function dialplan.parse(z)
if z['.name'] then
local plan = {
zones = { },
name = z['.name'],
description = z.description or z['.name']
}
-- dialzones
for _, name in ipairs(tools.parse_list(z.include)) do
local zone = dialzone.zone(name)
if zone then
plan.zones[#plan.zones+1] = zone
end
end
-- voicemailboxes
plan.voicemailboxes = voicemail.in_dialplan(plan)
-- meetme conferences
plan.meetmerooms = meetme.in_dialplan(plan)
return plan
end
end
--- Get a list of known dial plans
-- @return Associative table of plans and table of plan names
function dialplan.plans()
local plans = { }
local pnames = { }
uci:foreach("asterisk", "dialplan",
function(p)
plans[p['.name']] = dialplan.parse(p)
pnames[#pnames+1] = p['.name']
end)
return plans, pnames
end
--- Get a specific dial plan
-- @param name Name of the dial plan
-- @return Table containing plan information
function dialplan.plan(n)
local plan
uci:foreach("asterisk", "dialplan",
function(p)
if p['.name'] == n then
plan = dialplan.parse(p)
end
end)
return plan
end

View file

@ -1,245 +0,0 @@
-- Licensed to the public under the Apache License 2.0.
module "luci.asterisk.cc_idd"
CC_IDD = {
-- Country, CC, IDD
{ "Afghanistan", "93", "00" },
{ "Albania", "355", "00" },
{ "Algeria", "213", "00" },
{ "American Samoa", "684", "00" },
{ "Andorra", "376", "00" },
{ "Angola", "244", "00" },
{ "Anguilla", "264", "011" },
{ "Antarctica", "672", "" },
{ "Antigua", "268", "011" },
{ "Argentina", "54", "00" },
{ "Armenia", "374", "00" },
{ "Aruba", "297", "00" },
{ "Ascension Island", "247", "00" },
{ "Australia", "61", "0011" },
{ "Austria", "43", "00" },
{ "Azberbaijan", "994", "00" },
{ "Bahamas", "242", "011" },
{ "Bahrain", "973", "00" },
{ "Bangladesh", "880", "00" },
{ "Barbados", "246", "011" },
{ "Barbuda", "268", "011" },
{ "Belarus", "375", "810" },
{ "Belgium", "32", "00" },
{ "Belize", "501", "00" },
{ "Benin", "229", "00" },
{ "Bermuda", "441", "011" },
{ "Bhutan", "975", "00" },
{ "Bolivia", "591", "00" },
{ "Bosnia", "387", "00" },
{ "Botswana", "267", "00" },
{ "Brazil", "55", "00" },
{ "British Virgin Islands", "284", "011" },
{ "Brunei", "673", "00" },
{ "Bulgaria", "359", "00" },
{ "Burkina Faso", "226", "00" },
{ "Burma (Myanmar)", "95", "00" },
{ "Burundi", "257", "00" },
{ "Cambodia", "855", "001" },
{ "Cameroon", "237", "00" },
{ "Canada", "1", "011" },
{ "Cape Verde Islands", "238", "0" },
{ "Cayman Islands", "345", "011" },
{ "Central African Rep.", "236", "00" },
{ "Chad", "235", "15" },
{ "Chile", "56", "00" },
{ "China", "86", "00" },
{ "Christmas Island", "61", "0011" },
{ "Cocos Islands", "61", "0011" },
{ "Colombia", "57", "00" },
{ "Comoros", "269", "00" },
{ "Congo", "242", "00" },
{ "Congo, Dem. Rep. of", "243", "00" },
{ "Cook Islands", "682", "00" },
{ "Costa Rica", "506", "00" },
{ "Croatia", "385", "00" },
{ "Cuba", "53", "119" },
{ "Cyprus", "357", "00" },
{ "Czech Republic", "420", "00" },
{ "Denmark", "45", "00" },
{ "Diego Garcia", "246", "00" },
{ "Djibouti", "253", "00" },
{ "Dominica", "767", "011" },
{ "Dominican Rep.", "809", "011" },
{ "Ecuador", "593", "00" },
{ "Egypt", "20", "00" },
{ "El Salvador", "503", "00" },
{ "Equatorial Guinea", "240", "00" },
{ "Eritrea", "291", "00" },
{ "Estonia", "372", "00" },
{ "Ethiopia", "251", "00" },
{ "Faeroe Islands", "298", "00" },
{ "Falkland Islands", "500", "00" },
{ "Fiji Islands", "679", "00" },
{ "Finland", "358", "00" },
{ "France", "33", "00" },
{ "French Antilles", "596", "00" },
{ "French Guiana", "594", "00" },
{ "French Polynesia", "689", "00" },
{ "Gabon", "241", "00" },
{ "Gambia", "220", "00" },
{ "Georgia", "995", "810" },
{ "Germany", "49", "00" },
{ "Ghana", "233", "00" },
{ "Gibraltar", "350", "00" },
{ "Greece", "30", "00" },
{ "Greenland", "299", "00" },
{ "Grenada", "473", "011" },
{ "Guadeloupe", "590", "00" },
{ "Guam", "671", "011" },
{ "Guantanamo Bay", "5399", "00" },
{ "Guatemala", "502", "00" },
{ "Guinea", "224", "00" },
{ "Guinea Bissau", "245", "00" },
{ "Guyana", "592", "001" },
{ "Haiti", "509", "00" },
{ "Honduras", "504", "00" },
{ "Hong Kong", "852", "001" },
{ "Hungary", "36", "00" },
{ "Iceland", "354", "00" },
{ "India", "91", "00" },
{ "Indonesia", "62", { "001", "008" } },
{ "Iran", "98", "00" },
{ "Iraq", "964", "00" },
{ "Ireland", "353", "00" },
{ "Israel", "972", "00" },
{ "Italy", "39", "00" },
{ "Ivory Coast", "225", "00" },
{ "Jamaica", "876", "011" },
{ "Japan", "81", "001" },
{ "Jordan", "962", "00" },
{ "Kazakhstan", "7", "810" },
{ "Kenya", "254", "000" },
{ "Kiribati", "686", "00" },
{ "Korea, North", "850", "00" },
{ "Korea, South", "82", "001" },
{ "Kuwait", "965", "00" },
{ "Kyrgyzstan", "996", "00" },
{ "Laos", "856", "00" },
{ "Latvia", "371", "00" },
{ "Lebanon", "961", "00" },
{ "Lesotho", "266", "00" },
{ "Liberia", "231", "00" },
{ "Libya", "218", "00" },
{ "Liechtenstein", "423", "00" },
{ "Lithuania", "370", "00" },
{ "Luxembourg", "352", "00" },
{ "Macau", "853", "00" },
{ "Macedonia", "389", "00" },
{ "Madagascar", "261", "00" },
{ "Malawi", "265", "00" },
{ "Malaysia", "60", "00" },
{ "Maldives", "960", "00" },
{ "Mali", "223", "00" },
{ "Malta", "356", "00" },
{ "Mariana Islands", "670", "011" },
{ "Marshall Islands", "692", "011" },
{ "Martinique", "596", "00" },
{ "Mauritania", "222", "00" },
{ "Mauritius", "230", "00" },
{ "Mayotte Islands", "269", "00" },
{ "Mexico", "52", "00" },
{ "Micronesia", "691", "011" },
{ "Midway Island", "808", "011" },
{ "Moldova", "373", "00" },
{ "Monaco", "377", "00" },
{ "Mongolia", "976", "001" },
{ "Montserrat", "664", "011" },
{ "Morocco", "212", "00" },
{ "Mozambique", "258", "00" },
{ "Myanmar (Burma)", "95", "00" },
{ "Namibia", "264", "00" },
{ "Nauru", "674", "00" },
{ "Nepal", "977", "00" },
{ "Netherlands", "31", "00" },
{ "Netherlands Antilles", "599", "00" },
{ "Nevis", "869", "011" },
{ "New Caledonia", "687", "00" },
{ "New Zealand", "64", "00" },
{ "Nicaragua", "505", "00" },
{ "Niger", "227", "00" },
{ "Nigeria", "234", "009" },
{ "Niue", "683", "00" },
{ "Norfolk Island", "672", "00" },
{ "Norway", "47", "00" },
{ "Oman", "968", "00" },
{ "Pakistan", "92", "00" },
{ "Palau", "680", "011" },
{ "Palestine", "970", "00" },
{ "Panama", "507", "00" },
{ "Papua New Guinea", "675", "05" },
{ "Paraguay", "595", "002" },
{ "Peru", "51", "00" },
{ "Philippines", "63", "00" },
{ "Poland", "48", "00" },
{ "Portugal", "351", "00" },
{ "Puerto Rico", { "787", "939" }, "011" },
{ "Qatar", "974", "00" },
{ "Reunion Island", "262", "00" },
{ "Romania", "40", "00" },
{ "Russia", "7", "810" },
{ "Rwanda", "250", "00" },
{ "St. Helena", "290", "00" },
{ "St. Kitts", "869", "011" },
{ "St. Lucia", "758", "011" },
{ "St. Perre & Miquelon", "508", "00" },
{ "St. Vincent", "784", "011" },
{ "San Marino", "378", "00" },
{ "Sao Tome & Principe", "239", "00" },
{ "Saudi Arabia", "966", "00" },
{ "Senegal", "221", "00" },
{ "Serbia", "381", "99" },
{ "Seychelles", "248", "00" },
{ "Sierra Leone", "232", "00" },
{ "Singapore", "65", "001" },
{ "Slovakia", "421", "00" },
{ "Slovenia", "386", "00" },
{ "Solomon Islands", "677", "00" },
{ "Somalia", "252", "00" },
{ "South Africa", "27", "09" },
{ "Spain", "34", "00" },
{ "Sri Lanka", "94", "00" },
{ "Sudan", "249", "00" },
{ "Suriname", "597", "00" },
{ "Swaziland", "268", "00" },
{ "Sweden", "46", "00" },
{ "Switzerland", "41", "00" },
{ "Syria", "963", "00" },
{ "Taiwan", "886", "002" },
{ "Tajikistan", "992", "810" },
{ "Tanzania", "255", "00" },
{ "Thailand", "66", "001" },
{ "Togo", "228", "00" },
{ "Tonga", "676", "00" },
{ "Trinidad & Tobago", "868", "011" },
{ "Tunisia", "216", "00" },
{ "Turkey", "90", "00" },
{ "Turkmenistan", "993", "810" },
{ "Turks & Caicos", "649", "011" },
{ "Tuvalu", "688", "00" },
{ "Uganda", "256", "000" },
{ "Ukraine", "380", "810" },
{ "United Arab Emirates", "971", "00" },
{ "United Kingdom", "44", "00" },
{ "Uruguay", "598", "00" },
{ "USA", "1", "011" },
{ "US Virgin Islands", "340", "011" },
{ "Uzbekistan", "998", "810" },
{ "Vanuatu", "678", "00" },
{ "Vatican City", "39", "00" },
{ "Venezuela", "58", "00" },
{ "Vietnam", "84", "00" },
{ "Wake Island", "808", "00" },
{ "Wallis & Futuna", "681", "19" },
{ "Western Samoa", "685", "00" },
{ "Yemen", "967", "00" },
{ "Yugoslavia", "381", "99" },
{ "Zambia", "260", "00" },
{ "Zimbabwe", "263", "00" }
}

View file

@ -1,194 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
module("luci.controller.asterisk", package.seeall)
function index()
entry({"admin", "services", "asterisk"}, cbi("asterisk"), "Asterisk", 80)
entry({"admin", "services", "asterisk", "voice"}, cbi("asterisk-voice"), "Voice Functions", 1)
entry({"admin", "services", "asterisk", "meetme"}, cbi("asterisk-meetme"), "Meetme Conferences", 2)
entry({"admin", "services", "asterisk", "iax-conns"}, cbi("asterisk-iax-connections"), "IAX Connections", 3)
entry({"admin", "services", "asterisk", "sip-conns"}, cbi("asterisk-sip-connections"), "SIP Connections", 4)
entry({"admin", "services", "asterisk", "dialplans"}, cbi("asterisk-dialplans"), "Dial Plans", 5)
entry({"admin", "services", "asterisk", "mod"}, cbi("asterisk-mod-app"), "Modules", 4)
entry({"admin", "services", "asterisk", "mod", "app"}, cbi("asterisk-mod-app"), "Applications", 1)
entry({"admin", "services", "asterisk", "mod", "cdr"}, cbi("asterisk-mod-cdr"), "Call Detail Records", 2)
entry({"admin", "services", "asterisk", "mod", "chan"}, cbi("asterisk-mod-chan"), "Channels", 3)
entry({"admin", "services", "asterisk", "mod", "codec"}, cbi("asterisk-mod-codec"), "Codecs", 4)
entry({"admin", "services", "asterisk", "mod", "format"}, cbi("asterisk-mod-format"), "Format", 5)
entry({"admin", "services", "asterisk", "mod", "func"}, cbi("asterisk-mod-func"), "Functions", 6)
entry({"admin", "services", "asterisk", "mod", "pbx"}, cbi("asterisk-mod-pbx"), "PBX", 7)
entry({"admin", "services", "asterisk", "mod", "res"}, cbi("asterisk-mod-res"), "Resources", 8)
entry({"admin", "services", "asterisk", "mod", "res", "feature"},
cbi("asterisk-mod-res-feature"), "Feature Module Configuration", 9 )
entry({"admin", "asterisk"}, cbi("asterisk/main"), "Asterisk", 99).i18n = "asterisk"
entry({"admin", "asterisk", "phones"}, cbi("asterisk/phones"), "Phones", 1)
entry({"admin", "asterisk", "phones", "sip"}, cbi("asterisk/phone_sip"), nil, 1).leaf = true
--entry({"admin", "asterisk", "phones", "exten"}, cbi("asterisk/phone_exten"), "Extensions", 2).leaf = true
entry({"admin", "asterisk", "trunks"}, cbi("asterisk/trunks"), "Trunks", 2)
entry({"admin", "asterisk", "trunks", "sip"}, cbi("asterisk/trunk_sip"), nil, 1).leaf = true
entry({"admin", "asterisk", "voicemail"}, cbi("asterisk/voicemail"), "Voicemail", 3)
entry({"admin", "asterisk", "voicemail", "mailboxes"}, cbi("asterisk/voicemail"), "Mailboxes", 1)
entry({"admin", "asterisk", "voicemail", "settings"}, cbi("asterisk/voicemail_settings"), "Settings", 2)
entry({"admin", "asterisk", "meetme"}, cbi("asterisk/meetme"), "MeetMe", 4)
entry({"admin", "asterisk", "meetme", "rooms"}, cbi("asterisk/meetme"), "Rooms", 1)
entry({"admin", "asterisk", "meetme", "settings"}, cbi("asterisk/meetme_settings"), "Settings", 2)
entry({"admin", "asterisk", "dialplans"}, call("handle_dialplan"), "Call Routing", 5)
entry({"admin", "asterisk", "dialplans", "out"}, cbi("asterisk/dialplan_out"), nil, 1).leaf = true
entry({"admin", "asterisk", "dialplans", "zones"}, call("handle_dialzones"), "Dial Zones", 2).leaf = true
end
function handle_dialplan()
local uci = luci.model.uci.cursor()
local ast = require "luci.asterisk"
local err = false
for k, v in pairs(luci.http.formvaluetable("delzone")) do
local plan = ast.dialplan.plan(k)
if #v > 0 and plan then
local newinc = { }
for _, z in ipairs(plan.zones) do
if z.name ~= v then
newinc[#newinc+1] = z.name
end
end
uci:delete("asterisk", plan.name, "include")
if #newinc > 0 then
uci:set("asterisk", plan.name, "include", newinc)
end
end
end
for k, v in pairs(luci.http.formvaluetable("addzone")) do
local plan = ast.dialplan.plan(k)
local zone = ast.dialzone.zone(v)
if #v > 0 and plan and zone then
local newinc = { zone.name }
for _, z in ipairs(plan.zones) do
newinc[#newinc+1] = z.name
end
uci:delete("asterisk", plan.name, "include")
if #newinc > 0 then
uci:set("asterisk", plan.name, "include", newinc)
end
end
end
for k, v in pairs(luci.http.formvaluetable("delvbox")) do
local plan = ast.dialplan.plan(k)
if #v > 0 and plan then
uci:delete_all("asterisk", "dialplanvoice",
{ extension=v, dialplan=plan.name })
end
end
for k, v in pairs(luci.http.formvaluetable("addvbox")) do
local plan = ast.dialplan.plan(k)
local vbox = ast.voicemail.box(v)
if plan and vbox then
local vext = luci.http.formvalue("addvboxext.%s" % plan.name)
vext = ( vext and #vext > 0 ) and vext or vbox.number
uci:section("asterisk", "dialplanvoice", nil, {
dialplan = plan.name,
extension = vext,
voicebox = vbox.number,
voicecontext = vbox.context
})
end
end
for k, v in pairs(luci.http.formvaluetable("delmeetme")) do
local plan = ast.dialplan.plan(k)
if #v > 0 and plan then
uci:delete_all("asterisk", "dialplanmeetme",
{ extension=v, dialplan=plan.name })
end
end
for k, v in pairs(luci.http.formvaluetable("addmeetme")) do
local plan = ast.dialplan.plan(k)
local meetme = ast.meetme.room(v)
if plan and meetme then
local mext = luci.http.formvalue("addmeetmeext.%s" % plan.name)
mext = ( mext and #mext > 0 ) and mext or meetme.room
uci:section("asterisk", "dialplanmeetme", nil, {
dialplan = plan.name,
extension = mext,
room = meetme.room
})
end
end
local aname = luci.http.formvalue("addplan")
if aname and #aname > 0 then
if aname:match("^[a-zA-Z0-9_]+$") then
uci:section("asterisk", "dialplan", aname, { })
else
err = true
end
end
local dname = luci.http.formvalue("delplan")
if dname and #dname > 0 then
if uci:get("asterisk", dname) == "dialplan" then
uci:delete("asterisk", dname)
uci:delete_all("asterisk", "dialplanvoice", { dialplan=dname })
uci:delete_all("asterisk", "dialplanmeetme", { dialplan=dname })
end
end
uci:save("asterisk")
ast.uci_resync()
luci.template.render("asterisk/dialplans", { create_error = err })
end
function handle_dialzones()
local ast = require "luci.asterisk"
local uci = luci.model.uci.cursor()
local err = false
if luci.http.formvalue("newzone") then
local name = luci.http.formvalue("newzone_name")
if name and name:match("^[a-zA-Z0-9_]+$") then
uci:section("asterisk", "dialzone", name, {
uses = ast.tools.parse_list(luci.http.formvalue("newzone_uses") or {}),
match = ast.tools.parse_list(luci.http.formvalue("newzone_match") or {})
})
uci:save("asterisk")
else
err = true
end
end
if luci.http.formvalue("delzone") then
local name = luci.http.formvalue("delzone")
if uci:get("asterisk", name) == "dialzone" then
uci:delete("asterisk", name)
uci:save("asterisk")
end
end
luci.template.render("asterisk/dialzones", { create_error = err })
end

View file

@ -1,91 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
dialplan = cbimap:section(TypedSection, "dialplan", "Section dialplan", "")
dialplan.addremove = true
dialplan.dynamic = true
include = dialplan:option(MultiValue, "include", "Include zones and plans", "")
cbimap.uci:foreach( "asterisk", "dialplan", function(s) include:value(s['.name']) end )
cbimap.uci:foreach( "asterisk", "dialzone", function(s) include:value(s['.name']) end )
dialplanexten = cbimap:section(TypedSection, "dialplanexten", "Dialplan Extension", "")
dialplanexten.anonymous = true
dialplanexten.addremove = true
dialplanexten.dynamic = true
dialplangeneral = cbimap:section(TypedSection, "dialplangeneral", "Dialplan General Options", "")
dialplangeneral.anonymous = true
dialplangeneral.addremove = true
allowtransfer = dialplangeneral:option(Flag, "allowtransfer", "Allow transfer", "")
allowtransfer.rmempty = true
canreinvite = dialplangeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
canreinvite:value("yes", "Yes")
canreinvite:value("nonat", "Yes when not behind NAT")
canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
canreinvite:value("no", "No")
canreinvite.rmempty = true
clearglobalvars = dialplangeneral:option(Flag, "clearglobalvars", "Clear global vars", "")
clearglobalvars.rmempty = true
dialplangoto = cbimap:section(TypedSection, "dialplangoto", "Dialplan Goto", "")
dialplangoto.anonymous = true
dialplangoto.addremove = true
dialplangoto.dynamic = true
dialplanmeetme = cbimap:section(TypedSection, "dialplanmeetme", "Dialplan Conference", "")
dialplanmeetme.anonymous = true
dialplanmeetme.addremove = true
dialplanmeetme.dynamic = true
dialplansaytime = cbimap:section(TypedSection, "dialplansaytime", "Dialplan Time", "")
dialplansaytime.anonymous = true
dialplansaytime.addremove = true
dialplansaytime.dynamic = true
dialplanvoice = cbimap:section(TypedSection, "dialplanvoice", "Dialplan Voicemail", "")
dialplanvoice.anonymous = true
dialplanvoice.addremove = true
dialplanvoice.dynamic = true
dialzone = cbimap:section(TypedSection, "dialzone", "Dial Zones for Dialplan", "")
dialzone.addremove = true
dialzone.template = "cbi/tblsection"
addprefix = dialzone:option(Value, "addprefix", "Prefix to add matching dialplans", "")
addprefix.rmempty = true
--international = dialzone:option(DynamicList, "international", "Match International prefix", "")
international = dialzone:option(Value, "international", "Match International prefix", "")
international.rmempty = true
localprefix = dialzone:option(Value, "localprefix", "Prefix (0) to add/remove to/from intl. numbers", "")
localprefix.rmempty = true
localzone = dialzone:option(Value, "localzone", "Dialzone for intl. numbers matched as local", "")
localzone.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
cbimap.uci:foreach( "asterisk", "dialplan", function(s) localzone:value(s['.name']) end )
cbimap.uci:foreach( "asterisk", "dialzone", function(s) localzone:value(s['.name']) end )
match = dialzone:option(Value, "match", "Match plan", "")
match.rmempty = true
uses = dialzone:option(ListValue, "uses", "Connection to use", "")
uses.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "sip-conns" )
cbimap.uci:foreach( "asterisk", "sip", function(s) uses:value('SIP/'..s['.name']) end )
cbimap.uci:foreach( "asterisk", "iax", function(s) uses:value('IAX/'..s['.name']) end )
return cbimap

View file

@ -1,49 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
iax = cbimap:section(TypedSection, "iax", "IAX Connection", "")
iax.addremove = true
alwaysinternational = iax:option(Flag, "alwaysinternational", "Always Dial International", "")
alwaysinternational.optional = true
context = iax:option(ListValue, "context", "Context to use", "")
context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end )
cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end )
countrycode = iax:option(Value, "countrycode", "Country Code for connection", "")
countrycode.optional = true
extension = iax:option(Value, "extension", "Add as Extension", "")
extension.optional = true
host = iax:option(Value, "host", "Host name (or blank)", "")
host.optional = true
internationalprefix = iax:option(Value, "internationalprefix", "International Dial Prefix", "")
internationalprefix.optional = true
prefix = iax:option(Value, "prefix", "Dial Prefix (for external line)", "")
prefix.optional = true
secret = iax:option(Value, "secret", "Secret", "")
secret.optional = true
timeout = iax:option(Value, "timeout", "Dial Timeout (sec)", "")
timeout.optional = true
type = iax:option(ListValue, "type", "Option type", "")
type:value("friend", "Friend (outbound/inbound)")
type:value("user", "User (inbound - authenticate by \"from\")")
type:value("peer", "Peer (outbound - match by host)")
type.optional = true
username = iax:option(Value, "username", "User name", "")
username.optional = true
return cbimap

View file

@ -1,22 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
meetmegeneral = cbimap:section(TypedSection, "meetmegeneral", "Meetme Conference General Options", "")
audiobuffers = meetmegeneral:option(Value, "audiobuffers", "Number of 20ms audio buffers to be used", "")
meetme = cbimap:section(TypedSection, "meetme", "Meetme Conference", "")
meetme.addremove = true
adminpin = meetme:option(Value, "adminpin", "Admin PIN", "")
adminpin.password = true
pin = meetme:option(Value, "pin", "Meeting PIN", "")
pin.password = true
return cbimap

View file

@ -1,391 +0,0 @@
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
app_alarmreceiver = module:option(ListValue, "app_alarmreceiver", "Alarm Receiver Application", "")
app_alarmreceiver:value("yes", "Load")
app_alarmreceiver:value("no", "Do Not Load")
app_alarmreceiver:value("auto", "Load as Required")
app_alarmreceiver.rmempty = true
app_authenticate = module:option(ListValue, "app_authenticate", "Authentication Application", "")
app_authenticate:value("yes", "Load")
app_authenticate:value("no", "Do Not Load")
app_authenticate:value("auto", "Load as Required")
app_authenticate.rmempty = true
app_cdr = module:option(ListValue, "app_cdr", "Make sure asterisk doesn't save CDR", "")
app_cdr:value("yes", "Load")
app_cdr:value("no", "Do Not Load")
app_cdr:value("auto", "Load as Required")
app_cdr.rmempty = true
app_chanisavail = module:option(ListValue, "app_chanisavail", "Check if channel is available", "")
app_chanisavail:value("yes", "Load")
app_chanisavail:value("no", "Do Not Load")
app_chanisavail:value("auto", "Load as Required")
app_chanisavail.rmempty = true
app_chanspy = module:option(ListValue, "app_chanspy", "Listen in on any channel", "")
app_chanspy:value("yes", "Load")
app_chanspy:value("no", "Do Not Load")
app_chanspy:value("auto", "Load as Required")
app_chanspy.rmempty = true
app_controlplayback = module:option(ListValue, "app_controlplayback", "Control Playback Application", "")
app_controlplayback:value("yes", "Load")
app_controlplayback:value("no", "Do Not Load")
app_controlplayback:value("auto", "Load as Required")
app_controlplayback.rmempty = true
app_cut = module:option(ListValue, "app_cut", "Cuts up variables", "")
app_cut:value("yes", "Load")
app_cut:value("no", "Do Not Load")
app_cut:value("auto", "Load as Required")
app_cut.rmempty = true
app_db = module:option(ListValue, "app_db", "Database access functions", "")
app_db:value("yes", "Load")
app_db:value("no", "Do Not Load")
app_db:value("auto", "Load as Required")
app_db.rmempty = true
app_dial = module:option(ListValue, "app_dial", "Dialing Application", "")
app_dial:value("yes", "Load")
app_dial:value("no", "Do Not Load")
app_dial:value("auto", "Load as Required")
app_dial.rmempty = true
app_dictate = module:option(ListValue, "app_dictate", "Virtual Dictation Machine Application", "")
app_dictate:value("yes", "Load")
app_dictate:value("no", "Do Not Load")
app_dictate:value("auto", "Load as Required")
app_dictate.rmempty = true
app_directed_pickup = module:option(ListValue, "app_directed_pickup", "Directed Call Pickup Support", "")
app_directed_pickup:value("yes", "Load")
app_directed_pickup:value("no", "Do Not Load")
app_directed_pickup:value("auto", "Load as Required")
app_directed_pickup.rmempty = true
app_directory = module:option(ListValue, "app_directory", "Extension Directory", "")
app_directory:value("yes", "Load")
app_directory:value("no", "Do Not Load")
app_directory:value("auto", "Load as Required")
app_directory.rmempty = true
app_disa = module:option(ListValue, "app_disa", "DISA (Direct Inward System Access) Application", "")
app_disa:value("yes", "Load")
app_disa:value("no", "Do Not Load")
app_disa:value("auto", "Load as Required")
app_disa.rmempty = true
app_dumpchan = module:option(ListValue, "app_dumpchan", "Dump channel variables Application", "")
app_dumpchan:value("yes", "Load")
app_dumpchan:value("no", "Do Not Load")
app_dumpchan:value("auto", "Load as Required")
app_dumpchan.rmempty = true
app_echo = module:option(ListValue, "app_echo", "Simple Echo Application", "")
app_echo:value("yes", "Load")
app_echo:value("no", "Do Not Load")
app_echo:value("auto", "Load as Required")
app_echo.rmempty = true
app_enumlookup = module:option(ListValue, "app_enumlookup", "ENUM Lookup", "")
app_enumlookup:value("yes", "Load")
app_enumlookup:value("no", "Do Not Load")
app_enumlookup:value("auto", "Load as Required")
app_enumlookup.rmempty = true
app_eval = module:option(ListValue, "app_eval", "Reevaluates strings", "")
app_eval:value("yes", "Load")
app_eval:value("no", "Do Not Load")
app_eval:value("auto", "Load as Required")
app_eval.rmempty = true
app_exec = module:option(ListValue, "app_exec", "Executes applications", "")
app_exec:value("yes", "Load")
app_exec:value("no", "Do Not Load")
app_exec:value("auto", "Load as Required")
app_exec.rmempty = true
app_externalivr = module:option(ListValue, "app_externalivr", "External IVR application interface", "")
app_externalivr:value("yes", "Load")
app_externalivr:value("no", "Do Not Load")
app_externalivr:value("auto", "Load as Required")
app_externalivr.rmempty = true
app_forkcdr = module:option(ListValue, "app_forkcdr", "Fork The CDR into 2 separate entities", "")
app_forkcdr:value("yes", "Load")
app_forkcdr:value("no", "Do Not Load")
app_forkcdr:value("auto", "Load as Required")
app_forkcdr.rmempty = true
app_getcpeid = module:option(ListValue, "app_getcpeid", "Get ADSI CPE ID", "")
app_getcpeid:value("yes", "Load")
app_getcpeid:value("no", "Do Not Load")
app_getcpeid:value("auto", "Load as Required")
app_getcpeid.rmempty = true
app_groupcount = module:option(ListValue, "app_groupcount", "Group Management Routines", "")
app_groupcount:value("yes", "Load")
app_groupcount:value("no", "Do Not Load")
app_groupcount:value("auto", "Load as Required")
app_groupcount.rmempty = true
app_ices = module:option(ListValue, "app_ices", "Encode and Stream via icecast and ices", "")
app_ices:value("yes", "Load")
app_ices:value("no", "Do Not Load")
app_ices:value("auto", "Load as Required")
app_ices.rmempty = true
app_image = module:option(ListValue, "app_image", "Image Transmission Application", "")
app_image:value("yes", "Load")
app_image:value("no", "Do Not Load")
app_image:value("auto", "Load as Required")
app_image.rmempty = true
app_lookupblacklist = module:option(ListValue, "app_lookupblacklist", "Look up Caller*ID name/number from black", "")
app_lookupblacklist:value("yes", "Load")
app_lookupblacklist:value("no", "Do Not Load")
app_lookupblacklist:value("auto", "Load as Required")
app_lookupblacklist.rmempty = true
app_lookupcidname = module:option(ListValue, "app_lookupcidname", "Look up CallerID Name from local databas", "")
app_lookupcidname:value("yes", "Load")
app_lookupcidname:value("no", "Do Not Load")
app_lookupcidname:value("auto", "Load as Required")
app_lookupcidname.rmempty = true
app_macro = module:option(ListValue, "app_macro", "Extension Macros", "")
app_macro:value("yes", "Load")
app_macro:value("no", "Do Not Load")
app_macro:value("auto", "Load as Required")
app_macro.rmempty = true
app_math = module:option(ListValue, "app_math", "A simple math Application", "")
app_math:value("yes", "Load")
app_math:value("no", "Do Not Load")
app_math:value("auto", "Load as Required")
app_math.rmempty = true
app_md5 = module:option(ListValue, "app_md5", "MD5 checksum Application", "")
app_md5:value("yes", "Load")
app_md5:value("no", "Do Not Load")
app_md5:value("auto", "Load as Required")
app_md5.rmempty = true
app_milliwatt = module:option(ListValue, "app_milliwatt", "Digital Milliwatt (mu-law) Test Application", "")
app_milliwatt:value("yes", "Load")
app_milliwatt:value("no", "Do Not Load")
app_milliwatt:value("auto", "Load as Required")
app_milliwatt.rmempty = true
app_mixmonitor = module:option(ListValue, "app_mixmonitor", "Record a call and mix the audio during the recording", "")
app_mixmonitor:value("yes", "Load")
app_mixmonitor:value("no", "Do Not Load")
app_mixmonitor:value("auto", "Load as Required")
app_mixmonitor.rmempty = true
app_parkandannounce = module:option(ListValue, "app_parkandannounce", "Call Parking and Announce Application", "")
app_parkandannounce:value("yes", "Load")
app_parkandannounce:value("no", "Do Not Load")
app_parkandannounce:value("auto", "Load as Required")
app_parkandannounce.rmempty = true
app_playback = module:option(ListValue, "app_playback", "Trivial Playback Application", "")
app_playback:value("yes", "Load")
app_playback:value("no", "Do Not Load")
app_playback:value("auto", "Load as Required")
app_playback.rmempty = true
app_privacy = module:option(ListValue, "app_privacy", "Require phone number to be entered", "")
app_privacy:value("yes", "Load")
app_privacy:value("no", "Do Not Load")
app_privacy:value("auto", "Load as Required")
app_privacy.rmempty = true
app_queue = module:option(ListValue, "app_queue", "True Call Queueing", "")
app_queue:value("yes", "Load")
app_queue:value("no", "Do Not Load")
app_queue:value("auto", "Load as Required")
app_queue.rmempty = true
app_random = module:option(ListValue, "app_random", "Random goto", "")
app_random:value("yes", "Load")
app_random:value("no", "Do Not Load")
app_random:value("auto", "Load as Required")
app_random.rmempty = true
app_read = module:option(ListValue, "app_read", "Read Variable Application", "")
app_read:value("yes", "Load")
app_read:value("no", "Do Not Load")
app_read:value("auto", "Load as Required")
app_read.rmempty = true
app_readfile = module:option(ListValue, "app_readfile", "Read in a file", "")
app_readfile:value("yes", "Load")
app_readfile:value("no", "Do Not Load")
app_readfile:value("auto", "Load as Required")
app_readfile.rmempty = true
app_realtime = module:option(ListValue, "app_realtime", "Realtime Data Lookup/Rewrite", "")
app_realtime:value("yes", "Load")
app_realtime:value("no", "Do Not Load")
app_realtime:value("auto", "Load as Required")
app_realtime.rmempty = true
app_record = module:option(ListValue, "app_record", "Trivial Record Application", "")
app_record:value("yes", "Load")
app_record:value("no", "Do Not Load")
app_record:value("auto", "Load as Required")
app_record.rmempty = true
app_sayunixtime = module:option(ListValue, "app_sayunixtime", "Say time", "")
app_sayunixtime:value("yes", "Load")
app_sayunixtime:value("no", "Do Not Load")
app_sayunixtime:value("auto", "Load as Required")
app_sayunixtime.rmempty = true
app_senddtmf = module:option(ListValue, "app_senddtmf", "Send DTMF digits Application", "")
app_senddtmf:value("yes", "Load")
app_senddtmf:value("no", "Do Not Load")
app_senddtmf:value("auto", "Load as Required")
app_senddtmf.rmempty = true
app_sendtext = module:option(ListValue, "app_sendtext", "Send Text Applications", "")
app_sendtext:value("yes", "Load")
app_sendtext:value("no", "Do Not Load")
app_sendtext:value("auto", "Load as Required")
app_sendtext.rmempty = true
app_setcallerid = module:option(ListValue, "app_setcallerid", "Set CallerID Application", "")
app_setcallerid:value("yes", "Load")
app_setcallerid:value("no", "Do Not Load")
app_setcallerid:value("auto", "Load as Required")
app_setcallerid.rmempty = true
app_setcdruserfield = module:option(ListValue, "app_setcdruserfield", "CDR user field apps", "")
app_setcdruserfield:value("yes", "Load")
app_setcdruserfield:value("no", "Do Not Load")
app_setcdruserfield:value("auto", "Load as Required")
app_setcdruserfield.rmempty = true
app_setcidname = module:option(ListValue, "app_setcidname", "load => .so ; Set CallerID Name", "")
app_setcidname:value("yes", "Load")
app_setcidname:value("no", "Do Not Load")
app_setcidname:value("auto", "Load as Required")
app_setcidname.rmempty = true
app_setcidnum = module:option(ListValue, "app_setcidnum", "load => .so ; Set CallerID Number", "")
app_setcidnum:value("yes", "Load")
app_setcidnum:value("no", "Do Not Load")
app_setcidnum:value("auto", "Load as Required")
app_setcidnum.rmempty = true
app_setrdnis = module:option(ListValue, "app_setrdnis", "Set RDNIS Number", "")
app_setrdnis:value("yes", "Load")
app_setrdnis:value("no", "Do Not Load")
app_setrdnis:value("auto", "Load as Required")
app_setrdnis.rmempty = true
app_settransfercapability = module:option(ListValue, "app_settransfercapability", "Set ISDN Transfer Capability", "")
app_settransfercapability:value("yes", "Load")
app_settransfercapability:value("no", "Do Not Load")
app_settransfercapability:value("auto", "Load as Required")
app_settransfercapability.rmempty = true
app_sms = module:option(ListValue, "app_sms", "SMS/PSTN handler", "")
app_sms:value("yes", "Load")
app_sms:value("no", "Do Not Load")
app_sms:value("auto", "Load as Required")
app_sms.rmempty = true
app_softhangup = module:option(ListValue, "app_softhangup", "Hangs up the requested channel", "")
app_softhangup:value("yes", "Load")
app_softhangup:value("no", "Do Not Load")
app_softhangup:value("auto", "Load as Required")
app_softhangup.rmempty = true
app_stack = module:option(ListValue, "app_stack", "Stack Routines", "")
app_stack:value("yes", "Load")
app_stack:value("no", "Do Not Load")
app_stack:value("auto", "Load as Required")
app_stack.rmempty = true
app_system = module:option(ListValue, "app_system", "Generic System() application", "")
app_system:value("yes", "Load")
app_system:value("no", "Do Not Load")
app_system:value("auto", "Load as Required")
app_system.rmempty = true
app_talkdetect = module:option(ListValue, "app_talkdetect", "Playback with Talk Detection", "")
app_talkdetect:value("yes", "Load")
app_talkdetect:value("no", "Do Not Load")
app_talkdetect:value("auto", "Load as Required")
app_talkdetect.rmempty = true
app_test = module:option(ListValue, "app_test", "Interface Test Application", "")
app_test:value("yes", "Load")
app_test:value("no", "Do Not Load")
app_test:value("auto", "Load as Required")
app_test.rmempty = true
app_transfer = module:option(ListValue, "app_transfer", "Transfer", "")
app_transfer:value("yes", "Load")
app_transfer:value("no", "Do Not Load")
app_transfer:value("auto", "Load as Required")
app_transfer.rmempty = true
app_txtcidname = module:option(ListValue, "app_txtcidname", "TXTCIDName", "")
app_txtcidname:value("yes", "Load")
app_txtcidname:value("no", "Do Not Load")
app_txtcidname:value("auto", "Load as Required")
app_txtcidname.rmempty = true
app_url = module:option(ListValue, "app_url", "Send URL Applications", "")
app_url:value("yes", "Load")
app_url:value("no", "Do Not Load")
app_url:value("auto", "Load as Required")
app_url.rmempty = true
app_userevent = module:option(ListValue, "app_userevent", "Custom User Event Application", "")
app_userevent:value("yes", "Load")
app_userevent:value("no", "Do Not Load")
app_userevent:value("auto", "Load as Required")
app_userevent.rmempty = true
app_verbose = module:option(ListValue, "app_verbose", "Send verbose output", "")
app_verbose:value("yes", "Load")
app_verbose:value("no", "Do Not Load")
app_verbose:value("auto", "Load as Required")
app_verbose.rmempty = true
app_voicemail = module:option(ListValue, "app_voicemail", "Voicemail", "")
app_voicemail:value("yes", "Load")
app_voicemail:value("no", "Do Not Load")
app_voicemail:value("auto", "Load as Required")
app_voicemail.rmempty = true
app_waitforring = module:option(ListValue, "app_waitforring", "Waits until first ring after time", "")
app_waitforring:value("yes", "Load")
app_waitforring:value("no", "Do Not Load")
app_waitforring:value("auto", "Load as Required")
app_waitforring.rmempty = true
app_waitforsilence = module:option(ListValue, "app_waitforsilence", "Wait For Silence Application", "")
app_waitforsilence:value("yes", "Load")
app_waitforsilence:value("no", "Do Not Load")
app_waitforsilence:value("auto", "Load as Required")
app_waitforsilence.rmempty = true
app_while = module:option(ListValue, "app_while", "While Loops and Conditional Execution", "")
app_while:value("yes", "Load")
app_while:value("no", "Do Not Load")
app_while:value("auto", "Load as Required")
app_while.rmempty = true
return cbimap

View file

@ -1,47 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
cdr_csv = module:option(ListValue, "cdr_csv", "Comma Separated Values CDR Backend", "")
cdr_csv:value("yes", "Load")
cdr_csv:value("no", "Do Not Load")
cdr_csv:value("auto", "Load as Required")
cdr_csv.rmempty = true
cdr_custom = module:option(ListValue, "cdr_custom", "Customizable Comma Separated Values CDR Backend", "")
cdr_custom:value("yes", "Load")
cdr_custom:value("no", "Do Not Load")
cdr_custom:value("auto", "Load as Required")
cdr_custom.rmempty = true
cdr_manager = module:option(ListValue, "cdr_manager", "Asterisk Call Manager CDR Backend", "")
cdr_manager:value("yes", "Load")
cdr_manager:value("no", "Do Not Load")
cdr_manager:value("auto", "Load as Required")
cdr_manager.rmempty = true
cdr_mysql = module:option(ListValue, "cdr_mysql", "MySQL CDR Backend", "")
cdr_mysql:value("yes", "Load")
cdr_mysql:value("no", "Do Not Load")
cdr_mysql:value("auto", "Load as Required")
cdr_mysql.rmempty = true
cdr_pgsql = module:option(ListValue, "cdr_pgsql", "PostgreSQL CDR Backend", "")
cdr_pgsql:value("yes", "Load")
cdr_pgsql:value("no", "Do Not Load")
cdr_pgsql:value("auto", "Load as Required")
cdr_pgsql.rmempty = true
cdr_sqlite = module:option(ListValue, "cdr_sqlite", "SQLite CDR Backend", "")
cdr_sqlite:value("yes", "Load")
cdr_sqlite:value("no", "Do Not Load")
cdr_sqlite:value("auto", "Load as Required")
cdr_sqlite.rmempty = true
return cbimap

View file

@ -1,45 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
chan_agent = module:option(ListValue, "chan_agent", "Agent Proxy Channel", "")
chan_agent:value("yes", "Load")
chan_agent:value("no", "Do Not Load")
chan_agent:value("auto", "Load as Required")
chan_agent.rmempty = true
chan_alsa = module:option(ListValue, "chan_alsa", "Channel driver for GTalk", "")
chan_alsa:value("yes", "Load")
chan_alsa:value("no", "Do Not Load")
chan_alsa:value("auto", "Load as Required")
chan_alsa.rmempty = true
chan_gtalk = module:option(ListValue, "chan_gtalk", "Channel driver for GTalk", "")
chan_gtalk:value("yes", "Load")
chan_gtalk:value("no", "Do Not Load")
chan_gtalk:value("auto", "Load as Required")
chan_gtalk.rmempty = true
chan_iax2 = module:option(Flag, "chan_iax2", "Option chan_iax2", "")
chan_iax2.rmempty = true
chan_local = module:option(ListValue, "chan_local", "Local Proxy Channel", "")
chan_local:value("yes", "Load")
chan_local:value("no", "Do Not Load")
chan_local:value("auto", "Load as Required")
chan_local.rmempty = true
chan_sip = module:option(ListValue, "chan_sip", "Session Initiation Protocol (SIP)", "")
chan_sip:value("yes", "Load")
chan_sip:value("no", "Do Not Load")
chan_sip:value("auto", "Load as Required")
chan_sip.rmempty = true
return cbimap

View file

@ -1,53 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
codec_a_mu = module:option(ListValue, "codec_a_mu", "A-law and Mulaw direct Coder/Decoder", "")
codec_a_mu:value("yes", "Load")
codec_a_mu:value("no", "Do Not Load")
codec_a_mu:value("auto", "Load as Required")
codec_a_mu.rmempty = true
codec_adpcm = module:option(ListValue, "codec_adpcm", "Adaptive Differential PCM Coder/Decoder", "")
codec_adpcm:value("yes", "Load")
codec_adpcm:value("no", "Do Not Load")
codec_adpcm:value("auto", "Load as Required")
codec_adpcm.rmempty = true
codec_alaw = module:option(ListValue, "codec_alaw", "A-law Coder/Decoder", "")
codec_alaw:value("yes", "Load")
codec_alaw:value("no", "Do Not Load")
codec_alaw:value("auto", "Load as Required")
codec_alaw.rmempty = true
codec_g726 = module:option(ListValue, "codec_g726", "ITU G.726-32kbps G726 Transcoder", "")
codec_g726:value("yes", "Load")
codec_g726:value("no", "Do Not Load")
codec_g726:value("auto", "Load as Required")
codec_g726.rmempty = true
codec_gsm = module:option(ListValue, "codec_gsm", "GSM/PCM16 (signed linear) Codec Translation", "")
codec_gsm:value("yes", "Load")
codec_gsm:value("no", "Do Not Load")
codec_gsm:value("auto", "Load as Required")
codec_gsm.rmempty = true
codec_speex = module:option(ListValue, "codec_speex", "Speex/PCM16 (signed linear) Codec Translator", "")
codec_speex:value("yes", "Load")
codec_speex:value("no", "Do Not Load")
codec_speex:value("auto", "Load as Required")
codec_speex.rmempty = true
codec_ulaw = module:option(ListValue, "codec_ulaw", "Mu-law Coder/Decoder", "")
codec_ulaw:value("yes", "Load")
codec_ulaw:value("no", "Do Not Load")
codec_ulaw:value("auto", "Load as Required")
codec_ulaw.rmempty = true
return cbimap

View file

@ -1,89 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
format_au = module:option(ListValue, "format_au", "Sun Microsystems AU format (signed linear)", "")
format_au:value("yes", "Load")
format_au:value("no", "Do Not Load")
format_au:value("auto", "Load as Required")
format_au.rmempty = true
format_g723 = module:option(ListValue, "format_g723", "G.723.1 Simple Timestamp File Format", "")
format_g723:value("yes", "Load")
format_g723:value("no", "Do Not Load")
format_g723:value("auto", "Load as Required")
format_g723.rmempty = true
format_g726 = module:option(ListValue, "format_g726", "Raw G.726 (16/24/32/40kbps) data", "")
format_g726:value("yes", "Load")
format_g726:value("no", "Do Not Load")
format_g726:value("auto", "Load as Required")
format_g726.rmempty = true
format_g729 = module:option(ListValue, "format_g729", "Raw G729 data", "")
format_g729:value("yes", "Load")
format_g729:value("no", "Do Not Load")
format_g729:value("auto", "Load as Required")
format_g729.rmempty = true
format_gsm = module:option(ListValue, "format_gsm", "Raw GSM data", "")
format_gsm:value("yes", "Load")
format_gsm:value("no", "Do Not Load")
format_gsm:value("auto", "Load as Required")
format_gsm.rmempty = true
format_h263 = module:option(ListValue, "format_h263", "Raw h263 data", "")
format_h263:value("yes", "Load")
format_h263:value("no", "Do Not Load")
format_h263:value("auto", "Load as Required")
format_h263.rmempty = true
format_jpeg = module:option(ListValue, "format_jpeg", "JPEG (Joint Picture Experts Group) Image", "")
format_jpeg:value("yes", "Load")
format_jpeg:value("no", "Do Not Load")
format_jpeg:value("auto", "Load as Required")
format_jpeg.rmempty = true
format_pcm = module:option(ListValue, "format_pcm", "Raw uLaw 8khz Audio support (PCM)", "")
format_pcm:value("yes", "Load")
format_pcm:value("no", "Do Not Load")
format_pcm:value("auto", "Load as Required")
format_pcm.rmempty = true
format_pcm_alaw = module:option(ListValue, "format_pcm_alaw", "load => .so ; Raw aLaw 8khz PCM Audio support", "")
format_pcm_alaw:value("yes", "Load")
format_pcm_alaw:value("no", "Do Not Load")
format_pcm_alaw:value("auto", "Load as Required")
format_pcm_alaw.rmempty = true
format_sln = module:option(ListValue, "format_sln", "Raw Signed Linear Audio support (SLN)", "")
format_sln:value("yes", "Load")
format_sln:value("no", "Do Not Load")
format_sln:value("auto", "Load as Required")
format_sln.rmempty = true
format_vox = module:option(ListValue, "format_vox", "Dialogic VOX (ADPCM) File Format", "")
format_vox:value("yes", "Load")
format_vox:value("no", "Do Not Load")
format_vox:value("auto", "Load as Required")
format_vox.rmempty = true
format_wav = module:option(ListValue, "format_wav", "Microsoft WAV format (8000hz Signed Line", "")
format_wav:value("yes", "Load")
format_wav:value("no", "Do Not Load")
format_wav:value("auto", "Load as Required")
format_wav.rmempty = true
format_wav_gsm = module:option(ListValue, "format_wav_gsm", "Microsoft WAV format (Proprietary GSM)", "")
format_wav_gsm:value("yes", "Load")
format_wav_gsm:value("no", "Do Not Load")
format_wav_gsm:value("auto", "Load as Required")
format_wav_gsm.rmempty = true
return cbimap

View file

@ -1,29 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
func_callerid = module:option(ListValue, "func_callerid", "Caller ID related dialplan functions", "")
func_callerid:value("yes", "Load")
func_callerid:value("no", "Do Not Load")
func_callerid:value("auto", "Load as Required")
func_callerid.rmempty = true
func_enum = module:option(ListValue, "func_enum", "ENUM Functions", "")
func_enum:value("yes", "Load")
func_enum:value("no", "Do Not Load")
func_enum:value("auto", "Load as Required")
func_enum.rmempty = true
func_uri = module:option(ListValue, "func_uri", "URI encoding / decoding functions", "")
func_uri:value("yes", "Load")
func_uri:value("no", "Do Not Load")
func_uri:value("auto", "Load as Required")
func_uri.rmempty = true
return cbimap

View file

@ -1,53 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
pbx_ael = module:option(ListValue, "pbx_ael", "Asterisk Extension Language Compiler", "")
pbx_ael:value("yes", "Load")
pbx_ael:value("no", "Do Not Load")
pbx_ael:value("auto", "Load as Required")
pbx_ael.rmempty = true
pbx_config = module:option(ListValue, "pbx_config", "Text Extension Configuration", "")
pbx_config:value("yes", "Load")
pbx_config:value("no", "Do Not Load")
pbx_config:value("auto", "Load as Required")
pbx_config.rmempty = true
pbx_functions = module:option(ListValue, "pbx_functions", "load => .so ; Builtin dialplan functions", "")
pbx_functions:value("yes", "Load")
pbx_functions:value("no", "Do Not Load")
pbx_functions:value("auto", "Load as Required")
pbx_functions.rmempty = true
pbx_loopback = module:option(ListValue, "pbx_loopback", "Loopback Switch", "")
pbx_loopback:value("yes", "Load")
pbx_loopback:value("no", "Do Not Load")
pbx_loopback:value("auto", "Load as Required")
pbx_loopback.rmempty = true
pbx_realtime = module:option(ListValue, "pbx_realtime", "Realtime Switch", "")
pbx_realtime:value("yes", "Load")
pbx_realtime:value("no", "Do Not Load")
pbx_realtime:value("auto", "Load as Required")
pbx_realtime.rmempty = true
pbx_spool = module:option(ListValue, "pbx_spool", "Outgoing Spool Support", "")
pbx_spool:value("yes", "Load")
pbx_spool:value("no", "Do Not Load")
pbx_spool:value("auto", "Load as Required")
pbx_spool.rmempty = true
pbx_wilcalu = module:option(ListValue, "pbx_wilcalu", "Wil Cal U (Auto Dialer)", "")
pbx_wilcalu:value("yes", "Load")
pbx_wilcalu:value("no", "Do Not Load")
pbx_wilcalu:value("auto", "Load as Required")
pbx_wilcalu.rmempty = true
return cbimap

View file

@ -1,100 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
featuremap = cbimap:section(TypedSection, "featuremap", "Feature Key maps", "")
featuremap.anonymous = true
featuremap.addremove = true
atxfer = featuremap:option(Value, "atxfer", "Attended transfer key", "")
atxfer.rmempty = true
blindxfer = featuremap:option(Value, "blindxfer", "Blind transfer key", "")
blindxfer.rmempty = true
disconnect = featuremap:option(Value, "disconnect", "Key to Disconnect call", "")
disconnect.rmempty = true
parkcall = featuremap:option(Value, "parkcall", "Key to Park call", "")
parkcall.rmempty = true
featurepark = cbimap:section(TypedSection, "featurepark", "Parking Feature", "")
featurepark.anonymous = true
parkenabled = featurepark:option(Flag, "parkenabled", "Enable Parking", "")
adsipark = featurepark:option(Flag, "adsipark", "ADSI Park", "")
adsipark.rmempty = true
adsipark:depends({ parkenabled = "1" })
atxfernoanswertimeout = featurepark:option(Value, "atxfernoanswertimeout", "Attended transfer timeout (sec)", "")
atxfernoanswertimeout.rmempty = true
atxfernoanswertimeout:depends({ parkenabled = "1" })
automon = featurepark:option(Value, "automon", "One touch record key", "")
automon.rmempty = true
automon:depends({ parkenabled = "1" })
context = featurepark:option(Value, "context", "Name of call context for parking", "")
context.rmempty = true
context:depends({ parkenabled = "1" })
courtesytone = featurepark:option(Value, "courtesytone", "Sound file to play to parked caller", "")
courtesytone.rmempty = true
courtesytone:depends({ parkenabled = "1" })
featuredigittimeout = featurepark:option(Value, "featuredigittimeout", "Max time (ms) between digits for feature activation", "")
featuredigittimeout.rmempty = true
featuredigittimeout:depends({ parkenabled = "1" })
findslot = featurepark:option(ListValue, "findslot", "Method to Find Parking slot", "")
findslot:value("first", "First available slot")
findslot:value("next", "Next free parking space")
findslot.rmempty = true
findslot:depends({ parkenabled = "1" })
parkedmusicclass = featurepark:option(ListValue, "parkedmusicclass", "Music on Hold class for the parked channel", "")
parkedmusicclass.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk" )
parkedmusicclass:depends({ parkenabled = "1" })
cbimap.uci:foreach( "asterisk", "moh", function(s) parkedmusicclass:value(s['.name']) end )
parkedplay = featurepark:option(ListValue, "parkedplay", "Play courtesy tone to", "")
parkedplay:value("caller", "Caller")
parkedplay:value("parked", "Parked user")
parkedplay:value("both", "Both")
parkedplay.rmempty = true
parkedplay:depends({ parkenabled = "1" })
parkext = featurepark:option(Value, "parkext", "Extension to dial to park", "")
parkext.rmempty = true
parkext:depends({ parkenabled = "1" })
parkingtime = featurepark:option(Value, "parkingtime", "Parking time (secs)", "")
parkingtime.rmempty = true
parkingtime:depends({ parkenabled = "1" })
parkpos = featurepark:option(Value, "parkpos", "Range of extensions for call parking", "")
parkpos.rmempty = true
parkpos:depends({ parkenabled = "1" })
pickupexten = featurepark:option(Value, "pickupexten", "Pickup extension", "")
pickupexten.rmempty = true
pickupexten:depends({ parkenabled = "1" })
transferdigittimeout = featurepark:option(Value, "transferdigittimeout", "Seconds to wait between digits when transferring", "")
transferdigittimeout.rmempty = true
transferdigittimeout:depends({ parkenabled = "1" })
xferfailsound = featurepark:option(Value, "xferfailsound", "sound when attended transfer is complete", "")
xferfailsound.rmempty = true
xferfailsound:depends({ parkenabled = "1" })
xfersound = featurepark:option(Value, "xfersound", "Sound when attended transfer fails", "")
xfersound.rmempty = true
xfersound:depends({ parkenabled = "1" })
return cbimap

View file

@ -1,77 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
module = cbimap:section(TypedSection, "module", "Modules", "")
module.anonymous = true
res_config_mysql = module:option(ListValue, "res_config_mysql", "MySQL Config Resource", "")
res_config_mysql:value("yes", "Load")
res_config_mysql:value("no", "Do Not Load")
res_config_mysql:value("auto", "Load as Required")
res_config_mysql.rmempty = true
res_config_odbc = module:option(ListValue, "res_config_odbc", "ODBC Config Resource", "")
res_config_odbc:value("yes", "Load")
res_config_odbc:value("no", "Do Not Load")
res_config_odbc:value("auto", "Load as Required")
res_config_odbc.rmempty = true
res_config_pgsql = module:option(ListValue, "res_config_pgsql", "PGSQL Module", "")
res_config_pgsql:value("yes", "Load")
res_config_pgsql:value("no", "Do Not Load")
res_config_pgsql:value("auto", "Load as Required")
res_config_pgsql.rmempty = true
res_crypto = module:option(ListValue, "res_crypto", "Cryptographic Digital Signatures", "")
res_crypto:value("yes", "Load")
res_crypto:value("no", "Do Not Load")
res_crypto:value("auto", "Load as Required")
res_crypto.rmempty = true
res_features = module:option(ListValue, "res_features", "Call Parking Resource", "")
res_features:value("yes", "Load")
res_features:value("no", "Do Not Load")
res_features:value("auto", "Load as Required")
res_features.rmempty = true
res_indications = module:option(ListValue, "res_indications", "Indications Configuration", "")
res_indications:value("yes", "Load")
res_indications:value("no", "Do Not Load")
res_indications:value("auto", "Load as Required")
res_indications.rmempty = true
res_monitor = module:option(ListValue, "res_monitor", "Call Monitoring Resource", "")
res_monitor:value("yes", "Load")
res_monitor:value("no", "Do Not Load")
res_monitor:value("auto", "Load as Required")
res_monitor.rmempty = true
res_musiconhold = module:option(ListValue, "res_musiconhold", "Music On Hold Resource", "")
res_musiconhold:value("yes", "Load")
res_musiconhold:value("no", "Do Not Load")
res_musiconhold:value("auto", "Load as Required")
res_musiconhold.rmempty = true
res_odbc = module:option(ListValue, "res_odbc", "ODBC Resource", "")
res_odbc:value("yes", "Load")
res_odbc:value("no", "Do Not Load")
res_odbc:value("auto", "Load as Required")
res_odbc.rmempty = true
res_smdi = module:option(ListValue, "res_smdi", "SMDI Module", "")
res_smdi:value("yes", "Load")
res_smdi:value("no", "Do Not Load")
res_smdi:value("auto", "Load as Required")
res_smdi.rmempty = true
res_snmp = module:option(ListValue, "res_snmp", "SNMP Module", "")
res_snmp:value("yes", "Load")
res_snmp:value("no", "Do Not Load")
res_snmp:value("auto", "Load as Required")
res_snmp.rmempty = true
return cbimap

View file

@ -1,98 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
sip = cbimap:section(TypedSection, "sip", "SIP Connection", "")
sip.addremove = true
alwaysinternational = sip:option(Flag, "alwaysinternational", "Always Dial International", "")
alwaysinternational.optional = true
canreinvite = sip:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
canreinvite:value("yes", "Yes")
canreinvite:value("nonat", "Yes when not behind NAT")
canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
canreinvite:value("no", "No")
canreinvite.optional = true
context = sip:option(ListValue, "context", "Context to use", "")
context.titleref = luci.dispatcher.build_url( "admin", "services", "asterisk", "dialplans" )
cbimap.uci:foreach( "asterisk", "dialplan", function(s) context:value(s['.name']) end )
cbimap.uci:foreach( "asterisk", "dialzone", function(s) context:value(s['.name']) end )
countrycode = sip:option(Value, "countrycode", "Country Code for connection", "")
countrycode.optional = true
dtmfmode = sip:option(ListValue, "dtmfmode", "DTMF mode", "")
dtmfmode:value("info", "Use RFC2833 or INFO for the BudgeTone")
dtmfmode:value("rfc2833", "Use RFC2833 for the BudgeTone")
dtmfmode:value("inband", "Use Inband (only with ulaw/alaw)")
dtmfmode.optional = true
extension = sip:option(Value, "extension", "Add as Extension", "")
extension.optional = true
fromdomain = sip:option(Value, "fromdomain", "Primary domain identity for From: headers", "")
fromdomain.optional = true
fromuser = sip:option(Value, "fromuser", "From user (required by many SIP providers)", "")
fromuser.optional = true
host = sip:option(Value, "host", "Host name (or blank)", "")
host.optional = true
incoming = sip:option(DynamicList, "incoming", "Ring on incoming dialplan contexts", "")
incoming.optional = true
insecure = sip:option(ListValue, "insecure", "Allow Insecure for", "")
insecure:value("port", "Allow mismatched port number")
insecure:value("invite", "Do not require auth of incoming INVITE")
insecure:value("port,invite", "Allow mismatched port and Do not require auth of incoming INVITE")
insecure.optional = true
internationalprefix = sip:option(Value, "internationalprefix", "International Dial Prefix", "")
internationalprefix.optional = true
mailbox = sip:option(Value, "mailbox", "Mailbox for MWI", "")
mailbox.optional = true
nat = sip:option(Flag, "nat", "NAT between phone and Asterisk", "")
nat.optional = true
pedantic = sip:option(Flag, "pedantic", "Check tags in headers", "")
pedantic.optional = true
port = sip:option(Value, "port", "SIP Port", "")
port.optional = true
prefix = sip:option(Value, "prefix", "Dial Prefix (for external line)", "")
prefix.optional = true
qualify = sip:option(Value, "qualify", "Reply Timeout (ms) for down connection", "")
qualify.optional = true
register = sip:option(Flag, "register", "Register connection", "")
register.optional = true
secret = sip:option(Value, "secret", "Secret", "")
secret.optional = true
selfmailbox = sip:option(Flag, "selfmailbox", "Dial own extension for mailbox", "")
selfmailbox.optional = true
timeout = sip:option(Value, "timeout", "Dial Timeout (sec)", "")
timeout.optional = true
type = sip:option(ListValue, "type", "Client Type", "")
type:value("friend", "Friend (outbound/inbound)")
type:value("user", "User (inbound - authenticate by \"from\")")
type:value("peer", "Peer (outbound - match by host)")
type.optional = true
username = sip:option(Value, "username", "Username", "")
username.optional = true
return cbimap

View file

@ -1,41 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
voicegeneral = cbimap:section(TypedSection, "voicegeneral", "Voicemail general options", "")
serveremail = voicegeneral:option(Value, "serveremail", "From Email address of server", "")
voicemail = cbimap:section(TypedSection, "voicemail", "Voice Mail boxes", "")
voicemail.addremove = true
attach = voicemail:option(Flag, "attach", "Email contains attachment", "")
attach.rmempty = true
email = voicemail:option(Value, "email", "Email", "")
email.rmempty = true
name = voicemail:option(Value, "name", "Display Name", "")
name.rmempty = true
password = voicemail:option(Value, "password", "Password", "")
password.rmempty = true
zone = voicemail:option(ListValue, "zone", "Voice Zone", "")
cbimap.uci:foreach( "asterisk", "voicezone", function(s) zone:value(s['.name']) end )
voicezone = cbimap:section(TypedSection, "voicezone", "Voice Zone settings", "")
voicezone.addremove = true
message = voicezone:option(Value, "message", "Message Format", "")
message.rmempty = true
zone = voicezone:option(Value, "zone", "Time Zone", "")
zone.rmempty = true
return cbimap

View file

@ -1,151 +0,0 @@
-- Copyright 2008 Steven Barth <steven@midlink.org>
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "asterisk", "")
asterisk = cbimap:section(TypedSection, "asterisk", "Asterisk General Options", "")
asterisk.anonymous = true
agidir = asterisk:option(Value, "agidir", "AGI directory", "")
agidir.rmempty = true
cache_record_files = asterisk:option(Flag, "cache_record_files", "Cache recorded sound files during recording", "")
cache_record_files.rmempty = true
debug = asterisk:option(Value, "debug", "Debug Level", "")
debug.rmempty = true
dontwarn = asterisk:option(Flag, "dontwarn", "Disable some warnings", "")
dontwarn.rmempty = true
dumpcore = asterisk:option(Flag, "dumpcore", "Dump core on crash", "")
dumpcore.rmempty = true
highpriority = asterisk:option(Flag, "highpriority", "High Priority", "")
highpriority.rmempty = true
initcrypto = asterisk:option(Flag, "initcrypto", "Initialise Crypto", "")
initcrypto.rmempty = true
internal_timing = asterisk:option(Flag, "internal_timing", "Use Internal Timing", "")
internal_timing.rmempty = true
logdir = asterisk:option(Value, "logdir", "Log directory", "")
logdir.rmempty = true
maxcalls = asterisk:option(Value, "maxcalls", "Maximum number of calls allowed", "")
maxcalls.rmempty = true
maxload = asterisk:option(Value, "maxload", "Maximum load to stop accepting new calls", "")
maxload.rmempty = true
nocolor = asterisk:option(Flag, "nocolor", "Disable console colors", "")
nocolor.rmempty = true
record_cache_dir = asterisk:option(Value, "record_cache_dir", "Sound files Cache directory", "")
record_cache_dir.rmempty = true
record_cache_dir:depends({ ["cache_record_files"] = "true" })
rungroup = asterisk:option(Flag, "rungroup", "The Group to run as", "")
rungroup.rmempty = true
runuser = asterisk:option(Flag, "runuser", "The User to run as", "")
runuser.rmempty = true
spooldir = asterisk:option(Value, "spooldir", "Voicemail Spool directory", "")
spooldir.rmempty = true
systemname = asterisk:option(Value, "systemname", "Prefix UniquID with system name", "")
systemname.rmempty = true
transcode_via_sln = asterisk:option(Flag, "transcode_via_sln", "Build transcode paths via SLINEAR, not directly", "")
transcode_via_sln.rmempty = true
transmit_silence_during_record = asterisk:option(Flag, "transmit_silence_during_record", "Transmit SLINEAR silence while recording a channel", "")
transmit_silence_during_record.rmempty = true
verbose = asterisk:option(Value, "verbose", "Verbose Level", "")
verbose.rmempty = true
zone = asterisk:option(Value, "zone", "Time Zone", "")
zone.rmempty = true
hardwarereboot = cbimap:section(TypedSection, "hardwarereboot", "Reload Hardware Config", "")
method = hardwarereboot:option(ListValue, "method", "Reboot Method", "")
method:value("web", "Web URL (wget)")
method:value("system", "program to run")
method.rmempty = true
param = hardwarereboot:option(Value, "param", "Parameter", "")
param.rmempty = true
iaxgeneral = cbimap:section(TypedSection, "iaxgeneral", "IAX General Options", "")
iaxgeneral.anonymous = true
iaxgeneral.addremove = true
allow = iaxgeneral:option(MultiValue, "allow", "Allow Codecs", "")
allow:value("alaw", "alaw")
allow:value("gsm", "gsm")
allow:value("g726", "g726")
allow.rmempty = true
canreinvite = iaxgeneral:option(ListValue, "canreinvite", "Reinvite/redirect media connections", "")
canreinvite:value("yes", "Yes")
canreinvite:value("nonat", "Yes when not behind NAT")
canreinvite:value("update", "Use UPDATE rather than INVITE for path redirection")
canreinvite:value("no", "No")
canreinvite.rmempty = true
static = iaxgeneral:option(Flag, "static", "Static", "")
static.rmempty = true
writeprotect = iaxgeneral:option(Flag, "writeprotect", "Write Protect", "")
writeprotect.rmempty = true
sipgeneral = cbimap:section(TypedSection, "sipgeneral", "Section sipgeneral", "")
sipgeneral.anonymous = true
sipgeneral.addremove = true
allow = sipgeneral:option(MultiValue, "allow", "Allow codecs", "")
allow:value("ulaw", "ulaw")
allow:value("alaw", "alaw")
allow:value("gsm", "gsm")
allow:value("g726", "g726")
allow.rmempty = true
port = sipgeneral:option(Value, "port", "SIP Port", "")
port.rmempty = true
realm = sipgeneral:option(Value, "realm", "SIP realm", "")
realm.rmempty = true
moh = cbimap:section(TypedSection, "moh", "Music On Hold", "")
application = moh:option(Value, "application", "Application", "")
application.rmempty = true
application:depends({ ["asterisk.moh.mode"] = "custom" })
directory = moh:option(Value, "directory", "Directory of Music", "")
directory.rmempty = true
mode = moh:option(ListValue, "mode", "Option mode", "")
mode:value("system", "program to run")
mode:value("files", "Read files from directory")
mode:value("quietmp3", "Quite MP3")
mode:value("mp3", "Loud MP3")
mode:value("mp3nb", "unbuffered MP3")
mode:value("quietmp3nb", "Quiet Unbuffered MP3")
mode:value("custom", "Run a custom application")
mode.rmempty = true
random = moh:option(Flag, "random", "Random Play", "")
random.rmempty = true
return cbimap

View file

@ -1,125 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
local function find_outgoing_contexts(uci)
local c = { }
local h = { }
-- uci:foreach("asterisk", "dialplan",
-- function(s)
-- if not h[s['.name']] then
-- c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] }
-- h[s['.name']] = true
-- end
-- end)
uci:foreach("asterisk", "dialzone",
function(s)
if not h[s['.name']] then
c[#c+1] = { s['.name'], "Dialzone: %s" % s['.name'] }
h[s['.name']] = true
end
end)
return c
end
local function find_incoming_contexts(uci)
local c = { }
local h = { }
uci:foreach("asterisk", "sip",
function(s)
if s.context and not h[s.context] and
uci:get_bool("asterisk", s['.name'], "provider")
then
c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context }
h[s.context] = true
end
end)
return c
end
local function find_trunks(uci)
local t = { }
uci:foreach("asterisk", "sip",
function(s)
if uci:get_bool("asterisk", s['.name'], "provider") then
t[#t+1] = {
"SIP/%s" % s['.name'],
"SIP: %s" % s['.name']
}
end
end)
uci:foreach("asterisk", "iax",
function(s)
t[#t+1] = {
"IAX/%s" % s['.name'],
"IAX: %s" % s.extension or s['.name']
}
end)
return t
end
--[[
dialzone {name} - Outgoing zone.
uses - Outgoing line to use: TYPE/Name
match (list) - Number to match
countrycode - The effective country code of this dialzone
international (list) - International prefix to match
localzone - dialzone for local numbers
addprefix - Prexix required to dial out.
localprefix - Prefix for a local call
]]
--
-- SIP dialzone configuration
--
if arg[1] then
cbimap = Map("asterisk", "Edit Dialplan Entry")
entry = cbimap:section(NamedSection, arg[1])
back = entry:option(DummyValue, "_overview", "Back to dialplan overview")
back.value = ""
back.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans")
desc = entry:option(Value, "description", "Description")
function desc.cfgvalue(self, s, ...)
return Value.cfgvalue(self, s, ...) or s
end
match = entry:option(DynamicList, "match", "Number matches")
intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)")
trunk = entry:option(MultiValue, "uses", "Used trunk")
for _, v in ipairs(find_trunks(cbimap.uci)) do
trunk:value(unpack(v))
end
aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)")
--ast.idd.cbifill(aprefix)
ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)")
ast.cc.cbifill(ccode)
lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers")
lzone:value("", "no special treatment of local numbers")
for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do
lzone:value(unpack(v))
end
lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)")
return cbimap
end

View file

@ -1,103 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
cbimap = Map("asterisk", "Registered Trunks")
cbimap.pageaction = false
local sip_peers = { }
cbimap.uci:foreach("asterisk", "sip",
function(s)
if s.type == "peer" then
s.name = s['.name']
s.info = ast.sip.peer(s.name)
sip_peers[s.name] = s
end
end)
sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks")
sip_table.template = "cbi/tblsection"
sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s")
sip_table.addremove = true
sip_table.sectionhead = "Extension"
function sip_table.filter(self, s)
return s and (
cbimap.uci:get("asterisk", s, "type") == nil or
cbimap.uci:get_bool("asterisk", s, "provider")
)
end
function sip_table.create(self, section)
if TypedSection.create(self, section) then
created = section
else
self.invalid_cts = true
end
end
function sip_table.parse(self, ...)
TypedSection.parse(self, ...)
if created then
cbimap.uci:tset("asterisk", created, {
type = "friend",
qualify = "yes",
provider = "yes"
})
cbimap.uci:save("asterisk")
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "trunks", "sip", created
))
end
end
user = sip_table:option(DummyValue, "username", "Username")
host = sip_table:option(DummyValue, "host", "Hostname")
function host.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.address then
return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port }
else
return "n/a"
end
end
context = sip_table:option(DummyValue, "context", "Dialplan")
context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
function context.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "(default)"
end
online = sip_table:option(DummyValue, "online", "Registered")
function online.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online == nil then
return "n/a"
else
return sip_peers[s] and sip_peers[s].info.online
and "yes" or "no (%s)" %{
sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
}
end
end
delay = sip_table:option(DummyValue, "delay", "Delay")
function delay.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online then
return "%i ms" % sip_peers[s].info.delay
else
return "n/a"
end
end
info = sip_table:option(Button, "_info", "Info")
function info.write(self, s)
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "trunks", "sip", s, "info"
))
end
return cbimap

View file

@ -1,123 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
local uci = require("luci.model.uci").cursor()
--[[
Dialzone overview table
]]
if not arg[1] then
zonemap = Map("asterisk", "Dial Zones", [[
Dial zones hold patterns of dialed numbers to match.
Each zone has one or more trunks assigned. If the first trunk is
congested, Asterisk will try to use the next available connection.
If all trunks fail, then the following zones in the parent dialplan
are tried.
]])
local zones, znames = ast.dialzone.zones()
zonetbl = zonemap:section(Table, zones, "Zone Overview")
zonetbl.sectionhead = "Zone"
zonetbl.addremove = true
zonetbl.anonymous = false
zonetbl.extedit = luci.dispatcher.build_url(
"admin", "asterisk", "dialplans", "zones", "%s"
)
function zonetbl.cfgsections(self)
return znames
end
function zonetbl.parse(self)
for k, v in pairs(self.map:formvaluetable(
luci.cbi.REMOVE_PREFIX .. self.config
) or {}) do
if k:sub(-2) == ".x" then k = k:sub(1, #k - 2) end
uci:delete("asterisk", k)
uci:save("asterisk")
self.data[k] = nil
for i = 1,#znames do
if znames[i] == k then
table.remove(znames, i)
break
end
end
end
Table.parse(self)
end
zonetbl:option(DummyValue, "description", "Description")
zonetbl:option(DummyValue, "addprefix")
match = zonetbl:option(DummyValue, "matches")
function match.cfgvalue(self, s)
return table.concat(zones[s].matches, ", ")
end
trunks = zonetbl:option(DummyValue, "trunk")
trunks.template = "asterisk/cbi/cell"
function trunks.cfgvalue(self, s)
return ast.tools.hyperlinks(zones[s].trunks)
end
return zonemap
--[[
Zone edit form
]]
else
zoneedit = Map("asterisk", "Edit Dialzone")
entry = zoneedit:section(NamedSection, arg[1])
entry.title = "Zone %q" % arg[1];
back = entry:option(DummyValue, "_overview", "Back to dialzone overview")
back.value = ""
back.titleref = luci.dispatcher.build_url(
"admin", "asterisk", "dialplans", "zones"
)
desc = entry:option(Value, "description", "Description")
function desc.cfgvalue(self, s, ...)
return Value.cfgvalue(self, s, ...) or s
end
trunks = entry:option(MultiValue, "uses", "Used trunks")
trunks.widget = "checkbox"
uci:foreach("asterisk", "sip",
function(s)
if s.provider == "yes" then
trunks:value(
"SIP/%s" % s['.name'],
"SIP/%s (%s)" %{ s['.name'], s.host or 'n/a' }
)
end
end)
match = entry:option(DynamicList, "match", "Number matches")
intl = entry:option(DynamicList, "international", "Intl. prefix matches (optional)")
aprefix = entry:option(Value, "addprefix", "Add prefix to dial out (optional)")
ccode = entry:option(Value, "countrycode", "Effective countrycode (optional)")
lzone = entry:option(ListValue, "localzone", "Dialzone for local numbers")
lzone:value("", "no special treatment of local numbers")
for _, z in ipairs(ast.dialzone.zones()) do
lzone:value(z.name, "%q (%s)" %{ z.name, z.description })
end
--for _, v in ipairs(find_outgoing_contexts(zoneedit.uci)) do
-- lzone:value(unpack(v))
--end
lprefix = entry:option(Value, "localprefix", "Prefix for local calls (optional)")
return zoneedit
end

View file

@ -1,38 +0,0 @@
-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require "luci.asterisk"
cbimap = Map("asterisk", "MeetMe - Rooms")
meetme = cbimap:section(TypedSection, "meetme", "MeetMe Rooms")
meetme.addremove = true
meetme.anonymous = true
meetme.template = "cbi/tblsection"
meetme:option(Value, "_description", "Description", "Short room description")
room = meetme:option(Value, "room", "Room Number", "Unique room identifier")
function room.write(self, s, val)
if val and #val > 0 then
local old = self:cfgvalue(s)
self.map.uci:foreach("asterisk", "dialplanmeetme",
function(v)
if v.room == old then
self.map:set(v['.name'], "room", val)
end
end)
Value.write(self, s, val)
end
end
meetme:option(Value, "pin", "PIN", "PIN required to access")
meetme:option(Value, "adminpin", "Admin PIN", "PIN required for administration")
function meetme.remove(self, s)
return ast.meetme.remove(self.map:get(s, "room"), self.map.uci)
end
return cbimap

View file

@ -1,17 +0,0 @@
-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
cbimap = Map("asterisk", "MeetMe - Common Settings",
"Common settings for MeetMe phone conferences.")
meetme = cbimap:section(TypedSection, "meetmegeneral", "General MeetMe Options")
meetme.addremove = false
meetme.anonymous = true
audiobuffers = meetme:option(ListValue, "audiobuffers",
"Number of 20ms audio buffers to use for conferences")
for i = 2, 32 do audiobuffers:value(i) end
return cbimap

View file

@ -1,145 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
local function find_outgoing_contexts(uci)
local c = { }
local h = { }
uci:foreach("asterisk", "dialplan",
function(s)
if not h[s['.name']] then
c[#c+1] = { s['.name'], "Dialplan: %s" % s['.name'] }
h[s['.name']] = true
end
end)
return c
end
local function find_incoming_contexts(uci)
local c = { }
local h = { }
uci:foreach("asterisk", "sip",
function(s)
if s.context and not h[s.context] and
uci:get_bool("asterisk", s['.name'], "provider")
then
c[#c+1] = { s.context, "Incoming: %s" % s['.name'] or s.context }
h[s.context] = true
end
end)
return c
end
--
-- SIP phone info
--
if arg[2] == "info" then
form = SimpleForm("asterisk", "SIP Phone Information")
form.reset = false
form.submit = "Back to overview"
local info, keys = ast.sip.peer(arg[1])
local data = { }
for _, key in ipairs(keys) do
data[#data+1] = {
key = key,
val = type(info[key]) == "boolean"
and ( info[key] and "yes" or "no" )
or ( info[key] == nil or #info[key] == 0 )
and "(none)"
or tostring(info[key])
}
end
itbl = form:section(Table, data, "SIP Phone %q" % arg[1])
itbl:option(DummyValue, "key", "Key")
itbl:option(DummyValue, "val", "Value")
function itbl.parse(...)
luci.http.redirect(
luci.dispatcher.build_url("admin", "asterisk", "phones")
)
end
return form
--
-- SIP phone configuration
--
elseif arg[1] then
cbimap = Map("asterisk", "Edit SIP Client")
peer = cbimap:section(NamedSection, arg[1])
peer.hidden = {
type = "friend",
qualify = "yes",
host = "dynamic",
nat = "no",
canreinvite = "no"
}
back = peer:option(DummyValue, "_overview", "Back to phone overview")
back.value = ""
back.titleref = luci.dispatcher.build_url("admin", "asterisk", "phones")
active = peer:option(Flag, "disable", "Account enabled")
active.enabled = "yes"
active.disabled = "no"
function active.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "yes"
end
exten = peer:option(Value, "extension", "Extension Number")
cbimap.uci:foreach("asterisk", "dialplanexten",
function(s)
exten:value(
s.extension,
"%s (via %s/%s)" %{ s.extension, s.type:upper(), s.target }
)
end)
display = peer:option(Value, "callerid", "Display Name")
username = peer:option(Value, "username", "Authorization ID")
password = peer:option(Value, "secret", "Authorization Password")
password.password = true
regtimeout = peer:option(Value, "registertimeout", "Registration Time Value")
function regtimeout.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "60"
end
sipport = peer:option(Value, "port", "SIP Port")
function sipport.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "5060"
end
linekey = peer:option(ListValue, "_linekey", "Linekey Mode (broken)")
linekey:value("", "Off")
linekey:value("trunk", "Trunk Appearance")
linekey:value("call", "Call Appearance")
dialplan = peer:option(ListValue, "context", "Assign Dialplan")
dialplan.titleref = luci.dispatcher.build_url("admin", "asterisk", "dialplans")
for _, v in ipairs(find_outgoing_contexts(cbimap.uci)) do
dialplan:value(unpack(v))
end
incoming = peer:option(StaticList, "incoming", "Receive incoming calls from")
for _, v in ipairs(find_incoming_contexts(cbimap.uci)) do
incoming:value(unpack(v))
end
--function incoming.cfgvalue(...)
--error(table.concat(MultiValue.cfgvalue(...),"."))
--end
return cbimap
end

View file

@ -1,104 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
cbimap = Map("asterisk", "Registered Phones")
cbimap.pageaction = false
local sip_peers = { }
cbimap.uci:foreach("asterisk", "sip",
function(s)
if s.type ~= "peer" then
s.name = s['.name']
s.info = ast.sip.peer(s.name)
sip_peers[s.name] = s
end
end)
sip_table = cbimap:section(TypedSection, "sip", "SIP Phones")
sip_table.template = "cbi/tblsection"
sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "phones", "sip", "%s")
sip_table.addremove = true
function sip_table.filter(self, s)
return s and not cbimap.uci:get_bool("asterisk", s, "provider")
end
function sip_table.create(self, section)
if TypedSection.create(self, section) then
created = section
cbimap.uci:tset("asterisk", section, {
type = "friend",
qualify = "yes",
provider = "no",
host = "dynamic",
nat = "no",
canreinvite = "no",
extension = section:match("^%d+$") and section or "",
username = section:match("^%d+$") and section or ""
})
else
self.invalid_cts = true
end
end
function sip_table.parse(self, ...)
TypedSection.parse(self, ...)
if created then
cbimap.uci:save("asterisk")
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "phones", "sip", created
))
end
end
user = sip_table:option(DummyValue, "username", "Username")
function user.cfgvalue(self, s)
return sip_peers[s] and sip_peers[s].callerid or
AbstractValue.cfgvalue(self, s)
end
host = sip_table:option(DummyValue, "host", "Hostname")
function host.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.address then
return "%s:%i" %{ sip_peers[s].info.address, sip_peers[s].info.port }
else
return "n/a"
end
end
context = sip_table:option(DummyValue, "context", "Dialplan")
context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
online = sip_table:option(DummyValue, "online", "Registered")
function online.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online == nil then
return "n/a"
else
return sip_peers[s] and sip_peers[s].info.online
and "yes" or "no (%s)" % {
sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
}
end
end
delay = sip_table:option(DummyValue, "delay", "Delay")
function delay.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online then
return "%i ms" % sip_peers[s].info.delay
else
return "n/a"
end
end
info = sip_table:option(Button, "_info", "Info")
function info.write(self, s)
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "phones", "sip", s, "info"
))
end
return cbimap

View file

@ -1,86 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
--
-- SIP trunk info
--
if arg[2] == "info" then
form = SimpleForm("asterisk", "SIP Trunk Information")
form.reset = false
form.submit = "Back to overview"
local info, keys = ast.sip.peer(arg[1])
local data = { }
for _, key in ipairs(keys) do
data[#data+1] = {
key = key,
val = type(info[key]) == "boolean"
and ( info[key] and "yes" or "no" )
or ( info[key] == nil or #info[key] == 0 )
and "(none)"
or tostring(info[key])
}
end
itbl = form:section(Table, data, "SIP Trunk %q" % arg[1])
itbl:option(DummyValue, "key", "Key")
itbl:option(DummyValue, "val", "Value")
function itbl.parse(...)
luci.http.redirect(
luci.dispatcher.build_url("admin", "asterisk", "trunks")
)
end
return form
--
-- SIP trunk config
--
elseif arg[1] then
cbimap = Map("asterisk", "Edit SIP Trunk")
peer = cbimap:section(NamedSection, arg[1])
peer.hidden = {
type = "peer",
qualify = "yes",
}
back = peer:option(DummyValue, "_overview", "Back to trunk overview")
back.value = ""
back.titleref = luci.dispatcher.build_url("admin", "asterisk", "trunks")
sipdomain = peer:option(Value, "host", "SIP Domain")
sipport = peer:option(Value, "port", "SIP Port")
function sipport.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "5060"
end
username = peer:option(Value, "username", "Authorization ID")
password = peer:option(Value, "secret", "Authorization Password")
password.password = true
outboundproxy = peer:option(Value, "outboundproxy", "Outbound Proxy")
outboundport = peer:option(Value, "outboundproxyport", "Outbound Proxy Port")
register = peer:option(Flag, "register", "Register with peer")
register.enabled = "yes"
register.disabled = "no"
regext = peer:option(Value, "registerextension", "Extension to register (optional)")
regext:depends({register="1"})
didval = peer:option(ListValue, "_did", "Number of assigned DID numbers")
didval:value("", "(none)")
for i=1,24 do didval:value(i) end
dialplan = peer:option(ListValue, "context", "Dialplan Context")
dialplan:value(arg[1] .. "_inbound", "(default)")
cbimap.uci:foreach("asterisk", "dialplan",
function(s) dialplan:value(s['.name']) end)
return cbimap
end

View file

@ -1,94 +0,0 @@
-- Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require("luci.asterisk")
cbimap = Map("asterisk", "Trunks")
cbimap.pageaction = false
local sip_peers = { }
cbimap.uci:foreach("asterisk", "sip",
function(s)
if s.type == "peer" then
s.name = s['.name']
s.info = ast.sip.peer(s.name)
sip_peers[s.name] = s
end
end)
sip_table = cbimap:section(TypedSection, "sip", "SIP Trunks")
sip_table.template = "cbi/tblsection"
sip_table.extedit = luci.dispatcher.build_url("admin", "asterisk", "trunks", "sip", "%s")
sip_table.addremove = true
sip_table.sectionhead = "Extension"
function sip_table.filter(self, s)
return s and (
cbimap.uci:get("asterisk", s, "type") == nil or
cbimap.uci:get_bool("asterisk", s, "provider")
)
end
function sip_table.create(self, section)
if TypedSection.create(self, section) then
created = section
else
self.invalid_cts = true
end
end
function sip_table.parse(self, ...)
TypedSection.parse(self, ...)
if created then
cbimap.uci:tset("asterisk", created, {
type = "friend",
qualify = "yes",
provider = "yes"
})
cbimap.uci:save("asterisk")
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "trunks", "sip", created
))
end
end
user = sip_table:option(DummyValue, "username", "Username")
context = sip_table:option(DummyValue, "context", "Dialplan")
context.href = luci.dispatcher.build_url("admin", "asterisk", "dialplan")
function context.cfgvalue(...)
return AbstractValue.cfgvalue(...) or "(default)"
end
online = sip_table:option(DummyValue, "online", "Registered")
function online.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online == nil then
return "n/a"
else
return sip_peers[s] and sip_peers[s].info.online
and "yes" or "no (%s)" %{
sip_peers[s] and sip_peers[s].info.Status:lower() or "unknown"
}
end
end
delay = sip_table:option(DummyValue, "delay", "Delay")
function delay.cfgvalue(self, s)
if sip_peers[s] and sip_peers[s].info.online then
return "%i ms" % sip_peers[s].info.delay
else
return "n/a"
end
end
info = sip_table:option(Button, "_info", "Info")
function info.write(self, s)
luci.http.redirect(luci.dispatcher.build_url(
"admin", "asterisk", "trunks", "sip", s, "info"
))
end
return cbimap

View file

@ -1,48 +0,0 @@
-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local ast = require "luci.asterisk"
cbimap = Map("asterisk", "Voicemail - Mailboxes")
voicemail = cbimap:section(TypedSection, "voicemail", "Voicemail Boxes")
voicemail.addremove = true
voicemail.anonymous = true
voicemail.template = "cbi/tblsection"
context = voicemail:option(ListValue, "context", "Context")
context:value("default")
number = voicemail:option(Value, "number",
"Mailbox Number", "Unique mailbox identifier")
function number.write(self, s, val)
if val and #val > 0 then
local old = self:cfgvalue(s)
self.map.uci:foreach("asterisk", "dialplanvoice",
function(v)
if v.voicebox == old then
self.map:set(v['.name'], "voicebox", val)
end
end)
Value.write(self, s, val)
end
end
voicemail:option(Value, "name", "Ownername", "Human readable display name")
voicemail:option(Value, "password", "Password", "Access protection")
voicemail:option(Value, "email", "eMail", "Where to send voice messages")
voicemail:option(Value, "page", "Pager", "Pager number")
zone = voicemail:option(ListValue, "zone", "Timezone", "Used time format")
zone.titleref = luci.dispatcher.build_url("admin/asterisk/voicemail/settings")
cbimap.uci:foreach("asterisk", "voicezone",
function(s) zone:value(s['.name']) end)
function voicemail.remove(self, s)
return ast.voicemail.remove(self.map:get(s, "number"), self.map.uci)
end
return cbimap

View file

@ -1,51 +0,0 @@
-- Copyright 2009 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
require "luci.sys.zoneinfo"
cbimap = Map("asterisk", "Voicemail - Common Settings")
voicegeneral = cbimap:section(TypedSection, "voicegeneral",
"General Voicemail Options", "Common settings for all mailboxes are " ..
"defined here. Most of them are optional. The storage format should " ..
"never be changed once set.")
voicegeneral.anonymous = true
voicegeneral.addremove = false
format = voicegeneral:option(MultiValue, "Used storage formats")
format.widget = "checkbox"
format:value("wav49")
format:value("gsm")
format:value("wav")
voicegeneral:option(Flag, "sendvoicemail", "Enable sending of emails")
voicegeneral:option(Flag, "attach", "Attach voice messages to emails")
voicegeneral:option(Value, "serveremail", "Used email sender address")
voicegeneral:option(Value, "emaildateformat", "Date format used in emails").optional = true
voicegeneral:option(Value, "maxlogins", "Max. failed login attempts").optional = true
voicegeneral:option(Value, "maxmsg", "Max. allowed messages per mailbox").optional = true
voicegeneral:option(Value, "minmessage", "Min. number of seconds for voicemail").optional = true
voicegeneral:option(Value, "maxmessage", "Max. number of seconds for voicemail").optional = true
voicegeneral:option(Value, "maxsilence", "Seconds of silence until stop recording").optional = true
voicegeneral:option(Value, "maxgreet", "Max. number of seconds for greetings").optional = true
voicegeneral:option(Value, "skipms", "Milliseconds to skip for rew./ff.").optional = true
voicegeneral:option(Value, "silencethreshold", "Threshold to detect silence").optional = true
voicezone = cbimap:section(TypedSection, "voicezone", "Time Zones",
"Time zones define how dates and times are expressen when used in " ..
"an voice mails. Refer to the asterisk manual for placeholder values.")
voicezone.addremove = true
voicezone.sectionhead = "Name"
voicezone.template = "cbi/tblsection"
tz = voicezone:option(ListValue, "zone", "Location")
for _, z in ipairs(luci.sys.zoneinfo.TZ) do tz:value(z[1]) end
voicezone:option(Value, "message", "Date Format")
return cbimap

View file

@ -1,13 +0,0 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+cbi/valueheader%>
<% if self.href then %><a href="<%=self.href%>"><% end -%>
<%=self:cfgvalue(section)%>
<%- if self.href then %></a><%end%>
&#160;
<input type="hidden" id="<%=cbid%>" value="<%=luci.util.pcdata(self:cfgvalue(section))%>" />
<%+cbi/valuefooter%>

View file

@ -1,244 +0,0 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
<%
local uci = luci.model.uci.cursor_state()
local ast = require "luci.asterisk"
function digit_pattern(s,t)
return "<code style='padding: 2px; border:1px solid #CCCCCC; background-color: #FFFFFF'%s>%s</code>"
%{ t and " title='" .. t .. "'" or "", s }
end
function rowstyle(i)
return "cbi-rowstyle-%i" %{
( i % 2 ) == 0 and 2 or 1
}
end
function format_matches(z)
local html = { }
if type(z) ~= "table" then
z = { matches = { z } }
end
if z.localprefix then
for _, m in ipairs(z.matches) do
html[#html+1] =
digit_pattern(z.localprefix, "local prefix") .. " " ..
digit_pattern(m)
end
end
if z.intlmatches and #z.intlmatches > 0 then
for _, i in ipairs(z.intlmatches) do
for _, m in ipairs(z.matches) do
html[#html+1] = "%s %s" %{
digit_pattern("(%s)" % i, "intl. prefix"),
digit_pattern(m)
}
end
end
else
for _, m in ipairs(z.matches) do
html[#html+1] = digit_pattern(m)
end
end
return table.concat(html, "; ")
end
%>
<form method="post" action="<%=url('admin/asterisk/dialplans')%>" enctype="multipart/form-data">
<div>
<input type="hidden" name="cbi.submit" value="1" />
<input type="submit" value="Save" class="hidden" />
</div>
<div class="cbi-map" id="cbi-asterisk">
<h2 name="content">Outgoing Call Routing</h2>
<div class="cbi-map-descr">
Here you can manage your dial plans which are used to route outgoing calls from your local extensions.<br /><br />
Related tasks:<br />
<a href="<%=url('admin/asterisk/dialplans/zones')%>" class="cbi-title-ref">Manage dialzones</a> |
<a href="<%=url('admin/asterisk/voicemail/mailboxes')%>" class="cbi-title-ref">Manage voicemail boxes</a> |
<a href="<%=url('admin/asterisk/meetme/rooms')%>" class="cbi-title-ref">Manage meetme rooms</a>
</div>
<!-- tblsection -->
<fieldset class="cbi-section" id="cbi-asterisk-sip">
<!--<legend>Dialplans</legend>-->
<div class="cbi-section-descr"></div>
<% for i, plan in pairs(ast.dialplan.plans()) do %>
<div class="cbi-section-node">
<div class="table cbi-section-table">
<div class="tr cbi-section-table-titles">
<div style="text-align: left; padding: 3px" class="th cbi-section-table-cell">
<big>Dialplan <em><%=plan.name%></em></big>
</div>
<div class="td">
<a href="<%=url('admin/asterisk/dialplans')%>?delplan=<%=plan.name%>">
<img style="border:none" alt="Remove this dialplan" title="Remove this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</div>
</div>
<!-- dialzones -->
<% local zones_used = { }; local row = 0 %>
<% for i, zone in ipairs(plan.zones) do zones_used[zone.name] = true %>
<div class="tr cbi-section-table-row <%=rowstyle(row)%>">
<div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; Dialzone <em><%=zone.name%></em></strong> (<%=zone.description%>)
<p style="padding-left: 1em; margin-bottom:0">
Lines:
<%=ast.tools.hyperlinks(
zone.trunks, function(v)
return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower()
end
)%><br />
Matches:
<%=format_matches(zone)%>
</p>
</div>
<div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/dialplans/out', zone.name)%>">
<img style="border:none" alt="Edit dialzone" title="Edit dialzone" src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delzone.<%=plan.name%>=<%=zone.name%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</div>
</div>
<% row = row + 1; end %>
<!-- /dialzones -->
<!-- voicemail -->
<% local boxes_used = { } %>
<% for ext, box in luci.util.kspairs(plan.voicemailboxes) do boxes_used[box.id] = true %>
<div class="tr cbi-section-table-row <%=rowstyle(row)%>">
<div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; Voicemailbox <em><%=box.id%></em></strong> (<%=box.name%>)
<p style="padding-left: 1em; margin-bottom:0">
Owner: <%=box.name%> |
eMail: <%=#box.email > 0 and box.email or 'n/a'%> |
Pager: <%=#box.page > 0 and box.page or 'n/a'%><br />
Matches: <%=format_matches(ext)%>
</p>
</div>
<div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/voicemail/mailboxes')%>">
<img style="border:none" alt="Manage mailboxes ..." title="Manage mailboxes ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delvbox.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</div>
</div>
<% row = row + 1; end %>
<!-- /voicemail -->
<!-- meetme -->
<% local rooms_used = { } %>
<% for ext, room in luci.util.kspairs(plan.meetmerooms) do rooms_used[room.room] = true %>
<div class="tr cbi-section-table-row <%=rowstyle(row)%>">
<div style="text-align: left; padding: 3px" class="td cbi-section-table-cell">
<strong>&#x2514; MeetMe Room <em><%=room.room%></em></strong>
<% if room.description and #room.description > 0 then %> (<%=room.description%>)<% end %>
<p style="padding-left: 1em; margin-bottom:0">
Matches: <%=format_matches(ext)%>
</p>
</div>
<div style="width:5%" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/meetme/rooms')%>">
<img style="border:none" alt="Manage conferences ..." title="Manage conferences ..." src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans')%>?delmeetme.<%=plan.name%>=<%=ext%>">
<img style="border:none" alt="Remove from this dialplan" title="Remove from this dialplan" src="/luci-static/resources/cbi/remove.gif" />
</a>
</div>
</div>
<% row = row + 1; end %>
<!-- /meetme -->
<div class="tr cbi-section-table-row">
<div style="text-align: left; padding: 3px" class="td cbi-section-table-cell" colspan="2">
<hr style="margin-bottom:0.5em; border-width:0 0 1px 0" />
Add Dialzone:<br />
<select style="width:30%" name="addzone.<%=plan.name%>">
<option value="">-- please select --</option>
<% for _, zone in luci.util.kspairs(ast.dialzone.zones()) do %>
<% if not zones_used[zone.name] then %>
<option value="<%=zone.name%>"><%=zone.name%> (<%=zone.description%>)</option>
<% end %>
<% end %>
</select>
<br /><br />
Add Voicemailbox:<br />
<select style="width:20%" name="addvbox.<%=plan.name%>" onchange="this.form['addvboxext.<%=plan.name%>'].value=this.options[this.selectedIndex].value.split('@')[0]">
<option value="">-- please select --</option>
<% for ext, box in luci.util.kspairs(ast.voicemail.boxes()) do %>
<% if not boxes_used[box.id] then %>
<option value="<%=box.id%>"><%=box.id%> (<%=box.name%>)</option>
<% end %>
<% end %>
</select>
as extension
<input type="text" style="width:5%" name="addvboxext.<%=plan.name%>" />
<br /><br />
Add MeetMe Conference:<br />
<select style="width:20%" name="addmeetme.<%=plan.name%>" onchange="this.form['addmeetmeext.<%=plan.name%>'].value=this.options[this.selectedIndex].value">
<option value="">-- please select --</option>
<% for ext, room in luci.util.kspairs(ast.meetme.rooms()) do %>
<%# if not rooms_used[room.room] then %>
<option value="<%=room.room%>">
<%=room.room%>
<% if room.description and #room.description > 0 then %>(<%=room.description%>)<% end %>
</option>
<%# end %>
<% end %>
</select>
as extension
<input type="text" style="width:5%" name="addmeetmeext.<%=plan.name%>" />
<br /><br />
<input type="submit" class="cbi-button cbi-button-add" value="Add item &raquo;" title="Add item ..."/>
</div>
</div>
</div>
<div class="cbi-section-create cbi-tblsection-create"></div>
</div>
<br />
<% end %>
<div class="cbi-section-node">
<div class="cbi-section-create cbi-tblsection-create" style="padding: 3px">
<h3>Create a new dialplan</h3>
The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .<br />
<%- if create_error then %>
<br /><span style="color:red">Invalid name given!</span><br />
<% end -%>
<br />
<input type="text" class="cbi-section-create-name" name="addplan" style="width:200px" />
<input type="submit" class="cbi-button cbi-button-add" value="Add dialplan" title="Add dialplan"/>
</div>
</div>
</fieldset>
</div>
</form>
<div class="clear"></div>
<%+footer%>

View file

@ -1,164 +0,0 @@
<%#
Copyright 2008 Steven Barth <steven@midlink.org>
Copyright 2008 Jo-Philipp Wich <jow@openwrt.org>
Licensed to the public under the Apache License 2.0.
-%>
<%+header%>
<%
local uci = luci.model.uci.cursor_state()
local ast = require("luci.asterisk")
function digit_pattern(s)
return "<code style='padding: 2px; border:1px solid #CCCCCC; background-color: #FFFFFF'>%s</code>" % s
end
function rowstyle(i)
return "cbi-rowstyle-%i" %{
( i % 2 ) == 0 and 2 or 1
}
end
local function find_trunks()
local t = { }
uci:foreach("asterisk", "sip",
function(s)
if uci:get_bool("asterisk", s['.name'], "provider") then
t[#t+1] = {
"SIP/%s" % s['.name'],
"SIP: %s" % s['.name']
}
end
end)
uci:foreach("asterisk", "iax",
function(s)
t[#t+1] = {
"IAX/%s" % s['.name'],
"IAX: %s" % s.extension or s['.name']
}
end)
return t
end
%>
<form method="post" action="<%=url('admin/asterisk/dialplans/zones')%>" enctype="multipart/form-data">
<div>
<input type="hidden" name="cbi.submit" value="1" />
<input type="submit" value="Save" class="hidden" />
</div>
<div class="cbi-map" id="cbi-asterisk">
<h2 name="content">Dial Zone Management</h2>
<div class="cbi-map-descr">
<a href="<%=url("admin/asterisk/dialplans")%>" class="cbi-title-ref">Back to dialplan overview</a><br /><br />
Here you can manage your dial zones. The zones are used to route outgoing calls to the destination.
Each zone groups multiple trunks and number matches to represent a logical destination. Zones can
also be used to enforce certain dial restrictions on selected extensions.
</div>
<!-- tblsection -->
<fieldset class="cbi-section" id="cbi-asterisk-sip">
<div class="cbi-section-node">
<div class="table cbi-section-table">
<div class="tr cbi-section-table-titles">
<div style="text-align: left; padding: 3px" class="th cbi-section-table-cell" colspan="6">
<h3>Dialzone Overview</h3>
</div>
</div>
<div class="tr cbi-section-table-descr">
<div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Name</div>
<div style="width: 5%; text-align:right" class="th cbi-section-table-cell">Prepend</div>
<div style="width: 20%; text-align:left" class="th cbi-section-table-cell">- Match</div>
<div style="text-align:left" class="th cbi-section-table-cell">Trunk</div>
<div style="width: 35%; text-align:left" class="th cbi-section-table-cell">Description</div>
<div style="width: 4%; text-align:left" class="th cbi-section-table-cell"></div>
</div>
<% for i, rule in pairs(ast.dialzone.zones()) do %>
<div class="tr cbi-section-table-row <%=rowstyle(i)%>">
<div style="text-align:right" class="td cbi-value-field">
<%=rule.name%>
</div>
<div style="text-align:right" class="td cbi-value-field">
<% for _ in ipairs(rule.matches) do %>
<%=rule.addprefix and digit_pattern(rule.addprefix)%>&#160;<br />
<% end %>
</div>
<div style="text-align:left" class="td cbi-value-field">
<% for _, m in ipairs(rule.matches) do %>
<%=rule.localprefix and "%s " % digit_pattern(rule.localprefix)%>
<%=digit_pattern(m)%><br />
<% end %>
</div>
<div style="text-align:left" class="td cbi-value-field">
<%=ast.tools.hyperlinks(
rule.trunks, function(v)
return luci.dispatcher.build_url("admin", "asterisk", "trunks", "%s") % v:lower()
end
)%>
</div>
<div style="text-align:left" class="td cbi-value-field">
<%=rule.description or rule.name%>
</div>
<div style="text-align:left" class="td cbi-value-field">
<a href="<%=url('admin/asterisk/dialplans/out', rule.name)%>">
<img style="border:none" alt="Edit entry" title="Edit entry" src="/luci-static/resources/cbi/edit.gif" />
</a>
<a href="<%=url('admin/asterisk/dialplans/zones')%>?delzone=<%=rule.name%>">
<img style="border:none" alt="Delete entry" title="Delete entry" src="/luci-static/resources/cbi/remove.gif" />
</a>
</div>
</div>
<% end %>
</div>
<div class="cbi-section-create cbi-tblsection-create"></div>
</div>
<br />
<div class="cbi-section-node">
<div class="cbi-section-create cbi-tblsection-create" style="padding: 3px">
<h3>Create a new dialzone</h3>
The name is required and must be unique. It may only contain the characters A-Z, a-z, 0-9 and _ .<br />
You can specifiy multiple number matches by separating them with spaces.<br />
<%- if create_error then %>
<br /><span style="color:red">Invalid name given!</span><br />
<% end -%>
<div class="table">
<div class="tr">
<div class="td" style="padding:3px">
<label for="create1">1) Name</label><br />
<input type="text" class="cbi-section-create-name" id="create1" name="newzone_name" style="width:200px" />
<br /><br />
<label for="create2">2) Number Match</label><br />
<input type="text" class="cbi-section-create-name" id="create2" name="newzone_match" style="width:200px" />
</div>
<div class="td" style="padding:3px">
<label for="create3">3) Trunks</label><br />
<select class="cbi-input-select" multiple="multiple" id="create3" name="newzone_uses" size="4" style="width:200px">
<% for i, t in ipairs(find_trunks()) do %>
<option value="<%=t[1]%>"><%=t[2]%></option>
<% end %>
</select>
</div>
</div>
</div>
<br />
<input type="submit" class="cbi-button cbi-button-add" name="newzone" value="Add entry" title="Add entry"/>
</div>
</div>
</fieldset>
</div>
</form>
<div class="clear"></div>
<%+footer%>

View file

@ -1,680 +0,0 @@
# asterisk.pot
# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-06-10 03:40+0200\n"
"PO-Revision-Date: 2009-05-31 19:18+0200\n"
"Last-Translator: Eduard Duran <iopahopa@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Pootle 1.1.0\n"
#~ msgid "Asterisk General Options"
#~ msgstr "Opcions Generals d'Asterisk"
#~ msgid "AGI directory"
#~ msgstr "Directori AGI"
#~ msgid "Cache recorded sound files during recording"
#~ msgstr "Desa en memòria cau els sons gravats durant la gravació"
#~ msgid "Debug Level"
#~ msgstr "Nivell de depuració"
#~ msgid "Disable some warnings"
#~ msgstr "Desactiva algunes alertes"
#~ msgid "Dump core on crash"
#~ msgstr "Bolca el nucli en cas de fallada"
#~ msgid "High Priority"
#~ msgstr "Alta Prioritat"
#~ msgid "Initialise Crypto"
#~ msgstr "Inicialitza Crypto"
#~ msgid "Use Internal Timing"
#~ msgstr "Utilitza l'hora interna"
#~ msgid "Log directory"
#~ msgstr "Directori de registres"
#~ msgid "Maximum number of calls allowed"
#~ msgstr "Número màxim de trucades permeses"
#~ msgid "Maximum load to stop accepting new calls"
#~ msgstr "Càrrega màxima per deixar d'acceptar trucades noves"
#~ msgid "Disable console colors"
#~ msgstr "Desactiva els colors de consola"
#~ msgid "Sound files Cache directory"
#~ msgstr "Directori de memòria cau dels fitxers de so"
#~ msgid "The Group to run as"
#~ msgstr "Executa amb els permisos del Grup"
#~ msgid "The User to run as"
#~ msgstr "Executa amb els permisos de l'Usuari"
#~ msgid "Voicemail Spool directory"
#~ msgstr "Directori de bústia de correu"
#~ msgid "Prefix UniquID with system name"
#~ msgstr "Prefixa l'UniquID amb el nom del sistema"
#~ msgid "Build transcode paths via SLINEAR, not directly"
#~ msgstr "Munta les rutes de transcodificació via SLINEAR, no directament"
#~ msgid "Transmit SLINEAR silence while recording a channel"
#~ msgstr "Transmet silenci SLINEAR mentre s'enregistri un canal"
#~ msgid "Verbose Level"
#~ msgstr "Nivell de detall"
#~ msgid "Section dialplan"
#~ msgstr "Secció Dialplan"
#~ msgid "include"
#~ msgstr "inclou"
#~ msgid "Dialplan Extension"
#~ msgstr "Connector Dialplan"
#~ msgid "Dialplan General Options"
#~ msgstr "Opcions generals de Dialplan"
#~ msgid "Allow transfer"
#~ msgstr "Permet la transferència"
#~ msgid "Clear global vars"
#~ msgstr "Buida les variables globals"
#~ msgid "Dialplan Goto"
#~ msgstr "Dialplan Goto"
#~ msgid "Dialplan Conference"
#~ msgstr "Conferència Dialplan"
#~ msgid "Dialplan Time"
#~ msgstr "Dialplan Time"
#~ msgid "Dialplan Voicemail"
#~ msgstr "Bústia de correu Dialplan"
#~ msgid "Dial Zones for Dialplan"
#~ msgstr "Zones de marcatge per Dialplan"
#~ msgid "Prefix to add matching dialplans"
#~ msgstr "Prefix per afegir als Dialplan que coincideixin"
#~ msgid "Match International prefix"
#~ msgstr "Coincideix amb el prefix Internacional"
#~ msgid "Prefix (0) to add/remove to/from international numbers"
#~ msgstr "Prefix (0) per afegir/esborrar a/des de números internacionals"
#~ msgid "localzone"
#~ msgstr "zona local"
#~ msgid "Match plan"
#~ msgstr "Pla coincident"
#~ msgid "Connection to use"
#~ msgstr "Connexió a fer servir"
#~ msgid "Feature Key maps"
#~ msgstr "Mapa de Funcions Principals"
#~ msgid "Attended transfer key"
#~ msgstr "Tecla de transferència assistida"
#~ msgid "Blind transfer key"
#~ msgstr "Tecla de transferència cega"
#~ msgid "Key to Disconnect call"
#~ msgstr "Tecla per desconnectar trucada"
#~ msgid "Key to Park call"
#~ msgstr "Tecla per trucada en espera"
#~ msgid "Parking Feature"
#~ msgstr "Funció de trucada en espera"
#~ msgid "ADSI Park"
#~ msgstr "Trucada en espera ADSI"
#~ msgid "Attended transfer timeout (sec)"
#~ msgstr "Temps d'espera de transferència assistida (seg)"
#~ msgid "One touch record key"
#~ msgstr "Tecla de registre d'un toc"
#~ msgid "Name of call context for parking"
#~ msgstr "Nom del context de la trucada en espera"
#~ msgid "Sound file to play to parked caller"
#~ msgstr "Fitxer de so per reproduir a la trucada en espera"
#~ msgid "Max time (ms) between digits for feature activation"
#~ msgstr "Temps màxim (en ms) entre dígits per l'activació de funció"
#~ msgid "Method to Find Parking slot"
#~ msgstr "Mètode per trobar una ranura de trucada en espera"
#~ msgid "parkedmusicclass"
#~ msgstr "parkedmusicclass"
#~ msgid "Play courtesy tone to"
#~ msgstr "Reprodueix to de cortesia a"
#~ msgid "Enable Parking"
#~ msgstr "Activa les trucades en espera"
#~ msgid "Extension to dial to park"
#~ msgstr "Extensió per marcar per deixar en espera una trucada"
#~ msgid "Parking time (secs)"
#~ msgstr "Temps de trucada en espera (secs)"
#~ msgid "Range of extensions for call parking"
#~ msgstr "Rang d'extensions per trucada en espera"
#~ msgid "Pickup extension"
#~ msgstr "Connector de recol·lecció"
#~ msgid "Seconds to wait between digits when transferring"
#~ msgstr "Segons a esperar entre dígits quan es transfereix"
#~ msgid "sound when attended transfer is complete"
#~ msgstr "so quan es completa la transferència assistida"
#~ msgid "Sound when attended transfer fails"
#~ msgstr "so quan falla la transferència assitida"
#~ msgid "Reload Hardware Config"
#~ msgstr "Recarrega la configuració de maquinari"
#~ msgid "Reboot Method"
#~ msgstr "Mètode de Reinici"
#~ msgid "Parameter"
#~ msgstr "Paràmetre"
#~ msgid "Option type"
#~ msgstr "Tipus d'opció"
#~ msgid "User name"
#~ msgstr "Nom d'usuari"
#~ msgid "IAX General Options"
#~ msgstr "Opcions generals IAX"
#~ msgid "Allow Codecs"
#~ msgstr "Permet Codecs"
#~ msgid "Static"
#~ msgstr "Estàtic"
#~ msgid "Write Protect"
#~ msgstr "Protecció d'escriptura"
#~ msgid "Meetme Conference"
#~ msgstr "Conferència Meetme"
#~ msgid "Admin PIN"
#~ msgstr "PIN d'administrador"
#~ msgid "Meeting PIN"
#~ msgstr "PIN de reunió"
#~ msgid "Meetme Conference General Options"
#~ msgstr "Opcions generals de conferència Meetme"
#~ msgid "Number of 20ms audio buffers to be used"
#~ msgstr "Número de memòries intermitges d'àudio de 20 ms a utilitzar"
#~ msgid "Modules"
#~ msgstr "Mòduls"
#~ msgid "Alarm Receiver Application"
#~ msgstr "Aplicació de recepció d'alarma"
#~ msgid "Authentication Application"
#~ msgstr "Aplicació d'autenticació"
#~ msgid "Make sure asterisk doesn't save CDR"
#~ msgstr "Assegura't que asterisk no desa CDR"
#~ msgid "Check if channel is available"
#~ msgstr "Comprova que el canal estigui disponible"
#~ msgid "Listen in on any channel"
#~ msgstr "Escolta a qualsevol canal"
#~ msgid "Control Playback Application"
#~ msgstr "Aplicació de control de reproducció"
#~ msgid "Cuts up variables"
#~ msgstr "Talla les variables"
#~ msgid "Database access functions"
#~ msgstr "Funcions d'accés a base de dades"
#~ msgid "Dialing Application"
#~ msgstr "Aplicació de marcatge"
#~ msgid "Virtual Dictation Machine Application"
#~ msgstr "Aplicació de màquina de dictat virtual"
#~ msgid "Directed Call Pickup Support"
#~ msgstr "Suport de recollida de trucades adreçades"
#~ msgid "Extension Directory"
#~ msgstr "Directori de connectors"
#~ msgid "DISA (Direct Inward System Access) Application"
#~ msgstr "Aplicació DISA (Direct Inward System Access)"
#~ msgid "Dump channel variables Application"
#~ msgstr "Bolca les variables de canal de l'aplicació"
#~ msgid "Simple Echo Application"
#~ msgstr "Aplicació d'eco simple"
#~ msgid "ENUM Lookup"
#~ msgstr "Consulta ENUM"
#~ msgid "Reevaluates strings"
#~ msgstr "Reavalua cadenes"
#~ msgid "Executes applications"
#~ msgstr "Executa aplicacions"
#~ msgid "External IVR application interface"
#~ msgstr "Interfície d'aplicació IVR externa"
#~ msgid "Fork The CDR into 2 separate entities"
#~ msgstr "Bifurca el CDR en 2 entitats separades"
#~ msgid "Get ADSI CPE ID"
#~ msgstr "Obtingues la ADSI CPE ID"
#~ msgid "Group Management Routines"
#~ msgstr "Rutines de gestió de grup"
#~ msgid "Encode and Stream via icecast and ices"
#~ msgstr "Codifica i emet via icecast i ices"
#~ msgid "Image Transmission Application"
#~ msgstr "Aplicació de transmissió d'imatge"
#~ msgid "Look up Caller*ID name/number from black"
#~ msgstr "Cerca la ID/nom/número de qui truca de negre"
#~ msgid "Look up CallerID Name from local databas"
#~ msgstr "Cerca la ID/nom/número de qui truca de la base de dades local"
#~ msgid "Extension Macros"
#~ msgstr "Macros de connectors"
#~ msgid "A simple math Application"
#~ msgstr "Una aplicació de matemàtiques simple"
#~ msgid "MD5 checksum Application"
#~ msgstr "Aplicació de suma de verificació MD5"
#~ msgid "Digital Milliwatt (mu-law) Test Application"
#~ msgstr "Aplicació de prova de milliwat digital (mu-law)"
#~ msgid "Record a call and mix the audio during the recording"
#~ msgstr "Registra una trucada i mescla l'àudio durant la gravació"
#~ msgid "Call Parking and Announce Application"
#~ msgstr "Aplicació d'anunci de trucades i trucada en espera"
#~ msgid "Trivial Playback Application"
#~ msgstr "Aplicació de reproducció trivial"
#~ msgid "Require phone number to be entered"
#~ msgstr "Requereix que s'entri un número de telèfon"
#~ msgid "True Call Queueing"
#~ msgstr "Encuament de trucades real"
#~ msgid "Random goto"
#~ msgstr "Goto aleatori"
#~ msgid "Read Variable Application"
#~ msgstr "Aplicació de lectura de variables"
#~ msgid "Read in a file"
#~ msgstr "Llegeix en un fitxer"
#~ msgid "Realtime Data Lookup/Rewrite"
#~ msgstr "Cerca/reescriptura de dades en temps real"
#~ msgid "Trivial Record Application"
#~ msgstr "Aplicació d'enregistrament trivial"
#~ msgid "Say time"
#~ msgstr "Digues l'hora"
#~ msgid "Send DTMF digits Application"
#~ msgstr "Envia aplicació de dígits DTMF"
#~ msgid "Send Text Applications"
#~ msgstr "Envia aplicacions de text"
#~ msgid "Set CallerID Application"
#~ msgstr "Estableix l'aplicació CallerID"
#~ msgid "CDR user field apps"
#~ msgstr "Aplicacions de camp d'usuari CDR"
#~ msgid "load => .so ; Set CallerID Name"
#~ msgstr "load =&gt; .so ; Estableix el nom CallerID"
#~ msgid "load => .so ; Set CallerID Number"
#~ msgstr "load =&gt; .so ; Estableix el número CallerID"
#~ msgid "Set RDNIS Number"
#~ msgstr "Estableix el número RDNIS"
#~ msgid "Set ISDN Transfer Capability"
#~ msgstr "Estableix la capacitat de transferència XDSI"
#~ msgid "SMS/PSTN handler"
#~ msgstr "Gestor SMS/PSTN"
#~ msgid "Hangs up the requested channel"
#~ msgstr "Penja el canal sol·licitat"
#~ msgid "Stack Routines"
#~ msgstr "Rutines de pila"
#~ msgid "Generic System() application"
#~ msgstr "Aplicació genèrica de System()"
#~ msgid "Playback with Talk Detection"
#~ msgstr "Playback amb Detecció de Parla"
#~ msgid "Interface Test Application"
#~ msgstr "Aplicació de proves d'interfície"
#~ msgid "Transfer"
#~ msgstr "Transfereix"
#~ msgid "TXTCIDName"
#~ msgstr "TXTCIDName"
#~ msgid "Send URL Applications"
#~ msgstr "Envia aplicacions d'URL"
#~ msgid "Custom User Event Application"
#~ msgstr "Aplicació d'esdeveniments personalitzats d'usuari"
#~ msgid "Send verbose output"
#~ msgstr "Envia sortida detallada"
#~ msgid "Voicemail"
#~ msgstr "Bústia de veu"
#~ msgid "Waits until first ring after time"
#~ msgstr "Espera fins el primer to després del temps"
#~ msgid "Wait For Silence Application"
#~ msgstr "Espera l'aplicació de silenci"
#~ msgid "While Loops and Conditional Execution"
#~ msgstr "Execució de bucles while i condicionals"
#~ msgid "Comma Separated Values CDR Backend"
#~ msgstr "Valors de Backend CDR separats per comes"
#~ msgid "Customizable Comma Separated Values CDR Backend"
#~ msgstr "Valors de Backend CDR personalitzats separats per comes"
#~ msgid "Asterisk Call Manager CDR Backend"
#~ msgstr "Backend CDR del gestor de trucades Asterisk"
#~ msgid "MySQL CDR Backend"
#~ msgstr "Backend CDR MySQL"
#~ msgid "PostgreSQL CDR Backend"
#~ msgstr "Backend CDR PostgreSQL"
#~ msgid "SQLite CDR Backend"
#~ msgstr "Backend CDR SQLite"
#~ msgid "Agent Proxy Channel"
#~ msgstr "Canal de l'Agent Proxy"
#~ msgid "Option chan_iax2"
#~ msgstr "Opció chan_iax2"
#~ msgid "Local Proxy Channel"
#~ msgstr "Canal de proxy local"
#~ msgid "Session Initiation Protocol (SIP)"
#~ msgstr "Protocol d'inicialització de sessió (SIP)"
#~ msgid "Adaptive Differential PCM Coder/Decoder"
#~ msgstr "Codificador/Decodificador PCM adaptatiu diferencial"
#~ msgid "A-law Coder/Decoder"
#~ msgstr "Codificador/Decodificador de llei A"
#~ msgid "A-law and Mulaw direct Coder/Decoder"
#~ msgstr "Codificador/Decodificador directe de llei A i Mu"
#~ msgid "ITU G.726-32kbps G726 Transcoder"
#~ msgstr "Transcodificador ITU G.726-32kbps G726"
#~ msgid "GSM/PCM16 (signed linear) Codec Translation"
#~ msgstr "Còdec de traducció GSM/PCM16 (lineal amb signe)"
#~ msgid "Speex/PCM16 (signed linear) Codec Translator"
#~ msgstr "Còdec de traducció Speex/PCM16 (lineal amb signe)"
#~ msgid "Mu-law Coder/Decoder"
#~ msgstr "Codificador/Decodificador llei Mu"
#~ msgid "Sun Microsystems AU format (signed linear)"
#~ msgstr "Format AU de Sun Microsystems (lineal amb signe)"
#~ msgid "G.723.1 Simple Timestamp File Format"
#~ msgstr "Format de fitxer de marca de temps simple G.723.1"
#~ msgid "Raw G.726 (16/24/32/40kbps) data"
#~ msgstr "Dades Raw G.726 (16/24/32/40kbps)"
#~ msgid "Raw G729 data"
#~ msgstr "Dades Raw G729"
#~ msgid "Raw GSM data"
#~ msgstr "Dades Raw GSM"
#~ msgid "Raw h263 data"
#~ msgstr "Dades Raw h263"
#~ msgid "JPEG (Joint Picture Experts Group) Image"
#~ msgstr "Imatge JPEG (Joint Picture Experts Group)"
#~ msgid "Raw uLaw 8khz Audio support (PCM)"
#~ msgstr "Suport d'àudio Raw llei-u 8khz (PCM)"
#~ msgid "load => .so ; Raw aLaw 8khz PCM Audio support"
#~ msgstr "load =&gt; .so ; suport d'àudio Raw llei-a 8khz PCM"
#~ msgid "Raw Signed Linear Audio support (SLN)"
#~ msgstr "Suport d'àudio Raw amb signe lineal (SLN)"
#~ msgid "Dialogic VOX (ADPCM) File Format"
#~ msgstr "Format de fitxer Dialogic VOX (ADPCM)"
#~ msgid "Microsoft WAV format (8000hz Signed Line"
#~ msgstr "Format Microsoft WAV (8000hz amb signe lineal)"
#~ msgid "Microsoft WAV format (Proprietary GSM)"
#~ msgstr "Format Microsoft WAV (GSM propietari)"
#~ msgid "Caller ID related dialplan functions"
#~ msgstr "Functions de dialplan relacionades amb la ID de qui truca"
#~ msgid "ENUM Functions"
#~ msgstr "Funcions ENUM"
#~ msgid "URI encoding / decoding functions"
#~ msgstr "Funcions de codificació / decodificació d'URI"
#~ msgid "Asterisk Extension Language Compiler"
#~ msgstr "Compilador del llenguatge de connectors d'Asterisk"
#~ msgid "Text Extension Configuration"
#~ msgstr "Configuració del connector de text"
#~ msgid "load => .so ; Builtin dialplan functions"
#~ msgstr "load =&gt; .s ; Funcions integrades dialplan"
#~ msgid "Loopback Switch"
#~ msgstr "Switch loopback"
#~ msgid "Realtime Switch"
#~ msgstr "Switch en temps real"
#~ msgid "Outgoing Spool Support"
#~ msgstr "Suport de gestió de cues sortint"
#~ msgid "Wil Cal U (Auto Dialer)"
#~ msgstr "Wil Cal U (Auto Marcatge)"
#~ msgid "MySQL Config Resource"
#~ msgstr "Configuració del recurs MySQL"
#~ msgid "ODBC Config Resource"
#~ msgstr "Configuració del recurs ODBC"
#~ msgid "PGSQL Module"
#~ msgstr "Mòdul PGSQL"
#~ msgid "Cryptographic Digital Signatures"
#~ msgstr "Signatures digitals criptogràfiques"
#~ msgid "Call Parking Resource"
#~ msgstr "Recurs de trucada en espera"
#~ msgid "Indications Configuration"
#~ msgstr "Configuració d'indicacions"
#~ msgid "Call Monitoring Resource"
#~ msgstr "Recurs de monitoreig de trucades"
#~ msgid "Music On Hold Resource"
#~ msgstr "Recurs de música en espera"
#~ msgid "ODBC Resource"
#~ msgstr "Recurs ODBC"
#~ msgid "SMDI Module"
#~ msgstr "Mòdul SMDI"
#~ msgid "SNMP Module"
#~ msgstr "Mòdul SNMP"
#~ msgid "Music On Hold"
#~ msgstr "Música en espera"
#~ msgid "Application"
#~ msgstr "Aplicació"
#~ msgid "Directory of Music"
#~ msgstr "Directori de música"
#~ msgid "Option mode"
#~ msgstr "Mode d'opció"
#~ msgid "Random Play"
#~ msgstr "Reproducció aleatòria"
#~ msgid "DTMF mode"
#~ msgstr "Mode DTMF"
#~ msgid "Primary domain identity for From: headers"
#~ msgstr "Domini d'identitat primari per les capçaleres From:"
#~ msgid "From user (required by many SIP providers)"
#~ msgstr "Usuari d'inici (requerit per diversos proveïdors SIP)"
#~ msgid "Ring on incoming dialplan contexts"
#~ msgstr "Truca en contextos d'entrades dialplan"
#~ msgid "Allow Insecure for"
#~ msgstr "Permet insegur per"
#~ msgid "Mailbox for MWI"
#~ msgstr "Bústia de veu per MWI"
#~ msgid "NAT between phone and Asterisk"
#~ msgstr "NAT entre el telèfon i l'Asterisk"
#~ msgid "Check tags in headers"
#~ msgstr "Comprova etiquetes a les capçaleres"
#~ msgid "Reply Timeout (ms) for down connection"
#~ msgstr "Temps d'esperi per contestar (ms) per caigudes de connexió"
#~ msgid "Register connection"
#~ msgstr "Registra connexió"
#~ msgid "Dial own extension for mailbox"
#~ msgstr "Truca el propi connector per la bústia de veu"
#~ msgid "Client Type"
#~ msgstr "Tipus de client"
#~ msgid "Username"
#~ msgstr "Nom d'usuari"
#~ msgid "Section sipgeneral"
#~ msgstr "Secció sipgeneral"
#~ msgid "Allow codecs"
#~ msgstr "Permet còdecs"
#~ msgid "SIP realm"
#~ msgstr "Reialme SIP"
#~ msgid "Voicemail general options"
#~ msgstr "Opcions generals de bústia de veu"
#~ msgid "From Email address of server"
#~ msgstr "Adreça de correu electrònic d'origen del servidor"
#~ msgid "Voice Mail boxes"
#~ msgstr "Bústies de la bústia de veu"
#~ msgid "Email contains attachment"
#~ msgstr "El correu electrònic conté fitxers adjunts"
#~ msgid "Email"
#~ msgstr "Correu electrònic"
#~ msgid "Display Name"
#~ msgstr "Nom a mostrar"
#~ msgid "Password"
#~ msgstr "Contrasenya"
#~ msgid "zone"
#~ msgstr "zona"
#~ msgid "Voice Zone settings"
#~ msgstr "Configuració de zona de veu"
#~ msgid "Message Format"
#~ msgstr "Format de missatge"

View file

@ -1,11 +0,0 @@
# asterisk.pot
# generated from ./applications/luci-asterisk/luasrc/i18n/asterisk.en.lua
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

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