github.com/mysteriumnetwork/node@v0.0.0-20240516044423-365054f76801/ci/util/device/loop.go (about) 1 /* 2 * Copyright (C) 2019 The "MysteriumNetwork/node" Authors. 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 package device 19 20 import ( 21 "strings" 22 23 "github.com/mysteriumnetwork/go-ci/shell" 24 "github.com/pkg/errors" 25 ) 26 27 // AttachLoop attaches system image to the first available loop device and returns its name 28 func AttachLoop(imageFilename string) (loopDevice string, err error) { 29 output, err := shell.NewCmdf("sudo /sbin/losetup --show --find --partscan %s", imageFilename).Output() 30 if err != nil { 31 return "", errors.Wrapf(err, "could not attach image to loop loopDevice, image: %s", imageFilename) 32 } 33 devices := strings.Split(output, "\n") 34 if len(devices) > 0 { 35 loopDevice = devices[0] 36 } 37 if loopDevice == "" { 38 return "", errors.New("loop loopDevice not found") 39 } 40 return loopDevice, nil 41 } 42 43 // DetachLoop detaches given loop device 44 func DetachLoop(loopDevice string) error { 45 err := shell.NewCmdf("sudo /sbin/losetup -d %s", loopDevice).Run() 46 return errors.Wrapf(err, "could not detach image from loop loopDevice %s", loopDevice) 47 }