mirror of
https://github.com/syncthing/syncthing.git
synced 2026-02-07 20:52:54 -05:00
Compare commits
4 Commits
release-rc
...
infrastruc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8a711af4e | ||
|
|
f731cfa746 | ||
|
|
b40f2acdad | ||
|
|
8adcffbb59 |
3
.github/workflows/build-nightly.yaml
vendored
3
.github/workflows/build-nightly.yaml
vendored
@@ -9,6 +9,9 @@ on:
|
||||
permissions:
|
||||
contents: write
|
||||
packages: write
|
||||
artifact-metadata: write
|
||||
attestations: write
|
||||
id-token: write
|
||||
|
||||
jobs:
|
||||
build-syncthing:
|
||||
|
||||
@@ -27,7 +27,6 @@ import (
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"github.com/puzpuzpuz/xsync/v3"
|
||||
"github.com/syncthing/syncthing/internal/blob"
|
||||
"github.com/syncthing/syncthing/internal/blob/azureblob"
|
||||
"github.com/syncthing/syncthing/internal/blob/s3"
|
||||
"github.com/syncthing/syncthing/internal/slogutil"
|
||||
"github.com/syncthing/syncthing/lib/build"
|
||||
@@ -49,10 +48,6 @@ type CLI struct {
|
||||
S3Bucket string `name:"s3-bucket" env:"UR_S3_BUCKET"`
|
||||
S3AccessKeyID string `name:"s3-access-key-id" env:"UR_S3_ACCESS_KEY_ID"`
|
||||
S3SecretKey string `name:"s3-secret-key" env:"UR_S3_SECRET_KEY"`
|
||||
|
||||
AzureBlobAccount string `name:"azure-blob-account" env:"UR_AZUREBLOB_ACCOUNT"`
|
||||
AzureBlobKey string `name:"azure-blob-key" env:"UR_AZUREBLOB_KEY"`
|
||||
AzureBlobContainer string `name:"azure-blob-container" env:"UR_AZUREBLOB_CONTAINER"`
|
||||
}
|
||||
|
||||
var (
|
||||
@@ -138,12 +133,6 @@ func (cli *CLI) Run() error {
|
||||
slog.Error("Failed to create S3 session", slogutil.Error(err))
|
||||
return err
|
||||
}
|
||||
} else if cli.AzureBlobAccount != "" {
|
||||
blobs, err = azureblob.NewBlobStore(cli.AzureBlobAccount, cli.AzureBlobKey, cli.AzureBlobContainer)
|
||||
if err != nil {
|
||||
slog.Error("Failed to create Azure blob store", slogutil.Error(err))
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := os.Stat(cli.DumpFile); err != nil && blobs != nil {
|
||||
|
||||
@@ -113,7 +113,7 @@ func (s *inMemoryStore) merge(key *protocol.DeviceID, addrs []*discosrv.Database
|
||||
}
|
||||
|
||||
if oldRec, ok := s.m.Load(*key); ok {
|
||||
newRec = merge(oldRec, newRec)
|
||||
newRec = merge(newRec, oldRec)
|
||||
}
|
||||
s.m.Store(*key, newRec)
|
||||
|
||||
@@ -135,7 +135,13 @@ func (s *inMemoryStore) get(key *protocol.DeviceID) (*discosrv.DatabaseRecord, e
|
||||
return &discosrv.DatabaseRecord{}, nil
|
||||
}
|
||||
|
||||
rec.Addresses = expire(rec.Addresses, s.clock.Now())
|
||||
naddresses, changed := expire(rec.Addresses, s.clock.Now())
|
||||
if changed {
|
||||
rec = &discosrv.DatabaseRecord{
|
||||
Addresses: naddresses,
|
||||
Seen: rec.Seen,
|
||||
}
|
||||
}
|
||||
databaseOperations.WithLabelValues(dbOpGet, dbResSuccess).Inc()
|
||||
return rec, nil
|
||||
}
|
||||
@@ -184,12 +190,12 @@ func (s *inMemoryStore) expireAndCalculateStatistics() {
|
||||
}
|
||||
n++
|
||||
|
||||
addresses := expire(rec.Addresses, now)
|
||||
if len(addresses) == 0 {
|
||||
rec.Addresses = nil
|
||||
s.m.Store(key, rec)
|
||||
} else if len(addresses) != len(rec.Addresses) {
|
||||
rec.Addresses = addresses
|
||||
addresses, changed := expire(rec.Addresses, now)
|
||||
if changed {
|
||||
rec = &discosrv.DatabaseRecord{
|
||||
Addresses: addresses,
|
||||
Seen: rec.Seen,
|
||||
}
|
||||
s.m.Store(key, rec)
|
||||
}
|
||||
|
||||
@@ -371,9 +377,9 @@ func (s *inMemoryStore) read() (int, error) {
|
||||
}
|
||||
|
||||
slices.SortFunc(rec.Addresses, Cmp)
|
||||
rec.Addresses = slices.CompactFunc(rec.Addresses, Equal)
|
||||
rec.Addresses, _ = expire(slices.CompactFunc(rec.Addresses, Equal), s.clock.Now())
|
||||
s.m.Store(key, &discosrv.DatabaseRecord{
|
||||
Addresses: expire(rec.Addresses, s.clock.Now()),
|
||||
Addresses: rec.Addresses,
|
||||
Seen: rec.Seen,
|
||||
})
|
||||
nr++
|
||||
@@ -384,7 +390,7 @@ func (s *inMemoryStore) read() (int, error) {
|
||||
// merge returns the merged result of the two database records a and b. The
|
||||
// result is the union of the two address sets, with the newer expiry time
|
||||
// chosen for any duplicates. The address list in a is overwritten and
|
||||
// reused for the result.
|
||||
// reused for the result; b is not modified.
|
||||
func merge(a, b *discosrv.DatabaseRecord) *discosrv.DatabaseRecord {
|
||||
// Both lists must be sorted for this to work.
|
||||
|
||||
@@ -415,25 +421,33 @@ func merge(a, b *discosrv.DatabaseRecord) *discosrv.DatabaseRecord {
|
||||
return a
|
||||
}
|
||||
|
||||
// expire returns the list of addresses after removing expired entries.
|
||||
// Expiration happen in place, so the slice given as the parameter is
|
||||
// destroyed. Internal order is preserved.
|
||||
func expire(addrs []*discosrv.DatabaseAddress, now time.Time) []*discosrv.DatabaseAddress {
|
||||
// expire returns the list of addresses after removing expired entries. A
|
||||
// new slice is allocated if any changes are required, and the changed
|
||||
// boolean indicates whether that happened or not.
|
||||
func expire(addrs []*discosrv.DatabaseAddress, now time.Time) (result []*discosrv.DatabaseAddress, changed bool) {
|
||||
cutoff := now.UnixNano()
|
||||
naddrs := addrs[:0]
|
||||
for i := range addrs {
|
||||
if i > 0 && addrs[i].Address == addrs[i-1].Address {
|
||||
// Skip duplicates
|
||||
continue
|
||||
}
|
||||
if addrs[i].Expires >= cutoff {
|
||||
naddrs = append(naddrs, addrs[i])
|
||||
remains := 0
|
||||
for _, a := range addrs {
|
||||
if a.Expires < cutoff {
|
||||
changed = true
|
||||
} else {
|
||||
remains++
|
||||
}
|
||||
}
|
||||
if len(naddrs) == 0 {
|
||||
return nil
|
||||
if !changed {
|
||||
return addrs, false
|
||||
}
|
||||
return naddrs
|
||||
if remains == 0 {
|
||||
return nil, true
|
||||
}
|
||||
|
||||
naddrs := make([]*discosrv.DatabaseAddress, 0, remains)
|
||||
for _, a := range addrs {
|
||||
if a.Expires >= cutoff {
|
||||
naddrs = append(naddrs, a)
|
||||
}
|
||||
}
|
||||
return naddrs, true
|
||||
}
|
||||
|
||||
func Cmp(d, other *discosrv.DatabaseAddress) (n int) {
|
||||
|
||||
@@ -161,7 +161,7 @@ func TestFilter(t *testing.T) {
|
||||
}
|
||||
|
||||
for _, tc := range cases {
|
||||
res := expire(tc.a, time.Unix(0, 10))
|
||||
res, _ := expire(tc.a, time.Unix(0, 10))
|
||||
if fmt.Sprint(res) != fmt.Sprint(tc.b) {
|
||||
t.Errorf("Incorrect result %v, expected %v", res, tc.b)
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import (
|
||||
"github.com/thejerf/suture/v4"
|
||||
|
||||
"github.com/syncthing/syncthing/internal/blob"
|
||||
"github.com/syncthing/syncthing/internal/blob/azureblob"
|
||||
"github.com/syncthing/syncthing/internal/blob/s3"
|
||||
"github.com/syncthing/syncthing/internal/slogutil"
|
||||
_ "github.com/syncthing/syncthing/lib/automaxprocs"
|
||||
@@ -77,10 +76,6 @@ type CLI struct {
|
||||
DBS3AccessKeyID string `name:"db-s3-access-key-id" group:"Database (S3 backup)" hidden:"true" help:"S3 access key ID for database" env:"DISCOVERY_DB_S3_ACCESS_KEY_ID"`
|
||||
DBS3SecretKey string `name:"db-s3-secret-key" group:"Database (S3 backup)" hidden:"true" help:"S3 secret key for database" env:"DISCOVERY_DB_S3_SECRET_KEY"`
|
||||
|
||||
DBAzureBlobAccount string `name:"db-azure-blob-account" env:"DISCOVERY_DB_AZUREBLOB_ACCOUNT"`
|
||||
DBAzureBlobKey string `name:"db-azure-blob-key" env:"DISCOVERY_DB_AZUREBLOB_KEY"`
|
||||
DBAzureBlobContainer string `name:"db-azure-blob-container" env:"DISCOVERY_DB_AZUREBLOB_CONTAINER"`
|
||||
|
||||
AMQPAddress string `group:"AMQP replication" hidden:"true" help:"Address to AMQP broker" env:"DISCOVERY_AMQP_ADDRESS"`
|
||||
|
||||
Debug bool `short:"d" help:"Print debug output" env:"DISCOVERY_DEBUG"`
|
||||
@@ -134,8 +129,6 @@ func main() {
|
||||
var err error
|
||||
if cli.DBS3Endpoint != "" {
|
||||
blobs, err = s3.NewSession(cli.DBS3Endpoint, cli.DBS3Region, cli.DBS3Bucket, cli.DBS3AccessKeyID, cli.DBS3SecretKey)
|
||||
} else if cli.DBAzureBlobAccount != "" {
|
||||
blobs, err = azureblob.NewBlobStore(cli.DBAzureBlobAccount, cli.DBAzureBlobKey, cli.DBAzureBlobContainer)
|
||||
}
|
||||
if err != nil {
|
||||
slog.Error("Failed to create blob store", "error", err)
|
||||
|
||||
4
go.mod
4
go.mod
@@ -4,7 +4,6 @@ go 1.24.0
|
||||
|
||||
require (
|
||||
github.com/AudriusButkevicius/recli v0.0.7
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2
|
||||
github.com/alecthomas/kong v1.12.1
|
||||
github.com/aws/aws-sdk-go v1.55.8
|
||||
github.com/calmh/incontainer v1.0.0
|
||||
@@ -54,8 +53,6 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 // indirect
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
|
||||
@@ -90,6 +87,7 @@ require (
|
||||
github.com/prometheus/procfs v0.16.1 // indirect
|
||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
|
||||
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect
|
||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/stretchr/objx v0.5.2 // indirect
|
||||
github.com/stretchr/testify v1.10.0 // indirect
|
||||
|
||||
16
go.sum
16
go.sum
@@ -2,20 +2,8 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/AudriusButkevicius/recli v0.0.7 h1:9zjbYlTupi+W5SJXm2cR2sV2mJAIg1sIfDcsW7hrkPM=
|
||||
github.com/AudriusButkevicius/recli v0.0.7/go.mod h1:Nhfib1j/VFnLrXL9cHgA+/n2O6P5THuWelOnbfPNd78=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 h1:Wc1ml6QlJs2BHQ/9Bqu1jiyggbsSjramq2oUmp5WeIo=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2 h1:FwladfywkNirM+FZYLBR2kBz5C8Tg0fw5w5Y7meRXWI=
|
||||
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2/go.mod h1:vv5Ad0RrIoT1lJFdWBZwt4mB1+j+V8DUroixmKDTCdk=
|
||||
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/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
|
||||
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
@@ -81,8 +69,6 @@ github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqw
|
||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
|
||||
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
|
||||
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
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=
|
||||
@@ -195,8 +181,6 @@ github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5
|
||||
github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8=
|
||||
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
|
||||
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
|
||||
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
"Add Device": "Lisa seade",
|
||||
"Add Folder": "Lisa kaust",
|
||||
"Add Remote Device": "Lisa kaugseade",
|
||||
"Add devices from the introducer to our device list, for mutually shared folders.": "Ühiselt jagatud kaustade halduseks lisa kokkuviija poolt teadaantud seadmed meie seadmeloendisse.",
|
||||
"Add filter entry": "Lisa filtrikirje",
|
||||
"Add ignore patterns": "Lisa eiramismustreid",
|
||||
"Add new folder?": "Kas lisad uue kausta?",
|
||||
@@ -24,6 +25,7 @@
|
||||
"Allow Anonymous Usage Reporting?": "Kas lubad anonüümset statistikakogumist rakenduse kasutamise kohta?",
|
||||
"Allowed Networks": "Lubatud võrgud",
|
||||
"Alphabetic": "Tähestikuline",
|
||||
"Altered by ignoring deletes.": "Muudetud eirates kustutamisi.",
|
||||
"Always turned on when the folder type is \"{%foldertype%}\".": "Kui kausta tüüp on „{{foldertype}}“, siis on alati lülitatud sisse.",
|
||||
"Anonymous Usage Reporting": "Anonüümne aruandlus kasutuse kohta",
|
||||
"Applied to LAN": "Kehtib kohtvõrgu puhul",
|
||||
@@ -39,8 +41,10 @@
|
||||
"Authors": "Autorid",
|
||||
"Auto Accept": "Nõustu automaatselt",
|
||||
"Automatic Crash Reporting": "Automaatne teavitus rakenduste kokkujooksmise kohta",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automaatsed uuendused võimaldavad nüüd valida stabiilsete versioonide ja kandidaatversioonide vahel.",
|
||||
"Automatic upgrades": "Automaatsed uuendused",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "Automaatsed uuendused on kandidaatversioonide puhul alati lubatud.",
|
||||
"Available debug logging facilities:": "Saadavaolevad logimisklassid veaotsinguteadate logimiseks:",
|
||||
"Be careful!": "Ettevaatust!",
|
||||
"Body:": "Kirja sisu:",
|
||||
"Bugs": "Vead",
|
||||
@@ -53,6 +57,7 @@
|
||||
"Click to see full identification string and QR code.": "Täispikka tunnust ja QR-koodi näed, kui klõpsad siin.",
|
||||
"Close": "Sulge",
|
||||
"Command": "Käsk",
|
||||
"Comment, when used at the start of a line": "Kommentaar, kasutades rea alguses",
|
||||
"Compression": "Pakkimine",
|
||||
"Configuration Directory": "Seadistuste kaust",
|
||||
"Configuration File": "Seadistuste fail",
|
||||
@@ -127,16 +132,22 @@
|
||||
"Enable NAT traversal": "Luba NAT traversal",
|
||||
"Enable Relaying": "Luba edastussõlmede kasutamine",
|
||||
"Enabled": "Kasutusel",
|
||||
"Enter a non-privileged port number (1024 - 65535).": "Sisesta pordi number vabast segmendist (1024 - 65535).",
|
||||
"Enter ignore patterns, one per line.": "Sisesta eiramiste mustrid üks muster ühele reale.",
|
||||
"Enter up to three octal digits.": "Sisesta kuni kolm kaheksandsüsteemis arvu.",
|
||||
"Error": "Viga",
|
||||
"Extended Attributes": "Täiendavad atribuudid",
|
||||
"Extended Attributes": "Täiendavad atribuudid/andmed",
|
||||
"Extended Attributes Filter": "Täiendavate atribuutide/andmete filter",
|
||||
"External": "Väline",
|
||||
"External File Versioning": "Väline failide versioonihaldus",
|
||||
"Failed Items": "Ebaõnnestunud objektid",
|
||||
"Failed to load file versions.": "Failiversioonide laadimine ei õnnestunud.",
|
||||
"Failed to load ignore patterns.": "Eiramismustrite laadimine ei õnnestunud.",
|
||||
"Failed to set up, retrying": "Seadistamine ei õnnestunud, proovin uuesti",
|
||||
"File Pull Order": "Failide Tirimise Järjekord",
|
||||
"File Versioning": "Failide versioonihaldus",
|
||||
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Failid liigutatakse asendamisel või kustutamisel .stversions kataloogi.",
|
||||
"Filesystem Watcher Errors": "Failisüsteemi jälgija vead",
|
||||
"Filter by date": "Filtreeri kuupäeva alusel",
|
||||
"Filter by name": "Filtreeri nime alusel",
|
||||
"Folder": "Kaust",
|
||||
@@ -159,6 +170,7 @@
|
||||
"General": "Üldist",
|
||||
"Generate": "Genereeri",
|
||||
"Global Discovery": "Üldine avastamine",
|
||||
"Global Discovery Servers": "Üldised tuvastusserverid",
|
||||
"Global State": "Üldine olek",
|
||||
"Help": "Abiteave",
|
||||
"Home page": "Avaleht",
|
||||
@@ -175,6 +187,8 @@
|
||||
"Incorrect user name or password.": "Vigane kasutajanimi või salasõna.",
|
||||
"Info": "Teave",
|
||||
"Internally used paths:": "Sisemiselt kasutatud asukohad:",
|
||||
"Introduced By": "Seda on kokku viinud",
|
||||
"Introducer": "Kokkuviija",
|
||||
"Introduction": "Sissejuhatus",
|
||||
"Keep Versions": "Säilita Versioone",
|
||||
"LDAP": "LDAP",
|
||||
@@ -189,6 +203,9 @@
|
||||
"Learn more at {%url%}": "Lisateavet leiad siit: {{url}}",
|
||||
"Limit": "Piirang",
|
||||
"Limit Bandwidth in LAN": "Piira ribalaiust kohtvõrgus",
|
||||
"Listener Failures": "Kuulaja vead",
|
||||
"Listener Status": "Kuulaja olek",
|
||||
"Listeners": "Kuulajad",
|
||||
"Loading data...": "Laadin andmeid…",
|
||||
"Loading...": "Laadin...",
|
||||
"Local Additions": "Kohalikud lisandused",
|
||||
@@ -259,12 +276,15 @@
|
||||
"QR code": "QR-kood",
|
||||
"QUIC LAN": "QUIC LAN",
|
||||
"QUIC WAN": "QUIC WAN",
|
||||
"Quick guide to supported patterns": "Toetatud mustrite kiirjuhend",
|
||||
"Random": "Juhuslik",
|
||||
"Receive Encrypted": "Vastuvõtmine krüptituna",
|
||||
"Receive Only": "Ainult vastuvõtmine",
|
||||
"Received data is already encrypted": "Vastuvõetud andmed on juba krüptitud",
|
||||
"Recent Changes": "Hiljutised muudatused",
|
||||
"Reduced by ignore patterns": "Hiljutised eiramismustrid",
|
||||
"Relay LAN": "Edasta kohtvõrgus",
|
||||
"Relay WAN": "Edasta laivõrgus",
|
||||
"Release Notes": "Muudatuste logi",
|
||||
"Remote Devices": "Kaugseadmed",
|
||||
"Remote GUI": "Kaugseadme graafiline kasutajaliides",
|
||||
@@ -296,11 +316,13 @@
|
||||
"Select latest version": "Vali viimane versioon",
|
||||
"Select oldest version": "Vali vanim versioon",
|
||||
"Send & Receive": "Saatmine ja vastuvõtmine",
|
||||
"Send Extended Attributes": "Saada täiendavaid andmeid",
|
||||
"Send Only": "Ainult saatmine",
|
||||
"Send Ownership": "Edasta omand",
|
||||
"Set Ignores on Added Folder": "Märgista lisatud kausta eiramised",
|
||||
"Settings": "Seadistused",
|
||||
"Share": "Jaga",
|
||||
"Share Folder": "Jaga Kausta",
|
||||
"Share Folder": "Jaga kausta",
|
||||
"Share by Email": "Jaga e-kirjaga",
|
||||
"Share by SMS": "Jaga SMS-iga",
|
||||
"Share this folder?": "Kas tahad jagada seda kausta?",
|
||||
@@ -309,16 +331,24 @@
|
||||
"Sharing": "Jagamine",
|
||||
"Show ID": "Kuva ID",
|
||||
"Show QR": "Kuva QR",
|
||||
"Show detailed discovery status": "Näita avastamise üksikasjalikku olekut",
|
||||
"Show detailed listener status": "Näita kuulaja üksikasjalikku olekut",
|
||||
"Show diff with previous version": "Näita erinevust eelmise versiooniga",
|
||||
"Shut Down": "Lülita välja",
|
||||
"Shutdown Complete": "Väljalülitamine on lõppenud",
|
||||
"Simple": "Lihtne",
|
||||
"Simple File Versioning": "Lihtne Faili Versioonindus",
|
||||
"Simple File Versioning": "Failide lihtne versioonihaldus",
|
||||
"Single level wildcard (matches within a directory only)": "Ühetasandiline metamärk (vastavust otsitakse vaid kausta sees)",
|
||||
"Size": "Suurus",
|
||||
"Smallest First": "Esmalt väiksemad",
|
||||
"Some items could not be restored:": "Mõne objekti taastamine polnud võimalik:",
|
||||
"Some listening addresses could not be enabled to accept connections:": "Ühenduse loomiseks polnud võimalik mõnda kuulamisaadressi kinnitada:",
|
||||
"Source Code": "Lähtekood",
|
||||
"Stable releases only": "Ainult stabiilsed väljalasked",
|
||||
"Stable releases and release candidates": "Stabiilsed versioonid ja kandidaatversioonid",
|
||||
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Stabiilsete versioonide viiteaeg on kaks nädalat. Selle aja kestel neid testitakse kui kandidaatversioone.",
|
||||
"Stable releases only": "Ainult stabiilsed versioonid",
|
||||
"Staggered": "Järkjärguline",
|
||||
"Staggered File Versioning": "Järkjärguline failide versioonihaldus",
|
||||
"Start Browser": "Käivita Brauser",
|
||||
"Statistics": "Statistika",
|
||||
"Stay logged in": "Jää sisselogituks",
|
||||
@@ -327,9 +357,14 @@
|
||||
"Subject:": "Teema:",
|
||||
"Support": "Abi",
|
||||
"Support Bundle": "Veaotsingu tugipakett",
|
||||
"Sync Extended Attributes": "Sünkrooni täiendavaid atribuute/andmeid",
|
||||
"Sync Ownership": "Sünkrooni omand",
|
||||
"Sync Protocol Listen Addresses": "Sünkroonimisprotokolli kuulamisaadress",
|
||||
"Sync Status": "Sünkroonimise olek",
|
||||
"Syncing": "Sünkroniseerimine",
|
||||
"Syncthing device ID for \"{%devicename%}\"": "Syncthingi seadmetunnus „{{devicename}}“ seadme jaoks",
|
||||
"Syncthing has been shut down.": "Syncthing on seisatud.",
|
||||
"Syncthing includes the following software or portions thereof:": "Syncthingis leidub järgnevat tarkvara või nende alamkomponenete:",
|
||||
"Syncthing is restarting.": "Syncthing taaskäivitub.",
|
||||
"Syncthing is saving changes.": "Syncthing salvestab muudatusi.",
|
||||
"Syncthing is upgrading.": "Syncthing uueneb.",
|
||||
@@ -342,6 +377,7 @@
|
||||
"The Syncthing Authors": "Syncthingi autorid",
|
||||
"The Syncthing admin interface is configured to allow remote access without a password.": "Syncthingi haldusliides on seadistatud lubamaks ligipääsu ilma salasõnata.",
|
||||
"The aggregated statistics are publicly available at the URL below.": "Koondstatistika on avalikult saadaval järgneval lehel.",
|
||||
"The cleanup interval cannot be blank.": "Puhastamise välp ei saa jääda tühjaks.",
|
||||
"The device ID cannot be blank.": "Seadme tunnus ei tohi olla tühi.",
|
||||
"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.": "Krüptitud kasutusaruanne saadetakse kord päevas. Sellega peetakse arvet kasutatavate platvormide, rakenduste versioonide ja kaustade suuruste üle. Kui varemteatatud andmekogu muutub, siis sa näed seda vaadet uuesti.",
|
||||
"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.": "Seadme tunnus ei tundu olema korrektne. Ta peaks olema 52 või 56 märki pikk, kus leidub vaid numbreid ja tähemärke ning võib olla ka tühikuid ja kriipse.",
|
||||
@@ -349,6 +385,9 @@
|
||||
"The folder ID must be unique.": "Kausta ID peab olema unikaalne.",
|
||||
"The folder path cannot be blank.": "Kausta asukoht ei tohi olla tühi.",
|
||||
"The following items could not be synchronized.": "Järgnevaid üksusi ei õnnestunud sünkroniseerida.",
|
||||
"The following items were changed locally.": "Järgnevad objektid on muudetud kohalikus seadmes.",
|
||||
"The following unexpected items were found.": "Leidus järgmisi ootamatuid objekte.",
|
||||
"The interval must be a positive number of seconds.": "Välp peab olema positiivne täisarv sekundites.",
|
||||
"The maximum age must be a number and cannot be blank.": "Maksimaalne vanus peab olema arv ning ei tohi olla tühi.",
|
||||
"The number of connections must be a non-negative number.": "Ühenduste arv peab olema nullist suurem number.",
|
||||
"The number of days must be a number and cannot be blank.": "Päevade arv peab olema number ega tohi jääda tühjaks.",
|
||||
@@ -356,6 +395,9 @@
|
||||
"The number of old versions to keep, per file.": "Alleshoitavate faili vanade versioonide arv.",
|
||||
"The number of versions must be a number and cannot be blank.": "Versioonide arv peab olema number ega tohi jääda tühjaks.",
|
||||
"The path cannot be blank.": "Asukoht ei saa jääda tühjaks.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Kiiruspiirang peab olema positiivne täisarv (0 tähendab piirangu puudumist)",
|
||||
"The remote device has not accepted sharing this folder.": "Kaugseade pole selle kausta sünkroonimisega nõustunud.",
|
||||
"The remote device has paused this folder.": "Kaugseade on peatanud selle kausta sünkroonimise.",
|
||||
"There are no devices to share this folder with.": "Pole ühtegi seadet, millega saaks seda kausta jagada.",
|
||||
"There are no file versions to restore.": "Pole ühtegi taastatavat failiversiooni.",
|
||||
"There are no folders to share with this device.": "Pole ühtegi kausta, mida selle seadmega jagada.",
|
||||
@@ -366,10 +408,14 @@
|
||||
"Time the item was last modified": "Aeg, millal objekti viimati muudeti",
|
||||
"Today": "Täna",
|
||||
"Trash Can": "Prügikast",
|
||||
"Trash Can File Versioning": "Prügikastifailide versioonihaldus",
|
||||
"Type": "Tüüp",
|
||||
"UNIX Permissions": "UNIX-i õigused",
|
||||
"Unavailable": "Pole saadaval",
|
||||
"Unavailable/Disabled by administrator or maintainer": "Pole saadaval või haldaja/peakasutaja poolt keelatud",
|
||||
"Undecided (will prompt)": "Määratlemata (kuulub üleküsimisele)",
|
||||
"Unexpected Items": "Ootamatud ja plaanivälised objektid",
|
||||
"Unexpected items have been found in this folder.": "Selles kaustas leidus ootamatuid objekte.",
|
||||
"Unignore": "Lõpeta eiramine",
|
||||
"Unknown": "Teadmata",
|
||||
"Unshared": "Pole jagatud",
|
||||
@@ -383,10 +429,15 @@
|
||||
"Upgrading": "Uuendan",
|
||||
"Upload Rate": "Üleslaadimise kiirus",
|
||||
"Uptime": "Kasulik tööaeg",
|
||||
"Usage reporting is always enabled for candidate releases.": "Kandidaatversioonide puhul on kasutusaruannete saatmine alati sisse lülitatud.",
|
||||
"Use HTTPS for GUI": "Kasuta HTTPS'i GUI jaoks",
|
||||
"User": "Kasutaja",
|
||||
"User Home": "Kasutaja kodukaust",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Kasutajaliidese autentimiseks pole lisatud kasutajanime ja salasõna. Me soovitame, et kindlasti teed seda.",
|
||||
"Using a QUIC connection over LAN": "Kasutades QUIC-ühendust kohtvõrgus",
|
||||
"Using a QUIC connection over WAN": "Kasutades QUIC-ühendust laivõrgus",
|
||||
"Using a direct TCP connection over LAN": "Kasutades TCP otseühendust kohtvõrgus",
|
||||
"Using a direct TCP connection over WAN": "Kasutades TCP otseühendust kaugvõrgus",
|
||||
"Version": "Versioon",
|
||||
"Versions": "Versioonid",
|
||||
"Versions Path": "Versioonide asukoht",
|
||||
@@ -424,5 +475,6 @@
|
||||
},
|
||||
"unknown device": "tundmatu seade",
|
||||
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} soovib jagada kausta \"{{folder}}\".",
|
||||
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} soovib jagada kausta \"{{folderlabel}}\" ({{folder}})."
|
||||
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} soovib jagada kausta \"{{folderlabel}}\" ({{folder}}).",
|
||||
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} võib selle seadme uuesti kokku viia."
|
||||
}
|
||||
|
||||
@@ -372,7 +372,7 @@
|
||||
"Show detailed listener status": "Afficher l'état détaillé de l'écouteur",
|
||||
"Show diff with previous version": "Afficher les différences avec la version précédente",
|
||||
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Affiché à la place de l'ID de l'appareil dans l'état du groupe. Sera diffusé aux autres appareils comme nom convivial optionnel par défaut.",
|
||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Nom convivial local affiché à la place de l'ID de l'appareil dans la plupart des écrans. Si laissé vide, c'est le nom convivial local de l'appareil distant qui sera utilisé. (Modifiable ultérieurement).",
|
||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Nom convivial local affiché à la place de l'ID de l'appareil dans la plupart des écrans. Si laissé vide, c'est le nom convivial local de l'appareil distant qui sera utilisé dès que celui-ci sera en ligne. (Modifiable ultérieurement).",
|
||||
"Shut Down": "Arrêter",
|
||||
"Shutdown Complete": "Arrêt complet",
|
||||
"Simple": "Suivi simplifié",
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
// Copyright (C) 2025 The Syncthing Authors.
|
||||
//
|
||||
// This Source Code Form is subject to the terms of the Mozilla Public
|
||||
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
// You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
|
||||
package azureblob
|
||||
|
||||
import (
|
||||
"context"
|
||||
"io"
|
||||
"time"
|
||||
|
||||
stblob "github.com/syncthing/syncthing/internal/blob"
|
||||
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blob"
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/blockblob"
|
||||
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob/container"
|
||||
)
|
||||
|
||||
var _ stblob.Store = (*BlobStore)(nil)
|
||||
|
||||
type BlobStore struct {
|
||||
client *azblob.Client
|
||||
container string
|
||||
}
|
||||
|
||||
func NewBlobStore(accountName, accountKey, containerName string) (*BlobStore, error) {
|
||||
credential, err := azblob.NewSharedKeyCredential(accountName, accountKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
url := "https://" + accountName + ".blob.core.windows.net/"
|
||||
sc, err := azblob.NewClientWithSharedKeyCredential(url, credential, &azblob.ClientOptions{})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// This errors when the container already exists, which we ignore.
|
||||
_, _ = sc.CreateContainer(context.Background(), containerName, &container.CreateOptions{})
|
||||
return &BlobStore{
|
||||
client: sc,
|
||||
container: containerName,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (a *BlobStore) Upload(ctx context.Context, key string, data io.Reader) error {
|
||||
_, err := a.client.UploadStream(ctx, a.container, key, data, &blockblob.UploadStreamOptions{})
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *BlobStore) Download(ctx context.Context, key string, w stblob.Writer) error {
|
||||
resp, err := a.client.DownloadStream(ctx, a.container, key, &blob.DownloadStreamOptions{})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
_, err = io.Copy(w, resp.Body)
|
||||
return err
|
||||
}
|
||||
|
||||
func (a *BlobStore) LatestKey(ctx context.Context) (string, error) {
|
||||
opts := &azblob.ListBlobsFlatOptions{}
|
||||
pager := a.client.NewListBlobsFlatPager(a.container, opts)
|
||||
var latest string
|
||||
var lastModified time.Time
|
||||
for pager.More() {
|
||||
page, err := pager.NextPage(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
for _, blob := range page.Segment.BlobItems {
|
||||
if latest == "" || blob.Properties.LastModified.After(lastModified) {
|
||||
latest = *blob.Name
|
||||
lastModified = *blob.Properties.LastModified
|
||||
}
|
||||
}
|
||||
}
|
||||
return latest, nil
|
||||
}
|
||||
@@ -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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "STDISCOSRV" "1" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "STRELAYSRV" "1" "Jan 29, 2026" "v2.0.0" "Syncthing"
|
||||
.SH NAME
|
||||
strelaysrv \- Syncthing Relay Server
|
||||
.SH SYNOPSIS
|
||||
|
||||
@@ -28,7 +28,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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-BEP" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-CONFIG" "5" "Jan 29, 2026" "v2.0.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-config \- Syncthing Configuration
|
||||
.SH OVERVIEW
|
||||
|
||||
@@ -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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-EVENT-API" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-FAQ" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-LOCALDISCO" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-NETWORKING" "7" "Jan 29, 2026" "v2.0.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-networking \- Firewall Setup
|
||||
.SH ROUTER SETUP
|
||||
|
||||
@@ -28,7 +28,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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-RELAY" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-REST-API" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-SECURITY" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-STIGNORE" "5" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING-VERSIONING" "7" "Jan 29, 2026" "v2.0.0" "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" "Jan 25, 2026" "v2.0.0" "Syncthing"
|
||||
.TH "SYNCTHING" "1" "Jan 29, 2026" "v2.0.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing \- Syncthing
|
||||
.SH SYNOPSIS
|
||||
|
||||
Reference in New Issue
Block a user