github.com/crowdsecurity/crowdsec@v1.6.1/pkg/cwhub/itemlink.go (about) 1 package cwhub 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 ) 8 9 // createInstallLink creates a symlink between the actual config file at hub.HubDir and hub.ConfigDir. 10 func (i *Item) createInstallLink() error { 11 dest, err := i.installPath() 12 if err != nil { 13 return err 14 } 15 16 destDir := filepath.Dir(dest) 17 if err = os.MkdirAll(destDir, os.ModePerm); err != nil { 18 return fmt.Errorf("while creating %s: %w", destDir, err) 19 } 20 21 if _, err = os.Lstat(dest); !os.IsNotExist(err) { 22 i.hub.logger.Infof("%s already exists.", dest) 23 return nil 24 } 25 26 src, err := i.downloadPath() 27 if err != nil { 28 return err 29 } 30 31 if err = os.Symlink(src, dest); err != nil { 32 return fmt.Errorf("while creating symlink from %s to %s: %w", src, dest, err) 33 } 34 35 return nil 36 } 37 38 // removeInstallLink removes the symlink to the downloaded content. 39 func (i *Item) removeInstallLink() error { 40 syml, err := i.installPath() 41 if err != nil { 42 return err 43 } 44 45 stat, err := os.Lstat(syml) 46 if err != nil { 47 return err 48 } 49 50 // if it's managed by hub, it's a symlink to csconfig.GConfig.hub.HubDir / ... 51 if stat.Mode()&os.ModeSymlink == 0 { 52 i.hub.logger.Warningf("%s (%s) isn't a symlink, can't disable", i.Name, syml) 53 return fmt.Errorf("%s isn't managed by hub", i.Name) 54 } 55 56 hubpath, err := os.Readlink(syml) 57 if err != nil { 58 return fmt.Errorf("while reading symlink: %w", err) 59 } 60 61 src, err := i.downloadPath() 62 if err != nil { 63 return err 64 } 65 66 if hubpath != src { 67 i.hub.logger.Warningf("%s (%s) isn't a symlink to %s", i.Name, syml, src) 68 return fmt.Errorf("%s isn't managed by hub", i.Name) 69 } 70 71 if err := os.Remove(syml); err != nil { 72 return fmt.Errorf("while removing symlink: %w", err) 73 } 74 75 i.hub.logger.Infof("Removed symlink [%s]: %s", i.Name, syml) 76 77 return nil 78 }