mirror of
https://github.com/syncthing/syncthing.git
synced 2025-12-24 06:28:10 -05:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fdde05cf12 | ||
|
|
89fc69249b | ||
|
|
d421d66a3f | ||
|
|
27aba3567b | ||
|
|
5532532db9 | ||
|
|
c369f8abb2 | ||
|
|
9e52f6cf2f | ||
|
|
d22a38d947 | ||
|
|
439fa6c848 | ||
|
|
6b475bdb78 | ||
|
|
7d56fba321 | ||
|
|
bf6ffbbd67 | ||
|
|
a972811f54 | ||
|
|
88da67d7c3 | ||
|
|
1f07e05470 | ||
|
|
5cab08a36a | ||
|
|
4e2bb58e2d | ||
|
|
ae176ea9cd | ||
|
|
2b17db8aa3 | ||
|
|
81a4b22d43 | ||
|
|
f7da96fb82 | ||
|
|
f5e5af391a | ||
|
|
5a3ac86c3f | ||
|
|
3d78ff9f68 | ||
|
|
f3127a66ee | ||
|
|
90b4711ad2 | ||
|
|
716b42103a | ||
|
|
405cdedcd3 | ||
|
|
0b3a101ccd | ||
|
|
089320aadc | ||
|
|
b2fb2ef276 |
214
.github/workflows/build-syncthing.yaml
vendored
214
.github/workflows/build-syncthing.yaml
vendored
@@ -5,7 +5,9 @@ on:
|
||||
push:
|
||||
|
||||
env:
|
||||
# The go version to use for builds.
|
||||
# The go version to use for builds. We set check-latest to true when
|
||||
# installing, so we get the latest patch version that matches the
|
||||
# expression.
|
||||
GO_VERSION: "^1.20.3"
|
||||
|
||||
# Optimize compatibility on the slow archictures.
|
||||
@@ -61,16 +63,13 @@ jobs:
|
||||
with:
|
||||
go-version: ${{ matrix.go }}
|
||||
cache: true
|
||||
check-latest: true
|
||||
|
||||
- name: Build
|
||||
run: |
|
||||
go run build.go
|
||||
|
||||
- name: Test
|
||||
# Our Windows tests currently don't work on Go 1.20
|
||||
# https://github.com/syncthing/syncthing/issues/8779
|
||||
# https://github.com/syncthing/syncthing/issues/8778
|
||||
if: "!(matrix.go == '1.20' && matrix.runner == 'windows-latest')"
|
||||
run: |
|
||||
go run build.go test
|
||||
|
||||
@@ -87,11 +86,35 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- name: Check correctness
|
||||
run: |
|
||||
go test -v ./meta
|
||||
|
||||
#
|
||||
# The basic checks job is a virtual one that depends on the matrix tests,
|
||||
# the correctness checks, and various builds that we always do. This makes
|
||||
# it easy to have the PR process have a single test as a gatekeeper for
|
||||
# merging, instead of having to add all the matrix tests and update them
|
||||
# each time the version changes. (The top level test is not available for
|
||||
# choosing there, only the matrix "children".)
|
||||
#
|
||||
|
||||
basics:
|
||||
name: Basic checks passed
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- build-test
|
||||
- correctness
|
||||
- package-linux
|
||||
- package-cross
|
||||
- package-source
|
||||
- package-debian
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
||||
#
|
||||
# Windows
|
||||
#
|
||||
@@ -100,8 +123,6 @@ jobs:
|
||||
name: Package for Windows
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Set git to use LF
|
||||
@@ -120,6 +141,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
@@ -157,8 +180,6 @@ jobs:
|
||||
|
||||
package-linux:
|
||||
name: Package for Linux
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -168,6 +189,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
@@ -199,8 +222,6 @@ jobs:
|
||||
name: Package for macOS
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -210,6 +231,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
@@ -291,6 +314,7 @@ jobs:
|
||||
environment: signing
|
||||
needs:
|
||||
- package-macos
|
||||
- basics
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Download artifacts
|
||||
@@ -320,8 +344,6 @@ jobs:
|
||||
|
||||
package-cross:
|
||||
name: Package cross compiled
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -331,6 +353,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
@@ -375,8 +399,6 @@ jobs:
|
||||
|
||||
package-source:
|
||||
name: Package source code
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -386,6 +408,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- name: Package source
|
||||
run: |
|
||||
@@ -410,7 +434,7 @@ jobs:
|
||||
path: syncthing-source-*.tar.gz
|
||||
|
||||
#
|
||||
# Sign binaries for auto upgrade
|
||||
# Sign binaries for auto upgrade, generate ASC signature files
|
||||
#
|
||||
|
||||
sign-for-upgrade:
|
||||
@@ -418,10 +442,12 @@ jobs:
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
needs:
|
||||
- basics
|
||||
- package-windows
|
||||
- package-linux
|
||||
- package-macos
|
||||
- package-cross
|
||||
- package-source
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -450,9 +476,29 @@ jobs:
|
||||
mv packages-*/* packages
|
||||
pushd packages
|
||||
"$GITHUB_WORKSPACE/tools/sign-only"
|
||||
rm -f "$PRIVATE_KEY"
|
||||
env:
|
||||
STSIGTOOL_PRIVATE_KEY: ${{ secrets.STSIGTOOL_PRIVATE_KEY }}
|
||||
|
||||
- name: Create and sign .asc files
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt -y install gnupg
|
||||
|
||||
export SIGNING_KEY="$RUNNER_TEMP/gpg-secret.asc"
|
||||
echo "$GNUPG_SIGNING_KEY_BASE64" | base64 -d > "$SIGNING_KEY"
|
||||
gpg --import < "$SIGNING_KEY"
|
||||
|
||||
pushd packages
|
||||
files=(*.tar.gz *.zip)
|
||||
sha1sum "${files[@]}" | gpg --clearsign > sha1sum.txt.asc
|
||||
sha256sum "${files[@]}" | gpg --clearsign > sha256sum.txt.asc
|
||||
gpg --sign --armour --detach syncthing-source-*.tar.gz
|
||||
popd
|
||||
rm -f "$SIGNING_KEY" .gnupg
|
||||
env:
|
||||
GNUPG_SIGNING_KEY_BASE64: ${{ secrets.GNUPG_SIGNING_KEY_BASE64 }}
|
||||
|
||||
- name: Archive artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
@@ -465,8 +511,6 @@ jobs:
|
||||
|
||||
package-debian:
|
||||
name: Package for Debian
|
||||
needs:
|
||||
- build-test
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
@@ -476,6 +520,8 @@ jobs:
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
@@ -494,8 +540,8 @@ jobs:
|
||||
|
||||
- name: Package for Debian
|
||||
run: |
|
||||
for goarch in amd64 arm64 arm ; do
|
||||
go run build.go -goos linux -goarch "$goarch" deb
|
||||
for arch in amd64 i386 armhf armel arm64 ; do
|
||||
go run build.go -no-upgrade -installsuffix=no-upgrade -goarch "$arch" deb
|
||||
done
|
||||
env:
|
||||
BUILD_USER: debian
|
||||
@@ -549,3 +595,131 @@ jobs:
|
||||
RCLONE_CONFIG_SPACES_ACL: public-read
|
||||
with:
|
||||
args: sync packages spaces:syncthing/nightly
|
||||
|
||||
#
|
||||
# Push release artifacts to Spaces
|
||||
#
|
||||
|
||||
publish-release-files:
|
||||
name: Publish release files
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release')
|
||||
environment: signing
|
||||
needs:
|
||||
- sign-for-upgrade
|
||||
- package-debian
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Download signed packages
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: packages-signed
|
||||
path: packages
|
||||
|
||||
- name: Download debian packages
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: debian-packages
|
||||
path: packages
|
||||
|
||||
- name: Set version
|
||||
run: |
|
||||
version=$(go run build.go version)
|
||||
echo "VERSION=$version" >> $GITHUB_ENV
|
||||
|
||||
- name: Push to Spaces
|
||||
uses: docker://docker.io/rclone/rclone:latest
|
||||
env:
|
||||
RCLONE_CONFIG_SPACES_TYPE: s3
|
||||
RCLONE_CONFIG_SPACES_PROVIDER: DigitalOcean
|
||||
RCLONE_CONFIG_SPACES_ACCESS_KEY_ID: ${{ secrets.SPACES_KEY }}
|
||||
RCLONE_CONFIG_SPACES_SECRET_ACCESS_KEY: ${{ secrets.SPACES_SECRET }}
|
||||
RCLONE_CONFIG_SPACES_ENDPOINT: ams3.digitaloceanspaces.com
|
||||
RCLONE_CONFIG_SPACES_ACL: public-read
|
||||
with:
|
||||
args: sync packages spaces:syncthing/release/${{ env.VERSION }}
|
||||
|
||||
docker-syncthing:
|
||||
name: Build and push Docker images
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: docker
|
||||
strategy:
|
||||
matrix:
|
||||
pkg:
|
||||
- syncthing
|
||||
- strelaysrv
|
||||
- stdiscosrv
|
||||
include:
|
||||
- pkg: syncthing
|
||||
dockerfile: Dockerfile
|
||||
- pkg: strelaysrv
|
||||
dockerfile: Dockerfile.strelaysrv
|
||||
- pkg: stdiscosrv
|
||||
dockerfile: Dockerfile.stdiscosrv
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
- uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
~/.cache/go-build
|
||||
~/go/pkg/mod
|
||||
key: ${{ runner.os }}-go-${{ env.GO_VERSION }}-docker-${{ matrix.pkg }}-${{ hashFiles('**/go.sum') }}
|
||||
|
||||
- name: Build binaries
|
||||
run: |
|
||||
for arch in arm64 amd64; do
|
||||
go run build.go -goos linux -goarch "$arch" -no-upgrade build ${{ matrix.pkg }}
|
||||
mv ${{ matrix.pkg }} ${{ matrix.pkg }}-linux-"$arch"
|
||||
done
|
||||
env:
|
||||
CGO_ENABLED: "0"
|
||||
BUILD_USER: docker
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
|
||||
- name: Set version tags
|
||||
run: |
|
||||
version=$(go run build.go version)
|
||||
version=${version#v}
|
||||
if [[ $version == @([0-9]|[0-9][0-9]).@([0-9]|[0-9][0-9]).@([0-9]|[0-9][0-9]) ]] ; then
|
||||
echo Release version, pushing to :latest and version tags
|
||||
major=${version%.*.*}
|
||||
minor=${version%.*}
|
||||
tags=syncthing/${{ matrix.pkg }}:$version,syncthing/${{ matrix.pkg }}:$major,syncthing/${{ matrix.pkg }}:$minor,syncthing/${{ matrix.pkg }}:latest
|
||||
elif [[ $version == *-rc.@([0-9]|[0-9][0-9]) ]] ; then
|
||||
echo Release candidate, pushing to :rc
|
||||
tags=syncthing/${{ matrix.pkg }}:rc
|
||||
else
|
||||
echo Development version, pushing to :edge
|
||||
tags=syncthing/${{ matrix.pkg }}:edge
|
||||
fi
|
||||
echo "DOCKER_TAGS=$tags" >> $GITHUB_ENV
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
with:
|
||||
context: .
|
||||
file: ${{ matrix.dockerfile }}
|
||||
platforms: linux/amd64,linux/arm64
|
||||
push: true
|
||||
tags: ${{ env.DOCKER_TAGS }}
|
||||
|
||||
4
AUTHORS
4
AUTHORS
@@ -23,6 +23,7 @@ Alessandro G. (alessandro.g89) <alessandro.g89@gmail.com>
|
||||
Alex Lindeman <139387+aelindeman@users.noreply.github.com>
|
||||
Alex Xu <alex.hello71@gmail.com>
|
||||
Alexander Graf (alex2108) <register-github@alex-graf.de>
|
||||
Alexander Seiler <seileralex@gmail.com>
|
||||
Alexandre Alves <alexandrealvesdb.contact@gmail.com>
|
||||
Alexandre Viau (aviau) <alexandre@alexandreviau.net> <aviau@debian.org>
|
||||
Aman Gupta <aman@tmm1.net>
|
||||
@@ -112,6 +113,7 @@ Erik Meitner (WSGCSysadmin) <e.meitner@willystreet.coop>
|
||||
Evan Spensley <94762716+0evan@users.noreply.github.com>
|
||||
Evgeny Kuznetsov <evgeny@kuznetsov.md>
|
||||
Federico Castagnini (facastagnini) <federico.castagnini@gmail.com>
|
||||
Felix <53702818+f-eliks@users.noreply.github.com>
|
||||
Felix Ableitner (Nutomic) <me@nutomic.com>
|
||||
Felix Lampe <mail@flampe.de>
|
||||
Felix Unterpaintner (bigbear2nd) <bigbear2nd@gmail.com>
|
||||
@@ -125,6 +127,7 @@ Gleb Sinyavskiy <zhulik.gleb@gmail.com>
|
||||
Graham Miln (grahammiln) <graham.miln@dssw.co.uk> <graham.miln@miln.eu>
|
||||
greatroar <61184462+greatroar@users.noreply.github.com>
|
||||
Greg <gco@jazzhaiku.com>
|
||||
guangwu <guoguangwu@magic-shield.com>
|
||||
Han Boetes <han@boetes.org>
|
||||
HansK-p <42314815+HansK-p@users.noreply.github.com>
|
||||
Harrison Jones (harrisonhjones) <harrisonhjones@users.noreply.github.com>
|
||||
@@ -304,6 +307,7 @@ Vil Brekin (Vilbrekin) <vilbrekin@gmail.com>
|
||||
villekalliomaki <53118179+villekalliomaki@users.noreply.github.com>
|
||||
Vladimir Rusinov <vrusinov@google.com> <vladimir.rusinov@gmail.com>
|
||||
wangguoliang <liangcszzu@163.com>
|
||||
Will Rouesnel <wrouesnel@wrouesnel.com>
|
||||
William A. Kennington III (wkennington) <william@wkennington.com>
|
||||
wouter bolsterlee <wouter@bolsterl.ee>
|
||||
Wulf Weich (wweich) <wweich@users.noreply.github.com> <wweich@gmx.de> <wulf@weich-kr.de>
|
||||
|
||||
26
Dockerfile
26
Dockerfile
@@ -1,15 +1,33 @@
|
||||
ARG GOVERSION=latest
|
||||
|
||||
#
|
||||
# Maybe build Syncthing. This is a bit ugly as we can't make an entire
|
||||
# section of the Dockerfile conditional, so we end up always pulling the
|
||||
# golang image as builder. Then we check if the executable we need already
|
||||
# exists (pre-built) otherwise we build it.
|
||||
#
|
||||
|
||||
FROM golang:$GOVERSION AS builder
|
||||
ARG BUILD_USER
|
||||
ARG BUILD_HOST
|
||||
ARG TARGETARCH
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
ENV CGO_ENABLED=0
|
||||
ENV BUILD_HOST=syncthing.net
|
||||
ENV BUILD_USER=docker
|
||||
RUN rm -f syncthing && go run build.go -no-upgrade build syncthing
|
||||
RUN if [ ! -f syncthing-linux-$TARGETARCH ] ; then \
|
||||
go run build.go -no-upgrade build syncthing ; \
|
||||
mv syncthing syncthing-linux-$TARGETARCH ; \
|
||||
fi
|
||||
|
||||
#
|
||||
# The rest of the Dockerfile uses the binary from the builder, prebuilt or
|
||||
# not.
|
||||
#
|
||||
|
||||
FROM alpine
|
||||
ARG TARGETARCH
|
||||
|
||||
EXPOSE 8384 22000/tcp 22000/udp 21027/udp
|
||||
|
||||
@@ -17,7 +35,7 @@ VOLUME ["/var/syncthing"]
|
||||
|
||||
RUN apk add --no-cache ca-certificates curl libcap su-exec tzdata
|
||||
|
||||
COPY --from=builder /src/syncthing /bin/syncthing
|
||||
COPY --from=builder /src/syncthing-linux-$TARGETARCH /bin/syncthing
|
||||
COPY --from=builder /src/script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
|
||||
ENV PUID=1000 PGID=1000 HOME=/var/syncthing
|
||||
|
||||
@@ -1,19 +0,0 @@
|
||||
FROM alpine
|
||||
ARG TARGETARCH
|
||||
|
||||
EXPOSE 8384 22000/tcp 22000/udp 21027/udp
|
||||
|
||||
VOLUME ["/var/syncthing"]
|
||||
|
||||
RUN apk add --no-cache ca-certificates curl libcap su-exec tzdata
|
||||
|
||||
COPY ./syncthing-linux-$TARGETARCH /bin/syncthing
|
||||
COPY ./script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
|
||||
ENV PUID=1000 PGID=1000 HOME=/var/syncthing
|
||||
|
||||
HEALTHCHECK --interval=1m --timeout=10s \
|
||||
CMD curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
|
||||
|
||||
ENV STGUIADDRESS=0.0.0.0:8384
|
||||
ENTRYPOINT ["/bin/entrypoint.sh", "/bin/syncthing", "-home", "/var/syncthing/config"]
|
||||
@@ -1,15 +1,20 @@
|
||||
ARG GOVERSION=latest
|
||||
FROM golang:$GOVERSION AS builder
|
||||
ARG BUILD_USER
|
||||
ARG BUILD_HOST
|
||||
ARG TARGETARCH
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
ENV CGO_ENABLED=0
|
||||
ENV BUILD_HOST=syncthing.net
|
||||
ENV BUILD_USER=docker
|
||||
RUN rm -f stdiscosrv && go run build.go -no-upgrade build stdiscosrv
|
||||
RUN if [ ! -f stdiscosrv-linux-$TARGETARCH ] ; then \
|
||||
go run build.go -no-upgrade build stdiscosrv ; \
|
||||
mv stdiscosrv stdiscosrv-linux-$TARGETARCH ; \
|
||||
fi
|
||||
|
||||
FROM alpine
|
||||
ARG TARGETARCH
|
||||
|
||||
EXPOSE 19200 8443
|
||||
|
||||
@@ -17,7 +22,7 @@ VOLUME ["/var/stdiscosrv"]
|
||||
|
||||
RUN apk add --no-cache ca-certificates su-exec
|
||||
|
||||
COPY --from=builder /src/stdiscosrv /bin/stdiscosrv
|
||||
COPY --from=builder /src/stdiscosrv-linux-$TARGETARCH /bin/stdiscosrv
|
||||
COPY --from=builder /src/script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
|
||||
ENV PUID=1000 PGID=1000 HOME=/var/stdiscosrv
|
||||
|
||||
@@ -1,15 +1,20 @@
|
||||
ARG GOVERSION=latest
|
||||
FROM golang:$GOVERSION AS builder
|
||||
ARG BUILD_USER
|
||||
ARG BUILD_HOST
|
||||
ARG TARGETARCH
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
ENV CGO_ENABLED=0
|
||||
ENV BUILD_HOST=syncthing.net
|
||||
ENV BUILD_USER=docker
|
||||
RUN rm -f strelaysrv && go run build.go -no-upgrade build strelaysrv
|
||||
RUN if [ ! -f strelaysrv-linux-$TARGETARCH ] ; then \
|
||||
go run build.go -no-upgrade build strelaysrv ; \
|
||||
mv strelaysrv strelaysrv-linux-$TARGETARCH ; \
|
||||
fi
|
||||
|
||||
FROM alpine
|
||||
ARG TARGETARCH
|
||||
|
||||
EXPOSE 22067 22070
|
||||
|
||||
@@ -17,7 +22,7 @@ VOLUME ["/var/strelaysrv"]
|
||||
|
||||
RUN apk add --no-cache ca-certificates su-exec
|
||||
|
||||
COPY --from=builder /src/strelaysrv /bin/strelaysrv
|
||||
COPY --from=builder /src/strelaysrv-linux-$TARGETARCH /bin/strelaysrv
|
||||
COPY --from=builder /src/script/docker-entrypoint.sh /bin/entrypoint.sh
|
||||
|
||||
ENV PUID=1000 PGID=1000 HOME=/var/strelaysrv
|
||||
|
||||
@@ -346,7 +346,7 @@ func restartMonitor(binary string, args []string) error {
|
||||
}
|
||||
|
||||
func restartMonitorUnix(binary string, args []string) error {
|
||||
return syscall.Exec(args[0], args, os.Environ())
|
||||
return syscall.Exec(binary, args, os.Environ())
|
||||
}
|
||||
|
||||
func restartMonitorWindows(binary string, args []string) error {
|
||||
@@ -521,7 +521,7 @@ func (f *autoclosedFile) ensureOpenLocked() error {
|
||||
// We open the file for write only, and create it if it doesn't exist.
|
||||
flags := os.O_WRONLY | os.O_CREATE | os.O_APPEND
|
||||
|
||||
fd, err := os.OpenFile(f.name, flags, 0644)
|
||||
fd, err := os.OpenFile(f.name, flags, 0o644)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
42
go.mod
42
go.mod
@@ -17,44 +17,44 @@ require (
|
||||
github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568
|
||||
github.com/getsentry/raven-go v0.2.0
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
|
||||
github.com/go-ldap/ldap/v3 v3.4.4
|
||||
github.com/go-ldap/ldap/v3 v3.4.5
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/greatroar/blobloom v0.7.2
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.2
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.3
|
||||
github.com/jackpal/gateway v1.0.10
|
||||
github.com/jackpal/go-nat-pmp v1.0.2
|
||||
github.com/julienschmidt/httprouter v1.3.0
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 // indirect
|
||||
github.com/lib/pq v1.10.7
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 // indirect
|
||||
github.com/lib/pq v1.10.9
|
||||
github.com/maruel/panicparse/v2 v2.3.1
|
||||
github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0
|
||||
github.com/minio/sha256-simd v1.0.0
|
||||
github.com/minio/sha256-simd v1.0.1
|
||||
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75
|
||||
github.com/oschwald/geoip2-golang v1.8.0
|
||||
github.com/pierrec/lz4/v4 v4.1.17
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/prometheus/client_golang v1.14.0
|
||||
github.com/prometheus/common v0.42.0 // indirect
|
||||
github.com/prometheus/procfs v0.9.0 // indirect
|
||||
github.com/prometheus/client_golang v1.15.1
|
||||
github.com/prometheus/common v0.44.0 // indirect
|
||||
github.com/prometheus/procfs v0.10.1 // indirect
|
||||
github.com/quic-go/quic-go v0.34.0
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
|
||||
github.com/sasha-s/go-deadlock v0.3.1
|
||||
github.com/shirou/gopsutil/v3 v3.23.3
|
||||
github.com/shirou/gopsutil/v3 v3.23.5
|
||||
github.com/syncthing/notify v0.0.0-20210616190510-c6b7342338d2
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
|
||||
github.com/thejerf/suture/v4 v4.0.2
|
||||
github.com/urfave/cli v1.22.12
|
||||
github.com/urfave/cli v1.22.14
|
||||
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0
|
||||
golang.org/x/crypto v0.8.0
|
||||
golang.org/x/crypto v0.10.0
|
||||
golang.org/x/mod v0.10.0 // indirect
|
||||
golang.org/x/net v0.9.0
|
||||
golang.org/x/sys v0.7.0
|
||||
golang.org/x/text v0.9.0
|
||||
golang.org/x/net v0.11.0
|
||||
golang.org/x/sys v0.9.0
|
||||
golang.org/x/text v0.10.0
|
||||
golang.org/x/time v0.3.0
|
||||
golang.org/x/tools v0.8.0
|
||||
golang.org/x/tools v0.9.3
|
||||
google.golang.org/protobuf v1.30.0
|
||||
)
|
||||
|
||||
@@ -65,18 +65,18 @@ require (
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/pprof v0.0.0-20230406165453-00490a63f317 // indirect
|
||||
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.9.2 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.10.0 // indirect
|
||||
github.com/oschwald/maxminddb-golang v1.10.0 // indirect
|
||||
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 // indirect
|
||||
github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
|
||||
github.com/prometheus/client_model v0.3.0 // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect
|
||||
)
|
||||
|
||||
// https://github.com/gobwas/glob/pull/55
|
||||
|
||||
130
go.sum
130
go.sum
@@ -2,14 +2,15 @@ github.com/AudriusButkevicius/pfilter v0.0.11 h1:6emuvqNeH1gGlqkML35pEizyPcaxdAN
|
||||
github.com/AudriusButkevicius/pfilter v0.0.11/go.mod h1:4eF1UYuEhoycTlr9IOP1sb0lL9u4nfAIouRqt2xJbzM=
|
||||
github.com/AudriusButkevicius/recli v0.0.7-0.20220911121932-d000ce8fbf0f h1:GmH5lT+moM7PbAJFBq57nH9WJ+wRnBXr/tyaYWbSAx8=
|
||||
github.com/AudriusButkevicius/recli v0.0.7-0.20220911121932-d000ce8fbf0f/go.mod h1:Nhfib1j/VFnLrXL9cHgA+/n2O6P5THuWelOnbfPNd78=
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||
github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0=
|
||||
github.com/alecthomas/kong v0.7.1 h1:azoTh0IOfwlAX3qN9sHWTxACE2oV8Bg2gAwBsMwDQY4=
|
||||
github.com/alecthomas/kong v0.7.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
|
||||
github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
|
||||
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA=
|
||||
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
|
||||
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b h1:Fjm4GuJ+TGMgqfGHN42IQArJb77CfD/mAwLbDUoJe6g=
|
||||
@@ -46,9 +47,9 @@ github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JY
|
||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
||||
github.com/go-ldap/ldap/v3 v3.4.4 h1:qPjipEpt+qDa6SI/h1fzuGWoRUY+qqQ9sOZq67/PYUs=
|
||||
github.com/go-ldap/ldap/v3 v3.4.4/go.mod h1:fe1MsuN5eJJ1FeLT/LEBVdWfNWKh459R7aXgXtJC+aI=
|
||||
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
|
||||
github.com/go-ldap/ldap/v3 v3.4.5 h1:ekEKmaDrpvR2yf5Nc/DClsGG9lAmdDixe44mLzlW5r8=
|
||||
github.com/go-ldap/ldap/v3 v3.4.5/go.mod h1:bMGIq3AGbytbaMwf8wdv5Phdxz0FWHTIYMSzyrYgnQs=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
@@ -59,7 +60,6 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
|
||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||
@@ -81,12 +81,12 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20230406165453-00490a63f317 h1:hFhpt7CTmR3DX+b4R19ydQFtofxT0Sv3QsKNMVQYTMQ=
|
||||
github.com/google/pprof v0.0.0-20230406165453-00490a63f317/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
|
||||
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs=
|
||||
github.com/google/pprof v0.0.0-20230602150820-91b7bce49751/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
|
||||
github.com/greatroar/blobloom v0.7.2 h1:F30MGLHOcb4zr0pwCPTcKdlTM70rEgkf+LzdUPc5ss8=
|
||||
github.com/greatroar/blobloom v0.7.2/go.mod h1:mjMJ1hh1wjGVfr93QIHJ6FfDNVrA0IELv8OvMHJxHKs=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.3 h1:kmRrRLlInXvng0SmLxmQpQkpbYAvcXm7NPDrgxJa9mE=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.3/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
@@ -100,11 +100,10 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU
|
||||
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
|
||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
|
||||
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
|
||||
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
|
||||
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg=
|
||||
github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
|
||||
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
|
||||
github.com/maruel/panicparse/v2 v2.3.1 h1:NtJavmbMn0DyzmmSStE8yUsmPZrZmudPH7kplxBinOA=
|
||||
github.com/maruel/panicparse/v2 v2.3.1/go.mod h1:s3UmQB9Fm/n7n/prcD2xBGDkwXD6y2LeZnhbEXvs9Dg=
|
||||
@@ -115,8 +114,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfr
|
||||
github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0 h1:rBhB9Rls+yb8kA4x5a/cWxOufWfXt24E+kq4YlbGj3g=
|
||||
github.com/maxbrunsfeld/counterfeiter/v6 v6.5.0/go.mod h1:fJ0UAZc1fx3xZhU4eSHQDJ1ApFmTVhp5VTpV9tm2ogg=
|
||||
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||
github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g=
|
||||
github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM=
|
||||
github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
|
||||
github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
|
||||
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75 h1:cUVxyR+UfmdEAZGJ8IiKld1O0dbGotEnkMolG5hfMSY=
|
||||
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75/go.mod h1:pBbZyGwC5i16IBkjVKoy/sznA8jPD/K9iedwe1ESE6w=
|
||||
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
|
||||
@@ -128,20 +127,20 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/ginkgo/v2 v2.9.2 h1:BA2GMJOtfGAfagzYtrAlufIP0lq6QERkFmHLMLPwFSU=
|
||||
github.com/onsi/ginkgo/v2 v2.9.2/go.mod h1:WHcJJG2dIlcCqVfBAwUCrJxSPFb6v4azBwgxeMeDuts=
|
||||
github.com/onsi/ginkgo/v2 v2.10.0 h1:sfUl4qgLdvkChZrWCYndY2EAu9BRIw1YphNAzy1VNWs=
|
||||
github.com/onsi/ginkgo/v2 v2.10.0/go.mod h1:UDQOh5wbQUlMnkLfVaIUMtQ1Vus92oM+P2JX1aulgcE=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
|
||||
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
||||
github.com/onsi/gomega v1.27.7 h1:fVih9JD6ogIiHUN6ePK7HJidyEDpWGVB5mzM7cWNXoU=
|
||||
github.com/oschwald/geoip2-golang v1.8.0 h1:KfjYB8ojCEn/QLqsDU0AzrJ3R5Qa9vFlx3z6SLNcKTs=
|
||||
github.com/oschwald/geoip2-golang v1.8.0/go.mod h1:R7bRvYjOeaoenAp9sKRS8GX5bJWcZ0laWO5+DauEktw=
|
||||
github.com/oschwald/maxminddb-golang v1.10.0 h1:Xp1u0ZhqkSuopaKmk1WwHtjF0H9Hd9181uj2MQ5Vndg=
|
||||
github.com/oschwald/maxminddb-golang v1.10.0/go.mod h1:Y2ELenReaLAZ0b400URyGwvYxHV1dLIxBuyOsyYjHK0=
|
||||
github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o=
|
||||
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08 h1:hDSdbBuw3Lefr6R18ax0tZ2BJeNB3NehB3trOwYBsdU=
|
||||
github.com/petermattis/goid v0.0.0-20230317030725-371a4b8eda08/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
|
||||
github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761 h1:W04oB3d0J01W5jgYRGKsV8LCM6g9EkCvPkZcmFuy0OE=
|
||||
github.com/petermattis/goid v0.0.0-20230518223814-80aa455d8761/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4=
|
||||
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
|
||||
github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
@@ -152,14 +151,14 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig=
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw=
|
||||
github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y=
|
||||
github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
|
||||
github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
|
||||
github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
|
||||
github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
|
||||
github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI=
|
||||
github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY=
|
||||
github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI=
|
||||
github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
|
||||
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
|
||||
github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
|
||||
github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
|
||||
@@ -173,10 +172,10 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
|
||||
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
|
||||
github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM=
|
||||
github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3 h1:Syt5vVZXUDXPEXpIBt5ziWsJ4LdSAAxF4l/xZeQgSEE=
|
||||
github.com/shirou/gopsutil/v3 v3.23.3/go.mod h1:lSBNN6t3+D6W5e5nXTxc8KIMMVxAcS+6IJlffjRRlMU=
|
||||
github.com/shoenig/go-m1cpu v0.1.4/go.mod h1:Wwvst4LR89UxjeFtLRMrpgRiyY4xPsejnVZym39dbAQ=
|
||||
github.com/shoenig/test v0.6.3/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/shirou/gopsutil/v3 v3.23.5 h1:5SgDCeQ0KW0S4N0znjeM/eFHXXOKyv2dVNgRq/c9P6Y=
|
||||
github.com/shirou/gopsutil/v3 v3.23.5/go.mod h1:Ng3Maa27Q2KARVJ0SPZF5NdrQSC3XHKP8IIWrHgMeLY=
|
||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||
@@ -185,9 +184,9 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
|
||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
|
||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||
github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/syncthing/notify v0.0.0-20210616190510-c6b7342338d2 h1:F4snRP//nIuTTW9LYEzVH4HVwDG9T3M4t8y/2nqMbiY=
|
||||
github.com/syncthing/notify v0.0.0-20210616190510-c6b7342338d2/go.mod h1:J0q59IWjLtpRIJulohwqEZvjzwOfTEPp8SVhDJl+y0Y=
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
|
||||
@@ -197,26 +196,30 @@ github.com/thejerf/suture/v4 v4.0.2/go.mod h1:g0e8vwskm9tI0jRjxrnA6lSr0q6OfPdWJV
|
||||
github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI=
|
||||
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
|
||||
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
|
||||
github.com/urfave/cli v1.22.12 h1:igJgVw1JdKH+trcLWLeLwZjU9fEfPesQ+9/e4MQ44S8=
|
||||
github.com/urfave/cli v1.22.12/go.mod h1:sSBEIC79qR6OvcmsD4U3KABeOTxDqQtdDnaFuUN30b8=
|
||||
github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk=
|
||||
github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA=
|
||||
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0 h1:okhMind4q9H1OxF44gNegWkiP4H/gsTFLalHFa4OOUI=
|
||||
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0/go.mod h1:TTbGUfE+cXXceWtbTHq6lqcTvYPBKLNejBEbnUsQJtU=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg=
|
||||
github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
||||
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ=
|
||||
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE=
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug=
|
||||
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
|
||||
golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
|
||||
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=
|
||||
golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk=
|
||||
golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
@@ -225,20 +228,25 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
|
||||
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
|
||||
golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -263,19 +271,25 @@ golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
|
||||
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
|
||||
golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
|
||||
golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
@@ -284,8 +298,10 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y=
|
||||
golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM=
|
||||
golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
@@ -549,6 +549,18 @@ ul.three-columns li, ul.two-columns li {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.checkbox[disabled] {
|
||||
background-color: #eeeeee;
|
||||
opacity: 1;
|
||||
margin-left: -5px;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.checkbox[disabled] *, .checkbox[disabled] .help-block {
|
||||
color: #999999;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
/* Make a "well" look more like a readonly text input when grouped with a button */
|
||||
.input-group .well-sm {
|
||||
padding-top: 6px;
|
||||
|
||||
@@ -473,7 +473,7 @@
|
||||
"Use HTTPS for GUI": "Графичният интерфейс работи под HTTPS",
|
||||
"Use notifications from the filesystem to detect changed items.": "Използва съобщения от файловата система, за да открива променени елементи.",
|
||||
"User Home": "Папка на потребителя",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Няма зададени потребителско име и парола за достъп до графичния интерфейс. Помислете за създаването им.",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Потребителският интерфейс не е защитен с потребителско име и парола. Настройте защита.",
|
||||
"Using a QUIC connection over LAN": "Използване на връзка чрез QUIC в LAN",
|
||||
"Using a QUIC connection over WAN": "Използване на връзка чрез QUIC в WAN",
|
||||
"Using a direct TCP connection over LAN": "Използване на директна свързаност с TCP през местна мрежа",
|
||||
|
||||
@@ -474,6 +474,8 @@
|
||||
"Use notifications from the filesystem to detect changed items.": "Benyt notifikationer fra filsystemet til at finde filændringer.",
|
||||
"User Home": "Brugerhjem",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Brugernavn/adgangskode er ikke indstillet til GUI-godkendelse. Overvej at konfigurere det.",
|
||||
"Using a QUIC connection over LAN": "Brug af en QUIC-forbindelse over LAN",
|
||||
"Using a QUIC connection over WAN": "Brug af en QUIC-forbindelse over WAN",
|
||||
"Using a direct TCP connection over LAN": "Brug af en direkte TCP-forbindelse via LAN",
|
||||
"Using a direct TCP connection over WAN": "Brug af en direkte TCP-forbindelse over WAN",
|
||||
"Version": "Version",
|
||||
|
||||
@@ -133,10 +133,10 @@
|
||||
"Enable NAT traversal": "Activer la translation d'adresses (NAT)",
|
||||
"Enable Relaying": "Relayage possible",
|
||||
"Enabled": "Activée",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Active la synchronisation des attributs étendus. Cette option peut nécessiter d'exécuter Syncthing avec l'élévation de privilèges.",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Active l'envoi des attributs étendus mais ignore leur réception. Cette option peut provoquer une dégradation importante des performances. L'envoi est toujours activé quand on choisi l'option \"Synchroniser les attributs étendus\".",
|
||||
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Active la synchronisation de l'attribut \"Propriétaire\". Cette option nécessite habituellement d'exécuter Syncthing avec des privilèges élevés.",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Active l'envoi de l'attribut \"Propriétaire\" mais ignore sa réception. Cette option peut provoquer une dégradation importante des performances. L'envoi est toujours activé quand on choisi l'option \"Synchroniser le propriétaire\".",
|
||||
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Active la synchronisation des attributs étendus. Cette option peut nécessiter d'exécuter Syncthing avec élévation de privilèges.",
|
||||
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Active l'envoi des attributs étendus mais ignore leur réception. Cette option peut provoquer une dégradation notable des performances. L'envoi est toujours activé si on choisit l'option \"Synchroniser les attributs étendus\".",
|
||||
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Active la synchronisation de l'attribut \"Propriétaire\". Cette option nécessite habituellement d'exécuter Syncthing avec élévation de privilèges.",
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Active l'envoi de l'attribut \"Propriétaire\" mais ignore sa réception. Cette option peut provoquer une dégradation notable des performances. L'envoi est toujours activé si on choisit l'option \"Synchroniser le propriétaire\".",
|
||||
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Nombre positif (p.ex, \"2.35\") et unité. Pourcentage de l'espace disque total.",
|
||||
"Enter a non-privileged port number (1024 - 65535).": "Entrez un numéro de port non-privilégié (1024 - 65535).",
|
||||
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Entrer les adresses (\"tcp://ip:port\" ou \"tcp://hôte:port\") séparées par une virgule, ou \"dynamic\" afin d'activer la recherche automatique de l'adresse.",
|
||||
@@ -186,7 +186,7 @@
|
||||
"Global Discovery Servers": "Serveurs de découverte globale",
|
||||
"Global State": "État global",
|
||||
"Help": "Aide (en anglais)",
|
||||
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Astuce : quand la règle par défaut est le rejet, seules les règles de rejet sont prises en compte. Envisagez d'ajouter \"Accepter tout\" comme dernière règle.",
|
||||
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Remarque : quand la règle par défaut est le rejet, seules les règles de rejet sont prises en compte. Envisagez d'ajouter * (Accepter tout) comme dernière règle.",
|
||||
"Home page": "Page d'accueil",
|
||||
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Cependant, vos réglages indiquent que vous pourriez souhaiter ne pas l'activer. Nous avons désactivé pour vous l'envoi automatique des rapports.",
|
||||
"Identification": "Identifiant abrégé",
|
||||
@@ -253,7 +253,7 @@
|
||||
"No": "Non",
|
||||
"No File Versioning": "Sans",
|
||||
"No files will be deleted as a result of this operation.": "Aucun fichier ne sera supprimé à la suite de cette opération.",
|
||||
"No rules set": "Aucune règle définie",
|
||||
"No rules set": "Aucune règle définie (accepter tout)",
|
||||
"No upgrades": "Pas de mises à jour",
|
||||
"Not shared": "Non partagé",
|
||||
"Notice": "Notification",
|
||||
|
||||
@@ -1,4 +1,23 @@
|
||||
{
|
||||
"API Key": "API ključ",
|
||||
"About": "Informacije",
|
||||
"Action": "Radnja",
|
||||
"Actions": "Radnje",
|
||||
"Active filter rules": "Aktivna pravila filtera",
|
||||
"Add": "Dodaj",
|
||||
"Add Device": "Dodaj uređaj",
|
||||
"Add Folder": "Dodaj mapu",
|
||||
"Add Remote Device": "Dodaj udaljeni uređaj",
|
||||
"Add new folder?": "Dodati novu mapu?",
|
||||
"Address": "Adresa",
|
||||
"Addresses": "Adrese",
|
||||
"Advanced": "Napredno",
|
||||
"Advanced Configuration": "Napredna konfiguracija",
|
||||
"All Data": "Svi podaci",
|
||||
"All Time": "Svo vrijeme",
|
||||
"Allowed Networks": "Dozvoljene mreže",
|
||||
"Alphabetic": "Abecednim redom",
|
||||
"Apply": "Primijeni",
|
||||
"LDAP": "LDAP",
|
||||
"Twitter": "Twitter"
|
||||
}
|
||||
|
||||
@@ -6,11 +6,13 @@
|
||||
"About": "Tentang",
|
||||
"Action": "Aksi",
|
||||
"Actions": "Aksi",
|
||||
"Active filter rules": "Aturan filter aktif",
|
||||
"Add": "Tambah",
|
||||
"Add Device": "Tambah Perangkat",
|
||||
"Add Folder": "Tambah Folder",
|
||||
"Add Remote Device": "Tambah Perangkat Jarak Jauh",
|
||||
"Add devices from the introducer to our device list, for mutually shared folders.": "Tambahkan perangkat dari pengenal ke daftar perangkat kita, untuk folder yang saling terbagi.",
|
||||
"Add filter entry": "Tambahkan entri filter",
|
||||
"Add ignore patterns": "Tambahkan pola pengabaian",
|
||||
"Add new folder?": "Tambah folder baru?",
|
||||
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Selain itu, interval pindai ulang secara penuh akan ditambah (kali 60, yaitu bawaan baru selama 1 jam). Anda juga dapat mengkonfigurasi secara manual untuk setiap folder setelah memilih Tidak.",
|
||||
@@ -45,6 +47,7 @@
|
||||
"Automatically create or share folders that this device advertises at the default path.": "Otomatis membuat atau membagi folder yang perangkat ini iklankan di lokasi bawaan.",
|
||||
"Available debug logging facilities:": "Fasilitas log debug yang ada:",
|
||||
"Be careful!": "Harap hati-hati!",
|
||||
"Body:": "Badan:",
|
||||
"Cancel": "Batal",
|
||||
"Changelog": "Log Perubahan",
|
||||
"Clean out after": "Bersihkan setelah",
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
{
|
||||
"A device with that ID is already added.": "මෙම හැඳු. ලබා ගැනීමට දැනටමත් එකතු කර ඇත.",
|
||||
"A negative number of days doesn't make sense.": "සෘණ දින ගණන තේරුමක් නැත.",
|
||||
"A new major version may not be compatible with previous versions.": "නව ප්රධාන අනුවාදයක් පෙර අනුවාද සමඟ නොගැළපේ.",
|
||||
"A device with that ID is already added.": "මෙම හැඳු. සහිත උපාංගයක් ඇත.",
|
||||
"A negative number of days doesn't make sense.": "සෘණාත්මක දින ගණනක් ඵලක් නැත.",
|
||||
"A new major version may not be compatible with previous versions.": "නව ප්රධාන අනුවාදයක් කලින් අනුවාද සමඟ බොහෝ විට නොගැළපේ.",
|
||||
"API Key": "යෙ.ක්ර.මු. යතුර",
|
||||
"About": "පිළිබඳව",
|
||||
"Action": "ක්රියාව",
|
||||
"Actions": "ක්රියාව",
|
||||
"Action": "ක්රියාමාර්ගය",
|
||||
"Actions": "ක්රියාමාර්ග",
|
||||
"Active filter rules": "සක්රිය පෙරීමේ නීති",
|
||||
"Add": "එකතු",
|
||||
"Add Device": "එකතුවක් එකතු කරන්න",
|
||||
"Add Folder": "බහාලුමක් එකතු කරන්න",
|
||||
"Add Remote Device": "දුරස්ථ එකක් එකතු කරන්න",
|
||||
"Add Device": "උපාංගයක් යොදන්න",
|
||||
"Add Folder": "බහාලුමක් යොදන්න",
|
||||
"Add Remote Device": "දුරස්ථ උපාංගයක් යොදන්න",
|
||||
"Add devices from the introducer to our device list, for mutually shared folders.": "අන්යෝන්ය වශයෙන් බෙදා ගත් ෆෝල්ඩර සඳහා, අපගේ උපාංග ලැයිස්තුවට හඳුන්වා දෙන්නා වෙතින් උපාංග එක් කරන්න.",
|
||||
"Add ignore patterns": "නොසලකා හැරීමේ රටා එක් කරන්න",
|
||||
"Add new folder?": "නව බහාලුමක් එකතු කරනවාද?",
|
||||
"Add new folder?": "නව බහාලුම යොදනවාද?",
|
||||
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "අතිරේකව සම්පූර්ණ නැවත පරිලෝකනය කිරීමේ පරතරය වැඩි වනු ඇත (වාර 60, එනම් 1h හි නව පෙරනිමිය). අංක තේරීමෙන් පසුව ඔබට සෑම ෆෝල්ඩරයක් සඳහාම එය අතින් වින්යාසගත කළ හැක.",
|
||||
"Address": "ලිපිනය",
|
||||
"Addresses": "ලිපින",
|
||||
"Advanced": "තව දුරටත්",
|
||||
"Advanced": "වැඩිදුර",
|
||||
"Advanced Configuration": "වැඩිදුර වින්යාසය",
|
||||
"All Data": "සියළුම දත්ත",
|
||||
"All Time": "හැම වෙලාවෙම",
|
||||
"All Time": "සැමවිට",
|
||||
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "මෙම උපාංගය සමඟ බෙදාගත් සියලුම ෆෝල්ඩර මුරපදයකින් ආරක්ෂා කළ යුතු අතර, ලබා දී ඇති මුරපදය නොමැතිව යවන ලද සියලුම දත්ත කියවිය නොහැක.",
|
||||
"Allow Anonymous Usage Reporting?": "නිර්නාමිකව භාවිතය වාර්තා කිරීමට ඉඩ දෙනවාද?",
|
||||
"Allow Anonymous Usage Reporting?": "භාවිතය නිර්නාමිකව වාර්තා කිරීමට ඉඩ දෙනවාද?",
|
||||
"Allowed Networks": "ඉඩදුන් ජාල",
|
||||
"Alphabetic": "අකාරාදී",
|
||||
"Altered by ignoring deletes.": "මකාදැමීම් නොසලකා හැරීමෙන් වෙනස් කර ඇත.",
|
||||
@@ -29,24 +30,24 @@
|
||||
"Anonymous Usage Reporting": "නිර්නාමිකව භාවිතය වාර්තා කිරීම",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "නිර්නාමික භාවිත වාර්තා ආකෘතිය වෙනස් වී ඇත. ඔබ නව ආකෘතියට යාමට කැමතිද?",
|
||||
"Apply": "යොදන්න",
|
||||
"Are you sure you want to override all remote changes?": "ඔබට සියලු දුරස්ථ වෙනස්කම් අභිබවා යාමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to permanently delete all these files?": "ඔබට මෙම සියලුම ගොනු ස්ථිරවම මැකීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to remove device {%name%}?": "ඔබට උපාංගය {{name}}ඉවත් කිරීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to override all remote changes?": "ඔබට සියළුම දුරස්ථ වෙනස්කම් අභිබවා යාමට වුවමනාද?",
|
||||
"Are you sure you want to permanently delete all these files?": "ඔබට මෙම සියළුම ගොනු සදහටම මැකීමට වුවමනාද?",
|
||||
"Are you sure you want to remove device {%name%}?": "ඔබට {{name}} උපාංගය ඉවත් කිරීමට වුවමනාද?",
|
||||
"Are you sure you want to remove folder {%label%}?": "ඔබට ෆෝල්ඩරය {{label}}ඉවත් කිරීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to restore {%count%} files?": "ඔබට ගොනු {{count}} ක් ප්රතිසාධනය කිරීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to restore {%count%} files?": "ඔබට ගොනු {{count}} ක් ප්රත්යර්පණය කිරීමට වුවමනාද?",
|
||||
"Are you sure you want to revert all local changes?": "ඔබට සියලු දේශීය වෙනස්කම් ප්රතිවර්තනය කිරීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to upgrade?": "ඔබට උත්ශ්රේණි කිරීමට අවශ්ය බව විශ්වාසද?",
|
||||
"Are you sure you want to upgrade?": "ඔබට උත්ශ්රේණි කිරීමට වුවමනාද?",
|
||||
"Auto Accept": "ස්වයං පිළිගැනීම",
|
||||
"Automatic Crash Reporting": "ස්වයංක්රීය බිඳවැටීම් වාර්තා කිරීම",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "ස්වයංක්රීය උත්ශ්රේණිගත කිරීම දැන් ස්ථායී නිකුතු සහ නිදහස් අපේක්ෂකයින් අතර තේරීම ඉදිරිපත් කරයි.",
|
||||
"Automatic upgrades": "ස්වයංක්රීය වැඩිදියුණු කිරීම්",
|
||||
"Automatic upgrades": "ස්වයංක්රීය උත්ශ්රේණි",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "අපේක්ෂක නිකුතු සඳහා ස්වයංක්රීය උත්ශ්රේණි කිරීම් සැමවිටම සක්රීය වේ.",
|
||||
"Automatically create or share folders that this device advertises at the default path.": "මෙම උපාංගය පෙරනිමි මාර්ගයේ ප්රචාරණය කරන ෆෝල්ඩර ස්වයංක්රීයව සාදන්න හෝ බෙදාගන්න.",
|
||||
"Available debug logging facilities:": "පවතින දෝශ නිරාකරණය කිරීමේ පහසුකම්:",
|
||||
"Be careful!": "පරෙස්සම් වෙන්න!",
|
||||
"Bugs": "දෝෂ",
|
||||
"Cancel": "සිදු කරන්න",
|
||||
"Changelog": "චේන්ජ්ලොග්",
|
||||
"Cancel": "අවලංගු",
|
||||
"Changelog": "වෙනස්කම්",
|
||||
"Clean out after": "පසු පිරිසිදු කරන්න",
|
||||
"Cleaning Versions": "පිරිසිදු කිරීමේ අනුවාද",
|
||||
"Cleanup Interval": "පිරිසිදු කිරීමේ පරතරය",
|
||||
@@ -66,25 +67,25 @@
|
||||
"Currently Shared With Devices": "දැනට උපාංග සමඟ බෙදාගෙන ඇත",
|
||||
"Custom Range": "අභිරුචි පරාසය",
|
||||
"Danger!": "අනතුර!",
|
||||
"Debugging Facilities": "නිදොස් කිරීමේ පහසුකම්",
|
||||
"Debugging Facilities": "නිදොස්කරණ පහසුකම්",
|
||||
"Default Configuration": "පෙරනිමි වින්යාසය",
|
||||
"Default Device": "පෙරනිමි විශේෂ",
|
||||
"Default Device": "පෙරනිමි උපාංගය",
|
||||
"Default Folder": "පෙරනිමි බහාලුම",
|
||||
"Default Ignore Patterns": "පෙරනිමි නොසලකා හැරීම් රටා",
|
||||
"Defaults": "පෙරනිමි",
|
||||
"Delete": "මකන්න",
|
||||
"Delete Unexpected Items": "අනපේක්ෂිත අයිතම මකන්න",
|
||||
"Delete Unexpected Items": "අනපේක්ෂිත අථක මකන්න",
|
||||
"Deleted {%file%}": "මකා දැමූ {{file}}",
|
||||
"Deselect All": "සියල්ල තේරීම ඉවත් කරන්න",
|
||||
"Deselect All": "සියල්ල නොතෝරන්න",
|
||||
"Deselect devices to stop sharing this folder with.": "මෙම ෆෝල්ඩරය බෙදා ගැනීම නැවැත්වීමට උපාංග තේරීම ඉවත් කරන්න.",
|
||||
"Deselect folders to stop sharing with this device.": "මෙම උපාංගය සමඟ බෙදා ගැනීම නැවැත්වීමට ෆෝල්ඩර තේරීම ඉවත් කරන්න.",
|
||||
"Device": "වැනි",
|
||||
"Device": "උපාංගය",
|
||||
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "උපාංගය \"{{name}}\" ({{device}} ට {{address}}) සම්බන්ධ වීමට අවශ්යයි. නව උපාංගයක් එක් කරන්නද?",
|
||||
"Device ID": "කැමතිේ හැඳුනුම",
|
||||
"Device Identification": "කැමතිේ හැඳුනුම",
|
||||
"Device Name": "ඇතුලත්වේ නම",
|
||||
"Device ID": "උපාංගයේ හැඳු.",
|
||||
"Device Identification": "උපාංගයේ හැඳුනුම",
|
||||
"Device Name": "උපාංගයේ නම",
|
||||
"Device is untrusted, enter encryption password": "ඔබ අවසරයි, සංකේත මුරපදය ඇතුලත් කරන්න",
|
||||
"Device rate limits": "කැමතිේ අනුපාත සීමා",
|
||||
"Device rate limits": "උපාංගයේ අනුපාත සීමා",
|
||||
"Device that last modified the item": "අයිතමය අවසන් වරට වෙනස් කළ උපාංගය",
|
||||
"Devices": "උපාංග",
|
||||
"Disable Crash Reporting": "බිඳ වැටීම් වාර්තා කිරීම අබල කරන්න",
|
||||
@@ -100,7 +101,7 @@
|
||||
"Discovery": "සොයාගැනීම",
|
||||
"Discovery Failures": "සොයාගැනීමේ අසාර්ථකත්වය",
|
||||
"Discovery Status": "සොයාගැනීමේ තත්ත්වය",
|
||||
"Dismiss": "අස් කරන්න",
|
||||
"Dismiss": "අහකට",
|
||||
"Do not add it to the ignore list, so this notification may recur.": "එය නොසලකා හැරීමේ ලැයිස්තුවට එක් නොකරන්න, එබැවින් මෙම දැනුම්දීම නැවත සිදු විය හැක.",
|
||||
"Do not restore": "ප්රත්යර්පණය නොකරන්න",
|
||||
"Do not restore all": "සියල්ල ප්රත්යර්පණය නොකරන්න",
|
||||
@@ -108,9 +109,9 @@
|
||||
"Documentation": "ප්රලේඛනය",
|
||||
"Download Rate": "බාගත කිරීමේ අනුපාතය",
|
||||
"Downloaded": "බාගත වී ඇත",
|
||||
"Downloading": "බාගතකිරීමේ",
|
||||
"Downloading": "බාගැනෙමින්",
|
||||
"Edit": "සංස්කරණය",
|
||||
"Edit Device": "දක්වා සංස්කරණය",
|
||||
"Edit Device": "උපාංගය සංස්කරණය",
|
||||
"Edit Device Defaults": "උපාංග පෙරනිමි සංස්කරණය කරන්න",
|
||||
"Edit Folder": "බහාලුම සංස්කරණය",
|
||||
"Edit Folder Defaults": "ෆෝල්ඩර පෙරනිමි සංස්කරණය කරන්න",
|
||||
@@ -124,7 +125,7 @@
|
||||
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "ලිපිනය ස්වයංක්රීයව සොයා ගැනීම සඳහා කොමාවෙන් වෙන් කළ (\"tcp://ip:port\", \"tcp://host:port\") ලිපින හෝ \"ගතික\" ඇතුළත් කරන්න.",
|
||||
"Enter ignore patterns, one per line.": "එක් පේළියකට එකක් නොසලකා හැරීමේ රටා ඇතුළු කරන්න.",
|
||||
"Enter up to three octal digits.": "අෂ්ටක ඉලක්කම් තුනක් දක්වා ඇතුළු කරන්න.",
|
||||
"Error": "දෝෂය",
|
||||
"Error": "දෝෂයකි",
|
||||
"External": "බාහිර",
|
||||
"External File Versioning": "බාහිර ගොනු අනුවාදය",
|
||||
"Failed Items": "අසාර්ථක අයිතම",
|
||||
@@ -139,13 +140,13 @@
|
||||
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "වෙනත් උපාංගවල සිදු කරන ලද වෙනස්කම් වලින් ගොනු ආරක්ෂා කර ඇත, නමුත් මෙම උපාංගයේ සිදු කරන ලද වෙනස්කම් ඉතිරි පොකුරු වෙත යවනු ලැබේ.",
|
||||
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "ගොනු පොකුරෙන් සමමුහුර්ත කර ඇත, නමුත් දේශීයව කරන ලද ඕනෑම වෙනස් කිරීමක් වෙනත් උපාංග වෙත නොයවනු ලැබේ.",
|
||||
"Filesystem Watcher Errors": "ගොනු පද්ධති නිරීක්ෂක දෝෂ",
|
||||
"Filter by date": "දිනයට අනුව පෙරීම",
|
||||
"Filter by date": "දිනය අනුව පෙරීම",
|
||||
"Filter by name": "නමට අනුව පෙරීම",
|
||||
"Folder": "බහාලුම",
|
||||
"Folder ID": "බහලුමේ නම",
|
||||
"Folder Label": "ෆෝල්ඩර ලේබලය",
|
||||
"Folder Path": "බහලුමේ මාර්ගය",
|
||||
"Folder Type": "බහලුමේ වර්ගය",
|
||||
"Folder ID": "බහාලුමේ හැඳු.",
|
||||
"Folder Label": "බහාලුමේ නම්පත",
|
||||
"Folder Path": "බහාලුමේ මාර්ගය",
|
||||
"Folder Type": "බහාලුමේ වර්ගය",
|
||||
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "ෆෝල්ඩර වර්ගය \"{{receiveEncrypted}}\" සැකසිය හැක්කේ නව ෆෝල්ඩරයක් එක් කරන විට පමණි.",
|
||||
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "ෆෝල්ඩරය එකතු කිරීමෙන් පසු \"{{receiveEncrypted}}\" ෆෝල්ඩර වර්ගය වෙනස් කළ නොහැක. ඔබට ෆෝල්ඩරය ඉවත් කිරීම, තැටියේ ඇති දත්ත මකා දැමීම හෝ විකේතනය කිරීම සහ ෆෝල්ඩරය නැවත එක් කිරීම අවශ්ය වේ.",
|
||||
"Folders": "බහාලුම්",
|
||||
@@ -153,19 +154,19 @@
|
||||
"Full Rescan Interval (s)": "සම්පූර්ණ නැවත ස්කෑන් පරතරය (ය)",
|
||||
"GUI": "GUI",
|
||||
"GUI Authentication Password": "GUI සත්යාපන මුරපදය",
|
||||
"GUI Authentication User": "GUI සත්යාපන පරිශීලක",
|
||||
"GUI Authentication: Set User and Password": "GUI සත්යාපනය: පරිශීලක සහ මුරපදය සකසන්න",
|
||||
"GUI Authentication User": "GUI සත්යාපන පරිශ්රීලක",
|
||||
"GUI Authentication: Set User and Password": "GUI සත්යාපනය: පරිශ්රීලක හා මුරපදය සකසන්න",
|
||||
"GUI Listen Address": "GUI සවන්දීමේ ලිපිනය",
|
||||
"GUI Theme": "GUI තේමාව",
|
||||
"General": "ජනරාල්",
|
||||
"General": "සාමාන්ය",
|
||||
"Generate": "උත්පාදනය",
|
||||
"Global Discovery": "ගෝලීය සොයාගැනීම",
|
||||
"Global Discovery Servers": "ගෝලීය සොයාගැනීම් සේවාදායකයන්",
|
||||
"Global State": "ගෝලීය රාජ්යය",
|
||||
"Global Discovery Servers": "ගෝලීය සොයාගැනීමේ සේවාදායක",
|
||||
"Global State": "ගෝලීය තත්වය",
|
||||
"Help": "උපකාර",
|
||||
"Home page": "මුල් පිටුව",
|
||||
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "කෙසේ වෙතත්, ඔබගේ වත්මන් සැකසුම් පෙන්නුම් කරන්නේ ඔබට එය සක්රිය කිරීමට අවශ්ය නොවිය හැකි බවයි. අපි ඔබ වෙනුවෙන් ස්වයංක්රීය බිඳ වැටීම් වාර්තා කිරීම අබල කර ඇත.",
|
||||
"Identification": "හඳුනා ගැනීම",
|
||||
"Identification": "හැඳුනුම",
|
||||
"If untrusted, enter encryption password": "විශ්වාස කළ නොහැකි නම්, සංකේතාංකන මුරපදය ඇතුළත් කරන්න",
|
||||
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "ඔබට මෙම පරිගණකයේ අනෙකුත් පරිශීලකයින් සමමුහුර්තකරණයට සහ ඒ හරහා ඔබගේ ගොනු වලට ප්රවේශ වීම වැලැක්වීමට අවශ්ය නම්, සත්යාපනය සැකසීම සලකා බලන්න.",
|
||||
"Ignore": "නොසලකන්න",
|
||||
@@ -180,13 +181,13 @@
|
||||
"Introduced By": "විසින් හඳුන්වා දෙන ලදී",
|
||||
"Introducer": "හඳුන්වා දෙන්නා",
|
||||
"Inversion of the given condition (i.e. do not exclude)": "ලබා දී ඇති කොන්දේසියේ ප්රතිලෝම (එනම් බැහැර නොකරන්න)",
|
||||
"Keep Versions": "අනුවාද තබා ගන්න",
|
||||
"Keep Versions": "අනුවාද තබාගන්න",
|
||||
"LDAP": "LDAP",
|
||||
"Largest First": "විශාලතම පළමු",
|
||||
"Last 30 Days": "පසුගිය දින 30",
|
||||
"Last 7 Days": "පසුගිය දින 7",
|
||||
"Largest First": "පළමුව විශාලතම",
|
||||
"Last 30 Days": "පසුගිය දවස් 30",
|
||||
"Last 7 Days": "පසුගිය දවස් 7",
|
||||
"Last Month": "පසුගිය මාසය",
|
||||
"Last Scan": "අවසාන සුපිරි ක්ෂය",
|
||||
"Last Scan": "අවසාන සුපිරික්සීම",
|
||||
"Last seen": "අවසන දුටුවේ",
|
||||
"Latest Change": "නවතම වෙනස",
|
||||
"Learn more": "තව දැනගන්න",
|
||||
@@ -194,52 +195,52 @@
|
||||
"Listener Failures": "සවන්දෙන්නන්ගේ අසාර්ථකත්වය",
|
||||
"Listener Status": "සවන්දෙන්නන්ගේ තත්ත්වය",
|
||||
"Listeners": "අසන්නන්",
|
||||
"Loading data...": "දත්ත පූරණය කරමින්...",
|
||||
"Loading...": "පූරණය ස්ථානයේ...",
|
||||
"Loading data...": "දත්ත පූරණය වෙමින්...",
|
||||
"Loading...": "පූරණය වෙමින්...",
|
||||
"Local Additions": "දේශීය එකතු කිරීම්",
|
||||
"Local Discovery": "දේශීය සොයාගැනීම",
|
||||
"Local State": "ප්රාදේශීය රාජ්යය",
|
||||
"Local State (Total)": "ප්රාදේශීය රාජ්යය (මුළු)",
|
||||
"Local Discovery": "ස්ථානීය සොයාගැනීම",
|
||||
"Local State": "ස්ථානීය තත්වය",
|
||||
"Local State (Total)": "ස්ථානීය තත්වය (මුළු)",
|
||||
"Locally Changed Items": "දේශීයව වෙනස් කරන ලද අයිතම",
|
||||
"Log": "ලඝු",
|
||||
"Log": "සටහන",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "ලොග් වලිගය විරාම කරන ලදී. ඉදිරියට යාමට පහළට අනුචලනය කරන්න.",
|
||||
"Logs": "සටහන්",
|
||||
"Major Upgrade": "ප්රධාන උත්ශ්රේණි කිරීම",
|
||||
"Mass actions": "මහා ක්රියා",
|
||||
"Maximum Age": "උපරිම වයස",
|
||||
"Metadata Only": "පාරදත්ත පමණි",
|
||||
"Minimum Free Disk Space": "අවම නිදහස් තැටි ඉඩ",
|
||||
"Minimum Free Disk Space": "අවම තැටියේ ඉඩ",
|
||||
"Mod. Device": "mod. උපාංගය",
|
||||
"Mod. Time": "mod. කාලය",
|
||||
"Move to top of queue": "පෝලිමේ ඉහළට යන්න",
|
||||
"Move to top of queue": "පෝලිමේ මුලට ගෙනයන්න",
|
||||
"Multi level wildcard (matches multiple directory levels)": "බහු මට්ටමේ වයිල්ඩ්කාඩ් (බහු ඩිරෙක්ටරි මට්ටම් වලට ගැලපේ)",
|
||||
"Never": "කවදාවත්",
|
||||
"New Device": "නව එකක්",
|
||||
"New Device": "නව උපාංගය",
|
||||
"New Folder": "නව බහාලුම",
|
||||
"Newest First": "අලුත්ම මුලින්ම",
|
||||
"No": "නැහැ",
|
||||
"No File Versioning": "ගොනු අනුවාදනයක් නැත",
|
||||
"No files will be deleted as a result of this operation.": "මෙම මෙහෙයුමේ ප්රතිඵලයක් ලෙස කිසිදු ගොනුවක් මකා නොදමනු ඇත.",
|
||||
"No upgrades": "වැඩිදියුණු කිරීම් නොමැත",
|
||||
"No upgrades": "උත්ශ්රේණි නැත",
|
||||
"Not shared": "බෙදාගෙන නැත",
|
||||
"Notice": "දැන්වීම",
|
||||
"OK": "හරි",
|
||||
"Off": "අක්රියයි",
|
||||
"Off": "අක්රියයි",
|
||||
"Oldest First": "පැරණිතම පළමු",
|
||||
"Optional descriptive label for the folder. Can be different on each device.": "ෆෝල්ඩරය සඳහා විකල්ප විස්තර ලේබලය. එක් එක් උපාංගය මත වෙනස් විය හැක.",
|
||||
"Options": "විකල්ප",
|
||||
"Out of Sync": "සමමුහුර්ත නොවේ",
|
||||
"Out of Sync Items": "අයිතම සමමුහුර්ත නොවේ",
|
||||
"Outgoing Rate Limit (KiB/s)": "පිටතට යන ගාස්තු සීමාව (KiB/s)",
|
||||
"Override": "අභිබවා යන්න",
|
||||
"Override Changes": "වෙනස්කම් අභිබවා යන්න",
|
||||
"Override": "අභිබවන්න",
|
||||
"Override Changes": "වෙනස්කම් අභිබවන්න",
|
||||
"Path": "මාර්ගය",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "දේශීය පරිගණකයේ ෆෝල්ඩරය වෙත මාර්ගය. එය නොමැති නම් නිර්මාණය වනු ඇත. tilde අක්ෂරය (~) සඳහා කෙටි මගක් ලෙස භාවිතා කළ හැක",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "අනුවාද ගබඩා කළ යුතු මාර්ගය (බෙදාගත් ෆෝල්ඩරයේ පෙරනිමි .stversions නාමාවලිය සඳහා හිස්ව තබන්න).",
|
||||
"Pause": "නවත්වන්න",
|
||||
"Pause All": "සියල්ල නවත්වන්න",
|
||||
"Paused": "විරාම කළා",
|
||||
"Paused (Unused)": "විරාම කරන ලද (භාවිතා නොකළ)",
|
||||
"Pause": "විරාමය",
|
||||
"Pause All": "සියල්ල විරාමය",
|
||||
"Paused": "විරාමයි",
|
||||
"Paused (Unused)": "විරාමයි (භාවිතා නොකළ)",
|
||||
"Pending changes": "පොරොත්තු වෙනස්කම්",
|
||||
"Periodic scanning at given interval and disabled watching for changes": "ලබා දී ඇති කාල සීමාව තුළ වරින් වර ස්කෑන් කිරීම සහ වෙනස්කම් සඳහා අබල කර බැලීම",
|
||||
"Periodic scanning at given interval and enabled watching for changes": "ලබා දී ඇති කාල සීමාව තුළ වරින් වර ස්කෑන් කිරීම සහ වෙනස්කම් සඳහා නැරඹීම සබල කර ඇත",
|
||||
@@ -252,13 +253,13 @@
|
||||
"Prefix indicating that the pattern should be matched without case sensitivity": "සංවේදිතාවකින් තොරව රටාව ගැලපිය යුතු බව පෙන්නුම් කරන උපසර්ගය",
|
||||
"Preparing to Sync": "සමමුහූර්තයට සූදානම් ස්ථානයේ",
|
||||
"Preview": "පෙරදසුන",
|
||||
"Preview Usage Report": "භාවිතාවේ වාර්තාව පෙරදසුන",
|
||||
"Preview Usage Report": "භාවිත වාර්තාවේ පෙරදසුන",
|
||||
"Quick guide to supported patterns": "සහාය දක්වන රටා සඳහා ඉක්මන් මාර්ගෝපදේශය",
|
||||
"Random": "අහඹු",
|
||||
"Receive Encrypted": "සංකේතවත් ලබන්න",
|
||||
"Receive Encrypted": "සංකේතිිතව ලබන්න",
|
||||
"Receive Only": "ලැබීම පමණි",
|
||||
"Received data is already encrypted": "ලැබුණු දත්ත දැනටමත් සංකේතිතයි",
|
||||
"Recent Changes": "වෙනස්කම්",
|
||||
"Recent Changes": "මෑත වෙනස්කම්",
|
||||
"Reduced by ignore patterns": "නොසලකා හැරීමේ රටා මගින් අඩු කර ඇත",
|
||||
"Release Notes": "නිකුතු සටහන්",
|
||||
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "නිදහස් අපේක්ෂකයින්ගේ නවතම විශේෂාංග සහ නිවැරදි කිරීම් අඩංගු වේ. ඒවා සාම්ප්රදායික ද්වි-සති සමමුහුර්ත නිකුතු වලට සමාන වේ.",
|
||||
@@ -266,42 +267,42 @@
|
||||
"Remote GUI": "දුරස්ථ GUI",
|
||||
"Remove": "ඉවත් කරන්න",
|
||||
"Remove Device": "උපාංගය ඉවත් කරන්න",
|
||||
"Remove Folder": "ෆෝල්ඩරය ඉවත් කරන්න",
|
||||
"Remove Folder": "බහාලුම ඉවත් කරන්න",
|
||||
"Required identifier for the folder. Must be the same on all cluster devices.": "ෆෝල්ඩරය සඳහා අවශ්ය හඳුනාගැනීම. සියලුම පොකුරු උපාංග මත සමාන විය යුතුය.",
|
||||
"Rescan": "නැවත ස්කෑන් කරන්න",
|
||||
"Rescan All": "සියල්ල නැවත ස්කෑන් කරන්න",
|
||||
"Rescans": "නැවත ස්කෑන් කරයි",
|
||||
"Restart": "යළි අරඹන්න",
|
||||
"Restart Needed": "නැවත ආරම්භ කිරීම අවශ්යයි",
|
||||
"Restarting": "නැවත ආරම්භ කිරීම",
|
||||
"Restore": "ප්රතිෂ්ඨාපනය කරන්න",
|
||||
"Restore Versions": "අනුවාද ප්රතිසාධනය කරන්න",
|
||||
"Restarting": "යළි ඇරඹෙමින්",
|
||||
"Restore": "ප්රත්යර්පණය",
|
||||
"Restore Versions": "අනුවාද ප්රත්යර්පණය",
|
||||
"Resume": "අරඹන්න",
|
||||
"Resume All": "සියල්ල නැවත ආරම්භ කරන්න",
|
||||
"Reused": "නැවත භාවිතා කරන ලදී",
|
||||
"Resume All": "සියල්ල නැවතත්",
|
||||
"Reused": "යළි භාවිත",
|
||||
"Revert": "ආපසු හරවන්න",
|
||||
"Revert Local Changes": "දේශීය වෙනස්කම් ප්රතිවර්තනය කරන්න",
|
||||
"Save": "සුරකින්න",
|
||||
"Scan Time Remaining": "ඉතිරි කාලය පරිලෝකනය කරන්න",
|
||||
"Scanning": "ස්කෑන් කිරීම",
|
||||
"Scanning": "සුපිරික්සමින්",
|
||||
"See external versioning help for supported templated command line parameters.": "සහාය දක්වන සැකිලි විධාන රේඛා පරාමිති සඳහා බාහිර අනුවාද උදවු බලන්න.",
|
||||
"Select All": "සියල්ල තෝරන්න",
|
||||
"Select a version": "අනුවාදයක් තෝරන්න",
|
||||
"Select additional devices to share this folder with.": "මෙම ෆෝල්ඩරය බෙදා ගැනීමට අමතර උපාංග තෝරන්න.",
|
||||
"Select additional folders to share with this device.": "මෙම උපාංගය සමඟ බෙදා ගැනීමට අමතර ෆෝල්ඩර තෝරන්න.",
|
||||
"Select additional devices to share this folder with.": "මෙම බහාලුම බෙදා ගැනීමට අතිරේක උපාංග තෝරන්න.",
|
||||
"Select additional folders to share with this device.": "මෙම උපාංගය සමඟ බෙදා ගැනීමට අතිරේක බහාලුම් තෝරන්න.",
|
||||
"Select latest version": "නවතම අනුවාදය තෝරන්න",
|
||||
"Select oldest version": "පැරණිතම අනුවාදය තෝරන්න",
|
||||
"Select oldest version": "පරණම අනුවාදය තෝරන්න",
|
||||
"Send & Receive": "යැවීම සහ ලැබීම",
|
||||
"Send Only": "යවන්න පමණයි",
|
||||
"Send Only": "යැවීම පමණි",
|
||||
"Set Ignores on Added Folder": "එකතු කළ ෆෝල්ඩරයේ නොසලකා හැරීම් සකසන්න",
|
||||
"Settings": "සැකසුම්",
|
||||
"Share": "බෙදාගන්න",
|
||||
"Share Folder": "ෆෝල්ඩරය බෙදා ගන්න",
|
||||
"Share this folder?": "මෙම ෆෝල්ඩරය බෙදා ගන්නද?",
|
||||
"Shared Folders": "හවුල් ෆෝල්ඩර",
|
||||
"Share Folder": "බහාලුම බෙදාගන්න",
|
||||
"Share this folder?": "මෙම බහාලුම බෙදා ගන්නද?",
|
||||
"Shared Folders": "බෙදාගත් බහාලුම්",
|
||||
"Shared With": "සමඟ බෙදාගෙන ඇත",
|
||||
"Sharing": "බෙදාගැනීම",
|
||||
"Show ID": "හැඳුනුම්පත පෙන්වන්න",
|
||||
"Show ID": "හැඳු. පෙන්වන්න",
|
||||
"Show QR": "QR පෙන්වන්න",
|
||||
"Show detailed discovery status": "සවිස්තරාත්මක සොයාගැනීම් තත්ත්වය පෙන්වන්න",
|
||||
"Show detailed listener status": "සවිස්තරාත්මක සවන්දෙන්නන්ගේ තත්ත්වය පෙන්වන්න",
|
||||
@@ -313,56 +314,56 @@
|
||||
"Simple": "සරල",
|
||||
"Simple File Versioning": "සරල ගොනු අනුවාදය",
|
||||
"Single level wildcard (matches within a directory only)": "තනි මට්ටමේ වයිල්ඩ්කාඩ් (ඩිරෙක්ටරියක් තුළ පමණක් ගැලපේ)",
|
||||
"Size": "ප්රමාණය",
|
||||
"Size": "ප්රමාණය",
|
||||
"Smallest First": "කුඩාම පළමු",
|
||||
"Some discovery methods could not be established for finding other devices or announcing this device:": "වෙනත් උපාංග සොයා ගැනීම හෝ මෙම උපාංගය නිවේදනය කිරීම සඳහා සමහර සොයාගැනීම් ක්රම ස්ථාපිත කළ නොහැක:",
|
||||
"Some items could not be restored:": "සමහර අයිතම ප්රතිසාධනය කළ නොහැකි විය:",
|
||||
"Some listening addresses could not be enabled to accept connections:": "සමහර සවන්දීමේ ලිපින සම්බන්ධතා පිළිගැනීමට සබල කළ නොහැක:",
|
||||
"Source Code": "ප්රභව කේතය",
|
||||
"Source Code": "ප්රභව කේතය",
|
||||
"Stable releases and release candidates": "ස්ථාවර නිකුත් කිරීම් සහ අපේක්ෂකයින් මුදා හැරීම",
|
||||
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "ස්ථාවර නිකුත් කිරීම් සති දෙකක් පමණ ප්රමාද වේ. මෙම කාලය තුළ ඔවුන් නිදහස් අපේක්ෂකයන් ලෙස පරීක්ෂණ සිදු කරයි.",
|
||||
"Stable releases only": "ස්ථාවර නිකුතු පමණි",
|
||||
"Stable releases only": "ස්ථායී නිකුතු පමණි",
|
||||
"Staggered": "එක තැන පල් වෙනවා",
|
||||
"Staggered File Versioning": "එකතැන පල්වෙන ගොනු අනුවාදය",
|
||||
"Start Browser": "බ්රව්සරය ආරම්භ කරන්න",
|
||||
"Statistics": "සංඛ්යාලේඛන",
|
||||
"Start Browser": "අතිරික්සුව අරඹන්න",
|
||||
"Statistics": "සංඛ්යාලේඛන",
|
||||
"Stopped": "නැවැත්තුවා",
|
||||
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "සංකේතනය කළ දත්ත පමණක් ගබඩා කර සමමුහුර්ත කරයි. සියලුම සම්බන්ධිත උපාංගවල ඇති ෆෝල්ඩර එකම මුරපදයකින් හෝ \"{{receiveEncrypted}}\" වර්ගයට අයත් විය යුතුය.",
|
||||
"Support": "සහාය",
|
||||
"Support Bundle": "ආධාරක බණ්ඩලය",
|
||||
"Sync Protocol Listen Addresses": "ප්රොටෝකෝලය සවන්දීමේ ලිපින සමමුහුර්ත කරන්න",
|
||||
"Syncing": "සමමුහුර්ත කිරීම",
|
||||
"Syncing": "සමමුහූර්තය",
|
||||
"Syncthing has been shut down.": "සමමුහුර්ත කිරීම වසා ඇත.",
|
||||
"Syncthing includes the following software or portions thereof:": "සමමුහුර්තකරණයට පහත මෘදුකාංග හෝ එහි කොටස් ඇතුළත් වේ:",
|
||||
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "සමමුහුර්ත කිරීම MPL v2.0 ලෙස බලපත්ර ලබා ඇති නිදහස් සහ විවෘත මූලාශ්ර මෘදුකාංගයකි.",
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "සමමුහුර්ත කිරීම යනු වෙනත් උපාංගවලින් සම්බන්ධතා උත්සාහයන් සඳහා පහත ජාල ලිපිනවලට සවන් දීමයි:",
|
||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "සමමුහුර්ත කිරීම යනු ඕනෑම ලිපිනයක වෙනත් උපාංගවලින් සම්බන්ධතා උත්සාහයන් සඳහා සවන් දීම නොවේ. මෙම උපාංගයෙන් පිටතට යන සම්බන්ධතා පමණක් ක්රියා කළ හැක.",
|
||||
"Syncthing is restarting.": "සමමුහුර්ත කිරීම නැවත ආරම්භ වේ.",
|
||||
"Syncthing is upgrading.": "සමමුහුර්ත කිරීම උත්ශ්රේණි කෙරේ.",
|
||||
"Syncthing is restarting.": "සයින්තින් යළි ඇරඹෙමින්.",
|
||||
"Syncthing is upgrading.": "සයින්තින් උත්ශ්රේණි වෙමින්.",
|
||||
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "සමමුහුර්තකරණය දැන් සංවර්ධකයින්ට බිඳවැටීම් ස්වයංක්රීයව වාර්තා කිරීමට සහය දක්වයි. මෙම විශේෂාංගය පෙරනිමියෙන් සක්රිය කර ඇත.",
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "සමමුහුර්ත කිරීම අක්රිය වී ඇති බවක් පෙනේ, නැතහොත් ඔබගේ අන්තර්ජාල සම්බන්ධතාවයේ ගැටලුවක් තිබේ. නැවත උත්සාහ කරමින්…",
|
||||
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "සමමුහුර්ත කිරීම ඔබගේ ඉල්ලීම සැකසීමේ ගැටලුවක් අත්විඳින බව පෙනේ. ගැටලුව දිගටම පවතින්නේ නම් කරුණාකර පිටුව නැවුම් කරන්න හෝ සමමුහුර්ත කිරීම නැවත ආරම්භ කරන්න.",
|
||||
"Take me back": "මාව ආපසු ගන්න",
|
||||
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "GUI ලිපිනය ආරම්භක විකල්ප මගින් අභිබවා යයි. ප්රතික්ෂේප කිරීම ක්රියාත්මක වන විට මෙහි වෙනස්කම් බල නොපායි.",
|
||||
"The Syncthing Authors": "සමමුහුර්ත කතුවරුන්",
|
||||
"The Syncthing Authors": "සයින්තින් කතුවරුන්",
|
||||
"The Syncthing admin interface is configured to allow remote access without a password.": "මුරපදයක් නොමැතිව දුරස්ථ ප්රවේශය සඳහා සමමුහුර්ත කිරීමේ පරිපාලක අතුරුමුහුණත වින්යාස කර ඇත.",
|
||||
"The aggregated statistics are publicly available at the URL below.": "එකතු කළ සංඛ්යාලේඛන පහත URL හි ප්රසිද්ධියේ ලබා ගත හැකිය.",
|
||||
"The cleanup interval cannot be blank.": "පිරිසිදු කිරීමේ පරතරය හිස් විය නොහැක.",
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "වින්යාසය සුරකින ලද නමුත් සක්රිය කර නැත. නව වින්යාසය සක්රිය කිරීමට සමමුහුර්ත කිරීම නැවත ආරම්භ කළ යුතුය.",
|
||||
"The device ID cannot be blank.": "උපාංග හැඳුනුම්පත හිස් විය නොහැක.",
|
||||
"The device ID cannot be blank.": "උපාංගයේ හැඳු. හිස් නොවිය යුතුය.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "මෙහි ඇතුළු කිරීමට උපාංග හැඳුනුම්පත අනෙක් උපාංගයේ \"ක්රියා > පෙන්වන්න ID\" සංවාදයෙන් සොයා ගත හැක. අවකාශ සහ ඉරි විකල්ප වේ (නොසලකා හැර ඇත).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "සංකේතාත්මක භාවිත වාර්තාව දිනපතා යවනු ලැබේ. එය පොදු වේදිකා, ෆෝල්ඩර ප්රමාණ සහ යෙදුම් අනුවාද නිරීක්ෂණය කිරීමට භාවිතා කරයි. වාර්තා කළ දත්ත කට්ටලය වෙනස් කළහොත් මෙම සංවාදය සමඟ නැවත ඔබෙන් විමසනු ඇත.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ඇතුළු කළ උපාංග හැඳුනුම්පත වලංගු නොවන බව පෙනේ. එය අකුරු සහ ඉලක්කම් වලින් සමන්විත අක්ෂර 52 හෝ 56 තන්තුවක් විය යුතුය, හිස්තැන් සහ ඉර විකල්ප විය යුතුය.",
|
||||
"The folder ID cannot be blank.": "ෆෝල්ඩර ID හිස් විය නොහැක.",
|
||||
"The folder ID must be unique.": "ෆෝල්ඩර හැඳුනුම්පත අද්විතීය විය යුතුය.",
|
||||
"The folder ID cannot be blank.": "බහාලුමේ හැඳු. හිස් නොවිය යුතුය.",
|
||||
"The folder ID must be unique.": "බහාලුමේ හැඳු. අනන්ය විය යුතුය.",
|
||||
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "වෙනත් උපාංගවල ඇති ෆෝල්ඩර අන්තර්ගතය මෙම උපාංගය සමඟ අනන්ය වීමට උඩින් ලියනු ලැබේ. මෙහි නොමැති ගොනු වෙනත් උපාංග මත මකනු ඇත.",
|
||||
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "මෙම උපාංගයේ ඇති ෆෝල්ඩර අන්තර්ගතය වෙනත් උපාංග සමඟ අනන්ය වීමට උඩින් ලියනු ලැබේ. මෙහි අලුතින් එක් කළ ගොනු මකා දැමෙනු ඇත.",
|
||||
"The folder path cannot be blank.": "ෆෝල්ඩර මාර්ගය හිස් විය නොහැක.",
|
||||
"The folder path cannot be blank.": "බහාලුමේ මාර්ගය හිස් නොවිය යුතුය.",
|
||||
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "පහත කාල පරතරයන් භාවිතා කරනු ලැබේ: පළමු පැය සඳහා සෑම තත්පර 30 කට වරක් අනුවාදයක් තබා ඇත, පළමු දිනය සඳහා සෑම පැයකටම අනුවාදයක් තබා ඇත, පළමු දින 30 සඳහා සෑම දිනකම අනුවාදයක් තබා ඇත, උපරිම වයස දක්වා අනුවාදයක් සෑම දිනකම තබා ඇත. සතිය.",
|
||||
"The following items could not be synchronized.": "පහත අයිතම සමමුහුර්ත කළ නොහැක.",
|
||||
"The following items were changed locally.": "පහත අයිතම දේශීයව වෙනස් කරන ලදී.",
|
||||
"The following items could not be synchronized.": "පහත අථක සමමුහූර්ත කිරීමට නොහැකිය.",
|
||||
"The following items were changed locally.": "පහත අථක ස්ථානීයව වෙනස් කර ඇත.",
|
||||
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "ජාලයේ වෙනත් උපාංග සොයා ගැනීමට සහ මෙම උපාංගය අන් අය විසින් සොයා ගන්නා ලෙස නිවේදනය කිරීමට පහත ක්රම භාවිතා කරයි:",
|
||||
"The following unexpected items were found.": "පහත අනපේක්ෂිත අයිතම හමු විය.",
|
||||
"The following unexpected items were found.": "පහත අනපේක්ෂිත අථක හමු විය.",
|
||||
"The interval must be a positive number of seconds.": "පරතරය ධනාත්මක තත්පර ගණනක් විය යුතුය.",
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "අනුවාද නාමාවලිය තුළ පිරිසිදු කිරීම ධාවනය කිරීම සඳහා තත්පර කිහිපයකින් පරතරය. ආවර්තිතා පිරිසිදු කිරීම අක්රිය කිරීමට ශුන්ය.",
|
||||
"The maximum age must be a number and cannot be blank.": "උපරිම වයස අංකයක් විය යුතු අතර හිස් විය නොහැක.",
|
||||
@@ -371,14 +372,14 @@
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "ලිපිගොනු කුණු කූඩයේ තබා ගත යුතු දින ගණන. ශුන්යය යනු සදහටම යන්නයි.",
|
||||
"The number of old versions to keep, per file.": "ගොනුවකට තබා ගත යුතු පැරණි අනුවාද ගණන.",
|
||||
"The number of versions must be a number and cannot be blank.": "අනුවාද ගණන අංකයක් විය යුතු අතර හිස් විය නොහැක.",
|
||||
"The path cannot be blank.": "මාර්ගය හිස් විය නොහැක.",
|
||||
"The path cannot be blank.": "මාර්ගය හිස් නොවිය යුතුය.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "අනුපාත සීමාව සෘණ නොවන අංකයක් විය යුතුය (0: සීමාවක් නැත)",
|
||||
"The remote device has not accepted sharing this folder.": "දුරස්ථ උපාංගය මෙම ෆෝල්ඩරය බෙදා ගැනීම පිළිගෙන නොමැත.",
|
||||
"The remote device has paused this folder.": "දුරස්ථ උපාංගය මෙම ෆෝල්ඩරය විරාම කර ඇත.",
|
||||
"The rescan interval must be a non-negative number of seconds.": "නැවත පරිලෝකනය කිරීමේ විරාමය සෘණාත්මක නොවන තත්පර ගණනක් විය යුතුය.",
|
||||
"There are no devices to share this folder with.": "මෙම ෆෝල්ඩරය බෙදා ගැනීමට උපාංග නොමැත.",
|
||||
"There are no file versions to restore.": "ප්රතිසාධනය කිරීමට ගොනු අනුවාද නොමැත.",
|
||||
"There are no folders to share with this device.": "මෙම උපාංගය සමඟ බෙදා ගැනීමට ෆෝල්ඩර නොමැත.",
|
||||
"There are no folders to share with this device.": "මෙම උපාංගය සමඟ බෙදා ගැනීමට බහාලුම් නැත.",
|
||||
"They are retried automatically and will be synced when the error is resolved.": "ඒවා ස්වයංක්රීයව නැවත උත්සාහ කරන අතර දෝෂය නිරාකරණය වූ විට සමමුහුර්ත වේ.",
|
||||
"This Device": "මෙම උපාංගය",
|
||||
"This Month": "මේ මාසයේ",
|
||||
@@ -392,37 +393,37 @@
|
||||
"Trash Can": "කසල බඳුන",
|
||||
"Trash Can File Versioning": "කුණු කූඩය ගොනු අනුවාදය",
|
||||
"Twitter": "ට්විටර්",
|
||||
"Type": "ටයිප් කරන්න",
|
||||
"Type": "වර්ගය",
|
||||
"UNIX Permissions": "UNIX අවසර",
|
||||
"Unavailable": "ලබා ගත නොහැක",
|
||||
"Unavailable": "නොතිබේ",
|
||||
"Unavailable/Disabled by administrator or maintainer": "පරිපාලක හෝ නඩත්තු කරන්නා විසින් ලබා ගත නොහැක/අබල කර ඇත",
|
||||
"Undecided (will prompt)": "තීරණය නොකළ (ඉක්මවනු ඇත)",
|
||||
"Unexpected Items": "අනපේක්ෂිත අයිතම",
|
||||
"Unexpected items have been found in this folder.": "මෙම ෆෝල්ඩරයේ අනපේක්ෂිත අයිතම හමු වී ඇත.",
|
||||
"Unexpected Items": "අනපේක්ෂිත අථක",
|
||||
"Unexpected items have been found in this folder.": "මෙම බහාලුමෙන් අනපේක්ෂිත දෑ හමු වී ඇත.",
|
||||
"Unignore": "නොසලකා හැරීම ඉවත් කරන්න",
|
||||
"Unknown": "නොදන්නා",
|
||||
"Unshared": "බෙදා නොගත්",
|
||||
"Unshared Devices": "බෙදා නොගත් උපාංග",
|
||||
"Unshared Folders": "බෙදා නොගත් ෆෝල්ඩර",
|
||||
"Unshared Folders": "බෙදා නොගත් බහාලුම්",
|
||||
"Untrusted": "අවිශ්වාසයි",
|
||||
"Up to Date": "යාවත්කාලීනව",
|
||||
"Up to Date": "යාවත්කාලීනයි",
|
||||
"Updated {%file%}": "යාවත්කාලීන {{file}}",
|
||||
"Upgrade": "උත්ශ්රේණි කරන්න",
|
||||
"Upgrade To {%version%}": "{{version}}දක්වා උත්ශ්රේණි කරන්න",
|
||||
"Upgrading": "උත්ශ්රේණි කිරීම",
|
||||
"Upgrading": "උත්ශ්රේණි වෙමින්",
|
||||
"Upload Rate": "උඩුගත කිරීමේ අනුපාතය",
|
||||
"Uptime": "අතිකාල",
|
||||
"Usage reporting is always enabled for candidate releases.": "අපේක්ෂක නිකුතු සඳහා භාවිත වාර්තා කිරීම සැමවිටම සක්රීය කර ඇත.",
|
||||
"Use HTTPS for GUI": "GUI සඳහා HTTPS භාවිතා කරන්න",
|
||||
"Use notifications from the filesystem to detect changed items.": "වෙනස් කළ අයිතම හඳුනා ගැනීමට ගොනු පද්ධතියෙන් දැනුම්දීම් භාවිතා කරන්න.",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "GUI සත්යාපනය සඳහා පරිශීලක නාමය/මුරපදය සකසා නොමැත. කරුණාකර එය පිහිටුවීම සලකා බලන්න.",
|
||||
"Version": "පිටපත",
|
||||
"Version": "අනුවාදය",
|
||||
"Versions": "අනුවාද",
|
||||
"Versions Path": "අනුවාද මාර්ගය",
|
||||
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "අනුවාද උපරිම වයසට වඩා පැරණි නම් හෝ පරතරයකදී අවසර දී ඇති ගොනු ගණන ඉක්මවන්නේ නම් ඒවා ස්වයංක්රීයව මකා දැමෙනු ඇත.",
|
||||
"Waiting to Clean": "පිරිසිදු කිරීමට බලා සිටීම",
|
||||
"Waiting to Scan": "ස්කෑන් කිරීමට රැඳී සිටිමින්",
|
||||
"Waiting to Sync": "සමමුහුර්ත කිරීමට රැඳී සිටිමින්",
|
||||
"Waiting to Scan": "සුපිරික්සීමට රැඳෙමින්",
|
||||
"Waiting to Sync": "සමමුහූර්තයට රැඳෙමින්",
|
||||
"Warning": "අවවාදයයි",
|
||||
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "අවවාදයයි, මෙම මාර්ගය පවතින \"{{otherFolder}}\" ෆෝල්ඩරයක මව් නාමාවලියකි.",
|
||||
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "අවවාදයයි, මෙම මාර්ගය පවතින ෆෝල්ඩරයක මව් නාමාවලියකි \"{{otherFolderLabel}}\" ({{otherFolder}}).",
|
||||
@@ -430,30 +431,30 @@
|
||||
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "අවවාදයයි, මෙම මාර්ගය පවතින \"{{otherFolderLabel}}\" ({{otherFolder}}) ෆෝල්ඩරයක උප බහලුමකි.",
|
||||
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "අවවාදයයි: ඔබ {{syncthingInotify}}වැනි බාහිර නිරීක්ෂකයක් භාවිතා කරන්නේ නම්, එය අක්රිය කර ඇති බවට ඔබ සහතික විය යුතුය.",
|
||||
"Watch for Changes": "වෙනස්කම් සඳහා නරඹන්න",
|
||||
"Watching for Changes": "වෙනස්කම් සඳහා බලා සිටීම",
|
||||
"Watching for Changes": "වෙනස්කම් නරඹමින්",
|
||||
"Watching for changes discovers most changes without periodic scanning.": "වෙනස්කම් නිරීක්ෂණය කිරීම කාලානුරූප ස්කෑන් කිරීමකින් තොරව බොහෝ වෙනස්කම් සොයා ගනී.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "නව උපාංගයක් එකතු කරන විට, මෙම උපාංගය අනෙක් පැත්තෙන් ද එකතු කළ යුතු බව මතක තබා ගන්න.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "නව ෆෝල්ඩරයක් එකතු කරන විට, උපාංග අතර ෆෝල්ඩර එකට ගැටගැසීමට ෆෝල්ඩර හැඳුනුම්පත භාවිතා කරන බව මතක තබා ගන්න. ඒවා සිද්ධි සංවේදී වන අතර සියලුම උපාංග අතර හරියටම ගැළපිය යුතුය.",
|
||||
"Yes": "ඔව්",
|
||||
"Yesterday": "ඊයේ",
|
||||
"You can also select one of these nearby devices:": "ඔබට මෙම ආසන්න උපාංගවලින් එකක් ද තෝරාගත හැක:",
|
||||
"You can change your choice at any time in the Settings dialog.": "ඔබට සැකසීම් සංවාදයේ ඕනෑම වේලාවක ඔබේ තේරීම වෙනස් කළ හැක.",
|
||||
"You can read more about the two release channels at the link below.": "පහත සබැඳියෙන් ඔබට නිකුතු නාලිකා දෙක ගැන වැඩිදුර කියවිය හැකිය.",
|
||||
"You have no ignored devices.": "ඔබට නොසලකා හරින ලද උපාංග නොමැත.",
|
||||
"You have no ignored folders.": "ඔබට නොසලකා හරින ලද ෆෝල්ඩර නොමැත.",
|
||||
"You have unsaved changes. Do you really want to discard them?": "ඔබට නොසුරකින ලද වෙනස්කම් ඇත. ඔබට ඇත්තටම ඒවා ඉවත දැමීමට අවශ්යද?",
|
||||
"You must keep at least one version.": "ඔබ අවම වශයෙන් එක් අනුවාදයක් තබා ගත යුතුය.",
|
||||
"You can also select one of these nearby devices:": "මෙම ආසන්න උපාංග වලින් එකක් ද තේරීමට හැකිය:",
|
||||
"You can change your choice at any time in the Settings dialog.": "සැකසුම් තුළ ඕනෑම විටෙක ඔබගේ තේරීම වෙනස් කිරීමට හැකිය.",
|
||||
"You can read more about the two release channels at the link below.": "පහත සබැඳියෙන් නිකුතු නාලිකා දෙක ගැන තවත් කියවීමට හැකිය.",
|
||||
"You have no ignored devices.": "නොසලකා හරින ලද උපාංග නැත.",
|
||||
"You have no ignored folders.": "නොසලකා හරින ලද බහාලුම් නැත.",
|
||||
"You have unsaved changes. Do you really want to discard them?": "ඔබ සතුව නොසුරැකි වෙනස්කම් ඇත. ඒවා ඉවතලීමට වුවමනාද?",
|
||||
"You must keep at least one version.": "අවම වශයෙන් එක් අනුවාදයක් තබා ගත යුතුය.",
|
||||
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "ඔබ කිසිවිටෙක \"{{receiveEncrypted}}\" ෆෝල්ඩරයකට දේශීයව කිසිවක් එකතු කිරීම හෝ වෙනස් කිරීම නොකළ යුතුය.",
|
||||
"days": "දින",
|
||||
"days": "දවස්",
|
||||
"directories": "නාමාවලි",
|
||||
"files": "ගොනු",
|
||||
"full documentation": "සම්පූර්ණ ලියකියවිලි",
|
||||
"items": "අයිතම",
|
||||
"full documentation": "පූර්ණ ප්රලේඛනය",
|
||||
"items": "අථක",
|
||||
"seconds": "තත්පර",
|
||||
"theme-name-black": "කලු",
|
||||
"theme-name-black": "කළු",
|
||||
"theme-name-dark": "අඳුරු",
|
||||
"theme-name-default": "පෙරනිමිය",
|
||||
"theme-name-light": "ආලෝකය",
|
||||
"theme-name-default": "පෙරනිමි",
|
||||
"theme-name-light": "දීප්ත",
|
||||
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} ට \"{{folder}}\" ෆෝල්ඩරය බෙදා ගැනීමට අවශ්යයි.",
|
||||
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} ට \"{{folderlabel}}\" ({{folder}}) ෆෝල්ඩරය බෙදා ගැනීමට අවශ්යයි.",
|
||||
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} මෙම උපාංගය නැවත හඳුන්වා දිය හැක."
|
||||
|
||||
@@ -474,6 +474,8 @@
|
||||
"Use notifications from the filesystem to detect changed items.": "Na zistenie zmenených položiek použite upozornenia zo súborového systému.",
|
||||
"User Home": "Domovský adresár",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Používateľské meno/heslo nebolo nastavené pre overenie GUI. Zvážte jeho nastavenie.",
|
||||
"Using a QUIC connection over LAN": "Používam pripojenie QUIC over LAN",
|
||||
"Using a QUIC connection over WAN": "Používam pripojenie QUIC over WAN",
|
||||
"Using a direct TCP connection over LAN": "Použitie priameho pripojenia TCP cez LAN",
|
||||
"Using a direct TCP connection over WAN": "Použitie priameho pripojenia TCP cez WAN",
|
||||
"Version": "Verzia",
|
||||
|
||||
@@ -256,7 +256,7 @@
|
||||
"No rules set": "Kural ayarlanmadı",
|
||||
"No upgrades": "Yükseltmeler yok",
|
||||
"Not shared": "Paylaşılmamış",
|
||||
"Notice": "Uyarı",
|
||||
"Notice": "Bildirim",
|
||||
"OK": "TAMAM",
|
||||
"Off": "Kapalı",
|
||||
"Oldest First": "Önce En Eski Olan",
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"Add filter entry": "添加过滤器条目",
|
||||
"Add ignore patterns": "增加忽略模式",
|
||||
"Add new folder?": "添加新文件夹?",
|
||||
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "另外,完整重新扫描的间隔将增大(时间 60,以新的默认 1 小时为例)。你也可以在选择“否”后手动配置每个文件夹的时间。",
|
||||
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "另外,完整重新扫描的间隔将增大(乘以 60,例如默认值将变为 1 小时)。你也可以在选择“否”后手动配置每个文件夹的时间。",
|
||||
"Address": "地址",
|
||||
"Addresses": "地址列表",
|
||||
"Advanced": "高级",
|
||||
@@ -88,7 +88,7 @@
|
||||
"Delete Unexpected Items": "删除特殊项目",
|
||||
"Deleted {%file%}": "{{file}} 已删除",
|
||||
"Deselect All": "取消全选",
|
||||
"Deselect devices to stop sharing this folder with.": "反选设备以停止共享此文件夹。",
|
||||
"Deselect devices to stop sharing this folder with.": "取消选择设备以停止共享此文件夹。",
|
||||
"Deselect folders to stop sharing with this device.": "取消选择文件夹以停止与此设备共享。",
|
||||
"Device": "设备",
|
||||
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "设备 \"{{name}}\"(位于 {{address}} 的 {{device}})请求连接。是否添加新设备?",
|
||||
@@ -113,12 +113,12 @@
|
||||
"Discovered": "已发现",
|
||||
"Discovery": "设备发现",
|
||||
"Discovery Failures": "设备发现错误",
|
||||
"Discovery Status": "探测状态",
|
||||
"Discovery Status": "设备发现状态",
|
||||
"Dismiss": "忽略一次",
|
||||
"Do not add it to the ignore list, so this notification may recur.": "不要将其加入忽视列表,因此这条通知可能会再度出现。",
|
||||
"Do not restore": "不要恢复",
|
||||
"Do not restore all": "不要全部恢复",
|
||||
"Do you want to enable watching for changes for all your folders?": "您想要启用对监视您所有文件夹的更改吗?",
|
||||
"Do you want to enable watching for changes for all your folders?": "您想要启用监视您所有文件夹的更改吗?",
|
||||
"Documentation": "文档",
|
||||
"Download Rate": "下载速度",
|
||||
"Downloaded": "已下载",
|
||||
@@ -238,7 +238,7 @@
|
||||
"Maximum single entry size": "最大单一条目大小",
|
||||
"Maximum total size": "最大总大小",
|
||||
"Metadata Only": "仅元数据",
|
||||
"Minimum Free Disk Space": "最低可用磁盘空间",
|
||||
"Minimum Free Disk Space": "最低空闲磁盘空间",
|
||||
"Mod. Device": "修改设备",
|
||||
"Mod. Time": "修改时间",
|
||||
"More than a month ago": "一个月前",
|
||||
@@ -279,7 +279,7 @@
|
||||
"Pending changes": "待定的更改",
|
||||
"Periodic scanning at given interval and disabled watching for changes": "正以给定的间隔定期扫描并已禁用更改监视",
|
||||
"Periodic scanning at given interval and enabled watching for changes": "正以给定的间隔定期扫描并已启用更改监视",
|
||||
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "正以给定的间隔定期扫描但设置更改监视失败,正在以每 1m 一次重试:",
|
||||
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "正以给定的间隔定期扫描但设置更改监视失败,正在以每分钟一次重试:",
|
||||
"Permanently add it to the ignore list, suppressing further notifications.": "将其永久添加到忽略列表中,禁止进一步通知。",
|
||||
"Please consult the release notes before performing a major upgrade.": "请在进行重大更新前查看发布说明。",
|
||||
"Please set a GUI Authentication User and Password in the Settings dialog.": "请在设置对话框中设置 GUI 验证用户及其密码。",
|
||||
@@ -387,7 +387,7 @@
|
||||
"Syncthing includes the following software or portions thereof:": "Syncthing 使用了下列软件或其中的一部分:",
|
||||
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing 是个以 MPL v2.0 授权的免费开源软件。",
|
||||
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing 是一个持续的文件同步程序。它在两台或更多的计算机之间实时同步文件,安全地保护它们不被窥视。你的数据是私有的,你有权选择它被储存在哪里,是否与一些第三方共享,以及如何在互联网上传输它。",
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "同步正在监听以下网络地址,以获取来自其他设备的连接尝试:",
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing正在监听以下网络地址,以获取来自其他设备的连接尝试:",
|
||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing 不会在任何地址上侦听来自其他设备的连接尝试。只有来自该设备的传出连接可能有效。",
|
||||
"Syncthing is restarting.": "Syncthing 正在重启。",
|
||||
"Syncthing is upgrading.": "Syncthing 正在升级。",
|
||||
|
||||
@@ -252,6 +252,9 @@
|
||||
"Preparing to Sync": "正在準備同步",
|
||||
"Preview": "預覽",
|
||||
"Preview Usage Report": "預覽數據報告",
|
||||
"QUIC LAN": "QUIC 區域網路",
|
||||
"QUIC WAN": "QUIC 廣域網路",
|
||||
"QUIC connections are in most cases considered suboptimal": "QUIC 連線在大多數情況下被認為是次優的",
|
||||
"Quick guide to supported patterns": "可支援樣式的快速指南",
|
||||
"Random": "隨機",
|
||||
"Receive Encrypted": "接收已加密",
|
||||
@@ -259,6 +262,8 @@
|
||||
"Received data is already encrypted": "接收到的數據已經加密",
|
||||
"Recent Changes": "最近變動",
|
||||
"Reduced by ignore patterns": "已由忽略樣式縮減",
|
||||
"Relay LAN": "區域網路中繼",
|
||||
"Relay WAN": "廣域網路中繼",
|
||||
"Release Notes": "版本資訊",
|
||||
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "候選發行版包含最新的功能及修補。與傳統 Syncthing 雙週發行版相似。",
|
||||
"Remote Devices": "遠端裝置",
|
||||
@@ -374,6 +379,7 @@
|
||||
"The path cannot be blank.": "路徑不能空白。",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "限制速率必須為非負的數字 (0: 不設限制)",
|
||||
"The remote device has not accepted sharing this folder.": "遠端裝置尚未接受分享這個資料夾。",
|
||||
"The remote device has paused this folder.": "遠端裝置已暫停同步此資料夾。",
|
||||
"The rescan interval must be a non-negative number of seconds.": "重新掃描間隔必須為一個非負數的秒數。",
|
||||
"There are no devices to share this folder with.": "沒有裝置可以共享此資料夾。",
|
||||
"There are no folders to share with this device.": "沒有資料夾分享給此裝置。",
|
||||
@@ -410,6 +416,8 @@
|
||||
"Use HTTPS for GUI": "為 GUI 使用 HTTPS",
|
||||
"Use notifications from the filesystem to detect changed items.": "使用來自檔案系統的通知以檢測變動的項目。",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "尚未設定GUI 驗證的使用者名稱/密碼。請考慮進行設定。",
|
||||
"Using a QUIC connection over LAN": "通過區域網路使用 QUIC 連線",
|
||||
"Using a QUIC connection over WAN": "通過廣域網路使用 QUIC 連線",
|
||||
"Using a direct TCP connection over LAN": "通過區域網路使用直接 TCP 連線",
|
||||
"Using a direct TCP connection over WAN": "通過廣域網路使用直接 TCP 連線",
|
||||
"Version": "版本",
|
||||
|
||||
@@ -1 +1 @@
|
||||
var langPrettyprint = {"bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","eu":"Basque","fr":"French","fy":"Frisian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","si":"Sinhala","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional, Hong Kong)","zh-TW":"Chinese (Traditional)"}
|
||||
var langPrettyprint = {"bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","eu":"Basque","fr":"French","fy":"Frisian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional, Hong Kong)","zh-TW":"Chinese (Traditional)"}
|
||||
|
||||
@@ -1 +1 @@
|
||||
var validLangs = ["bg","ca","ca@valencia","cs","da","de","en","en-GB","es","eu","fr","fy","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","si","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]
|
||||
var validLangs = ["bg","ca","ca@valencia","cs","da","de","en","en-GB","es","eu","fr","fy","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
<meta charset="utf-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<link rel="shortcut icon" href="assets/img/favicon-{{syncthingStatus()}}.png"/>
|
||||
<link rel="shortcut icon" href="assets/img/favicon-default.png" type="image/x-icon"/>
|
||||
<link rel="shortcut icon" href="assets/img/favicon-{{syncthingStatus()}}.png" type="image/x-icon"/>
|
||||
<link rel="mask-icon" href="assets/img/safari-pinned-tab.svg" color="#0882c8"/>
|
||||
|
||||
<title ng-bind="thisDeviceName() + ' | Syncthing'"></title>
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
<h4 class="text-center" translate>The Syncthing Authors</h4>
|
||||
<div class="row">
|
||||
<div class="col-md-12" id="contributor-list">
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Tomasz Wilczyński, Wulf Weich, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Aleksey Vasenev, Alessandro G., Alex Lindeman, Alex Xu, Alexandre Alves, Aman Gupta, Andreas Sommer, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, Denis A., Dennis Wilson, Devon G. Redekopp, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jaya Kumar, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, K.B.Dharun Krishna, Kalle Laine, Karol Różycki, Kebin Liu, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, Vladimir Rusinov, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, bt90, chenrui, chucic, cui fliter, derekriemer, desbma, entity0xfe, georgespatton, ghjklw, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Tomasz Wilczyński, Wulf Weich, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Aleksey Vasenev, Alessandro G., Alex Lindeman, Alex Xu, Alexander Seiler, Alexandre Alves, Aman Gupta, Andreas Sommer, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, Denis A., Dennis Wilson, Devon G. Redekopp, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jaya Kumar, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, K.B.Dharun Krishna, Kalle Laine, Karol Różycki, Kebin Liu, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, Vladimir Rusinov, Will Rouesnel, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, bt90, chenrui, chucic, cui fliter, derekriemer, desbma, entity0xfe, georgespatton, ghjklw, guangwu, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1709,6 +1709,13 @@ angular.module('syncthing.core')
|
||||
return $scope.currentDevice._editing == 'new';
|
||||
}
|
||||
|
||||
$scope.editDeviceUntrustedChanged = function () {
|
||||
if (currentDevice.untrusted) {
|
||||
currentDevice.introducer = false;
|
||||
currentDevice.autoAcceptFolders = false;
|
||||
}
|
||||
}
|
||||
|
||||
$scope.editDeviceExisting = function (deviceCfg) {
|
||||
$scope.currentDevice = $.extend({}, deviceCfg);
|
||||
$scope.currentDevice._editing = "existing";
|
||||
|
||||
@@ -62,9 +62,9 @@
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="checkbox">
|
||||
<div ng-disabled="currentDevice.untrusted" class="checkbox" ng-attr-tooltip="{{currentDevice.untrusted ? null : undefined}}" ng-attr-data-original-title="{{currentDevice.untrusted ? ('Always disabled for untrusted devices' | translate) : undefined}}">
|
||||
<label>
|
||||
<input type="checkbox" ng-model="currentDevice.introducer">
|
||||
<input ng-disabled="currentDevice.untrusted" type="checkbox" ng-model="currentDevice.introducer">
|
||||
<span translate>Introducer</span>
|
||||
<p translate class="help-block">Add devices from the introducer to our device list, for mutually shared folders.</p>
|
||||
</label>
|
||||
@@ -73,9 +73,9 @@
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<div class="checkbox">
|
||||
<div ng-disabled="currentDevice.untrusted" class="checkbox" ng-attr-tooltip="{{currentDevice.untrusted ? null : undefined}}" ng-attr-data-original-title="{{currentDevice.untrusted ? ('Always disabled for untrusted devices' | translate) : undefined}}">
|
||||
<label>
|
||||
<input type="checkbox" ng-model="currentDevice.autoAcceptFolders">
|
||||
<input ng-disabled="currentDevice.untrusted" type="checkbox" ng-model="currentDevice.autoAcceptFolders">
|
||||
<span translate>Auto Accept</span>
|
||||
<p translate class="help-block">Automatically create or share folders that this device advertises at the default path.</p>
|
||||
</label>
|
||||
@@ -164,7 +164,7 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="form-group col-md-6">
|
||||
<input type="checkbox" id="untrusted" ng-model="currentDevice.untrusted" />
|
||||
<input type="checkbox" id="untrusted" ng-model="currentDevice.untrusted" ng-change="editDeviceUntrustedChanged()"/>
|
||||
<label for="untrusted" translate>Untrusted</label>
|
||||
<p translate class="help-block">All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.</p>
|
||||
</div>
|
||||
|
||||
@@ -1865,13 +1865,7 @@ func (v jsonVersionVector) MarshalJSON() ([]byte, error) {
|
||||
}
|
||||
|
||||
func dirNames(dir string) []string {
|
||||
fd, err := os.Open(dir)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
defer fd.Close()
|
||||
|
||||
fis, err := fd.Readdir(-1)
|
||||
fis, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -161,7 +161,7 @@ func authLDAP(username string, password string, cfg config.LDAPConfiguration) bo
|
||||
|
||||
defer connection.Close()
|
||||
|
||||
err = connection.Bind(fmt.Sprintf(cfg.BindDN, username), password)
|
||||
err = connection.Bind(ldapTemplateBindDN(cfg.BindDN, username), password)
|
||||
if err != nil {
|
||||
l.Warnln("LDAP Bind:", err)
|
||||
return false
|
||||
@@ -199,6 +199,15 @@ func authLDAP(username string, password string, cfg config.LDAPConfiguration) bo
|
||||
return true
|
||||
}
|
||||
|
||||
func ldapTemplateBindDN(bindDN string, username string) string {
|
||||
// Check if formatting directives are included in the ldapTemplateBindDN - if so add username.
|
||||
// (%%s is a literal %s - unlikely for LDAP, but easy to handle here).
|
||||
if strings.Count(bindDN, "%s") != strings.Count(bindDN, "%%s") {
|
||||
bindDN = fmt.Sprintf(bindDN, username)
|
||||
}
|
||||
return bindDN
|
||||
}
|
||||
|
||||
// Convert an ISO-8859-1 encoded byte string to UTF-8. Works by the
|
||||
// principle that ISO-8859-1 bytes are equivalent to unicode code points,
|
||||
// that a rune slice is a list of code points, and that stringifying a slice
|
||||
|
||||
@@ -45,3 +45,23 @@ func TestStaticAuthPasswordFail(t *testing.T) {
|
||||
t.Fatalf("should fail auth")
|
||||
}
|
||||
}
|
||||
|
||||
func TestAuthLDAPSendsCorrectBindDNWithTemplate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
templatedDn := ldapTemplateBindDN("cn=%s,dc=some,dc=example,dc=com", "username")
|
||||
expectedDn := "cn=username,dc=some,dc=example,dc=com"
|
||||
if expectedDn != templatedDn {
|
||||
t.Fatalf("ldapTemplateBindDN should be %s != %s", expectedDn, templatedDn)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAuthLDAPSendsCorrectBindDNWithNoTemplate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
templatedDn := ldapTemplateBindDN("cn=fixedusername,dc=some,dc=example,dc=com", "username")
|
||||
expectedDn := "cn=fixedusername,dc=some,dc=example,dc=com"
|
||||
if expectedDn != templatedDn {
|
||||
t.Fatalf("ldapTemplateBindDN should be %s != %s", expectedDn, templatedDn)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -268,6 +268,9 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) error {
|
||||
}
|
||||
|
||||
func (cfg *Configuration) ensureMyDevice(myID protocol.DeviceID) {
|
||||
if myID == protocol.EmptyDeviceID {
|
||||
return
|
||||
}
|
||||
for _, device := range cfg.Devices {
|
||||
if device.DeviceID == myID {
|
||||
return
|
||||
@@ -281,7 +284,7 @@ func (cfg *Configuration) ensureMyDevice(myID protocol.DeviceID) {
|
||||
})
|
||||
}
|
||||
|
||||
func (cfg *Configuration) prepareFoldersAndDevices(myID protocol.DeviceID) (map[protocol.DeviceID]bool, error) {
|
||||
func (cfg *Configuration) prepareFoldersAndDevices(myID protocol.DeviceID) (map[protocol.DeviceID]*DeviceConfiguration, error) {
|
||||
existingDevices := cfg.prepareDeviceList()
|
||||
|
||||
sharedFolders, err := cfg.prepareFolders(myID, existingDevices)
|
||||
@@ -294,7 +297,7 @@ func (cfg *Configuration) prepareFoldersAndDevices(myID protocol.DeviceID) (map[
|
||||
return existingDevices, nil
|
||||
}
|
||||
|
||||
func (cfg *Configuration) prepareDeviceList() map[protocol.DeviceID]bool {
|
||||
func (cfg *Configuration) prepareDeviceList() map[protocol.DeviceID]*DeviceConfiguration {
|
||||
// Ensure that the device list is
|
||||
// - free from duplicates
|
||||
// - no devices with empty ID
|
||||
@@ -306,14 +309,14 @@ func (cfg *Configuration) prepareDeviceList() map[protocol.DeviceID]bool {
|
||||
})
|
||||
|
||||
// Build a list of available devices
|
||||
existingDevices := make(map[protocol.DeviceID]bool, len(cfg.Devices))
|
||||
for _, device := range cfg.Devices {
|
||||
existingDevices[device.DeviceID] = true
|
||||
existingDevices := make(map[protocol.DeviceID]*DeviceConfiguration, len(cfg.Devices))
|
||||
for i, device := range cfg.Devices {
|
||||
existingDevices[device.DeviceID] = &cfg.Devices[i]
|
||||
}
|
||||
return existingDevices
|
||||
}
|
||||
|
||||
func (cfg *Configuration) prepareFolders(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]bool) (map[protocol.DeviceID][]string, error) {
|
||||
func (cfg *Configuration) prepareFolders(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]*DeviceConfiguration) (map[protocol.DeviceID][]string, error) {
|
||||
// Prepare folders and check for duplicates. Duplicates are bad and
|
||||
// dangerous, can't currently be resolved in the GUI, and shouldn't
|
||||
// happen when configured by the GUI. We return with an error in that
|
||||
@@ -356,13 +359,13 @@ func (cfg *Configuration) prepareDevices(sharedFolders map[protocol.DeviceID][]s
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *Configuration) prepareIgnoredDevices(existingDevices map[protocol.DeviceID]bool) map[protocol.DeviceID]bool {
|
||||
func (cfg *Configuration) prepareIgnoredDevices(existingDevices map[protocol.DeviceID]*DeviceConfiguration) map[protocol.DeviceID]bool {
|
||||
// The list of ignored devices should not contain any devices that have
|
||||
// been manually added to the config.
|
||||
newIgnoredDevices := cfg.IgnoredDevices[:0]
|
||||
ignoredDevices := make(map[protocol.DeviceID]bool, len(cfg.IgnoredDevices))
|
||||
for _, dev := range cfg.IgnoredDevices {
|
||||
if !existingDevices[dev.ID] {
|
||||
if _, ok := existingDevices[dev.ID]; !ok {
|
||||
ignoredDevices[dev.ID] = true
|
||||
newIgnoredDevices = append(newIgnoredDevices, dev)
|
||||
}
|
||||
@@ -483,6 +486,9 @@ func (cfg *Configuration) SetFolders(folders []FolderConfiguration) {
|
||||
}
|
||||
|
||||
func ensureDevicePresent(devices []FolderDeviceConfiguration, myID protocol.DeviceID) []FolderDeviceConfiguration {
|
||||
if myID == protocol.EmptyDeviceID {
|
||||
return devices
|
||||
}
|
||||
for _, device := range devices {
|
||||
if device.DeviceID.Equals(myID) {
|
||||
return devices
|
||||
@@ -496,7 +502,7 @@ func ensureDevicePresent(devices []FolderDeviceConfiguration, myID protocol.Devi
|
||||
return devices
|
||||
}
|
||||
|
||||
func ensureExistingDevices(devices []FolderDeviceConfiguration, existingDevices map[protocol.DeviceID]bool) []FolderDeviceConfiguration {
|
||||
func ensureExistingDevices(devices []FolderDeviceConfiguration, existingDevices map[protocol.DeviceID]*DeviceConfiguration) []FolderDeviceConfiguration {
|
||||
count := len(devices)
|
||||
i := 0
|
||||
loop:
|
||||
@@ -547,6 +553,23 @@ loop:
|
||||
return devices[0:count]
|
||||
}
|
||||
|
||||
func ensureNoUntrustedTrustingSharing(f *FolderConfiguration, devices []FolderDeviceConfiguration, existingDevices map[protocol.DeviceID]*DeviceConfiguration) []FolderDeviceConfiguration {
|
||||
for i := 0; i < len(devices); i++ {
|
||||
dev := devices[i]
|
||||
if dev.EncryptionPassword != "" {
|
||||
// There's a password set, no check required
|
||||
continue
|
||||
}
|
||||
if devCfg := existingDevices[dev.DeviceID]; devCfg.Untrusted {
|
||||
l.Warnf("Folder %s (%s) is shared in trusted mode with untrusted device %s (%s); unsharing.", f.ID, f.Label, dev.DeviceID.Short(), devCfg.Name)
|
||||
copy(devices[i:], devices[i+1:])
|
||||
devices = devices[:len(devices)-1]
|
||||
i--
|
||||
}
|
||||
}
|
||||
return devices
|
||||
}
|
||||
|
||||
func cleanSymlinks(filesystem fs.Filesystem, dir string) {
|
||||
if build.IsWindows {
|
||||
// We don't do symlinks on Windows. Additionally, there may
|
||||
@@ -605,7 +628,7 @@ func getFreePort(host string, ports ...int) (int, error) {
|
||||
return addr.Port, nil
|
||||
}
|
||||
|
||||
func (defaults *Defaults) prepare(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]bool) {
|
||||
func (defaults *Defaults) prepare(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]*DeviceConfiguration) {
|
||||
ensureZeroForNodefault(&FolderConfiguration{}, &defaults.Folder)
|
||||
ensureZeroForNodefault(&DeviceConfiguration{}, &defaults.Device)
|
||||
defaults.Folder.prepare(myID, existingDevices)
|
||||
|
||||
@@ -1489,6 +1489,95 @@ func TestXattrFilter(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUntrustedIntroducer(t *testing.T) {
|
||||
fd, err := os.Open("testdata/untrustedintroducer.xml")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
cfg, _, err := ReadXML(fd, device1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if len(cfg.Devices) != 2 {
|
||||
// ourselves and the remote in the config
|
||||
t.Fatal("Expected two devices")
|
||||
}
|
||||
|
||||
// Check that the introducer and auto-accept flags were negated
|
||||
var foundUntrusted protocol.DeviceID
|
||||
for _, d := range cfg.Devices {
|
||||
if d.Name == "untrusted" {
|
||||
foundUntrusted = d.DeviceID
|
||||
if !d.Untrusted {
|
||||
t.Error("untrusted device should be untrusted")
|
||||
}
|
||||
if d.Introducer {
|
||||
t.Error("untrusted device should not be an introducer")
|
||||
}
|
||||
if d.AutoAcceptFolders {
|
||||
t.Error("untrusted device should not auto-accept folders")
|
||||
}
|
||||
}
|
||||
}
|
||||
if foundUntrusted.Equals(protocol.EmptyDeviceID) {
|
||||
t.Error("untrusted device not found")
|
||||
}
|
||||
|
||||
// Folder A has the device added without a password, which is not permitted
|
||||
folderA := cfg.FolderMap()["a"]
|
||||
for _, dev := range folderA.Devices {
|
||||
if dev.DeviceID == foundUntrusted {
|
||||
t.Error("untrusted device should not be in folder A")
|
||||
}
|
||||
}
|
||||
|
||||
// Folder B has the device added with a password, this is just a sanity check
|
||||
folderB := cfg.FolderMap()["b"]
|
||||
found := false
|
||||
for _, dev := range folderB.Devices {
|
||||
if dev.DeviceID == foundUntrusted {
|
||||
found = true
|
||||
if dev.EncryptionPassword == "" {
|
||||
t.Error("untrusted device should have a password in folder B")
|
||||
}
|
||||
}
|
||||
}
|
||||
if !found {
|
||||
t.Error("untrusted device not found in folder B")
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that opening a config with myID == protocol.EmptyDeviceID doesn't add that ID to the config.
|
||||
// Done in various places where config is needed, but the device ID isn't known.
|
||||
func TestLoadEmptyDeviceID(t *testing.T) {
|
||||
temp, err := copyToTmp(testFs, "example.xml")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
fd, err := testFs.Open(temp)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer fd.Close()
|
||||
cfg, _, err := ReadXML(fd, protocol.EmptyDeviceID)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, devCfg := range cfg.Devices {
|
||||
if devCfg.DeviceID == protocol.EmptyDeviceID {
|
||||
t.Fatal("Device with empty ID")
|
||||
}
|
||||
}
|
||||
for _, folderCfg := range cfg.Folders {
|
||||
for _, devCfg := range folderCfg.Devices {
|
||||
if devCfg.DeviceID == protocol.EmptyDeviceID {
|
||||
t.Fatalf("Device with empty ID in folder %v", folderCfg.Description())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func loadTestFiles() {
|
||||
entries, err := os.ReadDir("testdata")
|
||||
if err != nil {
|
||||
|
||||
@@ -34,6 +34,19 @@ func (cfg *DeviceConfiguration) prepare(sharedFolders []string) {
|
||||
}
|
||||
|
||||
cfg.IgnoredFolders = sortedObservedFolderSlice(ignoredFolders)
|
||||
|
||||
// A device cannot be simultaneously untrusted and an introducer, nor
|
||||
// auto accept folders.
|
||||
if cfg.Untrusted {
|
||||
if cfg.Introducer {
|
||||
l.Warnf("Device %s (%s) is both untrusted and an introducer, removing introducer flag", cfg.DeviceID.Short(), cfg.Name)
|
||||
cfg.Introducer = false
|
||||
}
|
||||
if cfg.AutoAcceptFolders {
|
||||
l.Warnf("Device %s (%s) is both untrusted and auto-accepting folders, removing auto-accept flag", cfg.DeviceID.Short(), cfg.Name)
|
||||
cfg.AutoAcceptFolders = false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (cfg *DeviceConfiguration) IgnoredFolder(folder string) bool {
|
||||
|
||||
@@ -181,14 +181,16 @@ func (f *FolderConfiguration) DeviceIDs() []protocol.DeviceID {
|
||||
return deviceIDs
|
||||
}
|
||||
|
||||
func (f *FolderConfiguration) prepare(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]bool) {
|
||||
func (f *FolderConfiguration) prepare(myID protocol.DeviceID, existingDevices map[protocol.DeviceID]*DeviceConfiguration) {
|
||||
// Ensure that
|
||||
// - any loose devices are not present in the wrong places
|
||||
// - there are no duplicate devices
|
||||
// - we are part of the devices
|
||||
// - folder is not shared in trusted mode with an untrusted device
|
||||
f.Devices = ensureExistingDevices(f.Devices, existingDevices)
|
||||
f.Devices = ensureNoDuplicateFolderDevices(f.Devices)
|
||||
f.Devices = ensureDevicePresent(f.Devices, myID)
|
||||
f.Devices = ensureNoUntrustedTrustingSharing(f, f.Devices, existingDevices)
|
||||
|
||||
sort.Slice(f.Devices, func(a, b int) bool {
|
||||
return f.Devices[a].DeviceID.Compare(f.Devices[b].DeviceID) == -1
|
||||
|
||||
17
lib/config/testdata/untrustedintroducer.xml
vendored
Normal file
17
lib/config/testdata/untrustedintroducer.xml
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
<configuration version="37">
|
||||
<folder id="a" label="a" path="a">
|
||||
<device id="6564BQV-R2WYPMN-5OLXMII-CDJUKFD-BHNNCRA-WLQPAIV-ELSGAD2-RMFBFQU" introducedBy="">
|
||||
<encryptionPassword></encryptionPassword>
|
||||
</device>
|
||||
</folder>
|
||||
<folder id="b" label="b" path="b">
|
||||
<device id="6564BQV-R2WYPMN-5OLXMII-CDJUKFD-BHNNCRA-WLQPAIV-ELSGAD2-RMFBFQU" introducedBy="">
|
||||
<encryptionPassword>a complex password</encryptionPassword>
|
||||
</device>
|
||||
</folder>
|
||||
<device id="6564BQV-R2WYPMN-5OLXMII-CDJUKFD-BHNNCRA-WLQPAIV-ELSGAD2-RMFBFQU" name="untrusted" compression="metadata" introducer="true" skipIntroductionRemovals="false" introducedBy="">
|
||||
<address>dynamic</address>
|
||||
<autoAcceptFolders>true</autoAcceptFolders>
|
||||
<untrusted>true</untrusted>
|
||||
</device>
|
||||
</configuration>
|
||||
@@ -200,22 +200,21 @@ func dbIsLarge(location string) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
dir, err := os.Open(location)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
fis, err := dir.Readdir(-1)
|
||||
entries, err := os.ReadDir(location)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
var size int64
|
||||
for _, fi := range fis {
|
||||
if fi.Name() == "LOG" {
|
||||
for _, entry := range entries {
|
||||
if entry.Name() == "LOG" {
|
||||
// don't count the size
|
||||
continue
|
||||
}
|
||||
fi, err := entry.Info()
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
size += fi.Size()
|
||||
}
|
||||
|
||||
|
||||
@@ -391,9 +391,7 @@ func (m *metadataTracker) Snapshot() *countsMap {
|
||||
for k, v := range m.indexes {
|
||||
c.indexes[k] = v
|
||||
}
|
||||
for i := range m.counts.Counts {
|
||||
c.counts.Counts[i] = m.counts.Counts[i]
|
||||
}
|
||||
copy(c.counts.Counts, m.counts.Counts)
|
||||
|
||||
return c
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ package fs
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
"syscall"
|
||||
"testing"
|
||||
@@ -37,14 +36,6 @@ func TestWindowsPaths(t *testing.T) {
|
||||
{`\\192.0.2.22\network\share`, `\\192.0.2.22\network\share`, `\\192.0.2.22\network\share`},
|
||||
}
|
||||
|
||||
if runtime.Version() >= "go1.20" {
|
||||
testCases = append(testCases,
|
||||
testCase{`\\.\e:`, `\\.\e:\`, `e:\`},
|
||||
testCase{`\\.\e:\`, `\\.\e:\`, `e:\`},
|
||||
testCase{`\\.\e:\\`, `\\.\e:\`, `e:\`},
|
||||
)
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
fs := newBasicFilesystem(testCase.input)
|
||||
if fs.root != testCase.expectedRoot {
|
||||
|
||||
@@ -622,7 +622,7 @@ func (f *sendReceiveFolder) handleDir(file protocol.FileInfo, snap *db.Snapshot,
|
||||
// not MkdirAll because the parent should already exist.
|
||||
mkdir := func(path string) error {
|
||||
err = f.mtimefs.Mkdir(path, mode)
|
||||
if err != nil || f.IgnorePerms {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -631,7 +631,7 @@ func (f *sendReceiveFolder) handleDir(file protocol.FileInfo, snap *db.Snapshot,
|
||||
return err
|
||||
}
|
||||
|
||||
if file.NoPermissions {
|
||||
if f.IgnorePerms || file.NoPermissions {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -2826,23 +2826,27 @@ func TestParentOfUnignored(t *testing.T) {
|
||||
w, fcfg, wCancel := newDefaultCfgWrapper()
|
||||
defer wCancel()
|
||||
ffs := fcfg.Filesystem(nil)
|
||||
defer ffs.Remove(".stignore")
|
||||
|
||||
fd, err := ffs.Create("baz")
|
||||
must(t, err)
|
||||
fd.Close()
|
||||
must(t, ffs.Mkdir("bar", 0o755))
|
||||
must(t, ffs.Mkdir("baz", 0o755))
|
||||
must(t, ffs.Mkdir("baz/quux", 0o755))
|
||||
|
||||
m := setupModel(t, w)
|
||||
defer cleanupModel(m)
|
||||
|
||||
m.SetIgnores("default", []string{"!quux", "*"})
|
||||
m.ScanFolder("default")
|
||||
|
||||
m.SetIgnores("default", []string{"!quux", "*"})
|
||||
if bar, ok := m.testCurrentFolderFile("default", "bar"); !ok {
|
||||
t.Error(`Directory "bar" missing in db`)
|
||||
} else if !bar.IsIgnored() {
|
||||
t.Error(`Directory "bar" is not ignored`)
|
||||
}
|
||||
|
||||
if parent, ok := m.testCurrentFolderFile("default", "baz"); !ok {
|
||||
t.Errorf(`Directory "baz" missing in db`)
|
||||
} else if parent.IsIgnored() {
|
||||
t.Errorf(`Directory "baz" is ignored`)
|
||||
if baz, ok := m.testCurrentFolderFile("default", "baz"); !ok {
|
||||
t.Error(`Directory "baz" missing in db`)
|
||||
} else if baz.IsIgnored() {
|
||||
t.Error(`Directory "baz" is ignored`)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -609,10 +609,10 @@ func TestRequestSymlinkWindows(t *testing.T) {
|
||||
|
||||
func equalContents(fs fs.Filesystem, path string, contents []byte) error {
|
||||
fd, err := fs.Open(path)
|
||||
defer fd.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer fd.Close()
|
||||
bs, err := io.ReadAll(fd)
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
@@ -8,7 +8,6 @@ package versioner
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -227,7 +226,7 @@ func TestTrashcanCleanOut(t *testing.T) {
|
||||
".stversions/remove/removesubdir/file1": true,
|
||||
}
|
||||
|
||||
t.Run(fmt.Sprintf("trashcan versioner trashcan clean up"), func(t *testing.T) {
|
||||
t.Run("trashcan versioner trashcan clean up", func(t *testing.T) {
|
||||
oldTime := time.Now().Add(-8 * 24 * time.Hour)
|
||||
for file, shouldRemove := range testcases {
|
||||
fs.MkdirAll(filepath.Dir(file), 0777)
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "STDISCOSRV" "1" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "STDISCOSRV" "1" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
stdiscosrv \- Syncthing Discovery Server
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "STRELAYSRV" "1" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "STRELAYSRV" "1" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
strelaysrv \- Syncthing Relay Server
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-BEP" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-BEP" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-bep \- Block Exchange Protocol v1
|
||||
.SH INTRODUCTION AND DEFINITIONS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-CONFIG" "5" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-CONFIG" "5" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-config \- Syncthing Configuration
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-device-ids \- Understanding Device IDs
|
||||
.sp
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-EVENT-API" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-EVENT-API" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-event-api \- Event API
|
||||
.SH DESCRIPTION
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-FAQ" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-FAQ" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-faq \- Frequently Asked Questions
|
||||
.INDENT 0.0
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-globaldisco \- Global Discovery Protocol v3
|
||||
.SH ANNOUNCEMENTS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-LOCALDISCO" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-LOCALDISCO" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-localdisco \- Local Discovery Protocol v4
|
||||
.SH MODE OF OPERATION
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-NETWORKING" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-NETWORKING" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-networking \- Firewall Setup
|
||||
.SH ROUTER SETUP
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-RELAY" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-RELAY" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-relay \- Relay Protocol v1
|
||||
.SH WHAT IS A RELAY?
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-REST-API" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-REST-API" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-rest-api \- REST API
|
||||
.sp
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-SECURITY" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-SECURITY" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-security \- Security Principles
|
||||
.sp
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-STIGNORE" "5" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-STIGNORE" "5" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-stignore \- Prevent files from being synchronized to other nodes
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-VERSIONING" "7" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING-VERSIONING" "7" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-versioning \- Keep automatic backups of deleted files by other nodes
|
||||
.sp
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING" "1" "Apr 29, 2023" "v1.23.3" "Syncthing"
|
||||
.TH "SYNCTHING" "1" "Jun 12, 2023" "v1.23.5" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing \- Syncthing
|
||||
.SH SYNOPSIS
|
||||
|
||||
Reference in New Issue
Block a user