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|
|#||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|
|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.
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.