diff --git a/cmd/incus/file.go b/cmd/incus/file.go index 8499c38a3e..19cbd040ad 100644 --- a/cmd/incus/file.go +++ b/cmd/incus/file.go @@ -845,7 +845,7 @@ func (c *cmdFilePush) Run(cmd *cobra.Command, args []string) error { } else { file, err = os.Open(f) if err != nil { - return err + return fmt.Errorf(i18n.G("Failed to open source file %q: %v"), f, err) } } diff --git a/cmd/incus/utils_sftp.go b/cmd/incus/utils_sftp.go index a7e60a0a4f..13f96be420 100644 --- a/cmd/incus/utils_sftp.go +++ b/cmd/incus/utils_sftp.go @@ -70,7 +70,7 @@ func sftpCreateFile(sftpConn *sftp.Client, targetPath string, args incus.Instanc case "file": file, err := sftpConn.OpenFile(targetPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC) if err != nil { - return err + return fmt.Errorf(i18n.G("Failed to open target file %q: %w"), targetPath, err) } defer func() { _ = file.Close() }() @@ -296,7 +296,7 @@ func sftpRecursivePushFile(sftpConn *sftp.Client, source string, target string, // File handling f, err := os.Open(p) if err != nil { - return err + return fmt.Errorf(i18n.G("Failed to open source file %q: %v"), p, err) } defer func() { _ = f.Close() }() diff --git a/cmd/incusd/api.go b/cmd/incusd/api.go index 72d0990262..aa8f957f23 100644 --- a/cmd/incusd/api.go +++ b/cmd/incusd/api.go @@ -18,10 +18,12 @@ import ( clusterRequest "github.com/lxc/incus/v6/internal/server/cluster/request" "github.com/lxc/incus/v6/internal/server/db" "github.com/lxc/incus/v6/internal/server/instance" + "github.com/lxc/incus/v6/internal/server/project" "github.com/lxc/incus/v6/internal/server/request" "github.com/lxc/incus/v6/internal/server/response" storagePools "github.com/lxc/incus/v6/internal/server/storage" "github.com/lxc/incus/v6/internal/server/storage/s3" + "github.com/lxc/incus/v6/internal/server/storage/s3/miniod" "github.com/lxc/incus/v6/shared/api" "github.com/lxc/incus/v6/shared/logger" "github.com/lxc/incus/v6/shared/util" @@ -264,20 +266,26 @@ func storageBucketsServer(d *Daemon) *http.Server { return } - pool, err := storagePools.LoadByName(s, bucket.PoolName) - if err != nil { - errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} - errResult.Response(w) + // Fast path. + minioProc, err := miniod.Get(project.StorageVolume(bucket.Project, bucket.Name)) + if minioProc == nil || err != nil { + // Slow path. + logger.Errorf("auth slow") + pool, err := storagePools.LoadByName(s, bucket.PoolName) + if err != nil { + errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} + errResult.Response(w) - return - } + return + } - minioProc, err := pool.ActivateBucket(bucket.Project, bucket.Name, nil) - if err != nil { - errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} - errResult.Response(w) + minioProc, err = pool.ActivateBucket(bucket.Project, bucket.Name, nil) + if err != nil { + errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} + errResult.Response(w) - return + return + } } u := minioProc.URL() @@ -344,20 +352,26 @@ func storageBucketsServer(d *Daemon) *http.Server { return } - pool, err := storagePools.LoadByName(s, bucket.PoolName) - if err != nil { - errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} - errResult.Response(w) + // Fast path. + minioProc, err := miniod.Get(project.StorageVolume(bucket.Project, bucket.Name)) + if minioProc == nil || err != nil { + // Slow path. + logger.Errorf("anon slow") + pool, err := storagePools.LoadByName(s, bucket.PoolName) + if err != nil { + errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} + errResult.Response(w) - return - } + return + } - minioProc, err := pool.ActivateBucket(bucket.Project, bucket.Name, nil) - if err != nil { - errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} - errResult.Response(w) + minioProc, err = pool.ActivateBucket(bucket.Project, bucket.Name, nil) + if err != nil { + errResult := s3.Error{Code: s3.ErrorCodeInternalError, Message: err.Error()} + errResult.Response(w) - return + return + } } u := minioProc.URL() diff --git a/doc/authorization.md b/doc/authorization.md index 7f35ee4bcf..ae325a1df5 100644 --- a/doc/authorization.md +++ b/doc/authorization.md @@ -31,9 +31,11 @@ This authorization method is highly granular. For example, it can be used to restrict user access to a single instance. To use OpenFGA for authorization, you must configure and run an OpenFGA server yourself. -To enable this authorization method in Incus, set the [`openfga.*`](server-options-openfga) server configuration options. Incus will connect to the OpenFGA server, write the {ref}`openfga-model`, and query this server for authorization for all subsequent requests. +To enable this authorization method in Incus, set the [`openfga.*`](server-options-openfga) server configuration options. +Both `openfga.api.url` and `openfga.api.token` must be set in order to enable OpenFGA. `openfga.store.id` is optional, Incus will generate a new store if not specified. + (openfga-model)= ### OpenFGA model diff --git a/doc/howto/network_bridge_firewalld.md b/doc/howto/network_bridge_firewalld.md index f814e5979d..e30d19ecba 100644 --- a/doc/howto/network_bridge_firewalld.md +++ b/doc/howto/network_bridge_firewalld.md @@ -129,12 +129,6 @@ Enable IPv4 forwarding Incus bridge networks enable this setting normally. However, if Incus starts after Docker, then Docker will already have modified the global FORWARD policy. - ```{warning} - Enabling IPv4 forwarding can cause your Docker container ports to be reachable from any machine on your local network. - Depending on your environment, this might be undesirable. - See [local network container access issue](https://github.com/moby/moby/issues/14041) for more information. - ``` - To enable IPv4 forwarding before Docker starts, ensure that the following `sysctl` setting is enabled: net.ipv4.conf.all.forwarding=1 diff --git a/go.mod b/go.mod index e4c615cd6b..dcf1d20e69 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/jochenvg/go-udev v0.0.0-20240801134859-b65ed646224b github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/lxc/go-lxc v0.0.0-20240606200241-27b3d116511f - github.com/lxc/incus-os/incus-osd v0.0.0-20251214161835-4ccb835533a9 + github.com/lxc/incus-os/incus-osd v0.0.0-20251218211512-30e9f64eb91b github.com/mattn/go-colorable v0.1.14 github.com/mattn/go-sqlite3 v1.14.32 github.com/mdlayher/arp v0.0.0-20220512170110-6706a2966875 @@ -44,7 +44,7 @@ require ( github.com/openfga/go-sdk v0.7.3 github.com/osrg/gobgp/v3 v3.37.0 github.com/ovn-kubernetes/libovsdb v0.8.1 - github.com/pierrec/lz4/v4 v4.1.22 + github.com/pierrec/lz4/v4 v4.1.23 github.com/pkg/sftp v1.13.10 github.com/pkg/xattr v0.4.12 github.com/shirou/gopsutil/v4 v4.25.11 @@ -65,7 +65,7 @@ require ( golang.org/x/tools v0.40.0 google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v2 v2.4.0 - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 + k8s.io/utils v0.0.0-20251218160917-61b37f7a4624 software.sslmate.com/src/go-pkcs12 v0.6.0 ) diff --git a/go.sum b/go.sum index 902c44b8b1..99f8af3d9d 100644 --- a/go.sum +++ b/go.sum @@ -359,8 +359,8 @@ github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3 h1:PwQumkgq4/acIi github.com/lufia/plan9stats v0.0.0-20251013123823-9fd1530e3ec3/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/lxc/go-lxc v0.0.0-20240606200241-27b3d116511f h1:KnZqnn4R9Ae+jOK7DwacF1CnWEBMSwoXh44owa6j6k4= github.com/lxc/go-lxc v0.0.0-20240606200241-27b3d116511f/go.mod h1:3UTWXVcHfgxE7JM4ZUnsy6bDA8L1vuzwJbJRF6dlB90= -github.com/lxc/incus-os/incus-osd v0.0.0-20251214161835-4ccb835533a9 h1:KqkDoboTSap+45qapJ79hBFl/Q+yEIC1Xmk2ec5xsvk= -github.com/lxc/incus-os/incus-osd v0.0.0-20251214161835-4ccb835533a9/go.mod h1:Qlo0FoofzFoBzsX13wkrm9Mf6Ri+gAl/mCtXrXFwcqU= +github.com/lxc/incus-os/incus-osd v0.0.0-20251218211512-30e9f64eb91b h1:C90OBrUIm0rF0/j5Pt1npAhniYzbU9mjT2qqH8MUbns= +github.com/lxc/incus-os/incus-osd v0.0.0-20251218211512-30e9f64eb91b/go.mod h1:3N+YX6pJCi+K8xkXc/9MW+NMvIkJ24JvTQIi28ctoGs= github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -446,8 +446,6 @@ github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJw github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opencontainers/runtime-spec v1.3.0 h1:YZupQUdctfhpZy3TM39nN9Ika5CBWT5diQ8ibYCRkxg= github.com/opencontainers/runtime-spec v1.3.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/umoci v0.6.0 h1:Dsm4beJpglN5y2E2EUSZZcNey4Ml4+nKepvwLQwgIec= -github.com/opencontainers/umoci v0.6.0/go.mod h1:2DS3cxVN9pRJGYaCK5mnmmwVKV5vd9r6HIYAV0IvdbI= github.com/opencontainers/umoci v0.6.1-0.20251213054154-70fc5ee1f4df h1:9hvwN64VeuL1L0Jgp8bxTPmd5IZQoHmeXGWrVqsEhN0= github.com/opencontainers/umoci v0.6.1-0.20251213054154-70fc5ee1f4df/go.mod h1:s6d/s4QJAZTF92hEU6ozuHjE0+VRc6kVe1QIWfvL7KY= github.com/openfga/go-sdk v0.7.3 h1:BrYmJyIdicVeKzoycCFT0vzf0oz4luWrwoPIJdF6Wgo= @@ -464,8 +462,8 @@ github.com/peterh/liner v1.2.1/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf github.com/philhofer/fwd v1.2.0 h1:e6DnBTl7vGY+Gz322/ASL4Gyp1FspeMvx1RNDoToZuM= github.com/philhofer/fwd v1.2.0/go.mod h1:RqIHx9QI14HlwKwm98g9Re5prTQ6LdeRQn+gXJFxsJM= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -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/pierrec/lz4/v4 v4.1.23 h1:oJE7T90aYBGtFNrI8+KbETnPymobAhzRrR8Mu8n1yfU= +github.com/pierrec/lz4/v4 v4.1.23/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4= github.com/pkg/diff v0.0.0-20200914180035-5b29258ca4f7/go.mod h1:zO8QMzTeZd5cpnIkz/Gn6iK0jDfGicM1nynOkkPIl28= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1016,8 +1014,8 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20251218160917-61b37f7a4624 h1:wadElzGW3vTZ1Et18CImPEErLaXvMSU5369b0to32+0= +k8s.io/utils v0.0.0-20251218160917-61b37f7a4624/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= moul.io/http2curl/v2 v2.3.0 h1:9r3JfDzWPcbIklMOs2TnIFzDYvfAZvjeavG6EzP7jYs= moul.io/http2curl/v2 v2.3.0/go.mod h1:RW4hyBjTWSYDOxapodpNEtX0g5Eb16sxklBqmd2RHcE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= diff --git a/internal/server/network/ovn/ovn_nb_actions.go b/internal/server/network/ovn/ovn_nb_actions.go index 9e9c4c49fa..6d3d7060c7 100644 --- a/internal/server/network/ovn/ovn_nb_actions.go +++ b/internal/server/network/ovn/ovn_nb_actions.go @@ -17,6 +17,7 @@ import ( "github.com/lxc/incus/v6/internal/iprange" ovnNB "github.com/lxc/incus/v6/internal/server/network/ovn/schema/ovn-nb" ovnSB "github.com/lxc/incus/v6/internal/server/network/ovn/schema/ovn-sb" + localUtil "github.com/lxc/incus/v6/internal/server/util" "github.com/lxc/incus/v6/shared/util" ) @@ -2140,6 +2141,7 @@ func (o *NB) UpdateLogicalSwitchPortDNS(ctx context.Context, switchName OVNSwitc } dnsIPsStr.WriteString(dnsIP.String()) + dnsRecord.Records[strings.TrimSuffix(localUtil.ReverseDNS(dnsIP), ".")] = strings.ToLower(dnsName) } dnsRecord.Records[strings.ToLower(dnsName)] = dnsIPsStr.String() diff --git a/internal/server/network/zone/zone.go b/internal/server/network/zone/zone.go index 47e0883068..99d6930c8f 100644 --- a/internal/server/network/zone/zone.go +++ b/internal/server/network/zone/zone.go @@ -435,8 +435,8 @@ func (d *zone) Content() (*strings.Builder, error) { includeV6 := includeNAT || util.IsFalseOrEmpty(netConfig["ipv6.nat"]) // Check if dealing with a reverse zone. - isReverse4 := strings.HasSuffix(d.info.Name, ip4Arpa) - isReverse6 := strings.HasSuffix(d.info.Name, ip6Arpa) + isReverse4 := strings.HasSuffix(d.info.Name, localUtil.IPv4Arpa) + isReverse6 := strings.HasSuffix(d.info.Name, localUtil.IPv6Arpa) isReverse := isReverse4 || isReverse6 genRecord := func(name string, ip net.IP) map[string]string { @@ -473,7 +473,7 @@ func (d *zone) Content() (*strings.Builder, error) { } // Get the ARPA record. - reverseAddr := reverse(ip) + reverseAddr := localUtil.ReverseDNS(ip) if reverseAddr == "" { return nil } diff --git a/internal/server/storage/backend.go b/internal/server/storage/backend.go index 049de54228..31cf2c7a95 100644 --- a/internal/server/storage/backend.go +++ b/internal/server/storage/backend.go @@ -2702,6 +2702,10 @@ func (b *backend) BackupInstance(inst instance.Instance, tarWriter *instancewrit return err } + defer func() { + _ = b.UpdateInstanceBackupFile(inst, true, nil) + }() + var snapNames []string if snapshots { // Get snapshots in age order, oldest first, and pass names to storage driver. diff --git a/internal/server/storage/drivers/driver_linstor_volumes.go b/internal/server/storage/drivers/driver_linstor_volumes.go index 69f9cc49f6..2b21435e47 100644 --- a/internal/server/storage/drivers/driver_linstor_volumes.go +++ b/internal/server/storage/drivers/driver_linstor_volumes.go @@ -418,22 +418,7 @@ func (d *linstor) CreateVolumeFromCopy(vol Volume, srcVol Volume, copySnapshots } if len(srcSnapshots) > 0 { - l.Debug("Snapshots copying required. Falling back to generic copy implementation") - // Ensure the mount path for ISO volumes is created when using the generic - // copy implementation. This is needed because genericVFSCopyVolume treats - // ISO volumes like filesystem volumes when performing the copy. This implies - // that the mount path for the volume must exist before the copying starts. - if srcVol.contentType == ContentTypeISO { - err := srcVol.EnsureMountPath(false) - if err != nil { - return err - } - - rev.Add(func() { _ = os.Remove(vol.MountPath()) }) - } - - // TODO: support optimized copying with snapshots - return genericVFSCopyVolume(d, nil, vol, srcVol, srcSnapshots, false, allowInconsistent, op) + return errors.New("Linstor doesn't currently support copying volumes with their snapshots") } } diff --git a/internal/server/network/zone/reverse.go b/internal/server/util/dns.go similarity index 64% rename from internal/server/network/zone/reverse.go rename to internal/server/util/dns.go index 2b4b80fb89..0d4093ac6a 100644 --- a/internal/server/network/zone/reverse.go +++ b/internal/server/util/dns.go @@ -1,28 +1,31 @@ -package zone +package util import ( "net" ) // Zone suffixes. -var ( - ip4Arpa = ".in-addr.arpa" - ip6Arpa = ".ip6.arpa" +const ( + // IPv4Arpa represents the IPv4 reverse DNS suffix. + IPv4Arpa = ".in-addr.arpa" + + // IPv6Arpa represents the IPv6 reverse DNS suffix. + IPv6Arpa = ".ip6.arpa" ) -// reverse takes an IPv4 or IPv6 address and returns the matching ARPA record. -func reverse(ip net.IP) (arpa string) { +// ReverseDNS takes an IPv4 or IPv6 address and returns the matching ARPA record. +func ReverseDNS(ip net.IP) (arpa string) { if ip == nil { return "" } // Deal with IPv4. if ip.To4() != nil { - return uitoa(uint(ip[15])) + "." + uitoa(uint(ip[14])) + "." + uitoa(uint(ip[13])) + "." + uitoa(uint(ip[12])) + ip4Arpa + "." + return uitoa(uint(ip[15])) + "." + uitoa(uint(ip[14])) + "." + uitoa(uint(ip[13])) + "." + uitoa(uint(ip[12])) + IPv4Arpa + "." } // Deal with IPv6. - buf := make([]byte, 0, len(ip)*4+len(ip6Arpa)) + buf := make([]byte, 0, len(ip)*4+len(IPv6Arpa)) // Add it, in reverse, to the buffer. for i := len(ip) - 1; i >= 0; i-- { @@ -34,7 +37,7 @@ func reverse(ip net.IP) (arpa string) { } // Add the suffix. - buf = append(buf, ip6Arpa[1:]+"."...) + buf = append(buf, IPv6Arpa[1:]+"."...) return string(buf) } diff --git a/po/de.po b/po/de.po index 4134c7f054..fb18250dd0 100644 --- a/po/de.po +++ b/po/de.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 03:44+0000\n" "Last-Translator: Dklfajsjfi49wefklsf32 " "\n" @@ -3510,6 +3510,16 @@ msgstr "Akzeptiere Zertifikat" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Akzeptiere Zertifikat" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Akzeptiere Zertifikat" + #: cmd/incus/admin_sql.go:128 #, fuzzy, c-format msgid "Failed to parse dump response: %w" diff --git a/po/es.po b/po/es.po index 2ce13425fc..2346e987cb 100644 --- a/po/es.po +++ b/po/es.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 04:04+0000\n" "Last-Translator: Jorge Teixeira \n" "Language-Team: Spanish \n" @@ -3317,6 +3317,16 @@ msgstr "Acepta certificado" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Acepta certificado" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Acepta certificado" + #: cmd/incus/admin_sql.go:128 #, fuzzy, c-format msgid "Failed to parse dump response: %w" diff --git a/po/fr.po b/po/fr.po index 35f2209645..79f8cc1d4c 100644 --- a/po/fr.po +++ b/po/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 04:18+0000\n" "Last-Translator: Varlorg \n" "Language-Team: French \n" @@ -3538,6 +3538,16 @@ msgstr "Échec de la mise en écoute des demandes de connexion : %w" msgid "Failed to load configuration: %s" msgstr "Échec du chargement de la configuration : %s" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Échec de la fermeture du fichier de certificat du serveur %q : %w" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Échec de la fermeture du fichier de certificat du serveur %q : %w" + #: cmd/incus/admin_sql.go:128 #, fuzzy, c-format msgid "Failed to parse dump response: %w" diff --git a/po/id.po b/po/id.po index 545d3dd040..17e8e471c0 100644 --- a/po/id.po +++ b/po/id.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: incus\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 05:19+0000\n" "Last-Translator: Andika Triwidada \n" "Language-Team: Indonesian \n" "Language-Team: LANGUAGE \n" @@ -2615,6 +2615,16 @@ msgstr "" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, c-format +msgid "Failed to open source file %q: %v" +msgstr "" + +#: cmd/incus/utils_sftp.go:73 +#, c-format +msgid "Failed to open target file %q: %w" +msgstr "" + #: cmd/incus/admin_sql.go:128 #, c-format msgid "Failed to parse dump response: %w" diff --git a/po/it.po b/po/it.po index f0bb7fc81f..032618616c 100644 --- a/po/it.po +++ b/po/it.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 04:26+0000\n" "Last-Translator: Alberto Donato \n" "Language-Team: Italian \n" @@ -3308,6 +3308,16 @@ msgstr "Accetta certificato" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Accetta certificato" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Accetta certificato" + #: cmd/incus/admin_sql.go:128 #, fuzzy, c-format msgid "Failed to parse dump response: %w" diff --git a/po/ja.po b/po/ja.po index 281af46bf8..3510880669 100644 --- a/po/ja.po +++ b/po/ja.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: LXD\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-12-14 16:01+0000\n" "Last-Translator: KATOH Yasufumi \n" "Language-Team: Japanese \n" @@ -3359,6 +3359,16 @@ msgstr "コネクションのリッスンに失敗しました: %w" msgid "Failed to load configuration: %s" msgstr "設定のロードに失敗しました: %s" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "サーバー証明書ファイル %q のクローズに失敗しました: %w" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "サーバー証明書ファイル %q のクローズに失敗しました: %w" + #: cmd/incus/admin_sql.go:128 #, c-format msgid "Failed to parse dump response: %w" diff --git a/po/nb_NO.po b/po/nb_NO.po index 00ebb12401..71b0827bc1 100644 --- a/po/nb_NO.po +++ b/po/nb_NO.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: incus\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 05:18+0000\n" "Last-Translator: Daniel Dybing \n" "Language-Team: Norwegian Bokmål \n" @@ -3293,6 +3293,16 @@ msgstr "" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, c-format +msgid "Failed to open source file %q: %v" +msgstr "" + +#: cmd/incus/utils_sftp.go:73 +#, c-format +msgid "Failed to open target file %q: %w" +msgstr "" + #: cmd/incus/admin_sql.go:128 #, c-format msgid "Failed to parse dump response: %w" diff --git a/po/pt.po b/po/pt.po index a8b74423e3..de82c880d0 100644 --- a/po/pt.po +++ b/po/pt.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: incus\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-12-18 19:00+0000\n" "Last-Translator: Américo Monteiro \n" "Language-Team: Portuguese \n" "Language-Team: Portuguese (Brazil) \n" "Language-Team: Russian \n" @@ -3352,6 +3352,16 @@ msgstr "Принять сертификат" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Принять сертификат" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Принять сертификат" + #: cmd/incus/admin_sql.go:128 #, fuzzy, c-format msgid "Failed to parse dump response: %w" diff --git a/po/sv.po b/po/sv.po index b2bb6859f8..f04b5c2a4f 100644 --- a/po/sv.po +++ b/po/sv.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: incus\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-12-07 15:00+0000\n" "Last-Translator: Daniel Nylander \n" "Language-Team: Swedish \n" @@ -3373,6 +3373,16 @@ msgstr "Misslyckades med att lyssna efter anslutning: %w" msgid "Failed to load configuration: %s" msgstr "Konfigurationen kunde inte läsas in: %s" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, fuzzy, c-format +msgid "Failed to open source file %q: %v" +msgstr "Det gick inte att stänga servercertifikatfilen %q: %w" + +#: cmd/incus/utils_sftp.go:73 +#, fuzzy, c-format +msgid "Failed to open target file %q: %w" +msgstr "Det gick inte att stänga servercertifikatfilen %q: %w" + #: cmd/incus/admin_sql.go:128 #, c-format msgid "Failed to parse dump response: %w" diff --git a/po/ta.po b/po/ta.po index aff5d4dbe1..464205ce1b 100644 --- a/po/ta.po +++ b/po/ta.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: incus\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-10-21 05:21+0000\n" "Last-Translator: Anonymous \n" "Language-Team: Tamil \n" @@ -2969,6 +2969,16 @@ msgstr "" msgid "Failed to load configuration: %s" msgstr "" +#: cmd/incus/file.go:848 cmd/incus/utils_sftp.go:299 +#, c-format +msgid "Failed to open source file %q: %v" +msgstr "" + +#: cmd/incus/utils_sftp.go:73 +#, c-format +msgid "Failed to open target file %q: %w" +msgstr "" + #: cmd/incus/admin_sql.go:128 #, c-format msgid "Failed to parse dump response: %w" diff --git a/po/zh_Hans.po b/po/zh_Hans.po index 65a1e6c71c..afcf113e57 100644 --- a/po/zh_Hans.po +++ b/po/zh_Hans.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: lxd\n" "Report-Msgid-Bugs-To: lxc-devel@lists.linuxcontainers.org\n" -"POT-Creation-Date: 2025-12-18 23:24-0500\n" +"POT-Creation-Date: 2025-12-19 03:30-0500\n" "PO-Revision-Date: 2025-12-11 16:00+0000\n" "Last-Translator: yooadmin \n" "Language-Team: Chinese (Simplified Han script) \n" "Language-Team: Chinese (Traditional Han script) SKIP: Linstor can't currently handle copies with snapshots" && return + ensure_import_testimage ensure_has_localhost_remote "${INCUS_ADDR}" diff --git a/test/suites/migration.sh b/test/suites/migration.sh index 87c642cce5..cfc823e173 100644 --- a/test/suites/migration.sh +++ b/test/suites/migration.sh @@ -1,4 +1,7 @@ test_migration() { + # shellcheck disable=2153 + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return + # setup a second Incus # shellcheck disable=2039,3043 local INCUS2_DIR INCUS2_ADDR incus_backend diff --git a/test/suites/snapshots.sh b/test/suites/snapshots.sh index 156a3af39b..8f306b3e60 100644 --- a/test/suites/snapshots.sh +++ b/test/suites/snapshots.sh @@ -1,4 +1,7 @@ test_snapshots() { + # shellcheck disable=2153 + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return + snapshots if [ "$(storage_backend "$INCUS_DIR")" = "lvm" ]; then @@ -97,6 +100,7 @@ snapshots() { } test_snap_restore() { + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return snap_restore if [ "$(storage_backend "$INCUS_DIR")" = "lvm" ]; then @@ -315,6 +319,9 @@ restore_and_compare_fs() { } test_snap_expiry() { + # shellcheck disable=2153 + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return + # shellcheck disable=2039,3043 local incus_backend incus_backend=$(storage_backend "$INCUS_DIR") @@ -341,6 +348,9 @@ test_snap_expiry() { } test_snap_schedule() { + # shellcheck disable=2153 + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return + # shellcheck disable=2039,3043 local incus_backend incus_backend=$(storage_backend "$INCUS_DIR") diff --git a/test/suites/storage_local_volume_handling.sh b/test/suites/storage_local_volume_handling.sh index f3baed63b7..d72a20e643 100644 --- a/test/suites/storage_local_volume_handling.sh +++ b/test/suites/storage_local_volume_handling.sh @@ -1,4 +1,7 @@ test_storage_local_volume_handling() { + # shellcheck disable=2153 + [ "${INCUS_BACKEND}" = "linstor" ] && echo "==> SKIP: Linstor can't currently handle copies with snapshots" && return + ensure_import_testimage # shellcheck disable=2039,3043