cancel
Showing results for 
Search instead for 
Did you mean: 
SOLVED

Reading and writing configuration files

Reading and writing configuration files

jand
Member

If my understanding is correct the solutions snap should be used to read and write configuration files. I'm trying to do this in Go, and have added the "active-solution" plug to my snapcraft.yml

plugs:
  active-solution:
    interface: content
    content: solutions
    target: $SNAP_COMMON/solutions

My code is checking if the directory and file exists, and creates them if not. Creating seems to work, but reading the file results in the following error:

Could not read configuration file: open /var/snap/rexroth-solutions/common/solutions/DefaultSolution/configurations/Default/my-snap/config.json: permission denied

Trying to view the created directory from the sidebar in the Configurations menu of the virtual control shows this error:

open /var/snap/rexroth-solutions/common/solutions/DefaultSolution/configurations/Default/my-snap: permission denied

This is the Go source code, any ideas what permissions need to be changed when creating the configuration directory and file?

type Config struct {
	Greeting string `json:"greeting"`
}
snapCommon := os.Getenv("SNAP_COMMON")
activeConfiguration := path.Join(snapCommon, "/solutions/activeConfiguration")
resolvedPath, err := os.Readlink(activeConfiguration)
if err != nil {
	log.Fatalln("Could not resolve active configuration path: ", err)
}
configurationPath := path.Join(resolvedPath, "/my-snap")
if _, err := os.Stat(configurationPath); os.IsNotExist(err) {
	os.Mkdir(configurationPath, os.ModeDir)
}
configurationFile := path.Join(configurationPath, "/config.json")
if _, err := os.Stat(configurationFile); os.IsNotExist(err) {
	file, err := json.MarshalIndent(Config{Greeting: "Hello World"}, "", "  ")
	if err != nil {
		log.Fatalln("Could not write default configuration file: ", err)
	}

	ioutil.WriteFile(configurationFile, file, 0644)
}
config := Config{}
file, err := ioutil.ReadFile(configurationFile)
if err != nil {
	log.Fatalln("Could not read configuration file: ", err)
}
err = json.Unmarshal([]byte(file), &config)
if err != nil {
	log.Fatalln("Could not parse configuration file: ", err)
}

 

1 REPLY 1

andreashein
New Poster

hi jand,

I guess that the problems you are observing are related to the resolvedPath. os.Readlink obviously returns the absolute path to the rexroth-solutions snap, which can’t be accessed from outside.

As you are using this path as a base path for configurationPath and configurationFile, os.Mkdir and ioutil.WriteFile won’t probably work either (you just don’t check for errors here).

Instead of the resolvedPath, use the path you have already assigned to the activeConfiguration variable. This path addresses the rexroth-solutions snap through the solutions slot, which should work as expected.

hope this helps,

Andreas

Icon--AD-black-48x48Icon--address-consumer-data-black-48x48Icon--appointment-black-48x48Icon--back-left-black-48x48Icon--calendar-black-48x48Icon--center-alignedIcon--Checkbox-checkIcon--clock-black-48x48Icon--close-black-48x48Icon--compare-black-48x48Icon--confirmation-black-48x48Icon--dealer-details-black-48x48Icon--delete-black-48x48Icon--delivery-black-48x48Icon--down-black-48x48Icon--download-black-48x48Ic-OverlayAlertIcon--externallink-black-48x48Icon-Filledforward-right_adjustedIcon--grid-view-black-48x48IC_gd_Check-Circle170821_Icons_Community170823_Bosch_Icons170823_Bosch_Icons170821_Icons_CommunityIC-logout170821_Icons_Community170825_Bosch_Icons170821_Icons_CommunityIC-shopping-cart2170821_Icons_CommunityIC-upIC_UserIcon--imageIcon--info-i-black-48x48Icon--left-alignedIcon--Less-minimize-black-48x48Icon-FilledIcon--List-Check-grennIcon--List-Check-blackIcon--List-Cross-blackIcon--list-view-mobile-black-48x48Icon--list-view-black-48x48Icon--More-Maximize-black-48x48Icon--my-product-black-48x48Icon--newsletter-black-48x48Icon--payment-black-48x48Icon--print-black-48x48Icon--promotion-black-48x48Icon--registration-black-48x48Icon--Reset-black-48x48Icon--right-alignedshare-circle1Icon--share-black-48x48Icon--shopping-bag-black-48x48Icon-shopping-cartIcon--start-play-black-48x48Icon--store-locator-black-48x48Ic-OverlayAlertIcon--summary-black-48x48tumblrIcon-FilledvineIc-OverlayAlertwhishlist