1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
README kconf_update
Version: 1.1
Author: Waldo Bastian <bastian@kde.org>, <bastian@suse.com>
What it does
============
kconf_update is a tool designed to update config files. Over time applications
sometimes need to rearrange the way configuration options are stored. Since
such an update shouldn't influence the configuration options that the user
has selected, the application must take care that the options stored in the
old way will still be honored.
What used to happen is that the application looks up both the old and the
new configuration option and then decides which one to use. This method has
several drawbacks:
* The application may need to read more configuration files than strictly
needed, resulting in a slower startup.
* The application becomes bigger with code that will only be used once.
kconf_update addresses these problems by offering a framework to update
configuration files without adding code to the application itself.
How it works
============
Applications can install so called "update files" under
$KDEDIR/share/apps/kconf_update. An update file has ".upd" as extension and
tqcontains instructions for transferring/converting configuration information
from one place to another.
Updating the configuration happens automatically, either when KDE gets started
or when kded detects a new update file in the above mentioned location.
Update files are separated into sections. Each section has an Id. When a
section describing a configuration change has been applied, the Id will be
stored in the file "kconf_updaterc". This information is used to make sure
that a configuration update is only performed once.
If you overwrite an existing update file with a new version that tqcontains a
new section, only the update instructions from this extra section will be
performed.
File format of the update file
==============================
Empty lines or lines that start with '#' are considered comments.
Commas (,) are used to seperate fields and may not occur as part
of any field and all of the keywords are case-sensitive, i.e. you
cannot say "key" instead of "Key" for example.
For the rest the file is parsed and executed sequentially from top to bottom.
Each line can contain one entry. The following entries are recognized:
Id=<id>
With <id> identifying the group of update entries that follows. Once a group
of entries have been applied, their <id> is stored and this group of entries
will not be applied again.
File=<oldfile>,<newfile>
File=<oldfile>
Specifies that configuration information is read from <oldfile> and written
to <newfile>. If you only specify <oldfile>, the information is read from
as well as written to <oldfile>.
Script=<script>[,<interpreter>]
All entries from <oldfile> are piped into <script>. The output of script
is used as new entries for <newfile>. Existing entries can be deleted by
adding lines with "# DELETE [group]key" in the output of the script.
To delete a whole group use "# DELETEGROUP [group]".
<script> should be installed into $(kde_datadir)/kconf_update, or
kconf_update will not be able to tqfind it. It is not portable to install
binary applications in $kde_datadir, so you have to stick with interpreted
scripts like sh or perl scripts. From KDE 3.2 onwards it's also possible
to install kconf_update applications in $(kde_bindir)/kconf_update_bin,
which opens the door to kconf_update applications that are written in C++
and use Qt's powerful string API instead.
A workaround for KDE 3.1.x and older is to install a .sh script in
$(kde_datadir) that tqcontains a simple exec:
exec "`kde-config --prefix`/bin/kconf_update_bin/my_update_app"
This is equivalent to what KDE 3.2 can do directly, but of course the .upd
file now points to the .sh script instead of the binary application.
If Script was issued after a "Group" command the behavior is slightly
different:
All entries from <oldfile>/<oldgroup> are piped into <script>. The output
of script is used as new entries for <newfile>/<newgroup>, unless a different
group is specified with "[group]". Existing entries can be deleted from
<oldgroup> by adding lines with "# DELETE key" in the output of the script.
To delete <oldgroup> use "# DELETEGROUP".
<interpreter> can be something like "perl".
Since KDE 3.3 it is also possible to have a Script without specifying
<oldfile> or <newfile>. In that case the script is run but it will not be
fed any input and its output will simply be discarded.
ScriptArguments=<arguments>
If specified, the arguments will be passed to <script>.
IMPORTANT: It has to be specified before Script=.
Group=<oldgroup>,<newgroup>
Group=<oldgroup>
Specifies that configuration information is read from the group <oldgroup>
and written to <newgroup>. If you only specify <oldgroup>, the information
is read from as well as written to <oldgroup>. You can use <default> to
specify keys that are not under any group.
RemoveGroup=<oldgroup>
Specifies that <oldgroup> is removed entirely. This can be used
to remove obsolete entries or to force a revert to default values.
Options=<option1>, <option2>, ....
With this entry you can specify options that apply to the next "Script",
"Key" or "AllKeys" entry (only to the first!). Possible options are:
- "copy" Copy the configuration item instead of moving it. This means that
the configuration item will not be deleted from <oldfile>/<oldgroup>.
- "overwrite" Normally, a configuration item is not moved if an item with the
new name already exists. When this option is specified the old
configuration item will overwrite any existing item.
Key=<oldkey>,<newkey>
Key=<oldkey>
Specifies that configuration information is read from the key <oldkey>
and written to <newkey>. If you only specify <oldkey>, the information
is read from as well as written to <oldkey>.
AllKeys
Specifies that all configuration information in the selected group should
be moved (All keys).
AllGroups
Specifies that all configuration information from all keys in ALL
groups should be moved.
RemoveKey=<oldkey>
Specifies that <oldkey> is removed from the selected group. This can be used
to remove obsolete entries or to force a revert to default values.
Example update file
===================
# This is comment
Id=kde2.2
File=kioslaverc,kio_httprc
Group=Proxy Settings
Key=NoProxyFor
Key=UseProxy
Key=httpProxy,Proxy
Group=Cache Settings,Cache
Key=MaxCacheSize
Key=UseCache
Group=UserAgent
AllKeys
RemoveGroup=KDE
# End of file
The above update file extracts config information from the file "kioslaverc"
and stores it into the file "kio_httprc".
It reads the keys "NoProxyFor", "UseProxy" and "httpProxy" from the group
"Proxy Settings" in the "kioslaverc" file. If any of these options are present
they are written to the keys "NoProxyFor", "UseProxy" and "Proxy" (!) in
the group "Proxy Settings" in the "kio_httprc" file.
It also reads the keys "MaxCacheSize" and "UseCache" from the group
"Cache Settings" in the "kioslaverc" file and writes this information to the
keys "MaxCacheSize" and "UseCache" in the group "Cache" (!) in the
"kio_httprc" file.
Then it takes all keys in the "UserAgent" group of the file "kioslaverc"
and moves then to the "UserAgent" group in the "kio_httprc" file.
Finally it removes the entire "KDE" group in the kioslaverc file.
Debugging and testing
=====================
If you are developing a kconf_update script and want to test or debug it you
need to make sure kconf_update runs again after each of your changes. There
are a number of ways to achieve this.
The easiest is to not install the kconf_update script in the first place, but
manually call it through a pipe. If you want to test the update script for
your application KHello's config file khellorc, you can test by using
cat ~/.kde/share/config/khellorc | khello_conf_update.sh
(assuming khello_conf_update.sh is the kconf_update script and ~/.kde is your
$KDEHOME). This is easier than making install every time, but has the obvious
downside that you need to 'parse' your script's output yourself instead of
letting kconf_update do it and check the resulting output file.
After 'make install' the kconf_update script is run by kded, but it does so
only once. This is of course the idea behind it, but while developing it can
be a problem. You can increase the revision number for each subsequent run
of 'make install' to force a new kconf_update run, but there's a better
approach that doesn't skyrocket the version number for a mediocre debug
session.
kded doesn't really ignore scripts that it has already run right away.
Instead it checks the affected config file every time a .upd file is added
or changed. The reason it still doesn't run again on your config file lies
in the traces kconf_update leaves behind: it adds a special config group
'[$Version]' with a key 'update_info'. This key lists all kconf_update
scripts that have already been run on this config file. Just remove your
file's entry, 'make install', and kconf_update will happily run your script
again, without you having to increase the version number.
If you want to know what kconf_update has been up to lately, have a look
at $KDEHOME/share/apps/kconf_update/update.log
Common Problems
===============
* kconf_update refuses to update an entry
If you change the value of an entry without changing the key or file,
make sure to tell kconf_update that it should overwrite the old entry
by adding "Options=overwrite".
Have fun,
Waldo
|