Configuration files have been historically kept in /opt/csw/etc. There is consensus to migrate to a new location, /etc/opt/csw, for most configuration files, particularly ones that need to be machine local.
Incentives to move to /etc/opt/csw
- Have one single place for configuration files. Currently most packages use /opt/csw/etc, while some use /etc/opt/csw. This is confusing to people as they don't know where to look for configuration files (depends on the package).
- Support for shared, read-only /opt/csw directory. Two main cases are /opt/csw shared over NFS and sparse non-global zones, where /opt/csw is inherited from the global zone. System daemons such as CUPS or syslog-ng need writable directories (hence /var/opt/csw). Other pieces of software need different configurations for different zones (hence writable /etc/opt/csw).
The single file case
We're considering the case of a single configuration file foo.conf, which used to live in /opt/csw/etc and is about to be moved to /etc/opt/csw. The hypothetical sysadmin wants, if possible, to just upgrade the package and might not know about the configuration directory migration.
CSWbar before | CSWbar after |
---|---|
/opt/csw/etc/foo.conf | /etc/opt/csw/foo.conf |
# | Strategy | Example implementation(s) | Install passes | CSWbar works in the global zone | CSWbar works in sparse non-global zones | Edits to /opt/csw/etc/foo.conf work as previously | Gives an impression of supporting /opt/csw/etc | Guarantee that sysadmin knows |
---|---|---|---|---|---|---|---|---|
0. | No action | Yes | No | No | No | Yes | No | |
1. | Fail if /opt/csw/etc/foo.conf is present | preinstall | No | No | No | No | No | Yes |
2. | mv /opt/csw/etc/foo.conf /etc/opt/csw/foo.conf | Yes | Yes | No | No | No | No | |
3. | cp /opt/csw/etc/foo.conf /etc/opt/csw/foo.conf | Yes | Yes | Yes | No | Yes* | No | |
4. | ln -s ../../../opt/csw/etc/foo.conf /etc/opt/csw/foo.conf ** | postinstall | Yes | Yes | Yes | Yes | Yes* | No |
5. | mv /opt/csw/etc/foo.conf /opt/csw/etc/migration-archive && cp /opt/csw/etc/migration-archive/foo.conf /etc/opt/csw | postinstall cswmigrateconf | Yes | Yes | Yes | No | No | No |
* — Can be amended by placing signposts.
** — The option of linking the other way has also been considered, but it requires actions from point 5 and doesn't add anything.
Signposts
To make the sysadmin aware of the change, signposts in /opt/csw/etc could be placed. For instance:
# ls -l /opt/csw/etc/foo*
-rw-r--r-- 1 root root 4 Sep 1 15:36 /opt/csw/etc/foo.conf
-rw-r--r-- 1 root root 236 Sep 1 15:38 /opt/csw/etc/foo.conf.THIS_LOCATION_IS_DEPRECATED
# cat foo.conf.THIS_LOCATION_IS_DEPRECATED
This location (/opt/csw/etc) is deprecated.
Configuration files are currently being placed in /etc/opt/csw. Please make
sure your new configuration is in /etc/opt/csw and remove the old one from
/opt/csw/etc.
The complex case
There might be a complex case which cannot be reduced to a set of known configuration files. In such case, an attempt to migrate the configuration automatically is not a good idea. What should the package pre/postinstall scripts do? For instance:
- In the preinstall script, display information about the need to migrate the configuration
- pause for 10 seconds, allowing the user to abort the installation
- One of the two:
- proceed with the installation, using the new configuration files
- return non-zero exit code, therefore aborting the installation
There's an example implementation.
The topic is open for discussion on the mailing list.