mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
						commit
						10b7c312c1
					
				
					 457 changed files with 20250 additions and 204102 deletions
				
			
		| 
						 | 
				
			
			@ -1,7 +1,8 @@
 | 
			
		|||
version: 2
 | 
			
		||||
jobs:
 | 
			
		||||
  prepare:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    working_directory: ~/
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -12,10 +13,12 @@ jobs:
 | 
			
		|||
            sudo rm -rf /var/lib/apt/lists/lock
 | 
			
		||||
            sudo apt-get update
 | 
			
		||||
            sudo rm -rf /var/lib/apt/lists/lock
 | 
			
		||||
            sudo apt-get install -yq build-essential git unzip ncurses-dev libz-dev libssl-dev python subversion gettext gawk wget curl rsync perl libelf-dev
 | 
			
		||||
            sudo apt-get install -yq build-essential git unzip ncurses-dev libz-dev libssl-dev python subversion gettext gawk wget curl rsync perl libelf-dev python3.5 libpython3.5-stdlib liblzma-dev
 | 
			
		||||
            pyenv global 3.5.2
 | 
			
		||||
 | 
			
		||||
  build_x86_64:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -27,8 +30,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -37,15 +40,18 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          no_output_timeout: 50m
 | 
			
		||||
          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}"
 | 
			
		||||
            sudo apt-get update
 | 
			
		||||
            sudo apt-get install -yq libelf-dev
 | 
			
		||||
            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
 | 
			
		||||
| 
						 | 
				
			
			@ -63,8 +69,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: Deploy
 | 
			
		||||
          command: |
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +79,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_x86:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -85,8 +92,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -95,14 +102,16 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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
 | 
			
		||||
| 
						 | 
				
			
			@ -114,14 +123,14 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/$OMR_TARGET/source package/{compile,install,index} target/install -j2
 | 
			
		||||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Deploy
 | 
			
		||||
          command: |
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -130,7 +139,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_rpi3:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -142,8 +152,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -152,14 +162,16 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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
 | 
			
		||||
| 
						 | 
				
			
			@ -171,14 +183,74 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
          key: cache-{{ checksum "/tmp/cache-version" }}
 | 
			
		||||
          paths:
 | 
			
		||||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_rpi4:
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
      - OMR_TARGET: rpi4
 | 
			
		||||
 | 
			
		||||
    working_directory: ~/
 | 
			
		||||
 | 
			
		||||
    steps:
 | 
			
		||||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $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}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +259,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_rpi2:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -199,8 +272,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -209,14 +282,16 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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
 | 
			
		||||
| 
						 | 
				
			
			@ -228,14 +303,14 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/$OMR_TARGET/source package/{compile,install,index} target/compile -j2 package/compile -j2 target/install -j2
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/$OMR_TARGET/source package/{compile,install,index} target/compile package/compile target/install -j2
 | 
			
		||||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Deploy
 | 
			
		||||
          command: |
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +319,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_bpi-r2:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -256,8 +332,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -266,14 +342,16 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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
 | 
			
		||||
| 
						 | 
				
			
			@ -285,14 +363,17 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/$OMR_TARGET/source package/{compile,install,index} target/compile -j2 package/compile -j2 target/install -j2
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: |
 | 
			
		||||
            sudo apt-get update
 | 
			
		||||
            sudo apt-get -yq install swig2.0
 | 
			
		||||
            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/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -301,7 +382,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_wrt3200acm:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -313,8 +395,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -323,14 +405,16 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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
 | 
			
		||||
| 
						 | 
				
			
			@ -342,14 +426,14 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/$OMR_TARGET/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/$OMR_TARGET
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$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}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rm -rf ~/openmptcprouter/$OMR_TARGET/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -358,7 +442,8 @@ jobs:
 | 
			
		|||
            - openmptcprouter
 | 
			
		||||
 | 
			
		||||
  build_wrt32:
 | 
			
		||||
    machine: true
 | 
			
		||||
    machine:
 | 
			
		||||
      image: ubuntu-1604:201903-01
 | 
			
		||||
 | 
			
		||||
    environment:
 | 
			
		||||
      - OMR_VERSION: $CIRCLE_TAG
 | 
			
		||||
| 
						 | 
				
			
			@ -369,8 +454,8 @@ jobs:
 | 
			
		|||
      - run:
 | 
			
		||||
          name: cache
 | 
			
		||||
          command: |
 | 
			
		||||
            echo "cache 44 $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 48 $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
            echo "cache 82 $OMR_KERNEL $OMR_TARGET" > /tmp/cache-target
 | 
			
		||||
            echo "cache 85 $OMR_KERNEL $OMR_TARGET $OMR_VERSION" > /tmp/cache-version
 | 
			
		||||
 | 
			
		||||
      - restore_cache:
 | 
			
		||||
          keys:
 | 
			
		||||
| 
						 | 
				
			
			@ -379,15 +464,17 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain wrt3200acm
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          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}"
 | 
			
		||||
            export OMR_TARGET="wrt3200acm"
 | 
			
		||||
            pyenv global 3.5.2
 | 
			
		||||
            sh build.sh prepare {tools,toolchain}/install -j2
 | 
			
		||||
            echo -e "$OMR_PRIVKEY" > ~/openmptcprouter/wrt3200acm/source/key-build
 | 
			
		||||
            echo -e "$OMR_PUBKEY" > ~/openmptcprouter/wrt3200acm/source/key-build.pub
 | 
			
		||||
| 
						 | 
				
			
			@ -399,14 +486,14 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build wrt3200acm
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/wrt3200acm/source package/{compile,install,index} target/compile -j2 package/compile -j2 target/install -j2
 | 
			
		||||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Deploy wrt3200acm
 | 
			
		||||
          command: |
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/wrt3200acm/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/wrt3200acm
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/wrt3200acm/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/wrt3200acm
 | 
			
		||||
            rm -rf ~/openmptcprouter/wrt3200acm/source/bin
 | 
			
		||||
 | 
			
		||||
      - save_cache:
 | 
			
		||||
| 
						 | 
				
			
			@ -416,50 +503,101 @@ jobs:
 | 
			
		|||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build toolchain wrt32x
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: |
 | 
			
		||||
            cd ~/openmptcprouter/
 | 
			
		||||
            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}"
 | 
			
		||||
            export OMR_TARGET="wrt32x"
 | 
			
		||||
            ln -s wrt3200acm wrt32x
 | 
			
		||||
            pyenv global 3.5.2
 | 
			
		||||
            sh build.sh prepare {tools,toolchain}/install -j2
 | 
			
		||||
            echo -e "$OMR_PRIVKEY" > ~/openmptcprouter/wrt32x/source/key-build
 | 
			
		||||
            echo -e "$OMR_PUBKEY" > ~/openmptcprouter/wrt32x/source/key-build.pub
 | 
			
		||||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Build wrt32x
 | 
			
		||||
          no_output_timeout: 30m
 | 
			
		||||
          no_output_timeout: 40m
 | 
			
		||||
          command: make IGNORE_ERRORS=m -C ~/openmptcprouter/wrt32x/source package/{compile,install,index} target/compile -j2 package/compile -j2 target/install -j2
 | 
			
		||||
 | 
			
		||||
      - run:
 | 
			
		||||
          name: Deploy wrt32x
 | 
			
		||||
          command: |
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/release
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/wrt32x/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/release/wrt32x
 | 
			
		||||
            ssh -p ${OMR_DEPLOY_PORT:-22} deploy@$OMR_DEPLOY_HOST mkdir -p deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/$OMR_TARGET
 | 
			
		||||
            rsync -av --delete-after ~/openmptcprouter/wrt32x/source/bin/ -e "ssh -q -p ${OMR_DEPLOY_PORT:-22}" deploy@$OMR_DEPLOY_HOST:deploy/${CIRCLE_BRANCH:-release}/${OMR_KERNEL:-4.14}/wrt32x
 | 
			
		||||
 | 
			
		||||
workflows:
 | 
			
		||||
  version: 2
 | 
			
		||||
  main:
 | 
			
		||||
    jobs:
 | 
			
		||||
      - prepare
 | 
			
		||||
      - prepare:
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_x86_64:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_x86:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_rpi4:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_rpi3:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_rpi2:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_bpi-r2:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
      - build_wrt32:
 | 
			
		||||
          requires:
 | 
			
		||||
            - prepare
 | 
			
		||||
          filters:
 | 
			
		||||
            tags:
 | 
			
		||||
              only: /.*/
 | 
			
		||||
            branches:
 | 
			
		||||
              only: 
 | 
			
		||||
                - develop
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										9
									
								
								.codeclimate
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								.codeclimate
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
plugins:
 | 
			
		||||
  shellcheck:
 | 
			
		||||
    enabled: true
 | 
			
		||||
engines:
 | 
			
		||||
  luacheck:
 | 
			
		||||
    enabled: true
 | 
			
		||||
ratings:
 | 
			
		||||
  paths:
 | 
			
		||||
    - "**.lua"
 | 
			
		||||
							
								
								
									
										12
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
# OpenWrt OpenMPTCProuter feed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
This is the OpenWrt OpenMPTCProuter feed containing all modified and necessary packages to build the OpenMPTCProuter image.
 | 
			
		||||
 | 
			
		||||
For More information, see [https://github.com/ysurac/openmptcprouter](https://github.com/ysurac/openmptcprouter) and [https://www.openmptcprouter.com](https://www.openmptcprouter.com/).
 | 
			
		||||
| 
						 | 
				
			
			@ -140,6 +141,14 @@ This is used to check if there is no other IPv6 route announced on the network
 | 
			
		|||
This is an other way to aggregate same latency connections
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## dsvpn
 | 
			
		||||
*Source:* [https://github.com/jedisct1/dsvpn][https://github.com/jedisct1/dsvpn]
 | 
			
		||||
 | 
			
		||||
*Description:* A Dead Simple VPN
 | 
			
		||||
 | 
			
		||||
A simple TCP VPN
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## ndpi-netfilter2
 | 
			
		||||
*Source:* [https://github.com/vel21ripn/nDPI](https://github.com/vel21ripn/nDPI)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -153,3 +162,6 @@ This is used to bypass a protocol
 | 
			
		|||
 | 
			
		||||
*Description:* A middlebox detection tool
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# License
 | 
			
		||||
[](https://app.fossa.io/projects/git%2Bgithub.com%2FYsurac%2Fopenmptcprouter-feeds?ref=badge_large)
 | 
			
		||||
| 
						 | 
				
			
			@ -1,23 +0,0 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the Apache License, Version 2.0 .
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
LUCI_TYPE:=col
 | 
			
		||||
LUCI_BASENAME:=luci
 | 
			
		||||
 | 
			
		||||
LUCI_TITLE:=LuCI interface with Uhttpd as Webserver (default)
 | 
			
		||||
LUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme
 | 
			
		||||
LUCI_DEPENDS:= \
 | 
			
		||||
	+uhttpd +luci-mod-admin-full +luci-theme-bootstrap \
 | 
			
		||||
	+luci-app-firewall +luci-proto-ppp +libiwinfo-lua +IPV6:luci-proto-ipv6 \
 | 
			
		||||
	+rpcd-mod-rrdns
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=Apache-2.0
 | 
			
		||||
 | 
			
		||||
include ../../luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
							
								
								
									
										43
									
								
								dsvpn/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								dsvpn/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,43 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter project
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the GNU General Public License v2.
 | 
			
		||||
# See /LICENSE for more information.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_SOURCE_URL:=https://github.com/jedisct1/dsvpn.git
 | 
			
		||||
PKG_SOURCE_VERSION:=3b99d2ef6c02b2ef68b5784bec8adfdd55b29b1a
 | 
			
		||||
PKG_NAME:=dsvpn
 | 
			
		||||
PKG_VERSION:=0.1.4-$(PKG_SOURCE_VERSION)
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
 | 
			
		||||
include $(INCLUDE_DIR)/package.mk
 | 
			
		||||
 | 
			
		||||
define Package/$(PKG_NAME)
 | 
			
		||||
SECTION:=net
 | 
			
		||||
CATEGORY:=Network
 | 
			
		||||
DEPENDS:=+kmod-tun
 | 
			
		||||
TITLE:=A Dead Simple VPN
 | 
			
		||||
URL:=https://github.com/jedisct1/dsvpn
 | 
			
		||||
SUBMENU:=VPN
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/$(PKG_NAME)/conffiles
 | 
			
		||||
/etc/config/dsvpn
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
TARGET_CFLAGS += -DNO_DEFAULT_ROUTES -DNO_DEFAULT_FIREWALL -DNO_DEFAULT_CONGESTION
 | 
			
		||||
 | 
			
		||||
define Package/$(PKG_NAME)/install
 | 
			
		||||
	$(INSTALL_DIR) $(1)/usr/sbin
 | 
			
		||||
	$(INSTALL_BIN) $(PKG_BUILD_DIR)/dsvpn $(1)/usr/sbin/$(PKG_NAME)
 | 
			
		||||
	$(INSTALL_DIR) $(1)/etc/init.d
 | 
			
		||||
	$(INSTALL_BIN) files/init $(1)/etc/init.d/$(PKG_NAME)
 | 
			
		||||
	$(INSTALL_DIR) $(1)/etc/config
 | 
			
		||||
	touch $(1)/etc/config/dsvpn
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(eval $(call BuildPackage,$(PKG_NAME)))
 | 
			
		||||
							
								
								
									
										87
									
								
								dsvpn/files/init
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										87
									
								
								dsvpn/files/init
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,87 @@
 | 
			
		|||
#!/bin/sh /etc/rc.common
 | 
			
		||||
# Copyright (C) 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter project
 | 
			
		||||
 | 
			
		||||
START=90
 | 
			
		||||
STOP=10
 | 
			
		||||
 | 
			
		||||
USE_PROCD=1
 | 
			
		||||
PROG_NAME=dsvpn
 | 
			
		||||
PROG=/usr/sbin/${PROG_NAME}
 | 
			
		||||
 | 
			
		||||
_log() {
 | 
			
		||||
	logger -p daemon.info -t ${PROG_NAME} "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_err() {
 | 
			
		||||
	logger -p daemon.err -t ${PROG_NAME} "$@"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
validate_section() {
 | 
			
		||||
	uci_validate_section dsvpn dsvpn "${1}" \
 | 
			
		||||
		'enable:bool:0'       \
 | 
			
		||||
		'key:string'          \
 | 
			
		||||
		'host:host'           \
 | 
			
		||||
		'port:port'           \
 | 
			
		||||
		'dev:string'          \
 | 
			
		||||
		'localip:host'        \
 | 
			
		||||
		'remoteip:host'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_instance() {
 | 
			
		||||
	local enable key host port dev
 | 
			
		||||
 | 
			
		||||
	validate_section "${1}" || {
 | 
			
		||||
		_err "validation failed"
 | 
			
		||||
		return 1
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	[ "${enable}" = "1" ] || return 1
 | 
			
		||||
 | 
			
		||||
	[ -n "${key}" ] || return 1
 | 
			
		||||
	[ "${key}" != "secretkey" ] || return 1
 | 
			
		||||
	[ -n "${port}" ] || return 1
 | 
			
		||||
	[ -n "${dev}" ] || return 1
 | 
			
		||||
 | 
			
		||||
	echo "${key}" > /tmp/${PROG_NAME}-${1}.key
 | 
			
		||||
	key=""
 | 
			
		||||
 | 
			
		||||
	if [ "$(uci -q get network.omrvpn)" != "" ] && [ "$(uci -q get network.omrvpn)" != "$dev" ]; then
 | 
			
		||||
		uci -q set network.omrvpn.ifname=$dev
 | 
			
		||||
		uci -q commit
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	ip addr flush $dev
 | 
			
		||||
	sleep 2
 | 
			
		||||
 | 
			
		||||
	_log "starting ${PROG_NAME} ${1} instance $*"
 | 
			
		||||
 | 
			
		||||
	procd_open_instance
 | 
			
		||||
 | 
			
		||||
	procd_set_param command ${PROG} client \
 | 
			
		||||
		/tmp/${PROG_NAME}-${1}.key \
 | 
			
		||||
		$host \
 | 
			
		||||
		$port \
 | 
			
		||||
		$dev  \
 | 
			
		||||
		${localip:+$localip} \
 | 
			
		||||
		${remoteip:+$remoteip}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	procd_set_param respawn 0 30 5
 | 
			
		||||
	procd_set_param file /tmp/${PROG_NAME}-${1}.key
 | 
			
		||||
 | 
			
		||||
	procd_set_param stdout 1
 | 
			
		||||
	procd_set_param stderr 1
 | 
			
		||||
 | 
			
		||||
	procd_close_instance
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_service() {
 | 
			
		||||
	config_load dsvpn
 | 
			
		||||
	config_foreach start_instance dsvpn
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
service_triggers() {
 | 
			
		||||
	procd_add_reload_trigger dsvpn network
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										65
									
								
								dsvpn/patches/nofirewall.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								dsvpn/patches/nofirewall.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
--- a/src/os.c	2019-12-06 19:49:50.323898270 +0100
 | 
			
		||||
+++ b/src/os.c	2019-12-06 19:54:20.987206244 +0100
 | 
			
		||||
@@ -445,24 +445,28 @@
 | 
			
		||||
 #ifdef __linux__
 | 
			
		||||
         static const char
 | 
			
		||||
             *set_cmds[] =
 | 
			
		||||
-                { "sysctl net.ipv4.ip_forward=1",
 | 
			
		||||
-                  "ip addr add $LOCAL_TUN_IP peer $REMOTE_TUN_IP dev $IF_NAME",
 | 
			
		||||
+                { "ip addr add $LOCAL_TUN_IP peer $REMOTE_TUN_IP dev $IF_NAME",
 | 
			
		||||
                   "ip -6 addr add $LOCAL_TUN_IP6 peer $REMOTE_TUN_IP6/96 dev $IF_NAME",
 | 
			
		||||
                   "ip link set dev $IF_NAME up",
 | 
			
		||||
+#ifndef NO_DEFAULT_FIREWALL
 | 
			
		||||
+                  "sysctl net.ipv4.ip_forward=1",
 | 
			
		||||
                   "iptables -t raw -I PREROUTING ! -i $IF_NAME -d $LOCAL_TUN_IP -m addrtype ! "
 | 
			
		||||
                   "--src-type LOCAL -j DROP",
 | 
			
		||||
                   "iptables -t nat -A POSTROUTING -o $EXT_IF_NAME -s $REMOTE_TUN_IP -j MASQUERADE",
 | 
			
		||||
                   "iptables -t filter -A FORWARD -i $EXT_IF_NAME -o $IF_NAME -m state --state "
 | 
			
		||||
                   "RELATED,ESTABLISHED -j ACCEPT",
 | 
			
		||||
                   "iptables -t filter -A FORWARD -i $IF_NAME -o $EXT_IF_NAME -j ACCEPT",
 | 
			
		||||
+#endif
 | 
			
		||||
                   NULL },
 | 
			
		||||
             *unset_cmds[] = {
 | 
			
		||||
+#ifndef NO_DEFAULT_FIREWALL
 | 
			
		||||
                 "iptables -t nat -D POSTROUTING -o $EXT_IF_NAME -s $REMOTE_TUN_IP -j MASQUERADE",
 | 
			
		||||
                 "iptables -t filter -D FORWARD -i $EXT_IF_NAME -o $IF_NAME -m state --state "
 | 
			
		||||
                 "RELATED,ESTABLISHED -j ACCEPT",
 | 
			
		||||
                 "iptables -t filter -D FORWARD -i $IF_NAME -o $EXT_IF_NAME -j ACCEPT",
 | 
			
		||||
                 "iptables -t raw -D PREROUTING ! -i $IF_NAME -d $LOCAL_TUN_IP -m addrtype ! "
 | 
			
		||||
                 "--src-type LOCAL -j DROP",
 | 
			
		||||
+#endif
 | 
			
		||||
                 NULL
 | 
			
		||||
             };
 | 
			
		||||
 #elif defined(__APPLE__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
 | 
			
		||||
@@ -503,12 +507,17 @@
 | 
			
		||||
 #elif defined(__linux__)
 | 
			
		||||
         static const char
 | 
			
		||||
             *set_cmds[] =
 | 
			
		||||
-                { "sysctl net.ipv4.tcp_congestion_control=bbr",
 | 
			
		||||
+                { 
 | 
			
		||||
+#ifndef NO_DEFAULT_CONGESTION
 | 
			
		||||
+                  "sysctl net.ipv4.tcp_congestion_control=bbr",
 | 
			
		||||
+#endif
 | 
			
		||||
                   "ip link set dev $IF_NAME up",
 | 
			
		||||
-                  "iptables -t raw -I PREROUTING ! -i $IF_NAME -d $LOCAL_TUN_IP -m addrtype ! "
 | 
			
		||||
-                  "--src-type LOCAL -j DROP",
 | 
			
		||||
                   "ip addr add $LOCAL_TUN_IP peer $REMOTE_TUN_IP dev $IF_NAME",
 | 
			
		||||
                   "ip -6 addr add $LOCAL_TUN_IP6 peer $REMOTE_TUN_IP6/96 dev $IF_NAME",
 | 
			
		||||
+#ifndef NO_DEFAULT_FIREWALL
 | 
			
		||||
+                  "iptables -t raw -I PREROUTING ! -i $IF_NAME -d $LOCAL_TUN_IP -m addrtype ! "
 | 
			
		||||
+                  "--src-type LOCAL -j DROP",
 | 
			
		||||
+#endif
 | 
			
		||||
 #ifndef NO_DEFAULT_ROUTES
 | 
			
		||||
                   "ip route add default dev $IF_NAME table 42069",
 | 
			
		||||
                   "ip -6 route add default dev $IF_NAME table 42069",
 | 
			
		||||
@@ -525,8 +534,10 @@
 | 
			
		||||
                 "ip rule delete table main suppress_prefixlength 0",
 | 
			
		||||
                 "ip -6 rule delete table main suppress_prefixlength 0",
 | 
			
		||||
 #endif
 | 
			
		||||
+#ifndef NO_DEFAULT_FIREWALL
 | 
			
		||||
                 "iptables -t raw -D PREROUTING ! -i $IF_NAME -d $LOCAL_TUN_IP -m addrtype ! "
 | 
			
		||||
                 "--src-type LOCAL -j DROP",
 | 
			
		||||
+#endif
 | 
			
		||||
                 NULL
 | 
			
		||||
             };
 | 
			
		||||
 #else
 | 
			
		||||
							
								
								
									
										10
									
								
								dsvpn/patches/nostrip.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								dsvpn/patches/nostrip.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
--- a/Makefile	2019-08-03 22:52:54.541484359 +0200
 | 
			
		||||
+++ b/Makefile	2019-08-03 22:53:00.901364600 +0200
 | 
			
		||||
@@ -5,7 +5,6 @@
 | 
			
		||||
 
 | 
			
		||||
 dsvpn: $(CFLAGS_FILE) Makefile src/vpn.c src/charm.c src/os.c include/charm.h include/vpn.h include/os.h
 | 
			
		||||
 	$(CC) $$(cat "$(CFLAGS_FILE)") $(OPTFLAGS) -Iinclude -o $@ src/vpn.c src/charm.c src/os.c
 | 
			
		||||
-	strip $@
 | 
			
		||||
 
 | 
			
		||||
 install: dsvpn
 | 
			
		||||
 	install -m 0755 dsvpn $(PREFIX)/sbin
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2015 OVH
 | 
			
		||||
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter project
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the GNU General Public License v2.
 | 
			
		||||
# See /LICENSE for more information.
 | 
			
		||||
| 
						 | 
				
			
			@ -10,10 +10,10 @@ include $(TOPDIR)/rules.mk
 | 
			
		|||
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_SOURCE_URL:=https://github.com/angt/glorytun.git
 | 
			
		||||
PKG_SOURCE_VERSION:=db718d59426957eef89357d5b58ae59cae2f8c5d
 | 
			
		||||
PKG_SOURCE_VERSION:=a9408e799ddbb74b5476fba70a495770322cd327
 | 
			
		||||
PKG_NAME:=glorytun-udp
 | 
			
		||||
PKG_VERSION:=0.1.1-$(PKG_SOURCE_VERSION)
 | 
			
		||||
PKG_RELEASE:=22
 | 
			
		||||
PKG_VERSION:=0.3.0-$(PKG_SOURCE_VERSION)
 | 
			
		||||
PKG_RELEASE:=23
 | 
			
		||||
 | 
			
		||||
PKG_FIXUP:=autoreconf
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										11
									
								
								glorytun-udp/patches/aegis-arm.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								glorytun-udp/patches/aegis-arm.patch
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
--- a/mud/aegis256/aegis256.c	2019-11-06 21:17:20.945036771 +0100
 | 
			
		||||
+++ b/mud/aegis256/aegis256.c	2019-11-06 21:21:18.728943139 +0100
 | 
			
		||||
@@ -43,7 +43,7 @@
 | 
			
		||||
 #ifndef __ARM_FEATURE_CRYPTO
 | 
			
		||||
 #define __ARM_FEATURE_CRYPTO 1
 | 
			
		||||
 #endif
 | 
			
		||||
-#else
 | 
			
		||||
+#elifdef __ARM_FEATURE_CRYPTO
 | 
			
		||||
 #pragma GCC target("+crypto")
 | 
			
		||||
 #endif
 | 
			
		||||
 
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +76,7 @@ start_instance() {
 | 
			
		|||
 | 
			
		||||
	procd_append_param command \
 | 
			
		||||
		retry count -1 const 5000000 \
 | 
			
		||||
		timeout 10000 \
 | 
			
		||||
		timeout 100000 \
 | 
			
		||||
		keepalive count 5 idle 20 interval 2 \
 | 
			
		||||
		buffer-size 32768
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,9 +12,9 @@ PKG_RELEASE:=1
 | 
			
		|||
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
PKG_SOURCE_URL:=https://github.com/golang/crypto.git
 | 
			
		||||
PKG_SOURCE_VERSION:=a49355c7e3f8fe157a85be2f77e6e269a0f89602
 | 
			
		||||
PKG_SOURCE_DATE:=20180620
 | 
			
		||||
PKG_MIRROR_HASH:=80b16b203736ac56883d0610edbc5981eb78f15b7b35d11b5ca639f7c3814214
 | 
			
		||||
PKG_SOURCE_VERSION:=4def268fd1a49955bfb3dda92fe3db4f924f2285
 | 
			
		||||
PKG_SOURCE_DATE:=20190701
 | 
			
		||||
#PKG_MIRROR_HASH:=80b16b203736ac56883d0610edbc5981eb78f15b7b35d11b5ca639f7c3814214
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=BSD-3-Clause
 | 
			
		||||
PKG_LICENSE_FILES:=LICENSE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -246,12 +246,10 @@ define GoPackage/Build/Compile
 | 
			
		|||
			mips|mipsle)     installsuffix="-installsuffix $(GO_MIPS)" ;; \
 | 
			
		||||
			mips64|mips64le) installsuffix="-installsuffix $(GO_MIPS64)" ;; \
 | 
			
		||||
			esac ; \
 | 
			
		||||
			trimpath="all=-trimpath=$(GO_PKG_BUILD_DIR)" ; \
 | 
			
		||||
			ldflags="all=-linkmode external -extldflags '$(TARGET_LDFLAGS)'" ; \
 | 
			
		||||
			go install \
 | 
			
		||||
				$$$$installsuffix \
 | 
			
		||||
				-gcflags "$$$$trimpath" \
 | 
			
		||||
				-asmflags "$$$$trimpath" \
 | 
			
		||||
				-trimpath \
 | 
			
		||||
				-ldflags "$$$$ldflags" \
 | 
			
		||||
				-v \
 | 
			
		||||
				$(1) \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,6 +25,7 @@ unexport \
 | 
			
		|||
  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
 | 
			
		||||
 | 
			
		||||
go_arch=$(subst \
 | 
			
		||||
  aarch64,arm64,$(subst \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,5 +10,5 @@ ifeq ($(origin GO_INCLUDE_DIR),undefined)
 | 
			
		|||
endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
GO_VERSION_MAJOR_MINOR:=1.11
 | 
			
		||||
GO_VERSION_PATCH:=5
 | 
			
		||||
GO_VERSION_MAJOR_MINOR:=1.13
 | 
			
		||||
GO_VERSION_PATCH:=4
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ GO_SOURCE_URLS:=https://dl.google.com/go/ \
 | 
			
		|||
 | 
			
		||||
PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz
 | 
			
		||||
PKG_SOURCE_URL:=$(GO_SOURCE_URLS)
 | 
			
		||||
PKG_HASH:=bc1ef02bb1668835db1390a2e478dcbccb5dd16911691af9d75184bbe5aa943e
 | 
			
		||||
PKG_HASH:=95dbeab442ee2746b9acf0934c8e2fc26414a0565c008631b04addb8c02e7624
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=BSD-3-Clause
 | 
			
		||||
PKG_LICENSE_FILES:=LICENSE
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,8 +9,8 @@
 | 
			
		|||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=iperf
 | 
			
		||||
PKG_SOURCE_VERSION:=40e7c05440583f229edd6b6ca05c5d97b66fcf15
 | 
			
		||||
PKG_VERSION:=3.6-$(PKG_SOURCE_VERSION)
 | 
			
		||||
PKG_SOURCE_VERSION:=02a5f4755878b319f0db5ccd490daf61e6d76043
 | 
			
		||||
PKG_VERSION:=3.7-$(PKG_SOURCE_VERSION)
 | 
			
		||||
PKG_RELEASE:=2
 | 
			
		||||
 | 
			
		||||
PKG_SOURCE_PROTO:=git
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								luci-app-dsvpn/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								luci-app-dsvpn/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
LUCI_TITLE:=LuCI Support for DSVPN
 | 
			
		||||
LUCI_DEPENDS:=+dsvpn
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
							
								
								
									
										7
									
								
								luci-app-dsvpn/luasrc/controller/dsvpn.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								luci-app-dsvpn/luasrc/controller/dsvpn.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
module("luci.controller.dsvpn", package.seeall)
 | 
			
		||||
 | 
			
		||||
function index()
 | 
			
		||||
	--entry({"admin", "openmptcprouter", "mlvpn"}, cbi("mlvpn"), _("DSVPN"))
 | 
			
		||||
	--entry({"admin", "services", "dsvpn"}, cbi("dsvpn"), _("DSVPN"))
 | 
			
		||||
	entry({"admin", "vpn", "dsvpn"}, cbi("dsvpn"), _("DSVPN"))
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										44
									
								
								luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
local net = require "luci.model.network".init()
 | 
			
		||||
local sys = require "luci.sys"
 | 
			
		||||
local ifaces = sys.net:devices()
 | 
			
		||||
local m, s, o
 | 
			
		||||
 | 
			
		||||
m = Map("dsvpn", translate("DSVPN"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "dsvpn", translate("Settings"))
 | 
			
		||||
s.anonymous   = true
 | 
			
		||||
s.addremove = false
 | 
			
		||||
 | 
			
		||||
o = s:option(Flag, "enable", translate("Enable"))
 | 
			
		||||
o.rmempty     = false
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "host", translate("Remote host"))
 | 
			
		||||
o.placeholder = "128.128.128.128"
 | 
			
		||||
o.default     = "128.128.128.128"
 | 
			
		||||
o.datatype    = "host"
 | 
			
		||||
o.rmempty     = false
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "port", translate("Remote port"))
 | 
			
		||||
o.placeholder = "65011"
 | 
			
		||||
o.default     = "65011"
 | 
			
		||||
o.datatype    = "port"
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "key", translate("Key"))
 | 
			
		||||
o.password    = true
 | 
			
		||||
o.rmempty     = false
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "localip", translate("Tunnel local IP"))
 | 
			
		||||
o.default     = "10.255.251.2"
 | 
			
		||||
o.datatype    = "host"
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "remoteip", translate("Tunnel remote IP"))
 | 
			
		||||
o.default     = "10.255.251.1"
 | 
			
		||||
o.datatype    = "host"
 | 
			
		||||
 | 
			
		||||
o = s:option(Value, "dev", translate("Interface name"))
 | 
			
		||||
o.placeholder = "tun0"
 | 
			
		||||
o.default     = "tun0"
 | 
			
		||||
o.rmempty     = false
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
							
								
								
									
										52
									
								
								luci-app-dsvpn/po/fr/dsvpn.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								luci-app-dsvpn/po/fr/dsvpn.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,52 @@
 | 
			
		|||
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"
 | 
			
		||||
"Language: fr\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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr "Activé"
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
 | 
			
		||||
msgid "Interface name"
 | 
			
		||||
msgstr "Nom de l'interface"
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
 | 
			
		||||
msgid "Key"
 | 
			
		||||
msgstr "Clef"
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:15
 | 
			
		||||
msgid "Remote host"
 | 
			
		||||
msgstr "Nom de l'hôte distant ou adresse IP"
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:21
 | 
			
		||||
msgid "Remote port"
 | 
			
		||||
msgstr "Port 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 "Adresse IP locale du tunnel"
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:35
 | 
			
		||||
msgid "Tunnel remote IP"
 | 
			
		||||
msgstr "Adresse IP distance du tunnel"
 | 
			
		||||
							
								
								
									
										41
									
								
								luci-app-dsvpn/po/templates/dsvpn.pot
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								luci-app-dsvpn/po/templates/dsvpn.pot
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:12
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:39
 | 
			
		||||
msgid "Interface name"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:26
 | 
			
		||||
msgid "Key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:15
 | 
			
		||||
msgid "Remote host"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:21
 | 
			
		||||
msgid "Remote port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:8
 | 
			
		||||
msgid "Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:31
 | 
			
		||||
msgid "Tunnel local IP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-dsvpn/luasrc/model/cbi/dsvpn.lua:35
 | 
			
		||||
msgid "Tunnel remote IP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +15,7 @@ PKG_LICENSE:=GPLv2
 | 
			
		|||
 | 
			
		||||
PKG_MAINTAINER:=Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
-- Copyright 2018 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
-- Copyright 2018 - 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
module("luci.controller.glorytun", package.seeall)
 | 
			
		||||
| 
						 | 
				
			
			@ -7,6 +7,8 @@ function index()
 | 
			
		|||
	if not nixio.fs.access("/etc/config/glorytun") then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	entry({"admin", "services", "glorytun"}, cbi("glorytun"), _("Glorytun") )
 | 
			
		||||
	entry({"admin", "services", "glorytun", "settings"}, cbi("glorytun-settings"), nil ).leaf = true
 | 
			
		||||
	--entry({"admin", "services", "glorytun"}, cbi("glorytun"), _("Glorytun") )
 | 
			
		||||
	--entry({"admin", "services", "glorytun", "settings"}, cbi("glorytun-settings"), nil ).leaf = true
 | 
			
		||||
	entry({"admin", "vpn", "glorytun"}, cbi("glorytun"), _("Glorytun") )
 | 
			
		||||
	entry({"admin", "vpn", "glorytun", "settings"}, cbi("glorytun-settings"), nil ).leaf = true
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@ s.addremove = true
 | 
			
		|||
s.add_select_options = { }
 | 
			
		||||
s.add_select_options[''] = ''
 | 
			
		||||
s.extedit = luci.dispatcher.build_url(
 | 
			
		||||
	"admin", "services", "glorytun", "settings", "%s"
 | 
			
		||||
	"admin", "vpn", "glorytun", "settings", "%s"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
uci:load("glorytun_recipes")
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ end
 | 
			
		|||
local updown = s:option( Button, "_updown", translate("Start/Stop") )
 | 
			
		||||
updown._state = false
 | 
			
		||||
updown.redirect = luci.dispatcher.build_url(
 | 
			
		||||
	"admin", "services", "glorytun"
 | 
			
		||||
	"admin", "vpn", "glorytun"
 | 
			
		||||
)
 | 
			
		||||
function updown.cbid(self, section)
 | 
			
		||||
	local pid = s.getPID(section)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@
 | 
			
		|||
 | 
			
		||||
<fieldset class="cbi-section">
 | 
			
		||||
	<legend>
 | 
			
		||||
		<a href="<%=url('admin/services/glorytun')%>"><%:Overview%></a> »
 | 
			
		||||
		<a href="<%=url('admin/vpn/glorytun')%>"><%:Overview%></a> »
 | 
			
		||||
		<%=luci.i18n.translatef("Instance \"%s\"", self.instance)%>
 | 
			
		||||
	</legend>
 | 
			
		||||
</fieldset>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,8 +15,9 @@ set_default() {
 | 
			
		|||
    local remoteip
 | 
			
		||||
    local config="$1"
 | 
			
		||||
    local iface
 | 
			
		||||
    config_get enable "$config" enable
 | 
			
		||||
    config_get iface "$config" dev
 | 
			
		||||
    [ "$iface" = "$DEVICE" ] && {
 | 
			
		||||
    [ "$iface" = "$DEVICE" ] && [ "$enable" = "1" ] && {
 | 
			
		||||
	config_get localip "$config" localip
 | 
			
		||||
	config_get remoteip "$config" remoteip
 | 
			
		||||
	[ "$remoteip" != "" ] && [ "$localip" != "" ] &&  ifconfig $DEVICE $localip pointopoint $remoteip up
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,6 +12,6 @@ LUCI_DEPENDS:=+haproxy-nossl
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=MIT
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ LUCI_DEPENDS:=+iperf3-ssl
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -160,6 +160,10 @@
 | 
			
		|||
			end)
 | 
			
		||||
		    %>
 | 
			
		||||
		    </select>
 | 
			
		||||
		     <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Server VPS IP is bypassed, so this will test only default route speed.%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <input type="button" value="<%:Test%>" class="cbi-button cbi-button-apply" onclick="update_speed(this.form.addr,this.form.proto.value,this.form.mode.value,this.form.omit.value,this.form.parallel.value,this.form.transmit.value,this.form.bitrate.value)" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,70 +1,98 @@
 | 
			
		|||
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"
 | 
			
		||||
"Language-Team: \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"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
 | 
			
		||||
msgid "0 for unlimited. Need to be limited for UDP test"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "0 pour sans limite. Nécessite d'être limité pour les tests UDP."
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
 | 
			
		||||
msgid "Bad address specified!"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Adresse invalide !"
 | 
			
		||||
 | 
			
		||||
#: 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 "Téléchargement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
 | 
			
		||||
msgid "Internet protocol"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Protocole Internet"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
 | 
			
		||||
msgid "Loading"
 | 
			
		||||
msgstr "Chargement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
 | 
			
		||||
msgid "Mode of operation"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Mode de fonctionnement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
 | 
			
		||||
msgid "Number of parallel client streams to run"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Nombre de client en parallèle"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
 | 
			
		||||
msgid "Omit the first n seconds"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Passe les n premières secondes"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
 | 
			
		||||
msgid "Server"
 | 
			
		||||
msgstr "Serveur"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
msgstr "Vitesse souhaitée (Mbits/s)"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
 | 
			
		||||
msgid "Test"
 | 
			
		||||
msgstr "Teste"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
 | 
			
		||||
msgid "This iPerf interface is in bêta. No support for this."
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Cette interface pour iPerf est en bêta. Pas de support pour ça."
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
 | 
			
		||||
msgid "Time to transmit for (s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
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 "Envoie"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
msgstr "En attente de la réponse de la commande..."
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/controller/iperf.lua:8
 | 
			
		||||
msgid "iPerf"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
 | 
			
		||||
msgid "iPerf speed tests"
 | 
			
		||||
msgstr ""
 | 
			
		||||
msgstr "Tests de vitesse iPerf"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/controller/iperf.lua:7
 | 
			
		||||
msgid "iperf"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,59 +1,87 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
 | 
			
		||||
msgid "0 for unlimited. Need to be limited for UDP test"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
 | 
			
		||||
msgid "Bad address specified!"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
 | 
			
		||||
msgid "Internet protocol"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
 | 
			
		||||
msgid "Loading"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
 | 
			
		||||
msgid "Mode of operation"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
 | 
			
		||||
msgid "Number of parallel client streams to run"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
 | 
			
		||||
msgid "Omit the first n seconds"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
 | 
			
		||||
msgid "Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
 | 
			
		||||
msgid "Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
 | 
			
		||||
msgid "Target bitrate (Mbits/s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
 | 
			
		||||
msgid "Test"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
 | 
			
		||||
msgid "This iPerf interface is in bêta. No support for this."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
 | 
			
		||||
msgid "Time to transmit for (s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/controller/iperf.lua:8
 | 
			
		||||
msgid "iPerf"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
 | 
			
		||||
msgid "iPerf speed tests"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-iperf/luasrc/controller/iperf.lua:7
 | 
			
		||||
msgid "iperf"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										78
									
								
								luci-app-macvlan/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								luci-app-macvlan/Makefile
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,78 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2017-2019 Chen Minqiang <ptpt52@gmail.com>
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the GNU General Public License v3.
 | 
			
		||||
# See /LICENSE for more information.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
PKG_NAME:=luci-app-macvlan
 | 
			
		||||
PKG_VERSION:=1.0.0
 | 
			
		||||
PKG_RELEASE:=1
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
PKG_LICENSE_FILES:=LICENSE
 | 
			
		||||
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>
 | 
			
		||||
 | 
			
		||||
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
 | 
			
		||||
 | 
			
		||||
include $(INCLUDE_DIR)/package.mk
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-macvlan
 | 
			
		||||
	CATEGORY:=OpenMPTCProuter
 | 
			
		||||
	SUBMENU:=Macvlan
 | 
			
		||||
	TITLE:=LuCI Support for macvlan
 | 
			
		||||
	PKGARCH:=all
 | 
			
		||||
	DEPENDS:=+kmod-macvlan +busybox +@BUSYBOX_CUSTOM +@BUSYBOX_CONFIG_VCONFIG
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-macvlan/description
 | 
			
		||||
	LuCI Support for macvlan.
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Build/Prepare
 | 
			
		||||
	$(foreach po,$(wildcard ${CURDIR}/files/luci/i18n/*.po), \
 | 
			
		||||
		po2lmo $(po) $(PKG_BUILD_DIR)/$(patsubst %.po,%.lmo,$(notdir $(po)));)
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Build/Configure
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Build/Compile
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-macvlan/postinst
 | 
			
		||||
#!/bin/sh
 | 
			
		||||
if [ -z "$${IPKG_INSTROOT}" ]; then
 | 
			
		||||
	rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$$IPKG_INSTROOT" ]; then
 | 
			
		||||
  ( . /etc/uci-defaults/40_luci-app-macvlan )
 | 
			
		||||
  rm -f /etc/uci-defaults/40_luci-app-macvlan
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
exit 0
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-macvlan/conffiles
 | 
			
		||||
/etc/config/macvlan
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-macvlan/install
 | 
			
		||||
	$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n
 | 
			
		||||
	$(INSTALL_DATA) $(PKG_BUILD_DIR)/macvlan.*.lmo $(1)/usr/lib/lua/luci/i18n/
 | 
			
		||||
	$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller
 | 
			
		||||
	$(INSTALL_DATA) ./files/luci/controller/*.lua $(1)/usr/lib/lua/luci/controller/
 | 
			
		||||
	$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi/macvlan
 | 
			
		||||
	$(INSTALL_DATA) ./files/luci/model/cbi/macvlan/*.lua $(1)/usr/lib/lua/luci/model/cbi/macvlan/
 | 
			
		||||
	$(INSTALL_DIR) $(1)/etc/config
 | 
			
		||||
	$(INSTALL_DATA) ./files/root/etc/config/macvlan $(1)/etc/config/macvlan
 | 
			
		||||
	$(INSTALL_DIR) $(1)/etc/init.d
 | 
			
		||||
	$(INSTALL_BIN) ./files/root/etc/init.d/macvlan $(1)/etc/init.d/macvlan
 | 
			
		||||
	$(INSTALL_DIR) $(1)/etc/uci-defaults
 | 
			
		||||
	$(INSTALL_DATA) ./files/root/etc/uci-defaults/40_luci-app-macvlan $(1)/etc/uci-defaults/40_luci-app-macvlan
 | 
			
		||||
endef
 | 
			
		||||
 | 
			
		||||
$(eval $(call BuildPackage,luci-app-macvlan))
 | 
			
		||||
							
								
								
									
										10
									
								
								luci-app-macvlan/files/luci/controller/macvlan.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								luci-app-macvlan/files/luci/controller/macvlan.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
-- Copyright (C) 2019 X-WRT <dev@x-wrt.com>
 | 
			
		||||
 | 
			
		||||
module("luci.controller.macvlan", package.seeall)
 | 
			
		||||
 | 
			
		||||
function index()
 | 
			
		||||
	local page
 | 
			
		||||
 | 
			
		||||
	page = entry({"admin", "network", "macvlan"}, cbi("macvlan/macvlan"), _("Macvlan"))
 | 
			
		||||
	page.leaf = true
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										14
									
								
								luci-app-macvlan/files/luci/i18n/macvlan.zh-cn.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								luci-app-macvlan/files/luci/i18n/macvlan.zh-cn.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
 | 
			
		||||
msgid "Macvlan"
 | 
			
		||||
msgstr "Macvlan"
 | 
			
		||||
 | 
			
		||||
msgid "Macvlan Settings"
 | 
			
		||||
msgstr "Macvlan设置"
 | 
			
		||||
 | 
			
		||||
msgid "Interface"
 | 
			
		||||
msgstr "网络接口"
 | 
			
		||||
 | 
			
		||||
msgid "Index"
 | 
			
		||||
msgstr "序号"
 | 
			
		||||
							
								
								
									
										22
									
								
								luci-app-macvlan/files/luci/model/cbi/macvlan/macvlan.lua
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								luci-app-macvlan/files/luci/model/cbi/macvlan/macvlan.lua
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
-- Copyright (C) 2019 X-WRT <dev@x-wrt.com>
 | 
			
		||||
 | 
			
		||||
local net = require "luci.model.network".init()
 | 
			
		||||
local ifaces = net:get_interfaces() or { net:get_interface() }
 | 
			
		||||
 | 
			
		||||
m = Map("macvlan", translate("Macvlan"), translate("You can configure Macvlan virtual interfaces base on the real itnerface you want."))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "macvlan", translate("Macvlan Settings"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = false
 | 
			
		||||
s.template = "cbi/tblsection"
 | 
			
		||||
 | 
			
		||||
hn = s:option(Value, "ifname", translate("Interface"))
 | 
			
		||||
hn.rmempty  = false
 | 
			
		||||
 | 
			
		||||
for _, iface in ipairs(ifaces) do
 | 
			
		||||
	if iface:type() ~= "macvlan" then
 | 
			
		||||
		hn:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
| 
						 | 
				
			
			@ -34,46 +34,79 @@ _save_macaddr() {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_create_interface() {
 | 
			
		||||
	local _masterifname
 | 
			
		||||
	local _ifname=$1
 | 
			
		||||
	config_get _masterifname "$1" ifname
 | 
			
		||||
	uci batch <<-EOF
 | 
			
		||||
		set network.$_ifname=interface
 | 
			
		||||
		set network.$_ifname.type=macvlan
 | 
			
		||||
		set network.$_ifname.proto=static
 | 
			
		||||
		set network.$_ifname.masterintf=$_masterifname
 | 
			
		||||
	EOF
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Configuration by interface
 | 
			
		||||
_setup_interface() {
 | 
			
		||||
	local _ifname
 | 
			
		||||
	config_get _ifname "$1" ifname
 | 
			
		||||
	[ -z "$_ifname" ] && config_get _ifname "$1" ifname
 | 
			
		||||
	#[ -z "$_ifname" ] && config_get _ifname "$1" ifname
 | 
			
		||||
	# do not create macvlan for vlan
 | 
			
		||||
	#case "$_ifname" in
 | 
			
		||||
	#	eth*.*) return ;;
 | 
			
		||||
	#esac
 | 
			
		||||
	local _type
 | 
			
		||||
	config_get _type "$1" type
 | 
			
		||||
 | 
			
		||||
	[ "$_type" = "macvlan" ] && [ "$(uci -q get macvlan.$1)" = "" ] && {
 | 
			
		||||
		uci -q batch <<-EOF
 | 
			
		||||
			delete network.$1
 | 
			
		||||
			delete network.$1_dev
 | 
			
		||||
			commit network
 | 
			
		||||
		EOF
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	[ "$(echo $1 | grep _dev)" != "" ] && {
 | 
			
		||||
		local _intfdev=$(sed 's/_dev//' $1)
 | 
			
		||||
		uci -q get "network.$_intfdev.ifname" >/dev/null || {
 | 
			
		||||
			logger -t "macvlan" "Remove network.$1"
 | 
			
		||||
			uci -q batch <<-EOF
 | 
			
		||||
			delete network.$1
 | 
			
		||||
			commit network
 | 
			
		||||
			delete macvlan.$1
 | 
			
		||||
			commit macvlan
 | 
			
		||||
			EOF
 | 
			
		||||
		}
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local _type
 | 
			
		||||
	config_get _type "$1" type
 | 
			
		||||
	#_type="$(uci -q get network.$1.type)
 | 
			
		||||
	if [ "$(uci -q get macvlan.$1)" != "" ]; then
 | 
			
		||||
		_type="macvlan"
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	uci -q get "network.$1_dev.ifname" >/dev/null && {
 | 
			
		||||
		uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu)
 | 
			
		||||
		[ -n "$(uci -q get macvlan.$1.ifname)" ] && uci -q set network.$1_dev.ifname=$(uci -q get macvlan.$1.ifname)
 | 
			
		||||
		[ -z "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1.masterintf=$(uci -q get network.$1_dev.ifname)
 | 
			
		||||
		[ -n "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1_dev.ifname=$(uci -q get network.$1.masterintf)
 | 
			
		||||
		[ -z "$(uci -q get network.$1.macaddr)" ] && uci -q set network.$1_dev.macaddr=$(uci -q get network.$1.macaddr)
 | 
			
		||||
		[ "$_type" = "macvlan" ] || {
 | 
			
		||||
			logger -t "macvlan" "Remove network.$1_dev"
 | 
			
		||||
			uci -q batch <<-EOF
 | 
			
		||||
			delete network.$1_dev
 | 
			
		||||
			set network.$1.ifname=$(uci -q get network.$1.masterintf)
 | 
			
		||||
			delete network.$1.masterintf
 | 
			
		||||
			EOF
 | 
			
		||||
		}
 | 
			
		||||
		[ "$_type" = "macvlan" ] && {
 | 
			
		||||
			local interface
 | 
			
		||||
			config_get _interface "$1" interface
 | 
			
		||||
			[ -n "$_interface" ] && {
 | 
			
		||||
				logger -t "macvlan" "Remove network.$1_dev"
 | 
			
		||||
				uci -q batch <<-EOF
 | 
			
		||||
				delete network.$1.interface
 | 
			
		||||
				delete network.$1
 | 
			
		||||
				set network.$1_dev.ifname=$_interface
 | 
			
		||||
				EOF
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -83,7 +116,7 @@ _setup_interface() {
 | 
			
		|||
	}
 | 
			
		||||
	
 | 
			
		||||
	[ "$_type" = "macvlan" ] || return 0
 | 
			
		||||
	
 | 
			
		||||
	[ -z "$_ifname" ] && _ifname=$(uci -q get macvlan.$1.ifname)
 | 
			
		||||
	uci -q batch <<-EOF
 | 
			
		||||
	set network.$1_dev=device
 | 
			
		||||
	set network.$1_dev.name=$1
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +136,8 @@ _setup_interface() {
 | 
			
		|||
 | 
			
		||||
start_service() {
 | 
			
		||||
	. /lib/functions.sh
 | 
			
		||||
	config_load macvlan
 | 
			
		||||
	config_foreach _create_interface macvlan
 | 
			
		||||
	config_load network
 | 
			
		||||
	config_foreach _setup_interface interface
 | 
			
		||||
	config_foreach _save_macaddr interface
 | 
			
		||||
| 
						 | 
				
			
			@ -114,5 +149,5 @@ reload_service() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
service_triggers() {
 | 
			
		||||
	procd_add_reload_trigger network
 | 
			
		||||
	procd_add_reload_trigger network macvlan
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
 | 
			
		||||
uci -q batch <<-EOF >/dev/null
 | 
			
		||||
	delete ucitrack.@macvlan[-1]
 | 
			
		||||
	add ucitrack macvlan
 | 
			
		||||
	set ucitrack.@macvlan[-1].init=macvlan
 | 
			
		||||
	commit ucitrack
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
rm -f /tmp/luci-indexcache
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ LUCI_DEPENDS:=+msmtp-mta
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ LUCI_DEPENDS:=+mlvpn
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,5 +2,6 @@ module("luci.controller.mlvpn", package.seeall)
 | 
			
		|||
 | 
			
		||||
function index()
 | 
			
		||||
	--entry({"admin", "openmptcprouter", "mlvpn"}, cbi("mlvpn"), _("MLVPN"))
 | 
			
		||||
	entry({"admin", "services", "mlvpn"}, cbi("mlvpn"), _("MLVPN"))
 | 
			
		||||
	--entry({"admin", "services", "mlvpn"}, cbi("mlvpn"), _("MLVPN"))
 | 
			
		||||
	entry({"admin", "vpn", "mlvpn"}, cbi("mlvpn"), _("MLVPN"))
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,6 +8,6 @@ include $(TOPDIR)/rules.mk
 | 
			
		|||
LUCI_TITLE:=LuCI Support for MPTCP
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -39,13 +39,24 @@ function multipath_bandwidth()
 | 
			
		|||
	local uci = luci.model.uci.cursor()
 | 
			
		||||
 | 
			
		||||
	uci:foreach("network", "interface", function(s)
 | 
			
		||||
		local dev = s["ifname"] or ""
 | 
			
		||||
		local intname = s[".name"]
 | 
			
		||||
		local dev = get_device(intname)
 | 
			
		||||
		if dev == "" then
 | 
			
		||||
			dev = get_device(s["ifname"])
 | 
			
		||||
		end
 | 
			
		||||
		local multipath = s["multipath"] or ""
 | 
			
		||||
		if dev ~= "lo" and dev ~= "" then
 | 
			
		||||
			local multipath = s["multipath"] or "off"
 | 
			
		||||
			if multipath == "" then
 | 
			
		||||
				multipath = uci:get("openmptcprouter", intname, "multipath") or ""
 | 
			
		||||
			end
 | 
			
		||||
			if multipath == "" then
 | 
			
		||||
				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 ""
 | 
			
		||||
				if bwc ~= nil then
 | 
			
		||||
					result[dev] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
 | 
			
		||||
					--result[dev] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
 | 
			
		||||
					result[intname] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
 | 
			
		||||
				else
 | 
			
		||||
					result[dev] = "[]"
 | 
			
		||||
				end
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +70,11 @@ end
 | 
			
		|||
 | 
			
		||||
function get_device(interface)
 | 
			
		||||
	local dump = require("luci.util").ubus("network.interface.%s" % interface, "status", {})
 | 
			
		||||
	if dump then
 | 
			
		||||
		return dump['l3_device']
 | 
			
		||||
	else
 | 
			
		||||
		return ""
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mptcp_check_trace(iface)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,7 @@ mtcpsch:value("roundrobin", translate("round-robin"))
 | 
			
		|||
mtcpsch:value("redundant", translate("redundant"))
 | 
			
		||||
if uname.release:sub(1,4) == "4.19" then
 | 
			
		||||
	mtcpsch:value("blest", translate("BLEST"))
 | 
			
		||||
	mtcpsch:value("ecf", translate("ECF"))
 | 
			
		||||
end
 | 
			
		||||
local mtcpsyn = s:option(Value, "mptcp_syn_retries", translate("Multipath TCP SYN retries"))
 | 
			
		||||
mtcpsyn.datatype = "uinteger"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,15 @@
 | 
			
		|||
	local ntm = require "luci.model.network".init()
 | 
			
		||||
	local uci = require "luci.model.uci".cursor()
 | 
			
		||||
 | 
			
		||||
	function get_device(interface)
 | 
			
		||||
		local dump = require("luci.util").ubus("network.interface.%s" % interface, "status", {})
 | 
			
		||||
		if dump and dump['l3_device'] ~= "" then
 | 
			
		||||
			return dump['l3_device']
 | 
			
		||||
		else
 | 
			
		||||
			return interface
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local dev
 | 
			
		||||
	local devices = { "all" }
 | 
			
		||||
	for _, dev in ipairs(ntm:get_networks()) do
 | 
			
		||||
| 
						 | 
				
			
			@ -35,7 +44,7 @@
 | 
			
		|||
		--end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local curdev = luci.http.formvalue("dev") or "all"
 | 
			
		||||
	local curifname = luci.http.formvalue("dev") or "all"
 | 
			
		||||
-%>
 | 
			
		||||
 | 
			
		||||
<%+header%>
 | 
			
		||||
| 
						 | 
				
			
			@ -96,7 +105,7 @@
 | 
			
		|||
		);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
<% if curdev == "all" then %>
 | 
			
		||||
<% if curifname == "all" then %>
 | 
			
		||||
	var all = true;
 | 
			
		||||
	var bwxhr = new XHR();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -652,7 +661,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", curdev)%>', null,
 | 
			
		||||
				XHR.poll(3, '<%=build_url("admin/network/mptcp/interface_bandwidth", curifname)%>', null,
 | 
			
		||||
					function(x, data)
 | 
			
		||||
					{
 | 
			
		||||
						var data_max   = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -762,12 +771,15 @@
 | 
			
		|||
<h2><a id="content" name="content"><%:Realtime Traffic%></a></h2>
 | 
			
		||||
 | 
			
		||||
<ul class="cbi-tabmenu">
 | 
			
		||||
	<% for _, dev in ipairs(devices) do %>
 | 
			
		||||
		<li class="cbi-tab<%= dev == curdev and "" or "-disabled" %>"><a href="?dev=<%=pcdata(dev)%>"><%=pcdata(dev)%></a></li>
 | 
			
		||||
	<% 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>
 | 
			
		||||
	<% end %>
 | 
			
		||||
</ul>
 | 
			
		||||
 | 
			
		||||
<% if curdev == "all" then %>
 | 
			
		||||
<% if curifname == "all" then %>
 | 
			
		||||
 | 
			
		||||
<strong><%:Download:%></strong>
 | 
			
		||||
<embed id="dnsvg" style="width:100%; height:300px; border:1px solid #000000; background-color:#FFFFFF" src="<%=resource%>/bandwidth.svg" />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,131 +1,281 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:652
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Average:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:34
 | 
			
		||||
msgid "BLEST"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/controller/mptcp.lua:11
 | 
			
		||||
msgid "Bandwidth"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:43
 | 
			
		||||
msgid "Check if MPTCP between interface and server is working."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
 | 
			
		||||
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
 | 
			
		||||
msgid "Current:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:39
 | 
			
		||||
msgid "Default is bbr"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:772
 | 
			
		||||
msgid "Download:"
 | 
			
		||||
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
 | 
			
		||||
msgid "Error"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/controller/mptcp.lua:18
 | 
			
		||||
msgid "Established connections"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:44
 | 
			
		||||
msgid "Fullmesh subflows for each pair of IP addresses"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:793
 | 
			
		||||
msgid "Inbound:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:48
 | 
			
		||||
msgid "Interface"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:55
 | 
			
		||||
msgid "Interfaces Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:79
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:563
 | 
			
		||||
msgid "MB/s"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/controller/mptcp.lua:9
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:7
 | 
			
		||||
msgid "MPTCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/controller/mptcp.lua:16
 | 
			
		||||
msgid "MPTCP Fullmesh"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:18
 | 
			
		||||
msgid "Multipath Debug"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:12
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:56
 | 
			
		||||
msgid "Multipath TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:36
 | 
			
		||||
msgid "Multipath TCP SYN retries"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:15
 | 
			
		||||
msgid "Multipath TCP checksum"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:21
 | 
			
		||||
msgid "Multipath TCP path-manager"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:29
 | 
			
		||||
msgid "Multipath TCP scheduler"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:27
 | 
			
		||||
msgid "Netlink"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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:56
 | 
			
		||||
msgid "One interface must be set as master"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:803
 | 
			
		||||
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
 | 
			
		||||
msgid "Peak:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:47
 | 
			
		||||
msgid "Re-create fullmesh subflows after a timeout"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:762
 | 
			
		||||
msgid "Realtime Traffic"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/controller/mptcp.lua:10
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:45
 | 
			
		||||
msgid "Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/mptcp_check.htm:65
 | 
			
		||||
msgid "Test"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/view/mptcp/multipath.htm:778
 | 
			
		||||
msgid "Upload:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:60
 | 
			
		||||
msgid "backup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:58
 | 
			
		||||
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
 | 
			
		||||
msgid "enable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:57
 | 
			
		||||
msgid "enabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:23
 | 
			
		||||
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: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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:59
 | 
			
		||||
msgid "master"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:24
 | 
			
		||||
msgid "ndiffports"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:51
 | 
			
		||||
msgid "ndiffports subflows number"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:32
 | 
			
		||||
msgid "redundant"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-mptcp/luasrc/model/cbi/mptcp.lua:31
 | 
			
		||||
msgid "round-robin"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,7 @@ KCONFIG:=CONFIG_NGINX_STREAM_CORE_MODULE
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=MIT
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ LUCI_DEPENDS:=+dnsmasq-full +shadowsocks-libev-ss-rules +iptables-mod-ndpi +ipta
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,9 +18,11 @@ hn.datatype = "hostname"
 | 
			
		|||
hn.optional = false
 | 
			
		||||
hn.rmempty  = true
 | 
			
		||||
 | 
			
		||||
ifd = s:option(Value, "interface", translate("Interface"))
 | 
			
		||||
ifd = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifd.rmempty  = true
 | 
			
		||||
 | 
			
		||||
dn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "ips", translate("IPs and Networks"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
| 
						 | 
				
			
			@ -31,9 +33,34 @@ ip.datatype = "ipaddr"
 | 
			
		|||
ip.rmempty  = true
 | 
			
		||||
ip.optional = false
 | 
			
		||||
 | 
			
		||||
ifi = s:option(Value, "interface", translate("Interface"))
 | 
			
		||||
ifi = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifi.rmempty  = true
 | 
			
		||||
 | 
			
		||||
inn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "dest_port", translate("Ports destination"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
s.template = "cbi/tblsection"
 | 
			
		||||
 | 
			
		||||
dp = s:option(Value, "dport", translate("port"))
 | 
			
		||||
dp.rmempty  = true
 | 
			
		||||
dp.optional = false
 | 
			
		||||
 | 
			
		||||
proto = s:option(ListValue, "proto", translate("Protocol"))
 | 
			
		||||
proto:value("all",translate("ALL"))
 | 
			
		||||
proto:value("tcp","TCP")
 | 
			
		||||
proto:value("udp","UDP")
 | 
			
		||||
proto:value("icmp","ICMP")
 | 
			
		||||
proto.rmempty  = true
 | 
			
		||||
proto.optional = false
 | 
			
		||||
 | 
			
		||||
ifdp = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifdp.rmempty  = true
 | 
			
		||||
 | 
			
		||||
dpn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "macs", translate("<abbr title=\"Media Access Control\">MAC</abbr>-Address"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
| 
						 | 
				
			
			@ -50,9 +77,11 @@ sys.net.host_hints(function(m, v4, v6, name)
 | 
			
		|||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
ifm = s:option(Value, "interface", translate("Interface"))
 | 
			
		||||
ifm = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifm.rmempty  = true
 | 
			
		||||
 | 
			
		||||
macn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "lan_ip", translate("Source lan IP address or network"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
| 
						 | 
				
			
			@ -63,9 +92,11 @@ ip.datatype = "ipaddr"
 | 
			
		|||
ip.rmempty  = true
 | 
			
		||||
ip.optional = false
 | 
			
		||||
 | 
			
		||||
ifl = s:option(Value, "interface", translate("Interface"))
 | 
			
		||||
ifl = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifl.rmempty  = true
 | 
			
		||||
 | 
			
		||||
lanipn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "asns", translate("<abbr tittle=\"Autonomous System Number\">ASN</abbr>"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
| 
						 | 
				
			
			@ -75,15 +106,17 @@ asn = s:option(Value, "asn", translate("ASN"))
 | 
			
		|||
asn.rmempty  = true
 | 
			
		||||
asn.optional = false
 | 
			
		||||
 | 
			
		||||
ifa = s:option(Value, "interface", translate("Interface"))
 | 
			
		||||
ifa = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifa.rmempty  = true
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "dpis", translate("Protocols"))
 | 
			
		||||
asnn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
s = m:section(TypedSection, "dpis", translate("Protocols and services"))
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.anonymous = true
 | 
			
		||||
s.template = "cbi/tblsection"
 | 
			
		||||
 | 
			
		||||
dpi = s:option(Value, "proto", translate("Protocol"))
 | 
			
		||||
dpi = s:option(ListValue, "proto", translate("Protocol/Service"))
 | 
			
		||||
dpi.rmempty  = true
 | 
			
		||||
dpi.optional = false
 | 
			
		||||
local xt_ndpi_available = nixio.fs.access("/proc/net/xt_ndpi/proto")
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +128,7 @@ if xt_ndpi_available then
 | 
			
		|||
			table.insert(protos,b)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	table.sort(protos)
 | 
			
		||||
	table.sort(protos, function(a, b) return a:upper() < b:upper() end)
 | 
			
		||||
	for _,b in ipairs(protos) do
 | 
			
		||||
		dpi:value(b,"%s" % tostring(b))
 | 
			
		||||
	end
 | 
			
		||||
| 
						 | 
				
			
			@ -104,18 +137,23 @@ end
 | 
			
		|||
ifp = s:option(ListValue, "interface", translate("Interface"))
 | 
			
		||||
ifp.rmempty  = true
 | 
			
		||||
 | 
			
		||||
psn = s:option(Value,"note",translate("Note"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
ifd.default = "all"
 | 
			
		||||
ifi.default = "all"
 | 
			
		||||
ifp.default = "all"
 | 
			
		||||
ifm.default = "all"
 | 
			
		||||
ifl.default = "all"
 | 
			
		||||
ifa.default = "all"
 | 
			
		||||
ifdp.default = "all"
 | 
			
		||||
ifd:value("all",translate("Default"))
 | 
			
		||||
ifi:value("all",translate("Default"))
 | 
			
		||||
ifp:value("all",translate("Default"))
 | 
			
		||||
ifm:value("all",translate("Default"))
 | 
			
		||||
ifl:value("all",translate("Default"))
 | 
			
		||||
ifa:value("all",translate("Default"))
 | 
			
		||||
ifdp:value("all",translate("Default"))
 | 
			
		||||
for _, iface in ipairs(ifaces) do
 | 
			
		||||
	if iface:is_up() then
 | 
			
		||||
		ifd:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
| 
						 | 
				
			
			@ -124,6 +162,7 @@ for _, iface in ipairs(ifaces) do
 | 
			
		|||
		ifm:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
		ifl:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
		ifa:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
		ifdp:value(iface:name(),"%s" % iface:name())
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,36 +9,48 @@ msgstr ""
 | 
			
		|||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Generator: Poedit 2.1.1\n"
 | 
			
		||||
"X-Generator: Poedit 2.2.3\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:64
 | 
			
		||||
msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
 | 
			
		||||
msgstr "Adresse <abbr title=\"Media Access Control\">MAC</abbr>"
 | 
			
		||||
 | 
			
		||||
msgid "Add"
 | 
			
		||||
msgstr "Ajouter"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:100
 | 
			
		||||
msgid "<abbr tittle=\"Autonomous System Number\">ASN</abbr>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "All"
 | 
			
		||||
msgstr "Tout"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:52
 | 
			
		||||
msgid "ALL"
 | 
			
		||||
msgstr "TOUT"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:105
 | 
			
		||||
msgid "ASN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:9
 | 
			
		||||
msgid "Bypass"
 | 
			
		||||
msgstr "Contourne"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:150
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:151
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:152
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:153
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:154
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:155
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:156
 | 
			
		||||
msgid "Default"
 | 
			
		||||
msgstr "Défaut"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:16
 | 
			
		||||
msgid "Domain"
 | 
			
		||||
msgstr "Domaine"
 | 
			
		||||
 | 
			
		||||
msgid "Domain, IP or network"
 | 
			
		||||
msgstr "Domaine, IP ou réseau"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:11
 | 
			
		||||
msgid "Domains"
 | 
			
		||||
msgstr "Domaines"
 | 
			
		||||
 | 
			
		||||
msgid "Domains, ips or networks"
 | 
			
		||||
msgstr "Domaines, IPs et réseaux"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:9
 | 
			
		||||
msgid ""
 | 
			
		||||
"Here you can bypass ShadowSocks and VPN. If you set Interface to Default "
 | 
			
		||||
"this use any working interface."
 | 
			
		||||
| 
						 | 
				
			
			@ -46,29 +58,90 @@ msgstr ""
 | 
			
		|||
"Ici vous pouvez contouner Shadowsocks et le VPN. Si vous mettez l'interface "
 | 
			
		||||
"à défaut, ça utilisera n'importe qu'elle interface fonctionnant."
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:31
 | 
			
		||||
msgid "IP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:90
 | 
			
		||||
msgid "IP Address"
 | 
			
		||||
msgstr "Adresse IP"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:26
 | 
			
		||||
msgid "IPs and Networks"
 | 
			
		||||
msgstr "IPs et réseaux"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:21
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:36
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:59
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:80
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:95
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
msgid "MAC-Address"
 | 
			
		||||
msgstr "Adresse MAC"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:24
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:39
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:62
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:83
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:98
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:112
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:140
 | 
			
		||||
msgid "Note"
 | 
			
		||||
msgstr "Note"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/controller/omr-bypass.lua:6
 | 
			
		||||
msgid "OMR-Bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Output interface"
 | 
			
		||||
msgstr "Interface de sortie"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:42
 | 
			
		||||
msgid "Ports destination"
 | 
			
		||||
msgstr "Ports de destination"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:51
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocole"
 | 
			
		||||
 | 
			
		||||
msgid "Protocols"
 | 
			
		||||
msgstr "Protocoles"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:119
 | 
			
		||||
msgid "Protocol/Service"
 | 
			
		||||
msgstr "Protocole/Service"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:114
 | 
			
		||||
msgid "Protocols and services"
 | 
			
		||||
msgstr "Protocoles et services"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:69
 | 
			
		||||
msgid "Source MAC-Address"
 | 
			
		||||
msgstr "Adresse MAC source"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:85
 | 
			
		||||
msgid "Source lan IP address or network"
 | 
			
		||||
msgstr "Adresse IP source ou réseau"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:47
 | 
			
		||||
msgid "port"
 | 
			
		||||
msgstr "port"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Add"
 | 
			
		||||
#~ msgstr "Ajouter"
 | 
			
		||||
 | 
			
		||||
#~ msgid "All"
 | 
			
		||||
#~ msgstr "Tout"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Domain, IP or network"
 | 
			
		||||
#~ msgstr "Domaine, IP ou réseau"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Domains, ips or networks"
 | 
			
		||||
#~ msgstr "Domaines, IPs et réseaux"
 | 
			
		||||
 | 
			
		||||
#~ msgid "MAC-Address"
 | 
			
		||||
#~ msgstr "Adresse MAC"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Output interface"
 | 
			
		||||
#~ msgstr "Interface de sortie"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Protocols"
 | 
			
		||||
#~ msgstr "Protocoles"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "If empty, multipath master interface is used if up else any other up "
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,58 +1,110 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:64
 | 
			
		||||
msgid "<abbr title=\"Media Access Control\">MAC</abbr>-Address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Add"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:100
 | 
			
		||||
msgid "<abbr tittle=\"Autonomous System Number\">ASN</abbr>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "All"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:52
 | 
			
		||||
msgid "ALL"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:105
 | 
			
		||||
msgid "ASN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:9
 | 
			
		||||
msgid "Bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:150
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:151
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:152
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:153
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:154
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:155
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:156
 | 
			
		||||
msgid "Default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:16
 | 
			
		||||
msgid "Domain"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Domain, IP or network"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:11
 | 
			
		||||
msgid "Domains"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Domains, ips or networks"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:9
 | 
			
		||||
msgid ""
 | 
			
		||||
"Here you can bypass ShadowSocks and VPN. If you set Interface to Default "
 | 
			
		||||
"this use any working interface."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:31
 | 
			
		||||
msgid "IP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:90
 | 
			
		||||
msgid "IP Address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:26
 | 
			
		||||
msgid "IPs and Networks"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:21
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:36
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:59
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:80
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:95
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
msgid "MAC-Address"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:24
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:39
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:62
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:83
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:98
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:112
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:140
 | 
			
		||||
msgid "Note"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/controller/omr-bypass.lua:6
 | 
			
		||||
msgid "OMR-Bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Output interface"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:42
 | 
			
		||||
msgid "Ports destination"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:51
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgid "Protocols"
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:119
 | 
			
		||||
msgid "Protocol/Service"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:114
 | 
			
		||||
msgid "Protocols and services"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:69
 | 
			
		||||
msgid "Source MAC-Address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:85
 | 
			
		||||
msgid "Source lan IP address or network"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-bypass/luasrc/model/cbi/omr-bypass.lua:47
 | 
			
		||||
msgid "port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,2 +1,2 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
/etc/init.d/omr-bypass reload
 | 
			
		||||
/etc/init.d/omr-bypass reload_rules
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,9 +4,25 @@
 | 
			
		|||
START=99
 | 
			
		||||
STOP=10
 | 
			
		||||
USE_PROCD=1
 | 
			
		||||
EXTRA_COMMANDS="reload_rules bypass_asn"
 | 
			
		||||
 | 
			
		||||
. /usr/lib/unbound/iptools.sh
 | 
			
		||||
 | 
			
		||||
_add_proto() {
 | 
			
		||||
	protoname=$1
 | 
			
		||||
	if [ "$(dd if=/proc/net/xt_ndpi/proto bs=4096 2> /dev/null | grep $protoname)" = "" ]; then
 | 
			
		||||
		echo "add_custom $protoname" >/proc/net/xt_ndpi/proto
 | 
			
		||||
	fi
 | 
			
		||||
	hosts="$( uci -q get omr-bypass.$protoname.url )"
 | 
			
		||||
	for url in $hosts; do
 | 
			
		||||
		echo "$protoname:$url" >/proc/net/xt_ndpi/host_proto
 | 
			
		||||
	done
 | 
			
		||||
	ip="$( uci -q get omr-bypass.$protoname.ip )"
 | 
			
		||||
	for ip in $ips; do
 | 
			
		||||
		echo "$protoname:$ip" >/proc/net/xt_ndpi/ip_proto
 | 
			
		||||
	done
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_bypass_ip() {
 | 
			
		||||
	local ip=$1
 | 
			
		||||
	local type=$2
 | 
			
		||||
| 
						 | 
				
			
			@ -37,11 +53,11 @@ _bypass_domain() {
 | 
			
		|||
		domain=$(echo $domain | sed 's:^\.::')
 | 
			
		||||
		#logger -t "omr-bypass" "Get IPs of $domain..."
 | 
			
		||||
		if [ -z $RELOAD ]; then
 | 
			
		||||
			resolve=$(dig a +timeout=3 +nocmd +noall +answer $domain | awk '{print $5}')
 | 
			
		||||
			resolve=$(dig a +timeout=1 +nocmd +noall +answer $domain | awk '{print $5}')
 | 
			
		||||
			for ip in $resolve; do
 | 
			
		||||
				_bypass_ip $ip $intf
 | 
			
		||||
			done
 | 
			
		||||
			resolve=$(dig aaaa +timeout=3 +nocmd +noall +answer $domain | awk '{print $5}')
 | 
			
		||||
			resolve=$(dig aaaa +timeout=1 +nocmd +noall +answer $domain | awk '{print $5}')
 | 
			
		||||
			for ip in $resolve; do
 | 
			
		||||
				_bypass_ip $ip $intf
 | 
			
		||||
			done
 | 
			
		||||
| 
						 | 
				
			
			@ -71,23 +87,23 @@ _bypass_mac() {
 | 
			
		|||
	[ -z "$intf" ] && intf="all"
 | 
			
		||||
	[ -z "$mac" ] && return
 | 
			
		||||
	if [ "$intf" = "all" ]; then
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass -m mac --mac-source $mac -j MARK --set-mark 0x539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6 -m mac --mac-source $mac -j MARK --set-mark 0x6539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	else
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass -m mac --mac-source $mac -j MARK --set-mark 0x539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6 -m mac --mac-source $mac -j MARK --set-mark 0x6539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
| 
						 | 
				
			
			@ -104,29 +120,72 @@ _bypass_lan_ip() {
 | 
			
		|||
 | 
			
		||||
	[ -z "$intf" ] && intf="all"
 | 
			
		||||
	[ -z "$ip" ] && return
 | 
			
		||||
	valid_ip4=$(valid_subnet4 $ip)
 | 
			
		||||
	valid_ip6=$(valid_subnet6 $ip)
 | 
			
		||||
	if [ "$intf" = "all" ]; then
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		if [ "$valid_ip4" = "ok" ]; then
 | 
			
		||||
			iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
			*mangle
 | 
			
		||||
			-A omr-bypass -s $ip -j MARK --set-mark 0x539
 | 
			
		||||
			COMMIT
 | 
			
		||||
			EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		elif [ "$valid_ip6" = "ok" ]; then
 | 
			
		||||
			ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
			*mangle
 | 
			
		||||
			-A omr-bypass6 -s $ip -j MARK --set-mark 0x6539
 | 
			
		||||
			COMMIT
 | 
			
		||||
			EOF
 | 
			
		||||
		fi
 | 
			
		||||
	else
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		if [ "$valid_ip4" = "ok" ]; then
 | 
			
		||||
			iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
			*mangle
 | 
			
		||||
			-A omr-bypass -s $ip -j MARK --set-mark 0x539$intfid
 | 
			
		||||
			COMMIT
 | 
			
		||||
			EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		elif [ "$valid_ip6" = "ok" ]; then
 | 
			
		||||
			ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
			*mangle
 | 
			
		||||
			-A omr-bypass6 -s $ip -j MARK --set-mark 0x6539$intfid
 | 
			
		||||
			COMMIT
 | 
			
		||||
			EOF
 | 
			
		||||
		fi
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_bypass_dest_port() {
 | 
			
		||||
	local intf
 | 
			
		||||
	config_get dport $1 dport
 | 
			
		||||
	config_get proto $1 proto
 | 
			
		||||
	config_get intf $1 interface
 | 
			
		||||
	local intfid="$(uci -q get omr-bypass.$intf.id)"
 | 
			
		||||
 | 
			
		||||
	[ -z "$intf" ] && intf="all"
 | 
			
		||||
	[ -z "$dport" ] && return
 | 
			
		||||
	[ -z "$proto" ] && return
 | 
			
		||||
	if [ "$intf" = "all" ]; then
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass --protocol $proto --destination-port $dport -j MARK --set-mark 0x539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6 --protocol $proto --destination-port $dport -j MARK --set-mark 0x6539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	else
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass --protocol $proto --destination-port $dport -j MARK --set-mark 0x539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6 --protocol $proto --destination-port $dport -j MARK --set-mark 0x6539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_bypass_proto() {
 | 
			
		||||
| 
						 | 
				
			
			@ -139,23 +198,23 @@ _bypass_proto() {
 | 
			
		|||
	[ -z "$intf" ] && intf="all"
 | 
			
		||||
	[ -z "$proto" ] && return
 | 
			
		||||
	if [ "$intf" = "all" ]; then
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass-dpi -m ndpi --proto $proto -j MARK --set-mark 0x539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6-dpi -m ndpi --proto $proto -j MARK --set-mark 0x6539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	else
 | 
			
		||||
		iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass-dpi -m ndpi --proto $proto -j MARK --set-mark 0x539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
		ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
		ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass6-dpi -m ndpi --proto $proto -j MARK --set-mark 0x6539$intfid
 | 
			
		||||
		COMMIT
 | 
			
		||||
| 
						 | 
				
			
			@ -185,7 +244,8 @@ _intf_rule() {
 | 
			
		|||
	[ -z "$count" ] && return
 | 
			
		||||
	[ -z "$intf" ] && return
 | 
			
		||||
	[ "$(echo $1 | grep _dev)" != "" ] && return
 | 
			
		||||
	[ -z "$RELOAD" ] && {
 | 
			
		||||
	[ -z "$RELOAD" ] || [ "$(ipset --list | grep omr_dst_bypass_$intf)" = "" ] && {
 | 
			
		||||
		unset RELOAD
 | 
			
		||||
		ipset -q flush omr_dst_bypass_$intf > /dev/null 2>&1
 | 
			
		||||
		ipset -q flush omr6_dst_bypass_$intf > /dev/null 2>&1
 | 
			
		||||
		ipset -q --exist restore <<-EOF
 | 
			
		||||
| 
						 | 
				
			
			@ -211,15 +271,15 @@ _intf_rule() {
 | 
			
		|||
			ip -6 rule add prio 1 fwmark 0x6539$count lookup 6$count > /dev/null 2>&1
 | 
			
		||||
		fi
 | 
			
		||||
	}
 | 
			
		||||
	if [ "$(iptables -w 40 -t mangle -L | grep omr_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		iptables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(iptables --wait=40 -t mangle -L -n | grep omr_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		iptables-restore -w --wait=60 --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-I omr-bypass 1 -m set --match-set omr_dst_bypass_$intf dst -j MARK --set-mark 0x539$count
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$(iptables -w 40 -t nat -L | grep ss_rules_pre_src)" != "" ] && [ "$(iptables -w 40 -t nat -L | grep omr_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		iptables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(iptables --wait=40 -t nat -L -n | grep ss_rules_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep omr_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		iptables-restore -w --wait=60 --noflush <<-EOF
 | 
			
		||||
		*nat
 | 
			
		||||
		-I ss_rules_dst 1 -m set --match-set omr_dst_bypass_$intf dst -j RETURN
 | 
			
		||||
		-I ss_rules_local_out 1 -m set --match-set omr_dst_bypass_$intf dst -j RETURN
 | 
			
		||||
| 
						 | 
				
			
			@ -229,15 +289,15 @@ _intf_rule() {
 | 
			
		|||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$(ip6tables -w 40 -t mangle -L | grep omr6_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		ip6tables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(ip6tables --wait=40 -t mangle -L | 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 -w 40 -t nat -L | grep ss_rules6_pre_src)" != "" ] && [ "$(ip6tables -w 40 -t nat -L | grep omr6_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		ip6tables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(ip6tables --wait=40 -t nat -L | grep ss_rules6_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L | grep omr6_dst_bypass_$intf)" = "" ]; then
 | 
			
		||||
		ip6tables-restore -w --wait=60 --noflush <<-EOF
 | 
			
		||||
		*nat
 | 
			
		||||
		-I ss_rules6_dst 1 -m set --match-set omr6_dst_bypass_$intf dst -j RETURN
 | 
			
		||||
		-I ss_rules6_local_out 1 -m set --match-set omr6_dst_bypass_$intf dst -j RETURN
 | 
			
		||||
| 
						 | 
				
			
			@ -272,6 +332,11 @@ _bypass_asn() {
 | 
			
		|||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bypass_asn() {
 | 
			
		||||
	config_load omr-bypass
 | 
			
		||||
	config_foreach _bypass_asn asns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_bypass_omr_server() {
 | 
			
		||||
	local ip
 | 
			
		||||
	config_get ip $1 ip
 | 
			
		||||
| 
						 | 
				
			
			@ -286,6 +351,12 @@ boot() {
 | 
			
		|||
start_service() {
 | 
			
		||||
	#local count
 | 
			
		||||
	logger -t "omr-bypass" "Starting OMR-ByPass..."
 | 
			
		||||
	config_load omr-bypass
 | 
			
		||||
	config_foreach _add_proto proto
 | 
			
		||||
 | 
			
		||||
	[ -n "$RELOAD" ] && [ "$(ipset --list | grep omr_dst_bypass_all)" = "" ] && {
 | 
			
		||||
		unset RELOAD
 | 
			
		||||
	}
 | 
			
		||||
	[ -z "$RELOAD" ] && {
 | 
			
		||||
		ipset -q flush omr_dst_bypass_all > /dev/null 2>&1
 | 
			
		||||
		ipset -q flush omr6_dst_bypass_all > /dev/null 2>&1
 | 
			
		||||
| 
						 | 
				
			
			@ -294,26 +365,23 @@ start_service() {
 | 
			
		|||
		create omr6_dst_bypass_all hash:net family inet6 hashsize 64
 | 
			
		||||
		EOF
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass | iptables-restore --counters
 | 
			
		||||
	iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass | iptables-restore -w --counters
 | 
			
		||||
	iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
	*mangle
 | 
			
		||||
	:omr-bypass -
 | 
			
		||||
	-I PREROUTING 1 -m addrtype ! --dst-type LOCAL -j omr-bypass
 | 
			
		||||
	COMMIT
 | 
			
		||||
	EOF
 | 
			
		||||
	ip6tables-save --counters | grep -v omr-bypass6 | ip6tables-restore --counters
 | 
			
		||||
	ip6tables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
	ip6tables-save --counters | grep -v omr-bypass6 | ip6tables-restore -w --counters
 | 
			
		||||
	ip6tables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
	*mangle
 | 
			
		||||
	:omr-bypass6 -
 | 
			
		||||
	-I PREROUTING 1 -m addrtype ! --dst-type LOCAL -j omr-bypass6
 | 
			
		||||
	COMMIT
 | 
			
		||||
	EOF
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	config_load network
 | 
			
		||||
	config_foreach _intf_rule interface
 | 
			
		||||
 | 
			
		||||
	local ndpi_rules=""
 | 
			
		||||
	config_load openmptcprouter
 | 
			
		||||
	config_foreach _bypass_omr_server server
 | 
			
		||||
| 
						 | 
				
			
			@ -321,6 +389,7 @@ start_service() {
 | 
			
		|||
	config_foreach _bypass_ip_set ips
 | 
			
		||||
	config_foreach _bypass_mac macs
 | 
			
		||||
	config_foreach _bypass_lan_ip lan_ip
 | 
			
		||||
	config_foreach _bypass_dest_port dest_port
 | 
			
		||||
	config_foreach _bypass_asn asns
 | 
			
		||||
	dnsmasqipset=$(uci -q get dhcp.@dnsmasq[0].ipset | sed 's/ /\n/g' | grep -v dst_bypass)
 | 
			
		||||
	uci -q delete dhcp.@dnsmasq[0].ipset
 | 
			
		||||
| 
						 | 
				
			
			@ -346,15 +415,15 @@ start_service() {
 | 
			
		|||
	ip rule add prio 1 fwmark 0x539 lookup 991337 > /dev/null 2>&1
 | 
			
		||||
	ip -6 rule add prio 1 fwmark 0x6539 lookup 6991337 > /dev/null 2>&1
 | 
			
		||||
 | 
			
		||||
	if [ "$(iptables -w 40 -t mangle -L | grep 'match-set omr_dst_bypass_all dst MARK set')" = "" ]; then
 | 
			
		||||
		iptables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(iptables --wait=40 -t mangle -L -n | grep 'match-set omr_dst_bypass_all dst MARK set')" = "" ]; then
 | 
			
		||||
		iptables-restore -w --wait=60 --noflush <<-EOF
 | 
			
		||||
		*mangle
 | 
			
		||||
		-A omr-bypass -m set --match-set omr_dst_bypass_all dst -j MARK --set-mark 0x539
 | 
			
		||||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$(iptables -w 40 -t nat -L | grep ss_rules_pre_src)" != "" ] && [ "$(iptables -w 40 -t nat -L | grep omr_dst_bypass_all)" = "" ]; then
 | 
			
		||||
		iptables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
	if [ "$(iptables --wait=40 -t nat -L -n | grep ss_rules_pre_src)" != "" ] && [ "$(iptables --wait=40 -t nat -L -n | grep omr_dst_bypass_all)" = "" ]; then
 | 
			
		||||
		iptables-restore -w --wait=60 --noflush <<-EOF
 | 
			
		||||
		*nat
 | 
			
		||||
		-I ss_rules_dst 1 -m set --match-set omr_dst_bypass_all dst -j RETURN
 | 
			
		||||
		-I ss_rules_local_out 1 -m set --match-set omr_dst_bypass_all dst -j RETURN
 | 
			
		||||
| 
						 | 
				
			
			@ -364,14 +433,14 @@ start_service() {
 | 
			
		|||
		COMMIT
 | 
			
		||||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
	if [ "$(ip6tables -w 40 -t mangle -L | grep 'match-set omr6_dst_bypass_all dst MARK set')" = "" ]; then
 | 
			
		||||
	if [ "$(ip6tables --wait=40 -t mangle -L | grep 'match-set omr6_dst_bypass_all dst MARK set')" = "" ]; then
 | 
			
		||||
		ip6tables-restore --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 -w 40 -t nat -L | grep ss_rules6_pre_src)" != "" ] && [ "$(ip6tables -w 40 -t nat -L | grep omr6_dst_bypass_all)" = "" ]; then
 | 
			
		||||
	if [ "$(ip6tables --wait=40 -t nat -L | grep ss_rules6_pre_src)" != "" ] && [ "$(ip6tables --wait=40 -t nat -L | grep omr6_dst_bypass_all)" = "" ]; then
 | 
			
		||||
		ip6tables-restore --wait=60 --noflush <<-EOF
 | 
			
		||||
		*nat
 | 
			
		||||
		-I ss_rules6_dst 1 -m set --match-set omr6_dst_bypass_all dst -j RETURN
 | 
			
		||||
| 
						 | 
				
			
			@ -383,8 +452,8 @@ start_service() {
 | 
			
		|||
		EOF
 | 
			
		||||
	fi
 | 
			
		||||
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass-dpi | iptables-restore --counters
 | 
			
		||||
	iptables-restore --wait=60  --noflush <<-EOF
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass-dpi | iptables-restore -w --counters
 | 
			
		||||
	iptables-restore -w --wait=60  --noflush <<-EOF
 | 
			
		||||
	*mangle
 | 
			
		||||
	:omr-bypass-dpi -
 | 
			
		||||
	-A PREROUTING -m addrtype ! --dst-type LOCAL -j omr-bypass-dpi
 | 
			
		||||
| 
						 | 
				
			
			@ -402,16 +471,22 @@ start_service() {
 | 
			
		|||
	config_load omr-bypass
 | 
			
		||||
	config_foreach _bypass_proto dpis
 | 
			
		||||
 | 
			
		||||
	[ -z "$RELOAD" ] && /etc/init.d/dnsmasq restart
 | 
			
		||||
	[ -n "$RELOAD" ] && /etc/init.d/dnsmasq restart
 | 
			
		||||
	[ -z "$RELOAD" ] && {
 | 
			
		||||
		logger -t "omr-bypass" "Restart dnsmasq..."
 | 
			
		||||
		/etc/init.d/dnsmasq restart
 | 
			
		||||
	}
 | 
			
		||||
	[ -n "$RELOAD" ] && {
 | 
			
		||||
		logger -t "omr-bypass" "Reload dnsmasq..."
 | 
			
		||||
		/etc/init.d/dnsmasq reload
 | 
			
		||||
	}
 | 
			
		||||
	logger -t "omr-bypass" "OMR-ByPass is running"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
stop_service() {
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass | iptables-restore --counters
 | 
			
		||||
	iptables-save --counters | grep -v omr_dst | iptables-restore --counters
 | 
			
		||||
	ip6tables-save --counters | grep -v omr-bypass6 | ip6tables-restore --counters
 | 
			
		||||
	ip6tables-save --counters | grep -v omr6_dst | ip6tables-restore --counters
 | 
			
		||||
	iptables-save --counters | grep -v omr-bypass | iptables-restore -w --counters
 | 
			
		||||
	iptables-save --counters | grep -v omr_dst | iptables-restore -w --counters
 | 
			
		||||
	ip6tables-save --counters | grep -v omr-bypass6 | ip6tables-restore -w --counters
 | 
			
		||||
	ip6tables-save --counters | grep -v omr6_dst | ip6tables-restore -w --counters
 | 
			
		||||
	for setname in $(ipset -n list | grep "omr_"); do
 | 
			
		||||
		ipset destroy "$setname" 2>/dev/null || true
 | 
			
		||||
	done
 | 
			
		||||
| 
						 | 
				
			
			@ -424,6 +499,10 @@ service_triggers() {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
reload_service() {
 | 
			
		||||
	start
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
reload_rules() {
 | 
			
		||||
	[ "$( ipset -n list | grep omr_ )" = "" ] && return 0
 | 
			
		||||
	RELOAD=1
 | 
			
		||||
	start
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,5 +64,26 @@ if [ "$(uci -q get firewall.omr-bypass)" = "" ]; then
 | 
			
		|||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$(uci -q get omr-bypass.m6replay)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set omr-bypass.m6replay=proto
 | 
			
		||||
		add_list omr-bypass.m6replay.url='m6web.fr'
 | 
			
		||||
		add_list omr-bypass.m6replay.url='6play.fr'
 | 
			
		||||
		add_list omr-bypass.m6replay.url='6cloud.fr'
 | 
			
		||||
		commit omr-bypass
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get omr-bypass.lesnumeriques)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set omr-bypass.lesnumeriques=proto
 | 
			
		||||
		add_list omr-bypass.lesnumeriques.url='lesnumeriques.com'
 | 
			
		||||
		add_list omr-bypass.lesnumeriques.url='botscorner.com'
 | 
			
		||||
		add_list omr-bypass.lesnumeriques.url='app.botscorner.com'
 | 
			
		||||
		commit omr-bypass
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ ! -f /etc/crontabs/root ] || [ "$(cat /etc/crontabs/root | grep bypass)" = "" ]; then
 | 
			
		||||
	echo "0 2 * * * /etc/init.d/omr-bypass bypass_asn" >> /etc/crontabs/root
 | 
			
		||||
fi
 | 
			
		||||
rm -f /tmp/luci-indexcache
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ LUCI_TITLE:=LuCI Interface to DSCP
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,10 +22,10 @@ t:value("cs0", translate("CS0 - Normal/Best Effort"))
 | 
			
		|||
t:value("cs1", translate("CS1 - Low priority"))
 | 
			
		||||
t:value("cs2", translate("CS2 - High priority"))
 | 
			
		||||
t:value("cs3", translate("CS3 - SIP"))
 | 
			
		||||
t:value("cs4", translate("CS4 - Streaming video"))
 | 
			
		||||
t:value("cs5", translate("CS5"))
 | 
			
		||||
t:value("cs4", translate("CS4 - Real-Time Interactive"))
 | 
			
		||||
t:value("cs5", translate("CS5 - Broadcast video"))
 | 
			
		||||
t:value("cs6", translate("CS6 - Network routing"))
 | 
			
		||||
t:value("cs7", translate("CS7"))
 | 
			
		||||
t:value("cs7", translate("CS7 - Latency sensitive"))
 | 
			
		||||
t:value("ef", translate("EF Voice"))
 | 
			
		||||
 | 
			
		||||
c = s:option(Value, "comment", translate("Comment"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
-- Copyright 2008 Steven Barth <steven@midlink.org>
 | 
			
		||||
-- Copyright 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local uci = luci.model.uci.cursor()
 | 
			
		||||
| 
						 | 
				
			
			@ -73,10 +74,10 @@ t = s:option(ListValue, "class", translate("Class"))
 | 
			
		|||
	t:value("cs1", translate("CS1 - Low priority"))
 | 
			
		||||
	t:value("cs2", translate("CS2 - High priority"))
 | 
			
		||||
	t:value("cs3", translate("CS3 - SIP"))
 | 
			
		||||
	t:value("cs4", translate("CS4 - Streaming video"))
 | 
			
		||||
	t:value("cs5", translate("CS5"))
 | 
			
		||||
	t:value("cs4", translate("CS4 - Real-Time Interactive"))
 | 
			
		||||
	t:value("cs5", translate("CS5 - Broadcast Video"))
 | 
			
		||||
	t:value("cs6", translate("CS6 - Network routing"))
 | 
			
		||||
	t:value("cs7", translate("CS7"))
 | 
			
		||||
	t:value("cs7", translate("CS7 - Latency sensitive"))
 | 
			
		||||
	t:value("ef", translate("EF - Voice"))
 | 
			
		||||
 | 
			
		||||
comment = s:option(Value, "comment", translate("Comment"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										157
									
								
								luci-app-omr-dscp/po/fr/omr-dscp.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										157
									
								
								luci-app-omr-dscp/po/fr/omr-dscp.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,157 @@
 | 
			
		|||
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"
 | 
			
		||||
"Language: fr\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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:26
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:77
 | 
			
		||||
msgid "CS5"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 "Règles de classification"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:31
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:82
 | 
			
		||||
msgid "Comment"
 | 
			
		||||
msgstr "Commentaire"
 | 
			
		||||
 | 
			
		||||
#: 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 "DSCP Domaines"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
 | 
			
		||||
msgid "DSCP by domain"
 | 
			
		||||
msgstr "DSCP par domaine"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:57
 | 
			
		||||
msgid "Destination host"
 | 
			
		||||
msgstr "Hôte de destination"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:63
 | 
			
		||||
msgid "Destination ports"
 | 
			
		||||
msgstr "Ports de destination"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:10
 | 
			
		||||
msgid "Differentiated services"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 "Domaine"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:10
 | 
			
		||||
msgid "Domains"
 | 
			
		||||
msgstr "Domaines"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:80
 | 
			
		||||
msgid "EF - Voice"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:29
 | 
			
		||||
msgid "EF Voice"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 "Protocole"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
 | 
			
		||||
msgid "Set DSCP by domains."
 | 
			
		||||
msgstr "Configurer DSCP par domaine"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:46
 | 
			
		||||
msgid "Source host"
 | 
			
		||||
msgstr "Hôte source"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:51
 | 
			
		||||
msgid "Source ports"
 | 
			
		||||
msgstr "Ports source"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 "Tous"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:33
 | 
			
		||||
msgid "both"
 | 
			
		||||
msgstr "Les deux"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:32
 | 
			
		||||
msgid "download"
 | 
			
		||||
msgstr "Téléchargement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:31
 | 
			
		||||
msgid "upload"
 | 
			
		||||
msgstr "Envoie"
 | 
			
		||||
							
								
								
									
										146
									
								
								luci-app-omr-dscp/po/templates/omr-dscp.pot
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								luci-app-omr-dscp/po/templates/omr-dscp.pot
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,146 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:26
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:77
 | 
			
		||||
msgid "CS5"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:15
 | 
			
		||||
msgid "Classification Rules"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:31
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:82
 | 
			
		||||
msgid "Comment"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
 | 
			
		||||
msgid "DSCP by domain"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:57
 | 
			
		||||
msgid "Destination host"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:63
 | 
			
		||||
msgid "Destination ports"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:10
 | 
			
		||||
msgid "Differentiated services"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:10
 | 
			
		||||
msgid "Domains"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:80
 | 
			
		||||
msgid "EF - Voice"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:29
 | 
			
		||||
msgid "EF Voice"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp-domains.lua:8
 | 
			
		||||
msgid "Set DSCP by domains."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:46
 | 
			
		||||
msgid "Source host"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:51
 | 
			
		||||
msgid "Source ports"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:33
 | 
			
		||||
msgid "both"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:32
 | 
			
		||||
msgid "download"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-dscp/luasrc/model/cbi/dscp.lua:31
 | 
			
		||||
msgid "upload"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,20 @@ config classify
 | 
			
		|||
        option src_port '53,5353'
 | 
			
		||||
        option comment 'DNS tcp'
 | 
			
		||||
 | 
			
		||||
config classify
 | 
			
		||||
        option direction 'both'
 | 
			
		||||
        option proto 'tcp'
 | 
			
		||||
        option class 'cs6'
 | 
			
		||||
        option dest_port '65001,65301,65011'
 | 
			
		||||
        option comment 'OMR vpn'
 | 
			
		||||
 | 
			
		||||
config classify
 | 
			
		||||
        option direction 'both'
 | 
			
		||||
        option proto 'udp'
 | 
			
		||||
        option class 'cs6'
 | 
			
		||||
        option dest_port '65001'
 | 
			
		||||
        option comment 'OMR vpn'
 | 
			
		||||
 | 
			
		||||
config domains
 | 
			
		||||
        option name 'googlevideo.com'
 | 
			
		||||
        option class 'cs4'
 | 
			
		||||
| 
						 | 
				
			
			@ -59,7 +73,7 @@ config domains
 | 
			
		|||
        option comment 'VeVo'
 | 
			
		||||
 | 
			
		||||
config domains
 | 
			
		||||
        option name 'audio-fa.scdn.cot'
 | 
			
		||||
        option name 'audio-fa.scdn.com'
 | 
			
		||||
        option class 'cs4'
 | 
			
		||||
        option comment 'Spotify'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,6 +9,7 @@ LUCI_DEPENDS:=+omr-quota
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,43 +1,60 @@
 | 
			
		|||
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"
 | 
			
		||||
"Language-Team: \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"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:8
 | 
			
		||||
msgid "Add"
 | 
			
		||||
msgstr "Ajouter"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr "Activé"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
 | 
			
		||||
msgid "Interfaces"
 | 
			
		||||
msgstr "Interfaces"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:33
 | 
			
		||||
msgid "Interval between check (s)"
 | 
			
		||||
msgstr "Intervalle entre les essais (s)"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:9
 | 
			
		||||
msgid "Invalid"
 | 
			
		||||
msgstr "Invalide"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
 | 
			
		||||
msgid "Monthly Quota"
 | 
			
		||||
msgstr "Quota mensuel"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
msgid "Set quota, when quota is reached interface state is set to down"
 | 
			
		||||
msgstr "Configurer le quota, quand le quota est atteint l'interface est désactivée"
 | 
			
		||||
#: 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 "Configurer le quota menseul, quand le quota est atteint l'interface est désactivée"
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#~ msgid "Set quota, when quota is reached interface state is set to down"
 | 
			
		||||
#~ msgstr "Configurer le quota, quand le quota est atteint l'interface est désactivée"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,32 +1,46 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:8
 | 
			
		||||
msgid "Add"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:21
 | 
			
		||||
msgid "Enable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:10
 | 
			
		||||
msgid "Interfaces"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:33
 | 
			
		||||
msgid "Interval between check (s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/view/omr-quota/cbi-select-add.htm:9
 | 
			
		||||
msgid "Invalid"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-omr-quota/luasrc/model/cbi/quota/quota.lua:8
 | 
			
		||||
msgid "Monthly Quota"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
msgid "Set quota, when quota is reached interface state is set to down"
 | 
			
		||||
#: 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 ""
 | 
			
		||||
 | 
			
		||||
#: 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 ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ LUCI_DEPENDS:=+omr-tracker
 | 
			
		|||
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ o.default     = false
 | 
			
		|||
o.disabled    = 0
 | 
			
		||||
o.enabled     = 1
 | 
			
		||||
 | 
			
		||||
o = s:option(DynamicList, "hosts", translate("Hosts"))
 | 
			
		||||
o = s:option(DynamicList, "hosts", translate("Hosts"),translate("Must be IPs and not domains"))
 | 
			
		||||
o.placeholder = "4.2.2.1"
 | 
			
		||||
o.default     = { "4.2.2.1", "8.8.8.8" }
 | 
			
		||||
o.rmempty     = false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,8 @@ LUCI_TITLE:=LuCI Support for OpenMPTCProuter
 | 
			
		|||
LUCI_DEPENDS:=+luci-lib-json +rdisc6 +curl +bind-dig +tracebox
 | 
			
		||||
PKG_LICENSE:=GPLv3
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
#include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
define Package/luci-app-openmptcprouter/conffiles
 | 
			
		||||
/etc/sysctl.d/zzz_openmptcprouter.conf
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -0,0 +1,36 @@
 | 
			
		|||
<%+header%>
 | 
			
		||||
<%
 | 
			
		||||
luci.sys.call("/etc/init.d/openmptcprouter-vps backup_list >/dev/null 2>/dev/null")
 | 
			
		||||
%>
 | 
			
		||||
<% if stderr and #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
 | 
			
		||||
<form class="inline" method="post" action="<%=url('admin/system/openmptcprouter/backupgr')%>">
 | 
			
		||||
    <div class="cbi-map">
 | 
			
		||||
	<h2 name="content"><%:Backup on server%></h2>
 | 
			
		||||
	<fieldset class="cbi-section" id="networks">
 | 
			
		||||
		<input type="hidden" name="token" value="<%=token%>" />
 | 
			
		||||
		<%
 | 
			
		||||
		    uci:foreach("openmptcprouter","server", function(s)
 | 
			
		||||
			servername = s[".name"]
 | 
			
		||||
		%>
 | 
			
		||||
		<h3><%=servername%></h3>
 | 
			
		||||
		<%
 | 
			
		||||
		    if luci.model.uci.cursor():get("openmptcprouter",servername,"lastbackup") ~= nil then
 | 
			
		||||
		%>
 | 
			
		||||
			<div class="cbi-section-node">
 | 
			
		||||
				<%:Last available backup on server:%> <%=os.date('%d-%b-%Y', luci.model.uci.cursor():get("openmptcprouter",servername,"lastbackup"))%>
 | 
			
		||||
			</div>
 | 
			
		||||
		<% else %>
 | 
			
		||||
			<div class="cbi-section-node">
 | 
			
		||||
				<%:No available backup on server.%>
 | 
			
		||||
			</div>
 | 
			
		||||
		<% end %>
 | 
			
		||||
	    <%
 | 
			
		||||
		end)
 | 
			
		||||
	    %>
 | 
			
		||||
		<input type="submit" class="cbi-button cbi-button-action important" name="restore" value="<%:Restore backup%>"/>
 | 
			
		||||
		<input type="submit" class="cbi-button cbi-button-action important" name="save" value="<%:Send backup%>"/>
 | 
			
		||||
 | 
			
		||||
	</fieldset>
 | 
			
		||||
    </div>
 | 
			
		||||
</form>
 | 
			
		||||
<%+footer%>
 | 
			
		||||
| 
						 | 
				
			
			@ -1,12 +1,10 @@
 | 
			
		|||
<%+header%>
 | 
			
		||||
 | 
			
		||||
<% if stderr and #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
 | 
			
		||||
<form class="inline" method="post" action="<%=url('admin/system/openmptcprouter/update_vps')%>">
 | 
			
		||||
    <div class="cbi-map">
 | 
			
		||||
	<h2 name="content"><%:All OpenMPTCProuter settings%></h2>
 | 
			
		||||
<div class="cbi-map">
 | 
			
		||||
    <h2 name="content"><%:All router settings%></h2>
 | 
			
		||||
    <div class="cbi-section">
 | 
			
		||||
        <pre><%=luci.sys.exec("uci show")%></pre>
 | 
			
		||||
    </div>
 | 
			
		||||
    </div>
 | 
			
		||||
</form>
 | 
			
		||||
</div>
 | 
			
		||||
<%+footer%>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,9 +17,9 @@
 | 
			
		|||
    <div class="cbi-map">
 | 
			
		||||
	<h2 name="content"><%:Update VPS%></h2>
 | 
			
		||||
	<fieldset class="cbi-section" id="update">
 | 
			
		||||
	<div class="cbi-section-descr"><%:Update remotly OpenMPTCProuter server to latest version when needed.%> <b><%:Beta%></b></div>
 | 
			
		||||
	<div class="cbi-section-descr"><%:Update remotly the server to latest version when needed.%> <b><%:Beta%></b></div>
 | 
			
		||||
	<div class="cbi-value">
 | 
			
		||||
	    <label class="cbi-value-title"><%:Update OpenMPTCProuter server%></label>
 | 
			
		||||
	    <label class="cbi-value-title"><%:Update server%></label>
 | 
			
		||||
	    <div class="cbi-value-field">
 | 
			
		||||
		<input type="hidden" name="token" value="<%=token%>" />
 | 
			
		||||
		<input type="hidden" name="server" value="<%=servername%>" />
 | 
			
		||||
| 
						 | 
				
			
			@ -47,25 +47,32 @@
 | 
			
		|||
	    <div class="cbi-section-node">
 | 
			
		||||
		<div class="cbi-section-descr"></div>
 | 
			
		||||
		<div class="cbi-value">
 | 
			
		||||
		    <label class="cbi-value-title"><%:Redirects all ports from server to OpenMPTCProuter%></label>
 | 
			
		||||
		    <label class="cbi-value-title"><%:Redirects all ports from server to this router%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<input type="hidden" name="server.<%=servername%>" value="<%=servername%>" />
 | 
			
		||||
			<input type="checkbox" name="redirect_ports.<%=servername%>" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter",servername,"redirect_ports") == "1" then %>checked<% end %>>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value">
 | 
			
		||||
		    <label class="cbi-value-title"><%:Disable ports redirection defined in firewall from server to this router%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<input type="hidden" name="server.<%=servername%>" value="<%=servername%>" />
 | 
			
		||||
			<input type="checkbox" name="nofwredirect.<%=servername%>" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter",servername,"nofwredirect") == "1" then %>checked<% end %>>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <%
 | 
			
		||||
		end)
 | 
			
		||||
	    %>
 | 
			
		||||
	    <%
 | 
			
		||||
		local obfs_installed = nixio.fs.access("/usr/bin/obfs-local")
 | 
			
		||||
		local v2ray_installed = nixio.fs.access("/usr/bin/obfs-local")
 | 
			
		||||
		local v2ray_installed = nixio.fs.access("/usr/bin/v2ray-plugin")
 | 
			
		||||
		if obfs_installed or v2ray_installed then
 | 
			
		||||
	    %>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Enable ShadowSocks Obfuscating%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="checkbox" name="obfs" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("shadowsocks-libev","tracker","obfs") == "1" then %>checked<% end %>>
 | 
			
		||||
		    <input type="checkbox" name="obfs" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("shadowsocks-libev","sss0","obfs") == "1" then %>checked<% end %>>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Obfuscating will be enabled on both side%>
 | 
			
		||||
| 
						 | 
				
			
			@ -79,12 +86,12 @@
 | 
			
		|||
			<%
 | 
			
		||||
			    if v2ray_installed then
 | 
			
		||||
			%>
 | 
			
		||||
			<option value="v2ray" <% if luci.model.uci.cursor():get("shadowsocks-libev","tracker","obfs_plugin") == "v2ray" then %>selected="selected"<% end %>>v2ray</option>
 | 
			
		||||
			<option value="v2ray" <% if luci.model.uci.cursor():get("shadowsocks-libev","sss0","obfs_plugin") == "v2ray" then %>selected="selected"<% end %>>v2ray</option>
 | 
			
		||||
			<%
 | 
			
		||||
			    end
 | 
			
		||||
			    if obfs_installed then
 | 
			
		||||
			%>
 | 
			
		||||
			<option value="obfs" <% if luci.model.uci.cursor():get("shadowsocks-libev","tracker","obfs_plugin") == "obfs" then %>selected="selected"<% end %>>simple-obfs</option>
 | 
			
		||||
			<option value="obfs-simple" <% if luci.model.uci.cursor():get("shadowsocks-libev","sss0","obfs_plugin") == "obfs-simple" then %>selected="selected"<% end %>>simple-obfs</option>
 | 
			
		||||
			<%
 | 
			
		||||
			    end
 | 
			
		||||
			%>
 | 
			
		||||
| 
						 | 
				
			
			@ -147,6 +154,46 @@
 | 
			
		|||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Disable TCP Fast Open%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="checkbox" name="disablefastopen" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter","settings","disable_fastopen") == "1" then %>checked<% end %>>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Disable TCP Fast Open on Linux and Shadowsocks configuration%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </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 %>>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Save vnstats statistics on disk%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Disable gateway ping%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="checkbox" name="disablegwping" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter","settings","disablegwping") == "1" then %>checked<% end %>>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Disable gateway ping status check%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Disable server ping%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="checkbox" name="disableserverping" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter","settings","disableserverping") == "1" then %>checked<% end %>>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
			<%:Disable server ping status check%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Master interface selection%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
| 
						 | 
				
			
			@ -154,6 +201,7 @@
 | 
			
		|||
			<option value="change" <% if luci.model.uci.cursor():get("openmptcprouter","settings","master") == "change" then %>selected="selected"<% end %>><%:On wizard change%></option>
 | 
			
		||||
			<option value="dynamic" <% if luci.model.uci.cursor():get("openmptcprouter","settings","master") == "dynamic" then %>selected="selected"<% end %>><%:Dynamic change%></option>
 | 
			
		||||
			<option value="static" <% if luci.model.uci.cursor():get("openmptcprouter","settings","master") == "static" then %>selected="selected"<% end %>><%:No change%></option>
 | 
			
		||||
			<option value="redundant" <% if luci.model.uci.cursor():get("openmptcprouter","settings","master") == "redundant" then %>selected="selected"<% end %>><%:Redundant%></option>
 | 
			
		||||
		    </select>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,8 +40,20 @@
 | 
			
		|||
		var b = document.cookie.match('(^|;)\\s*' + a + '\\s*=\\s*([^;]+)');
 | 
			
		||||
		return b ? b.pop() : '';
 | 
			
		||||
	}
 | 
			
		||||
	function testPrivateIP(ip) {
 | 
			
		||||
		if ( (/^(10)\.(.*)\.(.*)\.(.*)$/.test(ip)) || (/^(172)\.(1[6-9]|2[0-9]|3[0-1])\.(.*)\.(.*)$/.test(ip)) || (/^(192)\.(168)\.(.*)\.(.*)$/.test(ip)) ){
 | 
			
		||||
			return true;
 | 
			
		||||
		} else {
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	XHR.poll(20, '/cgi-bin/luci/admin/system/openmptcprouter/interfaces_status', null,
 | 
			
		||||
		function(x, mArray)
 | 
			
		||||
		{
 | 
			
		||||
			var status = document.getElementById('openmptcprouter_status');
 | 
			
		||||
			var temp = '<figure class="tree">';
 | 
			
		||||
			temp += '<ul>';
 | 
			
		||||
			if (mArray !== null && mArray.openmptcprouter)
 | 
			
		||||
			{
 | 
			
		||||
				anonymize=getCookieValue("anonymize");
 | 
			
		||||
				if (anonymize == "true")
 | 
			
		||||
| 
						 | 
				
			
			@ -49,27 +61,31 @@
 | 
			
		|||
					mArray.openmptcprouter.wan_addr=replaceLastNChars(mArray.openmptcprouter.wan_addr,"x",6);
 | 
			
		||||
					mArray.openmptcprouter.wan_addr6=replaceLastNChars(mArray.openmptcprouter.wan_addr6,"x",10);
 | 
			
		||||
					mArray.openmptcprouter.service_addr=replaceLastNChars(mArray.openmptcprouter.service_addr,"x",6);
 | 
			
		||||
					document.getElementById("anon").checked = true;
 | 
			
		||||
				}
 | 
			
		||||
			var status = document.getElementById('openmptcprouter_status');
 | 
			
		||||
			var temp = '<figure class="tree">';
 | 
			
		||||
			temp += '<ul>';
 | 
			
		||||
			if (mArray !== null && mArray.openmptcprouter)
 | 
			
		||||
			{
 | 
			
		||||
				temp += '<li class="remote-from-lease">';
 | 
			
		||||
				temp += '<a href="#">';
 | 
			
		||||
 | 
			
		||||
				var equipmentIcon = '<img src="<%=resource%>/computer.png" />';
 | 
			
		||||
				if (mArray.openmptcprouter.remote_from_lease)
 | 
			
		||||
				if (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)
 | 
			
		||||
					if (mArray.openmptcprouter.remote_from_lease == false)
 | 
			
		||||
					{
 | 
			
		||||
						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');
 | 
			
		||||
					} else {
 | 
			
		||||
						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 = "";
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					var title = String.format("You (%s)", mArray.openmptcprouter.remote_addr);
 | 
			
		||||
					var statusMessageClass = "warning";
 | 
			
		||||
					var statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
 | 
			
		||||
					var statusMessage = "Your IP was not leased by openmptcprouter";
 | 
			
		||||
					var title = String.format('<br /><strong>%s</strong>', _('Clients'))
 | 
			
		||||
					var statusMessageClass = "";
 | 
			
		||||
					var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
 | 
			
		||||
					var statusMessage = "";
 | 
			
		||||
				}
 | 
			
		||||
				var content = "";
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +102,7 @@
 | 
			
		|||
				}
 | 
			
		||||
				temp += '<tr><td></td></tr><tr><td><a href="#" id="omr">';
 | 
			
		||||
				var equipmentIcon = '<img src="<%=resource%>/overthebox.png" style:"top: 0px;" />';
 | 
			
		||||
				var title = String.format("OpenMPTCProuter (%s)", mArray.openmptcprouter.local_addr);
 | 
			
		||||
				var title = String.format("%s (%s)", mArray.openmptcprouter.hostname, mArray.openmptcprouter.local_addr);
 | 
			
		||||
				var statusMessageClass = "";
 | 
			
		||||
				var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
 | 
			
		||||
				var statusMessage = "";
 | 
			
		||||
| 
						 | 
				
			
			@ -98,24 +114,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) + " °";
 | 
			
		||||
					content += _('Core temp:') + " " + (mArray.openmptcprouter.core_temp / 1000).toFixed(1) + " °";
 | 
			
		||||
					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)
 | 
			
		||||
| 
						 | 
				
			
			@ -123,8 +139,8 @@
 | 
			
		|||
					for ( dhcpd in mArray.openmptcprouter.dhcpd )
 | 
			
		||||
					{
 | 
			
		||||
						var dhcp = mArray.openmptcprouter.dhcpd[dhcpd];
 | 
			
		||||
						content += String.format('<span style="text-transform:capitalize;">%s</span> address: %s<br />', dhcp.interface, dhcp.router);
 | 
			
		||||
						content += String.format('<span style="text-transform:capitalize;">%s</span> range: %s - %s<br />', dhcp.interface, 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);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -132,25 +148,25 @@
 | 
			
		|||
				{
 | 
			
		||||
					if (mArray.openmptcprouter.socks_service == false)
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += 'ShadowSocks is not running';
 | 
			
		||||
						statusMessage += _('ShadowSocks is not running');
 | 
			
		||||
						if (mArray.openmptcprouter.socks_service_key == false && mArray.openmptcprouter.socks_service_method !== "none")
 | 
			
		||||
						{
 | 
			
		||||
							statusMessage += ' <i>(empty key)</i>';
 | 
			
		||||
							statusMessage += ' <i>(' + _('empty key') + ')</i>';
 | 
			
		||||
						}
 | 
			
		||||
						statusMessage += '<br/>';
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				if (mArray.openmptcprouter.fsro == true)
 | 
			
		||||
				{
 | 
			
		||||
					statusMessage += 'Filesystem is readonly<br/>';
 | 
			
		||||
					statusMessage += _('Filesystem is readonly') + '<br/>';
 | 
			
		||||
				}
 | 
			
		||||
				if (mArray.openmptcprouter.tun_service == false)
 | 
			
		||||
				{
 | 
			
		||||
					statusMessage += 'GloryTUN 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 !== "")
 | 
			
		||||
| 
						 | 
				
			
			@ -160,20 +176,20 @@
 | 
			
		|||
				} else {
 | 
			
		||||
					if (mArray.openmptcprouter.socks_service_enabled == false)
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += 'ShadowSocks is DISABLED<br/>';
 | 
			
		||||
						statusMessage += _('ShadowSocks 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 += 'VPN IPv6 tunnel DOWN<br/>';
 | 
			
		||||
							statusMessage += _('VPN IPv6 tunnel DOWN') + '<br/>';
 | 
			
		||||
						} else if (mArray.openmptcprouter.wan_addr6 == '')
 | 
			
		||||
						{
 | 
			
		||||
							statusMessage += 'No IPv6 access<br/>';
 | 
			
		||||
							statusMessage += _('No IPv6 access') + '<br/>';
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if (statusMessage !== "")
 | 
			
		||||
| 
						 | 
				
			
			@ -190,32 +206,33 @@
 | 
			
		|||
				temp += '<a href="<%=url('admin/system/openmptcprouter/wizard')%>" id="omr-vps">';
 | 
			
		||||
				var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
 | 
			
		||||
				var equipmentIcon = '<img src="<%=resource%>/server.png" />';
 | 
			
		||||
				if (mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_addr)
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("OpenMPTCProuter Server (%s)", mArray.openmptcprouter.wan_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.wan_addr != "" && mArray.openmptcprouter.service_addr == "127.0.0.1")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("OpenMPTCProuter Server (%s)", mArray.openmptcprouter.wan_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.wan_addr != "")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("Direct output (%s)", mArray.openmptcprouter.wan_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.ss_addr != "" && mArray.openmptcprouter.vps_status != "DOWN")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("OpenMPTCProuter Server (%s)", mArray.openmptcprouter.ss_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.external_check == false) {
 | 
			
		||||
					var title = String.format("OpenMPTCProuter Server ?");
 | 
			
		||||
				} else {
 | 
			
		||||
					var title = "No output";
 | 
			
		||||
				}
 | 
			
		||||
				content = "";
 | 
			
		||||
				statusMessage = "";
 | 
			
		||||
				if (mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_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")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("%s (%s)", mArray.openmptcprouter.vps_hostname, mArray.openmptcprouter.wan_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.wan_addr != "")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("%s (%s)", _('Direct output'), mArray.openmptcprouter.wan_addr);
 | 
			
		||||
				} else if (mArray.openmptcprouter.ss_addr != "" && mArray.openmptcprouter.vps_status != "DOWN")
 | 
			
		||||
				{
 | 
			
		||||
					var title = String.format("%s (%s)", mArray.openmptcprouter.vps_hostname, mArray.openmptcprouter.ss_addr);
 | 
			
		||||
				} 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/>';
 | 
			
		||||
				}
 | 
			
		||||
				if (mArray.openmptcprouter.wan_addr == "" && mArray.openmptcprouter.ss_addr == "" && mArray.openmptcprouter.external_check == true)
 | 
			
		||||
				{
 | 
			
		||||
					statusMessage += 'No VPS IP address, No WAN IP address<br/>';
 | 
			
		||||
					statusMessage += _('No VPS IP address, No WAN IP address') + '<br/>';
 | 
			
		||||
				}
 | 
			
		||||
				if (mArray.openmptcprouter.wan_addr !== "" && mArray.openmptcprouter.vps_status == "DOWN")
 | 
			
		||||
				{
 | 
			
		||||
					statusMessage += 'Can\'t access and use OpenMPTCProuter server<br/>';
 | 
			
		||||
					statusMessage += _('Can\'t access and use server part') + '<br/>';
 | 
			
		||||
				}
 | 
			
		||||
				if (statusMessage !== "")
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -224,17 +241,17 @@
 | 
			
		|||
				}
 | 
			
		||||
				if (mArray.openmptcprouter.vps_status == "DOWN")
 | 
			
		||||
				{
 | 
			
		||||
					statusMessage += 'Can\'t ping server<br/>';
 | 
			
		||||
					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 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>';
 | 
			
		||||
| 
						 | 
				
			
			@ -243,7 +260,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/>';
 | 
			
		||||
				} 
 | 
			
		||||
				if (statusMessage !== "" && statusMessageClass !== "error")
 | 
			
		||||
				{
 | 
			
		||||
| 
						 | 
				
			
			@ -252,37 +273,37 @@
 | 
			
		|||
				}
 | 
			
		||||
				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 />';
 | 
			
		||||
				}
 | 
			
		||||
				content += '<br />';
 | 
			
		||||
| 
						 | 
				
			
			@ -291,7 +312,7 @@
 | 
			
		|||
				temp += '</a></td></tr></table>';
 | 
			
		||||
				temp += '</td>';
 | 
			
		||||
			}
 | 
			
		||||
			if (mArray.wans)
 | 
			
		||||
			if (mArray !== null && (mArray.wans || mArray.tunnels))
 | 
			
		||||
			{
 | 
			
		||||
				temp += '<td><ul>';
 | 
			
		||||
				var master = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -327,13 +348,17 @@
 | 
			
		|||
					}
 | 
			
		||||
					// Populate info
 | 
			
		||||
					var wanip   = mArray.wans[i].wanip;
 | 
			
		||||
					if (anonymize == "true")
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(wanip) == false)
 | 
			
		||||
					{
 | 
			
		||||
						wanip=replaceLastNChars(wanip,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					var ipaddr   = mArray.wans[i].ipaddr;
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(ipaddr) == false)
 | 
			
		||||
					{
 | 
			
		||||
						ipaddr=replaceLastNChars(ipaddr,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
					var whois   = mArray.wans[i].whois;
 | 
			
		||||
					var signal   = mArray.wans[i].signal;
 | 
			
		||||
					var multipath = mArray.wans[i].multipath;
 | 
			
		||||
					if(multipath == 'master')
 | 
			
		||||
					{
 | 
			
		||||
| 
						 | 
				
			
			@ -342,10 +367,15 @@
 | 
			
		|||
					var latency = mArray.wans[i].latency;
 | 
			
		||||
					var mtu = mArray.wans[i].mtu;
 | 
			
		||||
					var gateway = mArray.wans[i].gateway;
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(gateway) == false)
 | 
			
		||||
					{
 | 
			
		||||
						gateway=replaceLastNChars(gateway,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
					var gw_ping = mArray.wans[i].gw_ping;
 | 
			
		||||
					var server_ping = mArray.wans[i].server_ping;
 | 
			
		||||
					var ipv6_discover = mArray.wans[i].ipv6_discover;
 | 
			
		||||
					var multipath_available = mArray.wans[i].multipath_available;
 | 
			
		||||
					var multipath_state = mArray.wans[i].multipath_state;
 | 
			
		||||
					var duplicateif = mArray.wans[i].duplicateif;
 | 
			
		||||
					// Generate template
 | 
			
		||||
					if(mArray.openmptcprouter.remote_from_lease == true && mArray.wans.length == 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -358,73 +388,255 @@
 | 
			
		|||
					var equipmentIcon = String.format('<embed id="modem_%s" onload="setColorSVG(\'modem_%s\', \'%s\')" src="<%=resource%>/modem.svg" />', mArray.wans[i].name, mArray.wans[i].name, mArray.wans[i].color);
 | 
			
		||||
					if (mArray.wans[i].gateway !== "")
 | 
			
		||||
					{
 | 
			
		||||
						var title = mArray.wans[i].label + " (" + mArray.wans[i].gateway + ")";
 | 
			
		||||
						var title = mArray.wans[i].label + " (" + gateway + ")";
 | 
			
		||||
					} else {
 | 
			
		||||
						var title = mArray.wans[i].label;
 | 
			
		||||
					}
 | 
			
		||||
					//var content = String.format('%s<br />wan address: <strong>%s</strong><br />whois: %s<br />latency: %s ms<br />multipath: %s', stat, wanip, whois, latency, multipath);
 | 
			
		||||
					var content = "";
 | 
			
		||||
					if(ipaddr !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('ip address: <strong>%s</strong><br />', ipaddr);
 | 
			
		||||
						content += String.format('%s <strong>%s</strong><br />',_('ip address:'), ipaddr);
 | 
			
		||||
					}
 | 
			
		||||
					if(wanip !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('wan address: <strong>%s</strong><br />', wanip);
 | 
			
		||||
						content += String.format('%s <strong>%s</strong><br />',_('wan address:'), wanip);
 | 
			
		||||
					}
 | 
			
		||||
					if(whois !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('whois: %s<br />', whois);
 | 
			
		||||
						content += String.format('%s %s<br />',_('whois:'), whois);
 | 
			
		||||
					}
 | 
			
		||||
					if(latency !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('latency: %s ms<br />', latency);
 | 
			
		||||
						content += String.format('%s %s ms<br />',_('latency:'), latency);
 | 
			
		||||
					}
 | 
			
		||||
					if(mtu !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('mtu: %s<br />', mtu);
 | 
			
		||||
						content += String.format('%s %s<br />',_('mtu:'), mtu);
 | 
			
		||||
					}
 | 
			
		||||
					if(signal !== '')
 | 
			
		||||
					{
 | 
			
		||||
						if (signal <= 0)
 | 
			
		||||
							title += ' <img src="/luci-static/resources/icons/signal-0.png" />';
 | 
			
		||||
						else if (signal < 25)
 | 
			
		||||
							title += ' <img src="/luci-static/resources/icons/signal-0-25.png" />';
 | 
			
		||||
						else if (signal < 50)
 | 
			
		||||
							title += ' <img src="/luci-static/resources/icons/signal-25-50.png" />';
 | 
			
		||||
						else if (signal < 75)
 | 
			
		||||
							title += ' <img src="/luci-static/resources/icons/signal-50-75.png" />';
 | 
			
		||||
						else 
 | 
			
		||||
							title += ' <img src="/luci-static/resources/icons/signal-75-100.png" />';
 | 
			
		||||
					}
 | 
			
		||||
					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.wans[i].gateway)
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += 'Wan IP and gateway are identical<br />';
 | 
			
		||||
						statusMessage += _('Wan IP and gateway are identical') + '<br />';
 | 
			
		||||
						statusMessageClass = "error";
 | 
			
		||||
					}
 | 
			
		||||
					if(multipath == 'master' && master > 1)
 | 
			
		||||
					if(multipath == 'master') 
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += 'Multipath master already defined<br />';
 | 
			
		||||
						if (master > 1)
 | 
			
		||||
						{
 | 
			
		||||
							statusMessage += _('Multipath master already defined') + '<br />';
 | 
			
		||||
							statusMessageClass = "error";
 | 
			
		||||
						}
 | 
			
		||||
						if(multipath_state !== 'on' && multipath_state !== '')
 | 
			
		||||
						{
 | 
			
		||||
							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 />';
 | 
			
		||||
							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);
 | 
			
		||||
					if(mArray.wans[i].qos && mArray.wans[i].download > 0 && mArray.wans[i].upload > 0)
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('traffic control: %s/%s kbps (%s)', 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);
 | 
			
		||||
 | 
			
		||||
					temp += '</a></li>';
 | 
			
		||||
				}
 | 
			
		||||
				for( var i = 0; i < mArray.tunnels.length; i++ )
 | 
			
		||||
				{
 | 
			
		||||
					// Get link color
 | 
			
		||||
					mArray.tunnels[i].color = stringToColour(mArray.tunnels[i].name)
 | 
			
		||||
					// Mwan status infos and colors
 | 
			
		||||
					var stat = '';
 | 
			
		||||
					var cssc = '';
 | 
			
		||||
					switch (mArray.tunnels[i].status)
 | 
			
		||||
					{
 | 
			
		||||
						case 'OK':
 | 
			
		||||
							stat = 'Online';
 | 
			
		||||
							cssc = 'rgb(144, 240, 144)';
 | 
			
		||||
							statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
 | 
			
		||||
							statusMessageClass = "";
 | 
			
		||||
							statusMessage = "";
 | 
			
		||||
							break;
 | 
			
		||||
						case 'ERROR':
 | 
			
		||||
							stat = 'Offline';
 | 
			
		||||
							cssc = 'rgb(240, 144, 144)';
 | 
			
		||||
							statusIcon = "<%=resource%>/openmptcprouter/images/statusError.png";
 | 
			
		||||
							statusMessageClass = "error";
 | 
			
		||||
							statusMessage = "";
 | 
			
		||||
							break;
 | 
			
		||||
						default:
 | 
			
		||||
							stat = 'Unknown';
 | 
			
		||||
							cssc = 'rgb(144, 240, 144)';
 | 
			
		||||
							statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
 | 
			
		||||
							statusMessageClass = "warning";
 | 
			
		||||
							statusMessage = "";
 | 
			
		||||
					}
 | 
			
		||||
					// Populate info
 | 
			
		||||
					var wanip   = mArray.tunnels[i].wanip;
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(wanip) == false)
 | 
			
		||||
					{
 | 
			
		||||
						wanip=replaceLastNChars(wanip,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
					var ipaddr   = mArray.tunnels[i].ipaddr;
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(ipaddr) == false)
 | 
			
		||||
					{
 | 
			
		||||
						ipaddr=replaceLastNChars(ipaddr,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
					var whois   = mArray.tunnels[i].whois;
 | 
			
		||||
					var multipath = mArray.tunnels[i].multipath;
 | 
			
		||||
					if(multipath == 'master')
 | 
			
		||||
					{
 | 
			
		||||
						master++;
 | 
			
		||||
					}
 | 
			
		||||
					var latency = mArray.tunnels[i].latency;
 | 
			
		||||
					var mtu = mArray.tunnels[i].mtu;
 | 
			
		||||
					var gateway = mArray.tunnels[i].gateway;
 | 
			
		||||
					if (anonymize == "true" && testPrivateIP(gateway) == false)
 | 
			
		||||
					{
 | 
			
		||||
						gateway=replaceLastNChars(gateway,"x",6);
 | 
			
		||||
					}
 | 
			
		||||
					var gw_ping = mArray.tunnels[i].gw_ping;
 | 
			
		||||
					var server_ping = mArray.tunnels[i].server_ping;
 | 
			
		||||
					var ipv6_discover = mArray.tunnels[i].ipv6_discover;
 | 
			
		||||
					var multipath_available = mArray.tunnels[i].multipath_available;
 | 
			
		||||
					var multipath_state = mArray.tunnels[i].multipath_state;
 | 
			
		||||
					var duplicateif = mArray.tunnels[i].duplicateif;
 | 
			
		||||
					// Generate template
 | 
			
		||||
					if(mArray.openmptcprouter.remote_from_lease == true && mArray.tunnels.length == 1)
 | 
			
		||||
					{
 | 
			
		||||
						temp += String.format('<li class="subnode-only-child"><a href="%q">', mArray.tunnels[i].link);
 | 
			
		||||
					} else {
 | 
			
		||||
						temp += String.format('<li><a href="%q">', mArray.tunnels[i].link);
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					var equipmentIcon = String.format('<embed id="modem_%s" onload="setColorSVG(\'modem_%s\', \'%s\')" src="<%=resource%>/modem.svg" />', mArray.tunnels[i].name, mArray.tunnels[i].name, mArray.tunnels[i].color);
 | 
			
		||||
					if (mArray.tunnels[i].gateway !== "")
 | 
			
		||||
					{
 | 
			
		||||
						var title = mArray.tunnels[i].label + " (" + gateway + ")";
 | 
			
		||||
					} else {
 | 
			
		||||
						var title = mArray.tunnels[i].label;
 | 
			
		||||
					}
 | 
			
		||||
					var content = "";
 | 
			
		||||
					if(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);
 | 
			
		||||
					}
 | 
			
		||||
					if(whois !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('%s %s<br />',_('whois:'), whois);
 | 
			
		||||
					}
 | 
			
		||||
					if(latency !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('%s %s ms<br />',_('latency:'), latency);
 | 
			
		||||
					}
 | 
			
		||||
					if(mtu !== '')
 | 
			
		||||
					{
 | 
			
		||||
						content += String.format('%s %s<br />',_('mtu:'), mtu);
 | 
			
		||||
					}
 | 
			
		||||
					if(ipaddr == '')
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('No IP defined') + '<br />'
 | 
			
		||||
					}
 | 
			
		||||
					if(gateway == '')
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('No gateway defined') + '<br />'
 | 
			
		||||
					} else if(gw_ping == 'DOWN')
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('Gateway DOWN') + '<br />'
 | 
			
		||||
					} else if(multipath_available == 'ERROR')
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('Multipath seems to be blocked on the connection') + '<br />'
 | 
			
		||||
					}
 | 
			
		||||
					if(server_ping == 'DOWN')
 | 
			
		||||
					{
 | 
			
		||||
						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 />';
 | 
			
		||||
						statusMessageClass = "error";
 | 
			
		||||
					}
 | 
			
		||||
					if(multipath == 'master') 
 | 
			
		||||
					{
 | 
			
		||||
						if (master > 1)
 | 
			
		||||
						{
 | 
			
		||||
							statusMessage += _('Multipath master already defined') + '<br />';
 | 
			
		||||
							statusMessageClass = "error";
 | 
			
		||||
						}
 | 
			
		||||
						if(multipath_state !== 'on' && multipath_state !== '')
 | 
			
		||||
						{
 | 
			
		||||
							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 />';
 | 
			
		||||
							statusMessageClass = "error";
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					if(duplicateif)
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('Network interface duplicated') + '<br />';
 | 
			
		||||
						statusMessageClass = "error";
 | 
			
		||||
					}
 | 
			
		||||
					if(ipv6_discover == 'DETECTED')
 | 
			
		||||
					{
 | 
			
		||||
						statusMessage += _('IPv6 route received') + '<br />'
 | 
			
		||||
					}
 | 
			
		||||
					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)
 | 
			
		||||
					}
 | 
			
		||||
					temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -433,6 +645,9 @@
 | 
			
		|||
				temp += '</ul></td>';
 | 
			
		||||
				temp += '</tr></table>';
 | 
			
		||||
			}
 | 
			
		||||
			if (mArray === null) {
 | 
			
		||||
			    temp += _('No data');
 | 
			
		||||
			}
 | 
			
		||||
			temp += '</li>';
 | 
			
		||||
			// Close tree
 | 
			
		||||
			temp += '</ul>';
 | 
			
		||||
| 
						 | 
				
			
			@ -521,9 +736,9 @@
 | 
			
		|||
		<h3>Settings</h3>
 | 
			
		||||
		<fieldset class="cbi-section">
 | 
			
		||||
			<div class="cbi-value">
 | 
			
		||||
				<label class="cbi-value-title">Anonymize public IPs (at next refresh)</label>
 | 
			
		||||
				<label class="cbi-value-title">Anonymize public IPs</label>
 | 
			
		||||
				<div class="cbi-value-field">
 | 
			
		||||
					<input type="checkbox" name="anon" class="cbi-input-checkbox" value="1" onclick="setAnonymize(this)" \>
 | 
			
		||||
					<input type="checkbox" name="anon" id="anon" class="cbi-input-checkbox" value="1" onclick="setAnonymize(this)" \>
 | 
			
		||||
				</div>
 | 
			
		||||
			</div>
 | 
			
		||||
		</fieldset>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@
 | 
			
		|||
	local net = require "luci.model.network".init()
 | 
			
		||||
	local fs = require "nixio.fs"
 | 
			
		||||
	local sys = require "luci.sys"
 | 
			
		||||
	local ut = require "luci.util"
 | 
			
		||||
	local ifaces = sys.net:devices()
 | 
			
		||||
	local servers_ip = {}
 | 
			
		||||
	local server_ip = uci:get("shadowsocks-libev","sss0","server")
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +67,7 @@ end
 | 
			
		|||
		<div class="cbi-value">
 | 
			
		||||
		    <label class="cbi-value-title" for="server_ip"><%:Server IP%></label>
 | 
			
		||||
		    <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-type="ip4addr" data-optional="false">
 | 
			
		||||
			    <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%>
 | 
			
		||||
			</div>
 | 
			
		||||
| 
						 | 
				
			
			@ -74,12 +75,22 @@ end
 | 
			
		|||
		</div>
 | 
			
		||||
		<br />
 | 
			
		||||
		<div class="cbi-value">
 | 
			
		||||
		    <label class="cbi-value-title"><%:OpenMPTCProuter VPS key%></label>
 | 
			
		||||
		    <label class="cbi-value-title"><%:Server username%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<input type="text" name="<%=servername%>.openmptcprouter_vps_key" placeholder="OpenMPTCProuter VPS key" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"password")%>" data-type="base64" data-optional="false">
 | 
			
		||||
			<input type="text" name="<%=servername%>.openmptcprouter_vps_username" placeholder="<%:Server username%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"username")%>" data-optional="false">
 | 
			
		||||
			<br />
 | 
			
		||||
			<div class="cbi-value-description">
 | 
			
		||||
			    <%:Key to configure and retrieve others keys from OpenMPTCProuter VPS. Empty to disable.%>
 | 
			
		||||
			    <%:API username to retrieve personnalized settings from the server.%>
 | 
			
		||||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value">
 | 
			
		||||
		    <label class="cbi-value-title"><%:Server key%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<input type="text" name="<%=servername%>.openmptcprouter_vps_key" placeholder="<%:Server key%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"password")%>" data-optional="false">
 | 
			
		||||
			<br />
 | 
			
		||||
			<div class="cbi-value-description">
 | 
			
		||||
			    <%:Key to configure and retrieve others keys from Server and to set server settings from OpenMPTCProuter.%>
 | 
			
		||||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +146,7 @@ end
 | 
			
		|||
	    <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")%>" data-type="base64">
 | 
			
		||||
		    <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">
 | 
			
		||||
		        <%:ShadowSocks is used for TCP.%>
 | 
			
		||||
| 
						 | 
				
			
			@ -145,7 +156,32 @@ end
 | 
			
		|||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Disable ShadowSocks%></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 class="cbi-input-checkbox" type="checkbox" name="disableshadowsocks" value="1" <% if uci:get("shadowsocks-libev","sss0","disabled") == "1" then %>checked<% end %> />
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Encryption%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <select class="cbi-input-select" name="encryption" size="1">
 | 
			
		||||
			<% 
 | 
			
		||||
			    local method=uci:get("shadowsocks-libev","sss0","method")
 | 
			
		||||
			%>
 | 
			
		||||
			<option value="none" <% if method == "none" then %>selected="selected"<% end %>><%:None%></option>
 | 
			
		||||
			<option value="aes-256-gcm" <% if method == "aes-256-gcm" then %>selected="selected"<% end %>>AES-256-GCM</option>
 | 
			
		||||
			<option value="chacha20-ietf-poly1305" <% if method == "chacha20" or method == "chacha20-ietf-poly1305" then %>selected="selected"<% end %>>chacha20</option>
 | 
			
		||||
			<option value="other" <% if method ~= "chacha20" and method ~= "aes-256-gcm" and method ~= "chacha20-ietf-poly1305" and method ~= "none" then %>selected="selected"<% end %>><%:other%></option>
 | 
			
		||||
		    </select>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
		        <%
 | 
			
		||||
			    if ut.trim(sys.exec("cat /proc/cpuinfo | grep aes")) ~= "" then
 | 
			
		||||
			%>
 | 
			
		||||
				<%:An Advanced Encryption Standard (AES) instruction set is integrated in the processor.%>
 | 
			
		||||
			<% 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.%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	</fieldset>
 | 
			
		||||
| 
						 | 
				
			
			@ -156,7 +192,7 @@ end
 | 
			
		|||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:Glorytun key%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="text" name="glorytun_key" placeholder="Glorytun key" class="cbi-input-text" value="<%=uci:get("glorytun","vpn","key")%>">
 | 
			
		||||
		    <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">
 | 
			
		||||
		        <%:Glorytun TCP is used by default for UDP and ICMP%>
 | 
			
		||||
| 
						 | 
				
			
			@ -164,11 +200,23 @@ end
 | 
			
		|||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <% end %>
 | 
			
		||||
	    <% if nixio.fs.access("/usr/sbin/dsvpn") then %>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:A Dead Simple VPN key%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <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">
 | 
			
		||||
		        <%:A Dead Simple VPN is a TCP VPN that can replace Glorytun TCP%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <% end %>
 | 
			
		||||
	    <% if nixio.fs.access("/usr/sbin/mlvpn") then %>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:MLVPN password%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="text" name="mlvpn_password" placeholder="MLVPN password" class="cbi-input-text" value="<%=uci:get("mlvpn","general","password")%>">
 | 
			
		||||
		    <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">
 | 
			
		||||
		        <%:MLVPN can replace Glorytun with connections with same latency%>
 | 
			
		||||
| 
						 | 
				
			
			@ -176,15 +224,14 @@ end
 | 
			
		|||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
	    <% end %>
 | 
			
		||||
	    <% if nixio.fs.access("/usr/sbin/openvpn") then %>
 | 
			
		||||
	    <% if nixio.fs.access("/usr/sbin/ubond") then %>
 | 
			
		||||
	    <div class="cbi-value">
 | 
			
		||||
		<label class="cbi-value-title"><%:OpenVPN key%></label>
 | 
			
		||||
		<label class="cbi-value-title"><%:UBOND password%></label>
 | 
			
		||||
		<div class="cbi-value-field">
 | 
			
		||||
		    <input type="file" name="openvpn_key" class="cbi-input-file">
 | 
			
		||||
		    <input type="text" class="cbi-input-text" data-update="change" value="<%=uci:get("openvpn","omr","secret")%>" />
 | 
			
		||||
		    <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">
 | 
			
		||||
		        <%:You need to upload OpenVPN key file generated by OpenMPTCProuter VPS script to use OpenVPN TCP%>
 | 
			
		||||
		        <%:UBOND can replace Glorytun with connections with same latency%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -200,13 +247,17 @@ end
 | 
			
		|||
				available_vpns = {available_vpns}
 | 
			
		||||
			end
 | 
			
		||||
			for _, vpn in pairs(available_vpns) do
 | 
			
		||||
				if vpn == "glorytun-tcp" then
 | 
			
		||||
				if vpn == "glorytun_tcp" then
 | 
			
		||||
				%>
 | 
			
		||||
					<% 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 %>
 | 
			
		||||
				<% elseif vpn == "glorytun-udp" then %>
 | 
			
		||||
				<% elseif vpn == "glorytun_udp" then %>
 | 
			
		||||
					<% 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 %>
 | 
			
		||||
				<% 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 %>
 | 
			
		||||
				<% 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 %>
 | 
			
		||||
					<% 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 %>
 | 
			
		||||
				<%
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +270,9 @@ 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/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>
 | 
			
		||||
		<%
 | 
			
		||||
| 
						 | 
				
			
			@ -228,7 +281,7 @@ end
 | 
			
		|||
		    </select>
 | 
			
		||||
		    <br />
 | 
			
		||||
		    <div class="cbi-value-description">
 | 
			
		||||
		        <%:Set the default VPN used for UDP and ICMP when ShadowSocks is enabled, for all traffic if ShadowSocks is disabled.%>
 | 
			
		||||
		        <%:Set the default VPN used for UDP and ICMP when ShadowSocks is enabled, for all traffic if ShadowSocks is disabled.%> <%:All VPN available here can do aggregation over MPTCP or using own internal method.%>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
	    </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -240,8 +293,11 @@ end
 | 
			
		|||
<% 
 | 
			
		||||
    for _, iface in ipairs(net:get_networks()) do
 | 
			
		||||
	local ifname = iface:name()
 | 
			
		||||
	local multipath = uci:get("network",ifname,"multipath")
 | 
			
		||||
	if multipath ~= "off" then
 | 
			
		||||
	--local multipath = uci:get("network",ifname,"multipath")
 | 
			
		||||
	local multipath = uci:get("openmptcprouter",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" />
 | 
			
		||||
| 
						 | 
				
			
			@ -249,7 +305,17 @@ end
 | 
			
		|||
	    <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%>-proto" data-index="1">
 | 
			
		||||
		<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="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="2">
 | 
			
		||||
		    <label class="cbi-value-title"><%:Protocol%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.proto" name="cbid.network.<%=ifname%>.proto" size="1">
 | 
			
		||||
| 
						 | 
				
			
			@ -263,7 +329,7 @@ end
 | 
			
		|||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="2">
 | 
			
		||||
		<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="3">
 | 
			
		||||
		    <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">
 | 
			
		||||
| 
						 | 
				
			
			@ -273,13 +339,13 @@ end
 | 
			
		|||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="3">
 | 
			
		||||
		<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="4">
 | 
			
		||||
		    <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="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="4">
 | 
			
		||||
		<div class="cbi-value" id="cbi-network-<%=ifname%>-gateway" data-depends="[{"cbid.network.<%=ifname%>.proto":"static"}]" data-index="5">
 | 
			
		||||
		    <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">
 | 
			
		||||
| 
						 | 
				
			
			@ -304,17 +370,27 @@ end
 | 
			
		|||
				end
 | 
			
		||||
			end
 | 
			
		||||
		%>
 | 
			
		||||
		<div class="cbi-value" data-index="5">
 | 
			
		||||
		<div class="cbi-value" data-index="6">
 | 
			
		||||
		    <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 %> />
 | 
			
		||||
			<br />
 | 
			
		||||
			<div class="cbi-value-description">
 | 
			
		||||
			    <%:You can enable MPTCP over VPN if your provider filter Multipath TCP.%>
 | 
			
		||||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value" data-index="7">
 | 
			
		||||
		    <label class="cbi-value-title"><%:Enable SQM%></label>
 | 
			
		||||
		    <div class="cbi-value-field">
 | 
			
		||||
			<input class="cbi-input-checkbox" type="checkbox" name="cbid.sqm.enabled" value="1" <% if uci:get("sqm",ifname,"enabled") == 1 then %>checked<% end %> />
 | 
			
		||||
			<input class="cbi-input-checkbox" type="checkbox" name="cbid.sqm.<%=ifname%>.enabled" value="1" <% if uci:get("sqm",ifname,"enabled") == "1" then %>checked<% end %> />
 | 
			
		||||
			<br />
 | 
			
		||||
			<div class="cbi-value-description">
 | 
			
		||||
			    <%:You should disable SQM for LTE or any interfaces with variable speed.%>
 | 
			
		||||
			</div>
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value" data-index="6">
 | 
			
		||||
		<div class="cbi-value" data-index="8">
 | 
			
		||||
		    <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">
 | 
			
		||||
| 
						 | 
				
			
			@ -330,7 +406,7 @@ end
 | 
			
		|||
			-->
 | 
			
		||||
		    </div>
 | 
			
		||||
		</div>
 | 
			
		||||
		<div class="cbi-value" data-index="7">
 | 
			
		||||
		<div class="cbi-value" data-index="9">
 | 
			
		||||
		    <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">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,14 +9,29 @@ msgstr ""
 | 
			
		|||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Generator: Poedit 2.1.1\n"
 | 
			
		||||
"X-Generator: Poedit 2.2.3\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:367
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:210
 | 
			
		||||
msgid "A Dead Simple VPN is a TCP VPN that can replace Glorytun TCP"
 | 
			
		||||
msgstr "Dead Simple VPN est un VPN sur TCP qui peut remplacer Glorytun TCP"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:205
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:207
 | 
			
		||||
msgid "A Dead Simple VPN key"
 | 
			
		||||
msgstr "Clef Dead Simple VPN"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:83
 | 
			
		||||
msgid "API username to retrieve personnalized settings from the server."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Nom d'utilisateur pour récupérer la configuration personnalisée depuis le "
 | 
			
		||||
"serveur."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:443
 | 
			
		||||
msgid "Add an interface"
 | 
			
		||||
msgstr "Ajouter une interface"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:108
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:119
 | 
			
		||||
msgid "Add server"
 | 
			
		||||
msgstr "Ajouter un serveur"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -25,238 +40,346 @@ msgstr "Ajouter un serveur"
 | 
			
		|||
msgid "Advanced Settings"
 | 
			
		||||
msgstr "Configuration avancé"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:125
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:136
 | 
			
		||||
msgid "Advanced settings"
 | 
			
		||||
msgstr "Configuration avancé"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm:6
 | 
			
		||||
msgid "All OpenMPTCProuter settings"
 | 
			
		||||
msgstr "Tous les paramètres d'OpenMPTCProuter"
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:284
 | 
			
		||||
msgid ""
 | 
			
		||||
"All VPN available here can do aggregation over MPTCP or using own internal "
 | 
			
		||||
"method."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Tous les VPN disponibles ici permettent l'agrégation en utilisant MPTCP ou "
 | 
			
		||||
"leur propre méthode interne."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm:5
 | 
			
		||||
msgid "All router settings"
 | 
			
		||||
msgstr "Tous les paramètres du routeur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:179
 | 
			
		||||
msgid ""
 | 
			
		||||
"An Advanced Encryption Standard (AES) instruction set is integrated in the "
 | 
			
		||||
"processor."
 | 
			
		||||
msgstr "Les instruction AES sont intégrés dans le processeur."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:22
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:8
 | 
			
		||||
msgid "Backup on server"
 | 
			
		||||
msgstr "Sauvegarde sur le serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:20
 | 
			
		||||
msgid "Beta"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:134
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:145
 | 
			
		||||
msgid "By default ShadowSocks is used for TCP traffic."
 | 
			
		||||
msgstr "ShadowSocks est utilisé pour le trafic TCP."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:154
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:190
 | 
			
		||||
msgid "By default VPN is used for any traffic that is not TCP."
 | 
			
		||||
msgstr "Par défaut le VPN est utilisé pour le trafic n'étant pas du TCP."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:113
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:124
 | 
			
		||||
msgid "Common server settings"
 | 
			
		||||
msgstr "Paramètres des serveurs"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:257
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:323
 | 
			
		||||
msgid "DHCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:193
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:240
 | 
			
		||||
msgid "Default VPN"
 | 
			
		||||
msgstr "VPN par défaut"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:61
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:247
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:62
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:303
 | 
			
		||||
msgid "Delete"
 | 
			
		||||
msgstr "Supprimer"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:146
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:157
 | 
			
		||||
msgid "Disable ShadowSocks"
 | 
			
		||||
msgstr "Désactiver ShadowSocks"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:141
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:158
 | 
			
		||||
msgid "Disable TCP Fast Open"
 | 
			
		||||
msgstr "Désactivé TCP Fast Open"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:163
 | 
			
		||||
msgid "Disable TCP Fast Open on Linux and Shadowsocks configuration"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Désactivation de TCP Fast Open pour Linux et dans la configuration de "
 | 
			
		||||
"Shadowsocks"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:148
 | 
			
		||||
msgid "Disable external check"
 | 
			
		||||
msgstr "Désactiver les tests externes"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:318
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:178
 | 
			
		||||
msgid "Disable gateway ping"
 | 
			
		||||
msgstr "Désactiver le ping vers la passerelle"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:183
 | 
			
		||||
msgid "Disable gateway ping status check"
 | 
			
		||||
msgstr "Désactiver le test ping de la passerelle"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:57
 | 
			
		||||
msgid ""
 | 
			
		||||
"Disable ports redirection defined in firewall from server to this router"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Désactiver les redirections de ports définis dans la partie pare-feu du "
 | 
			
		||||
"serveur vers ce routeur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:188
 | 
			
		||||
msgid "Disable server ping"
 | 
			
		||||
msgstr "Désactiver le ping vers le serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:193
 | 
			
		||||
msgid "Disable server ping status check"
 | 
			
		||||
msgstr "Désactiver le test ping vers le serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:394
 | 
			
		||||
msgid "Download speed (Kb/s)"
 | 
			
		||||
msgstr "Vitesse de téléchargement (Kb/s)"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:155
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:202
 | 
			
		||||
msgid "Dynamic change"
 | 
			
		||||
msgstr "Changement dynamique"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:135
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:115
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:142
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:126
 | 
			
		||||
msgid "Enable IPv6"
 | 
			
		||||
msgstr "Activer IPv6"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:308
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:384
 | 
			
		||||
msgid "Enable SQM"
 | 
			
		||||
msgstr "Active SQM"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:66
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:73
 | 
			
		||||
msgid "Enable ShadowSocks Obfuscating"
 | 
			
		||||
msgstr "Activer le brouillage pour ShadowSocks"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:162
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:163
 | 
			
		||||
msgid "Encryption"
 | 
			
		||||
msgstr "Chiffrement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:183
 | 
			
		||||
msgid "Encryption method is also used for Glorytun."
 | 
			
		||||
msgstr "La méthode de chiffrement est également utilisée par Glorytun."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:198
 | 
			
		||||
msgid "Glorytun TCP is used by default for UDP and ICMP"
 | 
			
		||||
msgstr "Glorytun est utilisé par défaut pour UDP et ICMP"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:157
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:193
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:195
 | 
			
		||||
msgid "Glorytun key"
 | 
			
		||||
msgstr "Clef Glorytun"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:117
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:124
 | 
			
		||||
msgid "IPv4 TCP FIN timeout"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:129
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:136
 | 
			
		||||
msgid "IPv4 TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:111
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:118
 | 
			
		||||
msgid "IPv4 TCP Keepalive time"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:123
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:130
 | 
			
		||||
msgid "IPv4 TCP SYN retries"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:267
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:333
 | 
			
		||||
msgid "IPv4 address"
 | 
			
		||||
msgstr "Adresse IPv4"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:283
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:349
 | 
			
		||||
msgid "IPv4 gateway"
 | 
			
		||||
msgstr "Passerelle IPv4"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:277
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:343
 | 
			
		||||
msgid "IPv4 netmask"
 | 
			
		||||
msgstr "Masque de sous-réseau IPv4"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:238
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:291
 | 
			
		||||
msgid "Interfaces settings"
 | 
			
		||||
msgstr "Paramètres des interfaces"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:82
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:93
 | 
			
		||||
msgid ""
 | 
			
		||||
"Key to configure and retrieve others keys from OpenMPTCProuter VPS. Empty to "
 | 
			
		||||
"disable."
 | 
			
		||||
"Key to configure and retrieve others keys from Server and to set server "
 | 
			
		||||
"settings from OpenMPTCProuter."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Clef pour configurer et récupérer les autres clefs depuis OpenMPTCProuter "
 | 
			
		||||
"VPS. Vide pour désactiver."
 | 
			
		||||
"Clef pour configurer et récupérer les autres clefs ainsi que les paramètres "
 | 
			
		||||
"depuis le serveur."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:174
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:309
 | 
			
		||||
msgid "Label"
 | 
			
		||||
msgstr "Étiquette"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:314
 | 
			
		||||
msgid "Label for the interface"
 | 
			
		||||
msgstr "Étiquette pour l'interface"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:20
 | 
			
		||||
msgid "Last available backup on server:"
 | 
			
		||||
msgstr "Dernière sauvegarde disponible sur le serveur :"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:222
 | 
			
		||||
msgid "MLVPN can replace Glorytun with connections with same latency"
 | 
			
		||||
msgstr "MLVPN peut remplacer Glorytun pour les connexions avec la même latence"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:169
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:217
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:219
 | 
			
		||||
msgid "MLVPN password"
 | 
			
		||||
msgstr "Mot de passe MLVPN"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:151
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:374
 | 
			
		||||
msgid "MPTCP over VPN"
 | 
			
		||||
msgstr "MPTCP over VPN"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:198
 | 
			
		||||
msgid "Master interface selection"
 | 
			
		||||
msgstr "Selection de l'interface maître"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:172
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:220
 | 
			
		||||
msgid "Maximum scaling CPU frequency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:166
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:214
 | 
			
		||||
msgid "Minimum scaling CPU frequency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:510
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:512
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:729
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:731
 | 
			
		||||
msgid "Network overview"
 | 
			
		||||
msgstr "Aperçu réseau"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:108
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:115
 | 
			
		||||
msgid "Networks settings"
 | 
			
		||||
msgstr "Paramètres réseaux"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:156
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:24
 | 
			
		||||
msgid "No available backup on server."
 | 
			
		||||
msgstr "Aucune sauvegarde disponible sur le serveur."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:203
 | 
			
		||||
msgid "No change"
 | 
			
		||||
msgstr "Pas de changement"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:76
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:169
 | 
			
		||||
msgid "None"
 | 
			
		||||
msgstr "Aucun"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:83
 | 
			
		||||
msgid "Obfuscating plugin"
 | 
			
		||||
msgstr "Plugin de brouillage"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:95
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:102
 | 
			
		||||
msgid "Obfuscating type"
 | 
			
		||||
msgstr "Type de brouillage"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:71
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:78
 | 
			
		||||
msgid "Obfuscating will be enabled on both side"
 | 
			
		||||
msgstr "Le brouillage sera activé des deux côtés"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:154
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:201
 | 
			
		||||
msgid "On wizard change"
 | 
			
		||||
msgstr "En cas de changements dans l'assistant"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:96
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:107
 | 
			
		||||
msgid "Only one server can be master, else all servers are set as backup."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Uniquement un serveur peut être maître, les autres sont définis en secours."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:11
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:14
 | 
			
		||||
msgid "OpenMPTCProuter"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:77
 | 
			
		||||
msgid "OpenMPTCProuter VPS key"
 | 
			
		||||
msgstr "Clef d'OpenMPTCProuter VPS"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:181
 | 
			
		||||
msgid "OpenVPN key"
 | 
			
		||||
msgstr "Clef OpenVPN"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:258
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:324
 | 
			
		||||
msgid "Other"
 | 
			
		||||
msgstr "Autre"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:253
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:319
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr "Protocole"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:50
 | 
			
		||||
msgid "Redirects all ports from server to OpenMPTCProuter"
 | 
			
		||||
msgstr "Rédiriger tous les ports du serveur vers OpenMPTCProuter"
 | 
			
		||||
msgid "Redirects all ports from server to this router"
 | 
			
		||||
msgstr "Rediriger tous les ports du server vers ce routeur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:198
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:376
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:204
 | 
			
		||||
msgid "Redundant"
 | 
			
		||||
msgstr "Redondant"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:30
 | 
			
		||||
msgid "Restore backup"
 | 
			
		||||
msgstr "Restauration de la sauvegarde"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:246
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:452
 | 
			
		||||
msgid "Save & Apply"
 | 
			
		||||
msgstr "Sauvegarder et Appliquer"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:178
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:173
 | 
			
		||||
msgid "Save vnstats statistics on disk"
 | 
			
		||||
msgstr "Sauvegarder les statistiques de vnstats sur le disque"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:168
 | 
			
		||||
msgid "Save vnstats stats"
 | 
			
		||||
msgstr "Sauvegarder les statistiques de vnstats"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:226
 | 
			
		||||
msgid "Scaling governor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:370
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:446
 | 
			
		||||
msgid "Select the device you want to base the interface on."
 | 
			
		||||
msgstr "Sélectionnez le périphérique pour l'interface."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:67
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:31
 | 
			
		||||
msgid "Send backup"
 | 
			
		||||
msgstr "Envoyer la sauvegarde"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:68
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:70
 | 
			
		||||
msgid "Server IP"
 | 
			
		||||
msgstr "IP du serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:71
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:72
 | 
			
		||||
msgid "Server IP will be set for ShadowSocks, Glorytun, OpenVPN and MLVPN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"L'IP du serveur sera configuré pour ShadowSocks, Glorytun, OpenVPN  et MLVPN"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:51
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:88
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:90
 | 
			
		||||
msgid "Server key"
 | 
			
		||||
msgstr "Clef du serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:52
 | 
			
		||||
msgid "Server settings"
 | 
			
		||||
msgstr "Paramètres du serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:272
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:78
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:80
 | 
			
		||||
msgid "Server username"
 | 
			
		||||
msgstr "Nom d'utilisateur sur le serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:338
 | 
			
		||||
msgid "Set an IP in the same network as the modem"
 | 
			
		||||
msgstr "Mettez une IP dans le même réseau que le modem"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:288
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:354
 | 
			
		||||
msgid "Set here IP of the modem"
 | 
			
		||||
msgstr "Mettez ici l'IP du modem"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:91
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:102
 | 
			
		||||
msgid "Set server as master"
 | 
			
		||||
msgstr "Configurer le serveur en tant que maître"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:231
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:284
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set the default VPN used for UDP and ICMP when ShadowSocks is enabled, for "
 | 
			
		||||
"all traffic if ShadowSocks is disabled."
 | 
			
		||||
| 
						 | 
				
			
			@ -264,14 +387,14 @@ msgstr ""
 | 
			
		|||
"Configure le VPN utilisé par défaut pour UDP et ICMP quand ShadowSocks est "
 | 
			
		||||
"activé, pour tout le trafic quand ShadowSocks est désactivé."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:328
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:404
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set value between 80-95% of max download speed link. 0 to disable SQM/QoS."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Réglez une valeur entre 80-95% de la vitesse de téléchargement maximale. 0 "
 | 
			
		||||
"pour désactiver SQM/QoS."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:344
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:420
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set value between 80-95% of max upload speed link. 0 to disable SQM/QoS."
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			@ -282,23 +405,24 @@ msgstr ""
 | 
			
		|||
msgid "Settings Wizard"
 | 
			
		||||
msgstr "Assistant de configuration"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:141
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:152
 | 
			
		||||
msgid "ShadowSocks is used for TCP."
 | 
			
		||||
msgstr "ShadowSocks est utilisé pour le TCP."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:136
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:147
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:149
 | 
			
		||||
msgid "ShadowSocks key"
 | 
			
		||||
msgstr "Clef de ShadowSocks"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:133
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:144
 | 
			
		||||
msgid "ShadowSocks settings"
 | 
			
		||||
msgstr "Paramètres de ShadowSocks"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:22
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:24
 | 
			
		||||
msgid "Show all settings"
 | 
			
		||||
msgstr "Voir tous les paramètres"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:256
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:322
 | 
			
		||||
msgid "Static address"
 | 
			
		||||
msgstr "Adresse statique"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -306,40 +430,55 @@ msgstr "Adresse statique"
 | 
			
		|||
msgid "Status"
 | 
			
		||||
msgstr "État"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:163
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:211
 | 
			
		||||
msgid "Systems settings"
 | 
			
		||||
msgstr "Paramètres systémes"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:181
 | 
			
		||||
msgid ""
 | 
			
		||||
"There is no Advanced Encryption Standard (AES) instruction set integrated in "
 | 
			
		||||
"the processor, you should use chacha20."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Les instructions AES ne sont pas intégrées au processeur, vous devriez "
 | 
			
		||||
"utiliser chacha20."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:234
 | 
			
		||||
msgid "UBOND can replace Glorytun with connections with same latency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:229
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:231
 | 
			
		||||
msgid "UBOND password"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:27
 | 
			
		||||
msgid "Update"
 | 
			
		||||
msgstr "Mis à jour"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:22
 | 
			
		||||
msgid "Update OpenMPTCProuter server"
 | 
			
		||||
msgstr "Met à jour OpenMPTCProuter serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:18
 | 
			
		||||
msgid "Update VPS"
 | 
			
		||||
msgstr "Mis à jour du VPS"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:20
 | 
			
		||||
msgid "Update remotly OpenMPTCProuter server to latest version when needed."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Met à jour OpenMPTCProuter serveur à la dernière version quand c'est "
 | 
			
		||||
"nécessaire."
 | 
			
		||||
msgid "Update remotly the server to latest version when needed."
 | 
			
		||||
msgstr "Met à jour le serveur à la dernière version quand c'est nécessaire."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:334
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:22
 | 
			
		||||
msgid "Update server"
 | 
			
		||||
msgstr "Mise à jour du serveur"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:410
 | 
			
		||||
msgid "Upload speed (Kb/s)"
 | 
			
		||||
msgstr "Vitesse d'envoi (Kb/s)"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:323
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:339
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:399
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:415
 | 
			
		||||
msgid "Used by Glorytun UDP and SQM/QoS if enabled. 0 to use default value."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Utilisé par Glorytun UDP et SQM/QoS si activé. 0 pour utiliser la valeur par "
 | 
			
		||||
"défaut."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:153
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:189
 | 
			
		||||
msgid "VPN settings"
 | 
			
		||||
msgstr "Paramètres du VPN"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -347,18 +486,23 @@ msgstr "Paramètres du VPN"
 | 
			
		|||
msgid "VPS settings"
 | 
			
		||||
msgstr "Paramètres du VPS"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:146
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:153
 | 
			
		||||
msgid ""
 | 
			
		||||
"When enable check are done on external sites to get each WAN IP and the IP "
 | 
			
		||||
"used to go outside."
 | 
			
		||||
msgstr "Utilise des sites externes pour obtenir les IPs externes quand activé"
 | 
			
		||||
msgstr "Utilise des sites externes pour obtenir les IPs externes quand activé."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:12
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:49
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:50
 | 
			
		||||
msgid "Wizard"
 | 
			
		||||
msgstr "Assistant"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:262
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:379
 | 
			
		||||
msgid "You can enable MPTCP over VPN if your provider filter Multipath TCP."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous pouvez utiliser MTPCP over VPN si votre fournisseur filtre Multipath "
 | 
			
		||||
"TCP."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:328
 | 
			
		||||
msgid ""
 | 
			
		||||
"You can use DHCP if you have multiple real ethernet ports. Select other if "
 | 
			
		||||
"you want to use another protocol available in Network Interfaces page."
 | 
			
		||||
| 
						 | 
				
			
			@ -367,30 +511,205 @@ msgstr ""
 | 
			
		|||
"Choisissez autre si vous utilisez un autre protocole dans la page Réseau "
 | 
			
		||||
"Interfaces."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:239
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:292
 | 
			
		||||
msgid "You must disable DHCP on your modems and set IP in different networks."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous devez désactiver DHCP sur vos modems et configurer leurs IP dans des "
 | 
			
		||||
"réseaux différents."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:187
 | 
			
		||||
msgid ""
 | 
			
		||||
"You need to upload OpenVPN key file generated by OpenMPTCProuter VPS script "
 | 
			
		||||
"to use OpenVPN TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous devez ajouter le fichier contenant la clef OpenVPN générée par le "
 | 
			
		||||
"script OpenMPTCProuter VPS pour utiliser OpenVPN TCP"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:120
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:131
 | 
			
		||||
msgid "You should disable IPv6 here if server doesn't provide IPv6."
 | 
			
		||||
msgstr "Vous devriez désactiver IPv6 ici si le serveur ne supporte pas IPv6."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:313
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:389
 | 
			
		||||
msgid "You should disable SQM for LTE or any interfaces with variable speed."
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Vous devriez désactiver SQM pour la 4G ou toute interface avec une vitesse "
 | 
			
		||||
"très instable."
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:172
 | 
			
		||||
msgid "other"
 | 
			
		||||
msgstr "autre"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Can't access and use server part"
 | 
			
		||||
#~ msgstr "Impossible d'accéder et d'utiliser la partie serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Can't contact Server Admin Script"
 | 
			
		||||
#~ msgstr "Impossible de contacter le script d'administration du serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Can't get public IP address from ShadowSocks"
 | 
			
		||||
#~ msgstr "Pas d'adresse IP publique récupérée via ShadowSocks"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Can't ping server"
 | 
			
		||||
#~ msgstr "Pas de réponse du serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Core temp:"
 | 
			
		||||
#~ msgstr "Température du cœur :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "DNS issue: can't resolve hostname"
 | 
			
		||||
#~ msgstr "Soucis DNS : impossible de résoudre le domaine"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Direct output"
 | 
			
		||||
#~ msgstr "Sortie directe"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Filesystem is readonly"
 | 
			
		||||
#~ msgstr "Système de fichiers en lecture seule"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Gateway DOWN"
 | 
			
		||||
#~ msgstr "La passerelle ne répond pas"
 | 
			
		||||
 | 
			
		||||
#~ msgid "IPv6 route received"
 | 
			
		||||
#~ msgstr "Route IPv6 reçue"
 | 
			
		||||
 | 
			
		||||
#~ msgid "IPv6:"
 | 
			
		||||
#~ msgstr "IPv6 :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Latest available version"
 | 
			
		||||
#~ msgstr "Dernière version disponible"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Load:"
 | 
			
		||||
#~ msgstr "Charge :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "MPTCP is not enabled on the server"
 | 
			
		||||
#~ msgstr "MPTCP n'est pas activé sur le serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "MPTCP may not be enabled on the server"
 | 
			
		||||
#~ msgstr "MPTCP semble ne pas être activé sur le serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Multipath current state is"
 | 
			
		||||
#~ msgstr "Multipath est actuellement"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Multipath master already defined"
 | 
			
		||||
#~ msgstr "Maître multipath déjà défini"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Multipath seems to be blocked on the connection"
 | 
			
		||||
#~ msgstr "Multipath semble bloquer sur la connexion"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Network interface duplicated"
 | 
			
		||||
#~ msgstr "Interface réseau dupliquée"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No IP defined"
 | 
			
		||||
#~ msgstr "Aucune IP définie"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No IPv6 access"
 | 
			
		||||
#~ msgstr "Pas d'accès IPv6"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No Server ping response after 1 second"
 | 
			
		||||
#~ msgstr "Pas de réponse du serveur après 1 seconde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No VPS IP address, No WAN IP address"
 | 
			
		||||
#~ msgstr "Pas d'adresse IP du serveur, pas d'adresse IP WAN"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No WAN IP address detected in less than 1 second"
 | 
			
		||||
#~ msgstr "Aucune adresse IP WAN détectée en moins d'une seconde"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No data"
 | 
			
		||||
#~ msgstr "Pas de données"
 | 
			
		||||
 | 
			
		||||
#~ msgid "No gateway defined"
 | 
			
		||||
#~ msgstr "Aucune passerelle définie"
 | 
			
		||||
 | 
			
		||||
#~ msgid "OpenVPN key"
 | 
			
		||||
#~ msgstr "Clef OpenVPN"
 | 
			
		||||
 | 
			
		||||
#~ msgid "ShadowSocks is DISABLED"
 | 
			
		||||
#~ msgstr "ShadowSocks est désactivé"
 | 
			
		||||
 | 
			
		||||
#~ msgid "ShadowSocks is not running"
 | 
			
		||||
#~ msgstr "ShadowSocks n'est pas lancé"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Uptime:"
 | 
			
		||||
#~ msgstr "Durée de fonctionnement :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "VPN IPv6 tunnel DOWN"
 | 
			
		||||
#~ msgstr "Le tunnel IPv6 ne répond pas"
 | 
			
		||||
 | 
			
		||||
#~ msgid "VPN is not running"
 | 
			
		||||
#~ msgstr "Le VPN n'est pas lancé"
 | 
			
		||||
 | 
			
		||||
#~ msgid "VPN tunnel DOWN"
 | 
			
		||||
#~ msgstr "Le VPN ne répond pas"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Wan IP and gateway are identical"
 | 
			
		||||
#~ msgstr "La passerelle et l'adresse IP du WAN sont identiques"
 | 
			
		||||
 | 
			
		||||
#~ msgid "You"
 | 
			
		||||
#~ msgstr "Vous"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "You need to upload OpenVPN key file generated by server install script to "
 | 
			
		||||
#~ "use OpenVPN TCP"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Vous devez ajouter le fichier contenant la clef OpenVPN générée par le "
 | 
			
		||||
#~ "script d'installation du serveur pour utiliser OpenVPN TCP"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Your IP was not leased by this router"
 | 
			
		||||
#~ msgstr "Votre IP n'a pas été attribuée par ce routeur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "address:"
 | 
			
		||||
#~ msgstr "adresse :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "empty key"
 | 
			
		||||
#~ msgstr "clef vide"
 | 
			
		||||
 | 
			
		||||
#~ msgid "ip address:"
 | 
			
		||||
#~ msgstr "adresse ip :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "latency:"
 | 
			
		||||
#~ msgstr "latence :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "mtu:"
 | 
			
		||||
#~ msgstr "mtu :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "range:"
 | 
			
		||||
#~ msgstr "plage :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "wan address:"
 | 
			
		||||
#~ msgstr "adresse WAN :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "whois:"
 | 
			
		||||
#~ msgstr "whois :"
 | 
			
		||||
 | 
			
		||||
#~ msgid "GloryTUN is not running"
 | 
			
		||||
#~ msgstr "Glorytun n'est pas lancé"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Key to configure and retrieve others keys from Server. Empty to disable."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Clef pour configurer et récupérer les autres clefs depuis le serveur. "
 | 
			
		||||
#~ "Vide pour désactiver."
 | 
			
		||||
 | 
			
		||||
#~ msgid "All OpenMPTCProuter settings"
 | 
			
		||||
#~ msgstr "Tous les paramètres d'OpenMPTCProuter"
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "Key to configure and retrieve others keys from OpenMPTCProuter VPS. Empty "
 | 
			
		||||
#~ "to disable."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Clef pour configurer et récupérer les autres clefs depuis OpenMPTCProuter "
 | 
			
		||||
#~ "VPS. Vide pour désactiver."
 | 
			
		||||
 | 
			
		||||
#~ msgid "OpenMPTCProuter VPS key"
 | 
			
		||||
#~ msgstr "Clef d'OpenMPTCProuter VPS"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Redirects all ports from server to OpenMPTCProuter"
 | 
			
		||||
#~ msgstr "Rédiriger tous les ports du serveur vers OpenMPTCProuter"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Update OpenMPTCProuter server"
 | 
			
		||||
#~ msgstr "Met à jour OpenMPTCProuter serveur"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Update remotly OpenMPTCProuter server to latest version when needed."
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Met à jour OpenMPTCProuter serveur à la dernière version quand c'est "
 | 
			
		||||
#~ "nécessaire."
 | 
			
		||||
 | 
			
		||||
#~ msgid ""
 | 
			
		||||
#~ "You need to upload OpenVPN key file generated by OpenMPTCProuter VPS "
 | 
			
		||||
#~ "script to use OpenVPN TCP"
 | 
			
		||||
#~ msgstr ""
 | 
			
		||||
#~ "Vous devez ajouter le fichier contenant la clef OpenVPN générée par le "
 | 
			
		||||
#~ "script OpenMPTCProuter VPS pour utiliser OpenVPN TCP"
 | 
			
		||||
 | 
			
		||||
#~ msgid "Disable IPv6"
 | 
			
		||||
#~ msgstr "Désactiver IPv6"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,24 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr "Content-Type: text/plain; charset=UTF-8"
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:367
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:210
 | 
			
		||||
msgid "A Dead Simple VPN is a TCP VPN that can replace Glorytun TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:205
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:207
 | 
			
		||||
msgid "A Dead Simple VPN key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:83
 | 
			
		||||
msgid "API username to retrieve personnalized settings from the server."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:443
 | 
			
		||||
msgid "Add an interface"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:108
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:119
 | 
			
		||||
msgid "Add server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -14,245 +27,347 @@ msgstr ""
 | 
			
		|||
msgid "Advanced Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:125
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:136
 | 
			
		||||
msgid "Advanced settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm:6
 | 
			
		||||
msgid "All OpenMPTCProuter settings"
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:284
 | 
			
		||||
msgid ""
 | 
			
		||||
"All VPN available here can do aggregation over MPTCP or using own internal "
 | 
			
		||||
"method."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/debug.htm:5
 | 
			
		||||
msgid "All router settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:179
 | 
			
		||||
msgid ""
 | 
			
		||||
"An Advanced Encryption Standard (AES) instruction set is integrated in the "
 | 
			
		||||
"processor."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:22
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:8
 | 
			
		||||
msgid "Backup on server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:20
 | 
			
		||||
msgid "Beta"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:134
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:145
 | 
			
		||||
msgid "By default ShadowSocks is used for TCP traffic."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:154
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:190
 | 
			
		||||
msgid "By default VPN is used for any traffic that is not TCP."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:113
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:124
 | 
			
		||||
msgid "Common server settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:257
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:323
 | 
			
		||||
msgid "DHCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:193
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:240
 | 
			
		||||
msgid "Default VPN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:61
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:247
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:62
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:303
 | 
			
		||||
msgid "Delete"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:146
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:157
 | 
			
		||||
msgid "Disable ShadowSocks"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:141
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:158
 | 
			
		||||
msgid "Disable TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:163
 | 
			
		||||
msgid "Disable TCP Fast Open on Linux and Shadowsocks configuration"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:148
 | 
			
		||||
msgid "Disable external check"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:318
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:178
 | 
			
		||||
msgid "Disable gateway ping"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:183
 | 
			
		||||
msgid "Disable gateway ping status check"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:57
 | 
			
		||||
msgid ""
 | 
			
		||||
"Disable ports redirection defined in firewall from server to this router"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:188
 | 
			
		||||
msgid "Disable server ping"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:193
 | 
			
		||||
msgid "Disable server ping status check"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:394
 | 
			
		||||
msgid "Download speed (Kb/s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:155
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:202
 | 
			
		||||
msgid "Dynamic change"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:135
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:115
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:142
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:126
 | 
			
		||||
msgid "Enable IPv6"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:308
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:384
 | 
			
		||||
msgid "Enable SQM"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:66
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:73
 | 
			
		||||
msgid "Enable ShadowSocks Obfuscating"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:162
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:163
 | 
			
		||||
msgid "Encryption"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:183
 | 
			
		||||
msgid "Encryption method is also used for Glorytun."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:198
 | 
			
		||||
msgid "Glorytun TCP is used by default for UDP and ICMP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:157
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:193
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:195
 | 
			
		||||
msgid "Glorytun key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:117
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:124
 | 
			
		||||
msgid "IPv4 TCP FIN timeout"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:129
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:136
 | 
			
		||||
msgid "IPv4 TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:111
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:118
 | 
			
		||||
msgid "IPv4 TCP Keepalive time"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:123
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:130
 | 
			
		||||
msgid "IPv4 TCP SYN retries"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:267
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:333
 | 
			
		||||
msgid "IPv4 address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:283
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:349
 | 
			
		||||
msgid "IPv4 gateway"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:277
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:343
 | 
			
		||||
msgid "IPv4 netmask"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:238
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:291
 | 
			
		||||
msgid "Interfaces settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:82
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:93
 | 
			
		||||
msgid ""
 | 
			
		||||
"Key to configure and retrieve others keys from OpenMPTCProuter VPS. Empty to "
 | 
			
		||||
"disable."
 | 
			
		||||
"Key to configure and retrieve others keys from Server and to set server "
 | 
			
		||||
"settings from OpenMPTCProuter."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:174
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:309
 | 
			
		||||
msgid "Label"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:314
 | 
			
		||||
msgid "Label for the interface"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:20
 | 
			
		||||
msgid "Last available backup on server:"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:222
 | 
			
		||||
msgid "MLVPN can replace Glorytun with connections with same latency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:169
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:217
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:219
 | 
			
		||||
msgid "MLVPN password"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:151
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:374
 | 
			
		||||
msgid "MPTCP over VPN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:198
 | 
			
		||||
msgid "Master interface selection"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:172
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:220
 | 
			
		||||
msgid "Maximum scaling CPU frequency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:166
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:214
 | 
			
		||||
msgid "Minimum scaling CPU frequency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:510
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:512
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:729
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wanstatus.htm:731
 | 
			
		||||
msgid "Network overview"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:108
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:115
 | 
			
		||||
msgid "Networks settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:156
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:24
 | 
			
		||||
msgid "No available backup on server."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:203
 | 
			
		||||
msgid "No change"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:76
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:169
 | 
			
		||||
msgid "None"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:83
 | 
			
		||||
msgid "Obfuscating plugin"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:95
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:102
 | 
			
		||||
msgid "Obfuscating type"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:71
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:78
 | 
			
		||||
msgid "Obfuscating will be enabled on both side"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:154
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:201
 | 
			
		||||
msgid "On wizard change"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:96
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:107
 | 
			
		||||
msgid "Only one server can be master, else all servers are set as backup."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:11
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:14
 | 
			
		||||
msgid "OpenMPTCProuter"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:77
 | 
			
		||||
msgid "OpenMPTCProuter VPS key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:181
 | 
			
		||||
msgid "OpenVPN key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:258
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:324
 | 
			
		||||
msgid "Other"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:253
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:319
 | 
			
		||||
msgid "Protocol"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:50
 | 
			
		||||
msgid "Redirects all ports from server to OpenMPTCProuter"
 | 
			
		||||
msgid "Redirects all ports from server to this router"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:198
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:376
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:204
 | 
			
		||||
msgid "Redundant"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:30
 | 
			
		||||
msgid "Restore backup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:246
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:452
 | 
			
		||||
msgid "Save & Apply"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:178
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:173
 | 
			
		||||
msgid "Save vnstats statistics on disk"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:168
 | 
			
		||||
msgid "Save vnstats stats"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:226
 | 
			
		||||
msgid "Scaling governor"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:370
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:446
 | 
			
		||||
msgid "Select the device you want to base the interface on."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:67
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/backup.htm:31
 | 
			
		||||
msgid "Send backup"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:68
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:70
 | 
			
		||||
msgid "Server IP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:71
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:72
 | 
			
		||||
msgid "Server IP will be set for ShadowSocks, Glorytun, OpenVPN and MLVPN"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:51
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:88
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:90
 | 
			
		||||
msgid "Server key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:52
 | 
			
		||||
msgid "Server settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:272
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:78
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:80
 | 
			
		||||
msgid "Server username"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:338
 | 
			
		||||
msgid "Set an IP in the same network as the modem"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:288
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:354
 | 
			
		||||
msgid "Set here IP of the modem"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:91
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:102
 | 
			
		||||
msgid "Set server as master"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:231
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:284
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set the default VPN used for UDP and ICMP when ShadowSocks is enabled, for "
 | 
			
		||||
"all traffic if ShadowSocks is disabled."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:328
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:404
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set value between 80-95% of max download speed link. 0 to disable SQM/QoS."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:344
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:420
 | 
			
		||||
msgid ""
 | 
			
		||||
"Set value between 80-95% of max upload speed link. 0 to disable SQM/QoS."
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			@ -261,23 +376,24 @@ msgstr ""
 | 
			
		|||
msgid "Settings Wizard"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:141
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:152
 | 
			
		||||
msgid "ShadowSocks is used for TCP."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:136
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:147
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:149
 | 
			
		||||
msgid "ShadowSocks key"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:133
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:144
 | 
			
		||||
msgid "ShadowSocks settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:22
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:24
 | 
			
		||||
msgid "Show all settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:256
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:322
 | 
			
		||||
msgid "Static address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -285,36 +401,51 @@ msgstr ""
 | 
			
		|||
msgid "Status"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:163
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:211
 | 
			
		||||
msgid "Systems settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:181
 | 
			
		||||
msgid ""
 | 
			
		||||
"There is no Advanced Encryption Standard (AES) instruction set integrated in "
 | 
			
		||||
"the processor, you should use chacha20."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:234
 | 
			
		||||
msgid "UBOND can replace Glorytun with connections with same latency"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:229
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:231
 | 
			
		||||
msgid "UBOND password"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:27
 | 
			
		||||
msgid "Update"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:22
 | 
			
		||||
msgid "Update OpenMPTCProuter server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:18
 | 
			
		||||
msgid "Update VPS"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:20
 | 
			
		||||
msgid "Update remotly OpenMPTCProuter server to latest version when needed."
 | 
			
		||||
msgid "Update remotly the server to latest version when needed."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:334
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:22
 | 
			
		||||
msgid "Update server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:410
 | 
			
		||||
msgid "Upload speed (Kb/s)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:323
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:339
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:399
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:415
 | 
			
		||||
msgid "Used by Glorytun UDP and SQM/QoS if enabled. 0 to use default value."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:153
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:189
 | 
			
		||||
msgid "VPN settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -322,37 +453,38 @@ msgstr ""
 | 
			
		|||
msgid "VPS settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:146
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/settings.htm:153
 | 
			
		||||
msgid ""
 | 
			
		||||
"When enable check are done on external sites to get each WAN IP and the IP "
 | 
			
		||||
"used to go outside."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/controller/openmptcprouter.lua:12
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:49
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:50
 | 
			
		||||
msgid "Wizard"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:262
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:379
 | 
			
		||||
msgid "You can enable MPTCP over VPN if your provider filter Multipath TCP."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:328
 | 
			
		||||
msgid ""
 | 
			
		||||
"You can use DHCP if you have multiple real ethernet ports. Select other if "
 | 
			
		||||
"you want to use another protocol available in Network Interfaces page."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:239
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:292
 | 
			
		||||
msgid "You must disable DHCP on your modems and set IP in different networks."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:187
 | 
			
		||||
msgid ""
 | 
			
		||||
"You need to upload OpenVPN key file generated by OpenMPTCProuter VPS script "
 | 
			
		||||
"to use OpenVPN TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:120
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:131
 | 
			
		||||
msgid "You should disable IPv6 here if server doesn't provide IPv6."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:313
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:389
 | 
			
		||||
msgid "You should disable SQM for LTE or any interfaces with variable speed."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: luci-app-openmptcprouter/luasrc/view/openmptcprouter/wizard.htm:172
 | 
			
		||||
msgid "other"
 | 
			
		||||
msgstr ""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								luci-app-openmptcprouter/root/bin/omr-3g
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										10
									
								
								luci-app-openmptcprouter/root/bin/omr-3g
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
MODEM_INTF=$1
 | 
			
		||||
[ -z "$MODEM_INTF" ] && return
 | 
			
		||||
SIGNAL_INFO=$(timeout 1 gcom info -d $MODEM_INTF)
 | 
			
		||||
[ -z "$SIGNAL_INFO" ] && return
 | 
			
		||||
RSSI=$(echo $SIGNAL_INFO | grep RSSI | awk -F: '{print $2}')
 | 
			
		||||
[ -z "$RSSI" ] && return
 | 
			
		||||
ASU=$(((RSSI + 113) / 2 ))
 | 
			
		||||
PERCENT=$((((ASU - 0) * 100) / ( 91 - 0 )))
 | 
			
		||||
echo $PERCENT
 | 
			
		||||
							
								
								
									
										14
									
								
								luci-app-openmptcprouter/root/bin/omr-huawei
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										14
									
								
								luci-app-openmptcprouter/root/bin/omr-huawei
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,14 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
MODEM_IP=`echo $1 | grep -E '^(192\.168|10\.|172\.1[6789]\.|172\.2[0-9]\.|172\.3[01]\.)'`
 | 
			
		||||
[ -z "$MODEM_IP" ] && return
 | 
			
		||||
SESTOK=$(curl -s -m 1 -X GET "http://$MODEM_IP/api/webserver/SesTokInfo")
 | 
			
		||||
[ -z "$SESTOK" ] && return
 | 
			
		||||
COOKIE=$(echo $SESTOK | sed -ne '/SesInfo/{s/.*<SesInfo>\(.*\)<\/SesInfo>.*/\1/p;q;}')
 | 
			
		||||
COOKIE=$(echo $COOKIE | sed 's:SessionID=::')
 | 
			
		||||
TOKEN=$(echo $SESTOK | sed -ne '/TokInfo/{s/.*<TokInfo>\(.*\)<\/TokInfo>.*/\1/p;q;}')
 | 
			
		||||
curl -s -m 1 -X GET "http://$MODEM_IP/api/monitoring/status" -H "Cookie: SessionID=$COOKIE" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: text/xml" > /tmp/huawei-$1-status
 | 
			
		||||
SIGNAL_ICON=$(cat /tmp/huawei-$1-status | grep SignalIcon | sed -e 's/<[^>]*>//g')
 | 
			
		||||
MAX_SIGNAL=$(cat /tmp/huawei-$1-status | grep maxsignal | sed -e 's/<[^>]*>//g')
 | 
			
		||||
if [ -n "$SIGNAL_ICON" ] && [ -n "$MAX_SIGNAL" ]; then
 | 
			
		||||
        echo $((100 * ${SIGNAL_ICON} / ${MAX_SIGNAL}))
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,10 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
checkip=$(dig +short A ip.openmptcprouter.com | tr -d "\n")
 | 
			
		||||
check_ipv4_website="$(uci -q get openmptcprouter.settings.check_ipv4_website)"
 | 
			
		||||
[ -z "$check_ipv4_website" ] && check_ipv4_website="http://ip.openmptcprouter.com"
 | 
			
		||||
checkip=$(echo $check_ipv4_website | sed -e 's/https:\/\///' -e 's/http:\/\///' | xargs dig +short A | tr -d "\n")
 | 
			
		||||
ipset add ss_rules_dst_bypass_all $checkip > /dev/null 2>&1
 | 
			
		||||
curl -s -4 -m 3 --interface $1 http://ip.openmptcprouter.com
 | 
			
		||||
ip="$(curl -s -4 -m 2 --interface $1 $check_ipv4_website)"
 | 
			
		||||
ipset del ss_rules_dst_bypass_all $checkip > /dev/null 2>&1
 | 
			
		||||
if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
 | 
			
		||||
	echo $ip
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										12
									
								
								luci-app-openmptcprouter/root/bin/omr-modemmanager
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										12
									
								
								luci-app-openmptcprouter/root/bin/omr-modemmanager
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
MODEM_INTF=$1
 | 
			
		||||
[ -z "$MODEM_INTF" ] && return
 | 
			
		||||
timeout 1 mmcli -L | while read MODEM; do
 | 
			
		||||
	MODEM_ID=$(echo $MODEM |  awk -F' ' '{print $1}' | awk -F/ '{print $6}')
 | 
			
		||||
	MODEM_INFO="$(timeout 1 mmcli -m $MODEM_ID --output-keyvalue)"
 | 
			
		||||
	if [ -n "$MODEM_INFO" ] && [ "$(echo "$MODEM_INFO" | grep 'modem.generic.device ' | awk -F": " '{print $2}')" = "$MODEM_INTF" ]; then
 | 
			
		||||
		PERCENT=$(echo "$MODEM_INFO" | grep 'modem.generic.signal-quality.value' | awk -F": " '{print $2}')
 | 
			
		||||
		echo $PERCENT
 | 
			
		||||
		exit
 | 
			
		||||
	fi
 | 
			
		||||
done
 | 
			
		||||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
multipathip=$(dig +short A multipath-tcp.org | tr -d "\n")
 | 
			
		||||
ipset add ss_rules_dst_bypass_all $multipathip > /dev/null 2>&1
 | 
			
		||||
curl -s -4 -m 3 --interface $1 http://www.multipath-tcp.org
 | 
			
		||||
curl -s -4 -m 2 --interface $1 http://www.multipath-tcp.org
 | 
			
		||||
ipset del ss_rules_dst_bypass_all $multipathip > /dev/null 2>&1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										27
									
								
								luci-app-openmptcprouter/root/bin/omr-qmi
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										27
									
								
								luci-app-openmptcprouter/root/bin/omr-qmi
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,27 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
MODEM_INTF=$1
 | 
			
		||||
[ -z "$MODEM_INTF" ] && return
 | 
			
		||||
SIGNAL_INFO=$(timeout 1 uqmi -d $MODEM_INTF --get-signal-info)
 | 
			
		||||
[ -z "$SIGNAL_INFO" ] && return
 | 
			
		||||
TYPE=$(echo $SIGNAL_INFO | jsonfilter -e '@.type')
 | 
			
		||||
if [ "$TYPE" = "gsm" ]; then
 | 
			
		||||
	RSSI=$(echo $SIGNAL_INFO | jsonfilter -e '@.rssi')
 | 
			
		||||
	[ -z "$RSSI" ] && return
 | 
			
		||||
	ASU=$(((RSSI + 113) / 2 ))
 | 
			
		||||
	PERCENT=$((((ASU - 0) * 100) / ( 91 - 0 )))
 | 
			
		||||
	echo $PERCENT
 | 
			
		||||
fi
 | 
			
		||||
if [ "$TYPE" = "umts" ]; then
 | 
			
		||||
	RSCP=$(echo $SIGNAL_INFO | jsonfilter -e '@.rscp')
 | 
			
		||||
	[ -z "$RSCP" ] && return
 | 
			
		||||
	ASU=$((RSCP + 116))
 | 
			
		||||
	PERCENT=$((((ASU - 0) * 100) / ( 91 - 0 )))
 | 
			
		||||
	echo $PERCENT
 | 
			
		||||
fi
 | 
			
		||||
if [ "$TYPE" = "lte" ]; then
 | 
			
		||||
	RSRP=$(echo $SIGNAL_INFO | jsonfilter -e '@.rsrp')
 | 
			
		||||
	[ -z "$RSRP" ] && return
 | 
			
		||||
	ASU=$((RSRP + 140))
 | 
			
		||||
	PERCENT=$((((ASU - 3) * 100) / ( 70 - 3 )))
 | 
			
		||||
	echo $PERCENT
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
#!/bin/sh
 | 
			
		||||
INTERFACE=$2
 | 
			
		||||
if [ -z "$INTERFACE" ]; then
 | 
			
		||||
	tracebox -m 30 -l "pkt = ip{dst=to} / tcp{dst=65101} / MPCAPABLE / MSS / WSCALE if string.find(tostring(tracebox(pkt)),'-TCPOptionMPTCPCapable') then print 'MPTCP disabled' elseif string.find(tostring(tracebox(pkt)),'MPTCP') then print 'MPTCP enabled' end" $1
 | 
			
		||||
	tracebox -m 20 -l "pkt = ip{dst=to} / tcp{dst=65101} / MPCAPABLE / MSS / WSCALE if string.find(tostring(tracebox(pkt)),'-TCPOptionMPTCPCapable') then print 'MPTCP disabled' elseif string.find(tostring(tracebox(pkt)),'MPTCP') then print 'MPTCP enabled' end" $1
 | 
			
		||||
else
 | 
			
		||||
	tracebox -m 30 -l "pkt = ip{dst=to} / tcp{dst=65101} / MPCAPABLE / MSS / WSCALE if string.find(tostring(tracebox(pkt)),'-TCPOptionMPTCPCapable') then print 'MPTCP disabled' elseif string.find(tostring(tracebox(pkt)),'MPTCP') then print 'MPTCP enabled' end" -i $INTERFACE $1
 | 
			
		||||
	tracebox -m 20 -l "pkt = ip{dst=to} / tcp{dst=65101} / MPCAPABLE / MSS / WSCALE if string.find(tostring(tracebox(pkt)),'-TCPOptionMPTCPCapable') then print 'MPTCP disabled' elseif string.find(tostring(tracebox(pkt)),'MPTCP') then print 'MPTCP enabled' end" -i $INTERFACE $1
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -9,6 +9,11 @@ USE_PROCD=1
 | 
			
		|||
omr_intf_del() {
 | 
			
		||||
	uci -q delete openmptcprouter.$1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
omr_intf_check() {
 | 
			
		||||
	[ "$(uci -q get network.$1)" = "" ] && omr_intf_del $1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
omr_intf_set() {
 | 
			
		||||
	config_get multipath "$1" multipath
 | 
			
		||||
	config_get ifname "$1" ifname
 | 
			
		||||
| 
						 | 
				
			
			@ -19,6 +24,7 @@ omr_intf_set() {
 | 
			
		|||
	[ -z "$multipath" ] || [ "$multipath" = "off" ] && [ "$1" != "omrvpn" ] && [ "$1" != "glorytun" ] && return
 | 
			
		||||
 | 
			
		||||
	uci -q set openmptcprouter.$1=interface
 | 
			
		||||
	uci -q set openmptcprouter.$1.multipath="$multipath"
 | 
			
		||||
	config_get disable_ipv6 settings disable_ipv6 "0"
 | 
			
		||||
	if [ "$disable_ipv6" = "1" ] || [ "$1" != "omr6in4" ]; then
 | 
			
		||||
		uci -q set network.$1.ipv6=0
 | 
			
		||||
| 
						 | 
				
			
			@ -27,45 +33,11 @@ omr_intf_set() {
 | 
			
		|||
	fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set_ipv6_state() {
 | 
			
		||||
	local disable_ipv6=$1
 | 
			
		||||
	local sysctl_ipv6=0
 | 
			
		||||
	sysctl -w net.ipv6.conf.all.disable_ipv6=$sysctl_ipv6
 | 
			
		||||
	sed -i 's:^net.ipv6.conf.all.disable_ipv6=[0-9]*:net.ipv6.conf.all.disable_ipv6=$sysctl_ipv6:' /etc/sysctl.d/zzz_openmptcprouter.conf
 | 
			
		||||
	
 | 
			
		||||
	uci -q set firewall.@defaults[0].disable_ipv6=$disable_ipv6
 | 
			
		||||
	uci -q commit firewall
 | 
			
		||||
 | 
			
		||||
	if [ "$disable_ipv6" == "1" ]; then
 | 
			
		||||
		uci -q set dhcp.lan.ra_default="0"
 | 
			
		||||
		uci -q set network.lan.ipv6="0"
 | 
			
		||||
		uci -q delete network.lan.ipv6
 | 
			
		||||
		uci -q delete dhcp.lan.dhcpv6
 | 
			
		||||
		uci -q delete dhcp.lan.ra
 | 
			
		||||
		uci -q delete dhcp.lan.ra_default
 | 
			
		||||
		uci -q delete dhcp.lan.ra_preference
 | 
			
		||||
		uci -q set shadowsocks-libev.hi.local_address="0.0.0.0"
 | 
			
		||||
	else
 | 
			
		||||
		uci -q set dhcp.lan.ra_default="1"
 | 
			
		||||
		uci -q set dhcp.lan.ra_preference="high"
 | 
			
		||||
		uci -q set network.lan.ipv6="1"
 | 
			
		||||
		uci -q set network.lan.delegate="0"
 | 
			
		||||
		uci -q set shadowsocks-libev.hi.local_address="::"
 | 
			
		||||
	fi
 | 
			
		||||
	uci -q commit shadowsocks-libev
 | 
			
		||||
	uci -q commit dhcp
 | 
			
		||||
	uci -q commit network
 | 
			
		||||
	#if [ "$disable_ipv6" == "1" ]; then
 | 
			
		||||
	#	/etc/init.d/odhcpd stop >/dev/null 2>&1
 | 
			
		||||
	#	/etc/init.d/odhcpd disable >/dev/null 2>&1
 | 
			
		||||
	#fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
start_service() {
 | 
			
		||||
	local scaling_min_freq scaling_max_freq
 | 
			
		||||
 | 
			
		||||
	#config_load openmptcprouter
 | 
			
		||||
	#config_foreach omr_intf_del interface
 | 
			
		||||
	config_load openmptcprouter
 | 
			
		||||
	config_foreach omr_intf_check interface
 | 
			
		||||
	config_load network
 | 
			
		||||
	config_foreach omr_intf_set interface
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -88,11 +60,6 @@ start_service() {
 | 
			
		|||
			echo $scaling_governor > $c/scaling_governor
 | 
			
		||||
		done
 | 
			
		||||
	}
 | 
			
		||||
	config_get disable_ipv6 settings disable_ipv6 "0"
 | 
			
		||||
	if [ "$(uci -q get firewall.@defaults[0].disable_ipv6)" != "$disable_ipv6" ]; then
 | 
			
		||||
		set_ipv6_state $disable_ipv6
 | 
			
		||||
	fi
 | 
			
		||||
	
 | 
			
		||||
	# 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' /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' /etc/sysctl.d/10-default.conf
 | 
			
		||||
| 
						 | 
				
			
			@ -102,3 +69,7 @@ reload_service() {
 | 
			
		|||
	rc_procd start_service
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
service_triggers() {
 | 
			
		||||
	procd_add_reload_trigger "openmptcprouter" "network"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -27,13 +27,14 @@ if [ "$(uci -q get ucitrack.@network[-1].affects | grep openmptcprouter)" = "" ]
 | 
			
		|||
		commit ucitrack
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.vps)" != "server" ]; then
 | 
			
		||||
if [ "$(uci -q show openmptcprouter | grep server)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.vps=server
 | 
			
		||||
		set openmptcprouter.vps.username="openmptcprouter"
 | 
			
		||||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.vps.master)" = "" ]; then
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.vps)" = "server" ] && [ "$(uci -q get openmptcprouter.vps.master)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.vps.master=1
 | 
			
		||||
		set openmptcprouter.vps.backup=0
 | 
			
		||||
| 
						 | 
				
			
			@ -65,4 +66,28 @@ if [ "$(uci -q get openmptcprouter.settings.disable_ipv6)" = "" ]; then
 | 
			
		|||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.settings.check_ipv4_website)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.settings.check_ipv4_website='http://ip.openmptcprouter.com'
 | 
			
		||||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.settings.check_ipv6_website)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.settings.check_ipv6_website='http://ipv6.openmptcprouter.com'
 | 
			
		||||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.settings.status_vps_timeout)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.settings.status_vps_timeout=2
 | 
			
		||||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
if [ "$(uci -q get openmptcprouter.settings.status_getip_timeout)" = "" ]; then
 | 
			
		||||
	uci -q batch <<-EOF >/dev/null
 | 
			
		||||
		set openmptcprouter.settings.status_getip_timeout=2
 | 
			
		||||
		commit openmptcprouter
 | 
			
		||||
	EOF
 | 
			
		||||
fi
 | 
			
		||||
exit 0
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1485
									
								
								luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										1485
									
								
								luci-app-openmptcprouter/root/usr/libexec/rpcd/openmptcprouter
									
										
									
									
									
										Executable file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
#
 | 
			
		||||
# Copyright (C) 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
# Copyright (C) 2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org> for OpenMPTCProuter
 | 
			
		||||
#
 | 
			
		||||
# This is free software, licensed under the Apache License, Version 2.0 .
 | 
			
		||||
#
 | 
			
		||||
| 
						 | 
				
			
			@ -8,10 +8,10 @@
 | 
			
		|||
include $(TOPDIR)/rules.mk
 | 
			
		||||
 | 
			
		||||
LUCI_TITLE:=LuCI Support for shadowsocks-libev
 | 
			
		||||
LUCI_DEPENDS:=+shadowsocks-libev-config +shadowsocks-libev-ss-local +shadowsocks-libev-ss-redir +shadowsocks-libev-ss-rules +shadowsocks-libev-ss-server +shadowsocks-libev-ss-tunnel +simple-obfs
 | 
			
		||||
LUCI_DEPENDS:=+luci-compat
 | 
			
		||||
 | 
			
		||||
PKG_LICENSE:=Apache-2.0
 | 
			
		||||
 | 
			
		||||
include ../luci/luci.mk
 | 
			
		||||
include $(TOPDIR)/feeds/luci/luci.mk
 | 
			
		||||
 | 
			
		||||
# call BuildPackage - OpenWrt buildroot signature
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,312 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
'require uci';
 | 
			
		||||
'require form';
 | 
			
		||||
'require network';
 | 
			
		||||
 | 
			
		||||
var names_options_server = [
 | 
			
		||||
	'server',
 | 
			
		||||
	'server_port',
 | 
			
		||||
	'method',
 | 
			
		||||
	'key',
 | 
			
		||||
	'password',
 | 
			
		||||
	'plugin',
 | 
			
		||||
	'plugin_opts',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var names_options_client = [
 | 
			
		||||
	'server',
 | 
			
		||||
	'local_address',
 | 
			
		||||
	'local_port',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var names_options_common = [
 | 
			
		||||
	'verbose',
 | 
			
		||||
	'ipv6_first',
 | 
			
		||||
	'fast_open',
 | 
			
		||||
	'no_delay',
 | 
			
		||||
	'reuse_port',
 | 
			
		||||
	'mode',
 | 
			
		||||
	'mtu',
 | 
			
		||||
	'timeout',
 | 
			
		||||
	'user',
 | 
			
		||||
	'mptcp',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var modes = [
 | 
			
		||||
	'tcp_only',
 | 
			
		||||
	'tcp_and_udp',
 | 
			
		||||
	'udp_only',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
var methods = [
 | 
			
		||||
	'none',
 | 
			
		||||
	// aead
 | 
			
		||||
	'aes-128-gcm',
 | 
			
		||||
	'aes-192-gcm',
 | 
			
		||||
	'aes-256-gcm',
 | 
			
		||||
	'chacha20-ietf-poly1305',
 | 
			
		||||
	'xchacha20-ietf-poly1305',
 | 
			
		||||
	// stream
 | 
			
		||||
	'table',
 | 
			
		||||
	'rc4',
 | 
			
		||||
	'rc4-md5',
 | 
			
		||||
	'aes-128-cfb',
 | 
			
		||||
	'aes-192-cfb',
 | 
			
		||||
	'aes-256-cfb',
 | 
			
		||||
	'aes-128-ctr',
 | 
			
		||||
	'aes-192-ctr',
 | 
			
		||||
	'aes-256-ctr',
 | 
			
		||||
	'bf-cfb',
 | 
			
		||||
	'camellia-128-cfb',
 | 
			
		||||
	'camellia-192-cfb',
 | 
			
		||||
	'camellia-256-cfb',
 | 
			
		||||
	'salsa20',
 | 
			
		||||
	'chacha20',
 | 
			
		||||
	'chacha20-ietf',
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
function ucival_to_bool(val) {
 | 
			
		||||
	return val === 'true' || val === '1' || val === 'yes' || val === 'on';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
return L.Class.extend({
 | 
			
		||||
	values_actions: function(o) {
 | 
			
		||||
		o.value('bypass');
 | 
			
		||||
		o.value('forward');
 | 
			
		||||
		if (o.option !== 'dst_default') {
 | 
			
		||||
			o.value('checkdst');
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	values_redir: function(o, xmode) {
 | 
			
		||||
		uci.sections('shadowsocks-libev', 'ss_redir', function(sdata) {
 | 
			
		||||
			var disabled = ucival_to_bool(sdata['disabled']),
 | 
			
		||||
				sname = sdata['.name'],
 | 
			
		||||
				mode = sdata['mode'] || 'tcp_only';
 | 
			
		||||
			if (!disabled && mode.indexOf(xmode) !== -1) {
 | 
			
		||||
				o.value(sname, sname + ' - ' + mode);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
		o.value('', '<unset>');
 | 
			
		||||
		o.value('all', 'all');
 | 
			
		||||
		o.default = '';
 | 
			
		||||
	},
 | 
			
		||||
	values_serverlist: function(o) {
 | 
			
		||||
		uci.sections('shadowsocks-libev', 'server', function(sdata) {
 | 
			
		||||
			var sname = sdata['.name'],
 | 
			
		||||
				server = sdata['server'],
 | 
			
		||||
				server_port = sdata['server_port'];
 | 
			
		||||
			if (server && server_port) {
 | 
			
		||||
				var disabled = ucival_to_bool(sdata['.disabled']) ? ' - disabled' : '',
 | 
			
		||||
					desc = '%s - %s:%s%s'.format(sname, server, server_port, disabled);
 | 
			
		||||
				o.value(sname, desc);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
	values_ipaddr: function(o, netDevs) {
 | 
			
		||||
		netDevs.forEach(function(v) {
 | 
			
		||||
			v.getIPAddrs().forEach(function(a) {
 | 
			
		||||
				var host = a.split('/')[0];
 | 
			
		||||
				o.value(host, '%s (%s)'.format(host, v.getShortName()));
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
	options_client: function(s, tab, netDevs) {
 | 
			
		||||
		var o = s.taboption(tab, form.ListValue, 'server', _('Remote server'));
 | 
			
		||||
		this.values_serverlist(o);
 | 
			
		||||
		o = s.taboption(tab, form.Value, 'local_address', _('Local address'));
 | 
			
		||||
		o.datatype = 'ipaddr';
 | 
			
		||||
		o.placeholder = '0.0.0.0';
 | 
			
		||||
		this.values_ipaddr(o, netDevs);
 | 
			
		||||
		o = s.taboption(tab, form.Value, 'local_port', _('Local port'));
 | 
			
		||||
		o.datatype = 'port';
 | 
			
		||||
	},
 | 
			
		||||
	options_server: function(s, opts) {
 | 
			
		||||
		var o, optfunc,
 | 
			
		||||
			tab = opts && opts.tab || null;
 | 
			
		||||
 | 
			
		||||
		if (!tab) {
 | 
			
		||||
			optfunc = function(/* ... */) {
 | 
			
		||||
				var o = s.option.apply(s, arguments);
 | 
			
		||||
				o.editable = true;
 | 
			
		||||
				return o;
 | 
			
		||||
			};
 | 
			
		||||
		} else {
 | 
			
		||||
			optfunc = function(/* ... */) {
 | 
			
		||||
				var o = s.taboption.apply(s, L.varargs(arguments, 0, tab));
 | 
			
		||||
				o.editable = true;
 | 
			
		||||
				return o;
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		o = optfunc(form.Value, 'server', _('Server'));
 | 
			
		||||
		o.datatype = 'host';
 | 
			
		||||
		o.size = 16;
 | 
			
		||||
 | 
			
		||||
		o = optfunc(form.Value, 'server_port', _('Server port'));
 | 
			
		||||
		o.datatype = 'port';
 | 
			
		||||
		o.size = 5;
 | 
			
		||||
 | 
			
		||||
		o = optfunc(form.ListValue, 'method', _('Method'));
 | 
			
		||||
		methods.forEach(function(m) {
 | 
			
		||||
			o.value(m);
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		o = optfunc(form.Value, 'password', _('Password'));
 | 
			
		||||
		o.password = true;
 | 
			
		||||
		o.size = 12;
 | 
			
		||||
 | 
			
		||||
		o = optfunc(form.Value, 'key', _('Key (base64)'));
 | 
			
		||||
		o.datatype = 'base64';
 | 
			
		||||
		o.password = true;
 | 
			
		||||
		o.size = 12;
 | 
			
		||||
		o.modalonly = true;;
 | 
			
		||||
 | 
			
		||||
		optfunc(form.Value, 'plugin', _('Plugin')).modalonly = true;
 | 
			
		||||
 | 
			
		||||
		optfunc(form.Value, 'plugin_opts', _('Plugin Options')).modalonly = true;
 | 
			
		||||
	},
 | 
			
		||||
	options_common: function(s, tab) {
 | 
			
		||||
		var o = s.taboption(tab, form.ListValue, 'mode', _('Mode of operation'));
 | 
			
		||||
		modes.forEach(function(m) {
 | 
			
		||||
			o.value(m);
 | 
			
		||||
		});
 | 
			
		||||
		o.default = 'tcp_and_udp';
 | 
			
		||||
		o = s.taboption(tab, form.Value, 'mtu', _('MTU'));
 | 
			
		||||
		o.datatype = 'uinteger';
 | 
			
		||||
		o = s.taboption(tab, form.Value, 'timeout', _('Timeout (sec)'));
 | 
			
		||||
		o.datatype = 'uinteger';
 | 
			
		||||
		s.taboption(tab, form.Value, 'user', _('Run as'));
 | 
			
		||||
 | 
			
		||||
		s.taboption(tab, form.Flag, 'verbose', _('Verbose'));
 | 
			
		||||
		s.taboption(tab, form.Flag, 'ipv6_first', _('IPv6 First'), _('Prefer IPv6 addresses when resolving names'));
 | 
			
		||||
		s.taboption(tab, form.Flag, 'fast_open', _('Enable TCP Fast Open'));
 | 
			
		||||
		s.taboption(tab, form.Flag, 'no_delay', _('Enable TCP_NODELAY'));
 | 
			
		||||
		s.taboption(tab, form.Flag, 'reuse_port', _('Enable SO_REUSEPORT'));
 | 
			
		||||
		s.taboption(tab, form.Flag, 'mptcp', _('Enable MPTCP'));
 | 
			
		||||
	},
 | 
			
		||||
	ucival_to_bool: function(val) {
 | 
			
		||||
		return ucival_to_bool(val);
 | 
			
		||||
	},
 | 
			
		||||
	cfgvalue_overview: function(sdata) {
 | 
			
		||||
		var stype = sdata['.type'],
 | 
			
		||||
			lines = [];
 | 
			
		||||
 | 
			
		||||
		if (stype === 'ss_server') {
 | 
			
		||||
			this.cfgvalue_overview_(sdata, lines, names_options_server);
 | 
			
		||||
			this.cfgvalue_overview_(sdata, lines, names_options_common);
 | 
			
		||||
			this.cfgvalue_overview_(sdata, lines, ['bind_address']);
 | 
			
		||||
		} else if (stype === 'ss_local' || stype === 'ss_redir' || stype === 'ss_tunnel') {
 | 
			
		||||
			this.cfgvalue_overview_(sdata, lines, names_options_client);
 | 
			
		||||
			if (stype === 'ss_tunnel') {
 | 
			
		||||
				this.cfgvalue_overview_(sdata, lines, ['tunnel_address']);
 | 
			
		||||
			}
 | 
			
		||||
			this.cfgvalue_overview_(sdata, lines, names_options_common);
 | 
			
		||||
		} else {
 | 
			
		||||
			return [];
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return lines;
 | 
			
		||||
	},
 | 
			
		||||
	cfgvalue_overview_: function(sdata, lines, names) {
 | 
			
		||||
		names.forEach(function(n) {
 | 
			
		||||
			var v = sdata[n];
 | 
			
		||||
			if (v) {
 | 
			
		||||
				if (n === 'key' || n === 'password') {
 | 
			
		||||
					v = _('<hidden>');
 | 
			
		||||
				}
 | 
			
		||||
				var fv = E('var', [v]);
 | 
			
		||||
				if (sdata['.type'] !== 'ss_server' && n === 'server') {
 | 
			
		||||
					fv = E('a', {
 | 
			
		||||
						class: 'label',
 | 
			
		||||
						href: L.url('admin/services/shadowsocks-libev/servers') + '#edit=' + v,
 | 
			
		||||
						target: '_blank',
 | 
			
		||||
						rel: 'noopener'
 | 
			
		||||
					}, fv);
 | 
			
		||||
				}
 | 
			
		||||
				lines.push(n + ': ', fv, E('br'));
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
	option_install_package: function(s, tab) {
 | 
			
		||||
		var bin = s.sectiontype.replace('_', '-'),
 | 
			
		||||
			opkg_package = 'shadowsocks-libev-' + bin, o;
 | 
			
		||||
		if (tab) {
 | 
			
		||||
			o = s.taboption(tab, form.Button, '_install');
 | 
			
		||||
		} else {
 | 
			
		||||
			o = s.option(form.Button, '_install');
 | 
			
		||||
		}
 | 
			
		||||
		o.title      = _('Package is not installed');
 | 
			
		||||
		o.inputtitle = _('Install package ' + opkg_package);
 | 
			
		||||
		o.inputstyle = 'apply';
 | 
			
		||||
		o.onclick = function() {
 | 
			
		||||
			window.open(L.url('admin/system/opkg') +
 | 
			
		||||
				'?query=' + opkg_package, '_blank', 'noopener');
 | 
			
		||||
		};
 | 
			
		||||
	},
 | 
			
		||||
	parse_uri: function(uri) {
 | 
			
		||||
		var scheme = 'ss://';
 | 
			
		||||
		if (uri && uri.indexOf(scheme) === 0) {
 | 
			
		||||
			var atPos = uri.indexOf('@'), hashPos = uri.lastIndexOf('#'), tag;
 | 
			
		||||
			if (hashPos === -1) {
 | 
			
		||||
				hashPos = undefined;
 | 
			
		||||
			} else {
 | 
			
		||||
				tag = uri.slice(hashPos + 1);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (atPos !== -1) { // SIP002 format https://shadowsocks.org/en/spec/SIP002-URI-Scheme.html
 | 
			
		||||
				var colonPos = uri.indexOf(':', atPos + 1), slashPos = uri.indexOf('/', colonPos + 1);
 | 
			
		||||
				if (colonPos === -1) return null;
 | 
			
		||||
				if (slashPos === -1) slashPos = undefined;
 | 
			
		||||
 | 
			
		||||
				var userinfo = atob(uri.slice(scheme.length, atPos)
 | 
			
		||||
					.replace(/-/g, '+').replace(/_/g, '/')),
 | 
			
		||||
					i = userinfo.indexOf(':');
 | 
			
		||||
				if (i === -1) return null;
 | 
			
		||||
 | 
			
		||||
				var config = {
 | 
			
		||||
					server: uri.slice(atPos + 1, colonPos),
 | 
			
		||||
					server_port: uri.slice(colonPos + 1, slashPos ? slashPos : hashPos),
 | 
			
		||||
					password: userinfo.slice(i + 1),
 | 
			
		||||
					method: userinfo.slice(0, i)
 | 
			
		||||
				};
 | 
			
		||||
 | 
			
		||||
				if (slashPos) {
 | 
			
		||||
					var search = uri.slice(slashPos + 1, hashPos);
 | 
			
		||||
					if (search[0] === '?') search = search.slice(1);
 | 
			
		||||
					search.split('&').forEach(function(s) {
 | 
			
		||||
						var j = s.indexOf('=');
 | 
			
		||||
						if (j !== -1) {
 | 
			
		||||
							var k = s.slice(0, j), v = s.slice(j + 1);
 | 
			
		||||
							if (k === 'plugin') {
 | 
			
		||||
								v = decodeURIComponent(v);
 | 
			
		||||
								var k = v.indexOf(';');
 | 
			
		||||
								if (k !== -1) {
 | 
			
		||||
									config['plugin'] = v.slice(0, k);
 | 
			
		||||
									config['plugin_opts'] = v.slice(k + 1);
 | 
			
		||||
								}
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					});
 | 
			
		||||
				}
 | 
			
		||||
				return [config, tag];
 | 
			
		||||
			} else { // Legacy format https://shadowsocks.org/en/config/quick-guide.html
 | 
			
		||||
				var plain = atob(uri.slice(scheme.length, hashPos)),
 | 
			
		||||
					firstColonPos = plain.indexOf(':'),
 | 
			
		||||
					lastColonPos = plain.lastIndexOf(':'),
 | 
			
		||||
					atPos = plain.lastIndexOf('@', lastColonPos);
 | 
			
		||||
				if (firstColonPos === -1 ||
 | 
			
		||||
					lastColonPos === -1 ||
 | 
			
		||||
					atPos === -1) return null;
 | 
			
		||||
 | 
			
		||||
				var config = {
 | 
			
		||||
					server: plain.slice(atPos + 1, lastColonPos),
 | 
			
		||||
					server_port: plain.slice(lastColonPos + 1),
 | 
			
		||||
					password: plain.slice(firstColonPos + 1, atPos),
 | 
			
		||||
					method: plain.slice(0, firstColonPos)
 | 
			
		||||
				};
 | 
			
		||||
				return [config, tag];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,162 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
'require form';
 | 
			
		||||
'require uci';
 | 
			
		||||
'require fs';
 | 
			
		||||
'require network';
 | 
			
		||||
'require rpc';
 | 
			
		||||
'require shadowsocks-libev as ss';
 | 
			
		||||
 | 
			
		||||
var conf = 'shadowsocks-libev';
 | 
			
		||||
var cfgtypes = ['ss_local', 'ss_redir', 'ss_server', 'ss_tunnel'];
 | 
			
		||||
 | 
			
		||||
var callServiceList = rpc.declare({
 | 
			
		||||
	object: 'service',
 | 
			
		||||
	method: 'list',
 | 
			
		||||
	params: [ 'name' ],
 | 
			
		||||
	expect: { '': {} }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
return L.view.extend({
 | 
			
		||||
	render: function(stats) {
 | 
			
		||||
		var m, s, o;
 | 
			
		||||
 | 
			
		||||
		m = new form.Map(conf,
 | 
			
		||||
			_('Local Instances'),
 | 
			
		||||
			_('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.'));
 | 
			
		||||
 | 
			
		||||
		s = m.section(form.GridSection);
 | 
			
		||||
		s.addremove = true;
 | 
			
		||||
		s.cfgsections = function() {
 | 
			
		||||
			return this.map.data.sections(this.map.config)
 | 
			
		||||
				.filter(function(s) { return cfgtypes.indexOf(s['.type']) !== -1; })
 | 
			
		||||
				.map(function(s) { return s['.name']; });
 | 
			
		||||
		};
 | 
			
		||||
		s.sectiontitle = function(section_id) {
 | 
			
		||||
			var s = uci.get(conf, section_id);
 | 
			
		||||
			return (s ? s['.type'] + '.' : '') + section_id;
 | 
			
		||||
		};
 | 
			
		||||
		s.renderSectionAdd = function(extra_class) {
 | 
			
		||||
			var el = form.GridSection.prototype.renderSectionAdd.apply(this, arguments),
 | 
			
		||||
				optionEl = [E('option', { value: '_dummy' }, [_('-- instance type --')])];
 | 
			
		||||
			cfgtypes.forEach(function(t) {
 | 
			
		||||
				optionEl.push(E('option', { value: t }, [t.replace('_', '-')]));
 | 
			
		||||
			});
 | 
			
		||||
			var selectEl = E('select', {
 | 
			
		||||
				class: 'cbi-input-select',
 | 
			
		||||
				change: function(ev) {
 | 
			
		||||
					ev.target.parentElement.nextElementSibling.nextElementSibling
 | 
			
		||||
						.toggleAttribute('disabled', ev.target.value === '_dummy');
 | 
			
		||||
				}
 | 
			
		||||
			}, optionEl);
 | 
			
		||||
			el.lastElementChild.setAttribute('disabled', '');
 | 
			
		||||
			el.prepend(E('div', {}, selectEl));
 | 
			
		||||
			return el;
 | 
			
		||||
		};
 | 
			
		||||
		s.handleAdd = function(ev, name) {
 | 
			
		||||
			var selectEl = ev.target.parentElement.firstElementChild.firstElementChild,
 | 
			
		||||
				type = selectEl.value;
 | 
			
		||||
			this.sectiontype = type;
 | 
			
		||||
			var promise = form.GridSection.prototype.handleAdd.apply(this, arguments);
 | 
			
		||||
			this.sectiontype = undefined;
 | 
			
		||||
			return promise;
 | 
			
		||||
		};
 | 
			
		||||
		s.addModalOptions = function(s, section_id, ev) {
 | 
			
		||||
			var sdata = uci.get(conf, section_id),
 | 
			
		||||
				stype = sdata ? sdata['.type'] : null;
 | 
			
		||||
			if (stype) {
 | 
			
		||||
				s.sectiontype = stype;
 | 
			
		||||
				return Promise.all([
 | 
			
		||||
					L.resolveDefault(fs.stat('/usr/bin/' + stype.replace('_', '-')), null),
 | 
			
		||||
					network.getDevices()
 | 
			
		||||
				]).then(L.bind(function(res) {
 | 
			
		||||
					s.tab('general', _('General Settings'));
 | 
			
		||||
					s.tab('advanced', _('Advanced Settings'));
 | 
			
		||||
					s.taboption('general', form.Flag, 'disabled', _('Disable'));
 | 
			
		||||
					if (!res[0]) {
 | 
			
		||||
						ss.option_install_package(s, 'general');
 | 
			
		||||
					}
 | 
			
		||||
					ss.options_common(s, 'advanced');
 | 
			
		||||
 | 
			
		||||
					if (stype === 'ss_server') {
 | 
			
		||||
						ss.options_server(s, { tab: 'general' });
 | 
			
		||||
						o = s.taboption('general', form.Value, 'bind_address',
 | 
			
		||||
							_('Bind address'),
 | 
			
		||||
							_('The address ss-server will initiate connection from'));
 | 
			
		||||
						o.datatype = 'ipaddr';
 | 
			
		||||
						o.placeholder = '0.0.0.0';
 | 
			
		||||
						ss.values_ipaddr(o, res[1]);
 | 
			
		||||
					} else {
 | 
			
		||||
						ss.options_client(s, 'general', res[1]);
 | 
			
		||||
						if (stype === 'ss_tunnel') {
 | 
			
		||||
							o = s.taboption('general', form.Value, 'tunnel_address',
 | 
			
		||||
								_('Tunnel address'),
 | 
			
		||||
								_('The address ss-tunnel will forward traffic to'));
 | 
			
		||||
							o.datatype = 'hostport';
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				}, this));
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		o = s.option(form.DummyValue, 'overview', _('Overview'));
 | 
			
		||||
		o.modalonly = false;
 | 
			
		||||
		o.editable = true;
 | 
			
		||||
		o.rawhtml = true;
 | 
			
		||||
		o.renderWidget = function(section_id, option_index, cfgvalue) {
 | 
			
		||||
			var sdata = uci.get(conf, section_id);
 | 
			
		||||
			if (sdata) {
 | 
			
		||||
				return form.DummyValue.prototype.renderWidget.call(this, section_id, option_index, ss.cfgvalue_overview(sdata));
 | 
			
		||||
			}
 | 
			
		||||
			return null;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		o = s.option(form.DummyValue, 'running', _('Running'));
 | 
			
		||||
		o.modalonly = false;
 | 
			
		||||
		o.editable = true;
 | 
			
		||||
		o.default = '';
 | 
			
		||||
 | 
			
		||||
		o = s.option(form.Button, 'disabled', _('Enable/Disable'));
 | 
			
		||||
		o.modalonly = false;
 | 
			
		||||
		o.editable = true;
 | 
			
		||||
		o.inputtitle = function(section_id) {
 | 
			
		||||
			var s = uci.get(conf, section_id);
 | 
			
		||||
			if (ss.ucival_to_bool(s['disabled'])) {
 | 
			
		||||
				this.inputstyle = 'reset';
 | 
			
		||||
				return _('Disabled');
 | 
			
		||||
			}
 | 
			
		||||
			this.inputstyle = 'save';
 | 
			
		||||
			return _('Enabled');
 | 
			
		||||
		}
 | 
			
		||||
		o.onclick = function(ev) {
 | 
			
		||||
			var inputEl = ev.target.parentElement.nextElementSibling;
 | 
			
		||||
			inputEl.value = ss.ucival_to_bool(inputEl.value) ? '0' : '1';
 | 
			
		||||
			return this.map.save();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		return m.render().finally(function() {
 | 
			
		||||
			L.Poll.add(function() {
 | 
			
		||||
				return L.resolveDefault(callServiceList(conf), {})
 | 
			
		||||
				.then(function(res) {
 | 
			
		||||
					var instances = null;
 | 
			
		||||
					try {
 | 
			
		||||
						instances = res[conf]['instances'];
 | 
			
		||||
					} catch (e) {}
 | 
			
		||||
					if (!instances) return;
 | 
			
		||||
					uci.sections(conf)
 | 
			
		||||
					.filter(function(s) { return cfgtypes.indexOf(s['.type']) !== -1; })
 | 
			
		||||
					.forEach(function(s) {
 | 
			
		||||
						var el = document.getElementById('cbi-shadowsocks-libev-' + s['.name'] + '-running');
 | 
			
		||||
						if (el) {
 | 
			
		||||
							var name = s['.type'] + '.' + s['.name'],
 | 
			
		||||
								running = instances.hasOwnProperty(name)? instances[name].running : false;
 | 
			
		||||
							el.innerText = running ? 'yes' : 'no';
 | 
			
		||||
						}
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
			});
 | 
			
		||||
		});
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,123 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
'require uci';
 | 
			
		||||
'require fs';
 | 
			
		||||
'require form';
 | 
			
		||||
'require tools.widgets as widgets';
 | 
			
		||||
'require shadowsocks-libev as ss';
 | 
			
		||||
 | 
			
		||||
var conf = 'shadowsocks-libev';
 | 
			
		||||
 | 
			
		||||
function src_dst_option(s /*, ... */) {
 | 
			
		||||
	var o = s.taboption.apply(s, L.varargs(arguments, 1));
 | 
			
		||||
	o.datatype = 'or(ipaddr,cidr)';
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
return L.view.extend({
 | 
			
		||||
	load: function() {
 | 
			
		||||
		return Promise.all([
 | 
			
		||||
			L.resolveDefault(fs.stat('/usr/lib/iptables/libxt_recent.so'), {}),
 | 
			
		||||
			L.resolveDefault(fs.stat('/usr/bin/ss-rules'), null),
 | 
			
		||||
			uci.load(conf).then(function() {
 | 
			
		||||
				if (!uci.get_first(conf, 'ss_rules')) {
 | 
			
		||||
					uci.set(conf, uci.add(conf, 'ss_rules', 'ss_rules'), 'disabled', '1');
 | 
			
		||||
				}
 | 
			
		||||
			})
 | 
			
		||||
		]);
 | 
			
		||||
	},
 | 
			
		||||
	render: function(stats) {
 | 
			
		||||
		var m, s, o;
 | 
			
		||||
 | 
			
		||||
		m = new form.Map(conf, _('Redir Rules'),
 | 
			
		||||
			_('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 checked \
 | 
			
		||||
				against <em>Src ip/net bypass</em>, <em>Src ip/net forward</em>, \
 | 
			
		||||
				<em>Src ip/net checkdst</em> and if none matches <em>Src default</em> \
 | 
			
		||||
				will give the default action to be taken. \
 | 
			
		||||
				If the prior check results in action <em>checkdst</em>, packets will continue \
 | 
			
		||||
				to have their dst addresses checked.'));
 | 
			
		||||
 | 
			
		||||
		s = m.section(form.NamedSection, 'ss_rules', 'ss_rules');
 | 
			
		||||
		s.tab('general', _('General Settings'));
 | 
			
		||||
		s.tab('src', _('Source Settings'));
 | 
			
		||||
		s.tab('dst', _('Destination Settings'));
 | 
			
		||||
 | 
			
		||||
		s.taboption('general', form.Flag, 'disabled', _('Disable'));
 | 
			
		||||
		if (!stats[1]) {
 | 
			
		||||
			ss.option_install_package(s, 'general');
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		o = s.taboption('general', form.ListValue, 'redir_tcp',
 | 
			
		||||
			_('ss-redir for TCP'));
 | 
			
		||||
		ss.values_redir(o, 'tcp');
 | 
			
		||||
		o = s.taboption('general', form.ListValue, 'redir_udp',
 | 
			
		||||
			_('ss-redir for UDP'));
 | 
			
		||||
		ss.values_redir(o, 'udp');
 | 
			
		||||
 | 
			
		||||
		o = s.taboption('general', form.ListValue, 'local_default',
 | 
			
		||||
			_('Local-out default'),
 | 
			
		||||
			_('Default action for locally generated TCP packets'));
 | 
			
		||||
		ss.values_actions(o);
 | 
			
		||||
		o = s.taboption('general', widgets.DeviceSelect, 'ifnames',
 | 
			
		||||
			_('Ingress interfaces'),
 | 
			
		||||
			_('Only apply rules on packets from these network interfaces'));
 | 
			
		||||
		o.multiple = true;
 | 
			
		||||
		o.noaliases = true;
 | 
			
		||||
		o.noinactive = true;
 | 
			
		||||
		s.taboption('general', form.Value, 'ipt_args',
 | 
			
		||||
			_('Extra arguments'),
 | 
			
		||||
			_('Passes additional arguments to iptables. Use with care!'));
 | 
			
		||||
 | 
			
		||||
		src_dst_option(s, 'src', form.DynamicList, 'src_ips_bypass',
 | 
			
		||||
			_('Src ip/net bypass'),
 | 
			
		||||
			_('Bypass ss-redir for packets with src address in this list'));
 | 
			
		||||
		src_dst_option(s, 'src', form.DynamicList, 'src_ips_forward',
 | 
			
		||||
			_('Src ip/net forward'),
 | 
			
		||||
			_('Forward through ss-redir for packets with src address in this list'));
 | 
			
		||||
		src_dst_option(s, 'src', form.DynamicList, 'src_ips_checkdst',
 | 
			
		||||
			_('Src ip/net checkdst'),
 | 
			
		||||
			_('Continue to have dst address checked for packets with src address in this list'));
 | 
			
		||||
		o = s.taboption('src', form.ListValue, 'src_default',
 | 
			
		||||
			_('Src default'),
 | 
			
		||||
			_('Default action for packets whose src address do not match any of the src ip/net list'));
 | 
			
		||||
		ss.values_actions(o);
 | 
			
		||||
 | 
			
		||||
		src_dst_option(s, 'dst', form.DynamicList, 'dst_ips_bypass',
 | 
			
		||||
			_('Dst ip/net bypass'),
 | 
			
		||||
			_('Bypass ss-redir for packets with dst address in this list'));
 | 
			
		||||
		src_dst_option(s, 'dst', form.DynamicList, 'dst_ips_forward',
 | 
			
		||||
			_('Dst ip/net forward'),
 | 
			
		||||
			_('Forward through ss-redir for packets with dst address in this list'));
 | 
			
		||||
 | 
			
		||||
		var dir = '/etc/shadowsocks-libev';
 | 
			
		||||
		o = s.taboption('dst', form.FileUpload, 'dst_ips_bypass_file',
 | 
			
		||||
			_('Dst ip/net bypass file'),
 | 
			
		||||
			_('File containing ip/net for the purposes as with <em>Dst ip/net bypass</em>'));
 | 
			
		||||
		o.root_directory = dir;
 | 
			
		||||
		o = s.taboption('dst', form.FileUpload, 'dst_ips_forward_file',
 | 
			
		||||
			_('Dst ip/net forward file'),
 | 
			
		||||
			_('File containing ip/net for the purposes as with <em>Dst ip/net forward</em>'));
 | 
			
		||||
		o.root_directory = dir;
 | 
			
		||||
		o = s.taboption('dst', form.ListValue, 'dst_default',
 | 
			
		||||
			_('Dst default'),
 | 
			
		||||
			_('Default action for packets whose dst address do not match any of the dst ip list'));
 | 
			
		||||
		ss.values_actions(o);
 | 
			
		||||
 | 
			
		||||
		if (stats[0].type === 'file') {
 | 
			
		||||
			o = s.taboption('dst', form.Flag, 'dst_forward_recentrst');
 | 
			
		||||
		} else {
 | 
			
		||||
			uci.set(conf, 'ss_rules', 'dst_forward_recentrst', '0');
 | 
			
		||||
			o = s.taboption('dst', form.Button, '_install');
 | 
			
		||||
			o.inputtitle = _('Install package iptables-mod-conntrack-extra');
 | 
			
		||||
			o.inputstyle = 'apply';
 | 
			
		||||
			o.onclick = function() {
 | 
			
		||||
				window.open(L.url('admin/system/opkg') +
 | 
			
		||||
					'?query=iptables-mod-conntrack-extra', '_blank', 'noopener');
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		o.title = _('Forward recentrst');
 | 
			
		||||
		o.description = _('Forward those packets whose dst have recently sent to us multiple tcp-rst');
 | 
			
		||||
 | 
			
		||||
		return m.render();
 | 
			
		||||
	},
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,82 @@
 | 
			
		|||
'use strict';
 | 
			
		||||
'require form';
 | 
			
		||||
'require uci';
 | 
			
		||||
'require ui';
 | 
			
		||||
'require shadowsocks-libev as ss';
 | 
			
		||||
 | 
			
		||||
var conf = 'shadowsocks-libev';
 | 
			
		||||
 | 
			
		||||
return L.view.extend({
 | 
			
		||||
	render: function() {
 | 
			
		||||
		var m, s, o;
 | 
			
		||||
 | 
			
		||||
		m = new form.Map(conf, _('Remote Servers'),
 | 
			
		||||
			_('Definition of remote shadowsocks servers.  \
 | 
			
		||||
				Disable any of them will also disable instances referring to it.'));
 | 
			
		||||
 | 
			
		||||
		s = m.section(form.GridSection, 'server');
 | 
			
		||||
		s.addremove = true;
 | 
			
		||||
		s.handleLinkImport = function() {
 | 
			
		||||
			var textarea = new ui.Textarea();
 | 
			
		||||
			ui.showModal(_('Import Links'), [
 | 
			
		||||
				textarea.render(),
 | 
			
		||||
				E('div', { class: 'right' }, [
 | 
			
		||||
					E('button', {
 | 
			
		||||
						class: 'btn',
 | 
			
		||||
						click: ui.hideModal
 | 
			
		||||
					}, [ _('Cancel') ]),
 | 
			
		||||
					' ',
 | 
			
		||||
					E('button', {
 | 
			
		||||
						class: 'btn cbi-button-action',
 | 
			
		||||
						click: ui.createHandlerFn(this, function() {
 | 
			
		||||
							textarea.getValue().split('\n').forEach(function(s) {
 | 
			
		||||
								var config = ss.parse_uri(s);
 | 
			
		||||
								if (config) {
 | 
			
		||||
									var tag = config[1];
 | 
			
		||||
									if (tag && !tag.match(/^[a-zA-Z0-9_]+$/)) tag = null;
 | 
			
		||||
									var sid = uci.add(conf, 'server', tag);
 | 
			
		||||
									config = config[0];
 | 
			
		||||
									Object.keys(config).forEach(function(k) {
 | 
			
		||||
										uci.set(conf, sid, k, config[k]);
 | 
			
		||||
									});
 | 
			
		||||
								}
 | 
			
		||||
							});
 | 
			
		||||
							return uci.save()
 | 
			
		||||
								.then(L.bind(this.map.load, this.map))
 | 
			
		||||
								.then(L.bind(this.map.reset, this.map))
 | 
			
		||||
								.then(L.ui.hideModal)
 | 
			
		||||
								.catch(function() {});
 | 
			
		||||
						})
 | 
			
		||||
					}, [ _('Import') ])
 | 
			
		||||
				])
 | 
			
		||||
			]);
 | 
			
		||||
		};
 | 
			
		||||
		s.renderSectionAdd = function(extra_class) {
 | 
			
		||||
			var el = form.GridSection.prototype.renderSectionAdd.apply(this, arguments);
 | 
			
		||||
			el.appendChild(E('button', {
 | 
			
		||||
				'class': 'cbi-button cbi-button-add',
 | 
			
		||||
				'title': _('Import Links'),
 | 
			
		||||
				'click': ui.createHandlerFn(this, 'handleLinkImport')
 | 
			
		||||
			}, [ _('Import Links') ]));
 | 
			
		||||
			return el;
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		o = s.option(form.Flag, 'disabled', _('Disable'));
 | 
			
		||||
		o.editable = true;
 | 
			
		||||
 | 
			
		||||
		ss.options_server(s);
 | 
			
		||||
 | 
			
		||||
		return m.render();
 | 
			
		||||
	},
 | 
			
		||||
	addFooter: function() {
 | 
			
		||||
		var p = '#edit=';
 | 
			
		||||
		if (location.hash.indexOf(p) === 0) {
 | 
			
		||||
			var section_id = location.hash.substring(p.length);
 | 
			
		||||
			var editBtn = document.querySelector('#cbi-shadowsocks-libev-' + section_id + ' button.cbi-button-edit');
 | 
			
		||||
			if (editBtn)
 | 
			
		||||
				editBtn.click();
 | 
			
		||||
		}
 | 
			
		||||
		//return this.super('addFooter', arguments);
 | 
			
		||||
		return null;
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -9,25 +9,14 @@ function index()
 | 
			
		|||
		_("Shadowsocks-libev"), 59)
 | 
			
		||||
 | 
			
		||||
	entry({"admin", "services", "shadowsocks-libev", "instances"},
 | 
			
		||||
		arcombine(cbi("shadowsocks-libev/instances"), cbi("shadowsocks-libev/instance-details")),
 | 
			
		||||
		view("shadowsocks-libev/instances"),
 | 
			
		||||
		_("Local Instances"), 10).leaf = true
 | 
			
		||||
 | 
			
		||||
	entry({"admin", "services", "shadowsocks-libev", "servers"},
 | 
			
		||||
		cbi("shadowsocks-libev/servers"),
 | 
			
		||||
		view("shadowsocks-libev/servers"),
 | 
			
		||||
		_("Remote Servers"), 20).leaf = true
 | 
			
		||||
 | 
			
		||||
	entry({"admin", "services", "shadowsocks-libev", "rules"},
 | 
			
		||||
		cbi("shadowsocks-libev/rules"),
 | 
			
		||||
		view("shadowsocks-libev/rules"),
 | 
			
		||||
		_("Redir Rules"), 30).leaf = true
 | 
			
		||||
 | 
			
		||||
	entry({"admin", "services", "shadowsocks-libev", "status"}, call("ss_status"), nil).leaf = true
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ss_status()
 | 
			
		||||
	local ut = require "luci.util"
 | 
			
		||||
	local rv = ut.ubus("service", "list", {name = "shadowsocks-libev"})["shadowsocks-libev"] or {_=0}
 | 
			
		||||
 | 
			
		||||
	luci.http.prepare_content("application/json")
 | 
			
		||||
	luci.http.write_json(rv)
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,60 +0,0 @@
 | 
			
		|||
-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local ds = require "luci.dispatcher"
 | 
			
		||||
local ss = require "luci.model.shadowsocks-libev"
 | 
			
		||||
 | 
			
		||||
local sname = arg[1]
 | 
			
		||||
local redirect_url = ds.build_url("admin/services/shadowsocks-libev/instances")
 | 
			
		||||
local s, o
 | 
			
		||||
 | 
			
		||||
local m = Map("shadowsocks-libev")
 | 
			
		||||
local sdata = m:get(sname)
 | 
			
		||||
if not sdata then
 | 
			
		||||
	luci.http.redirect(redirect_url)
 | 
			
		||||
	return
 | 
			
		||||
end
 | 
			
		||||
local stype = sdata[".type"]
 | 
			
		||||
m.redirect = redirect_url
 | 
			
		||||
m.title = "shadowsocks-libev - %s - %s" % {stype, sname}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
s = m:section(NamedSection, sname, stype)
 | 
			
		||||
s:tab("general", translate("General Settings"))
 | 
			
		||||
s:tab("advanced", translate("Advanced Settings"))
 | 
			
		||||
s:tab("obfuscate", translate("Obfuscating"))
 | 
			
		||||
s:taboption("general", Flag, "disabled", translate("Disable"))
 | 
			
		||||
ss.option_install_package(s, "general")
 | 
			
		||||
ss.options_common(s, "advanced")
 | 
			
		||||
local obfs_installed = nixio.fs.access("/usr/bin/obfs-local")
 | 
			
		||||
local v2ray_installed = nixio.fs.access("/usr/bin/v2ray-plugin")
 | 
			
		||||
if obfs_installed or v2ray_installed then
 | 
			
		||||
	ss.options_obfs(s, "obfuscate")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
if stype == "ss_server" then
 | 
			
		||||
	ss.options_server(s, "general")
 | 
			
		||||
	o = s:taboption("general", Value, "bind_address",
 | 
			
		||||
		translate("Bind address"),
 | 
			
		||||
		translate("The address ss-server will initiate connection from"))
 | 
			
		||||
	o.datatype = "ipaddr"
 | 
			
		||||
	o.placeholder = "0.0.0.0"
 | 
			
		||||
	ss.values_ipaddr(o)
 | 
			
		||||
else
 | 
			
		||||
	ss.options_client(s, "general")
 | 
			
		||||
	if stype == "ss_tunnel" then
 | 
			
		||||
		o = s:taboption("general", Value, "tunnel_address",
 | 
			
		||||
			translate("Tunnel address"),
 | 
			
		||||
			translate("The address ss-tunnel will forward traffic to"))
 | 
			
		||||
		o.datatype = "hostport"
 | 
			
		||||
	end
 | 
			
		||||
	if obfs_installed or v2ray_installed then
 | 
			
		||||
		o = s:taboption("obfuscate", Value, "obfs_host", translate("Host"))
 | 
			
		||||
		o.default = "www.bing.com"
 | 
			
		||||
	end
 | 
			
		||||
	if obfs_installed then
 | 
			
		||||
		s:taboption("obfuscate", Value, "obfs_uri", translate("HTTP path uri"))
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
| 
						 | 
				
			
			@ -1,104 +0,0 @@
 | 
			
		|||
-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local ds = require "luci.dispatcher"
 | 
			
		||||
local ss = require "luci.model.shadowsocks-libev"
 | 
			
		||||
local ut = require "luci.util"
 | 
			
		||||
local m, s, o
 | 
			
		||||
 | 
			
		||||
m = Map("shadowsocks-libev",
 | 
			
		||||
	translate("Local Instances"),
 | 
			
		||||
	translate("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."))
 | 
			
		||||
 | 
			
		||||
local instances = {}
 | 
			
		||||
local cfgtypes = { "ss_local", "ss_redir", "ss_server", "ss_tunnel" }
 | 
			
		||||
 | 
			
		||||
for sname, sdata in pairs(m:get()) do
 | 
			
		||||
	local key, value = ss.cfgvalue_overview(sdata)
 | 
			
		||||
	if key ~= nil then
 | 
			
		||||
		instances[key] = value
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
s = m:section(Table, instances)
 | 
			
		||||
s.addremove = true
 | 
			
		||||
s.template_addremove = "shadowsocks-libev/add_instance"
 | 
			
		||||
s.extedit = function(self, section)
 | 
			
		||||
	local value = instances[section]
 | 
			
		||||
	if type(value) == "table" then
 | 
			
		||||
		return ds.build_url(unpack(ds.context.requestpath),
 | 
			
		||||
					"services/shadowsocks-libev/instances",
 | 
			
		||||
					value[".name"])
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
s.parse = function(self, ...)
 | 
			
		||||
	Table.parse(self, ...)
 | 
			
		||||
 | 
			
		||||
	local crval = REMOVE_PREFIX .. self.config
 | 
			
		||||
	local name = self.map:formvaluetable(crval)
 | 
			
		||||
	for k,v in pairs(name) do
 | 
			
		||||
		local value = instances[k]
 | 
			
		||||
		local sname = value[".name"]
 | 
			
		||||
		if type(value) == "table" then
 | 
			
		||||
			m:del(sname)
 | 
			
		||||
			instances[k] = nil
 | 
			
		||||
			for _, oname in ipairs({"redir_tcp", "redir_udp"}) do
 | 
			
		||||
				local ovalue = m:get("ss_rules", oname)
 | 
			
		||||
				if ovalue == sname then
 | 
			
		||||
					m:del("ss_rules", oname)
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local stype = m:formvalue("_newinst.type")
 | 
			
		||||
	local sname = m:formvalue("_newinst.name")
 | 
			
		||||
	if ut.contains(cfgtypes, stype) then
 | 
			
		||||
		local created
 | 
			
		||||
		if sname and #sname > 0 then
 | 
			
		||||
			created = m:set(sname, nil, stype)
 | 
			
		||||
		else
 | 
			
		||||
			created = m:add(stype)
 | 
			
		||||
			sname = created
 | 
			
		||||
		end
 | 
			
		||||
		if created then
 | 
			
		||||
			m.uci:save("shadowsocks-libev")
 | 
			
		||||
			luci.http.redirect(ds.build_url(
 | 
			
		||||
				"admin/services/shadowsocks-libev/instances", sname
 | 
			
		||||
			))
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
o = s:option(DummyValue, "name", translate("Name"))
 | 
			
		||||
o.rawhtml = true
 | 
			
		||||
o = s:option(DummyValue, "overview", translate("Overview"))
 | 
			
		||||
o.rawhtml = true
 | 
			
		||||
 | 
			
		||||
s:option(DummyValue, "running", translate("Running"))
 | 
			
		||||
 | 
			
		||||
o = s:option(Button, "disabled", translate("Enable/Disable"))
 | 
			
		||||
o.render = function(self, section, scope)
 | 
			
		||||
	if instances[section].disabled then
 | 
			
		||||
		self.title = translate("Disabled")
 | 
			
		||||
		self.inputstyle = "reset"
 | 
			
		||||
	else
 | 
			
		||||
		self.title = translate("Enabled")
 | 
			
		||||
		self.inputstyle = "save"
 | 
			
		||||
	end
 | 
			
		||||
	Button.render(self, section, scope)
 | 
			
		||||
end
 | 
			
		||||
o.write = function(self, section)
 | 
			
		||||
	local sdata = instances[section]
 | 
			
		||||
	if type(sdata) == "table" then
 | 
			
		||||
		local sname = sdata[".name"]
 | 
			
		||||
		local disabled = not sdata["disabled"]
 | 
			
		||||
		sdata["disabled"] = disabled
 | 
			
		||||
		m:set(sname, "disabled", tostring(disabled))
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
| 
						 | 
				
			
			@ -1,110 +0,0 @@
 | 
			
		|||
-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local ss = require("luci.model.shadowsocks-libev")
 | 
			
		||||
 | 
			
		||||
local m, s, o
 | 
			
		||||
 | 
			
		||||
m = Map("shadowsocks-libev",
 | 
			
		||||
	translate("Redir Rules"),
 | 
			
		||||
	translate("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 checked \
 | 
			
		||||
		against <em>Src ip/net bypass</em>, <em>Src ip/net forward</em>, \
 | 
			
		||||
		<em>Src ip/net checkdst</em> and if none matches <em>Src default</em> \
 | 
			
		||||
		will give the default action to be taken. \
 | 
			
		||||
		If the prior check results in action <em>checkdst</em>, packets will continue \
 | 
			
		||||
		to have their dst addresses checked."))
 | 
			
		||||
 | 
			
		||||
local sdata = m:get('ss_rules')
 | 
			
		||||
if not sdata then
 | 
			
		||||
	m:set('ss_rules', nil, 'ss_rules')
 | 
			
		||||
	m:set('ss_rules', 'disabled', "1")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function src_dst_option(s, ...)
 | 
			
		||||
	local o = s:taboption(...)
 | 
			
		||||
	--o.datatype = "or(ip4addr,cidr4)"
 | 
			
		||||
	o.datatype = "or(ip4addr,ip6addr)"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
s = m:section(NamedSection, "ss_rules", "ss_rules")
 | 
			
		||||
s:tab("general", translate("General Settings"))
 | 
			
		||||
s:tab("src", translate("Source Settings"))
 | 
			
		||||
s:tab("dst", translate("Destination Settings"))
 | 
			
		||||
 | 
			
		||||
s:taboption('general', Flag, "disabled", translate("Disable"))
 | 
			
		||||
ss.option_install_package(s, 'general')
 | 
			
		||||
 | 
			
		||||
o = s:taboption('general', ListValue, "redir_tcp",
 | 
			
		||||
	translate("ss-redir for TCP"))
 | 
			
		||||
ss.values_redir(o, 'tcp')
 | 
			
		||||
o = s:taboption('general', ListValue, "redir_udp",
 | 
			
		||||
	translate("ss-redir for UDP"))
 | 
			
		||||
ss.values_redir(o, 'udp')
 | 
			
		||||
 | 
			
		||||
o = s:taboption('general', ListValue, "local_default",
 | 
			
		||||
	translate("Local-out default"),
 | 
			
		||||
	translate("Default action for locally generated TCP packets"))
 | 
			
		||||
ss.values_actions(o)
 | 
			
		||||
o = s:taboption('general', DynamicList, "ifnames",
 | 
			
		||||
	translate("Ingress interfaces"),
 | 
			
		||||
	translate("Only apply rules on packets from these network interfaces"))
 | 
			
		||||
ss.values_ifnames(o)
 | 
			
		||||
s:taboption('general', Value, "ipt_args",
 | 
			
		||||
	translate("Extra arguments"),
 | 
			
		||||
	translate("Passes additional arguments to iptables. Use with care!"))
 | 
			
		||||
 | 
			
		||||
src_dst_option(s, 'src', DynamicList, "src_ips_bypass",
 | 
			
		||||
	translate("Src ip/net bypass"),
 | 
			
		||||
	translate("Bypass ss-redir for packets with src address in this list"))
 | 
			
		||||
src_dst_option(s, 'src', DynamicList, "src_ips_forward",
 | 
			
		||||
	translate("Src ip/net forward"),
 | 
			
		||||
	translate("Forward through ss-redir for packets with src address in this list"))
 | 
			
		||||
src_dst_option(s, 'src', DynamicList, "src_ips_checkdst",
 | 
			
		||||
	translate("Src ip/net checkdst"),
 | 
			
		||||
	translate("Continue to have dst address checked for packets with src address in this list"))
 | 
			
		||||
o = s:taboption('src', ListValue, "src_default",
 | 
			
		||||
	translate("Src default"),
 | 
			
		||||
	translate("Default action for packets whose src address do not match any of the src ip/net list"))
 | 
			
		||||
ss.values_actions(o)
 | 
			
		||||
 | 
			
		||||
src_dst_option(s, 'dst', DynamicList, "dst_ips_bypass",
 | 
			
		||||
	translate("Dst ip/net bypass"),
 | 
			
		||||
	translate("Bypass ss-redir for packets with dst address in this list"))
 | 
			
		||||
src_dst_option(s, 'dst', DynamicList, "dst_ips_forward",
 | 
			
		||||
	translate("Dst ip/net forward"),
 | 
			
		||||
	translate("Forward through ss-redir for packets with dst address in this list"))
 | 
			
		||||
 | 
			
		||||
o = s:taboption('dst', FileBrowser, "dst_ips_bypass_file",
 | 
			
		||||
	translate("Dst ip/net bypass file"),
 | 
			
		||||
	translate("File containing ip/net for the purposes as with <em>Dst ip/net bypass</em>"))
 | 
			
		||||
o.datatype = "file"
 | 
			
		||||
s:taboption('dst', FileBrowser, "dst_ips_forward_file",
 | 
			
		||||
	translate("Dst ip/net forward file"),
 | 
			
		||||
	translate("File containing ip/net for the purposes as with <em>Dst ip/net forward</em>"))
 | 
			
		||||
o.datatype = "file"
 | 
			
		||||
o = s:taboption('dst', ListValue, "dst_default",
 | 
			
		||||
	translate("Dst default"),
 | 
			
		||||
	translate("Default action for packets whose dst address do not match any of the dst ip list"))
 | 
			
		||||
ss.values_actions(o)
 | 
			
		||||
 | 
			
		||||
local installed = os.execute("iptables -m recent -h &>/dev/null") == 0
 | 
			
		||||
if installed then
 | 
			
		||||
	o = s:taboption('dst', Flag, "dst_forward_recentrst")
 | 
			
		||||
else
 | 
			
		||||
	m:set('ss_rules', 'dst_forward_recentrst', "0")
 | 
			
		||||
	o = s:taboption("dst", Button, "_install")
 | 
			
		||||
	o.inputtitle = translate("Install package iptables-mod-conntrack-extra")
 | 
			
		||||
	o.inputstyle = "apply"
 | 
			
		||||
	o.write = function()
 | 
			
		||||
		return luci.http.redirect(
 | 
			
		||||
			luci.dispatcher.build_url("admin/system/packages") ..
 | 
			
		||||
			"?submit=1&install=iptables-mod-conntrack-extra"
 | 
			
		||||
		)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
o.title = translate("Forward recentrst")
 | 
			
		||||
o.description = translate("Forward those packets whose dst have recently sent to us multiple tcp-rst")
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
| 
						 | 
				
			
			@ -1,31 +0,0 @@
 | 
			
		|||
-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local ds = require "luci.dispatcher"
 | 
			
		||||
local ss = require("luci.model.shadowsocks-libev")
 | 
			
		||||
 | 
			
		||||
local m, s
 | 
			
		||||
 | 
			
		||||
m = Map("shadowsocks-libev",
 | 
			
		||||
	translate("Remote Servers"),
 | 
			
		||||
	translate("Definition of remote shadowsocks servers.  \
 | 
			
		||||
			Disable any of them will also disable instances refering to it."))
 | 
			
		||||
 | 
			
		||||
local sname = arg[1]
 | 
			
		||||
if sname then
 | 
			
		||||
	if not m:get(sname) then
 | 
			
		||||
		luci.http.redirect(ds.build_url("admin/services/shadowsocks-libev/servers"))
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	s = m:section(NamedSection, sname, "server")
 | 
			
		||||
	m.title = m.title .. ' - ' .. sname
 | 
			
		||||
else
 | 
			
		||||
	s = m:section(TypedSection, "server")
 | 
			
		||||
	s.template = 'cbi/tblsection'
 | 
			
		||||
	s.addremove = true
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
s:option(Flag, "disabled", translate("Disable"))
 | 
			
		||||
ss.options_server(s)
 | 
			
		||||
 | 
			
		||||
return m
 | 
			
		||||
| 
						 | 
				
			
			@ -1,302 +0,0 @@
 | 
			
		|||
-- Copyright 2018 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
 | 
			
		||||
-- Copyright 2017 Yousong Zhou <yszhou4tech@gmail.com>
 | 
			
		||||
-- Licensed to the public under the Apache License 2.0.
 | 
			
		||||
 | 
			
		||||
local _up = getfenv(3)
 | 
			
		||||
local ut = require("luci.util")
 | 
			
		||||
local sys = require("luci.sys")
 | 
			
		||||
local ds = require("luci.dispatcher")
 | 
			
		||||
local nw = require("luci.model.network")
 | 
			
		||||
local ucic = luci.model.uci.cursor()
 | 
			
		||||
nw.init()
 | 
			
		||||
module("luci.model.shadowsocks-libev", function(m)
 | 
			
		||||
	setmetatable(m, {__index=function (self, k)
 | 
			
		||||
		local tb = _up
 | 
			
		||||
		return rawget(self, k) or _up[k]
 | 
			
		||||
	end})
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
function values_actions(o)
 | 
			
		||||
	o:value("bypass")
 | 
			
		||||
	o:value("forward")
 | 
			
		||||
	if o.option ~= "dst_default" then
 | 
			
		||||
		o:value("checkdst")
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function values_redir(o, xmode)
 | 
			
		||||
	ucic:foreach("shadowsocks-libev", "ss_redir", function(sdata)
 | 
			
		||||
		local disabled = ucival_to_bool(sdata["disabled"])
 | 
			
		||||
		local sname = sdata[".name"]
 | 
			
		||||
		local mode = sdata["mode"] or "tcp_only"
 | 
			
		||||
		if not disabled and mode:find(xmode) then
 | 
			
		||||
			local desc = "%s - %s" % {sname, mode}
 | 
			
		||||
			o:value(sname, desc)
 | 
			
		||||
		end
 | 
			
		||||
	end)
 | 
			
		||||
	o:value("", "<unset>")
 | 
			
		||||
	o.default = ""
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function values_serverlist(o)
 | 
			
		||||
	ucic:foreach("shadowsocks-libev", "server", function(sdata)
 | 
			
		||||
		local sname = sdata[".name"]
 | 
			
		||||
		local server = sdata["server"]
 | 
			
		||||
		local server_port = sdata["server_port"]
 | 
			
		||||
		if server and server_port then
 | 
			
		||||
			local disabled = ucival_to_bool(sdata[".disabled"]) and " - disabled" or ""
 | 
			
		||||
			local desc = "%s - %s:%s%s" % {sname, server, server_port, disabled}
 | 
			
		||||
			o:value(sname, desc)
 | 
			
		||||
		end
 | 
			
		||||
	end)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function values_ipaddr(o)
 | 
			
		||||
	for _, v in ipairs(nw:get_interfaces()) do
 | 
			
		||||
		for _, a in ipairs(v:ipaddrs()) do
 | 
			
		||||
			o:value(a:host():string(), '%s (%s)' %{ a:host(), v:shortname() })
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function values_ifnames(o)
 | 
			
		||||
	for _, v in ipairs(sys.net.devices()) do
 | 
			
		||||
		o:value(v)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function options_client(s, tab)
 | 
			
		||||
	local o
 | 
			
		||||
 | 
			
		||||
	o = s:taboption(tab, ListValue, "server", translate("Remote server"))
 | 
			
		||||
	values_serverlist(o)
 | 
			
		||||
	o = s:taboption(tab, Value, "local_address", translate("Local address"))
 | 
			
		||||
	o.datatype = "ipaddr"
 | 
			
		||||
	o.placeholder = "0.0.0.0"
 | 
			
		||||
	values_ipaddr(o)
 | 
			
		||||
	o = s:taboption(tab, Value, "local_port", translate("Local port"))
 | 
			
		||||
	o.datatype = "port"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function options_server(s, tab)
 | 
			
		||||
	local o
 | 
			
		||||
	local optfunc
 | 
			
		||||
 | 
			
		||||
	if tab == nil then
 | 
			
		||||
		optfunc = function(...) return s:option(...) end
 | 
			
		||||
	else
 | 
			
		||||
		optfunc = function(...) return s:taboption(tab, ...) end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	o = optfunc(Value, "server", translate("Server"))
 | 
			
		||||
	o.datatype = "host"
 | 
			
		||||
	o.size = 16
 | 
			
		||||
	o = optfunc(Value, "server_port", translate("Server port"))
 | 
			
		||||
	o.datatype = "port"
 | 
			
		||||
	o.size = 5
 | 
			
		||||
	o = optfunc(ListValue, "method", translate("Method"))
 | 
			
		||||
	for _, m in ipairs(methods) do
 | 
			
		||||
		o:value(m)
 | 
			
		||||
	end
 | 
			
		||||
	o = optfunc(Value, "key", translate("Key (base64 encoding)"))
 | 
			
		||||
	o.datatype = "base64"
 | 
			
		||||
	o.password = true
 | 
			
		||||
	o = optfunc(Value, "password", translate("Password"))
 | 
			
		||||
	o.password = true
 | 
			
		||||
	o.size = 12
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function options_common(s, tab)
 | 
			
		||||
	local o
 | 
			
		||||
 | 
			
		||||
	o = s:taboption(tab, ListValue, "mode", translate("Mode of operation"))
 | 
			
		||||
	for _, m in ipairs(modes) do
 | 
			
		||||
		o:value(m)
 | 
			
		||||
	end
 | 
			
		||||
	o.default = "tcp_and_udp"
 | 
			
		||||
	o = s:taboption(tab, Value, "mtu", translate("MTU"))
 | 
			
		||||
	o.datatype = "uinteger"
 | 
			
		||||
	o = s:taboption(tab, Value, "timeout", translate("Timeout (sec)"))
 | 
			
		||||
	o.datatype = "uinteger"
 | 
			
		||||
	s:taboption(tab, Value, "user", translate("Run as"))
 | 
			
		||||
 | 
			
		||||
	s:taboption(tab, Flag, "verbose", translate("Verbose"))
 | 
			
		||||
	s:taboption(tab, Flag, "ipv6_first", translate("IPv6 First"), translate("Prefer IPv6 addresses when resolving names"))
 | 
			
		||||
	s:taboption(tab, Flag, "fast_open", translate("Enable TCP Fast Open"))
 | 
			
		||||
	s:taboption(tab, Flag, "reuse_port", translate("Enable SO_REUSEPORT"))
 | 
			
		||||
	s:taboption(tab, Flag, "no_delay", translate("Enable TCP_NODELAY"))
 | 
			
		||||
	s:taboption(tab, Flag, "mptcp", translate("Enable MPTCP"))
 | 
			
		||||
	--s:taboption(tab, Flag, "ebpf", translate("Enable eBPF"))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function options_obfs(s, tab)
 | 
			
		||||
	local o
 | 
			
		||||
	local v2ray_installed = nixio.fs.access("/usr/bin/v2ray-plugin")
 | 
			
		||||
	local obfs_installed = nixio.fs.access("/usr/bin/obfs-local")
 | 
			
		||||
	s:taboption(tab, Flag, "obfs", translate("Enable"))
 | 
			
		||||
	o = s:taboption(tab, ListValue, "obfs_plugin", translate("Plugin"))
 | 
			
		||||
	if v2ray_installed then
 | 
			
		||||
		o:value("v2ray")
 | 
			
		||||
		o.default = "v2ray"
 | 
			
		||||
	else
 | 
			
		||||
		o.default = "obfs-simple"
 | 
			
		||||
	end
 | 
			
		||||
	if obfs_installed then
 | 
			
		||||
		o:value("obfs-simple")
 | 
			
		||||
	end
 | 
			
		||||
	o = s:taboption(tab, ListValue, "obfs_type", translate("Type"))
 | 
			
		||||
	o:value("http")
 | 
			
		||||
	o:value("tls")
 | 
			
		||||
	o.default = "http"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function ucival_to_bool(val)
 | 
			
		||||
	return val == "true" or val == "1" or val == "yes" or val == "on"
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function cfgvalue_overview(sdata)
 | 
			
		||||
	local stype = sdata[".type"]
 | 
			
		||||
	local lines  = {}
 | 
			
		||||
 | 
			
		||||
	if stype == "ss_server" then
 | 
			
		||||
		cfgvalue_overview_(sdata, lines, names_options_server)
 | 
			
		||||
		cfgvalue_overview_(sdata, lines, names_options_common)
 | 
			
		||||
		cfgvalue_overview_(sdata, lines, {
 | 
			
		||||
			"bind_address",
 | 
			
		||||
		})
 | 
			
		||||
		local installed = nixio.fs.access("/usr/bin/obfs-server")
 | 
			
		||||
		if installed then
 | 
			
		||||
			cfgvalue_overview_(sdata, lines, names_options_obfs)
 | 
			
		||||
		end
 | 
			
		||||
	elseif stype == "ss_local" or stype == "ss_redir" or stype == "ss_tunnel" then
 | 
			
		||||
		cfgvalue_overview_(sdata, lines, names_options_client)
 | 
			
		||||
		if stype == "ss_tunnel" then
 | 
			
		||||
			cfgvalue_overview_(sdata, lines, {"tunnel_address"})
 | 
			
		||||
		end
 | 
			
		||||
		cfgvalue_overview_(sdata, lines, names_options_common)
 | 
			
		||||
		local installed = nixio.fs.access("/usr/bin/obfs-local")
 | 
			
		||||
		if installed then
 | 
			
		||||
			cfgvalue_overview_(sdata, lines, names_options_obfs)
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		return nil, nil
 | 
			
		||||
	end
 | 
			
		||||
	local sname = sdata[".name"]
 | 
			
		||||
	local key = "%s.%s" % {stype, sname}
 | 
			
		||||
	local value = {
 | 
			
		||||
		[".name"] = sname,
 | 
			
		||||
		name = '%s.<var>%s</var>' % {stype, sname},
 | 
			
		||||
		overview = table.concat(lines, "</br>"),
 | 
			
		||||
		disabled = ucival_to_bool(sdata["disabled"]),
 | 
			
		||||
	}
 | 
			
		||||
	return key, value
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function cfgvalue_overview_(sdata, lines, names)
 | 
			
		||||
	local line
 | 
			
		||||
 | 
			
		||||
	for _, n in ipairs(names) do
 | 
			
		||||
		local v = sdata[n]
 | 
			
		||||
		if v ~= nil then
 | 
			
		||||
			if n == "key" or n == "password" then
 | 
			
		||||
				v = translate("<hidden>")
 | 
			
		||||
			end
 | 
			
		||||
			local fv = "<var>%s</var>" % ut.pcdata(v)
 | 
			
		||||
			if sdata[".type"] ~= "ss_server" and n == "server" then
 | 
			
		||||
				fv = '<a class="label" href="%s">%s</a>' % {
 | 
			
		||||
					ds.build_url("admin/services/shadowsocks-libev/servers", v), fv}
 | 
			
		||||
			end
 | 
			
		||||
			line = n .. ": " .. fv
 | 
			
		||||
			table.insert(lines, line)
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function option_install_package(s, tab)
 | 
			
		||||
	local bin = s.sectiontype:gsub("_", "-", 1)
 | 
			
		||||
	local installed = nixio.fs.access("/usr/bin/" .. bin)
 | 
			
		||||
	if installed then
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
	local opkg_package = "shadowsocks-libev-" .. bin
 | 
			
		||||
	local p_install
 | 
			
		||||
	if tab then
 | 
			
		||||
		p_install = s:taboption(tab, Button, "_install")
 | 
			
		||||
	else
 | 
			
		||||
		p_install = s:option(Button, "_install")
 | 
			
		||||
	end
 | 
			
		||||
	p_install.title      = translate("Package is not installed")
 | 
			
		||||
	p_install.inputtitle = translate("Install package %q" % opkg_package)
 | 
			
		||||
	p_install.inputstyle = "apply"
 | 
			
		||||
 | 
			
		||||
	function p_install.write()
 | 
			
		||||
		return luci.http.redirect(
 | 
			
		||||
			luci.dispatcher.build_url("admin/system/packages") ..
 | 
			
		||||
			"?submit=1&install=%s" % opkg_package
 | 
			
		||||
		)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
names_options_server = {
 | 
			
		||||
	"server",
 | 
			
		||||
	"server_port",
 | 
			
		||||
	"method",
 | 
			
		||||
	"key",
 | 
			
		||||
	"password",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
names_options_client = {
 | 
			
		||||
	"server",
 | 
			
		||||
	"local_address",
 | 
			
		||||
	"local_port",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
names_options_common = {
 | 
			
		||||
	"verbose",
 | 
			
		||||
	"ipv6_first",
 | 
			
		||||
	"fast_open",
 | 
			
		||||
	"no_delay",
 | 
			
		||||
	"reuse_port",
 | 
			
		||||
	"mode",
 | 
			
		||||
	"mtu",
 | 
			
		||||
	"timeout",
 | 
			
		||||
	"user",
 | 
			
		||||
	"mptcp",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
names_options_obfs = {
 | 
			
		||||
	"obfs",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
modes = {
 | 
			
		||||
	"tcp_only",
 | 
			
		||||
	"tcp_and_udp",
 | 
			
		||||
	"udp_only",
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
methods = {
 | 
			
		||||
	"none",
 | 
			
		||||
	-- aead
 | 
			
		||||
	"aes-128-gcm",
 | 
			
		||||
	"aes-192-gcm",
 | 
			
		||||
	"aes-256-gcm",
 | 
			
		||||
	"chacha20-ietf-poly1305",
 | 
			
		||||
	"xchacha20-ietf-poly1305",
 | 
			
		||||
	-- stream
 | 
			
		||||
	"table",
 | 
			
		||||
	"rc4",
 | 
			
		||||
	"rc4-md5",
 | 
			
		||||
	"aes-128-cfb",
 | 
			
		||||
	"aes-192-cfb",
 | 
			
		||||
	"aes-256-cfb",
 | 
			
		||||
	"aes-128-ctr",
 | 
			
		||||
	"aes-192-ctr",
 | 
			
		||||
	"aes-256-ctr",
 | 
			
		||||
	"bf-cfb",
 | 
			
		||||
	"camellia-128-cfb",
 | 
			
		||||
	"camellia-192-cfb",
 | 
			
		||||
	"camellia-256-cfb",
 | 
			
		||||
	"salsa20",
 | 
			
		||||
	"chacha20",
 | 
			
		||||
	"chacha20-ietf",
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,38 +0,0 @@
 | 
			
		|||
<div class="cbi-section-create cbi-tblsection-create">
 | 
			
		||||
	<div>
 | 
			
		||||
		<select class="cbi-input-select" id="_newinst.type" name="_newinst.type">
 | 
			
		||||
			<option value="_dummy">-- instance type --</option>
 | 
			
		||||
			<option value="ss_local">ss-local</option>
 | 
			
		||||
			<option value="ss_tunnel">ss-tunnel</option>
 | 
			
		||||
			<option value="ss_redir">ss-redir</option>
 | 
			
		||||
			<option value="ss_server">ss-server</option>
 | 
			
		||||
		</select>
 | 
			
		||||
	</div>
 | 
			
		||||
	<div>
 | 
			
		||||
		<input type="text" class="cbi-input-text" id="_newinst.name" name="_newinst.name" placeholder="<%:Name%>"/>
 | 
			
		||||
	</div>
 | 
			
		||||
	<input type="submit" class="cbi-button cbi-button-add" name="cbi.cts.<%=self.config%>" value="<%:Add%>" />
 | 
			
		||||
</div>
 | 
			
		||||
<script type="text/javascript">//<![CDATA[
 | 
			
		||||
	XHR.poll(5, '<%=url('admin/services/shadowsocks-libev/status')%>', null,
 | 
			
		||||
		function(x, st)
 | 
			
		||||
		{
 | 
			
		||||
			var names = [
 | 
			
		||||
				<%-
 | 
			
		||||
					for _, name in ipairs(self:cfgsections()) do
 | 
			
		||||
						write("%q," % name)
 | 
			
		||||
					end
 | 
			
		||||
				-%>
 | 
			
		||||
			];
 | 
			
		||||
			var instances = st["instances"] || {};
 | 
			
		||||
			for (var i = 0, len = names.length; i < len; i++) {
 | 
			
		||||
				var name = names[i];
 | 
			
		||||
				var el = document.getElementById('cbi-table-' + name + '-running');
 | 
			
		||||
				if (el) {
 | 
			
		||||
					var running = instances.hasOwnProperty(name)? instances[name].running : false;
 | 
			
		||||
					el.innerText = running ? 'yes' : 'no';
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	);
 | 
			
		||||
//]]></script>
 | 
			
		||||
							
								
								
									
										327
									
								
								luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								luci-app-shadowsocks-libev/po/bg/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,327 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: bg\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "<hidden>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "Bind address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:87
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Default action for locally generated TCP packets"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:103
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:128
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:102
 | 
			
		||||
msgid "Dst default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:86
 | 
			
		||||
msgid "Dst ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:94
 | 
			
		||||
msgid "Dst ip/net bypass file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:89
 | 
			
		||||
msgid "Dst ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:98
 | 
			
		||||
msgid "Dst ip/net forward file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:181
 | 
			
		||||
msgid "Enable SO_REUSEPORT"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:179
 | 
			
		||||
msgid "Enable TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:180
 | 
			
		||||
msgid "Enable TCP_NODELAY"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:121
 | 
			
		||||
msgid "Enable/Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:131
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:68
 | 
			
		||||
msgid "Extra arguments"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:95
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Forward recentrst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "General Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
msgid "IPv6 First"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:62
 | 
			
		||||
msgid "Ingress interfaces"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:235
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Local Instances"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:113
 | 
			
		||||
msgid "Local address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:117
 | 
			
		||||
msgid "Local port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:58
 | 
			
		||||
msgid "Local-out default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:171
 | 
			
		||||
msgid "MTU"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:146
 | 
			
		||||
msgid "Method"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:166
 | 
			
		||||
msgid "Mode of operation"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:31
 | 
			
		||||
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 "
 | 
			
		||||
"checked against <em>Src ip/net bypass</em>, <em>Src ip/net forward</em>, "
 | 
			
		||||
"<em>Src ip/net checkdst</em> and if none matches <em>Src default</em> will "
 | 
			
		||||
"give the default action to be taken. If the prior check results in action "
 | 
			
		||||
"<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
 | 
			
		||||
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
 | 
			
		||||
msgid "Overview"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:234
 | 
			
		||||
msgid "Package is not installed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:69
 | 
			
		||||
msgid "Passes additional arguments to iptables. Use with care!"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:151
 | 
			
		||||
msgid "Password"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:161
 | 
			
		||||
msgid "Plugin"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:163
 | 
			
		||||
msgid "Plugin Options"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Remote Servers"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:111
 | 
			
		||||
msgid "Remote server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:175
 | 
			
		||||
msgid "Run as"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:116
 | 
			
		||||
msgid "Running"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:138
 | 
			
		||||
msgid "Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:142
 | 
			
		||||
msgid "Server port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:9
 | 
			
		||||
msgid "Shadowsocks-libev"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:42
 | 
			
		||||
msgid "Source Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:81
 | 
			
		||||
msgid "Src default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:72
 | 
			
		||||
msgid "Src ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:78
 | 
			
		||||
msgid "Src ip/net checkdst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:75
 | 
			
		||||
msgid "Src ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:87
 | 
			
		||||
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
 | 
			
		||||
msgid "The address ss-tunnel will forward traffic to"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:173
 | 
			
		||||
msgid "Timeout (sec)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:95
 | 
			
		||||
msgid "Tunnel address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:177
 | 
			
		||||
msgid "Verbose"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:51
 | 
			
		||||
msgid "ss-redir for TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:54
 | 
			
		||||
msgid "ss-redir for UDP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
							
								
								
									
										336
									
								
								luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										336
									
								
								luci-app-shadowsocks-libev/po/ca/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,336 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"PO-Revision-Date: 2019-10-25 18:01+0000\n"
 | 
			
		||||
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
 | 
			
		||||
"Language-Team: Catalan <https://hosted.weblate.org/projects/openwrt/"
 | 
			
		||||
"luciapplicationsshadowsocks-libev/ca/>\n"
 | 
			
		||||
"Language: ca\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
 | 
			
		||||
"X-Generator: Weblate 3.9.1-dev\n"
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "<hidden>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "Bind address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:87
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Default action for locally generated TCP packets"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:103
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:128
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:102
 | 
			
		||||
msgid "Dst default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:86
 | 
			
		||||
msgid "Dst ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:94
 | 
			
		||||
msgid "Dst ip/net bypass file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:89
 | 
			
		||||
msgid "Dst ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:98
 | 
			
		||||
msgid "Dst ip/net forward file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:181
 | 
			
		||||
msgid "Enable SO_REUSEPORT"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:179
 | 
			
		||||
msgid "Enable TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:180
 | 
			
		||||
msgid "Enable TCP_NODELAY"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:121
 | 
			
		||||
msgid "Enable/Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:131
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr "Activat"
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:68
 | 
			
		||||
msgid "Extra arguments"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:95
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Forward recentrst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "General Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
msgid "IPv6 First"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:62
 | 
			
		||||
msgid "Ingress interfaces"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:235
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Local Instances"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:113
 | 
			
		||||
msgid "Local address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:117
 | 
			
		||||
msgid "Local port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:58
 | 
			
		||||
msgid "Local-out default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:171
 | 
			
		||||
msgid "MTU"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:146
 | 
			
		||||
msgid "Method"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:166
 | 
			
		||||
msgid "Mode of operation"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:31
 | 
			
		||||
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 "
 | 
			
		||||
"checked against <em>Src ip/net bypass</em>, <em>Src ip/net forward</em>, "
 | 
			
		||||
"<em>Src ip/net checkdst</em> and if none matches <em>Src default</em> will "
 | 
			
		||||
"give the default action to be taken. If the prior check results in action "
 | 
			
		||||
"<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
 | 
			
		||||
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
 | 
			
		||||
msgid "Overview"
 | 
			
		||||
msgstr "Visió de conjunt"
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:234
 | 
			
		||||
msgid "Package is not installed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:69
 | 
			
		||||
msgid "Passes additional arguments to iptables. Use with care!"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:151
 | 
			
		||||
msgid "Password"
 | 
			
		||||
msgstr "Contrasenya"
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:161
 | 
			
		||||
msgid "Plugin"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:163
 | 
			
		||||
msgid "Plugin Options"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Remote Servers"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:111
 | 
			
		||||
msgid "Remote server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:175
 | 
			
		||||
msgid "Run as"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:116
 | 
			
		||||
msgid "Running"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:138
 | 
			
		||||
msgid "Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:142
 | 
			
		||||
msgid "Server port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:9
 | 
			
		||||
msgid "Shadowsocks-libev"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:42
 | 
			
		||||
msgid "Source Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:81
 | 
			
		||||
msgid "Src default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:72
 | 
			
		||||
msgid "Src ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:78
 | 
			
		||||
msgid "Src ip/net checkdst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:75
 | 
			
		||||
msgid "Src ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:87
 | 
			
		||||
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
 | 
			
		||||
msgid "The address ss-tunnel will forward traffic to"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:173
 | 
			
		||||
msgid "Timeout (sec)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:95
 | 
			
		||||
msgid "Tunnel address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:177
 | 
			
		||||
msgid "Verbose"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:51
 | 
			
		||||
msgid "ss-redir for TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:54
 | 
			
		||||
msgid "ss-redir for UDP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#~ msgid "Name"
 | 
			
		||||
#~ msgstr "Nom"
 | 
			
		||||
							
								
								
									
										327
									
								
								luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										327
									
								
								luci-app-shadowsocks-libev/po/cs/shadowsocks-libev.po
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,327 @@
 | 
			
		|||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Language: cs\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "<hidden>"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
msgid "Bind address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:87
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Default action for locally generated TCP packets"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:103
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:128
 | 
			
		||||
msgid "Disabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:102
 | 
			
		||||
msgid "Dst default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:86
 | 
			
		||||
msgid "Dst ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:94
 | 
			
		||||
msgid "Dst ip/net bypass file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:89
 | 
			
		||||
msgid "Dst ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:98
 | 
			
		||||
msgid "Dst ip/net forward file"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:181
 | 
			
		||||
msgid "Enable SO_REUSEPORT"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:179
 | 
			
		||||
msgid "Enable TCP Fast Open"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:180
 | 
			
		||||
msgid "Enable TCP_NODELAY"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:121
 | 
			
		||||
msgid "Enable/Disable"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:131
 | 
			
		||||
msgid "Enabled"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:68
 | 
			
		||||
msgid "Extra arguments"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:95
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Forward recentrst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "General Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
msgid "IPv6 First"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:62
 | 
			
		||||
msgid "Ingress interfaces"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:235
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Local Instances"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:113
 | 
			
		||||
msgid "Local address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:117
 | 
			
		||||
msgid "Local port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:58
 | 
			
		||||
msgid "Local-out default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:171
 | 
			
		||||
msgid "MTU"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:146
 | 
			
		||||
msgid "Method"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:166
 | 
			
		||||
msgid "Mode of operation"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:31
 | 
			
		||||
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 "
 | 
			
		||||
"checked against <em>Src ip/net bypass</em>, <em>Src ip/net forward</em>, "
 | 
			
		||||
"<em>Src ip/net checkdst</em> and if none matches <em>Src default</em> will "
 | 
			
		||||
"give the default action to be taken. If the prior check results in action "
 | 
			
		||||
"<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
 | 
			
		||||
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
 | 
			
		||||
msgid "Overview"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:234
 | 
			
		||||
msgid "Package is not installed"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:69
 | 
			
		||||
msgid "Passes additional arguments to iptables. Use with care!"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:151
 | 
			
		||||
msgid "Password"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:161
 | 
			
		||||
msgid "Plugin"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:163
 | 
			
		||||
msgid "Plugin Options"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:178
 | 
			
		||||
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
 | 
			
		||||
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
 | 
			
		||||
msgid "Remote Servers"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:111
 | 
			
		||||
msgid "Remote server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:175
 | 
			
		||||
msgid "Run as"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:116
 | 
			
		||||
msgid "Running"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:138
 | 
			
		||||
msgid "Server"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:142
 | 
			
		||||
msgid "Server port"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/luasrc/controller/shadowsocks-libev.lua:9
 | 
			
		||||
msgid "Shadowsocks-libev"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:42
 | 
			
		||||
msgid "Source Settings"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:81
 | 
			
		||||
msgid "Src default"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:72
 | 
			
		||||
msgid "Src ip/net bypass"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:78
 | 
			
		||||
msgid "Src ip/net checkdst"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:75
 | 
			
		||||
msgid "Src ip/net forward"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:87
 | 
			
		||||
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
 | 
			
		||||
msgid "The address ss-tunnel will forward traffic to"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:173
 | 
			
		||||
msgid "Timeout (sec)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/instances.js:95
 | 
			
		||||
msgid "Tunnel address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/shadowsocks-libev.js:177
 | 
			
		||||
msgid "Verbose"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:51
 | 
			
		||||
msgid "ss-redir for TCP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: applications/luci-app-shadowsocks-libev/htdocs/luci-static/resources/view/shadowsocks-libev/rules.js:54
 | 
			
		||||
msgid "ss-redir for UDP"
 | 
			
		||||
msgstr ""
 | 
			
		||||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue