1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-02-13 11:01:50 +00:00

Fix merge conflict from develop

This commit is contained in:
Ycarus (Yannick Chabanois) 2020-10-26 10:04:39 +01:00
commit 49633fde48
192 changed files with 36238 additions and 4030 deletions

View file

@ -31,7 +31,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -94,7 +94,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -155,7 +155,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -216,7 +216,68 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
keys:
- cache-{{ checksum "/tmp/cache-version" }}
- cache-{{ checksum "/tmp/cache-target" }}
- run:
name: Build toolchain
no_output_timeout: 40m
command: |
git clone https://github.com/ysurac/openmptcprouter || true
cd openmptcprouter
git checkout ${CIRCLE_BRANCH:-$CIRCLE_TAG} || true
git pull || true
export OMR_PATH="$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/${CIRCLE_BRANCH:-$CIRCLE_TAG}"
export OMR_FEED_URL="$CIRCLE_REPOSITORY_URL"
export OMR_FEED_SRC="${CIRCLE_BRANCH:-$CIRCLE_TAG}"
pyenv global 3.5.2
sh build.sh prepare {tools,toolchain}/install -j2
echo -e "$OMR_PRIVKEY" > ~/openmptcprouter/$OMR_TARGET/source/key-build
echo -e "$OMR_PUBKEY" > ~/openmptcprouter/$OMR_TARGET/source/key-build.pub
- save_cache:
key: cache-{{ checksum "/tmp/cache-target" }}
paths:
- openmptcprouter
- run:
name: Build
no_output_timeout: 40m
command: make IGNORE_ERRORS=m -C ~/openmptcprouter/$OMR_TARGET/source package/{compile,install,index} target/compile -j2 package/compile -j2 target/install -j2
- run:
name: Deploy
command: |
ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${CIRCLE_TAG:-$OMR_KERNEL}/$OMR_TARGET
rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/${CIRCLE_BRANCH:-release}/${CIRCLE_TAG:-$OMR_KERNEL}/$OMR_TARGET
rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
- save_cache:
key: cache-{{ checksum "/tmp/cache-version" }}
paths:
- openmptcprouter
build_r2s:
machine:
image: ubuntu-1604:201903-01
environment:
- OMR_VERSION: $CIRCLE_TAG
- OMR_TARGET: r2s
- OMR_KERNEL: 5.4
working_directory: ~/
steps:
- run:
name: cache
command: |
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -277,7 +338,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -338,7 +399,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -399,7 +460,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -463,7 +524,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -523,7 +584,7 @@ jobs:
- run:
name: cache
command: |
echo "cache 106 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 107 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
echo "cache 108 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
- restore_cache:
@ -652,6 +713,15 @@ workflows:
branches:
only:
- develop
- build_r2s:
requires:
- prepare
filters:
tags:
only: /.*/
branches:
only:
- develop
- build_rpi2:
requires:
- prepare

149
.github/workflows/main.yml vendored Normal file
View file

@ -0,0 +1,149 @@
name: openmptcprouter
on: [push]
env:
REPO_URL: 'https://github.com/ysurac/openmptcprouter'
OMR_KERNEL: '5.4'
jobs:
build:
strategy:
matrix:
OMR_TARGET: [bpi-r2, bpi-r64, rpi2, rpi4, wrt32x, espressobin, r2s, rpi3, wrt3200acm, x86, x86_64]
runs-on: ubuntu-latest
continue-on-error: true
steps:
- name: Branch name
id: branch_name
run: |
echo ::set-output name=SOURCE_NAME::${GITHUB_REF#refs/*/}
echo ::set-output name=SOURCE_BRANCH::${GITHUB_REF#refs/heads/}
echo ::set-output name=SOURCE_TAG::${GITHUB_REF#refs/tags/}
echo ::set-output name=WORKSPACE::${GITHUB_WORKSPACE}
- name: Prepare
run: |
sudo apt-get update
sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler
- name: Free disk space
run: |
df -h
sudo swapoff -a >/dev/null 2>&1 || true
sudo rm -f /swapfile >/dev/null 2>&1 || true
sudo apt-get autoremove -y >/dev/null 2>&1 || true
sudo apt-get autoclean -y >/dev/null 2>&1 || true
sudo rm -rf "/usr/local/share/boost" >/dev/null 2>&1 || true
sudo rm -rf "$AGENT_TOOLSDIRECTORY" >/dev/null 2>&1 || true
sudo docker rmi $(docker images -qf "dangling=true") >/dev/null 2>&1 || true
df -h
- name: Clone source code
working-directory: ../../
env:
REPO_URL: https://github.com/ysurac/openmptcprouter
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
GITHUB_WORKSPACE: ${{ steps.branch_name.outputs.WORKSPACE }}
run: |
git clone --depth 1 $REPO_URL omr
cd omr
if [ "$SOURCE_NAME" != "Test-Github-Actions" ] && [ "$SOURCE_NAME" != "develop" ]; then
git checkout master
else
git checkout develop
fi
git pull
pwd
- name: Build toolchain
working-directory: ../../omr
env:
OMR_FEED_URL: https://github.com/ysurac/openmptcprouter-feeds
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
OMR_TARGET: ${{ matrix.OMR_TARGET }}
OMR_HOST: ${{ secrets.OMR_HOST }}
OMR_PORT: ${{ secrets.OMR_PORT }}
run: |
OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s
#echo -e "${{ secrets.OMR_PRIVKEY }}" > $OMR_TARGET/source/key-build
#echo -e "${{ secrets.OMR_PUBKEY }}" > $OMR_TARGET/source/key-build.pub
- name: Build packages
working-directory: ../../omr
env:
OMR_TARGET: ${{ matrix.OMR_TARGET }}
run: |
make IGNORE_ERRORS=m -C $OMR_TARGET/source package/{compile,install,index} -j$(nproc) || make IGNORE_ERRORS=m -C $OMR_TARGET/source package/{compile,install,index} -j1 V=s
- name: Build image
working-directory: ../../omr
env:
OMR_TARGET: ${{ matrix.OMR_TARGET }}
run: |
make IGNORE_ERRORS=m -C $OMR_TARGET/source target/install -j$(nproc) || make IGNORE_ERRORS=m -C $OMR_TARGET/source target/install -j1 V=s
- name: Upload artifacts
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.OMR_TARGET }}
path: /home/runner/work/omr/${{ matrix.OMR_TARGET }}/source/bin
- if: steps.branch_name.outputs.SOURCE_BRANCH == ''
name: Deploy - Create directory
uses: ysurac/ssh-action@master
env:
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
SOURCE_BRANCH: ${{ steps.branch_name.outputs.SOURCE_BRANCH }}
SOURCE_TAG: ${{ steps.branch_name.outputs.SOURCE_TAG }}
with:
command: |
mkdir -p deploy/release/${{env.SOURCE_TAG}}/${{matrix.OMR_TARGET}}
host: ${{ secrets.OMR_DEPLOY_HOST }}
user: deploy
port: ${{ secrets.OMR_DEPLOY_PORT }}
key: ${{ secrets.PRIVATE_KEY }}
- if: steps.branch_name.outputs.SOURCE_BRANCH != ''
name: Deploy - Create directory
uses: ysurac/ssh-action@master
env:
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
SOURCE_BRANCH: ${{ steps.branch_name.outputs.SOURCE_BRANCH }}
SOURCE_TAG: ${{ steps.branch_name.outputs.SOURCE_TAG }}
with:
command: |
mkdir -p deploy/${{env.SOURCE_BRANCH}}/${{env.OMR_KERNEL}}/${{matrix.OMR_TARGET}}
host: ${{ secrets.OMR_DEPLOY_HOST }}
user: deploy
port: ${{ secrets.OMR_DEPLOY_PORT }}
key: ${{ secrets.PRIVATE_KEY }}
- name: Move binaries for rsync
working-directory: ../../omr
env:
OMR_TARGET: ${{ matrix.OMR_TARGET }}
GITHUB_WORKSPACE: ${{ steps.branch_name.outputs.WORKSPACE }}
run: |
mv ${OMR_TARGET}/source/bin ${GITHUB_WORKSPACE}/
- if: steps.branch_name.outputs.SOURCE_BRANCH == ''
name: Deploy - Upload via rsync
uses: ysurac/action-rsync@master
env:
ARGS: -av --delete-after
TARGET: deploy/release/${{steps.branch_name.outputs.SOURCE_TAG}}/${{matrix.OMR_TARGET}}
SOURCE: ./bin/
KEY: ${{ secrets.PRIVATE_KEY }}
USER: deploy
HOST: ${{ secrets.OMR_DEPLOY_HOST }}
PORT: ${{ secrets.OMR_DEPLOY_PORT }}
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
SOURCE_BRANCH: ${{ steps.branch_name.outputs.SOURCE_BRANCH }}
SOURCE_TAG: ${{ steps.branch_name.outputs.SOURCE_TAG }}
GITHUB_WORKSPACE: ${{ steps.branch_name.outputs.WORKSPACE }}
- if: steps.branch_name.outputs.SOURCE_BRANCH != ''
name: Deploy - Upload via rsync
uses: ysurac/action-rsync@master
env:
ARGS: -av --delete-after
TARGET: deploy/${{ steps.branch_name.outputs.SOURCE_BRANCH }}/${{env.OMR_KERNEL}}/${{matrix.OMR_TARGET}}
SOURCE: ./bin/
KEY: ${{ secrets.PRIVATE_KEY }}
USER: deploy
HOST: ${{ secrets.OMR_DEPLOY_HOST }}
PORT: ${{ secrets.OMR_DEPLOY_PORT }}
SOURCE_NAME: ${{ steps.branch_name.outputs.SOURCE_NAME }}
SOURCE_BRANCH: ${{ steps.branch_name.outputs.SOURCE_BRANCH }}
SOURCE_TAG: ${{ steps.branch_name.outputs.SOURCE_TAG }}
GITHUB_WORKSPACE: ${{ steps.branch_name.outputs.WORKSPACE }}

19
.github/workflows/stale.yml vendored Normal file
View file

@ -0,0 +1,19 @@
name: Mark stale issues and pull requests
on:
schedule:
- cron: "30 1 * * *"
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v3.0.10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: "This issue is stale because it has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days"
stale-pr-message: 'It has been open 120 days with no activity. Remove stale label or comment or this will be closed in 5 days'
days-before-stale: 120
days-before-close: 5
exempt-issue-labels: 'work-in-progress,enhancement'
exempt-pr-labels: 'work-in-progress,enhancement'

View file

@ -164,4 +164,8 @@ This is used to bypass a protocol
# License
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FYsurac%2Fopenmptcprouter-feeds.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FYsurac%2Fopenmptcprouter-feeds?ref=badge_large)
[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FYsurac%2Fopenmptcprouter-feeds.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FYsurac%2Fopenmptcprouter-feeds?ref=badge_large)
## Translation status
[![Translation status](https://weblate.openmptcprouter.com/widgets/omr/-/multi-auto.svg)](https://weblate.openmptcprouter.com/engage/omr/?utm_source=widget)

View file

@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=bcm27xx-eeprom
PKG_VERSION:=1a44b1330805663c292de8ce818065bbe9f2e130
PKG_VERSION:=1a099a5a9de4cbd71a68afaa6421fd3b9cf3ef2e
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/raspberrypi/rpi-eeprom/tar.gz/$(PKG_VERSION)?
PKG_HASH:=d18573a4026578ed20cd7e3ac7df029dbef7fd271729a60cd80abae2235eca25
PKG_HASH:=c991a69fb92f60fb03cb0d0d482dafd162ae1ad0fb279509d9e2489055891ac3
PKG_LICENSE:=BSD-3-Clause Custom
PKG_LICENSE_FILES:=LICENSE
@ -21,7 +21,7 @@ TAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)
define Package/bcm27xx-eeprom
SECTION:=utils
CATEGORY:=Utilities
DEPENDS:=bcm27xx-userland +blkid +pciutils +python3-light
DEPENDS:=bcm27xx-userland +blkid +pciutils +python3-light +coreutils-od
TITLE:=BCM27xx EEPROM tools
endef

View file

@ -10,7 +10,7 @@ include $(TOPDIR)/rules.mk
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/angt/glorytun.git
PKG_SOURCE_VERSION:=3622f928caf03709c4031a34feec85c623bc5281
PKG_SOURCE_VERSION:=97607fdf5c6c33df512ed85190a1fd93b5f45e77
PKG_NAME:=glorytun-udp
PKG_VERSION:=0.3.4-$(PKG_SOURCE_VERSION)
PKG_RELEASE:=23

204
golang/golang-build.sh Normal file
View file

@ -0,0 +1,204 @@
#!/bin/sh
nl="
"
log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$*"
}
log_error() {
# shellcheck disable=SC2039
local IFS=" "
printf 'Error: %s\n' "$*" >&2
}
link_contents() {
# shellcheck disable=SC2039
local src="$1" dest="$2" IFS="$nl" dirs dir base
if [ -n "$(find "$src" -mindepth 1 -maxdepth 1 -name "*.go" -not -type d)" ]; then
log_error "$src is already a Go library"
return 1
fi
dirs="$(find "$src" -mindepth 1 -maxdepth 1 -type d)"
for dir in $dirs; do
base="${dir##*/}"
if [ -d "$dest/$base" ]; then
case "$dir" in
*$GO_BUILD_DEPENDS_SRC/$GO_PKG)
log "$GO_PKG is already installed. Please check for circular dependencies."
;;
*)
link_contents "$src/$base" "$dest/$base"
;;
esac
else
log "...${src#$GO_BUILD_DEPENDS_SRC}/$base"
ln -sf "$src/$base" "$dest/$base"
fi
done
return 0
}
configure() {
# shellcheck disable=SC2039
local files code testdata gomod pattern extra IFS file dest
cd "$BUILD_DIR" || return 1
files="$(find ./ -path "*/.*" -prune -o -not -type d -print)"
if [ "$GO_INSTALL_ALL" != 1 ]; then
code="$(printf '%s\n' "$files" | grep '\.\(c\|cc\|cpp\|go\|h\|hh\|hpp\|proto\|s\)$')"
testdata="$(printf '%s\n' "$files" | grep '/testdata/')"
gomod="$(printf '%s\n' "$files" | grep '/go\.\(mod\|sum\)$')"
for pattern in $GO_INSTALL_EXTRA; do
extra="$(printf '%s\n' "$extra"; printf '%s\n' "$files" | grep -e "$pattern")"
done
files="$(printf '%s\n%s\n%s\n%s\n' "$code" "$testdata" "$gomod" "$extra" | grep -v '^[[:space:]]*$' | sort -u)"
fi
IFS="$nl"
log "Copying files from $BUILD_DIR into $GO_BUILD_DIR/src/$GO_PKG"
mkdir -p "$GO_BUILD_DIR/src"
for file in $files; do
log "${file#./}"
dest="$GO_BUILD_DIR/src/$GO_PKG/${file#./}"
mkdir -p "${dest%/*}"
cp -fpR "$file" "$dest"
done
log
if [ "$GO_SOURCE_ONLY" != 1 ]; then
if [ -d "$GO_BUILD_DEPENDS_SRC" ]; then
log "Symlinking directories from $GO_BUILD_DEPENDS_SRC into $GO_BUILD_DIR/src"
link_contents "$GO_BUILD_DEPENDS_SRC" "$GO_BUILD_DIR/src"
else
log "$GO_BUILD_DEPENDS_SRC does not exist, skipping symlinks"
fi
else
log "Not building binaries, skipping symlinks"
fi
log
return 0
}
build() {
# shellcheck disable=SC2039
local modargs pattern targets retval
cd "$GO_BUILD_DIR" || return 1
if [ -f "$BUILD_DIR/go.mod" ] ; then
mkdir -p "$GO_MOD_CACHE_DIR"
modargs="$GO_MOD_ARGS"
fi
log "Finding targets"
# shellcheck disable=SC2086
targets="$(go list $modargs $GO_BUILD_PKG)"
for pattern in $GO_EXCLUDES; do
targets="$(printf '%s\n' "$targets" | grep -v "$pattern")"
done
log
if [ "$GO_GO_GENERATE" = 1 ]; then
log "Calling go generate"
# shellcheck disable=SC2086
GOOS='' GOARCH='' GO386='' GOARM='' GOMIPS='' GOMIPS64='' \
go generate -v $targets
log
fi
if [ "$GO_SOURCE_ONLY" = 1 ]; then
return 0
fi
log "Building targets"
mkdir -p "$GO_BUILD_DIR/bin" "$GO_BUILD_CACHE_DIR"
# shellcheck disable=SC2086
go install $modargs "$@" $targets
retval="$?"
log
if [ "$retval" -eq 0 ] && [ -z "$(find "$GO_BUILD_BIN_DIR" -maxdepth 0 -type d -not -empty 2>/dev/null)" ]; then
log_error "No binaries were built"
retval=1
fi
if [ "$retval" -ne 0 ]; then
cache_cleanup
fi
return "$retval"
}
install_bin() {
# shellcheck disable=SC2039
local dest="$1"
install -d -m0755 "$dest/$GO_INSTALL_BIN_PATH"
install -m0755 "$GO_BUILD_BIN_DIR"/* "$dest/$GO_INSTALL_BIN_PATH/"
}
install_src() {
# shellcheck disable=SC2039
local dest="$1" dir="${GO_PKG%/*}"
install -d -m0755 "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir"
cp -fpR "$GO_BUILD_DIR/src/$GO_PKG" "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir/"
}
cache_cleanup() {
if ! [ -d "$GO_MOD_CACHE_DIR" ]; then
return 0
fi
# in case go is called without -modcacherw
find "$GO_MOD_CACHE_DIR" -type d -not -perm -u+w -exec chmod u+w '{}' +
if [ -n "$CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE" ]; then
find "$GO_MOD_CACHE_DIR" -type d -not -perm -go+rx -exec chmod go+rx '{}' +
find "$GO_MOD_CACHE_DIR" -not -type d -not -perm -go+r -exec chmod go+r '{}' +
fi
return 0
}
if [ "$#" -lt 1 ]; then
log_error "Missing command"
exit 1
fi
command="$1"
shift 1
case "$command" in
configure)
configure
;;
build)
build "$@"
;;
install_bin)
install_bin "$@"
;;
install_src)
install_src "$@"
;;
cache_cleanup)
cache_cleanup
;;
*)
log_error "Invalid command \"$command\""
exit 1
;;
esac

View file

@ -1,5 +1,5 @@
#
# Copyright (C) 2018 Jeffery To
# Copyright (C) 2018, 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
@ -24,8 +24,8 @@ endef
# $(4) additional environment variables (optional)
define GoCompiler/Default/Make
( \
cd $(1)/src ; \
$(if $(2),GOROOT_FINAL=$(2)/lib/go-$(3)) \
cd "$(1)/src" ; \
$(if $(2),GOROOT_FINAL="$(2)/lib/go-$(3)") \
$(4) \
$(BASH) make.bash --no-banner ; \
)
@ -34,8 +34,8 @@ endef
# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Install/make-dirs
$(INSTALL_DIR) $(1)/lib/go-$(2)
$(INSTALL_DIR) $(1)/share/go-$(2)
$(INSTALL_DIR) "$(1)/lib/go-$(2)"
$(INSTALL_DIR) "$(1)/share/go-$(2)"
endef
# $(1) source go root
@ -43,48 +43,49 @@ endef
# $(3) go version id
# $(4) file/directory name
define GoCompiler/Default/Install/install-share-data
$(CP) $(1)/$(4) $(2)/share/go-$(3)/
$(LN) ../../share/go-$(3)/$(4) $(2)/lib/go-$(3)/
$(CP) "$(1)/$(4)" "$(2)/share/go-$(3)/"
$(LN) "../../share/go-$(3)/$(4)" "$(2)/lib/go-$(3)/"
endef
# $(1) source go root
# $(2) destination prefix
# $(3) go version id
# $(4) GOOS_GOARCH
# $(5) install suffix (optional)
define GoCompiler/Default/Install/Bin
$(call GoCompiler/Default/Install/make-dirs,$(2),$(3))
$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),api)
$(INSTALL_DATA) -p $(1)/VERSION $(2)/lib/go-$(3)/
$(INSTALL_DATA) -p "$(1)/VERSION" "$(2)/lib/go-$(3)/"
for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README README.md; do \
if [ -f $(1)/$$$$file ]; then \
$(INSTALL_DATA) -p $(1)/$$$$file $(2)/share/go-$(3)/ ; \
for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README.md SECURITY.md; do \
if [ -f "$(1)/$$$$file" ]; then \
$(INSTALL_DATA) -p "$(1)/$$$$file" "$(2)/share/go-$(3)/" ; \
fi ; \
done
$(INSTALL_DIR) $(2)/lib/go-$(3)/bin
$(INSTALL_DIR) "$(2)/lib/go-$(3)/bin"
ifeq ($(4),$(GO_HOST_OS_ARCH))
$(INSTALL_BIN) -p $(1)/bin/* $(2)/lib/go-$(3)/bin/
$(INSTALL_BIN) -p "$(1)/bin"/* "$(2)/lib/go-$(3)/bin/"
else
$(INSTALL_BIN) -p $(1)/bin/$(4)/* $(2)/lib/go-$(3)/bin/
$(INSTALL_BIN) -p "$(1)/bin/$(4)"/* "$(2)/lib/go-$(3)/bin/"
endif
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg
$(CP) $(1)/pkg/$(4) $(2)/lib/go-$(3)/pkg/
$(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg"
$(CP) "$(1)/pkg/$(4)$(if $(5),_$(5))" "$(2)/lib/go-$(3)/pkg/"
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg/tool/$(4)
$(INSTALL_BIN) -p $(1)/pkg/tool/$(4)/* $(2)/lib/go-$(3)/pkg/tool/$(4)/
$(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg/tool/$(4)"
$(INSTALL_BIN) -p "$(1)/pkg/tool/$(4)"/* "$(2)/lib/go-$(3)/pkg/tool/$(4)/"
endef
# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Install/BinLinks
$(INSTALL_DIR) $(1)/bin
$(LN) ../lib/go-$(2)/bin/go $(1)/bin/go
$(LN) ../lib/go-$(2)/bin/gofmt $(1)/bin/gofmt
$(INSTALL_DIR) "$(1)/bin"
$(LN) "../lib/go-$(2)/bin/go" "$(1)/bin/go"
$(LN) "../lib/go-$(2)/bin/gofmt" "$(1)/bin/gofmt"
endef
# $(1) source go root
@ -110,29 +111,29 @@ define GoCompiler/Default/Install/Src
$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),test)
$(FIND) \
$(2)/share/go-$(3)/src/ \
\! -type d -a \( -name '*.bat' -o -name '*.rc' \) \
"$(2)/share/go-$(3)/src/" \
\! -type d -a \( -name "*.bat" -o -name "*.rc" \) \
-delete
if [ -d $(1)/pkg/include ]; then \
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg ; \
$(INSTALL_DIR) $(2)/share/go-$(3)/pkg ; \
$(CP) $(1)/pkg/include $(2)/share/go-$(3)/pkg/ ; \
$(LN) ../../../share/go-$(3)/pkg/include $(2)/lib/go-$(3)/pkg/ ; \
if [ -d "$(1)/pkg/include" ]; then \
$(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg" ; \
$(INSTALL_DIR) "$(2)/share/go-$(3)/pkg" ; \
$(CP) "$(1)/pkg/include" "$(2)/share/go-$(3)/pkg/" ; \
$(LN) "../../../share/go-$(3)/pkg/include" "$(2)/lib/go-$(3)/pkg/" ; \
fi
endef
# $(1) destination prefix
# $(2) go version id
define GoCompiler/Default/Uninstall
rm -rf $(1)/lib/go-$(2)
rm -rf $(1)/share/go-$(2)
rm -rf "$(1)/lib/go-$(2)"
rm -rf "$(1)/share/go-$(2)"
endef
# $(1) destination prefix
define GoCompiler/Default/Uninstall/BinLinks
rm -f $(1)/bin/go
rm -f $(1)/bin/gofmt
rm -f "$(1)/bin/go"
rm -f "$(1)/bin/gofmt"
endef
@ -141,6 +142,7 @@ endef
# $(3) destination prefix
# $(4) go version id
# $(5) GOOS_GOARCH
# $(6) install suffix (optional)
define GoCompiler/AddProfile
# $$(1) valid GOOS_GOARCH combinations
@ -155,7 +157,7 @@ define GoCompiler/AddProfile
# $$(1) override install prefix (optional)
define GoCompiler/$(1)/Install/Bin
$$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5))
$$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5),$(6))
endef
# $$(1) override install prefix (optional)

220
golang/golang-host-build.mk Normal file
View file

@ -0,0 +1,220 @@
#
# Copyright (C) 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif
include $(GO_INCLUDE_DIR)/golang-values.mk
# these variables have the same meanings as in golang-package.mk
GO_HOST_INSTALL_EXTRA?=$(GO_PKG_INSTALL_EXTRA)
GO_HOST_INSTALL_ALL?=$(GO_PKG_INSTALL_ALL)
GO_HOST_SOURCE_ONLY?=$(GO_PKG_SOURCE_ONLY)
GO_HOST_BUILD_PKG?=$(GO_PKG_BUILD_PKG)
GO_HOST_EXCLUDES?=$(GO_PKG_EXCLUDES)
GO_HOST_GO_GENERATE?=$(GO_PKG_GO_GENERATE)
GO_HOST_GCFLAGS?=$(GO_PKG_GCFLAGS)
GO_HOST_LDFLAGS?=$(GO_PKG_LDFLAGS)
GO_HOST_LDFLAGS_X?=$(GO_PKG_LDFLAGS_X)
GO_HOST_TAGS?=$(GO_PKG_TAGS)
GO_HOST_INSTALL_BIN_PATH?=/bin
# need to repeat this here in case golang-package.mk is not included
GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/...
GO_HOST_WORK_DIR_NAME:=.go_work
GO_HOST_BUILD_DIR=$(HOST_BUILD_DIR)/$(GO_HOST_WORK_DIR_NAME)/build
GO_HOST_BUILD_BIN_DIR=$(GO_HOST_BUILD_DIR)/bin
GO_HOST_BUILD_DEPENDS_PATH:=/share/gocode
GO_HOST_BUILD_DEPENDS_SRC=$(STAGING_DIR_HOSTPKG)$(GO_HOST_BUILD_DEPENDS_PATH)/src
GO_HOST_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR)))
GO_HOST_STAGING_DIR:=$(TMP_DIR)/host-stage-$(GO_HOST_DIR_NAME)
GO_HOST_STAGING_FILES_LIST_DIR:=$(HOST_BUILD_PREFIX)/stamp
GO_HOST_BIN_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-bin.list
GO_HOST_SRC_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-src.list
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
GO_HOST_ENABLE_PIE:=1
endif
GO_HOST_BUILD_CONFIG_VARS= \
GO_PKG="$(strip $(GO_PKG))" \
GO_INSTALL_EXTRA="$(strip $(GO_HOST_INSTALL_EXTRA))" \
GO_INSTALL_ALL="$(strip $(GO_HOST_INSTALL_ALL))" \
GO_SOURCE_ONLY="$(strip $(GO_HOST_SOURCE_ONLY))" \
GO_BUILD_PKG="$(strip $(GO_HOST_BUILD_PKG))" \
GO_EXCLUDES="$(strip $(GO_HOST_EXCLUDES))" \
GO_GO_GENERATE="$(strip $(GO_HOST_GO_GENERATE))" \
GO_INSTALL_BIN_PATH="$(strip $(GO_HOST_INSTALL_BIN_PATH))" \
BUILD_DIR="$(HOST_BUILD_DIR)" \
GO_BUILD_DIR="$(GO_HOST_BUILD_DIR)" \
GO_BUILD_BIN_DIR="$(GO_HOST_BUILD_BIN_DIR)" \
GO_BUILD_DEPENDS_PATH="$(GO_HOST_BUILD_DEPENDS_PATH)" \
GO_BUILD_DEPENDS_SRC="$(GO_HOST_BUILD_DEPENDS_SRC)"
GO_HOST_MORE_CFLAGS?= \
-Wformat -Werror=format-security \
-fstack-protector-strong \
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 \
-Wl,-z,now -Wl,-z,relro \
$(if $(GO_HOST_ENABLE_PIE),$(FPIC))
GO_HOST_MORE_LDFLAGS?= \
-znow -zrelro \
$(if $(GO_HOST_ENABLE_PIE),$(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs)
GO_HOST_TARGET_VARS= \
CGO_ENABLED=1 \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
CGO_CFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
CGO_CPPFLAGS="$(HOST_CPPFLAGS) $(GO_HOST_MORE_CPPFLAGS)" \
CGO_CXXFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
CGO_LDFLAGS="$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS)" \
GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
GO_GCC_HELPER_PATH="$$$$PATH" \
PATH="$(STAGING_DIR_HOSTPKG)/lib/go-cross/openwrt:$$$$PATH"
GO_HOST_BUILD_VARS= \
GOPATH="$(GO_HOST_BUILD_DIR)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOMODCACHE="$(GO_MOD_CACHE_DIR)" \
GOENV=off
GO_HOST_VARS= \
$(GO_HOST_TARGET_VARS) \
$(GO_HOST_BUILD_VARS)
GO_HOST_DEFAULT_LDFLAGS= \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS))'
GO_HOST_CUSTOM_LDFLAGS= \
$(GO_HOST_LDFLAGS) \
$(patsubst %,-X %,$(GO_HOST_LDFLAGS_X))
GO_HOST_INSTALL_ARGS= \
-v \
-ldflags "all=$(GO_HOST_DEFAULT_LDFLAGS)" \
$(if $(filter $(GO_HOST_ENABLE_PIE),1),-buildmode pie) \
$(if $(GO_HOST_GCFLAGS),-gcflags "$(GO_HOST_GCFLAGS)") \
$(if $(GO_HOST_CUSTOM_LDFLAGS),-ldflags "$(GO_HOST_CUSTOM_LDFLAGS) $(GO_HOST_DEFAULT_LDFLAGS)") \
$(if $(GO_HOST_TAGS),-tags "$(GO_HOST_TAGS)")
define GoHost/Host/Configure
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
endef
# $(1) additional arguments for go command line (optional)
define GoHost/Host/Compile
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(GO_HOST_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_HOST_INSTALL_ARGS) $(1)
endef
define GoHost/Host/Install/Bin
rm -rf "$(GO_HOST_STAGING_DIR)"
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)"
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(GO_HOST_STAGING_DIR)"
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
"$(1)" ; \
fi
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files"
$(call locked, \
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_BIN_STAGING_FILES_LIST)" && \
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
host-staging-dir \
)
rm -rf "$(GO_HOST_STAGING_DIR)"
endef
define GoHost/Host/Install/Src
rm -rf "$(GO_HOST_STAGING_DIR)"
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)"
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(GO_HOST_STAGING_DIR)"
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
"$(1)" ; \
fi
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files"
$(call locked, \
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_SRC_STAGING_FILES_LIST)" && \
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
host-staging-dir \
)
rm -rf "$(GO_HOST_STAGING_DIR)"
endef
define GoHost/Host/Install
$(if $(filter $(GO_HOST_SOURCE_ONLY),1),, \
$(call GoHost/Host/Install/Bin,$(1)) \
)
$(call GoHost/Host/Install/Src,$(1))
endef
define GoHost/Host/Uninstall
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
"$(HOST_BUILD_PREFIX)" ; \
rm -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ; \
fi
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
"$(HOST_BUILD_PREFIX)" ; \
rm -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ; \
fi
endef
ifneq ($(strip $(GO_PKG)),)
Host/Configure=$(call GoHost/Host/Configure)
Host/Compile=$(call GoHost/Host/Compile)
Hooks/HostCompile/Post+=Go/CacheCleanup
Host/Uninstall=$(call GoHost/Host/Uninstall,$(1))
endif
define GoHostBuild
Host/Install=$$(call GoHost/Host/Install,$$(1))
endef
define GoBinHostBuild
Host/Install=$$(call GoHost/Host/Install/Bin,$$(1))
endef
define GoSrcHostBuild
Host/Install=$$(call GoHost/Host/Install/Src,$$(1))
endef

View file

@ -1,5 +1,5 @@
#
# Copyright (C) 2018 Jeffery To
# Copyright (C) 2018-2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
@ -28,10 +28,12 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# files are installed:
#
# * Files with one of these extensions:
# .go, .c, .cc, .h, .hh, .proto, .s
# .go, .c, .cc, .cpp, .h, .hh, .hpp, .proto, .s
#
# * Files in any 'testdata' directory
#
# * go.mod and go.sum, in any directory
#
# e.g. GO_PKG_INSTALL_EXTRA:=example.toml marshal_test.toml
#
#
@ -54,7 +56,7 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# GO_PKG_BUILD_PKG - list of build targets, default GO_PKG/...
#
# Build targets for compiling this Go package, i.e. arguments passed
# to 'go install'
# to 'go install'.
#
# e.g. GO_PKG_BUILD_PKG:=github.com/debian/ratt/cmd/...
#
@ -74,28 +76,92 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# not necessary.
#
# e.g. GO_PKG_GO_GENERATE:=1
#
#
# GO_PKG_GCFLAGS - list of options, default empty
#
# Additional go tool compile options to use when building targets.
#
# e.g. GO_PKG_GCFLAGS:=-N -l
#
#
# GO_PKG_LDFLAGS - list of options, default empty
#
# Additional go tool link options to use when building targets.
#
# Note that the OpenWrt build system has an option to strip binaries
# (enabled by default), so -s (Omit the symbol table and debug
# information) and -w (Omit the DWARF symbol table) flags are not
# necessary.
#
# e.g. GO_PKG_LDFLAGS:=-r dir1:dir2 -u
#
#
# GO_PKG_LDFLAGS_X - list of string variable definitions, default empty
#
# Each definition will be passed as the parameter to the -X go tool
# link option, i.e. -ldflags "-X importpath.name=value".
#
# e.g. GO_PKG_LDFLAGS_X:=main.Version=$(PKG_VERSION) main.BuildStamp=$(SOURCE_DATE_EPOCH)
#
#
# GO_PKG_TAGS - list of build tags, default empty
#
# Build tags to consider satisfied during the build, passed as the
# parameter to the -tags option for 'go install'.
#
# e.g. GO_PKG_TAGS:=release,noupgrade
#
#
# GO_PKG_INSTALL_BIN_PATH - target directory path, default /usr/bin
#
# Directory path under "dest_dir" where binaries will be installed by
# '$(call GoPackage/Package/Install/Bin,dest_dir)'.
#
# e.g. GO_PKG_INSTALL_BIN_PATH:=/sbin
# Credit for this package build process (GoPackage/Build/Configure and
# GoPackage/Build/Compile) belong to Debian's dh-golang completely.
# https://anonscm.debian.org/cgit/pkg-go/packages/dh-golang.git
# https://salsa.debian.org/go-team/packages/dh-golang
# for building packages, not user code
GO_PKG_PATH:=/usr/share/gocode
GO_PKG_BUILD_PKG?=$(GO_PKG)/...
GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/...
GO_PKG_INSTALL_BIN_PATH?=/usr/bin
GO_PKG_WORK_DIR_NAME:=.go_work
GO_PKG_WORK_DIR:=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)
GO_PKG_BUILD_DIR=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)/build
GO_PKG_BUILD_BIN_DIR=$(GO_PKG_BUILD_DIR)/bin$(if $(GO_HOST_TARGET_DIFFERENT),/$(GO_OS_ARCH))
GO_PKG_BUILD_DIR:=$(GO_PKG_WORK_DIR)/build
GO_PKG_CACHE_DIR:=$(GO_PKG_WORK_DIR)/cache
GO_PKG_TMP_DIR:=$(GO_PKG_WORK_DIR)/tmp
GO_PKG_BUILD_DEPENDS_PATH:=/usr/share/gocode
GO_PKG_BUILD_DEPENDS_SRC=$(STAGING_DIR)$(GO_PKG_BUILD_DEPENDS_PATH)/src
GO_PKG_BUILD_BIN_DIR:=$(GO_PKG_BUILD_DIR)/bin$(if \
$(GO_HOST_TARGET_DIFFERENT),/$(GO_OS)_$(GO_ARCH))
ifdef CONFIG_PKG_ASLR_PIE_ALL
ifeq ($(strip $(PKG_ASLR_PIE)),1)
ifeq ($(GO_TARGET_PIE_SUPPORTED),1)
GO_PKG_ENABLE_PIE:=1
else
$(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH))
endif
endif
endif
GO_PKG_BUILD_DEPENDS_SRC:=$(STAGING_DIR)$(GO_PKG_PATH)/src
ifdef CONFIG_PKG_ASLR_PIE_REGULAR
ifeq ($(strip $(PKG_ASLR_PIE_REGULAR)),1)
ifeq ($(GO_TARGET_PIE_SUPPORTED),1)
GO_PKG_ENABLE_PIE:=1
else
$(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH))
endif
endif
endif
ifdef CONFIG_GOLANG_SPECTRE
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
GO_PKG_ENABLE_SPECTRE:=1
else
$(warning Spectre mitigations are not supported for $(GO_ARCH))
endif
endif
# sstrip causes corrupted section header size
ifneq ($(CONFIG_USE_SSTRIP),)
@ -105,16 +171,6 @@ ifneq ($(CONFIG_USE_SSTRIP),)
GO_PKG_STRIP_ARGS:=--strip-all
endif
STRIP:=$(TARGET_CROSS)strip $(GO_PKG_STRIP_ARGS)
RSTRIP= \
export CROSS="$(TARGET_CROSS)" \
$(if $(PKG_BUILD_ID),KEEP_BUILD_ID=1) \
$(if $(CONFIG_KERNEL_KALLSYMS),NO_RENAME=1) \
$(if $(CONFIG_KERNEL_PROFILING),KEEP_SYMBOLS=1); \
NM="$(TARGET_CROSS)nm" \
STRIP="$(STRIP)" \
STRIP_KMOD="$(SCRIPT_DIR)/strip-kmod.sh" \
PATCHELF="$(STAGING_DIR_HOST)/bin/patchelf" \
$(SCRIPT_DIR)/rstrip.sh
endif
define GoPackage/GoSubMenu
@ -123,151 +179,87 @@ define GoPackage/GoSubMenu
CATEGORY:=Languages
endef
define GoPackage/Environment
GOOS=$(GO_OS) \
GOARCH=$(GO_ARCH) \
GO386=$(GO_386) \
GOARM=$(GO_ARM) \
GOMIPS=$(GO_MIPS) \
GOMIPS64=$(GO_MIPS64) \
GO_PKG_BUILD_CONFIG_VARS= \
GO_PKG="$(strip $(GO_PKG))" \
GO_INSTALL_EXTRA="$(strip $(GO_PKG_INSTALL_EXTRA))" \
GO_INSTALL_ALL="$(strip $(GO_PKG_INSTALL_ALL))" \
GO_SOURCE_ONLY="$(strip $(GO_PKG_SOURCE_ONLY))" \
GO_BUILD_PKG="$(strip $(GO_PKG_BUILD_PKG))" \
GO_EXCLUDES="$(strip $(GO_PKG_EXCLUDES))" \
GO_GO_GENERATE="$(strip $(GO_PKG_GO_GENERATE))" \
GO_INSTALL_BIN_PATH="$(strip $(GO_PKG_INSTALL_BIN_PATH))" \
BUILD_DIR="$(PKG_BUILD_DIR)" \
GO_BUILD_DIR="$(GO_PKG_BUILD_DIR)" \
GO_BUILD_BIN_DIR="$(GO_PKG_BUILD_BIN_DIR)" \
GO_BUILD_DEPENDS_PATH="$(GO_PKG_BUILD_DEPENDS_PATH)" \
GO_BUILD_DEPENDS_SRC="$(GO_PKG_BUILD_DEPENDS_SRC)"
GO_PKG_TARGET_VARS= \
GOOS="$(GO_OS)" \
GOARCH="$(GO_ARCH)" \
GO386="$(GO_386)" \
GOARM="$(GO_ARM)" \
GOMIPS="$(GO_MIPS)" \
GOMIPS64="$(GO_MIPS64)" \
CGO_ENABLED=1 \
CC="$(TARGET_CC)" \
CXX="$(TARGET_CXX)" \
CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \
CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \
CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))"
endef
CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))" \
CGO_LDFLAGS="$(TARGET_LDFLAGS)"
# false if directory does not exist
GoPackage/is_dir_not_empty=$$$$($(FIND) $(1) -maxdepth 0 -type d \! -empty 2>/dev/null)
GO_PKG_BUILD_VARS= \
GOPATH="$(GO_PKG_BUILD_DIR)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOMODCACHE="$(GO_MOD_CACHE_DIR)" \
GOENV=off
GoPackage/has_binaries=$(call GoPackage/is_dir_not_empty,$(GO_PKG_BUILD_BIN_DIR))
GO_PKG_VARS= \
$(GO_PKG_TARGET_VARS) \
$(GO_PKG_BUILD_VARS)
GO_PKG_DEFAULT_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
GO_PKG_DEFAULT_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
GO_PKG_DEFAULT_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))'
GO_PKG_CUSTOM_LDFLAGS= \
$(GO_PKG_LDFLAGS) \
$(patsubst %,-X %,$(GO_PKG_LDFLAGS_X))
GO_PKG_INSTALL_ARGS= \
-v \
-trimpath \
-ldflags "all=$(GO_PKG_DEFAULT_LDFLAGS)" \
$(if $(GO_PKG_DEFAULT_GCFLAGS),-gcflags "all=$(GO_PKG_DEFAULT_GCFLAGS)") \
$(if $(GO_PKG_DEFAULT_ASMFLAGS),-asmflags "all=$(GO_PKG_DEFAULT_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie) \
$(if $(filter $(GO_ARCH),arm),-installsuffix "v$(GO_ARM)") \
$(if $(filter $(GO_ARCH),mips mipsle),-installsuffix "$(GO_MIPS)") \
$(if $(filter $(GO_ARCH),mips64 mips64le),-installsuffix "$(GO_MIPS64)") \
$(if $(GO_PKG_GCFLAGS),-gcflags "$(GO_PKG_GCFLAGS) $(GO_PKG_DEFAULT_GCFLAGS)") \
$(if $(GO_PKG_CUSTOM_LDFLAGS),-ldflags "$(GO_PKG_CUSTOM_LDFLAGS) $(GO_PKG_DEFAULT_LDFLAGS)") \
$(if $(GO_PKG_TAGS),-tags "$(GO_PKG_TAGS)")
define GoPackage/Build/Configure
( \
cd $(PKG_BUILD_DIR) ; \
mkdir -p $(GO_PKG_BUILD_DIR)/bin $(GO_PKG_BUILD_DIR)/src \
$(GO_PKG_CACHE_DIR) $(GO_PKG_TMP_DIR) ; \
\
files=$$$$($(FIND) ./ \
-type d -a \( -path './.git' -o -path './$(GO_PKG_WORK_DIR_NAME)' \) -prune -o \
\! -type d -print | \
sed 's|^\./||') ; \
\
if [ "$(GO_PKG_INSTALL_ALL)" != 1 ]; then \
code=$$$$(echo "$$$$files" | grep '\.\(c\|cc\|go\|h\|hh\|proto\|s\)$$$$') ; \
testdata=$$$$(echo "$$$$files" | grep '\(^\|/\)testdata/') ; \
\
for pattern in $(GO_PKG_INSTALL_EXTRA); do \
extra=$$$$(echo "$$$$extra"; echo "$$$$files" | grep "$$$$pattern") ; \
done ; \
\
files=$$$$(echo "$$$$code"; echo "$$$$testdata"; echo "$$$$extra") ; \
files=$$$$(echo "$$$$files" | grep -v '^[[:space:]]*$$$$' | sort -u) ; \
fi ; \
\
echo "Copying files from $(PKG_BUILD_DIR) into $(GO_PKG_BUILD_DIR)/src/$(GO_PKG)" ; \
for file in $$$$files; do \
echo $$$$file ; \
dest=$(GO_PKG_BUILD_DIR)/src/$(GO_PKG)/$$$$file ; \
mkdir -p $$$$(dirname $$$$dest) ; \
$(CP) $$$$file $$$$dest ; \
done ; \
echo ; \
\
link_contents() { \
local src=$$$$1 ; \
local dest=$$$$2 ; \
local dirs dir base ; \
\
if [ -n "$$$$($(FIND) $$$$src -mindepth 1 -maxdepth 1 -name '*.go' \! -type d)" ]; then \
echo "$$$$src is already a Go library" ; \
return 1 ; \
fi ; \
\
dirs=$$$$($(FIND) $$$$src -mindepth 1 -maxdepth 1 -type d) ; \
for dir in $$$$dirs; do \
base=$$$$(basename $$$$dir) ; \
if [ -d $$$$dest/$$$$base ]; then \
case $$$$dir in \
*$(GO_PKG_PATH)/src/$(GO_PKG)) \
echo "$(GO_PKG) is already installed. Please check for circular dependencies." ;; \
*) \
link_contents $$$$src/$$$$base $$$$dest/$$$$base ;; \
esac ; \
else \
echo "...$$$${src#$(GO_PKG_BUILD_DEPENDS_SRC)}/$$$$base" ; \
$(LN) $$$$src/$$$$base $$$$dest/$$$$base ; \
fi ; \
done ; \
} ; \
\
if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \
if [ -d $(GO_PKG_BUILD_DEPENDS_SRC) ]; then \
echo "Symlinking directories from $(GO_PKG_BUILD_DEPENDS_SRC) into $(GO_PKG_BUILD_DIR)/src" ; \
link_contents $(GO_PKG_BUILD_DEPENDS_SRC) $(GO_PKG_BUILD_DIR)/src ; \
else \
echo "$(GO_PKG_BUILD_DEPENDS_SRC) does not exist, skipping symlinks" ; \
fi ; \
else \
echo "Not building binaries, skipping symlinks" ; \
fi ; \
echo ; \
)
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
endef
# $(1) additional arguments for go command line (optional)
define GoPackage/Build/Compile
( \
cd $(GO_PKG_BUILD_DIR) ; \
export GOPATH=$(GO_PKG_BUILD_DIR) \
GOCACHE=$(GO_PKG_CACHE_DIR) \
GOTMPDIR=$(GO_PKG_TMP_DIR) \
GOROOT_FINAL=$(GO_TARGET_ROOT) \
CC=$(TARGET_CC) \
CXX=$(TARGET_CXX) \
$(call GoPackage/Environment) ; \
\
echo "Finding targets" ; \
targets=$$$$(go list $(GO_PKG_BUILD_PKG)) ; \
for pattern in $(GO_PKG_EXCLUDES); do \
targets=$$$$(echo "$$$$targets" | grep -v "$$$$pattern") ; \
done ; \
echo ; \
\
if [ "$(GO_PKG_GO_GENERATE)" = 1 ]; then \
echo "Calling go generate" ; \
go generate -v $(1) $$$$targets ; \
echo ; \
fi ; \
\
if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \
echo "Building targets" ; \
case $(GO_ARCH) in \
arm) installsuffix="-installsuffix v$(GO_ARM)" ;; \
mips|mipsle) installsuffix="-installsuffix $(GO_MIPS)" ;; \
mips64|mips64le) installsuffix="-installsuffix $(GO_MIPS64)" ;; \
esac ; \
ldflags="all=-linkmode external -extldflags '$(TARGET_LDFLAGS)'" ; \
go install \
$$$$installsuffix \
-trimpath \
-ldflags "$$$$ldflags" \
-v \
$(1) \
$$$$targets ; \
retval=$$$$? ; \
echo ; \
\
if [ "$$$$retval" -eq 0 ] && [ -z "$(call GoPackage/has_binaries)" ]; then \
echo "No binaries were generated, consider adding GO_PKG_SOURCE_ONLY:=1 to Makefile" ; \
echo ; \
fi ; \
\
echo "Cleaning module download cache (golang/go#27455)" ; \
go clean -modcache ; \
echo ; \
fi ; \
exit $$$$retval ; \
)
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(GO_PKG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_PKG_INSTALL_ARGS) $(1)
endef
define GoPackage/Build/InstallDev
@ -275,27 +267,33 @@ define GoPackage/Build/InstallDev
endef
define GoPackage/Package/Install/Bin
if [ -n "$(call GoPackage/has_binaries)" ]; then \
$(INSTALL_DIR) $(1)/usr/bin ; \
$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/* $(1)/usr/bin/ ; \
fi
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(1)"
endef
define GoPackage/Package/Install/Src
dir=$$$$(dirname $(GO_PKG)) ; \
$(INSTALL_DIR) $(1)$(GO_PKG_PATH)/src/$$$$dir ; \
$(CP) $(GO_PKG_BUILD_DIR)/src/$(GO_PKG) $(1)$(GO_PKG_PATH)/src/$$$$dir/
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_PKG_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(1)"
endef
define GoPackage/Package/Install
$(call GoPackage/Package/Install/Bin,$(1))
$(if $(filter $(GO_PKG_SOURCE_ONLY),1),, \
$(call GoPackage/Package/Install/Bin,$(1)) \
)
$(call GoPackage/Package/Install/Src,$(1))
endef
ifneq ($(GO_PKG),)
ifneq ($(strip $(GO_PKG)),)
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
Build/Configure=$(call GoPackage/Build/Configure)
Build/Compile=$(call GoPackage/Build/Compile)
Hooks/Compile/Post+=Go/CacheCleanup
Build/InstallDev=$(call GoPackage/Build/InstallDev,$(1))
endif
@ -316,3 +314,14 @@ define GoSrcPackage
Package/$(1)/install=$$(call GoPackage/Package/Install/Src,$$(1))
endif
endef
# Deprecated variables - these will be removed after the next OpenWrt release
GO_PKG_PATH=$(GO_PKG_BUILD_DEPENDS_PATH)
GO_PKG_WORK_DIR=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)
GO_PKG_CACHE_DIR=$(GO_BUILD_CACHE_DIR)
GO_PKG_DEFAULT_VARS=$(GO_PKG_VARS)
GoPackage/Environment=$(GO_PKG_VARS)
GoPackage/is_dir_not_empty=$$$$($(FIND) "$(1)" -maxdepth 0 -type d \! -empty 2>/dev/null)
GoPackage/has_binaries=$(call GoPackage/is_dir_not_empty,$(GO_PKG_BUILD_BIN_DIR))
# End of deprecated variables

View file

@ -1,5 +1,5 @@
#
# Copyright (C) 2018 Jeffery To
# Copyright (C) 2018, 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
@ -9,23 +9,118 @@ ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif
include $(GO_INCLUDE_DIR)/golang-version.mk
# Unset environment variables
# There are more magic variables to track down, but ain't nobody got time for that
# From https://golang.org/cmd/go/#hdr-Environment_variables
# General-purpose environment variables:
unexport \
GOARCH GOBIN GOCACHE GODEBUG GOHOSTARCH GOOS GOPATH GORACE GOROOT GOTMPDIR GCCGO \
GCCGO \
GOARCH \
GOBIN \
GOCACHE \
GOMODCACHE \
GODEBUG \
GOENV \
GOFLAGS \
GOOS \
GOPATH \
GOROOT \
GOTMPDIR
# Unmodified:
# GOINSECURE
# GOPRIVATE
# GOPROXY
# GONOPROXY
# GOSUMDB
# GONOSUMDB
# Environment variables for use with cgo:
unexport \
AR \
CC \
CGO_ENABLED \
CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \
CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \
CGO_CPPFLAGS CGO_CPPFLAGS_ALLOW CGO_CPPFLAGS_DISALLOW \
CGO_CXXFLAGS CGO_CXXFLAGS_ALLOW CGO_CXXFLAGS_DISALLOW \
CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \
CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \
GOARM GO386 GOMIPS GOMIPS64 \
GOROOT_FINAL GO_EXTLINK_ENABLED GIT_ALLOW_PROTOCOL \
CC_FOR_TARGET CXX_FOR_TARGET GO_DISTFLAGS GO_GCFLAGS GO_LDFLAGS GOBUILDTIMELOGFILE GOROOT_BOOTSTRAP \
BOOT_GO_GCFLAGS GOEXPERIMENT GOBOOTSTRAP_TOOLEXEC
# there are more magic environment variables to track down, but ain't nobody got time for that
# deliberately left untouched: GOPROXY GONOPROXY GOSUMDB GONOSUMDB GOPRIVATE
CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \
CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \
CXX \
FC
# Unmodified:
# PKG_CONFIG
# Architecture-specific environment variables:
unexport \
GOARM \
GO386 \
GOMIPS \
GOMIPS64 \
GOWASM
# Special-purpose environment variables:
unexport \
GCCGOTOOLDIR \
GOROOT_FINAL \
GO_EXTLINK_ENABLED
# Unmodified:
# GIT_ALLOW_PROTOCOL
# From https://golang.org/cmd/go/#hdr-Module_support
unexport \
GO111MODULE
# From https://golang.org/pkg/runtime/#hdr-Environment_Variables
unexport \
GOGC \
GOMAXPROCS \
GORACE \
GOTRACEBACK
# From https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command
unexport \
CC_FOR_TARGET \
CXX_FOR_TARGET
# Todo:
# CC_FOR_${GOOS}_${GOARCH}
# CXX_FOR_${GOOS}_${GOARCH}
# From https://golang.org/doc/install/source#environment
unexport \
GOHOSTOS \
GOHOSTARCH \
GOPPC64
# From https://golang.org/src/make.bash
unexport \
GO_GCFLAGS \
GO_LDFLAGS \
GO_LDSO \
GO_DISTFLAGS \
GOBUILDTIMELOGFILE \
GOROOT_BOOTSTRAP
# From https://golang.org/doc/go1.9#parallel-compile
unexport \
GO19CONCURRENTCOMPILATION
# From https://golang.org/src/cmd/dist/build.go
unexport \
BOOT_GO_GCFLAGS \
BOOT_GO_LDFLAGS
# From https://golang.org/src/cmd/dist/buildruntime.go
unexport \
GOEXPERIMENT
# From https://golang.org/src/cmd/dist/buildtool.go
unexport \
GOBOOTSTRAP_TOOLEXEC
# GOOS / GOARCH
go_arch=$(subst \
aarch64,arm64,$(subst \
@ -43,31 +138,117 @@ GO_HOST_OS:=$(call tolower,$(HOST_OS))
GO_HOST_ARCH:=$(call go_arch,$(subst \
armv6l,arm,$(subst \
armv7l,arm,$(subst \
i486,i386,$(subst \
i586,i386,$(subst \
i686,i386,$(HOST_ARCH)))))))
i686,i386,$(HOST_ARCH)))))
GO_HOST_OS_ARCH:=$(GO_HOST_OS)_$(GO_HOST_ARCH)
GO_HOST_TARGET_SAME:=$(if $(and $(findstring $(GO_OS_ARCH),$(GO_HOST_OS_ARCH)),$(findstring $(GO_HOST_OS_ARCH),$(GO_OS_ARCH))),1)
GO_HOST_TARGET_DIFFERENT:=$(if $(GO_HOST_TARGET_SAME),,1)
ifeq ($(GO_OS_ARCH),$(GO_HOST_OS_ARCH))
GO_HOST_TARGET_SAME:=1
else
GO_HOST_TARGET_DIFFERENT:=1
endif
# ensure binaries can run on older CPUs
GO_386:=387
ifeq ($(GO_ARCH),386)
# ensure binaries can run on older CPUs
GO_386:=387
GO_ARM:=$(if $(CONFIG_arm_v7),7,$(if $(CONFIG_arm_v6),6,$(if $(findstring $(GO_ARCH),arm),5,)))
# -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors
GO_CFLAGS_TO_REMOVE:=-fno-plt
GO_MIPS:=$(if $(filter $(GO_ARCH),mips mipsle),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),)
else ifeq ($(GO_ARCH),arm)
GO_TARGET_FPU:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE))))
GO_MIPS64:=$(if $(filter $(GO_ARCH),mips64 mips64le),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),)
# FPU names from https://gcc.gnu.org/onlinedocs/gcc-8.4.0/gcc/ARM-Options.html#index-mfpu-1
# see also https://github.com/gcc-mirror/gcc/blob/releases/gcc-8.4.0/gcc/config/arm/arm-cpus.in
# -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors
# -mips32r2: conflicts with -march=mips32 set by go
GO_CFLAGS_TO_REMOVE:=$(if \
$(filter $(GO_ARCH),386),-fno-plt,$(if \
$(filter $(GO_ARCH),mips mipsle),-mips32r2,))
ifeq ($(GO_TARGET_FPU),)
GO_ARM:=5
else ifneq ($(filter $(GO_TARGET_FPU),vfp vfpv2),)
GO_ARM:=6
else
GO_ARM:=7
endif
else ifneq ($(filter $(GO_ARCH),mips mipsle),)
ifeq ($(CONFIG_HAS_FPU),y)
GO_MIPS:=hardfloat
else
GO_MIPS:=softfloat
endif
# -mips32r2: conflicts with -march=mips32 set by go
GO_CFLAGS_TO_REMOVE:=-mips32r2
else ifneq ($(filter $(GO_ARCH),mips64 mips64le),)
ifeq ($(CONFIG_HAS_FPU),y)
GO_MIPS64:=hardfloat
else
GO_MIPS64:=softfloat
endif
endif
# Target Go
GO_ARCH_DEPENDS:=@(aarch64||arm||i386||i686||mips||mips64||mips64el||mipsel||powerpc64||x86_64)
GO_TARGET_PREFIX:=/usr
GO_TARGET_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
GO_TARGET_ROOT:=$(GO_TARGET_PREFIX)/lib/go-$(GO_TARGET_VERSION_ID)
# ASLR/PIE
GO_PIE_SUPPORTED_OS_ARCH:= \
android_386 android_amd64 android_arm android_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
\
windows_386 windows_amd64 windows_arm \
\
darwin_amd64 \
freebsd_amd64 \
\
aix_ppc64 \
\
linux_ppc64le linux_s390x
go_pie_install_suffix=$(if $(filter $(1),aix_ppc64 windows_386 windows_amd64 windows_arm),,shared)
ifneq ($(filter $(GO_HOST_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),)
GO_HOST_PIE_SUPPORTED:=1
GO_HOST_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_HOST_OS_ARCH))
endif
ifneq ($(filter $(GO_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),)
GO_TARGET_PIE_SUPPORTED:=1
GO_TARGET_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_OS_ARCH))
endif
# Spectre mitigations
GO_SPECTRE_SUPPORTED_ARCH:=amd64
ifneq ($(filter $(GO_HOST_ARCH),$(GO_SPECTRE_SUPPORTED_ARCH)),)
GO_HOST_SPECTRE_SUPPORTED:=1
endif
ifneq ($(filter $(GO_ARCH),$(GO_SPECTRE_SUPPORTED_ARCH)),)
GO_TARGET_SPECTRE_SUPPORTED:=1
endif
# General build info
GO_BUILD_CACHE_DIR:=$(or $(call qstrip,$(CONFIG_GOLANG_BUILD_CACHE_DIR)),$(TOPDIR)/.go-build)
GO_MOD_CACHE_DIR:=$(DL_DIR)/go-mod-cache
GO_MOD_ARGS= \
-modcacherw
GO_GENERAL_BUILD_CONFIG_VARS= \
CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE="$(CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE)" \
GO_BUILD_CACHE_DIR="$(GO_BUILD_CACHE_DIR)" \
GO_MOD_CACHE_DIR="$(GO_MOD_CACHE_DIR)" \
GO_MOD_ARGS="$(GO_MOD_ARGS)"
define Go/CacheCleanup
$(GENERAL_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh cache_cleanup
endef

View file

@ -1,14 +0,0 @@
#
# Copyright (C) 2018 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif
GO_VERSION_MAJOR_MINOR:=1.13
GO_VERSION_PATCH:=4

33
golang/golang/Config.in Normal file
View file

@ -0,0 +1,33 @@
menu "Configuration"
config GOLANG_EXTERNAL_BOOTSTRAP_ROOT
string "External bootstrap Go root directory"
default ""
help
Path to a working Go tree (>= Go 1.4), with bin, pkg, and src
subdirectories and the Go compiler at bin/go.
If specified, the existing Go installation will be used to
compile host (buildroot) Go.
Leave blank to compile the default bootstrap Go.
config GOLANG_BUILD_CACHE_DIR
string "Go build cache directory"
default ""
help
Store the Go build cache in this directory.
If not set, uses './.go-build'.
config GOLANG_MOD_CACHE_WORLD_READABLE
bool "Ensure Go module cache is world-readable"
default n
config GOLANG_SPECTRE
bool "Enable Spectre mitigations"
default n
depends on x86_64
help
Currently only available for x86-64 (amd64).
endmenu

View file

@ -1,12 +1,14 @@
#
# Copyright (C) 2018 Jeffery To
# Copyright (C) 2018, 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
include ../golang-version.mk
GO_VERSION_MAJOR_MINOR:=1.15
GO_VERSION_PATCH:=2
PKG_NAME:=golang
PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH))
@ -18,21 +20,21 @@ GO_SOURCE_URLS:=https://dl.google.com/go/ \
PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz
PKG_SOURCE_URL:=$(GO_SOURCE_URLS)
PKG_HASH:=95dbeab442ee2746b9acf0934c8e2fc26414a0565c008631b04addb8c02e7624
PKG_HASH:=28bf9d0bcde251011caae230a4a05d917b172ea203f2a62f2c2f9533589d4b4d
PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
PKG_CPE_ID:=cpe:/a:golang:go
PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0
PKG_GO_WORK_DIR:=$(PKG_BUILD_DIR)/.go_work
PKG_GO_HOST_CACHE_DIR:=$(PKG_GO_WORK_DIR)/host_cache
PKG_GO_TARGET_CACHE_DIR:=$(PKG_GO_WORK_DIR)/target_cache
PKG_GO_TMP_DIR:=$(PKG_GO_WORK_DIR)/tmp
PKG_GO_PREFIX:=/usr
PKG_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
PKG_GO_ROOT:=$(PKG_GO_PREFIX)/lib/go-$(PKG_GO_VERSION_ID)
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION)
HOST_BUILD_PARALLEL:=1
@ -42,18 +44,27 @@ HOST_GO_VERSION_ID:=cross
HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID)
HOST_GO_VALID_OS_ARCH:= \
android_arm \
darwin_386 darwin_amd64 darwin_arm darwin_arm64 \
dragonfly_amd64 \
freebsd_386 freebsd_amd64 freebsd_arm \
linux_386 linux_amd64 linux_arm linux_arm64 \
netbsd_386 netbsd_amd64 netbsd_arm \
openbsd_386 openbsd_amd64 openbsd_arm \
plan9_386 plan9_amd64 \
solaris_amd64 \
windows_386 windows_amd64 \
android_386 android_amd64 android_arm android_arm64 \
freebsd_386 freebsd_amd64 freebsd_arm freebsd_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \
\
linux_ppc64 linux_ppc64le linux_mips linux_mipsle linux_mips64 linux_mips64le
netbsd_386 netbsd_amd64 netbsd_arm \
plan9_386 plan9_amd64 plan9_arm \
windows_386 windows_amd64 windows_arm \
\
darwin_amd64 darwin_arm64 \
\
dragonfly_amd64 \
illumos_amd64 \
solaris_amd64 \
\
aix_ppc64 \
js_wasm \
\
linux_ppc64 linux_ppc64le \
linux_mips linux_mipsle linux_mips64 linux_mips64le \
linux_riscv64 linux_s390x
BOOTSTRAP_SOURCE:=go1.4-bootstrap-20171003.tar.gz
BOOTSTRAP_SOURCE_URL:=$(GO_SOURCE_URLS)
@ -77,14 +88,18 @@ include $(INCLUDE_DIR)/package.mk
include ../golang-compiler.mk
include ../golang-package.mk
PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
HOST_UNPACK:=$(HOST_TAR) -C $(HOST_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE)
BOOTSTRAP_UNPACK:=$(HOST_TAR) -C $(BOOTSTRAP_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(BOOTSTRAP_SOURCE)
PKG_UNPACK:=$(HOST_TAR) -C "$(PKG_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
HOST_UNPACK:=$(HOST_TAR) -C "$(HOST_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
BOOTSTRAP_UNPACK:=$(HOST_TAR) -C "$(BOOTSTRAP_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(BOOTSTRAP_SOURCE)"
# don't strip ELF executables in test data (and go itself)
# don't strip ELF executables in test data
RSTRIP:=:
STRIP:=:
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
define Package/golang/Default
$(call GoPackage/GoSubMenu)
TITLE:=Go programming language
@ -120,6 +135,10 @@ This package provides an assembler, compiler, linker, and compiled
libraries for the Go programming language.
endef
define Package/golang/config
source "$(SOURCE)/Config.in"
endef
define Package/golang-doc
$(call Package/golang/Default)
TITLE+= (documentation)
@ -143,36 +162,62 @@ This package provides the Go programming language source files needed
for cross-compilation.
endef
define Download/golang-bootstrap
FILE:=$(BOOTSTRAP_SOURCE)
URL:=$(BOOTSTRAP_SOURCE_URL)
HASH:=$(BOOTSTRAP_HASH)
endef
$(eval $(call Download,golang-bootstrap))
$(eval $(call GoCompiler/AddProfile,Bootstrap,$(BOOTSTRAP_BUILD_DIR),,bootstrap,$(GO_HOST_OS_ARCH)))
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH)))
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(GO_TARGET_PREFIX),$(GO_TARGET_VERSION_ID),$(GO_OS_ARCH)))
# Bootstrap
define Host/Prepare
$(call Host/Prepare/Default)
mkdir -p $(BOOTSTRAP_BUILD_DIR)
BOOTSTRAP_ROOT_DIR:=$(call qstrip,$(CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT))
ifeq ($(BOOTSTRAP_ROOT_DIR),)
BOOTSTRAP_ROOT_DIR:=$(BOOTSTRAP_BUILD_DIR)
define Download/golang-bootstrap
FILE:=$(BOOTSTRAP_SOURCE)
URL:=$(BOOTSTRAP_SOURCE_URL)
HASH:=$(BOOTSTRAP_HASH)
endef
$(eval $(call Download,golang-bootstrap))
define Bootstrap/Prepare
mkdir -p "$(BOOTSTRAP_BUILD_DIR)"
$(BOOTSTRAP_UNPACK)
endef
endef
Hooks/HostPrepare/Post+=Bootstrap/Prepare
$(eval $(call GoCompiler/AddProfile,Bootstrap,$(BOOTSTRAP_BUILD_DIR),,bootstrap,$(GO_HOST_OS_ARCH)))
endif
# Host
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
HOST_GO_ENABLE_PIE:=1
endif
# when using GO_LDFLAGS to set buildmode=pie, the PIE install suffix
# does not apply (we also delete the std lib during Host/Install)
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH),$(HOST_GO_INSTALL_SUFFIX)))
HOST_GO_VARS= \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
CC="$(HOSTCC_NOCACHE)" \
CXX="$(HOSTCXX_NOCACHE)"
define Host/Compile
$(call GoCompiler/Bootstrap/CheckHost,$(BOOTSTRAP_GO_VALID_OS_ARCH))
$(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH))
mkdir -p "$(GO_BUILD_CACHE_DIR)"
$(call GoCompiler/Bootstrap/Make, \
CC=$(HOSTCC_NOCACHE) \
CXX=$(HOSTCXX_NOCACHE) \
$(HOST_GO_VARS) \
)
$(call GoCompiler/Host/Make, \
GOROOT_BOOTSTRAP=$(BOOTSTRAP_BUILD_DIR) \
CC=$(HOSTCC_NOCACHE) \
CXX=$(HOSTCXX_NOCACHE) \
GOROOT_BOOTSTRAP="$(BOOTSTRAP_ROOT_DIR)" \
$(if $(HOST_GO_ENABLE_PIE),GO_LDFLAGS="-buildmode pie") \
$(HOST_GO_VARS) \
)
endef
@ -187,77 +232,111 @@ define Host/Install
$(call GoCompiler/Host/Install/BinLinks,)
rm -rf $(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)
rm -rf "$(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)$(if $(HOST_GO_INSTALL_SUFFIX),_$(HOST_GO_INSTALL_SUFFIX))"
$(INSTALL_DIR) $(HOST_GO_ROOT)/openwrt
$(INSTALL_BIN) ./files/go-gcc-helper $(HOST_GO_ROOT)/openwrt/
$(LN) go-gcc-helper $(HOST_GO_ROOT)/openwrt/gcc
$(LN) go-gcc-helper $(HOST_GO_ROOT)/openwrt/g++
$(INSTALL_DIR) "$(HOST_GO_ROOT)/openwrt"
$(INSTALL_BIN) ./files/go-gcc-helper "$(HOST_GO_ROOT)/openwrt/"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/gcc"
$(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/g++"
endef
define Host/Uninstall
rm -rf $(HOST_GO_ROOT)/openwrt
rm -rf "$(HOST_GO_ROOT)/openwrt"
$(call GoCompiler/Host/Uninstall/BinLinks,)
$(call GoCompiler/Host/Uninstall,)
endef
# Target
ifeq ($(GO_PKG_ENABLE_PIE),1)
PKG_GO_INSTALL_SUFFIX:=$(GO_TARGET_PIE_INSTALL_SUFFIX)
endif
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX)))
PKG_GO_ZBOOTSTRAP_MODS:= \
s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),387)`/; \
s/defaultGOARM = `[^`]*`/defaultGOARM = `$(or $(GO_ARM),5)`/; \
s/defaultGOMIPS = `[^`]*`/defaultGOMIPS = `$(or $(GO_MIPS),hardfloat)`/; \
s/defaultGOMIPS64 = `[^`]*`/defaultGOMIPS64 = `$(or $(GO_MIPS64),hardfloat)`/; \
s/defaultGOPPC64 = `[^`]*`/defaultGOPPC64 = `power8`/;
PKG_GO_VARS= \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
GO_GCC_HELPER_PATH="$$$$PATH" \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH="$(HOST_GO_ROOT)/openwrt:$$$$PATH"
PKG_GO_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))' \
$(if $(CONFIG_NO_STRIP)$(CONFIG_DEBUG),,-s -w)
# setting -trimpath is not necessary here because the paths inside the
# compiler binary are relative to GOROOT_FINAL (PKG_GO_ROOT), which is
# static / not dependent on the build environment
PKG_GO_INSTALL_ARGS= \
-ldflags "all=$(PKG_GO_LDFLAGS)" \
$(if $(PKG_GO_GCFLAGS),-gcflags "all=$(PKG_GO_GCFLAGS)") \
$(if $(PKG_GO_ASMFLAGS),-asmflags "all=$(PKG_GO_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie)
define Build/Compile
mkdir -p \
$(PKG_GO_HOST_CACHE_DIR) \
$(PKG_GO_TARGET_CACHE_DIR) \
$(PKG_GO_TMP_DIR)
mkdir -p "$(GO_BUILD_CACHE_DIR)"
@echo "Building target Go first stage"
$(call GoCompiler/Package/Make, \
GOROOT_BOOTSTRAP=$(HOST_GO_ROOT) \
GOCACHE=$(PKG_GO_HOST_CACHE_DIR) \
GOTMPDIR=$(PKG_GO_TMP_DIR) \
GOROOT_BOOTSTRAP="$(HOST_GO_ROOT)" \
GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
GO_GCC_HELPER_PATH=$$$$PATH \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH=$(HOST_GO_ROOT)/openwrt:$$$$PATH \
$(PKG_GO_VARS) \
)
$(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' \
"$(PKG_BUILD_DIR)/src/cmd/internal/objabi/zbootstrap.go"
@echo "Building target Go second stage"
( \
cd $(PKG_BUILD_DIR)/bin ; \
cd "$(PKG_BUILD_DIR)/bin" ; \
export $(GO_PKG_TARGET_VARS) ; \
$(CP) go go-host ; \
GOROOT_FINAL=$(GO_TARGET_ROOT) \
GOCACHE=$(PKG_GO_TARGET_CACHE_DIR) \
GOTMPDIR=$(PKG_GO_TMP_DIR) \
GOROOT_FINAL="$(PKG_GO_ROOT)" \
GO_GCC_HELPER_CC="$(TARGET_CC)" \
GO_GCC_HELPER_CXX="$(TARGET_CXX)" \
GO_GCC_HELPER_PATH=$$$$PATH \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH=$(HOST_GO_ROOT)/openwrt:$$$$PATH \
$(call GoPackage/Environment) \
./go-host install -a -v std cmd ; \
retval=$$$$? ; \
$(PKG_GO_VARS) \
./go-host install -a $(PKG_GO_INSTALL_ARGS) std cmd ; \
retval="$$$$?" ; \
rm -f go-host ; \
exit $$$$retval ; \
exit "$$$$retval" ; \
)
endef
define Package/golang/install
$(call GoCompiler/Package/Install/Bin,$(1)$(GO_TARGET_PREFIX))
$(call GoCompiler/Package/Install/BinLinks,$(1)$(GO_TARGET_PREFIX))
$(call GoCompiler/Package/Install/Bin,$(1)$(PKG_GO_PREFIX))
$(call GoCompiler/Package/Install/BinLinks,$(1)$(PKG_GO_PREFIX))
endef
define Package/golang-doc/install
$(call GoCompiler/Package/Install/Doc,$(1)$(GO_TARGET_PREFIX))
$(call GoCompiler/Package/Install/Doc,$(1)$(PKG_GO_PREFIX))
endef
define Package/golang-src/install
$(call GoCompiler/Package/Install/Src,$(1)$(GO_TARGET_PREFIX))
$(call GoCompiler/Package/Install/Src,$(1)$(PKG_GO_PREFIX))
endef
# src/debug contains ELF executables as test data
@ -268,6 +347,7 @@ define Package/golang-src/extra_provides
echo 'libc.so.6'
endef
$(eval $(call HostBuild))
$(eval $(call BuildPackage,golang))
$(eval $(call BuildPackage,golang-doc))

View file

@ -1,23 +1,41 @@
#!/bin/sh
me=go-gcc-helper
name=$(basename $0)
name="${0##*/}"
case $name in
log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$me: $*"
}
case "$name" in
gcc)
cmd=$GO_GCC_HELPER_CC
if [ -z "$GO_GCC_HELPER_CC" ]; then
log "missing GO_GCC_HELPER_CC"
exit 1
fi
cmd="$GO_GCC_HELPER_CC"
;;
g++)
cmd=$GO_GCC_HELPER_CXX
if [ -z "$GO_GCC_HELPER_CXX" ]; then
log "missing GO_GCC_HELPER_CXX"
exit 1
fi
cmd="$GO_GCC_HELPER_CXX"
;;
*)
echo "$me: unknown command \"$name\""
log "unknown command \"$name\""
exit 1
;;
esac
export PATH="$GO_GCC_HELPER_PATH"
if [ -n "$GO_GCC_HELPER_PATH" ]; then
export PATH="$GO_GCC_HELPER_PATH"
else
log "missing GO_GCC_HELPER_PATH"
fi
echo "$me: running $cmd $@"
log "running $cmd $*"
$cmd "$@"

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsdsvpn/de/>\n"
"Language: de\n"
@ -19,11 +19,11 @@ msgstr "DSVPN"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
msgid "Enable"
msgstr "anschalten"
msgstr "Aktivieren"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
msgid "Interface name"
msgstr "Anschluss-Bezeichnung"
msgstr "Name der Verbindung"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
msgid "Key"

View file

@ -1,27 +1,28 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.3\n"
"Last-Translator: Ycarus <ycarus@zugaina.org>\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"PO-Revision-Date: 2020-09-30 08:50+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsdsvpn/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: Weblate 4.0.4\n"
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:4
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:5
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:6
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:6
msgid "DSVPN"
msgstr ""
msgstr "DSVPN"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
msgid "Enable"
msgstr "Activé"
msgstr "Activer"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
msgid "Interface name"
@ -29,7 +30,7 @@ msgstr "Nom de l'interface"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
msgid "Key"
msgstr "Clef"
msgstr "Clé"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:15
msgid "Remote host"

View file

@ -0,0 +1,50 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsdsvpn/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:4
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:5
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:6
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:6
msgid "DSVPN"
msgstr "DSVPN"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
msgid "Enable"
msgstr "Attivare"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
msgid "Interface name"
msgstr "Nome interfaccia"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
msgid "Key"
msgstr "Key"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:15
msgid "Remote host"
msgstr "Rimuovi server"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:21
msgid "Remote port"
msgstr "Porta remota"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:8
msgid "Settings"
msgstr "Impostazioni"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:31
msgid "Tunnel local IP"
msgstr "IP locale del tunnel"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:35
msgid "Tunnel remote IP"
msgstr "IP remoto del tunnel"

View file

@ -0,0 +1,50 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-18 17:37+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsdsvpn/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:4
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:5
#: luci-app-dsvpn/luasrc/controller/dsvpn.lua:6
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:6
msgid "DSVPN"
msgstr "DSVPN"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
msgid "Enable"
msgstr "Activat"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
msgid "Interface name"
msgstr "Nom de linterfàcia"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
msgid "Key"
msgstr "Clau"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:15
msgid "Remote host"
msgstr "Nom de lòste distant o adreça IP"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:21
msgid "Remote port"
msgstr "Pòrt distant"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:8
msgid "Settings"
msgstr "Paramètres"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:31
msgid "Tunnel local IP"
msgstr "Adreça IP locala del tunèl"
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:35
msgid "Tunnel remote IP"
msgstr "Adreça IP distanta del tunèl"

View file

@ -281,6 +281,12 @@ return view.extend({
fwtool.addLimitOption(s);
fwtool.addLimitBurstOption(s);
o = s.taboption('advanced', form.Flag, 'v2ray', _('Use V2Ray'),
_('Forwards ports from server using V2Ray proxy (if enabled) instead of VPN'));
o.modalonly = true;
o.editable = true;
o.depends({ src: 'vpn', '!contains': true });
o = s.taboption('advanced', form.Value, 'extra', _('Extra arguments'),
_('Passes additional arguments to iptables. Use with care!'));
o.modalonly = true;

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Anonymous <noreply@weblate.org>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsglorytun/de/>\n"
"Language: de\n"
@ -11,11 +11,13 @@ msgstr ""
"X-Generator: Weblate 4.0.4\n"
msgid "Add"
msgstr "hinzufügen"
msgstr "Hinzufügen"
msgid ""
"Below is a list of configured Glorytun instances and their current state"
msgstr "Liste der konfigurierten Glorytun-Instanzen und ihr aktueller Status"
msgstr ""
"Nachfolgend eine Liste der konfigurierten Glorytun-Instanzen und ihre "
"aktuelle Status."
msgid "Bind address"
msgstr "Bindungsadresse"
@ -27,28 +29,28 @@ msgid "Bind port"
msgstr "Verbindungs-Port"
msgid "Enable"
msgstr "anschalten"
msgstr "Aktivieren"
msgid "Enabled"
msgstr "aktiv"
msgstr "Aktiv"
msgid "Glorytun"
msgstr "Glorytun"
msgid "Glorytun instances"
msgstr "Glorytun-Instanz"
msgstr "Glorytun-Instanzen"
msgid "Instance \"%s\""
msgstr "Instanz '%s'"
msgid "Interface"
msgstr "Anschluss"
msgstr "Schnittstelle"
msgid "Interface name"
msgstr "Anschluss-Bezeichnung"
msgstr "Name der Verbindung"
msgid "Invalid"
msgstr "ungültig"
msgstr "Ungültig"
msgid "Local tunnel ip address"
msgstr "IP-Adresse des lokalen Tunnels"

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2020-08-03 12:39+0000\n"
"PO-Revision-Date: 2020-10-07 10:57+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsglorytun/fr/>\n"
@ -20,19 +20,19 @@ msgid "Below is a list of configured Glorytun instances and their current state"
msgstr "Ci-dessous une liste des instances Glorytun configurées et leur état actuel"
msgid "Bind address"
msgstr ""
msgstr "Adresse mappée"
msgid "Bind backup"
msgstr ""
msgstr "Lier la sauvegarde"
msgid "Bind port"
msgstr "Port de connexion"
msgid "Enable"
msgstr "Active"
msgstr "Activer"
msgid "Enabled"
msgstr "Activé"
msgstr "Activer"
msgid "Glorytun"
msgstr "Glorytun"
@ -62,7 +62,7 @@ msgid "MTU"
msgstr "MTU"
msgid "MTU auto"
msgstr ""
msgstr "MTU auto"
msgid "Overview"
msgstr "Aperçu"

View file

@ -0,0 +1,104 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsglorytun/it/>\n"
"Language: it\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.0.4\n"
msgid "Add"
msgstr "Aggiungi"
msgid ""
"Below is a list of configured Glorytun instances and their current state"
msgstr ""
"Di seguito è riportato un elenco di istanze Glorytun configurate e il loro "
"stato corrente"
msgid "Bind address"
msgstr "Associa indirizzo"
msgid "Bind backup"
msgstr "Bind backup"
msgid "Bind port"
msgstr "Bind port"
msgid "Enable"
msgstr "Attivare"
msgid "Enabled"
msgstr "Abilitato"
msgid "Glorytun"
msgstr "Glorytun"
msgid "Glorytun instances"
msgstr "Istanze di Glorytun"
msgid "Instance \"%s\""
msgstr "Istanza \"%s\""
msgid "Interface"
msgstr "Interfaccia"
msgid "Interface name"
msgstr "Nome interfaccia"
msgid "Invalid"
msgstr "Non valido"
msgid "Local tunnel ip address"
msgstr "Indirizzo IP del tunnel locale"
msgid "MPTCP"
msgstr "MPTCP"
msgid "MTU"
msgstr "MTU"
msgid "MTU auto"
msgstr "MTU auto"
msgid "Overview"
msgstr "Panoramica"
msgid "Port"
msgstr "Porta"
msgid "Protocol"
msgstr "Protocollo"
msgid "Remote host name or ip address"
msgstr "Nome host remoto o indirizzo IP"
msgid "Remote tunnel ip address"
msgstr "Indirizzo IP del tunnel remoto"
msgid "Server mode"
msgstr "Modalità server"
msgid "Start/Stop"
msgstr "Marcia/arresto"
msgid "Started"
msgstr "Iniziato"
msgid "TCP port # for both local and remote"
msgstr "Porta TCP # sia per locale che per remoto"
msgid "The secret key"
msgstr "Chiave segreta"
msgid "Use ChaCha20 stream cipher"
msgstr "Usa il cifrario a flusso ChaCha20"
msgid "no"
msgstr "no"
msgid "yes (%i)"
msgstr "Sì (%i)"

View file

@ -0,0 +1,103 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-10-13 07:30+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsglorytun/oc/>\n"
"Language: oc\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.0.4\n"
msgid "Add"
msgstr "Ajustar"
msgid ""
"Below is a list of configured Glorytun instances and their current state"
msgstr ""
"Çai-jos una lista de las instàncias Glorytun configuradas e lor estat actual"
msgid "Bind address"
msgstr "Adreça mapada"
msgid "Bind backup"
msgstr "Associar la salvagarda"
msgid "Bind port"
msgstr "Pòrt de connexion"
msgid "Enable"
msgstr "Activat"
msgid "Enabled"
msgstr "Activat"
msgid "Glorytun"
msgstr "Glorytun"
msgid "Glorytun instances"
msgstr "Instàncias Glorytun"
msgid "Instance \"%s\""
msgstr "Instància « %s»"
msgid "Interface"
msgstr "Interfàcia"
msgid "Interface name"
msgstr "Nom de linterfàcia"
msgid "Invalid"
msgstr "Invalid"
msgid "Local tunnel ip address"
msgstr "Adreça IP locala del tunèl"
msgid "MPTCP"
msgstr "MPTCP"
msgid "MTU"
msgstr "MTU"
msgid "MTU auto"
msgstr "MTU auto"
msgid "Overview"
msgstr "Apercebut"
msgid "Port"
msgstr "Pòrt"
msgid "Protocol"
msgstr "Protocòl"
msgid "Remote host name or ip address"
msgstr "Nom de lòste alonhat o adreça IP"
msgid "Remote tunnel ip address"
msgstr "Adreça IP alonhada del tunèl"
msgid "Server mode"
msgstr "Mòde servidor"
msgid "Start/Stop"
msgstr "Aviar/Arrestar"
msgid "Started"
msgstr "Aviat"
msgid "TCP port # for both local and remote"
msgstr "Pòrt TCP local e alonhat"
msgid "The secret key"
msgstr "La clau secrèta"
msgid "Use ChaCha20 stream cipher"
msgstr "Utilizar lo chiframent ChaCha20"
msgid "no"
msgstr "non"
msgid "yes (%i)"
msgstr "òc (%i)"

View file

@ -2,15 +2,16 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Last-Translator: Ycarus <ycarus@zugaina.org>\n"
"Language-Team: \n"
"PO-Revision-Date: 2020-09-30 08:50+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.2.3\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
@ -87,7 +88,7 @@ msgstr "En attente de la réponse de la commande..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr ""
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
@ -95,4 +96,4 @@ msgstr "Tests de vitesse iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr ""
msgstr "iperf"

View file

@ -0,0 +1,96 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per illimitato. Deve essere limitato per il test UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "È stato specificato un indirizzo errato!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Scarica"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Internet Protocol (Protocollo Internet)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Caricamento in corso"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Modalità di funzionamento"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Numero di flussi client paralleli da eseguire"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Ometti i primi n secondi"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Server"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Impostazioni"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Bitrate desiderato (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Test"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Questa interfaccia iPerf è in bêta."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "È ora di trasmettere per (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Carica"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "In attesa del completamento del comando ..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Prove di velocità iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iPerf"

View file

@ -0,0 +1,96 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per cap de limit. Requerís un limit pels ensages UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Adreça invalida !"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Telecargament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Protocòl Internet"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Cargament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Mòde de foncionament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Nombre de clients en parallèl"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Sautar las primièras n segondas"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Servidor"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Paramètres"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Velocitat desirada (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Pròva"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Aquesta interfàcia per iPerf es en beta. Cap de support per aquò."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Temps de transmission (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Mandadís"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "En espèra duna responsa de la comanda..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Pròva de velocitat iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iperf"

View file

@ -0,0 +1,46 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmail/it/>\n"
"Language: it\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.0.4\n"
msgid "From"
msgstr "Da"
msgid "Mail settings"
msgstr "Impostazioni mail"
msgid "Password"
msgstr "Password"
msgid "Port"
msgstr "Porta"
msgid "SMTP"
msgstr "SMTP"
msgid "STARTTLS"
msgstr "STARTTLS"
msgid "Server"
msgstr "Server"
msgid "Set mail settings for services that need to send mails."
msgstr ""
"Configurare le impostazioni di posta per i servizi che devono inviare "
"messaggi di posta elettronica."
msgid "TLS"
msgstr "TLS"
msgid "To"
msgstr "A"
msgid "Username"
msgstr "Username"

View file

@ -0,0 +1,46 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmail/oc/>\n"
"Language: oc\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.0.4\n"
msgid "From"
msgstr "De"
msgid "Mail settings"
msgstr "Paramètres e-mail"
msgid "Password"
msgstr "Senhal"
msgid "Port"
msgstr "Pòrt"
msgid "SMTP"
msgstr "SMTP"
msgid "STARTTLS"
msgstr "STARTTLS"
msgid "Server"
msgstr "Servidor"
msgid "Set mail settings for services that need to send mails."
msgstr ""
"Definissètz los paramètres de messatjariá pels servicis que devon enviar "
"de-mails."
msgid "TLS"
msgstr "TLS"
msgid "To"
msgstr "A"
msgid "Username"
msgstr "Nom d'utilizaire"

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmlvpn/de/>\n"
"Language: de\n"
@ -11,16 +11,16 @@ msgstr ""
"X-Generator: Weblate 4.0.4\n"
msgid "Add"
msgstr "hinzufügen"
msgstr "Hinzufügen"
msgid "Enable"
msgstr "anschalten"
msgstr "Aktivieren"
msgid "First remote port"
msgstr "Erster Gegenstellen-Port"
msgid "Interface name"
msgstr "Anschluss-Bezeichnung"
msgstr "Name der Verbindung"
msgid "Interface will increase port used beginning with this"
msgstr "Der Anschluss wird die Pornummern nutzen beginnend mit diesem Wert"
@ -29,7 +29,7 @@ msgid "Interfaces"
msgstr "Anschlüsse"
msgid "Invalid"
msgstr "ungültig"
msgstr "Ungültig"
msgid "Loss tolerance"
msgstr "Verlust-Toleranz"

View file

@ -1,22 +1,23 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.0.6\n"
"Last-Translator: Ycarus <ycarus@zugaina.org>\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"PO-Revision-Date: 2020-10-07 10:57+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmlvpn/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: Weblate 4.0.4\n"
msgid "Add"
msgstr "Ajouter"
msgid "Enable"
msgstr "Activé"
msgstr "Activer"
msgid "First remote port"
msgstr "Premier port distant"
@ -25,7 +26,7 @@ msgid "Interface name"
msgstr "Nom de l'interface"
msgid "Interface will increase port used beginning with this"
msgstr ""
msgstr "L'interface augmentera le port utilisé à partir de celui ci"
msgid "Interfaces"
msgstr "Interfaces"
@ -34,13 +35,13 @@ msgid "Invalid"
msgstr "Invalide"
msgid "Loss tolerance"
msgstr ""
msgstr "Tolérance aux pertes"
msgid "MLVPN"
msgstr ""
msgstr "MLVPN"
msgid "Mode"
msgstr ""
msgstr "Mode"
msgid "Password"
msgstr "Mot de passe"
@ -52,7 +53,7 @@ msgid "Remote/Bind port"
msgstr "Port de connexion distant"
msgid "Reorder buffer size"
msgstr ""
msgstr "Taille du tampon de réordonnancement"
msgid "Settings"
msgstr "Paramètres"

View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmlvpn/it/>\n"
"Language: it\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.0.4\n"
msgid "Add"
msgstr "Aggiungi"
msgid "Enable"
msgstr "Attivare"
msgid "First remote port"
msgstr "Prima porta remota"
msgid "Interface name"
msgstr "Nome interfaccia"
msgid "Interface will increase port used beginning with this"
msgstr "L&#39;interfaccia aumenterà la porta utilizzata a partire da questa"
msgid "Interfaces"
msgstr "Interfaccia"
msgid "Invalid"
msgstr "Non valido"
msgid "Loss tolerance"
msgstr "Tolleranza alla perdita"
msgid "MLVPN"
msgstr "MLVPN"
msgid "Mode"
msgstr "Modo"
msgid "Password"
msgstr "Password"
msgid "Remote host"
msgstr "Rimuovi server"
msgid "Remote/Bind port"
msgstr "Porta remota / Bind"
msgid "Reorder buffer size"
msgstr ""
msgid "Settings"
msgstr "Impostazioni"
msgid "Timeout (s)"
msgstr ""

View file

@ -34,12 +34,31 @@ function interface_bandwidth(iface)
end
end
function string.split(input, delimiter)
input = tostring(input)
delimiter = tostring(delimiter)
if (delimiter=='') then return false end
local pos,arr = 0, {}
-- for each divider found
for st,sp in function() return string.find(input, delimiter, pos, true) end do
table.insert(arr, string.sub(input, pos, st - 1))
pos = sp + 1
end
table.insert(arr, string.sub(input, pos))
return arr
end
function multipath_bandwidth()
local result = { };
local uci = luci.model.uci.cursor()
local res={ };
local str="";
local tmpstr="";
uci:foreach("network", "interface", function(s)
local intname = s[".name"]
local label = s["label"]
local dev = get_device(intname)
if dev == "" then
dev = get_device(s["ifname"])
@ -53,17 +72,89 @@ function multipath_bandwidth()
multipath = "off"
end
if multipath == "on" or multipath == "master" or multipath == "backup" or multipath == "handover" then
local bwc = luci.sys.exec("luci-bwc -i %q 2>/dev/null" % dev) or ""
local bwc = luci.sys.exec("luci-bwc -i %q 2>/dev/null" % dev) or ""
if bwc ~= nil then
--result[dev] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
result[intname] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
if label ~= nil then
result[intname .. " (" .. label .. ")" ] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
else
result[intname] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
end
else
result[dev] = "[]"
if label ~= nil then
result[intname .. " (" .. label .. ")" ] = "[]"
else
result[intname] = "[]"
end
end
end
end
end)
res["total"]={ };
for i=1,60 do
res["total"][i]={}
for j=1,5 do
res["total"][i][j]=0
end
end
for key,value in pairs(result) do
res[key]={}
value=(string.gsub(value, "^%[%[", ""))
value=(string.gsub(value, "%]%]", ""))
local temp1 = string.split(value, "],")
if temp1[2] ~= nil then
res[key][1]=temp1[1]
for i=2,60 do
res[key][i]={}
if temp1[i] ~= nil then
res[key][i]=(string.gsub(temp1[i], "%[", " "))
end
end
for i=1,60 do
res[key][i] = string.split(res[key][i], ",")
for j=1,5 do
if "string"== type(res[key][i][j]) then
res[key][i][j]= tonumber(res[key][i][j])
end
if "string"==type(res["total"][i][j]) then
res["total"][i][j]= tonumber(res["total"][i][j])
end
if j ==1 then
if res[key][i][j] ~= nil then
res["total"][i][j] = res[key][i][j]
else
res["total"][i][j] = 0
end
else
if res[key][i][j] ~= nil then
res["total"][i][j] = res["total"][i][j] + res[key][i][j]
end
end
end
end
end
end
for i=1,60 do
for j=1,5 do
if "number"== type(res["total"][i][j]) then
res["total"][i][j]= tostring(res["total"][i][j])
end
end
end
for i=1,60 do
if i == 60 then
tmpstr = "["..table.concat(res["total"][i], ",")
else
tmpstr = "["..table.concat(res["total"][i], ",").."],"
end
str = str..tmpstr
end
str = "["..str.."]]"
result["total"]=str
luci.http.prepare_content("application/json")
luci.http.write_json(result)
end

View file

@ -3,9 +3,9 @@
-- Copyright 2015 OVH (OverTheBox@ovh.net)
-- Simon Lelievre (simon.lelievre@corp.ovh.com)
-- Sebastien Duponcheel (sebastien.duponcheel@ovh.net)
-- Copyright 2018-2020 Ycarus - Yannick Chabanois (ycarus@zugaina.org)
-- Copyright 2018-2020 Ycarus - Yannick Chabanois (ycarus@zugaina.org) for OpenMPTCProuter
--
-- This file is part of OverTheBox for OpenWrt.
-- Part of this file come from OverTheBox for OpenWrt.
--
-- OverTheBox is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
@ -45,6 +45,9 @@
end
local curifname = luci.http.formvalue("dev") or "all"
local bandwidthtotalurl = "admin/network/mptcp/multipath_bandwidth"
local bandwidthintfurl = "admin/network/mptcp/interface_bandwidth"
-%>
<%+header%>
@ -54,21 +57,23 @@
<script type="text/javascript">//<![CDATA[
function stringToColour(str) {
if(str == "wan")
if(str == "total")
return "OrangeRed";
if(str.substring(0, 4) == "wan")
return "FireBrick";
if(str == "wan1")
if(str.substring(0, 4) == "wan1")
return "DeepSkyBlue";
if(str == "wan2")
if(str.substring(0, 4) == "wan2")
return "SeaGreen";
if(str == "wan3")
if(str.substring(0, 4) == "wan3")
return "PaleGreen";
if(str == "wan4")
if(str.substring(0, 4) == "wan4")
return "PowderBlue";
if(str == "wan5")
if(str.substring(0, 4) == "wan5")
return "Salmon";
if(str == "wan6")
if(str.substring(0, 4) == "wan6")
return "LightGreen";
if(str == "wan7")
if(str.substring(0, 4) == "wan7")
return "PaleTurquoise";
// Generate a color folowing the name
Math.seedrandom(str);
@ -185,13 +190,6 @@
height = dnsvg.offsetHeight - 2;
data_wanted = Math.ceil(width / step);
/* prefill datasets
for (var i = 0; i < data_wanted; i++)
{
data_tx[i] = 0;
}
*/
/* find svg elements */
labeldn_25 = Gdn.getElementById('label_25');
labeldn_50 = Gdn.getElementById('label_50');
@ -244,7 +242,7 @@
labelup_scale.innerHTML = String.format('<%:(%d minutes window, %d seconds interval)%>', 3, data_wanted / 60);
/* render datasets, start update interval */
XHR.poll(3, '<%=build_url("admin/network/mptcp/multipath_bandwidth", all)%>', null,
XHR.poll(3, '<%=build_url(bandwidthtotalurl, all)%>', null,
function(x, dataarray)
{
var data_max_dnl = 0;
@ -259,6 +257,7 @@
var data_tx_peak = 0;
var data = {};
var pre_itf = "";
for(var itf in dataarray)
{
@ -271,7 +270,15 @@
// Create a new polygon to draw the bandwith
var dnline = Gdn.createElementNS('http://www.w3.org/2000/svg', 'polyline');
dnline.setAttributeNS(null, 'id', 'rx_' + itf);
dnline.setAttributeNS(null, 'style', 'fill:' + color + ';fill-opacity:0.4;stroke:black;stroke-width:0.1');
if (itf != "total")
{
dnline.setAttributeNS(null, 'style', 'fill:' + color + ';fill-opacity:0.4;stroke:black;stroke-width:0.1');
}
else
{
//dnline.setAttributeNS(null, 'style', 'fill: none;stroke:OrangeRed;stroke-width:1');
dnline.setAttributeNS(null, 'style', 'fill: none;stroke:none');
}
Gdn.getElementById('rx').parentNode.appendChild(dnline);
dnPolygons[itf] = Gdn.getElementById('rx_' + itf);
@ -284,11 +291,18 @@
// Create legend for this connextion
var table = document.getElementById('download_stats');
var tr = table.insertRow();
if (pre_itf == "total")
{
var tr = table.insertRow(0);
}
else
{
var tr = table.insertRow();
}
tr.setAttribute('id', itf + '_download');
// Create cells of the table
var itflabel = tr.insertCell(0);
// Crete itf legend
// Create itf legend
var strong = document.createElement('strong')
strong.appendChild(document.createTextNode(itf));
strong.setAttribute('style', 'border-bottom:2px solid ' + color);
@ -312,7 +326,15 @@
{
var upline = Gup.createElementNS('http://www.w3.org/2000/svg', 'polyline');
upline.setAttributeNS(null, 'id', 'tx_' + itf);
upline.setAttributeNS(null, 'style', 'fill:' + color + ';fill-opacity:0.4;stroke:black;stroke-width:0.1');
if (itf != "total")
{
upline.setAttributeNS(null, 'style', 'fill:' + color + ';fill-opacity:0.4;stroke:black;stroke-width:0.1');
}
else
{
//upline.setAttributeNS(null, 'style', 'fill:none;stroke:OrangeRed;stroke-width:1');
upline.setAttributeNS(null, 'style', 'fill:none;stroke:none');
}
Gup.getElementById('tx').parentNode.appendChild(upline);
upPolygons[itf] = Gup.getElementById('tx_' + itf);
@ -325,7 +347,16 @@
// Create legend for this connextion
var table = document.getElementById('upload_stats');
var tr = table.insertRow();
if (pre_itf == "total")
{
var tr = table.insertRow(0);
}
else
{
var tr = table.insertRow();
}
tr.setAttribute('id', itf + '_upload');
// Create cells of the table
var itflabel = tr.insertCell(0);
@ -347,8 +378,8 @@
var itfpeak = tr.insertCell(6);
itfpeak.setAttribute('id', itf + '_upload_peak');
itfpeak.appendChild(document.createTextNode('0 <%:kbit/s%> (0 <%:kB/s%>)'));
}
if (pre_itf != "total") pre_itf = itf;
}
var dnsma = {};
@ -402,6 +433,7 @@
var toadditf = [ ];
for (var itf in data)
{
//if (itf == "total") continue;
uplineDnl[itf] = [ ];
downlineDnl[itf]= [ ];
uplineUpl[itf] = [ ];
@ -415,11 +447,15 @@
{
var rx_bot=0;
var tx_bot=0;
if (itf != "total")
{
for(var j=0; j < toadditf.length; j++)
{
if (toadditf[j] == "total") continue;
rx_bot += dndata[toadditf[j]][i];
tx_bot += updata[toadditf[j]][i];
}
}
// set upline of the interface
uplineDnl[itf][i] = dndata[itf][i] + rx_bot;
data_rx_peak = Math.max(data_rx_peak, dndata[itf][i]);
@ -439,11 +475,14 @@
}
if(toadditf.length)
{
if (toadditf[toadditf.length-1] != "total")
{
downlineDnl[itf][i] = uplineDnl[toadditf[toadditf.length-1]][i];
downlineUpl[itf][i] = uplineUpl[toadditf[toadditf.length-1]][i];
}
}
}
toadditf.push(itf);
// Update stats labels
@ -481,6 +520,7 @@
for (var itf in uplineDnl)
{
if (itf == "total") continue;
var y_rx = 0;
var y_tx = 0;
@ -551,7 +591,7 @@
if (typeof dntopline != "object")
{
dntopline = Gdn.getElementById('rx');
dntopline.setAttributeNS(null, 'style', 'stroke:DimGray;stroke-width:1;stroke-linecap="round";fill:;fill-opacity:0;');
dntopline.setAttributeNS(null, 'style', 'stroke:DimGray;stroke-width:0;stroke-linecap="round";fill:;fill-opacity:0;');
/* Move line on top */
var father = dntopline.parentNode;
father.removeChild(dntopline);
@ -560,28 +600,26 @@
if (typeof uptopline != "object")
{
uptopline = Gup.getElementById('tx');
uptopline.setAttributeNS(null, 'style', 'stroke:DimGray;stroke-width:1;stroke-linecap="round";fill:;fill-opacity:0;');
uptopline.setAttributeNS(null, 'style', 'stroke:DimGray;stroke-width:0;stroke-linecap="round";fill:;fill-opacity:0;');
/* Move line on top */
var father = uptopline.parentNode;
father.removeChild(uptopline);
father.appendChild(uptopline);
}
var y_rx = 0;
var y_tx = 0;
var y_rx = 0;
var y_tx = 0;
/* plot data */
var pt_rx = '0,' + height;
var pt_tx = '0,' + height;
/* plot data */
var pt_rx = '0,' + height;
var pt_tx = '0,' + height;
// draw polygon
for (var i = 0; i < uplineDnl[itf].length; i++)
{
var x = i * step;
y_rx = height - Math.floor((uplineDnl[itf][i]) * data_scale_dnl);
y_tx = height - Math.floor((uplineUpl[itf][i]) * data_scale_upl);
pt_rx += ' ' + x + ',' + y_rx;
// draw polygon
for (var i = 0; i < uplineDnl[itf].length; i++)
{
var x = i * step;
y_rx = height - Math.floor((uplineDnl[itf][i]) * data_scale_dnl);
y_tx = height - Math.floor((uplineUpl[itf][i]) * data_scale_upl);
pt_rx += ' ' + x + ',' + y_rx;
pt_tx += ' ' + x + ',' + y_tx;
}
// draw last tangant point in upline graph
@ -737,7 +775,7 @@
label_scale.innerHTML = String.format('<%:(%d minute window, %d second interval)%>', data_wanted / 60, 3);
/* render datasets, start update interval */
XHR.poll(3, '<%=build_url("admin/network/mptcp/interface_bandwidth", curifname)%>', null,
XHR.poll(3, '<%=build_url(bandwidthintfurl, curifname)%>', null,
function(x, data)
{
var data_max = 0;
@ -855,9 +893,13 @@ window.setTimeout(function()
<ul class="cbi-tabmenu">
<% for _, dev in ipairs(devices) do
local ifname = get_device(dev)
%>
<li class="cbi-tab<%= ifname == curifname and "" or "-disabled" %>"><a href="?dev=<%=pcdata(get_device(dev))%>"><%=pcdata(dev)%></a></li>
local label = uci:get("network",dev,"label")
if label ~= nil then
%>
<li class="cbi-tab<%= ifname == curifname and "" or "-disabled" %>"><a href="?dev=<%=pcdata(get_device(dev))%>"><%=label%></a></li>
<% else %>
<li class="cbi-tab<%= ifname == curifname and "" or "-disabled" %>"><a href="?dev=<%=pcdata(get_device(dev))%>"><%=pcdata(dev)%></a></li>
<% end %>
<% end %>
</ul>

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmptcp/de/>\n"
"Language: de\n"
@ -81,7 +81,7 @@ msgstr "Ankommend:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
msgid "Interface"
msgstr "Anschluss"
msgstr "Schnittstelle"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:55
msgid "Interfaces Settings"

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2020-08-03 12:39+0000\n"
"PO-Revision-Date: 2020-10-07 10:57+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmptcp/fr/>\n"
@ -35,7 +35,7 @@ msgid "Download:"
msgstr "Téléchargement :"
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr ""
msgstr "Sous-flux Fullmesh pour chaque paire d'adresses IP"
msgid "Inbound:"
msgstr "Entrant :"
@ -50,13 +50,13 @@ msgid "MPTCP"
msgstr "MPTCP"
msgid "Mbit/s"
msgstr ""
msgstr "Mbit/s"
msgid "Multipath TCP"
msgstr "Multipath TCP"
msgid "Multipath TCP SYN retries"
msgstr ""
msgstr "Tentatives Multipath TCP SYN"
msgid "Multipath TCP checksum"
msgstr "Somme de contrôle Multipath TCP"
@ -64,7 +64,6 @@ msgstr "Somme de contrôle Multipath TCP"
msgid "Multipath TCP path-manager"
msgstr "Gestionnaire de chemins Multipath TCP"
#, fuzzy
msgid "Multipath TCP scheduler"
msgstr "Planificateur Multipath TCP"
@ -87,7 +86,7 @@ msgid "Peak:"
msgstr "Pointe :"
msgid "Re-create fullmesh subflows after a timeout"
msgstr ""
msgstr "Recréer les sous-flux fullmesh après le délai d'expiration"
msgid "Realtime Traffic"
msgstr "Trafic temps réel"
@ -98,12 +97,11 @@ msgstr "Paramètres"
msgid "Upload:"
msgstr "Envoie :"
#, fuzzy
msgid "backup"
msgstr "copie de sauvegarde"
msgstr "remplaçant"
msgid "binder"
msgstr ""
msgstr "lier"
msgid "default"
msgstr "Défaut"
@ -121,16 +119,16 @@ msgid "enabled"
msgstr "Activé"
msgid "fullmesh"
msgstr ""
msgstr "fullmesh"
msgid "handover"
msgstr ""
msgstr "relais"
msgid "kB/s"
msgstr ""
msgstr "Ko/s"
msgid "kbit/s"
msgstr ""
msgstr "kbit/s"
msgid "master"
msgstr "maître"
@ -139,14 +137,13 @@ msgid "ndiffports"
msgstr "ndiffports"
msgid "ndiffports subflows number"
msgstr ""
msgstr "Nombre de sous-flux ndiffports"
#, fuzzy
msgid "redundant"
msgstr "redondant"
msgid "round-robin"
msgstr ""
msgstr "à tour de rôle"
#~ msgid "Networks MPTCP settings"
#~ msgstr "Paramètres réseaux MPTCP"

View file

@ -0,0 +1,295 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-10-02 08:44+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmptcp/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:779
msgid "(%d minute window, %d second interval)"
msgstr "(finestra di% d minuti, intervallo di% d secondi)"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:245
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:246
msgid "(%d minutes window, %d seconds interval)"
msgstr "(finestra di% d minuti, intervallo di% d secondi)"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
msgid "Average:"
msgstr "Media:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:34
msgid "BLEST"
msgstr "BLEST"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
msgid "Bandwidth"
msgstr "Larghezza banda"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
msgid "Check if MPTCP between interface and server is working."
msgstr "Controlla se MPTCP tra l'interfaccia e il server funziona."
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:40
msgid "Congestion Control"
msgstr "Controllo della congestione"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
msgid "Current:"
msgstr "Corrente:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:40
msgid "Default is bbr"
msgstr "L&#39;impostazione predefinita è bbr"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
msgid "Download:"
msgstr "Scarica:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:35
msgid "ECF"
msgstr "ECF"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
msgid "Error"
msgstr "Errore"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
msgid "Established connections"
msgstr "Connessioni stabilite"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:45
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr "Flussi secondari fullmesh per ogni coppia di indirizzi IP"
#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
msgid "Grant UCI access for luci-app-mptcp"
msgstr "Concedi l'accesso UCI per luci-app-mptcp"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
msgid "Inbound:"
msgstr "In entrata:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
msgid "Interface"
msgstr "Interfaccia"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
msgid "Interfaces Settings"
msgstr "Impostazioni delle interfacce"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
msgid "Loading"
msgstr "Caricamento in corso"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:90
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
msgid "MB/s"
msgstr "MB/s"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
msgid "MPTCP"
msgstr "MPTCP"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
msgid "MPTCP Fullmesh"
msgstr "MPTCP Fullmesh"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
msgid "MPTCP Support Check"
msgstr "Verifica supporto MPTCP"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:99
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:699
msgid "Mbit/s"
msgstr "Mbit/s"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
msgid "Multipath Debug"
msgstr "Debug multipath"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
msgid "Multipath TCP"
msgstr "Multipath TCP"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:37
msgid "Multipath TCP SYN retries"
msgstr "Multipath TCP SYN riprova"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
msgid "Multipath TCP checksum"
msgstr "Multipath TCP checksum"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
msgid "Multipath TCP path-manager"
msgstr "Multipath TCP path-manager"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:29
msgid "Multipath TCP scheduler"
msgstr "Multipath TCP scheduler"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:27
msgid "Netlink"
msgstr "Netlink"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
msgid ""
"Networks MPTCP settings. Visit <a href='http://multipath-tcp.org/pmwiki.php/"
"Users/ConfigureMPTCP'>http://multipath-tcp.org/pmwiki.php/Users/"
"ConfigureMPTCP</a> for help."
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
msgid "One interface must be set as master"
msgstr "Un'interfaccia deve essere impostata come master"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
msgid "Outbound:"
msgstr "In uscita:"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:323
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:381
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
msgid "Peak:"
msgstr "Picco:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:48
msgid "Re-create fullmesh subflows after a timeout"
msgstr "Ricrea i flussi secondari fullmesh dopo un timeout"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:895
msgid "Realtime Traffic"
msgstr "Traffico in tempo reale"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
msgid "Settings"
msgstr "Impostazioni"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
msgid "Test"
msgstr "Test"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
msgid "Upload:"
msgstr "Carica:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
msgid "Waiting for command to complete..."
msgstr "In attesa del completamento del comando ..."
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:61
msgid "backup"
msgstr "backup"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:25
msgid "binder"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:30
msgid "default"
msgstr "predefinito"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:50
msgid "disable"
msgstr "disabilita"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
msgid "disabled"
msgstr "disabilitato"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:49
msgid "enable"
msgstr "Attivare"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:58
msgid "enabled"
msgstr "Abilitato"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:23
msgid "fullmesh"
msgstr "fullmesh"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:85
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:384
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:685
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
msgid "kB/s"
msgstr "kB/s"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:94
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:384
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:694
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
msgid "kbit/s"
msgstr "kbit/s"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:60
msgid "master"
msgstr "Principale"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:24
msgid "ndiffports"
msgstr "ndiffports"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
msgid "ndiffports subflows number"
msgstr "ndiffports subflows number"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
msgid "redundant"
msgstr "ridondante"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
msgid "round-robin"
msgstr "round-robin"

View file

@ -0,0 +1,294 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-10-19 09:37+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsmptcp/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:652
msgid "(%d minute window, %d second interval)"
msgstr "(fenèstra de %d minuta,interval de %d segonda)"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:227
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:228
msgid "(%d minutes window, %d seconds interval)"
msgstr "(fenèstra de %d minutas,interval de %d segondas)"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:284
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:323
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:796
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:806
msgid "Average:"
msgstr "Mejana:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:34
#, fuzzy
msgid "BLEST"
msgstr "BLEST"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
msgid "Bandwidth"
msgstr "Benda passanta"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
msgid "Check if MPTCP between interface and server is working."
msgstr "Verificar se MPTCP entre linterfàcia e lo servidor fonciona."
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
msgid "Congestion Control"
msgstr "Contraròtle de congestion"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:280
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
msgid "Current:"
msgstr "Actualament:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
msgid "Default is bbr"
msgstr "Per defaut bbr"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:772
msgid "Download:"
msgstr "Telecargament:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
msgid "Error"
msgstr "Error"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
msgid "Established connections"
msgstr "Connexions establidas"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:44
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr "Jos flux Fullmesh per cada parelh dadreças IP"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:793
msgid "Inbound:"
msgstr "Dintrant:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
msgid "Interface"
msgstr "Interfàcia"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:55
msgid "Interfaces Settings"
msgstr "Paramètres de las interfàcias"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
msgid "Loading"
msgstr "Cargament"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:79
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:563
msgid "MB/s"
msgstr "Mo/s"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
msgid "MPTCP"
msgstr "MPTCP"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
msgid "MPTCP Fullmesh"
msgstr "MPTCP Fullmesh"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:14
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:42
msgid "MPTCP Support Check"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:572
msgid "Mbit/s"
msgstr "Mbit/s"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
msgid "Multipath Debug"
msgstr "Desbugatge multipath"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
msgid "Multipath TCP"
msgstr "Multipath TCP"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:36
msgid "Multipath TCP SYN retries"
msgstr "Ensages Multipath TCP SYN"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
msgid "Multipath TCP checksum"
msgstr "Sòma de contraròtle Multipath TCP"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
msgid "Multipath TCP path-manager"
msgstr "Gestionari dels camins Multipath TCP"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:29
msgid "Multipath TCP scheduler"
msgstr "Planificator Multipath TCP"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:27
msgid "Netlink"
msgstr "Ligam ret"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
msgid ""
"Networks MPTCP settings. Visit <a href='http://multipath-tcp.org/pmwiki.php/"
"Users/ConfigureMPTCP'>http://multipath-tcp.org/pmwiki.php/Users/"
"ConfigureMPTCP</a> for help."
msgstr ""
"Paramètres ret MPTCP. Consulatz <a href='http://multipath-tcp.org/pmwiki.php/"
"Users/ConfigureMPTCP'>http://multipath-tcp.org/pmwiki.php/Users/"
"ConfigureMPTCP</a> per dajuda."
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
msgid "One interface must be set as master"
msgstr "Una interfàcia deu èsser configurada coma principala"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:803
msgid "Outbound:"
msgstr "Sortent:"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:288
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:327
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:799
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:809
msgid "Peak:"
msgstr "Punta:"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
msgid "Re-create fullmesh subflows after a timeout"
msgstr "Tornar crear los jos-flus fullmesh aprèp lo relambi dexpiracion"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:762
msgid "Realtime Traffic"
msgstr "Trafic dirèct"
#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
msgid "Settings"
msgstr "Paramètres"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
msgid "Test"
msgstr "Pròva"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:778
msgid "Upload:"
msgstr "Mandadís:"
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:21
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:21
msgid "Waiting for command to complete..."
msgstr "En espèra duna responsa de la comanda..."
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:60
msgid "backup"
msgstr "subordinat"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:25
msgid "binder"
msgstr "associar"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:22
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:30
msgid "default"
msgstr "Defaut"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:49
msgid "disable"
msgstr "desactivar"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:58
msgid "disabled"
msgstr "desactivat"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:48
msgid "enable"
msgstr "Activar"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
msgid "enabled"
msgstr "Activat"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:23
msgid "fullmesh"
msgstr "fullmesh"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:61
msgid "handover"
msgstr "relai"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:74
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:330
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:558
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:794
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:797
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:800
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:804
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:807
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:810
msgid "kB/s"
msgstr "kB/s"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:83
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:330
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:567
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:794
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:797
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:800
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:804
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:807
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:810
msgid "kbit/s"
msgstr "kbit/s"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
msgid "master"
msgstr "màger"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:24
msgid "ndiffports"
msgstr "ndiffports"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:51
msgid "ndiffports subflows number"
msgstr "Nombre de jos-flux ndiffports"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
msgid "redundant"
msgstr "redondant"
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
msgid "round-robin"
msgstr "cadun son torn"

View file

@ -1,20 +1,20 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:652
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:779
msgid "(%d minute window, %d second interval)"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:227
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:228
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:245
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:246
msgid "(%d minutes window, %d seconds interval)"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:284
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:323
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:796
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:806
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:377
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:932
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:942
msgid "Average:"
msgstr ""
@ -30,24 +30,28 @@ msgstr ""
msgid "Check if MPTCP between interface and server is working."
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:40
msgid "Congestion Control"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:280
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:319
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:315
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:373
msgid "Current:"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:40
msgid "Default is bbr"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:772
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:908
msgid "Download:"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:35
msgid "ECF"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_connections.htm:31
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_fullmesh.htm:31
@ -58,11 +62,15 @@ msgstr ""
msgid "Established connections"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:44
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:45
msgid "Fullmesh subflows for each pair of IP addresses"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:793
#: luci-app-mptcp/root/usr/share/rpcd/acl.d/luci-app-mptcp.json:3
msgid "Grant UCI access for luci-app-mptcp"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:929
msgid "Inbound:"
msgstr ""
@ -70,7 +78,7 @@ msgstr ""
msgid "Interface"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:55
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
msgid "Interfaces Settings"
msgstr ""
@ -80,13 +88,14 @@ msgstr ""
msgid "Loading"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:79
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:563
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:90
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:690
msgid "MB/s"
msgstr ""
#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
#: luci-app-mptcp/root/usr/share/luci/menu.d/luci-app-mptcp.json:3
msgid "MPTCP"
msgstr ""
@ -99,8 +108,8 @@ msgstr ""
msgid "MPTCP Support Check"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:88
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:572
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:99
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:699
msgid "Mbit/s"
msgstr ""
@ -109,11 +118,11 @@ msgid "Multipath Debug"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
msgid "Multipath TCP"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:36
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:37
msgid "Multipath TCP SYN retries"
msgstr ""
@ -140,27 +149,27 @@ msgid ""
"ConfigureMPTCP</a> for help."
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
msgid "One interface must be set as master"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:803
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:939
msgid "Outbound:"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:288
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:327
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:799
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:809
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:323
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:381
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:935
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:945
msgid "Peak:"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:48
msgid "Re-create fullmesh subflows after a timeout"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:762
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:895
msgid "Realtime Traffic"
msgstr ""
@ -173,7 +182,7 @@ msgstr ""
msgid "Test"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:778
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:914
msgid "Upload:"
msgstr ""
@ -183,7 +192,7 @@ msgstr ""
msgid "Waiting for command to complete..."
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:60
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:61
msgid "backup"
msgstr ""
@ -199,22 +208,22 @@ msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:14
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:17
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:20
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:49
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:50
msgid "disable"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:58
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
msgid "disabled"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:13
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:16
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:19
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:48
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:49
msgid "enable"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:58
msgid "enabled"
msgstr ""
@ -222,45 +231,41 @@ msgstr ""
msgid "fullmesh"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:61
msgid "handover"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:74
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:85
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:330
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:558
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:794
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:797
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:800
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:804
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:807
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:810
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:384
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:685
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
msgid "kB/s"
msgstr ""
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:83
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:283
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:287
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:291
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:94
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:318
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:322
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:326
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:330
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:567
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:794
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:797
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:800
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:804
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:807
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:810
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:376
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:380
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:384
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:694
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:930
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:933
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:936
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:940
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:943
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:946
msgid "kbit/s"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:60
msgid "master"
msgstr ""
@ -268,7 +273,7 @@ msgstr ""
msgid "ndiffports"
msgstr ""
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:51
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:52
msgid "ndiffports subflows number"
msgstr ""

View file

@ -28,6 +28,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'name', _('Domain'));
o.rmempty = false;
@ -44,6 +47,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'ip', _('IP'));
o.rmempty = false;
@ -60,6 +66,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'dport', _('port'));
o.rmempty = false;
@ -83,6 +92,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'sport', _('port'));
o.rmempty = false;
@ -106,6 +118,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'mac', _('source MAC-Address'));
o.datatype = 'list(unique(macaddr))';
o.rmempty = false;
@ -127,6 +142,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'ip', _('IP Address'));
o.datatype = 'or(ip4addr,ip6addr)';
o.rmempty = false;
@ -150,6 +168,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'asn', _('ASN'));
o.rmempty = false;
@ -166,6 +187,9 @@ return L.view.extend({
s.anonymous = true;
s.nodescriptions = true;
o = s.option(form.Flag, 'enabled', _('Enabled'));
o.default = o.enabled;
o = s.option(form.Value, 'proto', _('Protocol/Service'));
o.rmempty = false;
o.load = function(section_id) {
@ -178,7 +202,7 @@ return L.view.extend({
name = [];
for (var i = 0; i < proto.length; i++) {
var m = proto[i].split(/\s+/);
if (m && m[0] != "#id")
if (m && m[0] != "#id" && m[1] != "disabled")
name.push(m[2]);
}
for (var i = 0; i < host.length; i++) {
@ -194,7 +218,7 @@ return L.view.extend({
},this));
};
o = s.option(widgets.DeviceSelect, 'interface', _('Interface'),_('When none selected, MPTCP master interface is used.'));
o = s.option(widgets.DeviceSelect, 'interface', _('Interface'),_('When none selected, MPTCP master interface is used (or an other interface if master is down).'));
o.noaliases = true;
o.noinactive = true;
o.nocreate = true;

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-bypass/de/>\n"
"Language: de\n"
@ -15,7 +15,6 @@ msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
msgstr "<abbr title=\"Media Access Control\">MAC</abbr>-Addresse"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:100
#, fuzzy
msgid "<abbr tittle=\"Autonomous System Number\">ASN</abbr>"
msgstr "<abbr tittle=\"Autonomous System Number\">ASN</abbr>"
@ -78,7 +77,7 @@ msgstr "IPs und Netzwerke"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:109
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:137
msgid "Interface"
msgstr "Anschluss"
msgstr "Schnittstelle"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:24
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:39

View file

@ -0,0 +1,122 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-10-02 08:44+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-bypass/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:148
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:153
msgid "ASN"
msgstr "ASN"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:31
msgid "Domain"
msgstr "Dominio"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:26
msgid "Domains"
msgstr "Domini"
#: luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json:3
msgid "Grant access to ndpi resources"
msgstr "Concedi l'accesso alle risorse ndpi"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:47
msgid "IP"
msgstr "IP"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:130
msgid "IP Address"
msgstr "Indirizzo IP"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:42
msgid "IPs and Networks"
msgstr "IP e reti"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
msgid "Interface"
msgstr "Interfaccia"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:104
msgid "MAC-Address"
msgstr "Indirizzo MAC"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:39
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:55
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:78
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:101
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:122
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:145
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:161
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:202
msgid "Note"
msgstr "Nota"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:24
#: luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json:3
msgid "OMR-Bypass"
msgstr "OMR-Bypass"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:24
msgid "OpenMPTCProuter IP must be used as DNS."
msgstr "L'IP di OpenMPTCProuter deve essere utilizzato come DNS."
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:58
msgid "Ports destination"
msgstr "Destinazione dei porti"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:81
msgid "Ports source"
msgstr "Origine delle porte"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:169
msgid "Protocol/Service"
msgstr "Protocollo / servizio"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:164
msgid "Protocols and services"
msgstr "Protocolli e servizi"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:125
msgid "Source lan IP address or network"
msgstr "Indirizzo IP lan di origine o rete"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
msgid "When none selected, MPTCP master interface is used."
msgstr ""
"Quando non è selezionato nessuno, viene utilizzata l'interfaccia master "
"MPTCP."
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:63
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:86
msgid "port"
msgstr "Porta"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:66
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:89
msgid "protocol"
msgstr "Protocollo"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:109
msgid "source MAC-Address"
msgstr "indirizzo MAC di origine"

View file

@ -0,0 +1,120 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-18 18:16+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-bypass/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:148
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:153
msgid "ASN"
msgstr "ASN"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:31
msgid "Domain"
msgstr "Domeni"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:26
msgid "Domains"
msgstr "Domenis"
#: luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json:3
msgid "Grant access to ndpi resources"
msgstr "Acordar l'accès a las ressorsas ndpi"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:47
msgid "IP"
msgstr "IP"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:130
msgid "IP Address"
msgstr "Adreça IP"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:42
msgid "IPs and Networks"
msgstr "IPs e rets"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
msgid "Interface"
msgstr "Interfàcia"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:104
msgid "MAC-Address"
msgstr "Adreça MAC"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:39
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:55
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:78
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:101
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:122
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:145
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:161
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:202
msgid "Note"
msgstr "Nòta"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:24
#: luci-app-omr-bypass/root/usr/share/luci/menu.d/luci-app-omr-bypass.json:3
msgid "OMR-Bypass"
msgstr "OMR-Bypass"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:24
msgid "OpenMPTCProuter IP must be used as DNS."
msgstr "L'IP d'OpznMPTCProuter deu èsser coma lo DNS."
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:58
msgid "Ports destination"
msgstr "Pòrts de destinacion"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:81
msgid "Ports source"
msgstr "Pòrts fonts"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:169
msgid "Protocol/Service"
msgstr "Protocòl/Servici"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:164
msgid "Protocols and services"
msgstr "Protocòls e servicis"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:125
msgid "Source lan IP address or network"
msgstr "Adreça IP font o rer"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
msgid "When none selected, MPTCP master interface is used."
msgstr "Quand res es pas seleccionat, l'interfàcia MPTCP màger es utilizada."
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:63
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:86
msgid "port"
msgstr "pòrt"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:66
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:89
msgid "protocol"
msgstr "protocòl"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:109
msgid "source MAC-Address"
msgstr "Adreça MAC font"

View file

@ -1,12 +1,12 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:148
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:153
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:166
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:174
msgid "ASN"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:31
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
msgid "Domain"
msgstr ""
@ -14,45 +14,56 @@ msgstr ""
msgid "Domains"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:31
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:69
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:95
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:121
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:145
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:171
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:190
msgid "Enabled"
msgstr ""
#: luci-app-omr-bypass/root/usr/share/rpcd/acl.d/luci-app-omr-bypass.json:3
msgid "Grant access to ndpi resources"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:47
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:53
msgid "IP"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:130
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:148
msgid "IP Address"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:42
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:45
msgid "IPs and Networks"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:37
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:56
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:82
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:108
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:132
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:158
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:177
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:221
msgid "Interface"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:104
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:116
msgid "MAC-Address"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:39
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:55
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:78
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:101
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:122
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:145
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:161
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:202
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:42
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:61
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:87
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:113
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:137
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:163
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:182
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:226
msgid "Note"
msgstr ""
@ -65,47 +76,52 @@ msgstr ""
msgid "OpenMPTCProuter IP must be used as DNS."
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:58
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:64
msgid "Ports destination"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:81
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:90
msgid "Ports source"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:169
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:193
msgid "Protocol/Service"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:164
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:185
msgid "Protocols and services"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:125
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
msgid "Source lan IP address or network"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:34
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:50
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:73
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:96
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:117
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:140
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:156
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:197
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:221
msgid ""
"When none selected, MPTCP master interface is used (or an other interface if "
"master is down)."
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:37
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:56
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:82
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:108
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:132
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:158
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:177
msgid "When none selected, MPTCP master interface is used."
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:63
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:86
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:72
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:98
msgid "port"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:66
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:89
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:75
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:101
msgid "protocol"
msgstr ""
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:109
#: luci-app-omr-bypass/htdocs/luci-static/resources/view/services/omr-bypass.js:124
msgid "source MAC-Address"
msgstr ""

View file

@ -1,6 +1,6 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-06-27 17:26+0000\n"
"PO-Revision-Date: 2020-09-02 05:14+0000\n"
"Last-Translator: antrouter <xinyangla@188.com>\n"
"Language-Team: Chinese (Simplified) <http://weblate.openmptcprouter.com/"
"projects/omr/luciapplicationsomr-bypass/zh_Hans/>\n"
@ -28,7 +28,7 @@ msgstr "ASN"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:9
msgid "Bypass"
msgstr "旁路"
msgstr "绕过"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:150
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:151
@ -88,7 +88,7 @@ msgstr "注意"
#: luci-app-omr-bypass/luasrc/controller/omr-bypass.lua:6
msgid "OMR-Bypass"
msgstr "OMR-旁路"
msgstr "OMR-绕过"
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:42
msgid "Ports destination"

View file

@ -1,5 +1,5 @@
#!/bin/sh /etc/rc.common
# Copyright (C) 2018 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
# Copyright (C) 2018-2020 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
START=99
STOP=10
@ -39,8 +39,11 @@ _bypass_ip() {
_bypass_domains() {
local domain
local intf
local enabled
config_get domain $1 name
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
_bypass_domain $domain $intf
}
@ -82,8 +85,11 @@ _bypass_domain() {
_bypass_mac() {
local mac
local intf
local enabled
config_get mac $1 mac
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local intfid="$(uci -q get omr-bypass.$intf.id)"
[ -z "$intf" ] && intf="all"
@ -120,8 +126,11 @@ _bypass_mac() {
_bypass_lan_ip() {
local ip
local intf
local enabled
config_get ip $1 ip
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local intfid="$(uci -q get omr-bypass.$intf.id)"
[ -z "$intf" ] && intf="all"
@ -171,9 +180,14 @@ _bypass_lan_ip() {
_bypass_dest_port() {
local intf
local enabled
local dport
local proto
config_get dport $1 dport
config_get proto $1 proto
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local intfid="$(uci -q get omr-bypass.$intf.id)"
[ -z "$intf" ] && intf="all"
@ -221,9 +235,14 @@ _bypass_dest_port() {
_bypass_src_port() {
local intf
local enabled
local sport
local proto
config_get sport $1 sport
config_get proto $1 proto
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local intfid="$(uci -q get omr-bypass.$intf.id)"
[ -z "$intf" ] && intf="all"
@ -272,8 +291,11 @@ _bypass_src_port() {
_bypass_proto() {
local proto
local intf
local enabled
config_get proto $1 proto
config_get intf $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local intfid="$(uci -q get omr-bypass.$intf.id)"
[ -z "$intf" ] && intf="all"
@ -307,10 +329,10 @@ _bypass_proto() {
fi
# Use dnsmasq ipset to bypass domains of the proto
local domains
domains="$(cat /proc/net/xt_ndpi/host_proto | grep -i $proto: | sed -e "s/$proto://" -e 's/*//' -e 's/,/ /g')"
domains="$(cat /proc/net/xt_ndpi/host_proto | grep -i $proto: | sed -e "s/$proto://i" -e 's/*//' -e 's/,/ /g')"
if [ -n "$domains" ]; then
for domain in $domains; do
if [ -n "$domain" ] && [ "$(uci -q show omr-bypass | grep $domain)" = "" ]; then
if [ -n "$domain" ]; then
_bypass_domain $domain $intf
fi
done
@ -320,11 +342,11 @@ _bypass_proto() {
_intf_rule_ss_rules() {
rule_name=$1
[ "$rule_name" = "ss_rules" ] && rule_name="def"
if [ "$(iptables --wait=40 -t nat -L -n | grep ssr_${rule_name}_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep omr_dst_bypass_$intf)" = "" ]; then
if [ "$(iptables --wait=40 -t nat -L -n | grep ssr_${rule_name}_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep ssr | grep omr_dst_bypass_$intf)" = "" ]; then
iptables-restore -w --wait=60 --noflush <<-EOF
*nat
-I ssr_${rule_name}_dst 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
-I ssr_${rule_name}_dst 1 -m mark --mark 0x539$count -j RETURN
-I ssr_${rule_name}_dst 2 -m mark --mark 0x539$count -j RETURN
-I ssr_${rule_name}_local_out 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
-I ssr_${rule_name}_local_out 2 -m mark --mark 0x539$count -j RETURN
-I ssr_${rule_name}_pre_src 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
@ -333,18 +355,18 @@ _intf_rule_ss_rules() {
EOF
fi
if [ "$disableipv6" != "1" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L | grep omr6_dst_bypass_$intf)" = "" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L -n | grep omr6_dst_bypass_$intf)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*mangle
-I omr-bypass6 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
COMMIT
EOF
fi
if [ "$(ip6tables --wait=40 -t nat -L | grep ssr6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L | grep omr6_dst_bypass_$intf)" = "" ]; then
if [ "$(ip6tables --wait=40 -t nat -L -n | grep ssr6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L -n | grep ssr6 | grep omr6_dst_bypass_$intf)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*nat
-I ssr6_${rule_name}_dst 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
-I ssr6_${rule_name}_dst 1 -m mark --mark 0x6539$count -j RETURN
-I ssr6_${rule_name}_dst 2 -m mark --mark 0x6539$count -j RETURN
-I ssr6_${rule_name}_local_out 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
-I ssr6_${rule_name}_local_out 2 -m mark --mark 0x6539$count -j RETURN
-I ssr6_${rule_name}_pre_src 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
@ -355,6 +377,45 @@ _intf_rule_ss_rules() {
fi
}
_intf_rule_v2ray_rules() {
#rule_name=$1
#[ "$rule_name" = "ss_rules" ] && rule_name="def"
rule_name="def"
if [ "$(iptables --wait=40 -t nat -L -n | grep v2r_${rule_name}_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep v2r | grep omr_dst_bypass_$intf)" = "" ]; then
iptables-restore -w --wait=60 --noflush <<-EOF
*nat
-I v2r_${rule_name}_dst 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
-I v2r_${rule_name}_dst 2 -m mark --mark 0x539$count -j RETURN
-I v2r_${rule_name}_local_out 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
-I v2r_${rule_name}_local_out 2 -m mark --mark 0x539$count -j RETURN
-I v2r_${rule_name}_pre_src 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
-I v2r_${rule_name}_pre_src 2 -m mark --mark 0x539$count -j RETURN
COMMIT
EOF
fi
if [ "$disableipv6" != "1" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L -n | grep omr6_dst_bypass_$intf)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*mangle
-I omr-bypass6 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
COMMIT
EOF
fi
if [ "$(ip6tables --wait=40 -t nat -L -n | grep v2r6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L -n | grep v2r6 | grep omr6_dst_bypass_$intf)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*nat
-I v2r6_${rule_name}_dst 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
-I v2r6_${rule_name}_dst 2 -m mark --mark 0x6539$count -j RETURN
-I v2r6_${rule_name}_local_out 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
-I v2r6_${rule_name}_local_out 2 -m mark --mark 0x6539$count -j RETURN
-I v2r6_${rule_name}_pre_src 1 -m set --match-set omr6_dst_bypass_$intf dst -j MARK --set-mark 0x6539$count
-I v2r6_${rule_name}_pre_src 2 -m mark --mark 0x6539$count -j RETURN
COMMIT
EOF
fi
fi
}
_intf_rule() {
local intf
config_get intf $1 ifname
@ -403,6 +464,7 @@ _intf_rule() {
fi
config_load shadowsocks-libev
config_foreach _intf_rule_ss_rules ss_rules
_intf_rule_v2ray_rules
uci -q set omr-bypass.$intf=interface
uci -q set omr-bypass.$intf.id=$count
@ -411,16 +473,22 @@ _intf_rule() {
_bypass_ip_set() {
local ip
local interface
local enabled
config_get ip $1 ip
config_get interface $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
_bypass_ip $ip $interface
}
_bypass_asn() {
local asn
local interface
local enabled
config_get asn $1 asn
config_get interface $1 interface
config_get enabled $1 enabled
[ "$enabled" = "0" ] && return
local asnips
asnips=`curl --max-time 4 -s -k https://stat.ripe.net/data/announced-prefixes/data.json?resource=${asn} | jsonfilter -q -e '@.data.prefixes.*.prefix'`
for ip in $asnips; do
@ -457,14 +525,14 @@ _ss_rules_config() {
EOF
fi
if [ "$disableipv6" != "1" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L | grep 'match-set omr6_dst_bypass_all dst MARK set')" = "" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L -n | grep 'match-set omr6_dst_bypass_all dst MARK set')" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*mangle
-A omr-bypass6 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
COMMIT
EOF
fi
if [ "$(ip6tables --wait=40 -t nat -L | grep ssr6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L | grep omr6_dst_bypass_all)" = "" ]; then
if [ "$(ip6tables --wait=40 -t nat -L -n | grep ssr6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L -n | grep omr6_dst_bypass_all)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*nat
-I ssr6_${rule_name}_dst 1 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
@ -479,6 +547,45 @@ _ss_rules_config() {
fi
}
_v2ray_rules_config() {
#rule_name=$1
#[ "$rule_name" = "ss_rules" ] && rule_name="def"
rule_name="def"
if [ "$(iptables --wait=40 -t nat -L -n | grep v2r_${rule_name}_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep omr_dst_bypass_all)" = "" ]; then
iptables-restore -w --wait=60 --noflush <<-EOF
*nat
-I v2r_${rule_name}_dst 1 -m set --match-set omr_dst_bypass_all dst -j MARK --set-mark 0x539
-I v2r_${rule_name}_dst 1 -m mark --mark 0x539 -j RETURN
-I v2r_${rule_name}_local_out 1 -m set --match-set omr_dst_bypass_all dst -j MARK --set-mark 0x539
-I v2r_${rule_name}_local_out 2 -m mark --mark 0x539 -j RETURN
-I v2r_${rule_name}_pre_src 1 -m set --match-set omr_dst_bypass_all dst -j MARK --set-mark 0x539
-I v2r_${rule_name}_pre_src 2 -m mark --mark 0x539 -j RETURN
COMMIT
EOF
fi
if [ "$disableipv6" != "1" ]; then
if [ "$(ip6tables --wait=40 -t mangle -L -n | grep 'match-set omr6_dst_bypass_all dst MARK set')" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*mangle
-A omr-bypass6 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
COMMIT
EOF
fi
if [ "$(ip6tables --wait=40 -t nat -L -n | grep v2r6_${rule_name}_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L -n | grep omr6_dst_bypass_all)" = "" ]; then
ip6tables-restore -w --wait=60 --noflush <<-EOF
*nat
-I v2r6_${rule_name}_dst 1 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
-I v2r6_${rule_name}_dst 1 -m mark --mark 0x6539 -j RETURN
-I v2r6_${rule_name}_local_out 1 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
-I v2r6_${rule_name}_local_out 2 -m mark --mark 0x6539 -j RETURN
-I v2r6_${rule_name}_pre_src 1 -m set --match-set omr6_dst_bypass_all dst -j MARK --set-mark 0x6539
-I v2r6_${rule_name}_pre_src 2 -m mark --mark 0x6539 -j RETURN
COMMIT
EOF
fi
fi
}
boot() {
BOOT=1
start "$@"
@ -528,8 +635,10 @@ start_service() {
config_load network
config_foreach _intf_rule interface
local ndpi_rules=""
config_load openmptcprouter
config_foreach _bypass_omr_server server
if [ "$(uci -q get openmptcprouter.settings.bypass_servers)" = "1" ]; then
config_load openmptcprouter
config_foreach _bypass_omr_server server
fi
config_load omr-bypass
config_foreach _bypass_ip_set ips
config_foreach _bypass_mac macs
@ -576,6 +685,7 @@ start_service() {
config_load shadowsocks-libev
config_foreach _ss_rules_config
_v2ray_rules_config
iptables-save --counters | grep -v omr-bypass-dpi | iptables-restore -w --counters
iptables-restore -w --wait=60 --noflush <<-EOF
@ -599,6 +709,7 @@ start_service() {
fi
config_load omr-bypass
config_foreach _bypass_proto dpis
uci -q commit omr-bypass
[ -z "$RELOAD" ] && {
logger -t "omr-bypass" "Restart dnsmasq..."
@ -623,8 +734,7 @@ stop_service() {
service_triggers() {
PROCD_RELOAD_DELAY=1000
procd_add_reload_trigger omr-bypass
procd_add_raw_trigger "interface.*" 2000 /etc/init.d/omr-bypass restart
procd_add_reload_trigger omr-bypass network
}
reload_service() {

View file

@ -52,14 +52,15 @@ fi
if [ "$(uci -q get ucitrack.@shadowsocks-libev[-1].affects | grep omr-bypass)" != "" ]; then
uci -q batch <<-EOF >/dev/null
del_list ucitrack.@shadowsocks-libev[-1].affects=omr-bypass
commit ucitrack
EOF
fi
if [ "$(uci -q get firewall.omr-bypass)" = "" ]; then
if [ "$(uci -q get firewall.omr_bypass)" = "" ]; then
uci -q batch <<-EOF >/dev/null
set firewall.omr-bypass=include
set firewall.omr-bypass.path=/etc/firewall.omr-bypass
set firewall.omr-bypass.reload=1
set firewall.omr_bypass=include
set firewall.omr_bypass.path=/etc/firewall.omr-bypass
set firewall.omr_bypass.reload=1
commit firewall
EOF
fi
@ -78,6 +79,10 @@ if [ "$(uci -q get omr-bypass.mycanal)" = "" ]; then
set omr-bypass.mycanal=proto
add_list omr-bypass.mycanal.url='mycanal.fr'
add_list omr-bypass.mycanal.url='canal-plus.com'
add_list omr-bypass.mycanal.url='canalplus.com'
add_list omr-bypass.mycanal.url='canalplus-cdn.net'
add_list omr-bypass.mycanal.url='canalplus.pro'
add_list omr-bypass.mycanal.url='canal-plus.net'
commit omr-bypass
EOF
fi

View file

@ -0,0 +1,158 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-dscp/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:21
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:72
msgid "CS0 - Normal/Best Effort"
msgstr "CS0 - Normale / Miglior sforzo"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:22
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:73
msgid "CS1 - Low priority"
msgstr "CS1 - Priorità bassa"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:23
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:74
msgid "CS2 - High priority"
msgstr "CS2 - Alta priorità"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:24
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:75
msgid "CS3 - SIP"
msgstr "CS3 - SIP"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:25
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:76
msgid "CS4 - Streaming video"
msgstr "CS4 - Streaming video"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:26
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:77
msgid "CS5"
msgstr "CS5"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:27
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:78
msgid "CS6 - Network routing"
msgstr "CS6 - Routing di rete"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:28
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:79
msgid "CS7"
msgstr ""
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:20
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:71
msgid "Class"
msgstr "Classe"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:15
msgid "Classification Rules"
msgstr "Regole di classificazione"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:31
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:82
msgid "Comment"
msgstr "Commenti"
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:6
msgid "DSCP"
msgstr ""
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:7
msgid "DSCP Domains"
msgstr "Domini DSCP"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
msgid "DSCP by domain"
msgstr "DSCP per dominio"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:57
msgid "Destination host"
msgstr "Host di destinazione"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:63
msgid "Destination ports"
msgstr "Porte di destinazione"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:10
msgid "Differentiated services"
msgstr "Servizi differenziati"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:28
msgid "Direction"
msgstr ""
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:15
msgid "Domain"
msgstr "Dominio"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:10
msgid "Domains"
msgstr "Domini"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:80
msgid "EF - Voice"
msgstr "EF - Voce"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:29
msgid "EF Voice"
msgstr "EF - Voce"
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:4
msgid "OMR-DSCP"
msgstr ""
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:35
msgid "Protocol"
msgstr "Protocollo"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
msgid "Set DSCP by domains."
msgstr "Imposta DSCP per domini."
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:46
msgid "Source host"
msgstr "Host di origine"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:51
msgid "Source ports"
msgstr "Porte di origine"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:11
msgid ""
"Traffic may be classified by many different parameters, such as source "
"address, destination address or traffic type and assigned to a specific "
"traffic class."
msgstr ""
"Il traffico può essere classificato in base a molti parametri diversi, come "
"indirizzo di origine, indirizzo di destinazione o tipo di traffico e "
"assegnato a una classe di traffico specifica."
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:48
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:53
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:59
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:65
msgid "all"
msgstr "tutti"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:33
msgid "both"
msgstr "entrambi"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:32
msgid "download"
msgstr "Scarica"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:31
msgid "upload"
msgstr "Carica"

View file

@ -0,0 +1,158 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-31 17:15+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-dscp/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:21
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:72
msgid "CS0 - Normal/Best Effort"
msgstr "CS0 - Esfòrç normal / optimal"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:22
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:73
msgid "CS1 - Low priority"
msgstr "CS1 - Prioritat febla"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:23
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:74
msgid "CS2 - High priority"
msgstr "CS2 - Prioritat nauta"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:24
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:75
msgid "CS3 - SIP"
msgstr "CS3 - SIP"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:25
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:76
msgid "CS4 - Streaming video"
msgstr "CS4 - Difusion vidèo"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:26
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:77
msgid "CS5"
msgstr "CS5"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:27
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:78
msgid "CS6 - Network routing"
msgstr "CS6 - Partiment ret"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:28
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:79
msgid "CS7"
msgstr "CS7"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:20
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:71
msgid "Class"
msgstr "Classa"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:15
msgid "Classification Rules"
msgstr "Règlas de classificacion"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:31
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:82
msgid "Comment"
msgstr "Comentari"
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:6
msgid "DSCP"
msgstr "DSCP"
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:7
msgid "DSCP Domains"
msgstr "DSCP Domenis"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
msgid "DSCP by domain"
msgstr "DSCP per domeni"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:57
msgid "Destination host"
msgstr "Òste de destinacion"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:63
msgid "Destination ports"
msgstr "Pòrts de destinacion"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:10
msgid "Differentiated services"
msgstr "Servicis diferenciats"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:28
msgid "Direction"
msgstr "Direccion"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:15
msgid "Domain"
msgstr "Domeni"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:10
msgid "Domains"
msgstr "Domenis"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:80
msgid "EF - Voice"
msgstr "EF - Votz"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:29
msgid "EF Voice"
msgstr "EF - Votz"
#: luci-app-omr-dscp/luasrc/controller/omr-dscp.lua:4
msgid "OMR-DSCP"
msgstr "OMR-DSCP"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:35
msgid "Protocol"
msgstr "Protocòl"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
msgid "Set DSCP by domains."
msgstr "Configurar DSCP per domeni."
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:46
msgid "Source host"
msgstr "Òste font"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:51
msgid "Source ports"
msgstr "Pòrts fonts"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:11
msgid ""
"Traffic may be classified by many different parameters, such as source "
"address, destination address or traffic type and assigned to a specific "
"traffic class."
msgstr ""
"Lo trafic pòt èsser classat segon mantuns paramètres diferents, coma l"
"adreça font, ladreça de destinacion o lo tipe de trafic e atribuit a una "
"classa de trafic especifica."
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:48
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:53
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:59
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:65
msgid "all"
msgstr "totes"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:33
msgid "both"
msgstr "Los dos"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:32
msgid "download"
msgstr "Telecargament"
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:31
msgid "upload"
msgstr "Mandadís"

View file

@ -29,7 +29,7 @@ config classify
option direction 'both'
option proto 'udp'
option class 'cs6'
option dest_port '65001'
option dest_port '65001,65301'
option comment 'OMR vpn'
config domains

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-quota/de/>\n"
"Language: de\n"
@ -12,11 +12,11 @@ msgstr ""
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:8
msgid "Add"
msgstr "hinzufügen"
msgstr "Hinzufügen"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
msgid "Enable"
msgstr "anschalten"
msgstr "Aktivieren"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
msgid "Interfaces"
@ -28,7 +28,7 @@ msgstr "Abstand zwischen den Überfprüfungen (in Sekunden)"
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:9
msgid "Invalid"
msgstr "ungültig"
msgstr "Ungültig"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
msgid "Monthly Quota"

View file

@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2020-08-03 12:39+0000\n"
"PO-Revision-Date: 2020-09-30 08:50+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-quota/fr/>\n"
@ -19,7 +19,7 @@ msgstr "Ajouter"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
msgid "Enable"
msgstr "Activé"
msgstr "Activer"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
msgid "Interfaces"

View file

@ -0,0 +1,57 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-quota/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:8
msgid "Add"
msgstr "Aggiungi"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
msgid "Enable"
msgstr "Attivare"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
msgid "Interfaces"
msgstr "Interfaccia"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:33
msgid "Interval between check (s)"
msgstr "Intervallo tra i controlli (s)"
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:9
msgid "Invalid"
msgstr "Non valido"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
msgid "Monthly Quota"
msgstr "Quota mensile"
#: luci-app-omr-quota/luasrc/controller/quota.lua:11
msgid "Quota"
msgstr ""
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:27
msgid "RX quota (kbit)"
msgstr ""
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
msgid "Set monthly quota, when quota is reached interface state is set to down"
msgstr ""
"Imposta la quota mensile, quando viene raggiunta la quota, lo stato "
"dell'interfaccia è impostato su inattivo"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:24
msgid "TX quota (kbit)"
msgstr ""
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:30
msgid "TX+RX quota (kbit)"
msgstr ""

View file

@ -0,0 +1,56 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-quota/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:8
msgid "Add"
msgstr "Ajustar"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
msgid "Enable"
msgstr "Activat"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
msgid "Interfaces"
msgstr "Interfàcias"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:33
msgid "Interval between check (s)"
msgstr "Interval entre las verificacions (s)"
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:9
msgid "Invalid"
msgstr "Invalid"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
msgid "Monthly Quota"
msgstr "Quòta mesadièra"
#: luci-app-omr-quota/luasrc/controller/quota.lua:11
msgid "Quota"
msgstr "Quòta"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:27
msgid "RX quota (kbit)"
msgstr "RX quòta (kbit)"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
msgid "Set monthly quota, when quota is reached interface state is set to down"
msgstr ""
"Definir la quòta mesadièra, quand es atenguda l'interfàcia es desactivada"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:24
msgid "TX quota (kbit)"
msgstr "TX quòta (kbit)"
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:30
msgid "TX+RX quota (kbit)"
msgstr "TX+RX quòta (kbit)"

View file

@ -4,14 +4,14 @@ local m, s, o
m = Map("omr-tracker", translate("OMR-Tracker"))
s = m:section(TypedSection, "shadowsocks", translate("ShadowSocks tracker Settings"), translate("Detect if ShadowSocks is down and stop traffic redirection over it."))
s = m:section(TypedSection, "proxy", translate("Proxy tracker Settings"), translate("Detect if Proxy is down and stop traffic redirection over it."))
s.anonymous = true
s.addremove = false
local sdata = m:get('shadowsocks')
local sdata = m:get('proxy')
if not sdata then
m:set('shadowsocks', nil, 'shadowsocks')
m:set('shadowsocks', 'enabled', "1")
m:set('proxy', nil, 'proxy')
m:set('proxy', 'enabled', "1")
end
o = s:option(Flag, "enabled", translate("Enable"), translate("When tracker is disabled, connection failover is also disabled"))

View file

@ -0,0 +1,42 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-tracker/it/>\n"
"Language: it\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.0.4\n"
msgid ""
"Always ping gateway, then test connection by ping or dns. None mode only "
"ping gateway."
msgstr ""
"Esegui sempre il ping del gateway, quindi verifica la connessione tramite "
"ping o DNS."
msgid "Defaults Settings"
msgstr "Impostazioni predefinite"
msgid "Hosts"
msgstr ""
msgid "OMR-Tracker"
msgstr ""
msgid "OMR-Tracker detect when a connection is down"
msgstr "OMR-Tracker rileva quando una connessione è interrotta"
msgid "Retry interval (s)"
msgstr "Intervallo di ripetizione (s)"
msgid "Timeout (s)"
msgstr ""
msgid "Tries"
msgstr "Tentativi"
msgid "Type"
msgstr "Tipo"

View file

@ -0,0 +1,42 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-18 17:37+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsomr-tracker/oc/>\n"
"Language: oc\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.0.4\n"
msgid ""
"Always ping gateway, then test connection by ping or dns. None mode only "
"ping gateway."
msgstr ""
"Totjorn enviar un ping a la palanca puèi la connexion via ping o DNS. Lo "
"mòde \"none\" ping sonque la palanca."
msgid "Defaults Settings"
msgstr "Paramètres per defaut"
msgid "Hosts"
msgstr "Òstes"
msgid "OMR-Tracker"
msgstr "OMR-Tracker"
msgid "OMR-Tracker detect when a connection is down"
msgstr "OMR-Tracker detècta quand una connexion fonciona pas mai"
msgid "Retry interval (s)"
msgstr "Interval entre ensages"
msgid "Timeout (s)"
msgstr "Relambi d'espèra (s)"
msgid "Tries"
msgstr "Ensages"
msgid "Type"
msgstr "Tipe"

View file

@ -213,14 +213,56 @@ function wizard_add()
for intf, _ in pairs(interfaces) do
local label = luci.http.formvalue("cbid.network.%s.label" % intf) or ""
local proto = luci.http.formvalue("cbid.network.%s.proto" % intf) or "static"
local typeintf = luci.http.formvalue("cbid.network.%s.type" % intf) or ""
local masterintf = luci.http.formvalue("cbid.network.%s.masterintf" % intf) or ""
local ifname = luci.http.formvalue("cbid.network.%s.intf" % intf) or ""
local device = luci.http.formvalue("cbid.network.%s.device" % intf) or ""
local ipaddr = luci.http.formvalue("cbid.network.%s.ipaddr" % intf) or ""
local netmask = luci.http.formvalue("cbid.network.%s.netmask" % intf) or ""
local gateway = luci.http.formvalue("cbid.network.%s.gateway" % intf) or ""
local apn = luci.http.formvalue("cbid.network.%s.apn" % intf) or ""
local pincode = luci.http.formvalue("cbid.network.%s.pincode" % intf) or ""
local delay = luci.http.formvalue("cbid.network.%s.delay" % intf) or ""
local username = luci.http.formvalue("cbid.network.%s.username" % intf) or ""
local password = luci.http.formvalue("cbid.network.%s.password" % intf) or ""
local auth = luci.http.formvalue("cbid.network.%s.auth" % intf) or ""
local mode = luci.http.formvalue("cbid.network.%s.mode" % intf) or ""
local sqmenabled = luci.http.formvalue("cbid.sqm.%s.enabled" % intf) or "0"
local multipath = luci.http.formvalue("cbid.network.%s.multipath" % intf) or "on"
local lan = luci.http.formvalue("cbid.network.%s.lan" % intf) or "0"
if typeintf ~= "" then
if typeintf == "normal" then
typeintf = ""
end
ucic:set("network",intf,"type",typeintf)
end
if typeintf == "macvlan" and masterintf ~= "" then
ucic:set("network",intf,"type","macvlan")
ucic:set("network",intf,"masterintf",masterintf)
elseif typeintf == "" and ifname ~= "" and (proto == "static" or proto == "dhcp" ) then
ucic:set("network",intf,"ifname",ifname)
elseif typeintf == "" and device ~= "" and (proto == "ncm" or proto == "qmi" or proto == "modemmanager") then
ucic:set("network",intf,"device",device)
end
if proto ~= "other" then
ucic:set("network",intf,"proto",proto)
end
ucic:set("network",intf,"apn",apn)
ucic:set("network",intf,"pincode",pincode)
ucic:set("network",intf,"delay",delay)
ucic:set("network",intf,"username",username)
ucic:set("network",intf,"password",password)
ucic:set("network",intf,"auth",auth)
ucic:set("network",intf,"mode",mode)
ucic:set("network",intf,"label",label)
if lan == "1" then
ucic:set("network",intf,"multipath","off")
else
ucic:set("network",intf,"multipath",multipath)
ucic:set("openmptcprouter",intf,"multipath",multipath)
end
ucic:set("network",intf,"defaultroute",0)
ucic:set("network",intf,"peerdns",0)
if ipaddr ~= "" then
ucic:set("network",intf,"ipaddr",ipaddr)
ucic:set("network",intf,"netmask",netmask)
@ -395,6 +437,24 @@ function wizard_add()
ucic:save("openmptcprouter")
end
-- Get Proxy set by default
local default_proxy = luci.http.formvalue("default_proxy") or "shadowsocks"
if default_proxy == "shadowsocks" and serversnb > 0 then
ucic:set("shadowsocks-libev","sss0","disabled","0")
ucic:set("v2ray","main","enabled","0")
elseif default_proxy == "v2ray" and serversnb > 0 then
ucic:set("shadowsocks-libev","sss0","disabled","1")
ucic:set("v2ray","main","enabled","1")
else
ucic:set("shadowsocks-libev","sss0","disabled","1")
ucic:set("v2ray","main","enabled","0")
end
ucic:set("openmptcprouter","settings","proxy",default_proxy)
ucic:save("openmptcprouter")
ucic:save("shadowsocks-libev")
ucic:save("v2ray")
local ss_servers_nginx = {}
local ss_servers_ha = {}
local vpn_servers = {}
@ -415,6 +475,8 @@ function wizard_add()
ucic:set("dsvpn","vpn","host",server_ip)
ucic:set("mlvpn","general","host",server_ip)
ucic:set("ubond","general","host",server_ip)
ucic:set("v2ray","omrout","s_vmess_address",server_ip)
ucic:set("v2ray","omrout","s_vless_address",server_ip)
luci.sys.call("uci -q del openvpn.omr.remote")
luci.sys.call("uci -q add_list openvpn.omr.remote=" .. server_ip)
ucic:set("qos","serverin","srchost",server_ip)
@ -434,6 +496,8 @@ function wizard_add()
ucic:set("dsvpn","vpn","host",server_ip)
ucic:set("mlvpn","general","host",server_ip)
ucic:set("ubond","general","host",server_ip)
ucic:set("v2ray","omrout","s_vmess_address",server_ip)
ucic:set("v2ray","omrout","s_vless_address",server_ip)
luci.sys.call("uci -q del openvpn.omr.remote")
luci.sys.call("uci -q add_list openvpn.omr.remote=" .. server_ip)
ucic:set("qos","serverin","srchost",server_ip)
@ -450,6 +514,7 @@ function wizard_add()
--ucic:commit("openvpn")
ucic:save("mlvpn")
ucic:save("ubond")
ucic:save("v2ray")
--ucic:commit("mlvpn")
ucic:save("dsvpn")
--ucic:commit("dsvpn")
@ -463,41 +528,43 @@ function wizard_add()
if encryption == "none" then
ucic:set("shadowsocks-libev","sss0","method","none")
ucic:set("openvpn","omr","cipher","none")
ucic:save("shadowsocks-libev")
ucic:set("v2ray","omrout","s_vmess_user_security","none")
ucic:set("v2ray","omrout","s_vless_user_security","none")
elseif encryption == "aes-256-gcm" then
ucic:set("shadowsocks-libev","sss0","method","aes-256-gcm")
ucic:set("glorytun","vpn","chacha20","0")
ucic:set("openvpn","omr","cipher","AES-256-GCM")
ucic:save("openvpn")
ucic:save("glorytun")
ucic:save("shadowsocks-libev")
ucic:set("v2ray","omrout","s_vmess_user_security","aes-128-gcm")
ucic:set("v2ray","omrout","s_vless_user_security","aes-128-gcm")
elseif encryption == "aes-256-cfb" then
ucic:set("shadowsocks-libev","sss0","method","aes-256-cfb")
ucic:set("glorytun","vpn","chacha20","0")
ucic:set("openvpn","omr","cipher","AES-256-CFB")
ucic:save("openvpn")
ucic:save("glorytun")
ucic:save("shadowsocks-libev")
ucic:set("v2ray","omrout","s_vmess_user_security","aes-128-gcm")
ucic:set("v2ray","omrout","s_vless_user_security","aes-128-gcm")
elseif encryption == "chacha20-ietf-poly1305" then
ucic:set("shadowsocks-libev","sss0","method","chacha20-ietf-poly1305")
ucic:set("glorytun","vpn","chacha20","1")
ucic:set("openvpn","omr","cipher","AES-256-CBC")
ucic:save("openvpn")
ucic:save("glorytun")
ucic:save("shadowsocks-libev")
ucic:set("v2ray","omrout","s_vmess_user_security","chacha20-poly1305")
ucic:set("v2ray","omrout","s_vless_user_security","chacha20-poly1305")
end
ucic:save("openvpn")
ucic:save("glorytun")
ucic:save("shadowsocks-libev")
ucic:save("v2ray")
-- Set ShadowSocks settings
local shadowsocks_key = luci.http.formvalue("shadowsocks_key")
local shadowsocks_disable = luci.http.formvalue("disableshadowsocks") or "0"
if disablednb == serversnb then
shadowsocks_disable = 1
end
--local shadowsocks_disable = luci.http.formvalue("disableshadowsocks") or "0"
--if disablednb == serversnb then
-- shadowsocks_disable = 1
--end
if shadowsocks_key ~= "" then
ucic:set("shadowsocks-libev","sss0","key",shadowsocks_key)
--ucic:set("shadowsocks-libev","sss0","method","chacha20-ietf-poly1305")
--ucic:set("shadowsocks-libev","sss0","server_port","65101")
ucic:set("shadowsocks-libev","sss0","disabled",shadowsocks_disable)
--ucic:set("shadowsocks-libev","sss0","disabled",shadowsocks_disable)
ucic:save("shadowsocks-libev")
ucic:commit("shadowsocks-libev")
if shadowsocks_disable == "1" then
@ -505,16 +572,19 @@ function wizard_add()
end
else
if serversnb == 0 then
shadowsocks_disable = 1
else
shadowsocks_disable = 0
ucic:set("shadowsocks-libev","sss0","disabled",shadowsocks_disable)
end
ucic:set("shadowsocks-libev","sss0","key","")
ucic:set("shadowsocks-libev","sss0","disabled",shadowsocks_disable)
ucic:save("shadowsocks-libev")
ucic:commit("shadowsocks-libev")
luci.sys.call("/etc/init.d/shadowsocks rules_down >/dev/null 2>/dev/null")
end
local v2ray_user = luci.http.formvalue("v2ray_user")
ucic:set("v2ray","omrout","s_vmess_user_id",v2ray_user)
ucic:set("v2ray","omrout","s_vless_user_id",v2ray_user)
ucic:save("v2ray")
ucic:commit("v2ray")
-- Set Glorytun settings
if default_vpn:match("^glorytun.*") and disablednb ~= serversnb then
@ -621,6 +691,10 @@ function wizard_add()
end
ucic:save("openvpn")
ucic:commit("openvpn")
ucic:save("v2ray")
ucic:commit("v2ray")
ucic:save("network")
ucic:commit("network")
@ -640,10 +714,10 @@ function wizard_add()
luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/omr-tracker stop >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/mptcp restart >/dev/null 2>/dev/null")
if openmptcprouter_vps_key ~= "" then
luci.sys.call("/etc/init.d/openmptcprouter-vps restart >/dev/null 2>/dev/null")
luci.sys.call("sleep 2")
end
--if openmptcprouter_vps_key ~= "" then
-- luci.sys.call("/etc/init.d/openmptcprouter-vps restart >/dev/null 2>/dev/null")
-- luci.sys.call("sleep 2")
--end
luci.sys.call("/etc/init.d/shadowsocks-libev restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/glorytun restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/glorytun-udp restart >/dev/null 2>/dev/null")
@ -655,6 +729,7 @@ function wizard_add()
luci.sys.call("/etc/init.d/omr-6in4 restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/mptcpovervpn restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/vnstat restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/v2ray restart >/dev/null 2>/dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/system/openmptcprouter/status"))
else
luci.http.redirect(luci.dispatcher.build_url("admin/system/openmptcprouter/wizard"))
@ -688,10 +763,21 @@ function settings_add()
luci.sys.exec("sysctl -w net.ipv4.tcp_syn_retries=%s" % tcp_syn_retries)
luci.sys.exec("sed -i 's:^net.ipv4.tcp_syn_retries=[0-9]*:net.ipv4.tcp_syn_retries=%s:' /etc/sysctl.d/zzz_openmptcprouter.conf" % tcp_syn_retries)
--local tcp_retries2 = luci.http.formvalue("tcp_retries2")
--luci.sys.exec("sysctl -w net.ipv4.tcp_retries2=%s" % tcp_retries2)
--luci.sys.exec("sed -i 's:^net.ipv4.tcp_retries2=[0-9]*:net.ipv4.tcp_retries2=%s:' /etc/sysctl.d/zzz_openmptcprouter.conf" % tcp_retries2)
-- Set tcp_retries1
local tcp_retries1 = luci.http.formvalue("tcp_retries1")
luci.sys.exec("sysctl -w net.ipv4.tcp_retries1=%s" % tcp_retries1)
luci.sys.exec("sed -i 's:^net.ipv4.tcp_retries1=[0-9]*:net.ipv4.tcp_retries1=%s:' /etc/sysctl.d/zzz_openmptcprouter.conf" % tcp_retries1)
-- Set tcp_retries2
local tcp_retries2 = luci.http.formvalue("tcp_retries2")
luci.sys.exec("sysctl -w net.ipv4.tcp_retries2=%s" % tcp_retries2)
luci.sys.exec("sed -i 's:^net.ipv4.tcp_retries2=[0-9]*:net.ipv4.tcp_retries2=%s:' /etc/sysctl.d/zzz_openmptcprouter.conf" % tcp_retries2)
-- Set ip_default_ttl
local ip_default_ttl = luci.http.formvalue("ip_default_ttl")
luci.sys.exec("sysctl -w net.ipv4.ip_default_ttl=%s" % ip_default_ttl)
luci.sys.exec("sed -i 's:^net.ipv4.ip_default_ttl=[0-9]*:net.ipv4.ip_default_ttl=%s:' /etc/sysctl.d/zzz_openmptcprouter.conf" % ip_default_ttl)
-- Set tcp_fastopen
local tcp_fastopen = luci.http.formvalue("tcp_fastopen")
local disablefastopen = luci.http.formvalue("disablefastopen") or "0"
@ -718,7 +804,7 @@ function settings_add()
-- Enable/disable vnstat backup
local savevnstat = luci.http.formvalue("savevnstat") or "0"
luci.sys.exec("uci -q set vnstat.@vnstat[0].backup=%s" % savevnstat)
luci.sys.exec("uci -q set openmptcprouter.settings.vnstat_backup=%s" % savevnstat)
ucic:commit("vnstat")
-- Enable/disable gateway ping
@ -729,6 +815,10 @@ function settings_add()
local disabledefaultgw = luci.http.formvalue("disabledefaultgw") or "1"
ucic:set("openmptcprouter","settings","defaultgw",disabledefaultgw)
-- Enable/disable tracebox
local tracebox = luci.http.formvalue("tracebox") or "1"
ucic:set("openmptcprouter","settings","tracebox",tracebox)
-- Enable/disable server ping
local disableserverping = luci.http.formvalue("disableserverping") or "0"
ucic:set("openmptcprouter","settings","disableserverping",disableserverping)

View file

@ -33,7 +33,7 @@
end
%>
<hr />
<form class="inline" method="post" action="<%=url('admin/system/openmptcprouter/settings_add')%>">
<div class="cbi-map">
<h2 name="content"><%:Advanced Settings%></h2>
@ -111,6 +111,7 @@
end
%>
</fieldset>
<hr />
<fieldset class="cbi-section" id="networks">
<legend><%:Networks settings%></legend>
<div class="cbi-section-descr"></div>
@ -118,18 +119,50 @@
<label class="cbi-value-title"><%:IPv4 TCP Keepalive time%></label>
<div class="cbi-value-field">
<input type="text" name="tcp_keepalive_time" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_keepalive_time")):match(" %d+"))%>">
<br />
<div class="cbi-value-description">
<%:How often TCP sends out keepalive messages when keepalive is enabled.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:IPv4 TCP FIN timeout%></label>
<div class="cbi-value-field">
<input type="text" name="tcp_fin_timeout" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_fin_timeout")):match(" %d+"))%>">
<br />
<div class="cbi-value-description">
<%:The length of time an orphaned (no longer referenced by any application) connection will remain in the FIN_WAIT_2 state before it is aborted at the local end.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:IPv4 TCP SYN retries%></label>
<div class="cbi-value-field">
<input type="text" name="tcp_syn_retries" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_syn_retries")):match(" %d+"))%>">
<br />
<div class="cbi-value-description">
<%:Number of times initial SYNs for an active TCP connection attempt will be retransmitted.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:IPv4 TCP SYN retries1%></label>
<div class="cbi-value-field">
<input type="text" name="tcp_retries1" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_retries1")):match(" %d+"))%>">
<br />
<div class="cbi-value-description">
<%:This value influences the time, after which TCP decides, that something is wrong due to unacknowledged RTO retransmissions, and reports this suspicion to the network layer.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:IPv4 TCP SYN retries2%></label>
<div class="cbi-value-field">
<input type="text" name="tcp_retries2" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_retries2")):match(" %d+"))%>">
<br />
<div class="cbi-value-description">
<%:This value influences the timeout of an alive TCP connection, when RTO retransmissions remain unacknowledged.%>
</div>
</div>
</div>
<div class="cbi-value">
@ -138,6 +171,12 @@
<input type="text" name="tcp_fastopen" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.tcp_fastopen")):match(" %d+"))%>">
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:IPv4 IP default TTL%></label>
<div class="cbi-value-field">
<input type="text" name="ip_default_ttl" class="cbi-input-text" value="<%=tonumber((luci.sys.exec("sysctl net.ipv4.ip_default_ttl")):match(" %d+"))%>">
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Enable IPv6%></label>
<div class="cbi-value-field">
@ -174,10 +213,15 @@
</div>
</div>
</div>
</fieldset>
<hr />
<fieldset class="cbi-section" id="other">
<legend><%:Other settings%></legend>
<div class="cbi-section-descr"></div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Save vnstats stats%></label>
<div class="cbi-value-field">
<input type="checkbox" name="savevnstat" class="cbi-input-checkbox" value="1" <% if luci.util.trim(luci.sys.exec("uci -q get vnstat.@vnstat[0].backup")) == "1" then %>checked<% end %>>
<input type="checkbox" name="savevnstat" class="cbi-input-checkbox" value="1" <% if luci.util.trim(luci.sys.exec("uci -q get openmptcprouter.settings.vnstat_backup")) == "1" then %>checked<% end %>>
<br />
<div class="cbi-value-description">
<%:Save vnstats statistics on disk%>
@ -214,6 +258,16 @@
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Disable tracebox test%></label>
<div class="cbi-value-field">
<input type="checkbox" name="disabletracebox" class="cbi-input-checkbox" value="0" <% if luci.model.uci.cursor():get("openmptcprouter","settings","tracebox") == "0" then %>checked<% end %>>
<br />
<div class="cbi-value-description">
<%:Disable multipath test using tracebox%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Debug%></label>
<div class="cbi-value-field">

View file

@ -19,7 +19,7 @@
-- along with OverTheBox. If not, see (http://www.gnu.org/licenses/)
-%>
<%
-- Copyright 2018 Ycarus (Yannick Chabanois) ycarus@zugaina.org
-- Copyright 2018-2020 Ycarus (Yannick Chabanois) ycarus@zugaina.org for OpenMPTCProuter
--
-- Small changes to make this work with OpenMPTCProuter
-- New features:
@ -48,7 +48,7 @@
}
}
function formatBytes(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"][d]}
XHR.poll(20, '/cgi-bin/luci/admin/system/openmptcprouter/interfaces_status', null,
XHR.poll(20, '<%=build_url("admin/system/openmptcprouter/interfaces_status")%>', null,
function(x, mArray)
{
var status = document.getElementById('openmptcprouter_status');
@ -72,12 +72,12 @@
{
if (mArray.openmptcprouter.remote_from_lease == false)
{
var title = String.format("%s (%s)",'You', mArray.openmptcprouter.remote_addr);
var title = String.format("%s (%s)",'<%:You%>', mArray.openmptcprouter.remote_addr);
var statusMessageClass = "warning";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
var statusMessage = _('Your IP was not leased by this router');
var statusMessage = '<%:Your IP was not leased by this router%>';
} else {
var title = String.format('<br /><strong>%s (%s)</strong>', mArray.openmptcprouter.remote_hostname ? mArray.openmptcprouter.remote_hostname : _('You'), mArray.openmptcprouter.remote_addr)
var title = String.format('<br /><strong>%s (%s)</strong>', mArray.openmptcprouter.remote_hostname ? mArray.openmptcprouter.remote_hostname : _('<%:You%>'), mArray.openmptcprouter.remote_addr)
var statusMessageClass = "";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
var statusMessage = "";
@ -116,24 +116,24 @@
content += "Version " + mArray.openmptcprouter.version;
if (mArray.openmptcprouter.latest_version_omr != mArray.openmptcprouter.version && mArray.openmptcprouter.latest_version_omr != "")
{
content += "<br><i>(" + _('Latest available version') + " " + mArray.openmptcprouter.latest_version_omr + ")</i>";
content += "<br><i>(" + '<%:Latest available version%>' + " " + mArray.openmptcprouter.latest_version_omr + ")</i>";
}
content += "<br />";
}
if (mArray.openmptcprouter.loadavg)
{
content += _('Load:') + " " + mArray.openmptcprouter.loadavg;
content += '<%:Load:%>' + " " + mArray.openmptcprouter.loadavg;
content += "<br />";
}
if (mArray.openmptcprouter.core_temp)
{
content += _('Core temp:') + " " + (mArray.openmptcprouter.core_temp / 1000).toFixed(1) + " &#176;";
content += '<%:Core temp:%>' + " " + (mArray.openmptcprouter.core_temp / 1000).toFixed(1) + " &#176;";
content += "<br />";
}
if (mArray.openmptcprouter.uptime)
{
var date = new Date(null);
content += _('Uptime:') + " " + String.format('%t', mArray.openmptcprouter.uptime);
content += '<%:Uptime:%>' + " " + String.format('%t', mArray.openmptcprouter.uptime);
content += "<br />";
}
if (mArray.openmptcprouter.dhcpd)
@ -141,38 +141,46 @@
for ( dhcpd in mArray.openmptcprouter.dhcpd )
{
var dhcp = mArray.openmptcprouter.dhcpd[dhcpd];
content += String.format('<span style="text-transform:capitalize;">%s</span> %s %s<br />', dhcp.interface, _('address:') ,dhcp.router);
content += String.format('<span style="text-transform:capitalize;">%s</span> %s %s - %s<br />', dhcp.interface, _('range:'), dhcp.range_start, dhcp.range_end);
content += String.format('<span style="text-transform:capitalize;">%s</span> %s %s<br />', dhcp.interface, '<%:address:%>' ,dhcp.router);
content += String.format('<span style="text-transform:capitalize;">%s</span> %s %s - %s<br />', dhcp.interface, '<%:range:%>', dhcp.range_start, dhcp.range_end);
}
}
if (mArray.openmptcprouter.socks_service_enabled == true && mArray.openmptcprouter.service_addr != "")
if (mArray.openmptcprouter.shadowsocks_enabled == true && mArray.openmptcprouter.service_addr != "")
{
if (mArray.openmptcprouter.socks_service == false)
if (mArray.openmptcprouter.shadowsocks_service == false)
{
statusMessage += _('ShadowSocks is not running');
if (mArray.openmptcprouter.socks_service_key == false && mArray.openmptcprouter.socks_service_method !== "none")
statusMessage += '<%:ShadowSocks is not running%>';
if (mArray.openmptcprouter.shadowsocks_service_key == false && mArray.openmptcprouter.shadowsocks_service_method !== "none")
{
statusMessage += ' <i>(' + _('empty key') + ')</i>';
statusMessage += ' <i>(' + '<%:empty key%>' + ')</i>';
}
statusMessage += '<br/>';
}
}
if (mArray.openmptcprouter.v2ray_enabled == true && mArray.openmptcprouter.service_addr != "")
{
if (mArray.openmptcprouter.v2ray_service == false)
{
statusMessage += '<%:V2Ray is not running%>';
statusMessage += '<br/>';
}
}
if (mArray.openmptcprouter.fsro == true)
{
statusMessage += _('Filesystem is readonly') + '<br/>';
statusMessage += '<%:Filesystem is readonly%>' + '<br/>';
}
if (mArray.openmptcprouter.multi_vpn == true)
{
statusMessage += _('More than one default VPN is enabled') + '<br/>';
statusMessage += '<%:More than one default VPN is enabled%>' + '<br/>';
}
if (mArray.openmptcprouter.tun_service == false && mArray.openmptcprouter.service_addr != "")
{
statusMessage += _('VPN is not running') + '<br/>';
statusMessage += '<%:VPN is not running%>' + '<br/>';
}
if (mArray.openmptcprouter.dns == false)
{
statusMessage += _('DNS issue: can\'t resolve hostname') + '<br/>';
statusMessage += '<%:DNS issue: can\'t resolve hostname%>' + '<br/>';
}
if(statusMessage !== "")
@ -181,22 +189,22 @@
statusIcon = "<%=resource%>/openmptcprouter/images/statusError.png";
} else if (mArray.openmptcprouter.service_addr != "")
{
if (mArray.openmptcprouter.socks_service_enabled == false)
if (mArray.openmptcprouter.v2ray_enabled == false && mArray.openmptcprouter.shadowsocks_enabled == false)
{
statusMessage += _('ShadowSocks is DISABLED') + '<br/>';
statusMessage += '<%:Proxy is DISABLED%>' + '<br/>';
}
if (mArray.openmptcprouter.tun_state == "DOWN")
{
statusMessage += _('VPN tunnel DOWN') + '<br/>';
statusMessage += '<%:VPN tunnel DOWN%>' + '<br/>';
}
if (mArray.openmptcprouter.ipv6 == "enabled")
{
if (mArray.openmptcprouter.tun6_state == "DOWN")
{
statusMessage += _('IPv6 tunnel DOWN') + '<br/>';
statusMessage += '<%:IPv6 tunnel DOWN%>' + '<br/>';
} else if (mArray.openmptcprouter.wan_addr6 == '')
{
statusMessage += _('No IPv6 access') + '<br/>';
statusMessage += '<%:No IPv6 access%>' + '<br/>';
}
}
if (statusMessage !== "")
@ -215,7 +223,7 @@
var equipmentIcon = '<img src="<%=resource%>/server.png" />';
content = "";
statusMessage = "";
if (mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_addr && mArray.openmptcprouter.wan_addr != "")
if ((mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_addr || mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_addr_ip) && mArray.openmptcprouter.wan_addr != "")
{
var title = String.format("%s (%s)", mArray.openmptcprouter.vps_hostname, mArray.openmptcprouter.wan_addr);
} else if (mArray.openmptcprouter.wan_addr != "" && mArray.openmptcprouter.service_addr == "127.0.0.1")
@ -232,16 +240,16 @@
} else if (mArray.openmptcprouter.external_check == false) {
var title = String.format("%s ?", mArray.openmptcprouter.vps_hostname);
} else {
var title = _('No output');
statusMessage += _('No output') + '<br/>';
var title = '<%:No output%>';
statusMessage += '<%:No output%>' + '<br/>';
}
if (mArray.openmptcprouter.wan_addr == "" && mArray.openmptcprouter.ss_addr == "" && mArray.openmptcprouter.external_check == true)
{
statusMessage += _('No server IP address, No WAN IP address') + '<br/>';
statusMessage += '<%:No server IP address, No WAN IP address%>' + '<br/>';
}
if (mArray.openmptcprouter.service_addr !== "" && mArray.openmptcprouter.wan_addr !== "" && mArray.openmptcprouter.vps_status == "DOWN")
{
statusMessage += _('Can\'t access and use server part') + '<br/>';
statusMessage += '<%:Can\'t access and use server part%>' + '<br/>';
}
if (statusMessage !== "")
{
@ -250,21 +258,21 @@
}
if (mArray.openmptcprouter.service_addr == "")
{
statusMessage += _('No server defined') + '<br/>';
statusMessage += '<%:No server defined%>' + '<br/>';
} else {
if (mArray.openmptcprouter.vps_status == "DOWN")
{
statusMessage += _('Can\'t ping server') + '<br/>';
} else if (mArray.openmptcprouter.socks_service_enabled == true && mArray.openmptcprouter.ss_addr == "" && mArray.openmptcprouter.external_check == true)
statusMessage += '<%:Can\'t ping server%>' + '<br/>';
} else if (mArray.openmptcprouter.shadowsocks_enabled == true && mArray.openmptcprouter.ss_addr == "" && mArray.openmptcprouter.external_check == true)
{
statusMessage += _('Can\'t get public IP address from ShadowSocks') + '<br/>';
statusMessage += '<%:Can\'t get public IP address from ShadowSocks%>' + '<br/>';
} else if (mArray.openmptcprouter.wan_addr == "" && mArray.openmptcprouter.external_check == true)
{
statusMessage += _('No WAN IP address detected in less than 1 second') + '<br/>';
statusMessage += '<%:No WAN IP address detected in less than 1 second%>' + '<br/>';
}
if (mArray.openmptcprouter.vps_admin == false)
{
statusMessage += _('Can\'t contact Server Admin Script');
statusMessage += '<%:Can\'t contact Server Admin Script%>';
if (mArray.openmptcprouter.vps_admin_error_msg !== "")
{
statusMessage += ' <i>(' + mArray.openmptcprouter.vps_admin_error_msg + ')</i>';
@ -273,11 +281,11 @@
}
if (mArray.openmptcprouter.vps_mptcp == "0")
{
statusMessage += _('MPTCP is not enabled on the server') + '<br/>';
statusMessage += '<%:MPTCP is not enabled on the server%>' + '<br/>';
}
if (mArray.openmptcprouter.vps_time_accurate == false)
{
statusMessage += _('Big time difference between the server and the router') + '<br/>';
statusMessage += '<%:Big time difference between the server and the router%>' + '<br/>';
}
}
if (statusMessage !== "" && statusMessageClass !== "error")
@ -287,52 +295,52 @@
}
if (mArray.openmptcprouter.vps_omr_version)
{
content += _('Version') + " " + mArray.openmptcprouter.vps_omr_version;
content += '<%:Version%>' + " " + mArray.openmptcprouter.vps_omr_version;
if (mArray.openmptcprouter.vps_kernel)
{
content += " " + mArray.openmptcprouter.vps_kernel;
}
if (mArray.openmptcprouter.latest_version_vps !== mArray.openmptcprouter.vps_omr_version && mArray.openmptcprouter.latest_version_vps !== "")
{
content += "<br><i>(" + _('Latest available version') + " " + mArray.openmptcprouter.latest_version_vps + ")</i>";
content += "<br><i>(" + '<%:Latest available version%>' + " " + mArray.openmptcprouter.latest_version_vps + ")</i>";
}
content += "<br />";
}
if (mArray.openmptcprouter.vps_loadavg)
{
content += _('Load:') + " " + mArray.openmptcprouter.vps_loadavg;
content += '<%:Load:%>' + " " + mArray.openmptcprouter.vps_loadavg;
content += "<br />";
}
if (mArray.openmptcprouter.vps_uptime)
{
var date = new Date(null);
content += _('Uptime:') + " " + String.format('%t', mArray.openmptcprouter.vps_uptime);
content += '<%:Uptime:%>' + " " + String.format('%t', mArray.openmptcprouter.vps_uptime);
content += "<br />";
}
if (mArray.openmptcprouter.server_mptcp == "disabled")
{
statusMessage += _('MPTCP may not be enabled on the server') + '<br/>';
statusMessage += '<%:MPTCP may not be enabled on the server%>' + '<br/>';
statusMessageClass = "warning";
statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
}
if (mArray.openmptcprouter.wan_addr6)
{
content += _('IPv6:') + " " + mArray.openmptcprouter.wan_addr6;
content += '<%:IPv6:%>' + " " + mArray.openmptcprouter.wan_addr6;
content += '<br />';
}
if (mArray.openmptcprouter.socks_service_enabled == true && mArray.openmptcprouter.ss_traffic && mArray.openmptcprouter.ss_traffic != 0)
if (mArray.openmptcprouter.proxy_traffic && mArray.openmptcprouter.proxy_traffic != 0)
{
content += _('Shadowsocks traffic:') + " " + formatBytes(mArray.openmptcprouter.ss_traffic);
content += '<%:Proxy traffic:%>' + " " + formatBytes(mArray.openmptcprouter.proxy_traffic);
content += '<br />';
}
if (mArray.openmptcprouter.vpn_traffic && mArray.openmptcprouter.vpn_traffic != 0)
{
content += _('VPN traffic:') + " " + formatBytes(mArray.openmptcprouter.vpn_traffic);
content += '<%:VPN traffic:%>' + " " + formatBytes(mArray.openmptcprouter.vpn_traffic);
content += '<br />';
}
if (mArray.openmptcprouter.ss_traffic && mArray.openmptcprouter.vpn_traffic && mArray.openmptcprouter.vpn_traffic != 0 && mArray.openmptcprouter.ss_traffic != 0)
if (mArray.openmptcprouter.total_traffic && mArray.openmptcprouter.total_traffic != 0)
{
content += _('Total traffic:') + " " + formatBytes(mArray.openmptcprouter.vpn_traffic + mArray.openmptcprouter.ss_traffic);
content += '<%:Total traffic:%>' + " " + formatBytes(mArray.openmptcprouter.total_traffic);
content += '<br />';
}
content += '<br />';
@ -428,35 +436,35 @@
var content = "";
if(ipaddr !== '')
{
content += String.format('%s <strong>%s</strong><br />',_('ip address:'), ipaddr);
content += String.format('%s <strong>%s</strong><br />','<%:ip address:%>', ipaddr);
}
if(wanip !== '')
{
content += String.format('%s <strong>%s</strong><br />',_('wan address:'), wanip);
content += String.format('%s <strong>%s</strong><br />','<%:wan address:%>', wanip);
}
if(whois !== '')
{
content += String.format('%s %s<br />',_('whois:'), whois);
content += String.format('%s %s<br />','<%:whois:%>', whois);
}
if(latency !== '')
{
content += String.format('%s %s ms<br />',_('latency:'), latency);
content += String.format('%s %s ms<br />','<%:latency:%>', latency);
}
if(mtu !== '')
{
content += String.format('%s %s<br />',_('mtu:'), mtu);
content += String.format('%s %s<br />','<%:mtu:%>', mtu);
}
if (operator !== '')
{
content += String.format('%s %s<br />',_('operator:'), operator);
content += String.format('%s %s<br />','<%:operator:%>', operator);
}
if (phonenumber !== '' && anonymize !== 'true')
{
content += String.format('%s %s<br />',_('phone number:'), phonenumber);
content += String.format('%s %s<br />','<%:phone number:%>', phonenumber);
}
if (donglestate !== '')
{
content += String.format('%s %s<br />',_('state:'), donglestate);
content += String.format('%s %s<br />','<%:state:%>', donglestate);
}
if(signal !== '')
@ -478,64 +486,64 @@
}
if(ipaddr == '')
{
statusMessage += _('No IP defined') + '<br />';
statusMessage += '<%:No IP defined%>' + '<br />';
}
if(gateway == '')
{
statusMessage += _('No gateway defined') + '<br />';
statusMessage += '<%:No gateway defined%>' + '<br />';
} else if(gw_ping == 'DOWN')
{
statusMessage += _('Gateway DOWN') + '<br />';
statusMessage += '<%:Gateway DOWN%>' + '<br />';
} else if(multipath_available == 'ERROR')
{
statusMessage += _('Multipath seems to be blocked on the connection') + '<br />';
statusMessage += '<%:Multipath seems to be blocked on the connection%>' + '<br />';
}
if(server_ping == 'DOWN' && mArray.openmptcprouter.service_addr !== "")
{
statusMessage += _('No Server ping response after 1 second') + '<br />';
statusMessage += '<%:No Server ping response after 1 second%>' + '<br />';
}
if (stat == 'Offline' && ipaddr != '' && ipaddr == mArray.wans[i].gateway)
{
statusMessage += _('Wan IP and gateway are identical') + '<br />';
statusMessage += '<%:Wan IP and gateway are identical%>' + '<br />';
statusMessageClass = "error";
}
if(multipath == 'master')
{
if (master > 1)
{
statusMessage += _('Multipath master already defined') + '<br />';
statusMessage += '<%:Multipath master already defined%>' + '<br />';
statusMessageClass = "error";
}
if(multipath_state !== 'on' && multipath_state !== '')
{
statusMessage += _('Multipath current state is ') + multipath_state + '<br />';
statusMessage += '<%:Multipath current state is %>' + multipath_state + '<br />';
statusMessageClass = "error";
}
} else {
if(multipath !== multipath_state && multipath_state !== '')
{
statusMessage += _('Multipath current state is ') + multipath_state + '<br />';
statusMessage += '<%:Multipath current state is %>' + multipath_state + '<br />';
statusMessageClass = "error";
}
}
if(duplicateif)
{
statusMessage += _('Network interface duplicated') + '<br />';
statusMessage += '<%:Network interface duplicated%>' + '<br />';
statusMessageClass = "error";
}
if(ipv6_discover == 'DETECTED')
{
statusMessage += _('IPv6 route received') + '<br />'
statusMessage += '<%:IPv6 route received%>' + '<br />'
}
if (statusMessage !== "" && statusMessageClass !== "error")
{
statusMessageClass = "warning";
statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
}
content += String.format('multipath: %s<br />',multipath);
content += String.format('<%:multipath:%> %s<br />',multipath);
if(mArray.wans[i].qos && mArray.wans[i].download > 0 && mArray.wans[i].upload > 0)
{
content += String.format('%s %s/%s kbps (%s)',_('traffic control:'), mArray.wans[i].download, mArray.wans[i].upload, mArray.wans[i].qos)
content += String.format('%s %s/%s kbps (%s)','<%:traffic control:%>', mArray.wans[i].download, mArray.wans[i].upload, mArray.wans[i].qos)
}
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
@ -619,79 +627,79 @@
var content = "";
if(ipaddr !== '')
{
content += String.format('%s <strong>%s</strong><br />',_('ip address:'), ipaddr);
content += String.format('%s <strong>%s</strong><br />','<%:ip address:%>', ipaddr);
}
if(wanip !== '')
{
content += String.format('%s <strong>%s</strong><br />',_('wan address:'), wanip);
content += String.format('%s <strong>%s</strong><br />','<%:wan address:%>', wanip);
}
if(whois !== '')
{
content += String.format('%s %s<br />',_('whois:'), whois);
content += String.format('%s %s<br />','<%:whois:%>', whois);
}
if(latency !== '')
{
content += String.format('%s %s ms<br />',_('latency:'), latency);
content += String.format('%s %s ms<br />','<%:latency:%>', latency);
}
if(mtu !== '')
{
content += String.format('%s %s<br />',_('mtu:'), mtu);
content += String.format('%s %s<br />','<%:mtu:%>', mtu);
}
if(ipaddr == '')
{
statusMessage += _('No IP defined') + '<br />'
statusMessage += '<%:No IP defined%>' + '<br />'
}
if(gateway == '')
{
statusMessage += _('No gateway defined') + '<br />'
statusMessage += '<%:No gateway defined%>' + '<br />'
} else if(gw_ping == 'DOWN')
{
statusMessage += _('Gateway DOWN') + '<br />'
statusMessage += '<%:Gateway DOWN%>' + '<br />'
} else if(multipath_available == 'ERROR')
{
statusMessage += _('Multipath seems to be blocked on the connection') + '<br />'
statusMessage += '<%:Multipath seems to be blocked on the connection%>' + '<br />'
}
if(server_ping == 'DOWN')
{
statusMessage += _('No Server ping response after 1 second') + '<br />'
statusMessage += '<%:No Server ping response after 1 second%>' + '<br />'
}
if (stat == 'Offline' && ipaddr != '' && ipaddr == mArray.tunnels[i].gateway)
{
statusMessage += _('Wan IP and gateway are identical') + '<br />';
statusMessage += '<%:Wan IP and gateway are identical%>' + '<br />';
statusMessageClass = "error";
}
if(multipath == 'master')
{
if (master > 1)
{
statusMessage += _('Multipath master already defined') + '<br />';
statusMessage += '<%:Multipath master already defined%>' + '<br />';
statusMessageClass = "error";
}
if(multipath_state !== 'on' && multipath_state !== '')
{
statusMessage += _('Multipath current state is ') + multipath_state + '<br />';
statusMessage += '<%:Multipath current state is %>' + multipath_state + '<br />';
statusMessageClass = "error";
}
} else {
if(multipath !== multipath_state && multipath_state !== '')
{
statusMessage += _('Multipath current state is ') + multipath_state + '<br />';
statusMessage += '<%:Multipath current state is %>' + multipath_state + '<br />';
statusMessageClass = "error";
}
}
if(duplicateif)
{
statusMessage += _('Network interface duplicated') + '<br />';
statusMessage += '<%:Network interface duplicated%>' + '<br />';
statusMessageClass = "error";
}
if(ipv6_discover == 'DETECTED')
{
statusMessage += _('IPv6 route received') + '<br />'
statusMessage += '<%:IPv6 route received%>' + '<br />'
}
content += String.format('multipath: %s<br />',multipath);
content += String.format('<%:multipath:%> %s<br />',multipath);
if(mArray.tunnels[i].qos && mArray.tunnels[i].download > 0 && mArray.tunnels[i].upload > 0)
{
content += String.format('%s %s/%s kbps (%s)',_('traffic control:'), mArray.tunnels[i].download, mArray.tunnels[i].upload, mArray.tunnels[i].qos)
content += String.format('%s %s/%s kbps (%s)','<%:traffic control:%>', mArray.tunnels[i].download, mArray.tunnels[i].upload, mArray.tunnels[i].qos)
}
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
@ -701,7 +709,7 @@
temp += '</tr></table>';
}
if (mArray === null) {
temp += _('No data');
temp += '<%:No data%>';
}
temp += '</li>';
// Close tree

View file

@ -69,7 +69,7 @@ end
<div class="cbi-value-field">
<input name="<%=servername%>.server_ip" id="<%=servername%>.server_ip" placeholder="<%:Server IP%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"ip")%>" data-optional="false">
<div class="cbi-value-description">
<%:Server IP will be set for ShadowSocks, Glorytun, OpenVPN and MLVPN%>
<%:Server IP will be set for proxy and VPN%>
</div>
</div>
</div>
@ -125,7 +125,7 @@ end
<div>
<input type="text" class="cbi-section-create-name" id="cbi.cts.omr-bypass.server." name="add_server_name" data-type="uciname" data-optional="true" />
</div>
<input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" name="add_server" value="<%:Add server%>" />
<input class="cbi-button cbi-button-add" type="submit" onclick="this.form.cbi_state='add-section'; return true" name="add_server" value="<%:Add a new server%>" />
</div>
</div>
</fieldset>
@ -175,23 +175,42 @@ end
</div>
</div>
</fieldset>
<fieldset class="cbi-section" id="shadowsocks">
<legend><%:ShadowSocks settings%></legend>
<div class="cbi-section-descr"><%:By default ShadowSocks is used for TCP traffic.%></div>
<fieldset class="cbi-section" id="proxy">
<legend><%:Proxy settings%></legend>
<div class="cbi-section-descr"><%:By default proxy is used for any traffic that is TCP (and UDP for V2Ray).%></div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Default Proxy%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" name="default_proxy" size="1">
<% if nixio.fs.access("/etc/init.d/shadowsocks-libev") then %><option value="shadowsocks" <% if uci:get("shadowsocks-libev","sss0","disabled") == "0" or uci:get("openmptcprouter","settings","proxy") == nil then %>selected="selected"<% end %>>Shadowsocks</option><% end %>
<% if nixio.fs.access("/etc/init.d/v2ray") then %><option value="v2ray" <% if uci:get("v2ray","main","enabled") == "1" then %>selected="selected"<% end %>>V2Ray</option><% end %>
<option value="none" <% if uci:get("shadowsocks-libev","sss0","disabled") ~= "0" and uci:get("v2ray","main","enabled") ~= "1" and uci:get("openmptcprouter","settings","proxy") ~= nil then %>selected="selected"<% end %>>None</option>
</select>
<br />
<div class="cbi-value-description">
<%:Set the default Proxy used for TCP when ShadowSocks is enabled, for TCP and UDP when V2Ray is enabled.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:ShadowSocks key%></label>
<div class="cbi-value-field">
<input type="text" name="shadowsocks_key" placeholder="<%:ShadowSocks key%>" class="cbi-input-text" value="<%=uci:get("shadowsocks-libev","sss0","key")%>" />
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default. ShadowSocks is used for TCP.%>
<%:Key is retrieved from server API by default.%> <%:ShadowSocks is used for TCP.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Disable ShadowSocks%></label>
<label class="cbi-value-title"><%:V2Ray user id%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="disableshadowsocks" value="1" <% if uci:get("shadowsocks-libev","sss0","disabled") == "1" then %>checked<% end %> />
<input type="text" name="v2ray_user" placeholder="<%:V2Ray user%>" class="cbi-input-text" value="<%=uci:get("v2ray","omrout","s_vmess_user_id")%>" />
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default.%> <%:V2Ray is used for TCP and UDP.%>
</div>
</div>
</div>
<div class="cbi-value">
@ -216,7 +235,7 @@ end
<% else %>
<%:There is no Advanced Encryption Standard (AES) instruction set integrated in the processor, you should use chacha20.%>
<% end %>
<%:Encryption method is also used for Glorytun and OpenVPN.%>
<%:Encryption method is used for Shadowsocks, V2Ray, Glorytun and OpenVPN.%>
</div>
</div>
</div>
@ -231,7 +250,7 @@ end
<input type="text" name="glorytun_key" placeholder="<%:Glorytun key%>" class="cbi-input-text" value="<%=uci:get("glorytun","vpn","key")%>">
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default. Glorytun TCP is used by default for UDP and ICMP%>
<%:Key is retrieved from server API by default.%> <%:Glorytun TCP is used by default for UDP and ICMP%>
</div>
</div>
</div>
@ -243,7 +262,7 @@ end
<input type="text" name="dsvpn_key" placeholder="<%:A Dead Simple VPN key%>" class="cbi-input-text" value="<%=uci:get("dsvpn","vpn","key")%>">
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default. A Dead Simple VPN is a TCP VPN that can replace Glorytun TCP%>
<%:Key is retrieved from server API by default.%> <%:A Dead Simple VPN is a TCP VPN that can replace Glorytun TCP%>
</div>
</div>
</div>
@ -255,7 +274,7 @@ end
<input type="text" name="mlvpn_password" placeholder="<%:MLVPN password%>" class="cbi-input-text" value="<%=uci:get("mlvpn","general","password")%>">
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default. MLVPN can replace Glorytun with connections with same latency%>
<%:Key is retrieved from server API by default.%> <%:MLVPN can replace Glorytun with connections with same latency%>
</div>
</div>
</div>
@ -267,7 +286,7 @@ end
<input type="text" name="ubond_password" placeholder="<%:UBOND password%>" class="cbi-input-text" value="<%=uci:get("ubond","general","password")%>">
<br />
<div class="cbi-value-description">
<%:Key is retrieved from server API by default. UBOND can replace Glorytun with connections with same latency%>
<%:Key is retrieved from server API by default.%> <%:UBOND can replace Glorytun with connections with same latency%>
</div>
</div>
</div>
@ -291,7 +310,7 @@ end
<% elseif vpn == "dsvpn" then %>
<% if nixio.fs.access("/usr/sbin/dsvpn") then %><option value="dsvpn" <% if uci:get("dsvpn","vpn","enable") == "1" then %>selected="selected"<% end %>>A Dead Simple VPN</option><% end %>
<% elseif vpn == "mlvpn" then %>
<% if nixio.fs.access("/usr/sbin/mlvpn") then %><!--<option value="mlvpn" <% if uci:get("mlvpn","general","enable") == "1" then %>selected="selected"<% end %>>MLVPN</option>--><% end %>
<% if nixio.fs.access("/usr/sbin/mlvpn") then %><option value="mlvpn" <% if uci:get("mlvpn","general","enable") == "1" then %>selected="selected"<% end %>>MLVPN</option><% end %>
<% elseif vpn == "ubond" then %>
<% if nixio.fs.access("/usr/sbin/ubond") then %><option value="ubond" <% if uci:get("ubond","general","enable") == "1" then %>selected="selected"<% end %>>UBOND</option><% end %>
<% elseif vpn == "openvpn" then %>
@ -307,7 +326,7 @@ end
<% if nixio.fs.access("/usr/sbin/glorytun") then %><option value="glorytun_tcp" <% if uci:get("glorytun","vpn","enable") == "1" and uci:get("glorytun","vpn","proto") == "tcp" then %>selected="selected"<% end %>>Glorytun TCP</option><% end %>
<% if nixio.fs.access("/usr/sbin/glorytun-udp") then %><option value="glorytun_udp" <% if uci:get("glorytun","vpn","enable") == "1" and uci:get("glorytun","vpn","proto") == "udp" then %>selected="selected"<% end %>>Glorytun UDP</option><% end %>
<% if nixio.fs.access("/usr/sbin/dsvpn") then %><option value="dsvpn" <% if uci:get("dsvpn","vpn","enable") == "1" then %>selected="selected"<% end %>>A Dead Simple VPN</option><% end %>
<% if nixio.fs.access("/usr/sbin/mlvpn") then %><!--<option value="mlvpn" <% if uci:get("mlvpn","general","enable") == "1" then %>selected="selected"<% end %>>MLVPN</option>--><% end %>
<% if nixio.fs.access("/usr/sbin/mlvpn") then %><option value="mlvpn" <% if uci:get("mlvpn","general","enable") == "1" then %>selected="selected"<% end %>>MLVPN</option><% end %>
<% if nixio.fs.access("/usr/sbin/ubond") then %><option value="ubond" <% if uci:get("ubond","general","enable") == "1" then %>selected="selected"<% end %>>UBOND</option><% end %>
<% if nixio.fs.access("/usr/sbin/openvpn") then %><option value="openvpn" <% if uci:get("openvpn","omr","enabled") == "1" then %>selected="selected"<% end %>>OpenVPN</option><% end %>
<option value="none" <% if uci:get("openmptcprouter","settings","vpn") == "none" then %>selected="selected"<% end %>>None</option>
@ -323,16 +342,108 @@ end
</div>
</fieldset>
</span>
<hr />
<fieldset class="cbi-section" id="laninterfaces">
<legend><%:LAN interfaces settings%></legend>
<%
for _, iface in ipairs(net:get_networks()) do
local ifname = iface:name()
local firewall_lan = luci.util.trim(luci.sys.exec("uci -q get firewall.@zone[0].network | grep " .. ifname))
if firewall_lan ~= "" then
%>
<h3><%=ifname%></h3>
<fieldset class="cbi-section-node" id="cbi-openmptcprouter-<%=ifname%>">
<input type="hidden" name="intf.<%=ifname%>" value="<%=ifname%>" />
<div class="cbi-value" id="cbi-network-<%=ifname%>-label" data-index="1">
<label class="cbi-value-title"><%:Label%></label>
<div class="cbi-value-field">
<input type="hidden" id="cbid.network.<%=ifname%>.lan" name="cbid.network.<%=ifname%>.lan" value="1">
<input type="text" id="cbid.network.<%=ifname%>.label" name="cbid.network.<%=ifname%>.label" class="cbi-input-text" value="<%=uci:get("network",ifname,"label")%>">
<br />
<div class="cbi-value-description">
<%:Label for the interface%>
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-proto" data-index="3">
<label class="cbi-value-title"><%:Protocol%></label>
<div class="cbi-value-field">
<% findproto = 0 %>
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.proto" name="cbid.network.<%=ifname%>.proto" size="1">
<option id="cbid.network.<%=ifname%>.proto-static" value="static"<% if uci:get("network",ifname,"proto") == "static" or uci:get("network",ifname,"proto") == "" then findproto = 1 %> selected="selected"<% end %>><%:Static address%></option>
<option id="cbid.network.<%=ifname%>.proto-dhcp" value="dhcp"<% if uci:get("network",ifname,"proto") == "dhcp" then findproto = 1 %> selected="selected"<% end %>><%:DHCP%></option>
<option id="cbid.network.<%=ifname%>.proto-other" value="other"<% if uci:get("network",ifname,"proto") ~= nil and findproto ~= 1 then %> selected="selected"<% end %>><%:Other%></option>
</select>
<br />
<div class="cbi-value-description">
<%:You can use DHCP if you have multiple real ethernet ports.%>
</div>
</div>
</div>
<%
if uci:get("network",ifname,"type") ~= "bridge" then
%>
<div class="cbi-value" id="cbi-network-<%=ifname%>-intf" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;dhcp&#34;}]" data-index="4">
<label class="cbi-value-title"><%:Physical interface%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.intf" name="cbid.network.<%=ifname%>.intf" size="1">
<%
iffind=0
for _, ifacea in ipairs(ifaces) do
if not (ifacea == "lo" or ifacea == "6in4-omr6in4" or ifacea == "mlvpn0" or ifacea:match("^ifb.*") or ifacea:match("^sit.*") or ifacea:match("^gre.*") or ifacea:match("^ip6.*") or ifacea:match("^teql.*") or ifacea:match("^erspan.*") or ifacea:match("^tun.*")) and device_notvirtual(ifacea) then
%>
<option value="<%=ifacea%>"<% if uci:get("network",ifname,"ifname") == ifacea then iffind = 1 %> selected="selected"<% end %>><%=ifacea%></option>
<%
end
end
if iffinf == 0 and uci:get("network",ifname,"ifname") ~= nil then
%>
<option value="<%=uci:get("network",ifname,"ifname")%>" selected="selected"><%=uci:get("network",ifname,"ifname")%></option>
<%
end
%>
</select>
<br />
<div class="cbi-value-description">
<%:Choose physical interface.%>
</div>
</div>
</div>
<%
end
%>
<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="5">
<label class="cbi-value-title"><%:IPv4 address%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.ipaddr" name="cbid.network.<%=ifname%>.ipaddr" class="cbi-input-text" value="<%=uci:get("network",ifname,"ipaddr")%>" data-type="ip4addr">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="6">
<label class="cbi-value-title"><%:IPv4 netmask%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.netmask" name="cbid.network.<%=ifname%>.netmask" class="cbi-input-text" value="<%=uci:get("network",ifname,"netmask") or "255.255.255.0"%>" data-type="ip4addr">
</div>
</div>
</fieldset>
<%
end
end
%>
<hr />
<fieldset class="cbi-section" id="interfaces">
<legend><%:Interfaces settings%></legend>
<div class="cbi-section-descr"><%:You must disable DHCP on your modems and set IP in different networks.%></div>
<%
for _, iface in ipairs(net:get_networks()) do
local ifname = iface:name()
local multipath = uci:get("network",ifname,"multipath")
local multipathvpn = uci:get("openmptcprouter",ifname,"multipathvpn")
local vpn = uci:get("openmptcprouter",ifname,"vpn")
if (multipath ~= nil and multipath ~= "off" and vpn ~= "1") or multipathvpn == "1" then
local firewall_wan = luci.util.trim(luci.sys.exec("uci -q get firewall.@zone[1].network | grep " .. ifname))
if firewall_wan ~= "" then
-- local multipath = uci:get("network",ifname,"multipath")
-- local multipathvpn = uci:get("openmptcprouter",ifname,"multipathvpn")
-- local vpn = uci:get("openmptcprouter",ifname,"vpn")
-- if (multipath ~= nil and multipath ~= "off" and vpn ~= "1") or multipathvpn == "1" then
%>
<div class="cbi-section-remove right">
<input type="submit" name="delete.<%=ifname%>" value="<%:Delete%>" class="cbi-button" />
@ -350,13 +461,53 @@ end
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-proto" data-index="2">
<div class="cbi-value" id="cbi-network-<%=ifname%>-type" data-index="2">
<label class="cbi-value-title"><%:Type%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.type" name="cbid.network.<%=ifname%>.type" size="1">
<option id="cbid.network.<%=ifname%>.type-normal" value="normal"><%:Normal%></option>
<option id="cbid.network.<%=ifname%>.type-macvlan" value="macvlan"<% if uci:get("network",ifname,"type") == "macvlan" then %> selected="selected"<% end %>><%:MacVLAN%></option>
<option id="cbid.network.<%=ifname%>.type-bridge" value="bridge"<% if uci:get("network",ifname,"type") == "bridge" then %> selected="selected"<% end %>><%:Bridge%></option>
</select>
<br />
<div class="cbi-value-description">
<%:Choose MacVLAN if you want to create a virtual interface based on a physical interface.%>
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-masterintf" data-depends="[{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="3">
<label class="cbi-value-title"><%:Physical interface%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.masterintf" name="cbid.network.<%=ifname%>.masterintf" size="1">
<%
for _, ifacea in ipairs(ifaces) do
if not (ifacea == "lo" or ifacea == "6in4-omr6in4" or ifacea:match("^ifb.*") or ifacea:match("^sit.*") or ifacea:match("^gre.*") or ifacea:match("^ip6.*") or ifacea:match("^teql.*") or ifacea:match("^erspan.*") or ifacea:match("^tun.*")) and device_notvirtual(ifacea) then
%>
<option value="<%=ifacea%>"<% if uci:get("network",ifname,"masterintf") == ifacea then %> selected="selected"<% end %>><%=ifacea%></option>
<%
end
end
%>
</select>
<br />
<div class="cbi-value-description">
<%:Choose physical interface.%>
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-proto" data-depends="[{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;normal&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;bridge&#34;}]" data-index="3">
<label class="cbi-value-title"><%:Protocol%></label>
<div class="cbi-value-field">
<% findproto = 0 %>
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.proto" name="cbid.network.<%=ifname%>.proto" size="1">
<option id="cbid.network.<%=ifname%>.proto-static" value="static"<% if uci:get("network",ifname,"proto") == "static" then %> selected="selected"<% end %>><%:Static address%></option>
<option id="cbid.network.<%=ifname%>.proto-dhcp" value="dhcp"<% if uci:get("network",ifname,"proto") == "dhcp" then %> selected="selected"<% end %>><%:DHCP%></option>
<option id="cbid.network.<%=ifname%>.proto-other" value="other"<% if uci:get("network",ifname,"proto") ~= "static" and uci:get("network",ifname,"proto") ~= "dhcp" then %> selected="selected"<% end %>><%:Other%></option>
<option id="cbid.network.<%=ifname%>.proto-static" value="static"<% if uci:get("network",ifname,"proto") == "static" or uci:get("network",ifname,"proto") == nil then findproto = 1 %> selected="selected"<% end %>><%:Static address%></option>
<option id="cbid.network.<%=ifname%>.proto-dhcp" value="dhcp"<% if uci:get("network",ifname,"proto") == "dhcp" then findproto = 1 %> selected="selected"<% end %>><%:DHCP%></option>
<option id="cbid.network.<%=ifname%>.proto-modemmanager" value="modemmanager"<% if uci:get("network",ifname,"proto") == "modemmanager" then findproto = 1 %> selected="selected"<% end %>><%:ModemManager%></option>
<option id="cbid.network.<%=ifname%>.proto-ncm" value="ncm"<% if uci:get("network",ifname,"proto") == "ncm" then findproto = 1 %> selected="selected"<% end %>><%:NCM%></option>
<option id="cbid.network.<%=ifname%>.proto-pppoe" value="pppoe"<% if uci:get("network",ifname,"proto") == "pppoe" then findproto = 1 %> selected="selected"<% end %>><%:PPPoE%></option>
<option id="cbid.network.<%=ifname%>.proto-qmi" value="qmi"<% if uci:get("network",ifname,"proto") == "qmi" then findproto = 1 %> selected="selected"<% end %>><%:QMI%></option>
<option id="cbid.network.<%=ifname%>.proto-other" value="other"<% if uci:get("network",ifname,"proto") ~= nil and findproto ~= 1 then %> selected="selected"<% end %>><%:Other%></option>
</select>
<br />
<div class="cbi-value-description">
@ -364,7 +515,34 @@ end
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="3">
<div class="cbi-value" id="cbi-network-<%=ifname%>-intf" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;dhcp&#34;}]" data-index="4">
<label class="cbi-value-title"><%:Physical interface%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.intf" name="cbid.network.<%=ifname%>.intf" size="1">
<%
iffind=0
for _, ifacea in ipairs(ifaces) do
if not (ifacea == "lo" or ifacea == "6in4-omr6in4" or ifacea == "mlvpn0" or ifacea:match("^ifb.*") or ifacea:match("^sit.*") or ifacea:match("^gre.*") or ifacea:match("^ip6.*") or ifacea:match("^teql.*") or ifacea:match("^erspan.*") or ifacea:match("^tun.*")) and device_notvirtual(ifacea) then
%>
<option value="<%=ifacea%>"<% if uci:get("network",ifname,"ifname") == ifacea then iffind = 1 %> selected="selected"<% end %>><%=ifacea%></option>
<%
end
end
if iffinf == 0 and uci:get("network",ifname,"ifname") ~= nil then
%>
<option value="<%=uci:get("network",ifname,"ifname")%>" selected="selected"><%=uci:get("network",ifname,"ifname")%></option>
<%
end
%>
</select>
<br />
<div class="cbi-value-description">
<%:Choose physical interface.%>
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="5">
<label class="cbi-value-title"><%:IPv4 address%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.ipaddr" name="cbid.network.<%=ifname%>.ipaddr" class="cbi-input-text" value="<%=uci:get("network",ifname,"ipaddr")%>" data-type="ip4addr">
@ -374,13 +552,13 @@ end
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="4">
<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="6">
<label class="cbi-value-title"><%:IPv4 netmask%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.netmask" name="cbid.network.<%=ifname%>.netmask" class="cbi-input-text" value="<%=uci:get("network",ifname,"netmask") or "255.255.255.0"%>" data-type="ip4addr">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-gateway" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="5">
<div class="cbi-value" id="cbi-network-<%=ifname%>-gateway" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;},{&#34;cbid.network.<%=ifname%>.type&#34;:&#34;macvlan&#34;}]" data-index="7">
<label class="cbi-value-title"><%:IPv4 gateway%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.gateway" name="cbid.network.<%=ifname%>.gateway" class="cbi-input-text" value="<%=uci:get("network",ifname,"gateway")%>" data-type="ip4addr">
@ -390,6 +568,165 @@ end
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-device" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;}]" data-index="5">
<label class="cbi-value-title"><%:Device%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.device" name="cbid.network.<%=ifname%>.device" size="1">
<%
iffind=0
iftty = nixio.fs.glob("/dev/ttyUSB*")
for tty in iftty do
%>
<option value="<%=tty%>"<% if uci:get("network",ifname,"device") == tty then iffind = 1 %> selected="selected"<% end %>><%=tty%></option>
<%
end
iftty = nixio.fs.glob("/dev/cdc-wdm*")
for tty in iftty do
%>
<option value="<%=tty%>"<% if uci:get("network",ifname,"device") == tty then iffind = 1 %> selected="selected"<% end %>><%=tty%></option>
<%
end
if iffinf == 0 and uci:get("network",ifname,"device") ~= nil then
%>
<option value="<%=uci:get("network",ifname,"device")%>" selected="selected"><%=uci:get("network",ifname,"device")%></option>
<%
end
%>
</select>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-device" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;}]" data-index="5">
<label class="cbi-value-title"><%:Device%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.device" name="cbid.network.<%=ifname%>.device" size="1">
<%
iffind=0
iftty = nixio.fs.glob("/dev/cdc-wdm*")
for tty in iftty do
%>
<option value="<%=tty%>"<% if uci:get("network",ifname,"device") == tty then iffind = 1 %> selected="selected"<% end %>><%=tty%></option>
<%
end
if iffinf == 0 and uci:get("network",ifname,"device") ~= nil then
%>
<option value="<%=uci:get("network",ifname,"device")%>" selected="selected"><%=uci:get("network",ifname,"device")%></option>
<%
end
%>
</select>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-device" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;modemmanager&#34;}]" data-index="5">
<label class="cbi-value-title"><%:Device%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.device" name="cbid.network.<%=ifname%>.device" size="1">
<%
iffind=0
iftty = luci.sys.exec("/usr/bin/mmcli -L")
for listtty in iftty:gmatch("([^\r\n]*)[\r\n]") do
modemid = luci.util.trim(luci.sys.exec("echo '" .. listtty .. "' | awk -F' ' '{print $1}' | awk -F/ '{print $6}'"))
if modemid ~= '' then
modeminfo = luci.sys.exec("/usr/bin/mmcli -m " .. modemid .. " --output-keyvalue")
tty = luci.util.trim(luci.sys.exec("echo '" .. modeminfo .. "' | grep 'modem.generic.device ' | awk -F': ' '{print $2}'"))
%>
<option value="<%=tty%>"<% if uci:get("network",ifname,"device") == tty then iffind = 1 %> selected="selected"<% end %>><%=tty%></option>
<%
end
end
if iffinf == 0 and uci:get("network",ifname,"device") ~= nil then
%>
<option value="<%=uci:get("network",ifname,"device")%>" selected="selected"><%=uci:get("network",ifname,"device")%></option>
<%
end
%>
</select>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-apn" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;modemmanager&#34;}]" data-index="6">
<label class="cbi-value-title"><%:APN%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.apn" name="cbid.network.<%=ifname%>.apn" class="cbi-input-text" value="<%=uci:get("network",ifname,"apn")%>">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-pincode" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;modemmanager&#34;}]" data-index="7">
<label class="cbi-value-title"><%:PIN code%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.pincode" name="cbid.network.<%=ifname%>.pincode" class="cbi-input-text" value="<%=uci:get("network",ifname,"pincode")%>">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-mode" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;}]" data-index="8">
<label class="cbi-value-title"><%:Service Type%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.mode" name="cbid.network.<%=ifname%>.mode" size="1">
<option value=""<% if uci:get("network",ifname,"mode") == "" then %> selected="selected"<% end %>><%:Modem default%></option>
<option value="preferlte"<% if uci:get("network",ifname,"auth") == "preferlte" then %> selected="selected"<% end %>><%:Prefer LTE%></option>
<option value="preferumts"<% if uci:get("network",ifname,"auth") == "preferumts" then %> selected="selected"<% end %>><%:Prefer UMTS%></option>
<option value="lte"<% if uci:get("network",ifname,"auth") == "lte" then %> selected="selected"<% end %>><%:LTE%></option>
<option value="umts"<% if uci:get("network",ifname,"auth") == "umts" then %> selected="selected"<% end %>><%:UMTS/GPRS%></option>
<option value="gsm"<% if uci:get("network",ifname,"auth") == "gsm" then %> selected="selected"<% end %>><%:GPRS only%></option>
<option value="auto"<% if uci:get("network",ifname,"auth") == "auto" then %> selected="selected"<% end %>><%:auto%></option>
</select>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-auth" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;pppoe&#34;}]" data-index="9">
<label class="cbi-value-title"><%:Authentication Type%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.auth" name="cbid.network.<%=ifname%>.auth" size="1">
<option value="none"<% if uci:get("network",ifname,"auth") == "none" then %> selected="selected"<% end %>><%:NONE%></option>
<option value="pap"<% if uci:get("network",ifname,"auth") == "pap" then %> selected="selected"<% end %>><%:PAP%></option>
<option value="chap"<% if uci:get("network",ifname,"auth") == "chap" then %> selected="selected"<% end %>><%:CHAP%></option>
<option value="both"<% if uci:get("network",ifname,"auth") == "both" then %> selected="selected"<% end %>><%:PAP/CHAP%></option>
</select>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-username" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;pppoe&#34;}]" data-index="10">
<label class="cbi-value-title"><%:PAP/CHAP username%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.username" name="cbid.network.<%=ifname%>.username" class="cbi-input-text" value="<%=uci:get("network",ifname,"username")%>">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-password" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;pppoe&#34;}]" data-index="11">
<label class="cbi-value-title"><%:PAP/CHAP password%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.password" name="cbid.network.<%=ifname%>.password" class="cbi-input-text" value="<%=uci:get("network",ifname,"password")%>">
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-delay" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;ncm&#34;},{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;qmi&#34;}]" data-index="12">
<label class="cbi-value-title"><%:Modem init timeout%></label>
<div class="cbi-value-field">
<input type="text" id="cbid.network.<%=ifname%>.delay" name="cbid.network.<%=ifname%>.delay" class="cbi-input-text" value="<%=uci:get("network",ifname,"delay")%>">
</div>
</div>
<%
if uci:get("openmptcprouter",ifname,"multipathvpn") == "1" then
%>
<div class="cbi-value" id="cbi-network-<%=ifname%>-multipath" data-index="13">
<label class="cbi-value-title"><%:Multipath TCP%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.multipath" name="cbid.network.<%=ifname%>.multipath" size="1">
<option value="on"<% if uci:get("network","ovpn" .. ifname,"multipath") == "on" then %> selected="selected"<% end %>><%:Enabled%></option>
<option value="off"<% if uci:get("network","ovpn" .. ifname,"multipath") == "off" then %> selected="selected"<% end %>><%:Disabled%></option>
<option value="master"<% if uci:get("network","ovpn" .. ifname,"multipath") == "master" then %> selected="selected"<% end %>><%:Master%></option>
<option value="backup"<% if uci:get("network","ovpn" .. ifname,"multipath") == "backup" then %> selected="selected"<% end %>><%:Backup%></option>
</select>
</div>
</div>
<% else %>
<div class="cbi-value" id="cbi-network-<%=ifname%>-multipath" data-index="13">
<label class="cbi-value-title"><%:Multipath TCP%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.multipath" name="cbid.network.<%=ifname%>.multipath" size="1">
<option value="on"<% if uci:get("network",ifname,"multipath") == "on" then %> selected="selected"<% end %>><%:Enabled%></option>
<option value="off"<% if uci:get("network",ifname,"multipath") == "off" then %> selected="selected"<% end %>><%:Disabled%></option>
<option value="master"<% if uci:get("network",ifname,"multipath") == "master" then %> selected="selected"<% end %>><%:Master%></option>
<option value="backup"<% if uci:get("network",ifname,"multipath") == "backup" then %> selected="selected"<% end %>><%:Backup%></option>
</select>
</div>
</div>
<%
end
%>
<%
local download = "0"
local upload = "0"
@ -405,7 +742,7 @@ end
end
end
%>
<div class="cbi-value" data-index="6">
<div class="cbi-value" data-index="14">
<label class="cbi-value-title"><%:MPTCP over VPN%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="multipathvpn.<%=ifname%>.enabled" value="1" <% if uci:get("openmptcprouter",ifname,"multipathvpn") == "1" then %>checked<% end %> />
@ -415,7 +752,7 @@ end
</div>
</div>
</div>
<div class="cbi-value" data-index="7">
<div class="cbi-value" data-index="15">
<label class="cbi-value-title"><%:Enable SQM%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="cbid.sqm.<%=ifname%>.enabled" value="1" <% if uci:get("sqm",ifname,"enabled") == "1" then %>checked<% end %> />
@ -425,7 +762,7 @@ end
</div>
</div>
</div>
<div class="cbi-value" data-index="8">
<div class="cbi-value" data-index="16">
<label class="cbi-value-title"><%:Download speed (Kb/s)%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.sqm.<%=ifname%>.download" class="cbi-input-text" value="<%=download%>" data-type="uinteger">
@ -441,7 +778,7 @@ end
-->
</div>
</div>
<div class="cbi-value" data-index="9">
<div class="cbi-value" data-index="17">
<label class="cbi-value-title"><%:Upload speed (Kb/s)%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.sqm.<%=ifname%>.upload" class="cbi-input-text" value="<%=upload%>" data-type="uinteger">
@ -467,7 +804,7 @@ end
<select class="cbi-section-create-name" name="add_interface_ifname">
<%
for _, ifacea in ipairs(ifaces) do
if not (ifacea == "lo" or ifacea == "6in4-omr6in4" or ifacea:match("^ifb.*") or ifacea:match("^sit.*") or ifacea:match("^gre.*") or ifacea:match("^ip6.*") or ifacea:match("^teql.*")) and device_notvirtual(ifacea) then
if not (ifacea == "lo" or ifacea == "6in4-omr6in4" or ifacea == "mlvpn0" or ifacea:match("^ifb.*") or ifacea:match("^sit.*") or ifacea:match("^gre.*") or ifacea:match("^ip6.*") or ifacea:match("^teql.*") or ifacea:match("^erspan.*")) and device_notvirtual(ifacea) then
%>
<option value="<%=ifacea%>"><%=ifacea%></option>
<%

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
#!/bin/sh
# Copyright (C) 2020 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter
[ "$ACTION" = "add" ] || exit
[ "$ACTION" = "add" ] || [ "$ACTION" = "bind" ] || exit
[ -n "${INTERFACE}" ] || exit
[ -n "${DEVPATH}" ] || exit
@ -12,14 +12,46 @@ _set_intf_name() {
local device
local ifname
config_get device $intfname device
config_get modalias $intfname modalias
config_get ifname $intfname ifname
[ -n "$device" ] && [ -n "$ifname" ] && [ "/sys${DEVPATH}" = "$device" ] && [ "$INTERFACE" != "$ifname" ] && {
[ -n "$modalias" ] && {
if [ -f /sys/class/net/${INTERFACE}/device/uevent ]; then
#chk_modalias="$(cat /sys/class/net/${INTERFACE}/device/uevent | grep MODALIAS | cut -d '=' -f2 | tr -d '\n')"
chk_modalias=$MODALIAS
logger -t "OMR-Rename" "dir: $i - modalias: $modalias - chk_modalias: $chk_modalias - ifname: $ifname - INTERFACE: $INTERFACE"
if [ "$modalias" = "$chk_modalias" ] && [ "$INTERFACE" != "$ifname" ]; then
logger -t "OMR-Rename" "Rename ${INTERFACE} to ${ifname}"
existif=0
ip link set ${INTERFACE} down
[ "$(ip link show ${ifname} 2>/dev/null)" != "" ] && {
ip link set ${ifname} name ${ifname}tmp
existif=1
}
ip link set ${INTERFACE} name ${ifname}
ip link set ${ifname} up
[ "$existif" = "1" ] && ip link set ${ifname}tmp ${$INTERFACE}
fi
elif [ -f /dev/${DEVICE_NAME} ] && [ "$modalias" = "$MODALIAS" ]; then
if [ "$device" != "/dev/${DEVICE_NAME}" ]; then
ln -s /dev/${DEVICE_NAME} /dev/$intfname
uci -q set network.${intfname}.device="/dev/${intfname}"
fi
fi
}
[ -z "$modalias" ] && [ -n "$device" ] && [ -n "$ifname" ] && [ "/sys${DEVPATH}" = "$device" ] && [ "$INTERFACE" != "$ifname" ] && {
logger -t "OMR-Rename" "Rename ${INTERFACE} to ${ifname}"
ip link set ${INTERFACE} down
existif=0
[ "$(ip link show ${ifname} 2>/dev/null)" != "" ] && {
ip link set ${ifname} name ${ifname}tmp
existif=1
}
ip link set ${INTERFACE} name ${ifname}
ip link set ${ifname} up
[ "$existif" = "1" ] && ip link set ${ifname}tmp ${$INTERFACE}
}
}
config_load network
config_foreach _set_intf_name interface
config_foreach _set_intf_name interface

View file

@ -21,12 +21,39 @@ omr_intf_set() {
local multipath
config_get multipath "$1" multipath
config_get ifname "$1" ifname
config_get device "$1" device
config_get proto "$1" proto
config_get addlatency "$1" addlatency "0"
devicename=$(echo "$device" | cut -d'/' -f3)
[ -n "$ifname" ] && [ -L /sys/class/net/${ifname} ] && ([ "$proto" = "static" ] || [ "$proto" = "dhcp" ]) && {
device=$(readlink -f /sys/class/net/${ifname})
[ "$(echo ${device} | grep virtual)" = "" ] && uci -q set network.$1.device="$device"
}
[ -z "$ifname" ] && ifname=$(ifstatus "$1" | jsonfilter -q -e '@["l3_device"]')
if [ -n "$ifname" ]; then
if [ "$addlatency" = "0" ] && [ "$(tc qdisc show $ifname | grep delay)" != "" ]; then
tc qdisc del dev ${ifname} root netem
fi
if [ "$addlatency" != "0" ]; then
if [ "$(tc qdisc show $ifname | grep delay)" != "" ]; then
tc qdisc add dev ${ifname} root netem delay ${addlatency}ms
elif [ "$(tc qdisc show $ifname | awk '/delay/ { print $10 }' | sed 's/ms//')" != "$addlatency" ]; then
tc qdisc replace dev ${ifname} root netem delay ${addlatency}ms
fi
fi
fi
if [ -n "$ifname" ] && [ -f /sys/class/net/${ifname}/device/uevent ]; then
devicepath=$(readlink -f /sys/class/net/${ifname})
if [ -n "$devicepath" ] && [ "$(echo ${devicepath} | grep virtual)" = "" ]; then
uci -q set network.$1.modalias="$(cat /sys/class/net/${ifname}/device/uevent | grep MODALIAS | cut -d '=' -f2 | tr -d '\n')"
uci -q set network.$1.product="$(cat /sys/class/net/${ifname}/device/uevent | grep PRODUCT | cut -d '=' -f2 | tr -d '\n')"
elif [ -n "$devicepath" ] && [ "$(echo ${devicepath} | grep virtual)" != "" ]; then
uci -q delete network.$1.device
uci -q delete network.$1.modalias
fi
elif [ -n "$device" ] && [ -f /sys/bus/usb-serial/devices/${devicename}/device/uevent ]; then
uci -q set network.$1.modalias="$(cat /sys/bus/usb-serial/devices/${devicename}/device/uevent | grep MODALIAS | cut -d '=' -f2 | tr -d '\n')"
uci -q set network.$1.product="$(cat /sys/bus/usb-serial/devices/${devicename}/device/uevent | grep PRODUCT | cut -d '=' -f2 | tr -d '\n')"
fi
[ -z "$multipath" ] || [ "$multipath" = "off" ] && [ "$1" != "omrvpn" ] && [ "$1" != "glorytun" ] && return
@ -41,7 +68,7 @@ omr_intf_set() {
}
start_service() {
local scaling_min_freq scaling_max_freq
local scaling_min_freq scaling_max_freq scaling_governor
config_load openmptcprouter
config_foreach omr_intf_check interface
@ -72,8 +99,8 @@ start_service() {
}
}
# remove sysctl already defined in /etc/sysctl.d/
sed -i -e '/tcp_fin_timeout/d' -e '/tcp_keepalive_time/d' -e '/nf_conntrack_max/d' -e '/tcp_syn_retries/d' -e '/tcp_fastopen/d' -e '/tcp_retries2/d' /etc/sysctl.conf
sed -i -e '/tcp_fin_timeout/d' -e '/tcp_keepalive_time/d' -e '/nf_conntrack_max/d' -e '/tcp_syn_retries/d' -e '/tcp_fastopen/d' -e '/tcp_retries2/d' /etc/sysctl.d/10-default.conf
sed -i -e '/tcp_fin_timeout/d' -e '/tcp_keepalive_time/d' -e '/nf_conntrack_max/d' -e '/tcp_syn_retries/d' -e '/tcp_fastopen/d' -e '/tcp_retries2/d' -e '/tcp_retries1/d' -e '/ip_default_ttl/d' /etc/sysctl.conf
sed -i -e '/tcp_fin_timeout/d' -e '/tcp_keepalive_time/d' -e '/nf_conntrack_max/d' -e '/tcp_syn_retries/d' -e '/tcp_fastopen/d' -e '/tcp_retries2/d' -e '/tcp_retries1/d' -e '/ip_default_ttl/d' /etc/sysctl.d/10-default.conf
}
reload_service() {

View file

@ -2,6 +2,8 @@ net.ipv4.tcp_keepalive_time=7200
net.ipv6.conf.all.disable_ipv6=0
net.ipv4.tcp_fin_timeout=60
net.ipv4.tcp_syn_retries=3
net.ipv4.tcp_retries2=3
net.ipv4.tcp_retries1=3
net.ipv4.tcp_retries2=15
net.ipv4.tcp_fastopen=3
net.ipv4.tcp_low_latency=1
net.ipv4.ip_default_ttl=64

View file

@ -107,4 +107,7 @@ if [ "$(uci -q get openmptcprouter.settings.scaling_governor)" = "" ]; then
commit openmptcprouter
EOF
fi
sed -i 's/net.ipv4.tcp_retries2=3$/net.ipv4.tcp_retries2=15/' /etc/sysctl.d/zzz_openmptcprouter.conf
exit 0

View file

@ -706,6 +706,9 @@ function interfaces_status()
end
end
end
if mArray.openmptcprouter["service_addr"] ~= "" then
mArray.openmptcprouter["service_addr_ip"] = ut.trim(sys.exec("resolveip -4 -t 1 " .. mArray.openmptcprouter["service_addr"] .. " | head -n 1"))
end
end
if mArray.openmptcprouter["service_addr"] ~= "" and mArray.openmptcprouter["service_addr"] ~= "127.0.0.1" then
@ -784,6 +787,17 @@ function interfaces_status()
else
mArray.openmptcprouter["ss_traffic"] = "0"
end
if status and vpsinfo.v2ray ~= nil then
mArray.openmptcprouter["v2ray_traffic_rx"] = vpsinfo.v2ray.rx or "0"
mArray.openmptcprouter["v2ray_traffic_tx"] = vpsinfo.v2ray.tx or "0"
mArray.openmptcprouter["v2ray_traffic"] = mArray.openmptcprouter["v2ray_traffic_tx"] + mArray.openmptcprouter["v2ray_traffic_rx"]
else
mArray.openmptcprouter["v2ray_traffic_rx"] = "0"
mArray.openmptcprouter["v2ray_traffic_tx"] = "0"
mArray.openmptcprouter["v2ray_traffic"] = "0"
end
mArray.openmptcprouter["proxy_traffic"] = mArray.openmptcprouter["ss_traffic"] + mArray.openmptcprouter["v2ray_traffic"]
mArray.openmptcprouter["total_traffic"] = mArray.openmptcprouter["proxy_traffic"] + mArray.openmptcprouter["vpn_traffic"]
else
mArray.openmptcprouter["vps_admin"] = false
mArray.openmptcprouter["vps_admin_error_msg"] = "No result"
@ -870,22 +884,32 @@ function interfaces_status()
end
-- check Shadowsocks is running
mArray.openmptcprouter["socks_service"] = false
mArray.openmptcprouter["shadowsocks_service"] = false
if string.find(sys.exec("/usr/bin/pgrep ss-redir"), "%d+") then
mArray.openmptcprouter["socks_service"] = true
mArray.openmptcprouter["shadowsocks_service"] = true
end
mArray.openmptcprouter["socks_service_enabled"] = true
mArray.openmptcprouter["shadowsocks_enabled"] = true
local ss_server = uci:get("shadowsocks-libev","sss0","disabled") or "0"
if ss_server == "1" then
mArray.openmptcprouter["socks_service_enabled"] = false
mArray.openmptcprouter["shadowsocks_enabled"] = false
end
-- check V2Ray is running
mArray.openmptcprouter["v2ray_service"] = false
if string.find(sys.exec("/usr/bin/pgrep v2ray"), "%d+") then
mArray.openmptcprouter["v2ray_service"] = true
end
mArray.openmptcprouter["v2ray_enabled"] = false
local v2ray = uci:get("v2ray","main","enabled") or "0"
if v2ray == "1" then
mArray.openmptcprouter["v2ray_enabled"] = true
end
local ss_key = uci:get("shadowsocks-libev","sss0","key") or ""
mArray.openmptcprouter["socks_service_method"] = uci:get("shadowsocks-libev","sss0","method")
mArray.openmptcprouter["shadowsocks_service_method"] = uci:get("shadowsocks-libev","sss0","method")
if ss_key == "" then
mArray.openmptcprouter["socks_service_key"] = false
mArray.openmptcprouter["shadowsocks_service_key"] = false
else
mArray.openmptcprouter["socks_service_key"] = true
mArray.openmptcprouter["shadowsocks_service_key"] = true
end
-- Add DHCP infos by parsing dnsmasq config file
@ -1174,12 +1198,12 @@ function interfaces_status()
if connectivity ~= "ERROR" then
if ifname ~= nil and ifname:match("^tun.*") and interface:match("^ovpn.*") then
publicIP = uci:get("openmptcprouter",interface:sub(5),"publicip") or ""
if ifname ~= nil and publicIP == "" and mArray.openmptcprouter["external_check"] ~= false then
if ifname ~= nil and publicIP == "" and mArray.openmptcprouter["external_check"] ~= false and mArray.openmptcprouter["dns"] == true then
publicIP = ut.trim(sys.exec("omr-ip-intf " .. get_device(interface:sub(5))))
end
else
publicIP = uci:get("openmptcprouter",interface,"publicip") or ""
if ifname ~= nil and publicIP == "" and mArray.openmptcprouter["external_check"] ~= false then
if ifname ~= nil and publicIP == "" and mArray.openmptcprouter["external_check"] ~= false and mArray.openmptcprouter["dns"] == true then
publicIP = ut.trim(sys.exec("omr-ip-intf " .. ifname))
end
end

View file

@ -1,205 +1,237 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:43
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:43
msgid "-- instance type --"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:211
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:218
msgid "<hidden>"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:76
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:44
msgid "Add a new rule..."
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:76
msgid "Advanced Settings"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:86
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:87
msgid "Bind address"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:87
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:98
msgid "Bypass ss-redir for packets with dst address in this list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:73
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:84
msgid "Bypass ss-redir for packets with src address in this list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:79
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:27
msgid "Cancel"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:90
msgid ""
"Continue to have dst address checked for packets with src address in this "
"list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:59
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:70
msgid "Default action for locally generated TCP packets"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:103
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:114
msgid ""
"Default action for packets whose dst address do not match any of the dst ip "
"list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:82
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:93
msgid ""
"Default action for packets whose src address do not match any of the src ip/"
"net list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:14
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:14
msgid ""
"Definition of remote shadowsocks servers. Disable any of them will also "
"disable instances referring to it."
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:43
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:52
msgid "Destination Settings"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:77
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:45
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:20
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:78
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:56
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:64
msgid "Disable"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:128
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:129
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:129
msgid "Disabled"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:102
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:113
msgid "Dst default"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:86
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:97
msgid "Dst ip/net bypass"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:94
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:105
msgid "Dst ip/net bypass file"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:89
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:100
msgid "Dst ip/net forward"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:98
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:109
msgid "Dst ip/net forward file"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:181
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:188
msgid "Enable MPTCP"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:187
msgid "Enable SO_REUSEPORT"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:179
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:185
msgid "Enable TCP Fast Open"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:180
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:186
msgid "Enable TCP_NODELAY"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:121
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:122
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:122
msgid "Enable/Disable"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:131
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:132
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:132
msgid "Enabled"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:68
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:79
msgid "Extra arguments"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:95
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:106
msgid ""
"File containing ip/net for the purposes as with <em>Dst ip/net bypass</em>"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:99
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:110
msgid ""
"File containing ip/net for the purposes as with <em>Dst ip/net forward</em>"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:118
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:118
msgid "Forward recentrst"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:119
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:119
msgid ""
"Forward those packets whose dst have recently sent to us multiple tcp-rst"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:90
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:101
msgid "Forward through ss-redir for packets with dst address in this list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:76
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:87
msgid "Forward through ss-redir for packets with src address in this list"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:75
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:41
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:75
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:50
msgid "General Settings"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
#: luci-app-shadowsocks-libev/root/usr/share/rpcd/acl.d/luci-app-shadowsocks-libev.json:3
msgid "Grant service list access to LuCI app shadowsocks-libev"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:184
msgid "IPv6 First"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:62
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:50
msgid "Import"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:21
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:58
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:60
msgid "Import Links"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:73
msgid "Ingress interfaces"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:235
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:242
msgid "Install package"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:111
msgid "Install package iptables-mod-conntrack-extra"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:25
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:25
msgid ""
"Instances of shadowsocks-libev components, e.g. ss-local, ss-redir, ss-"
"tunnel, ss-server, etc. To enable an instance it is required to enable both "
"the instance itself and the remote server it refers to."
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:155
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:161
msgid "Key (base64)"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:24
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:13
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:142
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:77
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:57
msgid "Label"
msgstr ""
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:24
#: luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:13
#: luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json:14
msgid "Local Instances"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:113
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:117
msgid "Local address"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:117
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:121
msgid "Local port"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:58
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:69
msgid "Local-out default"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:171
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:177
msgid "MTU"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:146
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:152
msgid "Method"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:166
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:172
msgid "Mode of operation"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:31
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:33
msgid ""
"On this page you can configure how traffics are to be forwarded to ss-redir "
"instances. If enabled, packets will first have their src ip addresses "
@ -209,116 +241,119 @@ msgid ""
"<em>checkdst</em>, packets will continue to have their dst addresses checked."
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:63
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:74
msgid "Only apply rules on packets from these network interfaces"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:104
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:105
msgid "Overview"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:234
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:241
msgid "Package is not installed"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:69
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:80
msgid "Passes additional arguments to iptables. Use with care!"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:151
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:157
msgid "Password"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:161
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:167
msgid "Plugin"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:163
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:169
msgid "Plugin Options"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:184
msgid "Prefer IPv6 addresses when resolving names"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:30
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:21
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:32
#: luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:21
#: luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json:32
msgid "Redir Rules"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:13
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:17
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/servers.js:13
#: luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:17
#: luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json:23
msgid "Remote Servers"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:111
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:115
msgid "Remote server"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:175
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:181
msgid "Run as"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:116
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:117
msgid "Running"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:138
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:144
msgid "Server"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:142
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:148
msgid "Server port"
msgstr ""
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:9
#: luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:9
#: luci-app-shadowsocks-libev/root/usr/share/luci/menu.d/luci-app-shadowsocks-libev.json:3
msgid "Shadowsocks-libev"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:42
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:51
msgid "Source Settings"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:81
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:92
msgid "Src default"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:72
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:83
msgid "Src ip/net bypass"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:78
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:89
msgid "Src ip/net checkdst"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:75
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:86
msgid "Src ip/net forward"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:87
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:88
msgid "The address ss-server will initiate connection from"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:96
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:97
msgid "The address ss-tunnel will forward traffic to"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:173
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:179
msgid "Timeout (sec)"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:95
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:96
msgid "Tunnel address"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:177
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:183
msgid "Verbose"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:51
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:62
msgid "ss-redir for TCP"
msgstr ""
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:54
#: luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:65
msgid "ss-redir for UDP"
msgstr ""

View file

@ -0,0 +1,38 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-15 11:36+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsshutdown/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json:3
msgid "Allow shutdown the device"
msgstr "Consenti l&#39;arresto del dispositivo"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:23
msgid "Perform shutdown"
msgstr "Eseguire l&#39;arresto"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:9
#: luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json:3
msgid "Shutdown"
msgstr "Spegnimento"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:10
msgid "Shutdown the operating system of your device"
msgstr "Arresta il sistema operativo del tuo dispositivo"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:31
msgid "The poweroff command failed with code %d"
msgstr "Il comando di spegnimento non è riuscito con il codice %d"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:15
msgid "Warning: There are unsaved changes that will get lost on shutdown!"
msgstr ""
"Avvertenza: sono presenti modifiche non salvate che andranno perse "
"all&#39;arresto!"

View file

@ -0,0 +1,37 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsshutdown/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json:3
msgid "Allow shutdown the device"
msgstr "Permetre d'atudat lo periferic"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:23
msgid "Perform shutdown"
msgstr "Lançar l'extinccion"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:9
#: luci-app-shutdown/root/usr/share/luci/menu.d/luci-app-shutdown.json:3
msgid "Shutdown"
msgstr "Atudar"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:10
msgid "Shutdown the operating system of your device"
msgstr "Atudar lo sistèma operatiu del periferic"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:31
msgid "The poweroff command failed with code %d"
msgstr "La comanda poweroff a pas capitat amb lo còdi %d"
#: luci-app-shutdown/htdocs/luci-static/resources/view/system/shutdown.js:15
msgid "Warning: There are unsaved changes that will get lost on shutdown!"
msgstr ""
"Avís: i a de modificacions pas enregistradas que seràn perdudas en atudant!"

View file

@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI SNMPD Interface
LUCI_DEPENDS:=+snmpd
LUCI_DEPENDS:=+snmpd +snmptrapd +snmp-utils +snmp-mibs
PKG_LICENSE:=GPLv3

View file

@ -1,7 +1,7 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"PO-Revision-Date: 2020-10-05 12:39+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationssnmpd/de/>\n"
"Language: de\n"
@ -17,7 +17,7 @@ msgstr "Zugriff"
#: luci-app-snmpd/luasrc/view/snmpd.htm:81
#: luci-app-snmpd/luasrc/view/snmpd.htm:122
msgid "Add"
msgstr "hinzufügen"
msgstr "Hinzufügen"
#: luci-app-snmpd/luasrc/view/snmpd.htm:66
#: luci-app-snmpd/luasrc/view/snmpd.htm:116
@ -47,7 +47,7 @@ msgstr "FQDN, IP-Adresse oder CIDR-Netzmaske"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9
#: luci-app-snmpd/luasrc/view/snmpd.htm:24
msgid "Enabled"
msgstr "aktiv"
msgstr "Aktiv"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132
msgid "Exec"
@ -76,7 +76,7 @@ msgstr "Gruppen ermöglichen es, Zugriffsmethoden festzulegen"
#: luci-app-snmpd/luasrc/view/snmpd.htm:64
#: luci-app-snmpd/luasrc/view/snmpd.htm:114
msgid "Interface"
msgstr "Anschluss"
msgstr "Schnittstelle"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101
msgid "Level"

View file

@ -0,0 +1,184 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationssnmpd/it/>\n"
"Language: it\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.0.4\n"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82
msgid "Access"
msgstr "Accesso"
#: luci-app-snmpd/luasrc/view/snmpd.htm:81
#: luci-app-snmpd/luasrc/view/snmpd.htm:122
msgid "Add"
msgstr "Aggiungi"
#: luci-app-snmpd/luasrc/view/snmpd.htm:66
#: luci-app-snmpd/luasrc/view/snmpd.htm:116
msgid "All"
msgstr "Tutti"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139
msgid "Arguments"
msgstr "Parametri"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42
msgid "Community"
msgstr "Community"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23
msgid "Contact"
msgstr "Contatto"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97
msgid "Context"
msgstr "Contesto"
#: luci-app-snmpd/luasrc/view/snmpd.htm:54
msgid "Domain, IP or network"
msgstr "Dominio, IP o rete"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9
#: luci-app-snmpd/luasrc/view/snmpd.htm:24
msgid "Enabled"
msgstr "Abilitato"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132
msgid "Exec"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6
#: luci-app-snmpd/luasrc/view/snmpd.htm:21
#: luci-app-snmpd/luasrc/view/snmpd.htm:48
msgid "General"
msgstr ""
#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3
msgid "Grant UCI access for luci-app-snmpd"
msgstr "Concedi l'accesso UCI per luci-app-snmpd"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86
msgid "Group"
msgstr "Gruppo"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63
msgid "Groups help define access methods"
msgstr "I gruppi aiutano a definire i metodi di accesso"
#: luci-app-snmpd/luasrc/view/snmpd.htm:64
#: luci-app-snmpd/luasrc/view/snmpd.htm:114
msgid "Interface"
msgstr "Interfaccia"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101
msgid "Level"
msgstr "Livello"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22
msgid "Location"
msgstr "Sede"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137
msgid "Name"
msgstr "Nome"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12
msgid "Networks"
msgstr "Reti"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116
msgid "Notify"
msgstr "Notificare"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136
msgid "ObjectID"
msgstr ""
#: luci-app-snmpd/luasrc/view/snmpd.htm:55
#: luci-app-snmpd/luasrc/view/snmpd.htm:90
msgid "Output interface"
msgstr "Interfaccia di output"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138
msgid "Program"
msgstr "Programma"
#: luci-app-snmpd/luasrc/view/snmpd.htm:85
#: luci-app-snmpd/luasrc/view/snmpd.htm:89
msgid "Protocols"
msgstr "Protocollo"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106
msgid "Read"
msgstr "Leggi"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69
msgid "Read-only"
msgstr "Sola lettura"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70
msgid "Read-write"
msgstr "Leggi-Scrivi"
#: luci-app-snmpd/luasrc/controller/snmpd.lua:6
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4
#: luci-app-snmpd/luasrc/view/snmpd.htm:19
#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3
msgid "SNMPd"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4
msgid "SNMPd settings interface (Beta)"
msgstr "Interfaccia delle impostazioni SNMPd (Beta)"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32
msgid "Server"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37
msgid "Source"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19
msgid "System"
msgstr "Sistema"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111
msgid "Write"
msgstr "Scrittura"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92
msgid "any"
msgstr "qualsiasi"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104
msgid "auth"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29
msgid "com2sec security"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103
msgid "noauth"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67
msgid "secname"
msgstr ""
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90
msgid "version"
msgstr "versione"

View file

@ -0,0 +1,184 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-31 17:15+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationssnmpd/oc/>\n"
"Language: oc\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.0.4\n"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:82
msgid "Access"
msgstr "Accès"
#: luci-app-snmpd/luasrc/view/snmpd.htm:81
#: luci-app-snmpd/luasrc/view/snmpd.htm:122
msgid "Add"
msgstr "Ajustar"
#: luci-app-snmpd/luasrc/view/snmpd.htm:66
#: luci-app-snmpd/luasrc/view/snmpd.htm:116
msgid "All"
msgstr "Tot"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:139
msgid "Arguments"
msgstr "Arguments"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:42
msgid "Community"
msgstr "Comunautat"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:23
msgid "Contact"
msgstr "Contacte"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:97
msgid "Context"
msgstr "Contèxt"
#: luci-app-snmpd/luasrc/view/snmpd.htm:54
msgid "Domain, IP or network"
msgstr "Domeni, IP o ret"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:9
#: luci-app-snmpd/luasrc/view/snmpd.htm:24
msgid "Enabled"
msgstr "Activat"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:132
msgid "Exec"
msgstr "Exec"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:6
#: luci-app-snmpd/luasrc/view/snmpd.htm:21
#: luci-app-snmpd/luasrc/view/snmpd.htm:48
msgid "General"
msgstr "General"
#: luci-app-snmpd/root/usr/share/rpcd/acl.d/luci-app-snmpd.json:3
msgid "Grant UCI access for luci-app-snmpd"
msgstr "Acordar l'accès UCI a luci-app-snmpd"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:72
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:86
msgid "Group"
msgstr "Grop"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:63
msgid "Groups help define access methods"
msgstr "Los grops ajudan a gerir los metòdes d'accès"
#: luci-app-snmpd/luasrc/view/snmpd.htm:64
#: luci-app-snmpd/luasrc/view/snmpd.htm:114
msgid "Interface"
msgstr "Interfàcia"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:101
msgid "Level"
msgstr "Nivèl"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:22
msgid "Location"
msgstr "Emplaçament"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:24
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:137
msgid "Name"
msgstr "Nom"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:12
msgid "Networks"
msgstr "Rets"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:116
msgid "Notify"
msgstr "Notificar"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:136
msgid "ObjectID"
msgstr "ObjectID"
#: luci-app-snmpd/luasrc/view/snmpd.htm:55
#: luci-app-snmpd/luasrc/view/snmpd.htm:90
msgid "Output interface"
msgstr "Interfàcia de sortida"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:138
msgid "Program"
msgstr "Programa"
#: luci-app-snmpd/luasrc/view/snmpd.htm:85
#: luci-app-snmpd/luasrc/view/snmpd.htm:89
msgid "Protocols"
msgstr "Protocòls"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:106
msgid "Read"
msgstr "Lectura"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:34
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:69
msgid "Read-only"
msgstr "Lectura sola"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:35
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:70
msgid "Read-write"
msgstr "Lectura-escritura"
#: luci-app-snmpd/luasrc/controller/snmpd.lua:6
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4
#: luci-app-snmpd/luasrc/view/snmpd.htm:19
#: luci-app-snmpd/root/usr/share/luci/menu.d/luci-app-snmpd.json:3
msgid "SNMPd"
msgstr "SNMPd"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:4
msgid "SNMPd settings interface (Beta)"
msgstr "Interfàcia de paramètres SNMPd (Beta)"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:32
msgid "Server"
msgstr "Servidor"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:37
msgid "Source"
msgstr "Font"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:19
msgid "System"
msgstr "Sistèma"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:111
msgid "Write"
msgstr "Escritura"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:92
msgid "any"
msgstr "Quin que siá"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:104
msgid "auth"
msgstr "auth"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:29
msgid "com2sec security"
msgstr "seguretat com2sec"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:103
msgid "noauth"
msgstr "noauth"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:67
msgid "secname"
msgstr "secname"
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:76
#: luci-app-snmpd/luasrc/model/cbi/snmpd.lua:90
msgid "version"
msgstr "version"

View file

@ -344,5 +344,6 @@ service_triggers(){
}
service_started() {
[ "$snmp_enabled" -eq 0 ] && return
procd_set_config_changed firewall
}

7620
luci-base/po/oc/base.po Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,18 @@
#
# Copyright 2019-2020 ZHANG Zhao <Zhao.Zhang2@etu.univ-grenoble-alpes.fr>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Dashboard Pages
LUCI_DEPENDS:=+luci-base +libiwinfo
PKG_BUILD_DEPENDS:=iwinfo
PKG_LICENSE:=Apache-2.0
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View file

@ -0,0 +1,301 @@
/**
* Dashboard Principals Styles
**/
.Dashboard {
color: #212529!important;
}
.Dashboard h3 {
color:#000;
background: transparent;
}
.Dashboard hr {
border: 0;
height: 0;
overflow: visible;
margin: 0;
box-sizing: content-box;
border-top: 1px solid rgba(0,0,0,.1);
}
.Dashboard .box-s1 {
min-height: 550px;
}
.Dashboard .internet-status-self .internet-status-info .title {
height: 97px;
}
.Dashboard .dashboard-bg {
border-radius: 16px;
background-color: #e0e0e0;
}
.Dashboard div > table > tbody > tr:nth-of-type(2n), div > .table > .tr:nth-of-type(2n) {
background-color: transparent;
}
.Dashboard .tr {
background-color: transparent;
}
.Dashboard .title {
text-align: center;
}
.Dashboard .section-content {
display: flex;
vertical-align: top;
padding: 20px 0 0 0;
align-items: flex-start;
justify-content: space-between;
}
.Dashboard .section-content > div {
width:100%;
padding:1.5em;
}
.Dashboard .section-content .settings-info {
padding-top:1em;
}
.Dashboard .section-content .internet-status-info .settings-info {
display: flex;
justify-content: space-around;
}
.Dashboard .section-content .internet-status-info .settings-info > div > p > i{
padding: 0 0 0 5px;
}
.Dashboard .section-content > div:nth-child(2) {
margin-left:20px;
}
.Dashboard .devices-list .devices-info {
margin-bottom: 0;
}
.Dashboard .devices-list .devices-info .tr .td{
padding:0px 0 0 10px;
}
.Dashboard .devices-list .devices-info .tr .td:first-child {
width: 33%;
word-break: break-all;
}
.Dashboard .devices-list hr:nth-child(4) {
margin-top: 0;
margin-bottom: 8px;
}
.Dashboard .router-status-lan .devices-list .table-titles .th:first-child {
width: 35%;
}
.Dashboard .router-status-self .router-status-info .settings-info {
padding-left:27px;
}
.Dashboard .router-status-self .router-status-info .title h3 {
margin-top:-2px;
}
.Dashboard .router-status-info svg {
width: 70px;
}
.Dashboard .internet-status-self .settings-info p:first-child span:first-child{
font-size: 12px;
font-weight: 500;
}
//.Dashboard .internet-status-self .settings-info p:first-child span:first-child,
.Dashboard .router-status-wifi .wifi-info .settings-info p:first-child span:first-child,
.Dashboard .router-status-wifi .wifi-info .settings-info p:nth-child(2) span:first-child{
font-weight: 700;
}
.Dashboard .settings-info p span:first-child {
width: 35%;
font-size: 12px;
text-align: right;
}
.Dashboard .settings-info p span:nth-child(2){
display: inline-block;
word-break: break-all;
max-width: 150px;
overflow: hidden;
max-height: 16px;
position: relative;
top:2px;
}
.Dashboard .router-status-info .settings-info p span:nth-child(2){
max-width: 283px;
}
.Dashboard .settings-info p span.ssid {
max-height: 18px;
top: 3px;
}
.Dashboard .settings-info p span.encryption {
max-width: 82px;
}
.Dashboard .router-status-wifi .wifi-info .settings-info,
.Dashboard .router-status-lan .lan-info .settings-info
{
display: flex;
justify-content: space-around;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td {
padding: 0 10px 0 10px;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:first-child {
width: 30%;
word-break: break-all;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(2) {
width: 21%;
overflow: hidden;
padding-left:0;
word-break: break-all;
}
.Dashboard .router-status-wifi .wifi-info .settings-info{
padding:1em 0 1em 0;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(3) {
width: 22%;
overflow: hidden;
position: relative;
top: -3px;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .tr .td:nth-child(5) {
width: initial;
}
.Dashboard .router-status-wifi .wifi-info > hr:last-child {
margin-bottom:0;
}
.Dashboard .router-status-wifi .wifi-info .devices-info .device-info .progress {
padding: 0;
width: 100%;
margin: 0;
}
.Dashboard .wifi-info .devices-info .table-titles {
border-bottom:1px solid rgba(0,0,0,.1);
}
.Dashboard .label-success {
background-color: green;
}
.Dashboard .label-danger {
background-color: red;
}
/**
* Responsive
**/
@media screen and (min-width: 200px) and (max-width: 640px) {
.Dashboard .cbi-section-1 > .section-content {
padding-top:10px;
}
.Dashboard .section-content {
display:block;
}
.Dashboard .section-content > div{
padding: 1em;
}
.Dashboard .section-content > div:first-child {
margin-bottom:10px;
}
.Dashboard .section-content > div:nth-child(2) {
margin:0;
}
.Dashboard .router-status-self .router-status-info .settings-info {
padding:0;
}
.Dashboard .section-content .internet-status-info .settings-info {
display:block;
}
.Dashboard .section-content .internet-status-info .settings-info > div:first-child {
margin-bottom: 10px;
border-bottom: 1px solid rgba(0,0,0,.1);
}
.Dashboard .section-content .router-status-lan .devices-info .table-titles {
display:block;
}
.Dashboard .router-status-wifi .wifi-info .settings-info > div{
flex:1;
}
.Dashboard .section-content .router-status-lan .devices-info .table-titles .th:last-child{
padding-left: 70px;
}
.Dashboard .section-content .router-status-lan .devices-info .td:first-child{
flex: 2 2 31%;
}
.Dashboard .section-content .router-status-lan .devices-info .td:nth-child(2){
flex: 1 1 24%;
padding: 0;
}
.Dashboard .section-content .router-status-lan .devices-info .td:last-child{
word-wrap: normal;
}
.Dashboard .router-status-wifi .wifi-info .settings-info > div p:nth-child(6) > span:last-child{
display: inline-block;
overflow: hidden;
height: 14px;
width: 52%;
word-break: break-word;
line-height: 15px;
}
.Dashboard .wifi-info .devices-info .table-titles {
padding: 0;
margin: 0;
display: flex;
border-radius: initial;
}
.Dashboard .wifi-info .devices-info .table-titles .th {
flex: 2 2 24%;
}
.Dashboard .wifi-info .devices-info .tr .td {
flex: 2 2 10%;
}
.Dashboard .wifi-info hr:nth-child(4) {
margin-bottom: 0;
}
}

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 32 32"><g stroke="#000" fill="none"><defs><symbol id="0"><path d="M6 11l0 -2 -4 0c-1,0 -1,-1 -1,-1l0 -6c0,-1 1,-1 1,-1l10 0c1,0 1,1 1,1l0 6c0,1 -1,1 -1,1l-4 0 0 2m-2 -2l2 0m-5 2l8 0"/></symbol></defs><use xlink:href="#0" x="9" y="2"/><use xlink:href="#0" x="0" y="18"/><use xlink:href="#0" x="18" y="18"/><path d="M16 14l0 3m-8 1l0 -1 16 0 0 1"/></g></svg>

After

Width:  |  Height:  |  Size: 452 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g stroke="#5b5" fill="none"><circle cx="16" cy="16" r="15"/><ellipse cx="16" cy="16" rx="8" ry="15"/><path d="M4 25c6,-3 18,-3 24,0m-27 -9l30 0m-27 -9c6,3 18,3 24,0m-12 -6l0 30"/></g></svg>

After

Width:  |  Height:  |  Size: 250 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><g stroke="#000" fill="none"><circle cx="16" cy="16" r="15"/><ellipse cx="16" cy="16" rx="8" ry="15"/><path d="M4 25c6,-3 18,-3 24,0m-27 -9l30 0m-27 -9c6,3 18,3 24,0m-12 -6l0 30"/></g></svg>

After

Width:  |  Height:  |  Size: 250 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path stroke="#000" fill="none" d="M6 22l-4 0c-1,0 -1,1 -1,1l0 4c0,1 1,1 1,1l28 0c1,0 1,-1 1,-1l0 -4c0,-1 -1,-1 -1,-1l-24 0 -2 -18c-0.2,-2 -2.2,-2 -2,0l2 18m22 0l2 -18c0.2,-2 2.2,-2 2,0l-2 18m-2 4l2 0m-5 0l2 0m-12 0l2 0m-5 0l2 0m-5 0l2 0m-5 0l2 0"/></svg>

After

Width:  |  Height:  |  Size: 315 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"><path stroke="#000" fill="none" d="M4 15l-3 -3c8.4,-8.3 21.6,-8.3 30,0l-3 3c-6.6,-6.6 -17.4,-6.6 -24,0zm6 6l-3 -3c5,-5 13,-5 18,0l-3 3c-3.3,-3.3 -8.7,-3.3 -12,0zm6 6l-3 -3c1.6,-1.7 4.4,-1.7 6,0l-3 3z"/></svg>

After

Width:  |  Height:  |  Size: 268 B

View file

@ -0,0 +1,381 @@
'use strict';
'require baseclass';
'require fs';
'require rpc';
'require network';
var callSystemBoard = rpc.declare({
object: 'system',
method: 'board'
});
var callSystemInfo = rpc.declare({
object: 'system',
method: 'info'
});
var callOpenMPTCProuterInfo = rpc.declare({
object: 'openmptcprouter',
method: 'status'
});
return baseclass.extend({
params: [],
formatBytes: function(a,b=2){if(0===a)return"0 Bytes";const c=0>b?0:b,d=Math.floor(Math.log(a)/Math.log(1024));return parseFloat((a/Math.pow(1024,d)).toFixed(c))+" "+["Bytes","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"][d]},
load: function() {
return Promise.all([
network.getWANNetworks(),
network.getWAN6Networks(),
L.resolveDefault(callSystemBoard(), {}),
L.resolveDefault(callSystemInfo(), {}),
L.resolveDefault(callOpenMPTCProuterInfo(), {})
]);
},
renderHtml: function(data, type) {
var icon = type;
var title = 'router' == type ? _('System') : _('Internet');
var container_wapper = E('div', { 'class': type + '-status-self dashboard-bg box-s1'});
var container_box = E('div', { 'class': type + '-status-info'});
var container_item = E('div', { 'class': 'settings-info'});
if ('internet' == type) {
icon = (data.internet.v4.connected.value || data.internet.v6.connected.value) ? type : 'not-internet';
}
container_box.appendChild(E('div', { 'class': 'title'}, [
E('img', {
'src': L.resource('view/dashboard/icons/' + icon + '.svg'),
'width': 'router' == type ? 64 : 54,
'title': title,
'class': 'middle'
}),
E('h3', title)
]));
container_box.appendChild(E('hr'));
if ('internet' == type) {
var container_internet_v4 = E('div');
var container_internet_v6 = E('div');
var container_internet_vps = E('div');
for(var idx in data['vps']) {
var classname = ver,
suppelements = '',
visible = data['vps'][idx].visible;
if ('title' === idx) {
container_internet_vps.appendChild(
E('p', { 'class': 'mt-2'}, [
E('h4', {'class': ''}, [ data['vps'].title ]),
])
);
continue;
}
if (visible) {
container_internet_vps.appendChild(
E('p', { 'class': 'mt-2'}, [
E('span', {'class': ''}, [ data['vps'][idx].title + '' ]),
E('span', {'class': ''}, [ data['vps'][idx].value ]),
suppelements
])
);
}
}
for(var idx in data['internet']) {
for(var ver in data['internet'][idx]) {
var classname = ver,
suppelements = '',
visible = data['internet'][idx][ver].visible;
if('connected' === ver) {
classname = data['internet'][idx][ver].value ? 'label label-success' : 'label label-danger';
data['internet'][idx][ver].value = data['internet'][idx][ver].value ? _('yes') : _('no');
}
if ('v4' === idx) {
if ('title' === ver) {
container_internet_v4.appendChild(
E('p', { 'class': 'mt-2'}, [
E('h4', {'class': ''}, [ data['internet'][idx].title ]),
])
);
continue;
}
if ('addrsv4' === ver) {
var addrs = data['internet'][idx][ver].value;
if(Array.isArray(addrs) && addrs.length) {
for(var ip in addrs) {
data['internet'][idx][ver].value = addrs[ip].split('/')[0];
}
}
}
if (visible) {
container_internet_v4.appendChild(
E('p', { 'class': 'mt-2'}, [
E('span', {'class': ''}, [ data['internet'][idx][ver].title + '' ]),
E('span', {'class': classname }, [ data['internet'][idx][ver].value ]),
suppelements
])
);
}
} else {
if ('title' === ver) {
container_internet_v6.appendChild(
E('p', { 'class': 'mt-2'}, [
E('h4', {'class': ''}, [ data['internet'][idx].title ]),
])
);
continue;
}
if (visible) {
container_internet_v6.appendChild(
E('p', {'class': 'mt-2'}, [
E('span', {'class': ''}, [data['internet'][idx][ver].title + '']),
E('span', {'class': classname}, [data['internet'][idx][ver].value]),
suppelements
])
);
}
}
}
}
container_item.appendChild(E('p', { 'class': 'table'}, [
E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td' }, [ container_internet_vps ])
]),
E('div', { 'class': 'tr' }, [
E('div', { 'class': 'td' }, [
container_internet_v4
]),
E('div', { 'class': 'td' }, [
container_internet_v6
])
])
]));
} else {
for(var idx in data) {
container_item.appendChild(
E('p', { 'class': 'mt-2'}, [
E('span', {'class': ''}, [ data[idx].title + '' ]),
E('span', {'class': ''}, [ data[idx].value ])
])
);
}
}
container_box.appendChild(container_item);
container_box.appendChild(E('hr'));
container_wapper.appendChild(container_box);
return container_wapper;
},
renderUpdateWanData: function(data, v6) {
for (var i = 0; i < data.length; i++) {
var ifc = data[i];
if (v6) {
this.params.internet.v6.ipprefixv6.value = ifc.getIP6Prefix() || '-';
this.params.internet.v6.gatewayv6.value = ifc.getGateway6Addr() || '-';
this.params.internet.v6.protocol.value= ifc.getI18n() || E('em', _('Not connected'));
this.params.internet.v6.addrsv6.value = ifc.getIP6Addrs() || [ '-' ];
this.params.internet.v6.dnsv6.value = ifc.getDNS6Addrs() || [ '-' ];
this.params.internet.v6.connected.value = ifc.isUp();
} else {
var uptime = ifc.getUptime();
this.params.internet.v4.uptime.value = (uptime > 0) ? '%t'.format(uptime) : '-';
this.params.internet.v4.protocol.value= ifc.getI18n() || E('em', _('Not connected'));
this.params.internet.v4.gatewayv4.value = ifc.getGatewayAddr() || '0.0.0.0';
this.params.internet.v4.connected.value = ifc.isUp();
this.params.internet.v4.addrsv4.value = ifc.getIPAddrs() || [ '-'];
this.params.internet.v4.dnsv4.value = ifc.getDNSAddrs() || [ '-' ];
}
}
},
renderUpdateOpenMPTCProuterData: function(data, v6) {
if (data.openmptcprouter != undefined) {
if (data.openmptcprouter.wan_addr != '') this.params.omrvps.internet.v4.connected.value = true;
if (data.openmptcprouter.wan_addr) this.params.omrvps.internet.v4.addrsv4.value = data.openmptcprouter.wan_addr || [ '-'];
if (data.openmptcprouter.wan_addr6) this.params.omrvps.internet.v6.addrsv6.value = data.openmptcprouter.wan_addr6 || [ '-'];
if (data.openmptcprouter.vps_kernel) this.params.omrvps.vps.version.value = data.openmptcprouter.vps_kernel + ' ' + data.openmptcprouter.vps_omr_version || [ '-'];
if (data.openmptcprouter.vps_loadavg) this.params.omrvps.vps.load.value = data.openmptcprouter.vps_loadavg || [ '-'];
if (data.openmptcprouter.vps_uptime) this.params.omrvps.vps.uptime.value = String.format('%t', data.openmptcprouter.vps_uptime) || [ '-'];
if (data.openmptcprouter.proxy_traffic) this.params.omrvps.vps.trafficproxy.value = this.formatBytes(data.openmptcprouter.proxy_traffic) || [ '-'];
if (data.openmptcprouter.vpn_traffic) this.params.omrvps.vps.trafficvpn.value = this.formatBytes(data.openmptcprouter.vpn_traffic) || [ '-'];
if (data.openmptcprouter.total_traffic) this.params.omrvps.vps.traffictotal.value = this.formatBytes(data.openmptcprouter.total_traffic) || [ '-'];
if (data.openmptcprouter.ipv6 != 'disabled') this.params.omrvps.internet.v6.connected.value = true;
}
},
renderInternetBox: function(data) {
this.params.omrvps = {
vps: {
title: _('Server'),
version: {
title: _('Version'),
visible: true,
value: [ '-' ]
},
load: {
title: _('Load'),
visible: true,
value: [ '-' ]
},
uptime: {
title: _('Uptime'),
visible: true,
value: [ '-' ]
},
trafficproxy: {
title: _('Proxy traffic'),
visible: true,
value: [ '-' ]
},
trafficvpn: {
title: _('VPN traffic'),
visible: true,
value: [ '-' ]
},
traffictotal: {
title: _('Total traffic'),
visible: true,
value: [ '-' ]
}
},
internet: {
v4: {
title: _('IPv4 Internet'),
connected: {
title: _('Connected'),
visible: true,
value: false
},
addrsv4: {
title: _('IPv4'),
visible: true,
value: [ '-' ]
}
},
v6: {
title: _('IPv6 Internet'),
connected: {
title: _('Connected'),
visible: true,
value: false
},
ipprefixv6 : {
title: _('IPv6 prefix'),
visible: false,
value: ' - '
},
addrsv6: {
title: _('IPv6'),
visible: true,
value: [ '-' ]
}
}
}
};
//this.renderUpdateWanData(data[0], false);
//this.renderUpdateWanData(data[1], true);
this.renderUpdateOpenMPTCProuterData(data[4], true);
return this.renderHtml(this.params.omrvps, 'internet');
},
renderRouterBox: function(data) {
var boardinfo = data[2],
systeminfo = data[3];
var datestr = null;
if (systeminfo.localtime) {
var date = new Date(systeminfo.localtime * 1000);
datestr = '%04d-%02d-%02d %02d:%02d:%02d'.format(
date.getUTCFullYear(),
date.getUTCMonth() + 1,
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds()
);
}
this.params.router = {
uptime: {
title: _('Uptime'),
value: systeminfo.uptime ? '%t'.format(systeminfo.uptime) : null,
},
localtime: {
title: _('Local Time'),
value: datestr
},
load: {
title: _('Load Average'),
value: Array.isArray(systeminfo.load) ? '%.2f, %.2f, %.2f'.format(systeminfo.load[0] / 65535.0,systeminfo.load[1] / 65535.0,systeminfo.load[2] / 65535.0) : null
},
kernel: {
title: _('Kernel Version'),
value: boardinfo.kernel
},
model: {
title: _('Model'),
value: boardinfo.model
},
system: {
title: _('Architecture'),
value: boardinfo.system
},
release: {
title: _('Firmware Version'),
value: boardinfo.release.description
}
};
return this.renderHtml(this.params.router, 'router');
},
render: function(data) {
return [this.renderInternetBox(data), this.renderRouterBox(data)];
}
});

View file

@ -0,0 +1,152 @@
'use strict';
'require baseclass';
'require rpc';
'require network';
var callLuciDHCPLeases = rpc.declare({
object: 'luci-rpc',
method: 'getDHCPLeases',
expect: { '': {} }
});
return baseclass.extend({
title: _('DHCP Devices'),
params: {},
load: function() {
return Promise.all([
callLuciDHCPLeases(),
network.getDevices()
]);
},
renderHtml: function() {
var container_wapper = E('div', { 'class': 'router-status-lan dashboard-bg box-s1' });
var container_box = E('div', { 'class': 'lan-info devices-list' });
var container_devices = E('div', { 'class': 'table assoclist devices-info' }, [
E('div', { 'class': 'tr table-titles dashboard-bg' }, [
E('div', { 'class': 'th nowrap' }, _('Hostname')),
E('div', { 'class': 'th' }, _('IP Address')),
E('div', { 'class': 'th' }, _('MAC')),
])
]);
var container_deviceslist = E('div', { 'class': 'table assoclist devices-info' });
container_box.appendChild(E('div', { 'class': 'title'}, [
E('img', {
'src': L.resource('view/dashboard/icons/devices.svg'),
'width': 55,
'title': this.title,
'class': 'middle'
}),
E('h3', this.title)
]));
for(var idx in this.params.lan.devices) {
var deivce = this.params.lan.devices[idx];
container_deviceslist.appendChild(E('div', { 'class': 'tr cbi-rowstyle-1'}, [
E('div', { 'class': 'td device-info'}, [
E('p', {}, [
E('span', { 'class': 'd-inline-block'}, [ deivce.hostname ]),
]),
]),
E('div', { 'class': 'td device-info'}, [
E('p', {}, [
E('span', { 'class': 'd-inline-block'}, [ deivce.ipv4 ]),
]),
]),
E('div', { 'class': 'td device-info'}, [
E('p', {}, [
E('span', { 'class': 'd-inline-block'}, [ deivce.macaddr ]),
]),
])
]));
}
if (this.params.lan.devices.length > 0) {
container_box.appendChild(E('hr'));
container_box.appendChild(container_devices);
container_box.appendChild(E('hr'));
container_box.appendChild(container_deviceslist);
container_wapper.appendChild(container_box);
}
return container_wapper;
},
renderUpdateData: function(data, leases) {
for(var item in data) {
if (/lan|br-lan/ig.test(data[item].ifname) && (typeof data[item].dev == 'object' && !data[item].dev.wireless)) {
var lan_device = data[item];
var ipv4addr = lan_device.dev.ipaddrs.toString().split('/');
this.params.lan.ipv4 = ipv4addr[0] || '?';
this.params.lan.ipv6 = ipv4addr[0] || '?';
this.params.lan.macaddr = lan_device.dev.macaddr || '00:00:00:00:00:00';
this.params.lan.rx_bytes = lan_device.dev.stats.rx_bytes ? '%.2mB'.format(lan_device.dev.stats.rx_bytes) : '-';
this.params.lan.tx_bytes = lan_device.dev.stats.tx_bytes ? '%.2mB'.format(lan_device.dev.stats.tx_bytes) : '-';
}
}
var devices = [];
leases.map(function(lease) {
devices[lease.expires] = {
hostname: lease.hostname || '?',
ipv4: lease.ipaddr || '-',
macaddr: lease.macaddr || '00:00:00:00:00:00',
};
});
this.params.lan.devices = devices;
},
renderLeases: function(data) {
var leases = Array.isArray(data[0].dhcp_leases) ? data[0].dhcp_leases : [];
this.params.lan = {
ipv4: {
title: _('IPv4'),
value: '?'
},
macaddr: {
title: _('Mac'),
value: '00:00:00:00:00:00'
},
rx_bytes: {
title: _('Upload'),
value: '-'
},
tx_bytes: {
title: _('Download'),
value: '-'
},
devices: {
title: _('Devices'),
value: []
}
};
this.renderUpdateData(data[1], leases);
return this.renderHtml();
},
render: function(data) {
if (L.hasSystemFeature('dnsmasq') || L.hasSystemFeature('odhcpd'))
return this.renderLeases(data);
return E([]);
}
});

View file

@ -0,0 +1,269 @@
'use strict';
'require baseclass';
'require dom';
'require network';
'require rpc';
return baseclass.extend({
title: _('Wireless'),
params: [],
load: function() {
return Promise.all([
network.getWifiDevices(),
network.getWifiNetworks(),
network.getHostHints()
]).then(function(radios_networks_hints) {
var tasks = [];
for (var i = 0; i < radios_networks_hints[1].length; i++)
tasks.push(L.resolveDefault(radios_networks_hints[1][i].getAssocList(), []).then(L.bind(function(net, list) {
net.assoclist = list.sort(function(a, b) { return a.mac > b.mac });
}, this, radios_networks_hints[1][i])));
return Promise.all(tasks).then(function() {
return radios_networks_hints;
});
});
},
renderHtml: function() {
var container_wapper = E('div', { 'class': 'router-status-wifi dashboard-bg box-s1' });
var container_box = E('div', { 'class': 'wifi-info devices-list' });
var container_radio = E('div', { 'class': 'settings-info' });
var container_radio_item;
container_box.appendChild(E('div', { 'class': 'title'}, [
E('img', {
'src': L.resource('view/dashboard/icons/wireless.svg'),
'width': 55,
'title': this.title,
'class': 'middle'
}),
E('h3', this.title)
]));
container_box.appendChild(E('hr'));
for (var i =0; i < this.params.wifi.radios.length; i++) {
container_radio_item = E('div', { 'class': 'radio-info' })
for(var idx in this.params.wifi.radios[i]) {
var classname = idx,
radio = this.params.wifi.radios[i];
if (!radio[idx].visible) {
continue;
}
if ('actived' === idx) {
classname = radio[idx].value ? 'label label-success' : 'label label-danger';
radio[idx].value = radio[idx].value ? _('yes') : _('no');
}
container_radio_item.appendChild(
E('p', {}, [
E('span', { 'class': ''}, [ radio[idx].title + '']),
E('span', { 'class': classname }, [ radio[idx].value ]),
])
);
}
container_radio.appendChild(container_radio_item);
}
container_box.appendChild(container_radio);
var container_devices = E('div', { 'class': 'table assoclist devices-info' }, [
E('div', { 'class': 'tr table-titles dashboard-bg' }, [
E('div', { 'class': 'th nowrap' }, _('Hostname')),
E('div', { 'class': 'th' }, _('Wireless')),
E('div', { 'class': 'th' }, _('Signal')),
E('div', { 'class': 'th' }, '%s / %s'.format( _('Up.'), _('Down.')))
])
]);
var container_devices_item;
var container_devices_list = E('div', { 'class': 'table assoclist devices-info' });
for (var i =0; i < this.params.wifi.devices.length; i++) {
container_devices_item = E('div', { 'class': 'tr cbi-rowstyle-1' });
for(var idx in this.params.wifi.devices[i]) {
var device = this.params.wifi.devices[i];
if (!device[idx].visible) {
continue;
}
var container_content;
if ('progress' == idx) {
container_content = E('div', { 'class' : 'td device-info' }, [
E('div', { 'class': 'progress' }, [
E('div', { 'class': 'progress-bar ' + device[idx].value.style, role: 'progressbar', style: 'width:'+device[idx].value.qualite+'%', 'aria-valuenow': device[idx].value.qualite, 'aria-valuemin': 0, 'aria-valuemax': 100 }),
])
]);
} else if ('rate' == idx) {
container_content = E('div', { 'class': 'td device-info' }, [
E('p', {}, [
E('span', { 'class': ''}, [ device[idx].value.rx ]),
E('br'),
E('span', { 'class': ''}, [ device[idx].value.tx ])
])
]);
} else {
container_content = E('div', { 'class': 'td device-info'}, [
E('p', {}, [
E('span', { 'class': ''}, [ device[idx].value ]),
])
]);
}
container_devices_item.appendChild(container_content);
}
container_devices_list.appendChild(container_devices_item);
}
if (this.params.wifi.devices.length > 0) {
container_devices.appendChild(container_devices_list);
container_box.appendChild(E('hr'));
container_box.appendChild(container_devices);
container_box.appendChild(container_devices_list);
container_wapper.appendChild(container_box);
}
return container_wapper;
},
renderUpdateData: function(radios, networks, hosthints) {
for (var i = 0; i < radios.sort(function(a, b) { a.getName() > b.getName() }).length; i++) {
var network_items = networks.filter(function(net) { return net.getWifiDeviceName() == radios[i].getName() });
for (var j = 0; j < network_items.length; j++) {
var net = network_items[j],
is_assoc = (net.getBSSID() != '00:00:00:00:00:00' && net.getChannel() && !net.isDisabled()),
chan = net.getChannel(),
freq = net.getFrequency(),
rate = net.getBitRate();
this.params.wifi.radios.push(
{
ssid : {
title: _('SSID'),
visible: true,
value: net.getActiveSSID() || '?'
},
actived : {
title: _('Active'),
visible: true,
value: !net.isDisabled()
},
chan : {
title: _('Channel'),
visible: true,
value: chan ? '%d (%.3f %s)'.format(chan, freq, _('GHz')) : '-'
},
rate : {
title: _('Bitrate'),
visible: true,
value: rate ? '%d %s'.format(rate, _('Mbit/s')) : '-'
},
bssid : {
title: _('BSSID'),
visible: true,
value: is_assoc ? (net.getActiveBSSID() || '-') : '-'
},
encryption : {
title: _('Encryption'),
visible: true,
value: is_assoc ? net.getActiveEncryption() : '-'
},
associations : {
title: _('Devices Connected'),
visible: true,
value: is_assoc ? (net.assoclist.length || '0') : 0
}
}
);
}
}
for (var i = 0; i < networks.length; i++) {
for (var k = 0; k < networks[i].assoclist.length; k++) {
var bss = networks[i].assoclist[k],
name = hosthints.getHostnameByMACAddr(bss.mac);
var progress_style;
var q = Math.min((bss.signal + 110) / 70 * 100, 100);
if (q == 0 || q < 25)
progress_style = 'bg-danger';
else if (q < 50)
progress_style = 'bg-warning';
else if (q < 75)
progress_style = 'bg-success';
else
progress_style = 'bg-success';
this.params.wifi.devices.push(
{
hostname : {
title: _('Hostname'),
visible: true,
value: name || '?'
},
ssid : {
title: _('SSID'),
visible: true,
value: networks[i].getActiveSSID()
},
progress : {
title: _('Channel'),
visible: true,
value: {
qualite: q,
style: progress_style
}
},
rate : {
title: _('Bitrate'),
visible: true,
value: {
rx: '%s'.format('%.2mB'.format(bss.rx.bytes)),
tx: '%s'.format('%.2mB'.format(bss.tx.bytes)),
}
}
}
);
}
}
},
render: function(data) {
this.params.wifi = {
radios: [],
devices: []
};
this.renderUpdateData(data[0], data[1], data[2]);
return this.renderHtml();
}
});

View file

@ -0,0 +1,110 @@
'use strict';
'require view';
'require dom';
'require poll';
'require fs';
'require network';
document.querySelector('head').appendChild(E('link', {
'rel': 'stylesheet',
'type': 'text/css',
'href': L.resource('view/dashboard/css/custom.css')
}));
function invokeIncludesLoad(includes) {
var tasks = [], has_load = false;
for (var i = 0; i < includes.length; i++) {
if (typeof(includes[i].load) == 'function') {
tasks.push(includes[i].load().catch(L.bind(function() {
this.failed = true;
}, includes[i])));
has_load = true;
}
else {
tasks.push(null);
}
}
return has_load ? Promise.all(tasks) : Promise.resolve(null);
}
function startPolling(includes, containers) {
var step = function() {
return network.flushCache().then(function() {
return invokeIncludesLoad(includes);
}).then(function(results) {
for (var i = 0; i < includes.length; i++) {
var content = null;
if (includes[i].failed)
continue;
if (typeof(includes[i].render) == 'function')
content = includes[i].render(results ? results[i] : null);
else if (includes[i].content != null)
content = includes[i].content;
if (content != null) {
if (i > 1) {
dom.append(containers[1], content);
} else {
containers[i].parentNode.style.display = '';
containers[i].parentNode.classList.add('fade-in');
containers[i].parentNode.classList.add('Dashboard');
dom.content(containers[i], content);
}
}
}
var ssi = document.querySelector('div.includes');
if (ssi) {
ssi.style.display = '';
ssi.classList.add('fade-in');
}
});
};
return step().then(function() {
poll.add(step);
});
}
return view.extend({
load: function() {
return L.resolveDefault(fs.list('/www' + L.resource('view/dashboard/include')), []).then(function(entries) {
return Promise.all(entries.filter(function(e) {
return (e.type == 'file' && e.name.match(/\.js$/));
}).map(function(e) {
return 'view.dashboard.include.' + e.name.replace(/\.js$/, '');
}).sort().map(function(n) {
return L.require(n);
}));
});
},
render: function(includes) {
var rv = E([]), containers = [];
for (var i = 0; i < includes.length - 1; i++) {
var container = E('div', { 'class': 'section-content' });
rv.appendChild(E('div', { 'class': 'cbi-section-' + i, 'style': 'display:none' }, [
container
]));
containers.push(container);
}
return startPolling(includes, containers).then(function() {
return rv;
});
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});

View file

@ -0,0 +1,13 @@
{
"admin/dashboard": {
"title": "Dashboard",
"order": 1,
"action": {
"type": "view",
"path": "dashboard/index"
},
"depends": {
"acl": [ "luci-mod-dashboard-index" ]
}
}
}

View file

@ -0,0 +1,41 @@
{
"luci-mod-dashboard-routes": {
"description": "Grant access to the system route status",
"read": {
"ubus": {
"file": [ "exec" ]
}
}
},
"luci-mod-dashboard-index": {
"description": "Grant access to main status display",
"read": {
"file": {
"/www/luci-static/resources/view/status/include": [ "list" ]
},
"ubus": {
"file": [ "list", "read" ],
"system": [ "board", "info" ]
}
}
},
"luci-mod-dashboard-index-dhcp": {
"description": "Grant access to DHCP status display",
"read": {
"ubus": {
"luci-rpc": [ "getDHCPLeases" ]
}
}
},
"luci-mod-dashboard-index-wifi": {
"description": "Grant access to wireless status display",
"read": {
"ubus": {
"iwinfo": [ "assoclist" ]
}
}
}
}

View file

@ -4,7 +4,7 @@
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
# From https://github.com/openwrt/luci/commit/01d5d5f92963d9596a3c0b669a7e8d87b64132d5
# From https://github.com/openwrt/luci/commit/5ca328440b3a41ab6d415ec96f9db4339715de67
include $(TOPDIR)/rules.mk

View file

@ -281,6 +281,11 @@ return view.extend({
o.placeholder = '/example.org/10.1.2.3';
// o.validate = validateServerSpec;
o = s.taboption('general', form.DynamicList, 'address', _('Addresses'),
_('List of domains to force to an IP address.'));
o.optional = true;
o.placeholder = '/router.local/192.168.0.1';
o = s.taboption('general', form.Flag, 'rebind_protection',
_('Rebind protection'),
@ -425,12 +430,9 @@ return view.extend({
so.datatype = 'list(unique(macaddr))';
so.rmempty = true;
so.cfgvalue = function(section) {
var macs = uci.get('dhcp', section, 'mac'),
var macs = L.toArray(uci.get('dhcp', section, 'mac')),
result = [];
if (!Array.isArray(macs))
macs = (macs != null && macs != '') ? macs.split(/\ss+/) : [];
for (var i = 0, mac; (mac = macs[i]) != null; i++)
if (/^([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2}):([0-9a-fA-F]{1,2})$/.test(mac))
result.push('%02X:%02X:%02X:%02X:%02X:%02X'.format(

View file

@ -575,6 +575,10 @@ return view.extend({
o.value('backup',_('Backup'));
o.default = 'off';
o = s.taboption('advanced', form.Value, 'addlatency', _('Additional latency'));
o.datatype = 'uinteger';
o.default = '0';
if (L.hasSystemFeature('dnsmasq') || L.hasSystemFeature('odhcpd')) {
o = s.taboption('dhcp', form.SectionValue, '_dhcp', form.TypedSection, 'dhcp');
o.depends('proto', 'static');

View file

@ -1195,6 +1195,9 @@ return view.extend({
var has_ap_eap192 = L.hasSystemFeature('hostapd', 'suiteb192'),
has_sta_eap192 = L.hasSystemFeature('wpasupplicant', 'suiteb192');
// Probe WEP support
var has_ap_wep = L.hasSystemFeature('hostapd', 'wep'),
has_sta_wep = L.hasSystemFeature('wpasupplicant', 'wep');
if (has_hostapd || has_supplicant) {
crypto_modes.push(['psk2', 'WPA2-PSK', 35]);
@ -1210,6 +1213,11 @@ return view.extend({
crypto_modes.push(['sae-mixed', 'WPA2-PSK/WPA3-SAE Mixed Mode', 30]);
}
if (has_ap_wep || has_sta_wep) {
crypto_modes.push(['wep-open', _('WEP Open System'), 11]);
crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]);
}
if (has_ap_eap || has_sta_eap) {
if (has_ap_eap192 || has_sta_eap192) {
crypto_modes.push(['wpa3', 'WPA3-EAP', 33]);
@ -1226,8 +1234,8 @@ return view.extend({
encr.crypto_support = {
'ap': {
'wep-open': true,
'wep-shared': true,
'wep-open': has_ap_wep || _('Requires hostapd with WEP support'),
'wep-shared': has_ap_wep || _('Requires hostapd with WEP support'),
'psk': has_hostapd || _('Requires hostapd'),
'psk2': has_hostapd || _('Requires hostapd'),
'psk-mixed': has_hostapd || _('Requires hostapd'),
@ -1240,8 +1248,8 @@ return view.extend({
'owe': has_ap_owe || _('Requires hostapd with OWE support')
},
'sta': {
'wep-open': true,
'wep-shared': true,
'wep-open': has_sta_wep || _('Requires wpa-supplicant with WEP support'),
'wep-shared': has_sta_wep || _('Requires wpa-supplicant with WEP support'),
'psk': has_supplicant || _('Requires wpa-supplicant'),
'psk2': has_supplicant || _('Requires wpa-supplicant'),
'psk-mixed': has_supplicant || _('Requires wpa-supplicant'),
@ -1295,10 +1303,10 @@ return view.extend({
crypto_modes.push(['psk2', 'WPA2-PSK', 33]);
crypto_modes.push(['psk+psk2', 'WPA-PSK/WPA2-PSK Mixed Mode', 22]);
crypto_modes.push(['psk', 'WPA-PSK', 21]);
crypto_modes.push(['wep-open', _('WEP Open System'), 11]);
crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]);
}
crypto_modes.push(['wep-open', _('WEP Open System'), 11]);
crypto_modes.push(['wep-shared', _('WEP Shared Key'), 10]);
crypto_modes.push(['none', _('No Encryption'), 0]);
crypto_modes.sort(function(a, b) { return b[2] - a[2] });

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