dotdee
Dev Week -- dotdee - break a flat file into dynamically assembled snippets -- DustinKirkland -- Tue, Jul 12th, 2011
1 [18:01] <kirkland> howdy all
2 [18:02] <kirkland> this session is on dotdee
3 [18:02] <kirkland> there will be a live streamed demo at: http://bit.ly/uclass
4 [18:02] <kirkland> i invite you to join me there
5 [18:02] <kirkland> the username and password is guest/guest
6 [18:03] <kirkland> for those interested, this is a tool called ajaxterm
7 [18:03] <kirkland> which embeds a terminal in a web browser
8 [18:03] <kirkland> i've set up a byobu/screen session for the guest user (which is readonly for all of you)
9 [18:03] <kirkland> I'll drive the demo
10 [18:04] <kirkland> and annotate it here
11 [18:04] <kirkland> alternatively, you can ssh guest@ec2-50-19-128-105.compute-1.amazonaws.com
12 [18:04] <kirkland> with password guest
13 [18:05] <kirkland> okay, on to dotdee :-)
14 [18:05] <kirkland> if you've ever configured a Linux/UNIX system, you're probably familiar with the /etc directory
15 [18:05] <kirkland> and inside of /etc, there are many directories that end in a ".d"
16 [18:05] <kirkland> watch the terminal while I find a few in /etc
17 [18:06] <kirkland> there's a bunch!
18 [18:06] <kirkland> this is a very user friendly way of offering configuration to users
19 [18:06] <kirkland> usually, files in a .d directory are concatenated, or executed sequentially
20 [18:07] <kirkland> it give users quite a bit of flexibility for editing or adding configurations
21 [18:07] <kirkland> to some software or service
22 [18:07] <kirkland> it also helps developers and packagers of software
23 [18:07] <kirkland> as it often allows them to drop snippets of configuration into place
24 [18:07] <kirkland> but not every configuration file is setup in this way
25 [18:08] <kirkland> in fact, most of them are really quite "flat"
26 [18:08] <kirkland> a few months ago, I found myself repeatedly needing to converted some flat configuration files
27 [18:08] <kirkland> to .d style ones
28 [18:09] <kirkland> this was for software I was working with, as a developer/packager
29 [18:09] <kirkland> but not software that I had written myself
30 [18:09] <kirkland> ideally, I would just ask the upstream developers to change their flat .conf file
31 [18:09] <kirkland> to a .d directory
32 [18:09] <kirkland> and they would magically do it
33 [18:09] <kirkland> and test it
34 [18:09] <kirkland> and release it
35 [18:09] <kirkland> immediately :-)
36 [18:10] <kirkland> that rarely happens though :-P
37 [18:10] <kirkland> so I wrote a little tool that would generically to that for me!
38 [18:10] <kirkland> and that tool is called "dotdee"
39 [18:10] <kirkland> so let's take a look!
40 [18:10] <kirkland> over in the terminal, i'm going to install dotdee, which is already in Ubuntu oneiric
41 [18:10] <kirkland> sudo apt-get install dotdee
42 [18:11] <kirkland> for older ubuntu distros, you can 'sudo apt-add-repository ppa:dotdee/ppa'
43 [18:11] <kirkland> and update, and install it there too
44 [18:11] <kirkland> cool, so now i have a /usr/sbin/dotdee executable
45 [18:11] <kirkland> let's take a flat file, and turn it into a dotdee directory!
46 [18:12] <kirkland> I'm going to use /etc/hosts as my example
47 [18:12] <kirkland> first, I need to "setup" the file
48 [18:12] <kirkland> i can first verify that /etc/hosts is in fact a flat file,
49 [18:12] <kirkland> -rw-r--r-- 1 root root 296 2011-07-13 12:14 /etc/hosts
50 [18:13] <kirkland> I'm going to set it up like this:
51 [18:13] <kirkland> sudo dotdee --setup /etc/hosts
52 [18:13] <kirkland> INFO: [/etc/hosts] updated by dotdee
53 [18:13] <kirkland> cool!
54 [18:13] <kirkland> now let's look at what dotdee did....
55 [18:13] <kirkland> $ ll /etc/hosts
56 [18:13] <kirkland> lrwxrwxrwx 1 root root 27 2011-07-13 18:13 /etc/hosts -> /etc/alternatives/etc:hosts
57 [18:13] <kirkland> so /etc/hosts is now a symlink
58 [18:13] <kirkland> pointing to an alternatives link
59 [18:14] <kirkland> $ ll /etc/alternatives/etc:hosts
60 [18:14] <kirkland> lrwxrwxrwx 1 root root 22 2011-07-13 18:13 /etc/alternatives/etc:hosts -> /etc/dotdee//etc/hosts
61 [18:14] <kirkland> which is pointing to a flat file in /etc/dotdee
62 [18:14] <kirkland> $ ll /etc/dotdee//etc/hosts
63 [18:14] <kirkland> -r--r--r-- 1 root root 296 2011-07-13 18:13 /etc/dotdee//etc/hosts
64 [18:14] <kirkland> if I look at the contents of that file, I see exactly what I had before
65 [18:15] <kirkland> but let's go to that directory, /etc/dotdee
66 [18:15] <kirkland> inside of /etc/dotdee, there is a file structure that mirrors the same file structure on the system
67 [18:15] <kirkland> importantly, we now have a .d directory
68 [18:15] <kirkland> that refers exclusively to our newly managed file
69 [18:16] <kirkland> namely, /etc/dotdee/etc/hosts.d
70 [18:16] <kirkland> in that directory, all we have is a file called 50-original
71 [18:16] <kirkland> which is the original contents of our /etc/hosts
72 [18:16] <kirkland> but let's say we want to "append" a host to that fie
73 [18:16] <kirkland> file
74 [18:16] <kirkland> let's create a new file in this directory
75 [18:16] <kirkland> and call it 60-googledns
76 [18:17] <kirkland> so I edit the new file (as root)
77 [18:17] <kirkland> add the entry, 8.8.8.8 googledns
78 [18:17] <kirkland> and I'm going to write the file
79 [18:17] <kirkland> but before i write the file, let me split the screen
80 [18:18] <kirkland> so that we can watch it get updated, automatically, in real time!
81 [18:18] <kirkland> so i ran 'watch -n1 cat /etc/hosts'
82 [18:18] <kirkland> which is just printing that file every 1 second
83 [18:18] <kirkland> now i'm going to save our 60-googledns file
84 [18:18] <kirkland> and voila!
85 [18:19] <kirkland> we have a new entry appended to our /etc/hosts
86 [18:19] <kirkland> through the magic of inotify :-)
87 [18:19] <kirkland> which is a daemon that monitors filesystem events
88 [18:19] <kirkland> dotdee comes with a configuration (which is dotdee managed, of course!) that adds and removes patterns
89 [18:19] <kirkland> as you setup/remove dotdee management
90 [18:20] <kirkland> let's prepend a host
91 [18:20] <kirkland> we'll call this one 40-foo
92 [18:20] <kirkland> and see it land at the beginning of the file
93 [18:20] <kirkland> bingo
94 [18:20] <kirkland> now it's at the beginning of our /etc/hosts
95 [18:22] <kirkland> okay
96 [18:22] <kirkland> so adding/removing a flat text file is one way of affecting our managed file
97 [18:23] <kirkland> flat text files are just appended or prepended, based on its alpha-numeric positioning
98 [18:23] <kirkland> but there are 2 other ways as well!
99 [18:23] <kirkland> you can also put executables in this .d directory
100 [18:23] <kirkland> which operate on the standard in and out
101 [18:23] <kirkland> if you want to modify a flat file by "processing" it
102 [18:24] <kirkland> for instance
103 [18:24] <kirkland> let's make this file all uppercase
104 [18:25] <kirkland> whoops
105 [18:25] <kirkland> okay, there we go
106 [18:25] <kirkland> which brings me to the --update command :-)
107 [18:26] <kirkland> dotdee --update can be called against any managed file
108 [18:26] <kirkland> to update it immediately
109 [18:26] <kirkland> in case the inotify bit didn't pick up the change
110 [18:26] <kirkland> in any case, i just did that, and now our /etc/hosts is all uppercase
111 [18:26] <kirkland> because of our 70-uppercase executable
112 [18:27] <kirkland> what happens if we move it from 70-uppercase to 10-uppercase?
113 [18:27] <kirkland> or, rather, how about 51-uppercase?
114 [18:27] <kirkland> see the output now
115 [18:28] <kirkland> note that 51-uppercase was applied against the "current state" of the output, as of position 51
116 [18:28] <kirkland> but 60- was applied afterward
117 [18:28] <kirkland> so it wasn't affected
118 [18:28] <kirkland> so that's two ways we can affect the contents of the file
119 [18:28] <kirkland> a) flat text files, b) scripts that process stdin and write to stdout
120 [18:29] <kirkland> the third way is patches or diff files
121 [18:29] <kirkland> given that this is a developer audience, we're probably familiar with quilt
122 [18:29] <kirkland> and directories of patches
123 [18:29] <kirkland> this is particularly useful if you need to do some 'surgery' on a file
124 [18:29] <kirkland> let's say I want to "insert" a line into the middle of this file
125 [18:30] <kirkland> into the middle of 50-original, for instance
126 [18:31] <kirkland> okay, so i've added "10.9.8.7 hello-there" to the middle of a copy of this file
127 [18:31] <kirkland> and i'm going to use diff -up to generate a patch
128 [18:31] <kirkland> there we go
129 [18:31] <kirkland> okay, let's put that in this .d dir
130 [18:32] <kirkland> note that I have to add .patch or .diff as the file extension
131 [18:32] <kirkland> and now i can cat /etc/hosts and see that the patch has been applied!
132 [18:33] <kirkland> i could stack a great number of these patches here
133 [18:33] <kirkland> much like a quilt directory
134 [18:33] <kirkland> okay, so now let's undo this configuration
135 [18:34] <kirkland> oh, first
136 [18:34] <kirkland> sudo dotdee --list /etc/hosts
137 [18:34] <kirkland> /etc/hosts
138 [18:34] <kirkland> $ echo $?
139 [18:34] <kirkland> 0
140 [18:34] <kirkland> this verifies that /etc/hosts is in fact dotdee managed
141 [18:34] <kirkland> if i try this against some other file
142 [18:35] <kirkland> $ sudo dotdee --list /boot/vmlinuz-3.0-3-virtual
143 [18:35] <kirkland> ERROR: [/boot/vmlinuz-3.0-3-virtual] is not managed by dotdee
144 [18:35] <kirkland> (I don't recommend dotdee'ing your kernel :-)
145 [18:35] <kirkland> but we can undo our /etc/hosts
146 [18:35] <kirkland> $ sudo dotdee --undo /etc/hosts
147 [18:35] <kirkland> update-alternatives: using /etc/dotdee//etc/hosts.d/50-original to provide /etc/hosts (etc:hosts) in auto mode.
148 [18:35] <kirkland> INFO: [/etc/hosts] has been restored
149 [18:35] <kirkland> INFO: You may want to manually remove [/etc/dotdee//etc/hosts /etc/dotdee//etc/hosts.d]
150 [18:36] <kirkland> and now our /etc/hosts is back to being whatever we saved in 50-original
151 [18:36] <kirkland> so ...
152 [18:36] <kirkland> that's how it works
153 [18:36] <kirkland> and the /etc/hosts example is only marginally useful
154 [18:37] <kirkland> what I would *really* like to use it for is in configuration file management in Debian/Ubuntu packaging
155 [18:37] <kirkland> in the case where the upstream daemon or utility has a single, flat .conf file
156 [18:37] <kirkland> but I really would prefer it to be a .d directory
157 [18:37] <kirkland> so i just did a find on /etc
158 [18:38] <kirkland> sudo find /etc/ -type f -name "*.conf"
159 [18:38] <kirkland> and chose one at random
160 [18:38] <kirkland> /etc/fonts/fonts.conf
161 [18:38] <kirkland> which happens to be XML
162 [18:38] <kirkland> and I just thought about this
163 [18:38] <kirkland> i should have mentioned it in our previous section
164 [18:39] <kirkland> XML is tougher than a linear file, like a shell script
165 [18:39] <kirkland> in that you can't just append, or prepend text
166 [18:39] <kirkland> you have to surgically insert the bits you want
167 [18:39] <kirkland> in which case the latter two methods I mentioned, the executable and the diff/patch will be your friend!
168 [18:40] <kirkland> okay
169 [18:40] <kirkland> now I would *really* like to see dpkg learn just a little bit about dotdee
170 [18:41] <kirkland> I'd like for it to be able to determine *if* a file is managed by dotdee
171 [18:41] <kirkland> (easy to check using dotdee --list, or just checking if the file is a symlink itself)
172 [18:41] <kirkland> and if so, then it would use $(dotdee --original ...) to find the 50-original file path
173 [18:42] <kirkland> and dpkg would write its changes to that location (the 50-original file)
174 [18:42] <kirkland> such that local admin, or even other packages, could dabble in the .d directory, without causing conffile conflicts or .dpkg-original files
175 [18:43] <kirkland> okay, anyway, let's take a break for questions
176 [18:43] <kirkland> I think I've demo'd most of what I'd like to show you
177 [18:43] <kirkland> any questions?
178 [18:44] <kirkland> <coalitians> Question: Is there any issues when you upgrade or update due to dotdee?
179 [18:44] <kirkland> coalitians: great question !
180 [18:44] <kirkland> coalitians: right, so that's what I was saying about dpkg needing to "learn" about dotdee
181 [18:44] <kirkland> coalitians: let's look at an example over in our test system
182 [18:45] <kirkland> coalitians: I'm going to dotdee --setup that font xml
183 [18:47] <kirkland> coalitians: okay, as you can see, i've made a change
184 [18:47] <kirkland> coalitians: let's upgrade (or reinstall) the package that owns this file
185 [18:47] <kirkland> $ sudo apt-get install --reinstall fontconfig-config
186 [18:47] <kirkland> lrwxrwxrwx 1 root root 38 2011-07-13 18:45 fonts.conf -> /etc/alternatives/etc:fonts:fonts.conf
187 [18:47] <kirkland> -rw-r--r-- 1 root root 5287 2011-07-01 12:12 fonts.conf.dpkg-new
188 [18:48] <kirkland> unfortunately, dpkg dump fonts.conf.dpkg-new here :-(
189 [18:48] <kirkland> i have toyed with another inotify/iwatch regex that would look for these :-)
190 [18:48] <kirkland> slurp them up, and move them over to 50-original
191 [18:48] <kirkland> which works reasonably well
192 [18:49] <kirkland> except that I don't yet have the interface for the merge/conffile questions, like dpkg does
193 [18:49] <kirkland> coalitians: so to answer your question, upgrades are not yet handled terribly gracefully
194 [18:49] <kirkland> coalitians: and would take a little work within dpkg itself
195 [18:49] <kirkland> coalitians: sorry; but great question!
196 [18:49] <kirkland> any others?
197 [18:50] <kirkland> I see roughly 19# in the byobu session :-)
198 [18:50] <kirkland> that's what the red-on-white 19# means
199 [18:50] <kirkland> 19 ssh sessions
200 [18:50] <kirkland> did the web interface work for anyone?
201 [18:50] <kirkland> this is the first time I've tried it
MeetingLogs/devweek1107/dotdee (last edited 2011-07-14 08:08:18 by dholbach)