Merge lp:~logan/ubuntu/quantal/munin/debian-merge into lp:ubuntu/quantal/munin
- Quantal (12.10)
- debian-merge
- Merge into quantal
Proposed by
Logan Rosen
Status: | Merged |
---|---|
Merged at revision: | 50 |
Proposed branch: | lp:~logan/ubuntu/quantal/munin/debian-merge |
Merge into: | lp:ubuntu/quantal/munin |
Diff against target: |
2138 lines (+1802/-22) 41 files modified
ChangeLog (+10/-0) RELEASE (+1/-1) debian/changelog (+20/-0) debian/control (+1/-1) debian/munin-async.init (+3/-3) debian/munin-node.init (+2/-4) debian/munin.init (+2/-4) doc/.gitignore (+2/-0) doc/Makefile (+153/-0) doc/conf.py (+286/-0) doc/documentation/index.rst (+11/-0) doc/documentation/nomenclature.rst (+134/-0) doc/example/index.rst (+14/-0) doc/example/plugin/aggregate.rst (+188/-0) doc/example/webserver/apache-virtualhost.rst (+65/-0) doc/example/webserver/lighttpd.rst (+49/-0) doc/example/webserver/nginx.rst (+72/-0) doc/index.rst (+29/-0) doc/installation/configuration.rst (+84/-0) doc/installation/help.rst (+27/-0) doc/installation/index.rst (+16/-0) doc/installation/install.rst (+177/-0) doc/installation/prerequisites.rst (+68/-0) doc/installation/upgrade.rst (+19/-0) doc/master/index.rst (+18/-0) doc/master/munin-cron.rst (+14/-0) doc/master/munin-html.rst (+13/-0) doc/master/munin-limits.rst (+13/-0) doc/master/munin-update.rst (+17/-0) doc/master/rrdcached.rst (+116/-0) doc/plugin/aggregate.rst (+8/-0) doc/plugin/index.rst (+13/-0) doc/plugin/reference.rst (+134/-0) master/_bin/munin-cron.in (+5/-0) master/_bin/munin-graph.in (+7/-2) master/lib/Munin/Master/GraphOld.pm (+1/-1) master/lib/Munin/Master/Node.pm (+3/-1) plugins/lib/Munin/Plugin.pm (+3/-0) plugins/node.d.linux/if_err_.in (+1/-1) plugins/node.d/munin_stats.in (+0/-2) plugins/plugin.sh.in (+3/-2) |
To merge this branch: | bzr merge lp:~logan/ubuntu/quantal/munin/debian-merge |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jamie Strandboge | Approve | ||
Ubuntu branches | Pending | ||
Review via email: mp+116184@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'ChangeLog' |
2 | --- ChangeLog 2012-07-02 14:15:42 +0000 |
3 | +++ ChangeLog 2012-07-23 03:02:19 +0000 |
4 | @@ -1,5 +1,15 @@ |
5 | -*- text -*- |
6 | |
7 | +munin-2.0.2, 2012-06-29 |
8 | + |
9 | +Summary : |
10 | + |
11 | +* munin-graph can be called again from cron |
12 | +* workaround "root" field name bug |
13 | +* initial doc/ subdir. will be munin book |
14 | +* emits percent in log about errors |
15 | +* various bugfix |
16 | + |
17 | munin-2.0.1, 2012-06-10 |
18 | |
19 | Well, first bugfix release. |
20 | |
21 | === modified file 'RELEASE' |
22 | --- RELEASE 2012-07-02 14:15:42 +0000 |
23 | +++ RELEASE 2012-07-23 03:02:19 +0000 |
24 | @@ -1,1 +1,1 @@ |
25 | -2.0.1 |
26 | +2.0.2 |
27 | |
28 | === modified file 'debian/changelog' |
29 | --- debian/changelog 2012-07-02 14:15:42 +0000 |
30 | +++ debian/changelog 2012-07-23 03:02:19 +0000 |
31 | @@ -1,3 +1,23 @@ |
32 | +munin (2.0.2-1ubuntu1) quantal; urgency=low |
33 | + |
34 | + * Merge from Debian unstable. Remaining changes: |
35 | + - d/munin-node.upstart,munin.upstart: Add upstart configurations. |
36 | + |
37 | + -- Logan Rosen <logatronico@gmail.com> Sun, 22 Jul 2012 14:19:53 -0400 |
38 | + |
39 | +munin (2.0.2-1) unstable; urgency=low |
40 | + |
41 | + [ Holger Levsen ] |
42 | + * New upstream version, reintroducing munin-graph (Closes: #681674) and |
43 | + some bugfixes. The new munin book is added to the sources, but not yet |
44 | + build. |
45 | + * Add proper LSB headers to all init scripts. (Closes: #680223) |
46 | + |
47 | + [ Stig Sandbeck Mathisen ] |
48 | + * debian/control: Rename "munin-async-*" to munin-async and munin-asyncd. |
49 | + |
50 | + -- Holger Levsen <holger@debian.org> Sat, 21 Jul 2012 12:43:33 -0600 |
51 | + |
52 | munin (2.0.1-1ubuntu1) quantal; urgency=low |
53 | |
54 | * Merge from Debian unstable. Remaining changes: |
55 | |
56 | === modified file 'debian/control' |
57 | --- debian/control 2012-07-02 14:15:42 +0000 |
58 | +++ debian/control 2012-07-23 03:02:19 +0000 |
59 | @@ -143,7 +143,7 @@ |
60 | virtually everything imaginable throughout your network, while still |
61 | maintaining a rattling ease of installation and configuration. |
62 | . |
63 | - This package contains munin-async-master and munin-async-client which can |
64 | + This package contains munin-async and munin-asyncd which can |
65 | be used for (optional) asynchronous operation of munin-update. |
66 | . |
67 | Munin is written in Perl, and relies heavily on Tobi Oetiker's excellent |
68 | |
69 | === modified file 'debian/munin-async.init' |
70 | --- debian/munin-async.init 2012-03-19 15:17:42 +0000 |
71 | +++ debian/munin-async.init 2012-07-23 03:02:19 +0000 |
72 | @@ -1,8 +1,8 @@ |
73 | #! /bin/sh |
74 | ### BEGIN INIT INFO |
75 | # Provides: munin-async |
76 | -# Required-Start: $remote_fs |
77 | -# Required-Stop: $remote_fs |
78 | +# Required-Start: $network $named $local_fs $remote_fs |
79 | +# Required-Stop: $network $named $local_fs $remote_fs |
80 | # Default-Start: 2 3 4 5 |
81 | # Default-Stop: 0 1 6 |
82 | # Short-Description: Munin asynchronous server |
83 | @@ -16,7 +16,7 @@ |
84 | # PATH should only include /usr/* if it runs after the mountnfs.sh script |
85 | PATH=/sbin:/usr/sbin:/bin:/usr/bin |
86 | DESC="Munin asynchronous server" |
87 | -NAME=munin-async-server |
88 | +NAME=munin-asyncd |
89 | DAEMON=/usr/share/munin/$NAME |
90 | DAEMON_ARGS="" |
91 | PIDFILE=/var/run/munin/$NAME.pid |
92 | |
93 | === modified file 'debian/munin-node.init' |
94 | --- debian/munin-node.init 2012-05-31 22:21:59 +0000 |
95 | +++ debian/munin-node.init 2012-07-23 03:02:19 +0000 |
96 | @@ -2,10 +2,8 @@ |
97 | |
98 | ### BEGIN INIT INFO |
99 | # Provides: munin-node |
100 | -# Required-Start: $local_fs $remote_fs |
101 | -# Required-Stop: $local_fs $remote_fs |
102 | -# Should-Start: $all |
103 | -# Should-Stop: $all |
104 | +# Required-Start: $network $named $local_fs $remote_fs |
105 | +# Required-Stop: $network $named $local_fs $remote_fs |
106 | # Default-Start: 2 3 4 5 |
107 | # Default-Stop: 0 1 6 |
108 | # Short-Description: Start/stop Munin-Node |
109 | |
110 | === modified file 'debian/munin.init' |
111 | --- debian/munin.init 2012-03-19 15:17:42 +0000 |
112 | +++ debian/munin.init 2012-07-23 03:02:19 +0000 |
113 | @@ -2,10 +2,8 @@ |
114 | |
115 | ### BEGIN INIT INFO |
116 | # Provides: munin |
117 | -# Required-Start: $local_fs $remote_fs |
118 | -# Required-Stop: $local_fs $remote_fs |
119 | -# Should-Start: $all |
120 | -# Should-Stop: $all |
121 | +# Required-Start: $network $named $local_fs $remote_fs |
122 | +# Required-Stop: $network $named $local_fs $remote_fs |
123 | # Default-Start: 2 3 4 5 |
124 | # Default-Stop: 0 1 6 |
125 | # Short-Description: Create /var/run/munin on boot |
126 | |
127 | === added directory 'doc' |
128 | === added file 'doc/.gitignore' |
129 | --- doc/.gitignore 1970-01-01 00:00:00 +0000 |
130 | +++ doc/.gitignore 2012-07-23 03:02:19 +0000 |
131 | @@ -0,0 +1,2 @@ |
132 | +_build/ |
133 | +*~ |
134 | |
135 | === added file 'doc/Makefile' |
136 | --- doc/Makefile 1970-01-01 00:00:00 +0000 |
137 | +++ doc/Makefile 2012-07-23 03:02:19 +0000 |
138 | @@ -0,0 +1,153 @@ |
139 | +# Makefile for Sphinx documentation |
140 | +# |
141 | + |
142 | +# You can set these variables from the command line. |
143 | +SPHINXOPTS = |
144 | +SPHINXBUILD = sphinx-build |
145 | +PAPER = |
146 | +BUILDDIR = _build |
147 | + |
148 | +# Internal variables. |
149 | +PAPEROPT_a4 = -D latex_paper_size=a4 |
150 | +PAPEROPT_letter = -D latex_paper_size=letter |
151 | +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . |
152 | +# the i18n builder cannot share the environment and doctrees with the others |
153 | +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . |
154 | + |
155 | +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext |
156 | + |
157 | +help: |
158 | + @echo "Please use \`make <target>' where <target> is one of" |
159 | + @echo " html to make standalone HTML files" |
160 | + @echo " dirhtml to make HTML files named index.html in directories" |
161 | + @echo " singlehtml to make a single large HTML file" |
162 | + @echo " pickle to make pickle files" |
163 | + @echo " json to make JSON files" |
164 | + @echo " htmlhelp to make HTML files and a HTML help project" |
165 | + @echo " qthelp to make HTML files and a qthelp project" |
166 | + @echo " devhelp to make HTML files and a Devhelp project" |
167 | + @echo " epub to make an epub" |
168 | + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" |
169 | + @echo " latexpdf to make LaTeX files and run them through pdflatex" |
170 | + @echo " text to make text files" |
171 | + @echo " man to make manual pages" |
172 | + @echo " texinfo to make Texinfo files" |
173 | + @echo " info to make Texinfo files and run them through makeinfo" |
174 | + @echo " gettext to make PO message catalogs" |
175 | + @echo " changes to make an overview of all changed/added/deprecated items" |
176 | + @echo " linkcheck to check all external links for integrity" |
177 | + @echo " doctest to run all doctests embedded in the documentation (if enabled)" |
178 | + |
179 | +clean: |
180 | + -rm -rf $(BUILDDIR)/ |
181 | + |
182 | +html: |
183 | + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html |
184 | + @echo |
185 | + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." |
186 | + |
187 | +dirhtml: |
188 | + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml |
189 | + @echo |
190 | + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." |
191 | + |
192 | +singlehtml: |
193 | + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml |
194 | + @echo |
195 | + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." |
196 | + |
197 | +pickle: |
198 | + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle |
199 | + @echo |
200 | + @echo "Build finished; now you can process the pickle files." |
201 | + |
202 | +json: |
203 | + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json |
204 | + @echo |
205 | + @echo "Build finished; now you can process the JSON files." |
206 | + |
207 | +htmlhelp: |
208 | + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp |
209 | + @echo |
210 | + @echo "Build finished; now you can run HTML Help Workshop with the" \ |
211 | + ".hhp project file in $(BUILDDIR)/htmlhelp." |
212 | + |
213 | +qthelp: |
214 | + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp |
215 | + @echo |
216 | + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ |
217 | + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" |
218 | + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Munin.qhcp" |
219 | + @echo "To view the help file:" |
220 | + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Munin.qhc" |
221 | + |
222 | +devhelp: |
223 | + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp |
224 | + @echo |
225 | + @echo "Build finished." |
226 | + @echo "To view the help file:" |
227 | + @echo "# mkdir -p $$HOME/.local/share/devhelp/Munin" |
228 | + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Munin" |
229 | + @echo "# devhelp" |
230 | + |
231 | +epub: |
232 | + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub |
233 | + @echo |
234 | + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." |
235 | + |
236 | +latex: |
237 | + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex |
238 | + @echo |
239 | + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." |
240 | + @echo "Run \`make' in that directory to run these through (pdf)latex" \ |
241 | + "(use \`make latexpdf' here to do that automatically)." |
242 | + |
243 | +latexpdf: |
244 | + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex |
245 | + @echo "Running LaTeX files through pdflatex..." |
246 | + $(MAKE) -C $(BUILDDIR)/latex all-pdf |
247 | + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." |
248 | + |
249 | +text: |
250 | + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text |
251 | + @echo |
252 | + @echo "Build finished. The text files are in $(BUILDDIR)/text." |
253 | + |
254 | +man: |
255 | + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man |
256 | + @echo |
257 | + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." |
258 | + |
259 | +texinfo: |
260 | + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo |
261 | + @echo |
262 | + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." |
263 | + @echo "Run \`make' in that directory to run these through makeinfo" \ |
264 | + "(use \`make info' here to do that automatically)." |
265 | + |
266 | +info: |
267 | + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo |
268 | + @echo "Running Texinfo files through makeinfo..." |
269 | + make -C $(BUILDDIR)/texinfo info |
270 | + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." |
271 | + |
272 | +gettext: |
273 | + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale |
274 | + @echo |
275 | + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." |
276 | + |
277 | +changes: |
278 | + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes |
279 | + @echo |
280 | + @echo "The overview file is in $(BUILDDIR)/changes." |
281 | + |
282 | +linkcheck: |
283 | + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck |
284 | + @echo |
285 | + @echo "Link check complete; look for any errors in the above output " \ |
286 | + "or in $(BUILDDIR)/linkcheck/output.txt." |
287 | + |
288 | +doctest: |
289 | + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest |
290 | + @echo "Testing of doctests in the sources finished, look at the " \ |
291 | + "results in $(BUILDDIR)/doctest/output.txt." |
292 | |
293 | === added directory 'doc/_static' |
294 | === added file 'doc/_static/.gitignore' |
295 | === added directory 'doc/_templates' |
296 | === added file 'doc/_templates/.gitignore' |
297 | === added file 'doc/conf.py' |
298 | --- doc/conf.py 1970-01-01 00:00:00 +0000 |
299 | +++ doc/conf.py 2012-07-23 03:02:19 +0000 |
300 | @@ -0,0 +1,286 @@ |
301 | +#!/usr/bin/env python3 |
302 | +# -*- coding: utf-8 -*- |
303 | +# |
304 | +# Munin documentation build configuration file, created by |
305 | +# sphinx-quickstart on Sat Jun 9 11:12:29 2012. |
306 | +# |
307 | +# This file is execfile()d with the current directory set to its containing dir. |
308 | +# |
309 | +# Note that not all possible configuration values are present in this |
310 | +# autogenerated file. |
311 | +# |
312 | +# All configuration values have a default; values that are commented out |
313 | +# serve to show the default. |
314 | + |
315 | +import sys, os |
316 | + |
317 | +# If extensions (or modules to document with autodoc) are in another directory, |
318 | +# add these directories to sys.path here. If the directory is relative to the |
319 | +# documentation root, use os.path.abspath to make it absolute, like shown here. |
320 | +#sys.path.insert(0, os.path.abspath('.')) |
321 | + |
322 | +# -- General configuration ----------------------------------------------------- |
323 | + |
324 | +# If your documentation needs a minimal Sphinx version, state it here. |
325 | +#needs_sphinx = '1.0' |
326 | + |
327 | +# Add any Sphinx extension module names here, as strings. They can be extensions |
328 | +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. |
329 | +extensions = ['sphinx.ext.doctest'] |
330 | + |
331 | +# Add any paths that contain templates here, relative to this directory. |
332 | +templates_path = ['_templates'] |
333 | + |
334 | +# The suffix of source filenames. |
335 | +source_suffix = '.rst' |
336 | + |
337 | +# The encoding of source files. |
338 | +#source_encoding = 'utf-8-sig' |
339 | + |
340 | +# The master toctree document. |
341 | +master_doc = 'index' |
342 | + |
343 | +# General information about the project. |
344 | +project = 'Munin' |
345 | +copyright = '2012, Stig Sandbeck Mathisen <ssm@fnord.no>' |
346 | + |
347 | +# The version info for the project you're documenting, acts as replacement for |
348 | +# |version| and |release|, also used in various other places throughout the |
349 | +# built documents. |
350 | +# |
351 | +# The short X.Y version. |
352 | +version = '2.0' |
353 | +# The full version, including alpha/beta/rc tags. |
354 | +release = os.popen('../getversion').read() |
355 | + |
356 | +# The language for content autogenerated by Sphinx. Refer to documentation |
357 | +# for a list of supported languages. |
358 | +#language = None |
359 | + |
360 | +# There are two options for replacing |today|: either, you set today to some |
361 | +# non-false value, then it is used: |
362 | +#today = '' |
363 | +# Else, today_fmt is used as the format for a strftime call. |
364 | +#today_fmt = '%B %d, %Y' |
365 | + |
366 | +# List of patterns, relative to source directory, that match files and |
367 | +# directories to ignore when looking for source files. |
368 | +exclude_patterns = ['_build'] |
369 | + |
370 | +# The reST default role (used for this markup: `text`) to use for all documents. |
371 | +#default_role = None |
372 | + |
373 | +# If true, '()' will be appended to :func: etc. cross-reference text. |
374 | +#add_function_parentheses = True |
375 | + |
376 | +# If true, the current module name will be prepended to all description |
377 | +# unit titles (such as .. function::). |
378 | +#add_module_names = True |
379 | + |
380 | +# If true, sectionauthor and moduleauthor directives will be shown in the |
381 | +# output. They are ignored by default. |
382 | +#show_authors = False |
383 | + |
384 | +# The name of the Pygments (syntax highlighting) style to use. |
385 | +pygments_style = 'sphinx' |
386 | + |
387 | +# A list of ignored prefixes for module index sorting. |
388 | +#modindex_common_prefix = [] |
389 | + |
390 | + |
391 | +# -- Options for HTML output --------------------------------------------------- |
392 | + |
393 | +# The theme to use for HTML and HTML Help pages. See the documentation for |
394 | +# a list of builtin themes. |
395 | +html_theme = 'default' |
396 | + |
397 | +# Theme options are theme-specific and customize the look and feel of a theme |
398 | +# further. For a list of options available for each theme, see the |
399 | +# documentation. |
400 | +#html_theme_options = {} |
401 | + |
402 | +# Add any paths that contain custom themes here, relative to this directory. |
403 | +#html_theme_path = [] |
404 | + |
405 | +# The name for this set of Sphinx documents. If None, it defaults to |
406 | +# "<project> v<release> documentation". |
407 | +#html_title = None |
408 | + |
409 | +# A shorter title for the navigation bar. Default is the same as html_title. |
410 | +html_short_title = "Munin" |
411 | + |
412 | +# The name of an image file (relative to this directory) to place at the top |
413 | +# of the sidebar. |
414 | +html_logo = '../master/static/logo-h.png' |
415 | + |
416 | +# The name of an image file (within the static path) to use as favicon of the |
417 | +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 |
418 | +# pixels large. |
419 | +#html_favicon = None |
420 | + |
421 | +# Add any paths that contain custom static files (such as style sheets) here, |
422 | +# relative to this directory. They are copied after the builtin static files, |
423 | +# so a file named "default.css" will overwrite the builtin "default.css". |
424 | +html_static_path = ['_static'] |
425 | + |
426 | +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, |
427 | +# using the given strftime format. |
428 | +#html_last_updated_fmt = '%b %d, %Y' |
429 | + |
430 | +# If true, SmartyPants will be used to convert quotes and dashes to |
431 | +# typographically correct entities. |
432 | +#html_use_smartypants = True |
433 | + |
434 | +# Custom sidebar templates, maps document names to template names. |
435 | +#html_sidebars = {} |
436 | + |
437 | +# Additional templates that should be rendered to pages, maps page names to |
438 | +# template names. |
439 | +#html_additional_pages = {} |
440 | + |
441 | +# If false, no module index is generated. |
442 | +#html_domain_indices = True |
443 | + |
444 | +# If false, no index is generated. |
445 | +#html_use_index = True |
446 | + |
447 | +# If true, the index is split into individual pages for each letter. |
448 | +#html_split_index = False |
449 | + |
450 | +# If true, links to the reST sources are added to the pages. |
451 | +#html_show_sourcelink = True |
452 | + |
453 | +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. |
454 | +#html_show_sphinx = True |
455 | + |
456 | +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. |
457 | +#html_show_copyright = True |
458 | + |
459 | +# If true, an OpenSearch description file will be output, and all pages will |
460 | +# contain a <link> tag referring to it. The value of this option must be the |
461 | +# base URL from which the finished HTML is served. |
462 | +#html_use_opensearch = '' |
463 | + |
464 | +# This is the file name suffix for HTML files (e.g. ".xhtml"). |
465 | +#html_file_suffix = None |
466 | + |
467 | +# Output file base name for HTML help builder. |
468 | +htmlhelp_basename = 'Munindoc' |
469 | + |
470 | + |
471 | +# -- Options for LaTeX output -------------------------------------------------- |
472 | + |
473 | +latex_elements = { |
474 | +# The paper size ('letterpaper' or 'a4paper'). |
475 | +'papersize': 'a4paper', |
476 | + |
477 | +# The font size ('10pt', '11pt' or '12pt'). |
478 | +'pointsize': '10pt', |
479 | + |
480 | +# Additional stuff for the LaTeX preamble. |
481 | +#'preamble': '', |
482 | +} |
483 | + |
484 | +# Grouping the document tree into LaTeX files. List of tuples |
485 | +# (source start file, target name, title, author, documentclass [howto/manual]). |
486 | +latex_documents = [ |
487 | + ('index', 'Munin.tex', 'Munin Documentation', |
488 | + 'Stig Sandbeck Mathisen \\textless{}ssm@fnord.no\\textgreater{}', 'manual'), |
489 | +] |
490 | + |
491 | +# The name of an image file (relative to this directory) to place at the top of |
492 | +# the title page. |
493 | +latex_logo = '../master/static/logo-h.png' |
494 | + |
495 | +# For "manual" documents, if this is true, then toplevel headings are parts, |
496 | +# not chapters. |
497 | +#latex_use_parts = False |
498 | + |
499 | +# If true, show page references after internal links. |
500 | +latex_show_pagerefs = False |
501 | + |
502 | +# If true, show URL addresses after external links. |
503 | +latex_show_urls = False |
504 | + |
505 | +# Documents to append as an appendix to all manuals. |
506 | +#latex_appendices = [] |
507 | + |
508 | +# If false, no module index is generated. |
509 | +#latex_domain_indices = True |
510 | + |
511 | + |
512 | +# -- Options for manual page output -------------------------------------------- |
513 | + |
514 | +# One entry per manual page. List of tuples |
515 | +# (source start file, name, description, authors, manual section). |
516 | +man_pages = [ |
517 | + ('index', 'munin', 'Munin Documentation', |
518 | + ['Stig Sandbeck Mathisen <ssm@fnord.no>'], 1) |
519 | +] |
520 | + |
521 | +# If true, show URL addresses after external links. |
522 | +#man_show_urls = False |
523 | + |
524 | + |
525 | +# -- Options for Texinfo output ------------------------------------------------ |
526 | + |
527 | +# Grouping the document tree into Texinfo files. List of tuples |
528 | +# (source start file, target name, title, author, |
529 | +# dir menu entry, description, category) |
530 | +texinfo_documents = [ |
531 | + ('index', 'Munin', 'Munin Documentation', |
532 | + 'Stig Sandbeck Mathisen <ssm@fnord.no>', 'Munin', 'One line description of project.', |
533 | + 'Miscellaneous'), |
534 | +] |
535 | + |
536 | +# Documents to append as an appendix to all manuals. |
537 | +#texinfo_appendices = [] |
538 | + |
539 | +# If false, no module index is generated. |
540 | +#texinfo_domain_indices = True |
541 | + |
542 | +# How to display URL addresses: 'footnote', 'no', or 'inline'. |
543 | +#texinfo_show_urls = 'footnote' |
544 | + |
545 | + |
546 | +# -- Options for Epub output --------------------------------------------------- |
547 | + |
548 | +# Bibliographic Dublin Core info. |
549 | +epub_title = 'Munin' |
550 | +epub_author = 'Stig Sandbeck Mathisen <ssm@fnord.no>' |
551 | +epub_publisher = 'Stig Sandbeck Mathisen <ssm@fnord.no>' |
552 | +epub_copyright = '2012, Stig Sandbeck Mathisen <ssm@fnord.no>' |
553 | + |
554 | +# The language of the text. It defaults to the language option |
555 | +# or en if the language is not set. |
556 | +#epub_language = '' |
557 | + |
558 | +# The scheme of the identifier. Typical schemes are ISBN or URL. |
559 | +#epub_scheme = '' |
560 | + |
561 | +# The unique identifier of the text. This can be a ISBN number |
562 | +# or the project homepage. |
563 | +#epub_identifier = '' |
564 | + |
565 | +# A unique identification for the text. |
566 | +#epub_uid = '' |
567 | + |
568 | +# A tuple containing the cover image and cover page html template filenames. |
569 | +#epub_cover = () |
570 | + |
571 | +# HTML files that should be inserted before the pages created by sphinx. |
572 | +# The format is a list of tuples containing the path and title. |
573 | +#epub_pre_files = [] |
574 | + |
575 | +# HTML files shat should be inserted after the pages created by sphinx. |
576 | +# The format is a list of tuples containing the path and title. |
577 | +#epub_post_files = [] |
578 | + |
579 | +# A list of files that should not be packed into the epub file. |
580 | +#epub_exclude_files = [] |
581 | + |
582 | +# The depth of the table of contents in toc.ncx. |
583 | +#epub_tocdepth = 3 |
584 | + |
585 | +# Allow duplicate toc entries. |
586 | +#epub_tocdup = True |
587 | |
588 | === added directory 'doc/documentation' |
589 | === added file 'doc/documentation/index.rst' |
590 | --- doc/documentation/index.rst 1970-01-01 00:00:00 +0000 |
591 | +++ doc/documentation/index.rst 2012-07-23 03:02:19 +0000 |
592 | @@ -0,0 +1,11 @@ |
593 | +.. _documentation-index: |
594 | + |
595 | +=================== |
596 | + Documenting Munin |
597 | +=================== |
598 | + |
599 | +This document is rather meta, it explains how to document Munin. |
600 | + |
601 | +.. toctree:: |
602 | + |
603 | + nomenclature.rst |
604 | |
605 | === added file 'doc/documentation/nomenclature.rst' |
606 | --- doc/documentation/nomenclature.rst 1970-01-01 00:00:00 +0000 |
607 | +++ doc/documentation/nomenclature.rst 2012-07-23 03:02:19 +0000 |
608 | @@ -0,0 +1,134 @@ |
609 | +============== |
610 | + Nomenclature |
611 | +============== |
612 | + |
613 | +To be able to use Munin, to understand the documentation, and - not to |
614 | +be neglected - to be able to write documentation that is consistent |
615 | +with Munin behaviour, we need a common nomenclature. |
616 | + |
617 | +Common terms |
618 | +============ |
619 | + |
620 | ++--------------+--------------------------------------------+------------------------------+ |
621 | +| Term | Explanation | Also referred to as as | |
622 | ++==============+============================================+==============================+ |
623 | +| Munin Master | The central host / server where Munin | master, server, munin server | |
624 | +| | gathers all data. | | |
625 | +| | The machine runs munin-cron | | |
626 | ++--------------+--------------------------------------------+------------------------------+ |
627 | +| Munin Node | The daemon / network service running | In SNMP terms | |
628 | +| | on each host to be contacted by the | it may be called an | |
629 | +| | | agent. | |
630 | ++--------------+--------------------------------------------+------------------------------+ |
631 | +| Plugin | Each munin node handles one or more | service | |
632 | +| | plugins to monitor stuff on hosts | | |
633 | ++--------------+--------------------------------------------+------------------------------+ |
634 | +| Host | A machine monitored by Munin, | | |
635 | +| | maybe by proxy on a munin node, | | |
636 | +| | or via a SNMP plugin | | |
637 | ++--------------+--------------------------------------------+------------------------------+ |
638 | +| Field | Each plugin presents data from one | Data source | |
639 | +| | or more data sources. Each found, | | |
640 | +| | read or calculated value corresponds | | |
641 | +| | to a field.attribute tuple. | | |
642 | ++--------------+--------------------------------------------+------------------------------+ |
643 | +| Attribute | Description found in output from plugins, | | |
644 | +| | both general (global) to the plugin, and | | |
645 | +| | also specific ot each Field. | | |
646 | ++--------------+--------------------------------------------+------------------------------+ |
647 | +| Environment | Set up by munin node, used to control | | |
648 | +| variable | plugin behaviour. Found in the plugin | | |
649 | +| | configuration directory. | | |
650 | +| | (/etc/munin/plugin-conf.d/) | | |
651 | ++--------------+--------------------------------------------+------------------------------+ |
652 | +| Global | Used in the global context in the | | |
653 | +| (plugin) | configuration output from a plugin. | | |
654 | +| attribute | (Note: The attribute is considered | | |
655 | +| | "global" only to the plugin (and the | | |
656 | +| | node), and only when executed. | | |
657 | ++--------------+--------------------------------------------+------------------------------+ |
658 | +| Datasource | Used in the datasource-specific context in | | |
659 | +| specific | the output of a plugin | | |
660 | +| plugin | | | |
661 | +| attribute | | | |
662 | ++--------------+--------------------------------------------+------------------------------+ |
663 | +| Global | Used in munin.conf | | |
664 | +| directive | | | |
665 | ++--------------+--------------------------------------------+------------------------------+ |
666 | +| Node level | Used in munin.conf | | |
667 | +| directive | | | |
668 | ++--------------+--------------------------------------------+------------------------------+ |
669 | +| Group level | Used in munin.conf | | |
670 | +| directive | | | |
671 | ++--------------+--------------------------------------------+------------------------------+ |
672 | +| Field level | Used in munin.conf | | |
673 | +| directive | | | |
674 | ++--------------+--------------------------------------------+------------------------------+ |
675 | + |
676 | + |
677 | +Examples |
678 | +======== |
679 | + |
680 | +To shed some light on the nomenclature, consider the examples below: |
681 | + |
682 | +Global plugin attribute |
683 | +----------------------- |
684 | + |
685 | +Global plugin attributes are in the plugins output when run with the |
686 | +config argument. The full list of these attributes is found on the |
687 | +protocol config page. This output does not configure the plugin, it |
688 | +configures the plugins graph. |
689 | + |
690 | +:: |
691 | + |
692 | + graph_title Load average |
693 | + ----------- ------------ |
694 | + | `------ value |
695 | + `------------------ attribute |
696 | + |
697 | + |
698 | +Datasource specific plugin attribute |
699 | +------------------------------------ |
700 | + |
701 | +These are found both in the config outout of a plugin and in the |
702 | +normal readings of a plugin. A plugin may provide data from one or |
703 | +more data sources. Each data source needs its own set of |
704 | +field.attribute tuples to define how the data source should be |
705 | +presented. |
706 | + |
707 | +:: |
708 | + |
709 | + load.warning 100 |
710 | + ---- ------- --- |
711 | + | | `- value |
712 | + | `------- one of several attributes used in config output |
713 | + `------------- field |
714 | + |
715 | + load.value 54 |
716 | + ---- ----- -- |
717 | + | | `- value |
718 | + | `------ only attribute when getting values from a plugin |
719 | + `----------- field |
720 | + |
721 | +Configuration files |
722 | +------------------- |
723 | + |
724 | +This one is from the global section of munin.conf: |
725 | + |
726 | +:: |
727 | + |
728 | + dbdir /var/lib/munin/ |
729 | + ----- --------------- |
730 | + | `--------- value |
731 | + `-------------------------- global directive |
732 | + |
733 | + |
734 | +And then one from the node level section: |
735 | + |
736 | +:: |
737 | + |
738 | + [foo.example.org] |
739 | + address localhost |
740 | + ------- --------- |
741 | + | `----- value |
742 | + `-------------- node level directive |
743 | |
744 | === added directory 'doc/example' |
745 | === added file 'doc/example/index.rst' |
746 | --- doc/example/index.rst 1970-01-01 00:00:00 +0000 |
747 | +++ doc/example/index.rst 2012-07-23 03:02:19 +0000 |
748 | @@ -0,0 +1,14 @@ |
749 | +.. _example-index: |
750 | + |
751 | +======== |
752 | +Examples |
753 | +======== |
754 | + |
755 | +Examples of munin and related configuration are gathered here. |
756 | + |
757 | +.. toctree:: |
758 | + |
759 | + webserver/apache-virtualhost.rst |
760 | + webserver/lighttpd.rst |
761 | + webserver/nginx.rst |
762 | + plugin/aggregate.rst |
763 | |
764 | === added directory 'doc/example/plugin' |
765 | === added directory 'doc/example/plugin/aggregate' |
766 | === added file 'doc/example/plugin/aggregate.rst' |
767 | --- doc/example/plugin/aggregate.rst 1970-01-01 00:00:00 +0000 |
768 | +++ doc/example/plugin/aggregate.rst 2012-07-23 03:02:19 +0000 |
769 | @@ -0,0 +1,188 @@ |
770 | +.. _example-plugin-aggregate: |
771 | + |
772 | +============================== |
773 | + Graph aggregation by example |
774 | +============================== |
775 | + |
776 | +This example covers creating aggregate graphs. The configuration reads |
777 | +the current and power from two UPSes (i.e. two hosts with two plugins |
778 | +each) and then creates one virtual host with two virtual plugins; one |
779 | +for current and one for power. |
780 | + |
781 | +Plugins involved |
782 | +================ |
783 | + |
784 | +The example uses a plugin for monitoring UPSes through SNMP, where the |
785 | +UPS address and the different aspects are defined through symlinks. |
786 | +The two UPSes, called "ups-5a" and "ups-5b", are monitored with |
787 | +respect to "current" and "power". Thus, the affected plugins are |
788 | +called as: |
789 | + |
790 | +:: |
791 | + |
792 | + snmp_ups_ups-5a_current |
793 | + snmp_ups_ups-5b_current |
794 | + snmp_ups_ups-5a_power |
795 | + snmp_ups_ups-5b_power |
796 | + |
797 | +The original plugin name is actually "snmp_ups\_\_" - note the "two" |
798 | +underscores at the end. The plugin is then symlinked to the given host |
799 | +name(s) (e.g. ups-5a) and what we want to monitor (e.g. power). Let's |
800 | +just take one closer look at one of them: |
801 | + |
802 | +:: |
803 | + |
804 | + snmp_ups_ups-5a_power |
805 | + -------- ------ ----- |
806 | + | | | |
807 | + | | `--- The function we want to monitor |
808 | + | `--------- The node name of the UPS |
809 | + `----------------- The plugin |
810 | + |
811 | +Extract from munin.conf |
812 | +======================= |
813 | + |
814 | + |
815 | +The following extract from /etc/munin/munin.conf is explained in |
816 | +detail, step by step, below the configuration. |
817 | + |
818 | +:: |
819 | + |
820 | + 1 [UPS;ups-5a] |
821 | + 2 address 127.0.0.1 # localhost fetches data |
822 | + 3 |
823 | + 4 [UPS;ups-5b] |
824 | + 5 address 127.0.0.1 # localhost fetches data |
825 | + 6 |
826 | + 7 [UPS;Aggregated] |
827 | + 8 update no |
828 | + 9 contacts no |
829 | + 10 |
830 | + 11 snmp_ups_current.update no |
831 | + 12 snmp_ups_current.graph_args --base 1000 -l 0 |
832 | + 13 snmp_ups_current.graph_category UPS |
833 | + 14 snmp_ups_current.graph_title Aggregated input/output current |
834 | + 15 snmp_ups_current.graph_vlabel Ampere |
835 | + 16 snmp_ups_current.inputtotal.label Input current |
836 | + 17 snmp_ups_current.outputtotal.label Output current |
837 | + 18 snmp_ups_current.graph_order inputtotal outputtotal |
838 | + 19 snmp_ups_current.inputtotal.sum \ |
839 | + 20 ups-5a:snmp_ups_ups-5a_current.inputcurrent \ |
840 | + 21 ups-5b:snmp_ups_ups-5b_current.inputcurrent |
841 | + 22 snmp_ups_current.outputtotal.sum \ |
842 | + 23 ups-5a:snmp_ups_ups-5a_current.outputcurrent \ |
843 | + 24 ups-5b:snmp_ups_ups-5b_current.outputcurrent |
844 | + 25 |
845 | + 26 snmp_ups_power.update no |
846 | + 27 snmp_ups_power.graph_args --base 1000 -l 0 |
847 | + 28 snmp_ups_power.graph_category UPS |
848 | + 29 snmp_ups_power.graph_title Aggregated output power |
849 | + 30 snmp_ups_power.graph_vlabel Watts |
850 | + 31 snmp_ups_power.output.label Output power |
851 | + 32 snmp_ups_power.graph_order output |
852 | + 33 snmp_ups_power.output.sum \ |
853 | + 34 ups-5a:snmp_ups_ups-5a_power.outputpower \ |
854 | + 35 ups-5b:snmp_ups_ups-5b_power.outputpower |
855 | + |
856 | + |
857 | +Explanations, per line |
858 | +====================== |
859 | + |
860 | +* 1 - 2: The SNMP-based plugin for the UPS known as "ups-5a" is |
861 | + defined. The group name is "UPS" and the node name is "ups-5a". The |
862 | + plugin is run from localhost. |
863 | + |
864 | +* 4 - 5: The SNMP-based plugin for the UPS known as "ups-5b" is |
865 | + defined. The group name is "UPS" and the node name is "ups-5b". The |
866 | + plugin is run from localhost. |
867 | + |
868 | +* 7: The group and "virtual node name" for the aggregated graphs are |
869 | + defined. The group name is "UPS" and the virtual node name is |
870 | + "Aggregated". |
871 | + |
872 | +* 8: Make sure that Munin (specifically, "munin-update") does not try |
873 | + to actively gather information for this node. |
874 | + |
875 | +* 9: Tell "munin-limits" not to send alerts if any limit is breached. |
876 | + |
877 | +The above lines (1 - 9) have now established the fundament for three |
878 | +different graph pages; one for each of the two UPSes and one for the |
879 | +aggregate graphs. |
880 | + |
881 | +* 11 - 15: Define the basic information for the virtual plugin for |
882 | + aggregated current. Note that "snmp_ups_current" is the virtual |
883 | + plugin's name. |
884 | + |
885 | +* 16 - 17: Simultaneously define and label "two" values to be graphed |
886 | + in the virtual plugin: "inputtotal" and "outputtotal". |
887 | + |
888 | +* 18: Order the values. |
889 | + |
890 | +* 19 - 21: Calculate the value for "inputtotal" by reading the |
891 | + "inputcurrent" values from each of the two UPSes. |
892 | + |
893 | +Let's take a closer look at the components |
894 | + |
895 | +:: |
896 | + |
897 | + snmp_ups_current.inputtotal.sum \ |
898 | + ---------------- ---------- --- |
899 | + | | | |
900 | + | | `-- The sum mechanism |
901 | + | `--------- One of this virtual plugin's values |
902 | + `----------------------- The name of the virtual plugin |
903 | + |
904 | +:: |
905 | + |
906 | + ups-5a:snmp_ups_ups-5a_current.inputcurrent \ |
907 | + ups-5b:snmp_ups_ups-5b_current.inputcurrent |
908 | + ------ ----------------------- ------------ |
909 | + | | | |
910 | + | | `------ The "inputcurrent" value from the real plugin |
911 | + | `------------------------ The real plugin's name (symlink) |
912 | + `---------------------------------------- The host name from which to seek information |
913 | + |
914 | + |
915 | +* 22 - 24: Similarly for "outputtotal". |
916 | + |
917 | +* 26 - 35: Like the above, but for power instead. Note that this |
918 | + virtual plugin graphs only "one" value, and as such, only "one" |
919 | + "sum" mechanism is used. |
920 | + |
921 | +Result graphs |
922 | +============= |
923 | + |
924 | +The graphs below show one of the UPSes, and the aggregated values. The |
925 | +graphs used are by week, because they had a nice dip in the beginning |
926 | +of the graphing period :-) |
927 | + |
928 | +Source graphs for one of the UPSes: |
929 | + |
930 | +.. image:: aggregate/ups-5a_current.png |
931 | + |
932 | +.. image:: aggregate/ups-5a_power.png |
933 | + |
934 | +Aggregate graphs: |
935 | + |
936 | +.. image:: aggregate/aggregate_current.png |
937 | + |
938 | +.. image:: aggregate/aggregate_power.png |
939 | + |
940 | +Summary |
941 | +======= |
942 | + |
943 | +We have now, in addition to the two real UPS nodes "ups-5a" and |
944 | +"ups-5b" (lines 1 - 5), created one virtual host named "Aggregated" |
945 | +(line 7) with two virtual plugins: "snmp_ups_current" (lines 11 - 24) |
946 | +and "snmp_ups_power" (lines 26 - 35). |
947 | + |
948 | +The "snmp_ups_current" virtual plugin outputs two field names: |
949 | +"inputtotal" (lines 16 and 19 - 21) and "outputtotal" (lines 17 and |
950 | +22 - 24), while the "snmp_ups_power" virtual plugin outputs only one |
951 | +field name, namely "output" (lines 31 - 35). |
952 | + |
953 | +Further reading |
954 | +=============== |
955 | + |
956 | + * [wiki:Using_SNMP_plugins Using SNMP plugins] |
957 | + * [wiki:munin.conf munin.conf] directives explained |
958 | |
959 | === added file 'doc/example/plugin/aggregate/aggregate_current.png' |
960 | Binary files doc/example/plugin/aggregate/aggregate_current.png 1970-01-01 00:00:00 +0000 and doc/example/plugin/aggregate/aggregate_current.png 2012-07-23 03:02:19 +0000 differ |
961 | === added file 'doc/example/plugin/aggregate/aggregate_power.png' |
962 | Binary files doc/example/plugin/aggregate/aggregate_power.png 1970-01-01 00:00:00 +0000 and doc/example/plugin/aggregate/aggregate_power.png 2012-07-23 03:02:19 +0000 differ |
963 | === added file 'doc/example/plugin/aggregate/ups-5a_current.png' |
964 | Binary files doc/example/plugin/aggregate/ups-5a_current.png 1970-01-01 00:00:00 +0000 and doc/example/plugin/aggregate/ups-5a_current.png 2012-07-23 03:02:19 +0000 differ |
965 | === added file 'doc/example/plugin/aggregate/ups-5a_power.png' |
966 | Binary files doc/example/plugin/aggregate/ups-5a_power.png 1970-01-01 00:00:00 +0000 and doc/example/plugin/aggregate/ups-5a_power.png 2012-07-23 03:02:19 +0000 differ |
967 | === added directory 'doc/example/webserver' |
968 | === added file 'doc/example/webserver/apache-virtualhost.rst' |
969 | --- doc/example/webserver/apache-virtualhost.rst 1970-01-01 00:00:00 +0000 |
970 | +++ doc/example/webserver/apache-virtualhost.rst 2012-07-23 03:02:19 +0000 |
971 | @@ -0,0 +1,65 @@ |
972 | +.. _example-webserver-apache: |
973 | + |
974 | +================================== |
975 | + Apache virtualhost configuration |
976 | +================================== |
977 | + |
978 | +This example describes how to set up munin on a separate apache httpd |
979 | +virtual host. It uses FastCGI if this is available, and falls back to |
980 | +CGI if it is not. |
981 | + |
982 | +Munin configuration |
983 | +=================== |
984 | + |
985 | +This example assumes the following configuration in |
986 | +/etc/munin/munin.conf |
987 | + |
988 | +:: |
989 | + |
990 | + # graph_strategy should be commented out, if present |
991 | + html_strategy cgi |
992 | + |
993 | +Virtualhost configuration |
994 | +========================= |
995 | + |
996 | +Add a new virtualhost, using the following example: |
997 | + |
998 | +:: |
999 | + |
1000 | + <VirtualHost *:80> |
1001 | + ServerName munin.example.org |
1002 | + ServerAlias munin |
1003 | + |
1004 | + ServerAdmin info@example.org |
1005 | + |
1006 | + DocumentRoot /srv/www/munin.example.org |
1007 | + |
1008 | + ErrorLog /var/log/apache2/munin.example.org-error.log |
1009 | + CustomLog /var/log/apache2/munin.example.org-access.log combined |
1010 | + |
1011 | + # Rewrites |
1012 | + RewriteEngine On |
1013 | + |
1014 | + # Static content in /static |
1015 | + RewriteRule ^/favicon.ico /etc/munin/static/favicon.ico [L] |
1016 | + RewriteRule ^/static/(.*) /etc/munin/static/$1 [L] |
1017 | + |
1018 | + # HTML |
1019 | + RewriteCond %{REQUEST_URI} .html$ [or] |
1020 | + RewriteCond %{REQUEST_URI} =/ |
1021 | + RewriteRule ^/(.*) /usr/lib/cgi-bin/munin-cgi-html/$1 [L] |
1022 | + |
1023 | + # Images |
1024 | + RewriteRule ^/cgi-bin/munin-cgi-graph/(.*) /usr/lib/cgi-bin/munin-cgi-graph/$1 [L] |
1025 | + |
1026 | + # Ensure we can run (fast)cgi scripts |
1027 | + <Directory "/usr/lib/cgi-bin"> |
1028 | + Options +ExecCGI |
1029 | + <IfModule mod_fcgid.c> |
1030 | + SetHandler fcgid-script |
1031 | + </IfModule> |
1032 | + <IfModule !mod_fcgid.c> |
1033 | + SetHandler cgi-script |
1034 | + </IfModule> |
1035 | + </Directory> |
1036 | + </VirtualHost> |
1037 | |
1038 | === added file 'doc/example/webserver/lighttpd.rst' |
1039 | --- doc/example/webserver/lighttpd.rst 1970-01-01 00:00:00 +0000 |
1040 | +++ doc/example/webserver/lighttpd.rst 2012-07-23 03:02:19 +0000 |
1041 | @@ -0,0 +1,49 @@ |
1042 | +.. _example-webserver-lighttpd: |
1043 | + |
1044 | +======================== |
1045 | + lighttpd configuration |
1046 | +======================== |
1047 | + |
1048 | +This example describes how to set up munin on lighttpd. It spawns two |
1049 | +lighttpd processes, one for the graph rendering, and one for the html |
1050 | +generation. |
1051 | + |
1052 | +You need to enable the "mod_rewrite" module in the main lighttpd |
1053 | +configuration. |
1054 | + |
1055 | +Munin configuration |
1056 | +=================== |
1057 | + |
1058 | +This example assumes the following configuration in |
1059 | +/etc/munin/munin.conf |
1060 | + |
1061 | +:: |
1062 | + |
1063 | + # graph_strategy should be commented out, if present |
1064 | + html_strategy cgi |
1065 | + |
1066 | +Webserver configuration |
1067 | +======================= |
1068 | + |
1069 | +:: |
1070 | + |
1071 | + alias.url += ( "/munin-static" => "/etc/munin/static" ) |
1072 | + alias.url += ( "/munin" => "/var/cache/munin/www/" ) |
1073 | + |
1074 | + fastcgi.server += ("/cgi-bin/munin-cgi-graph" => |
1075 | + (( "socket" => "/var/run/lighttpd/munin-cgi-graph.sock", |
1076 | + "bin-path" => "/usr/lib/cgi-bin/munin-cgi-graph", |
1077 | + "check-local" => "disable", |
1078 | + )), |
1079 | + "/cgi-bin/munin-cgi-html" => |
1080 | + (( "socket" => "/var/run/lighttpd/munin-cgi-html.sock", |
1081 | + "bin-path" => "/usr/lib/cgi-bin/munin-cgi-html", |
1082 | + "check-local" => "disable", |
1083 | + )) |
1084 | + ) |
1085 | + |
1086 | + url.rewrite-repeat += ( |
1087 | + "/munin/(.*)" => "/cgi-bin/munin-cgi-html/$1", |
1088 | + "/cgi-bin/munin-cgi-html$" => "/cgi-bin/munin-cgi-html/", |
1089 | + "/cgi-bin/munin-cgi-html/static/(.*)" => "/munin-static/$1" |
1090 | + ) |
1091 | |
1092 | === added file 'doc/example/webserver/nginx.rst' |
1093 | --- doc/example/webserver/nginx.rst 1970-01-01 00:00:00 +0000 |
1094 | +++ doc/example/webserver/nginx.rst 2012-07-23 03:02:19 +0000 |
1095 | @@ -0,0 +1,72 @@ |
1096 | +.. _example-webserver-nginx: |
1097 | + |
1098 | +===================== |
1099 | + nginx configuration |
1100 | +===================== |
1101 | + |
1102 | +This example describes how to set up munin on nginx. |
1103 | + |
1104 | +nginx does not spawn FastCGI processes by itself, but comes with an |
1105 | +external "spawn-fcgi" program. |
1106 | + |
1107 | +We need one process for the graph rendering, and one for the html |
1108 | +generation. |
1109 | + |
1110 | +Munin configuration |
1111 | +=================== |
1112 | + |
1113 | +This example assumes the following configuration in |
1114 | +/etc/munin/munin.conf |
1115 | + |
1116 | +:: |
1117 | + |
1118 | + # graph_strategy should be commented out, if present |
1119 | + html_strategy cgi |
1120 | + |
1121 | +FastCGI configuration |
1122 | +===================== |
1123 | + |
1124 | +This will spawn two FastCGI processes trees. One for munin cgi |
1125 | +graphing and one for HTML generation. It will create a socket owned by |
1126 | +www-data, and run the processes as the "munin" user. |
1127 | + |
1128 | +.. code-block:: bash |
1129 | + |
1130 | + spawn-fcgi -s /var/run/munin/fastcgi-graph.sock -U www-data \ |
1131 | + -u munin -g munin /usr/lib/cgi-bin/munin-cgi-graph |
1132 | + |
1133 | + spawn-fcgi -s /var/run/munin/fastcgi-html.sock -U www-data \ |
1134 | + -u munin -g munin /usr/lib/cgi-bin/munin-html-graph |
1135 | + |
1136 | +Note: Depending on your installation method, the "munin-\*-graph" |
1137 | +programs may be in another directory. Check Makefile.config if you |
1138 | +installed from source, or your package manager if you used that to |
1139 | +install. |
1140 | + |
1141 | +Note: If you installed using the package manager on Debian or Ubuntu, |
1142 | +the /var/log/munin/munin-cgi-\*.log files may be owned by the |
1143 | +"www-data" user. This example runs the processes as the "munin" user, |
1144 | +so you need to chown the log files, and edit /etc/logrotate.d/munin. |
1145 | + |
1146 | +Webserver configuration |
1147 | +======================= |
1148 | + |
1149 | +:: |
1150 | + |
1151 | + location ^~ /cgi-bin/munin-cgi-graph/ { |
1152 | + fastcgi_split_path_info ^(/cgi-bin/munin-cgi-graph)(.*); |
1153 | + fastcgi_param PATH_INFO $fastcgi_path_info; |
1154 | + fastcgi_pass unix:/var/run/munin/fastcgi-graph.sock; |
1155 | + include fastcgi_params; |
1156 | + } |
1157 | + |
1158 | + location /munin/static/ { |
1159 | + alias /etc/munin/static/; |
1160 | + } |
1161 | + |
1162 | + location /munin/ { |
1163 | + fastcgi_split_path_info ^(/munin)(.*); |
1164 | + fastcgi_param PATH_INFO $fastcgi_path_info; |
1165 | + fastcgi_pass unix:/var/run/munin/fastcgi-html.sock; |
1166 | + include fastcgi_params; |
1167 | + } |
1168 | |
1169 | === added file 'doc/index.rst' |
1170 | --- doc/index.rst 1970-01-01 00:00:00 +0000 |
1171 | +++ doc/index.rst 2012-07-23 03:02:19 +0000 |
1172 | @@ -0,0 +1,29 @@ |
1173 | +.. Munin documentation master file, created by |
1174 | + sphinx-quickstart on Sat Jun 9 11:12:29 2012. |
1175 | + You can adapt this file completely to your liking, but it should at least |
1176 | + contain the root `toctree` directive. |
1177 | + |
1178 | +Welcome to Munin's documentation! |
1179 | +================================= |
1180 | + |
1181 | +Warning: This documentation is being developed. It is incomplete, and |
1182 | +may even be plain wrong. Feedback is welcome. |
1183 | + |
1184 | +Contents: |
1185 | + |
1186 | +.. toctree:: |
1187 | + :maxdepth: 2 |
1188 | + |
1189 | + installation/index.rst |
1190 | + master/index.rst |
1191 | + plugin/index.rst |
1192 | + documentation/index.rst |
1193 | + example/index.rst |
1194 | + |
1195 | +Indices and tables |
1196 | +================== |
1197 | + |
1198 | +* :ref:`genindex` |
1199 | +* :ref:`modindex` |
1200 | +* :ref:`search` |
1201 | + |
1202 | |
1203 | === added directory 'doc/installation' |
1204 | === added file 'doc/installation/configuration.rst' |
1205 | --- doc/installation/configuration.rst 1970-01-01 00:00:00 +0000 |
1206 | +++ doc/installation/configuration.rst 2012-07-23 03:02:19 +0000 |
1207 | @@ -0,0 +1,84 @@ |
1208 | +======================= |
1209 | + Initial configuration |
1210 | +======================= |
1211 | + |
1212 | +Node |
1213 | +==== |
1214 | + |
1215 | +Plugins |
1216 | +------- |
1217 | + |
1218 | +Decide which plugins to use. The munin node runs all plugins present |
1219 | +in CONFDIR/plugins/ |
1220 | + |
1221 | +The quick auto-plug-and-play solution: |
1222 | + |
1223 | +.. code-block:: bash |
1224 | + |
1225 | + munin-node-configure --shell --families=contrib,auto | sh -x |
1226 | + |
1227 | +Access |
1228 | +------ |
1229 | + |
1230 | +The munin node listens on all interfaces by default, but has a |
1231 | +restrictive access list. You need to add your master's IP address. |
1232 | + |
1233 | +The "cidr_allow", "cidr_deny", "allow" and "deny" statements are used. |
1234 | + |
1235 | +cidr_allow uses the following syntax (the /32 is not implicit, so for |
1236 | +a single host, you need to add it): |
1237 | + |
1238 | + | cidr_allow 127.0.0.0/8 |
1239 | + | cidr_allow 192.0.2.1/32 |
1240 | + |
1241 | +allow uses regular expression matching against the client IP address. |
1242 | + |
1243 | + | allow '^127\.' |
1244 | + | allow '^192\.0\.2\.1$' |
1245 | + |
1246 | +For specific information about the syntax, see `Net::Server |
1247 | +<http://search.cpan.org/dist/Net-Server/lib/Net/Server.pod>`_. Please |
1248 | +keep in mind that cidr_allow is a recent addition, and may not be |
1249 | +available on all systems. |
1250 | + |
1251 | +Startup |
1252 | +------- |
1253 | + |
1254 | +Start the node agent (as root) SBINDIR/munin-node. Restart it it it |
1255 | +was already started. The node only discovers new plugins when it is |
1256 | +restarted. |
1257 | + |
1258 | +You probably want to use an init-script instead and you might find a |
1259 | +good one under build/dists or in the build/resources directory (maybe |
1260 | +you need to edit the init script, check the given paths in the script |
1261 | +you might use). |
1262 | + |
1263 | +Master |
1264 | +====== |
1265 | + |
1266 | +Add some nodes |
1267 | +-------------- |
1268 | + |
1269 | +Add some nodes to CONFDIR/munin.conf |
1270 | + |
1271 | +[node.example.com] |
1272 | + address 192.0.2.4 |
1273 | + |
1274 | +[node2.example.com] |
1275 | + address node2.example.com |
1276 | + |
1277 | +[node3.example.com] |
1278 | + address 2001:db8::de:caf:bad |
1279 | + |
1280 | +Configure web server |
1281 | +==================== |
1282 | + |
1283 | +On the master, you need to configure a web server. |
1284 | + |
1285 | +If you have installed "munin" through distribution |
1286 | +packages, a webserver may have been configured for you already. |
1287 | + |
1288 | +If you installed from source, there is a minimal configuration example |
1289 | +in the "resources" directory in the source tarball. |
1290 | + |
1291 | +For a more complex example, see :ref:`example-webserver-apache` |
1292 | |
1293 | === added file 'doc/installation/help.rst' |
1294 | --- doc/installation/help.rst 1970-01-01 00:00:00 +0000 |
1295 | +++ doc/installation/help.rst 2012-07-23 03:02:19 +0000 |
1296 | @@ -0,0 +1,27 @@ |
1297 | +============== |
1298 | + Getting help |
1299 | +============== |
1300 | + |
1301 | +IRC Channel |
1302 | +=========== |
1303 | + |
1304 | +The most immediate way to get hold of us is to join our IRC channel: |
1305 | + |
1306 | + ``#munin on server irc.oftc.net`` |
1307 | + |
1308 | +The main timezone of the channel is Europe+America. |
1309 | + |
1310 | +If you can explain your problem in a few clear sentences, without too |
1311 | +much copy&paste, IRC is a good way to try to get help. If you do need |
1312 | +to paste log files, configuration snippets, scripts and so on, please |
1313 | +use a pastebin_. |
1314 | + |
1315 | +If the channel is all quiet, try again some time later, we do have |
1316 | +lives, families and jobs to deal with also. |
1317 | + |
1318 | +You are more than welcome to just hang out, and while we don't mind |
1319 | +the occational intrusion of the real world into the flow, keep it |
1320 | +mostly on topic, and dont paste random links unless they are *really* |
1321 | +spectacular and intelligent. |
1322 | + |
1323 | +.. _pastebin: https://gist.github.com/ |
1324 | |
1325 | === added file 'doc/installation/index.rst' |
1326 | --- doc/installation/index.rst 1970-01-01 00:00:00 +0000 |
1327 | +++ doc/installation/index.rst 2012-07-23 03:02:19 +0000 |
1328 | @@ -0,0 +1,16 @@ |
1329 | +.. _install-index: |
1330 | + |
1331 | +==================== |
1332 | + Munin installation |
1333 | +==================== |
1334 | + |
1335 | +This document explains how to get Munin onto your system, where to get |
1336 | +help, and how to report bugs. |
1337 | + |
1338 | +.. toctree:: |
1339 | + |
1340 | + prerequisites.rst |
1341 | + install.rst |
1342 | + configuration.rst |
1343 | + help.rst |
1344 | + upgrade.rst |
1345 | |
1346 | === added file 'doc/installation/install.rst' |
1347 | --- doc/installation/install.rst 1970-01-01 00:00:00 +0000 |
1348 | +++ doc/installation/install.rst 2012-07-23 03:02:19 +0000 |
1349 | @@ -0,0 +1,177 @@ |
1350 | +================== |
1351 | + Installing Munin |
1352 | +================== |
1353 | + |
1354 | +With open source software, you can choose to install binary packages |
1355 | +or install from source-code. To install a package or install from |
1356 | +source is a matter of personal taste. If you don't know which method |
1357 | +too choose read the whole document and choose the method you are most |
1358 | +comfortable with. |
1359 | + |
1360 | +Master and node |
1361 | +=============== |
1362 | + |
1363 | +Munin is split into two distinct roles. |
1364 | + |
1365 | +Node |
1366 | +---- |
1367 | + |
1368 | +The "munin node" is a daemon which runs on all servers being |
1369 | +monitored. |
1370 | + |
1371 | + |
1372 | +Master |
1373 | +------ |
1374 | + |
1375 | +The "munin master" connects to all munin nodes, collects data, and |
1376 | +stores it in `RRD <http://oss.oetiker.ch/rrdtool/>`_ |
1377 | + |
1378 | +You will need to install "munin-master" on the server which will |
1379 | +collect data from all nodes, and graph the results. When starting with |
1380 | +munin, it should be enough to install the munin master on one server. |
1381 | + |
1382 | +On the munin master, you will need a web server capable of running CGI |
1383 | +or FastCGI. Apache HTTD should be suitable. Also reported to be |
1384 | +working is nginx and lighttpd. |
1385 | + |
1386 | +Source or packages? |
1387 | +=================== |
1388 | + |
1389 | +Installing Munin on most relevant operating systems can usually be |
1390 | +done with with the systems package manager, typical examples being: |
1391 | + |
1392 | +FreeBSD |
1393 | +------- |
1394 | + |
1395 | +From source: |
1396 | + |
1397 | +.. code-block:: bash |
1398 | + |
1399 | + cd /usr/ports/sysutils/munin-master && make install clean |
1400 | + cd /usr/ports/sysutils/munin-node && make install clean |
1401 | + |
1402 | +Binary packages: |
1403 | + |
1404 | +.. code-block:: bash |
1405 | + |
1406 | + pkg_add -r munin-master |
1407 | + pkg_add -r munin-node |
1408 | + |
1409 | +Debian/Ubuntu |
1410 | +------------- |
1411 | + |
1412 | +Munin is distributed with both Debian and Ubuntu. |
1413 | + |
1414 | +In order to get Munin up and running type |
1415 | + |
1416 | +.. code-block:: bash |
1417 | + |
1418 | + sudo apt-get install munin-node |
1419 | + |
1420 | +on all nodes, and |
1421 | + |
1422 | +.. code-block:: bash |
1423 | + |
1424 | + sudo apt-get install munin |
1425 | + |
1426 | +on the master. |
1427 | + |
1428 | +Please note that this might not be the latest version of Munin. On |
1429 | +Debian you have the option of enabling "backports", which may give |
1430 | +access to later versions of Munin. |
1431 | + |
1432 | +RedHat / CentOS / Fedora |
1433 | +------------------------ |
1434 | + |
1435 | +At time of writing, only the 1.x version of munin is available in |
1436 | +`EPEL |
1437 | +<http://dl.fedoraproject.org/pub/epel/6/SRPMS/repoview/munin.html>`_. |
1438 | + |
1439 | +If you want 2.x, your best option is probably to install from source. |
1440 | + |
1441 | +Other systems |
1442 | +------------- |
1443 | + |
1444 | +On other systems, you are probably best off compiling your own code. |
1445 | +See `Installing Munin from source`_. |
1446 | + |
1447 | +Installing Munin from source |
1448 | +============================ |
1449 | + |
1450 | +If there are no binary packages available for your system, or if you |
1451 | +want to install Munin from source for other reasons, follow these |
1452 | +steps: |
1453 | + |
1454 | +We recommend downloading a release tarball, which you can find on |
1455 | +`sourceforge.net <http://sourceforge.net/projects/munin/files/stable/>`_. |
1456 | + |
1457 | +Alternatively, if you want to hack on Munin, you should clone our git |
1458 | +repository by doing. |
1459 | + |
1460 | +.. code-block:: bash |
1461 | + |
1462 | + git clone git://github.com/munin-monitoring/munin |
1463 | + |
1464 | +Please note that a git checkout will need some more build-dependencies |
1465 | +than listed below, in particular the Python Docutils and Sphinx. |
1466 | + |
1467 | +Build dependencies on Debian / Ubuntu |
1468 | +------------------------------------- |
1469 | + |
1470 | +In order to build Munin from source you need a number of packages |
1471 | +installed. On a Debian or Ubuntu system these are: |
1472 | + |
1473 | +* perl |
1474 | +* htmldoc |
1475 | +* html2text |
1476 | +* default-jdk |
1477 | + |
1478 | +Configuring and installing |
1479 | +-------------------------- |
1480 | + |
1481 | +Warning for NFS users |
1482 | +~~~~~~~~~~~~~~~~~~~~~ |
1483 | + |
1484 | +If you're using NFS please note that the "make install" process is |
1485 | +slightly problematic in that it (Module::Build actually) writes files |
1486 | +under $CWD. Since "make install" is usually run by root and root |
1487 | +usually cannot write files on a NFS volume, this will fail. If you use |
1488 | +NFS please install munin from /var/tmp, /tmp or some such to work |
1489 | +around this. |
1490 | + |
1491 | +Running make |
1492 | +~~~~~~~~~~~~ |
1493 | + |
1494 | +There are make targets for node, master, documentation and man files. |
1495 | +Generally you want to install everything on the master, and just the |
1496 | +node and plugiuns on the nodes. |
1497 | + |
1498 | +- Edit Makefile.config to suit your needs. |
1499 | + |
1500 | +- Create the user "munin" with the primary group "munin". |
1501 | + |
1502 | + The user needs no shell and no privileges. On most Linux systems the |
1503 | + munin user's shell is the nologin shell (it has different paths on |
1504 | + different systems - but the user still needs to be able to run cron |
1505 | + jobs. |
1506 | + |
1507 | +Node |
1508 | +~~~~ |
1509 | + |
1510 | +For the node, you need only the common parts, the node and the plugins. |
1511 | + |
1512 | +.. code-block:: bash |
1513 | + |
1514 | + make |
1515 | + make install-common-prime install-node-prime install-plugins-prime |
1516 | + |
1517 | + |
1518 | +Master |
1519 | +~~~~~~ |
1520 | + |
1521 | +For the master, this will install everything. |
1522 | + |
1523 | +.. code-block:: bash |
1524 | + |
1525 | + make |
1526 | + make install |
1527 | |
1528 | === added file 'doc/installation/prerequisites.rst' |
1529 | --- doc/installation/prerequisites.rst 1970-01-01 00:00:00 +0000 |
1530 | +++ doc/installation/prerequisites.rst 2012-07-23 03:02:19 +0000 |
1531 | @@ -0,0 +1,68 @@ |
1532 | +=============== |
1533 | + Prerequisites |
1534 | +=============== |
1535 | + |
1536 | +In order for you to install Munin you must have the following: |
1537 | + |
1538 | +Building munin |
1539 | +============== |
1540 | + |
1541 | +In order to build munin, you need: |
1542 | + |
1543 | +* GNU Make — Please do not attempt to use any other make. |
1544 | + |
1545 | +* A reasonable Perl 5 (Version 5.8 or newer) |
1546 | + |
1547 | +* Perl modules: Module::Build |
1548 | + |
1549 | +Developers / packagers need |
1550 | + |
1551 | +* Test::MockModule |
1552 | +* Test::MockObject |
1553 | +* Test::Pod::Coverage |
1554 | +* Test::Perl::Critic 1.096 or later |
1555 | +* Test::Exception |
1556 | +* Directory::Scratch (err, wherefrom?) |
1557 | + |
1558 | +In order to build the documentation, you need: |
1559 | +* sphinx |
1560 | + |
1561 | +Running munin |
1562 | +============ |
1563 | + |
1564 | +In order to run munin, you need: |
1565 | + |
1566 | +* A reasonable perl 5 (Version 5.8 or newer) |
1567 | + |
1568 | +The munin node needs: |
1569 | + |
1570 | +* Perl modules |
1571 | + |
1572 | + * Net::Server |
1573 | + * Net::Server::Fork |
1574 | + * Time::HiRes |
1575 | + * Net::SNMP (Optional, if you want to use SNMP plugins) |
1576 | + |
1577 | +* Java JRE (Optional, if you want to use java plugins) |
1578 | +* Anything the separate plugins may need. These have diverse |
1579 | + requirements, not documented here. |
1580 | + |
1581 | +The munin master needs |
1582 | + |
1583 | +* Perl modules: |
1584 | + |
1585 | + * CGI::Fast |
1586 | + * Digest::MD5, |
1587 | + * File\::Copy::Recursive |
1588 | + * Getopt::Long |
1589 | + * HTML::Template |
1590 | + * IO::Socket::INET6 |
1591 | + * Log::Log4perl 1.18 or later |
1592 | + * Net::SSLeay (Optional, if you want to use SSL/TLS) |
1593 | + * Params::Validate |
1594 | + * Storable |
1595 | + * Text::Balanced |
1596 | + * Time::HiRes |
1597 | + * TimeDate |
1598 | + |
1599 | +* A web server capable of CGI or FastCGI |
1600 | |
1601 | === added file 'doc/installation/upgrade.rst' |
1602 | --- doc/installation/upgrade.rst 1970-01-01 00:00:00 +0000 |
1603 | +++ doc/installation/upgrade.rst 2012-07-23 03:02:19 +0000 |
1604 | @@ -0,0 +1,19 @@ |
1605 | +================================= |
1606 | + Upgrading Munin from 1.x to 2.x |
1607 | +================================= |
1608 | + |
1609 | +This is a compilation of items you need to pay attention to when |
1610 | +upgrading from Munin 1.x to munin 2.x |
1611 | + |
1612 | +FastCGI |
1613 | +======= |
1614 | + |
1615 | +Munin graphing is now done with FastCGI. |
1616 | + |
1617 | +Munin HTML generation is optionally done with FastCGI. |
1618 | + |
1619 | +Logging |
1620 | +======= |
1621 | + |
1622 | +The web server needs write access to the munin-cgi-html and |
1623 | +munin-cgi-graph logs. |
1624 | |
1625 | === added directory 'doc/master' |
1626 | === added file 'doc/master/index.rst' |
1627 | --- doc/master/index.rst 1970-01-01 00:00:00 +0000 |
1628 | +++ doc/master/index.rst 2012-07-23 03:02:19 +0000 |
1629 | @@ -0,0 +1,18 @@ |
1630 | +.. _master-index: |
1631 | + |
1632 | +================== |
1633 | + The Munin master |
1634 | +================== |
1635 | + |
1636 | +The munin master is responsible for gathering data from munin nodes. |
1637 | +It stores this data in RRD, and graphs them on request. |
1638 | + |
1639 | +The munin master consists of the following components: |
1640 | + |
1641 | +.. toctree:: |
1642 | + |
1643 | + munin-cron.rst |
1644 | + munin-update.rst |
1645 | + munin-limits.rst |
1646 | + munin-html.rst |
1647 | + rrdcached.rst |
1648 | |
1649 | === added file 'doc/master/munin-cron.rst' |
1650 | --- doc/master/munin-cron.rst 1970-01-01 00:00:00 +0000 |
1651 | +++ doc/master/munin-cron.rst 2012-07-23 03:02:19 +0000 |
1652 | @@ -0,0 +1,14 @@ |
1653 | +.. _munin-cron: |
1654 | + |
1655 | +============ |
1656 | + munin-cron |
1657 | +============ |
1658 | + |
1659 | +"munin-cron" runs the following programs, in the given order: |
1660 | + |
1661 | +1. :ref:`munin-update` |
1662 | +2. :ref:`munin-limits` |
1663 | +3. :ref:`munin-html` (unless configured to run from CGI) |
1664 | + |
1665 | +Unless the munin master is configured otherwise, "munin-cron" should |
1666 | +run every 5 minutes. |
1667 | |
1668 | === added file 'doc/master/munin-html.rst' |
1669 | --- doc/master/munin-html.rst 1970-01-01 00:00:00 +0000 |
1670 | +++ doc/master/munin-html.rst 2012-07-23 03:02:19 +0000 |
1671 | @@ -0,0 +1,13 @@ |
1672 | +.. _munin-html: |
1673 | + |
1674 | +============ |
1675 | + munin-html |
1676 | +============ |
1677 | + |
1678 | +munin-html is one of the munin master components run from the |
1679 | +:ref:`munin-cron` script. |
1680 | + |
1681 | +This script is responsible for generating static HTML pages. |
1682 | + |
1683 | +If "html_strategy cgi" is set in munin.conf, munin-html will assume |
1684 | +HTML pages are generated by munin-cgi-html, and exit silently. |
1685 | |
1686 | === added file 'doc/master/munin-limits.rst' |
1687 | --- doc/master/munin-limits.rst 1970-01-01 00:00:00 +0000 |
1688 | +++ doc/master/munin-limits.rst 2012-07-23 03:02:19 +0000 |
1689 | @@ -0,0 +1,13 @@ |
1690 | +.. _munin-limits: |
1691 | + |
1692 | +============== |
1693 | + munin-limits |
1694 | +============== |
1695 | + |
1696 | +"munin-limits" is one of the processes regularly run from the |
1697 | +:ref:`munin-cron` script. |
1698 | + |
1699 | +It reads the last collected values for each plugin from the RRD files, |
1700 | +and compares them to the plugin's warning and critical values (if |
1701 | +any). If the limits are breached, it sends an event to any configured |
1702 | +contacts. |
1703 | |
1704 | === added file 'doc/master/munin-update.rst' |
1705 | --- doc/master/munin-update.rst 1970-01-01 00:00:00 +0000 |
1706 | +++ doc/master/munin-update.rst 2012-07-23 03:02:19 +0000 |
1707 | @@ -0,0 +1,17 @@ |
1708 | +.. _munin-update: |
1709 | + |
1710 | +============== |
1711 | + munin-update |
1712 | +============== |
1713 | + |
1714 | +munin-update is the primary Munin component. It is run from the |
1715 | +:ref:`munin-cron` script. |
1716 | + |
1717 | +This script is responsible for contacting all the agents (munin-nodes) |
1718 | +and collecting their data. Upon fetching the data, munin-update stores |
1719 | +everything in RRD files - one RRD files for each field in each plugin. |
1720 | + |
1721 | +Running munin-update with the --debug flag will often give plenty of |
1722 | +hints on what might be wrong. |
1723 | + |
1724 | +munin-update is a component in the Munin server. |
1725 | |
1726 | === added file 'doc/master/rrdcached.rst' |
1727 | --- doc/master/rrdcached.rst 1970-01-01 00:00:00 +0000 |
1728 | +++ doc/master/rrdcached.rst 2012-07-23 03:02:19 +0000 |
1729 | @@ -0,0 +1,116 @@ |
1730 | +.. _munin-master-rrdcached: |
1731 | + |
1732 | +========================================= |
1733 | + Scaling the munin master with rrdcached |
1734 | +========================================= |
1735 | + |
1736 | +When the master grows big, and has a lot of nodes, there is a risk of |
1737 | +disk IO becoming a bottleneck. |
1738 | + |
1739 | +To reduce this disk IO, you can use the RRD Cache Daemon. |
1740 | + |
1741 | +This will spool RRD changes in a queue, and flush changes on demand, |
1742 | +and periodically. This will replace lots of random writes with a much |
1743 | +smaller amount of sequential writes. |
1744 | + |
1745 | +Configuring rrdcached |
1746 | +===================== |
1747 | + |
1748 | +Parameters |
1749 | +---------- |
1750 | + |
1751 | +RRDCached writes the spool data every 5 mintes by default. This is the |
1752 | +same as the munin master. To have an effect, change the flushing |
1753 | +intervals to allow more data to be spooled. Use the following |
1754 | +parameters, and tune to your liking: |
1755 | + |
1756 | ++---------+-----------------------------------------------------+ |
1757 | +| -w 1800 | Wait 30 minutes before writing data | |
1758 | ++---------+-----------------------------------------------------+ |
1759 | +| -z 1800 | Delay writes by a random factor of up to 30 minutes | |
1760 | +| | (this should be equal to, or lower than, "-w") | |
1761 | ++---------+-----------------------------------------------------+ |
1762 | +| -f 3600 | Flush all data every hour | |
1763 | ++---------+-----------------------------------------------------+ |
1764 | + |
1765 | +Example |
1766 | +------- |
1767 | + |
1768 | +Create a directory for the rrdcached journal, and have the "munin" |
1769 | +user own it. (in this example: /var/lib/munin/rrdcached-journal). |
1770 | + |
1771 | +Set up a separate RRDCached instance, run by the munin user. The |
1772 | +following command starts an RRDCached instance, and can be added to |
1773 | +/etc/rc.local. |
1774 | + |
1775 | +.. code-block:: bash |
1776 | + |
1777 | + sudo -u munin /usr/bin/rrdcached \ |
1778 | + -p /run/munin/rrdcached.pid \ |
1779 | + -B -b /var/lib/munin/ \ |
1780 | + -F -j /var/lib/munin/rrdcached-journal/ \ |
1781 | + -m 0660 -l unix:/run/munin/rrdcached.sock \ |
1782 | + -w 1800 -z 1800 -f 3600 |
1783 | + |
1784 | +Note: While testing, add "-g" to the command line to prevent rrdcached |
1785 | +from forking into the background. |
1786 | + |
1787 | +The munin grapher also needs write access to this socket, in order for |
1788 | +it to tell the RRDCached to flush data needed for graphing. If you run |
1789 | +munin with CGI graphing, you will need to give the web server access. |
1790 | +For a common setup, run the following command, as root, after starting |
1791 | +rrdcached: |
1792 | + |
1793 | +.. code-block:: bash |
1794 | + |
1795 | + chgrp www-data /run/munin/rrdcached.sock |
1796 | + |
1797 | +Recommended: If you have systemd installed, use a systemd service. If |
1798 | +you have upstart installed, write a daemon job configuration file. If |
1799 | +you use systemd, you can add "-g" to the rrdcached command line. |
1800 | + |
1801 | +Configuring munin to use rrdcached |
1802 | +=================================== |
1803 | + |
1804 | +To enable rrdcached on the munin master, you will need to set the |
1805 | +"rrdcached_socket" line in /etc/munin/munin.conf |
1806 | + |
1807 | +:: |
1808 | + |
1809 | + rrdcached_socket=/run/munin/rrdcached.sock |
1810 | + |
1811 | + |
1812 | +Is it working? |
1813 | +============== |
1814 | + |
1815 | +If all goes well, you should see the following: |
1816 | + |
1817 | +Munin logging |
1818 | +------------- |
1819 | + |
1820 | +There should be no messages regarding rrdcached in |
1821 | +/var/log/munin/munin-update.log. |
1822 | + |
1823 | + |
1824 | +On failure to connect, there will be log lines like: |
1825 | + |
1826 | +:: |
1827 | + |
1828 | + 2012/06/26 18:56:12 [WARN] RRDCached feature ignored: rrdcached socket not writable |
1829 | + |
1830 | +…and you should then check for permissions problems. |
1831 | + |
1832 | +RRDCached spool |
1833 | +--------------- |
1834 | + |
1835 | +The rrdcached spool file should be in |
1836 | +/var/lib/munin/rrdcached-journal/, and it should grow for each run of |
1837 | +munin-update until it hits the flush time. The file looks like: |
1838 | + |
1839 | +:: |
1840 | + |
1841 | + /var/lib/munin/rrdcached-journal/rrd.journal.1340869388.141124 |
1842 | + |
1843 | +For a munin master with 200 nodes, this could well grow to 100MiB, |
1844 | +depending on the number of plugins, and the spool file time |
1845 | +parameters. |
1846 | |
1847 | === added directory 'doc/plugin' |
1848 | === added file 'doc/plugin/aggregate.rst' |
1849 | --- doc/plugin/aggregate.rst 1970-01-01 00:00:00 +0000 |
1850 | +++ doc/plugin/aggregate.rst 2012-07-23 03:02:19 +0000 |
1851 | @@ -0,0 +1,8 @@ |
1852 | +.. _aggregate: |
1853 | + |
1854 | +================== |
1855 | + Borrowing data |
1856 | +================== |
1857 | + |
1858 | +It is possible to exchange datapoints between plugins, or construct |
1859 | +entirely new plugins based on purely borrowed data. |
1860 | |
1861 | === added file 'doc/plugin/index.rst' |
1862 | --- doc/plugin/index.rst 1970-01-01 00:00:00 +0000 |
1863 | +++ doc/plugin/index.rst 2012-07-23 03:02:19 +0000 |
1864 | @@ -0,0 +1,13 @@ |
1865 | +.. _plugin-index: |
1866 | + |
1867 | +================== |
1868 | + The Munin plugin |
1869 | +================== |
1870 | + |
1871 | +This document explains how munin plugins work, how to install, |
1872 | +configure, debug, and how to write new plugins. |
1873 | + |
1874 | +.. toctree:: |
1875 | + |
1876 | + aggregate.rst |
1877 | + reference.rst |
1878 | |
1879 | === added file 'doc/plugin/reference.rst' |
1880 | --- doc/plugin/reference.rst 1970-01-01 00:00:00 +0000 |
1881 | +++ doc/plugin/reference.rst 2012-07-23 03:02:19 +0000 |
1882 | @@ -0,0 +1,134 @@ |
1883 | +================== |
1884 | + Plugin reference |
1885 | +================== |
1886 | + |
1887 | +Fields |
1888 | +====== |
1889 | + |
1890 | +On a configuration run, the plugin is called with the argument "config". The |
1891 | +following fields are used. |
1892 | + |
1893 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1894 | +| Field | Value | type | Description | See also | Default | |
1895 | ++====================+==================+==========+==========================================+==================+=========+ |
1896 | +| graph_title | string | required | Sets the title of the graph | | | |
1897 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1898 | +| graph_args | string | optional | Arguments for the rrd grapher. This is | rrdgraph_ | | |
1899 | +| | | | used to control how the generated graph | | | |
1900 | +| | | | looks, and how values are interpreted or | | | |
1901 | +| | | | presented. | | | |
1902 | +| | | | | | | |
1903 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1904 | +| graph_vlabel | string | optional | Label for the vertical axis of the graph | | | |
1905 | +| | | | | | | |
1906 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1907 | +| graph_category | lower case | optional | Category used to sort the graph on the | | misc | |
1908 | +| | string, no | | generated index web page. | | | |
1909 | +| | whitespace | | | | | |
1910 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1911 | +| graph_info | html text | optional | Additional text for the generated graph | | | |
1912 | +| | | | web page | | | |
1913 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1914 | +| graph_scale | yes|no | optional | If "yes", the generated graph will be | | no | |
1915 | +| | | | scaled to the uppper and lower values of | | | |
1916 | +| | | | the datapoints within the graph. | | | |
1917 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1918 | +| graph_order | space separated | optional | Ensures that the listed datapoints are | :ref:`aggregate` | | |
1919 | +| | list of | | displayed in order. Any additional | | | |
1920 | +| | graph.datapoints | | datapoints are added in the order of | | | |
1921 | +| | | | appearance after datapoitns appearing on | | | |
1922 | +| | | | this list. | | | |
1923 | +| | | | | | | |
1924 | +| | | | This field is also used for "borrowing", | | | |
1925 | +| | | | which is the practice of taking | | | |
1926 | +| | | | datapoints from other graphs. | | | |
1927 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1928 | +| datapoint.label | lower case | required | The label used in the graph for this | | | |
1929 | +| | string, no | | field | | | |
1930 | +| | whitespace | | | | | |
1931 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1932 | +| datapoint.info | html text | optional | Additional html text for the generated | | | |
1933 | +| | | | graph web page, used in the field | | | |
1934 | +| | | | description table | | | |
1935 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1936 | +| datapoint.warning | integer, or | optional | This field defines a threshold value or | | | |
1937 | +| | integer:integer | | range. If the field value above the | | | |
1938 | +| | (signed) | | defined warning value, or outside the | | | |
1939 | +| | | | range, the service is considered to be in| | | |
1940 | +| | | | a "warning" state. | | | |
1941 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1942 | +| datapoint.critical | integer, or | optional | This field defines a threshold value or | | | |
1943 | +| | integer:integer | | range. If the field value is above the | | | |
1944 | +| | (signed) | | defined critical value, or outside the | | | |
1945 | +| | | | range, the service is considered to be in| | | |
1946 | +| | | | a "critical" state. | | | |
1947 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1948 | +| datapoint.graph | yes|no | optional | Determines if this datapoint should be | | yes | |
1949 | +| | | | visible in the generated graph. | | | |
1950 | +| | | | | | | |
1951 | +| | | | | | | |
1952 | +| | | | | | | |
1953 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1954 | +| datapoint.cdef | CDEF statement | optional | A CDEF statement is a Reverse Polish | cdeftutorial_ | | |
1955 | +| | | | Notation statement used to construct a | | | |
1956 | +| | | | datapoint from other datapoints. | | | |
1957 | +| | | | | | | |
1958 | +| | | | This is commonly used to calculate | | | |
1959 | +| | | | percentages. | | | |
1960 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1961 | +| datapoint.draw | AREA, LINE, | | Determines how the graph datapoints are | rrdgraph_ | LINE | |
1962 | +| | LINE[n], STACK, | | displayed in the graph. The "LINE" takes | | | |
1963 | +| | AREASTACK, | | an optional width suffix, commonly | | | |
1964 | +| | LINESTACK, | | "LINE1", "LINE2", etc… | | | |
1965 | +| | LINE[n]STACK | | The *STACK values are specific to munin | | | |
1966 | +| | | | and makes the first a LINE, LINE[n] or | | | |
1967 | +| | | | AREA datasource, and the rest as STACK. | | | |
1968 | ++--------------------+------------------+----------+------------------------------------------+------------------+---------+ |
1969 | + |
1970 | +On a data fetch run, the plugin is called with no arguments. the following |
1971 | +fields are used. |
1972 | + |
1973 | ++-----------------+-----------------------+----------+------------------+------+------------+ |
1974 | +| Field | Value | type | Description | See | Default | |
1975 | +| | | | | also | | |
1976 | ++=================+=======================+==========+==================+======+============+ |
1977 | +| datapoint.value | integer, scientific | required | The value to be | | No default | |
1978 | +| | notation, or "U" (may | | graphed. | | | |
1979 | +| | be signed) | | | | | |
1980 | +| | | | | | | |
1981 | ++-----------------+-----------------------+----------+------------------+------+------------+ |
1982 | + |
1983 | +Example |
1984 | +======= |
1985 | + |
1986 | +This is an example of the plugin fields used with the "df" plugin. The |
1987 | +"munin-run" command is used to run the plugin from the command line. |
1988 | + |
1989 | +Configuration run |
1990 | +----------------- |
1991 | + |
1992 | +:: |
1993 | + |
1994 | + # munin-run df config |
1995 | + graph_title Filesystem usage (in %) |
1996 | + graph_args --upper-limit 100 -l 0 |
1997 | + graph_vlabel % |
1998 | + graph_category disk |
1999 | + graph_info This graph shows disk usage on the machine. |
2000 | + _dev_hda1.label / |
2001 | + _dev_hda1.info / (ext3) -> /dev/hda1 |
2002 | + _dev_hda1.warning 92 |
2003 | + _dev_hda1.critical 98 |
2004 | + |
2005 | +Data fetch run |
2006 | +-------------- |
2007 | + |
2008 | +:: |
2009 | + |
2010 | + # munin-run df |
2011 | + _dev_hda1.value 83 |
2012 | + |
2013 | + |
2014 | +.. _cdeftutorial: http://oss.oetiker.ch/rrdtool/tut/cdeftutorial.en.html |
2015 | + |
2016 | +.. _rrdgraph: http://oss.oetiker.ch/rrdtool/doc/rrdgraph_graph.en.html |
2017 | |
2018 | === modified file 'master/_bin/munin-cron.in' |
2019 | --- master/_bin/munin-cron.in 2012-03-19 15:17:42 +0000 |
2020 | +++ master/_bin/munin-cron.in 2012-07-23 03:02:19 +0000 |
2021 | @@ -12,3 +12,8 @@ |
2022 | @@LIBDIR@@/munin-limits $@ |
2023 | |
2024 | nice @@LIBDIR@@/munin-html $@ || exit 1 |
2025 | + |
2026 | +# Now the result of munin-html is needed for munin-graph. |
2027 | +# It is always lauched, but will be a noop if |
2028 | +# graph_strategy is "cgi" |
2029 | +nice @@LIBDIR@@/munin-graph $@ || exit 1 |
2030 | |
2031 | === modified file 'master/_bin/munin-graph.in' |
2032 | --- master/_bin/munin-graph.in 2012-06-21 00:29:37 +0000 |
2033 | +++ master/_bin/munin-graph.in 2012-07-23 03:02:19 +0000 |
2034 | @@ -54,8 +54,7 @@ |
2035 | |
2036 | my @params = @ARGV; |
2037 | |
2038 | -push @params, "--no-fork"; # FastCgi forks for us |
2039 | -push @params, "--skip-locking", "--skip-stats", "--nolazy"; |
2040 | +push @params, "--no-fork"; # We do *not* want to fork. Perf -> FastCGI |
2041 | push @params, "--log-file", $logfile; |
2042 | |
2043 | my $config = graph_startup(\@params); |
2044 | @@ -63,6 +62,12 @@ |
2045 | logger_open($config->{'logdir'}); |
2046 | logger_debug() if $config->{debug} or defined($ENV{CGI_DEBUG}); |
2047 | |
2048 | +if (! graph_check_cron() ) { |
2049 | + # Should not be launched from cron. |
2050 | + INFO "[INFO] graphing is cgi, do nothing"; |
2051 | + exit 0; |
2052 | +} |
2053 | + |
2054 | # BEGIN FAST-CGI LOOP: |
2055 | my $nb_request = 0; |
2056 | my $nb_request_max = 0; |
2057 | |
2058 | === modified file 'master/lib/Munin/Master/GraphOld.pm' |
2059 | --- master/lib/Munin/Master/GraphOld.pm 2012-06-21 00:29:37 +0000 |
2060 | +++ master/lib/Munin/Master/GraphOld.pm 2012-07-23 03:02:19 +0000 |
2061 | @@ -333,7 +333,7 @@ |
2062 | sub graph_check_cron { |
2063 | |
2064 | # Are we running from cron and do we have matching graph_strategy |
2065 | - if (&munin_get($config, "graph_strategy", "cron") ne "cron" and $cron) { |
2066 | + if (&munin_get($config, "graph_strategy", "cgi") ne "cron" and $cron) { |
2067 | |
2068 | # Strategy mismatch: We're run from cron, but munin.conf says |
2069 | # we use dynamic graph generation |
2070 | |
2071 | === modified file 'master/lib/Munin/Master/Node.pm' |
2072 | --- master/lib/Munin/Master/Node.pm 2012-06-21 00:29:37 +0000 |
2073 | +++ master/lib/Munin/Master/Node.pm 2012-07-23 03:02:19 +0000 |
2074 | @@ -508,7 +508,9 @@ |
2075 | } |
2076 | } |
2077 | if ($errors) { |
2078 | - WARN "[WARNING] $errors lines had errors while $correct lines were correct in data from 'fetch $plugin' on $nodedesignation"; |
2079 | + my $percent = ($errors / ($errors + $correct)) * 100; |
2080 | + $percent = sprintf("%.2f", $percent); |
2081 | + WARN "[WARNING] $errors lines had errors while $correct lines were correct ($percent%) in data from 'fetch $plugin' on $nodedesignation"; |
2082 | } |
2083 | |
2084 | return %values; |
2085 | |
2086 | === modified file 'plugins/lib/Munin/Plugin.pm' |
2087 | --- plugins/lib/Munin/Plugin.pm 2012-06-21 00:29:37 +0000 |
2088 | +++ plugins/lib/Munin/Plugin.pm 2012-07-23 03:02:19 +0000 |
2089 | @@ -167,6 +167,9 @@ |
2090 | # Replace remaining illegals with _ |
2091 | $name =~ s/[^A-Za-z0-9_]/_/g; |
2092 | |
2093 | + # "root" is *not* allowed due to a 2.0 bug |
2094 | + $name = "__root" if $name eq "root"; |
2095 | + |
2096 | return $name; |
2097 | } |
2098 | |
2099 | |
2100 | === modified file 'plugins/node.d.linux/if_err_.in' |
2101 | --- plugins/node.d.linux/if_err_.in 2012-05-13 18:01:59 +0000 |
2102 | +++ plugins/node.d.linux/if_err_.in 2012-07-23 03:02:19 +0000 |
2103 | @@ -65,7 +65,7 @@ |
2104 | |
2105 | if [ "$1" = "config" ]; then |
2106 | echo "graph_order rcvd trans" |
2107 | - echo "graph_title $INTERFACE errors, drops, and collisions" |
2108 | + echo "graph_title Interface errors on $INTERFACE" |
2109 | echo 'graph_args --base 1000' |
2110 | echo 'graph_vlabel packets in (-) / out (+) per ${graph_period}' |
2111 | echo 'graph_category network' |
2112 | |
2113 | === modified file 'plugins/node.d/munin_stats.in' |
2114 | --- plugins/node.d/munin_stats.in 2012-06-21 00:29:37 +0000 |
2115 | +++ plugins/node.d/munin_stats.in 2012-07-23 03:02:19 +0000 |
2116 | @@ -63,8 +63,6 @@ |
2117 | } |
2118 | print "update.warning 240\n"; |
2119 | print "update.critical 285\n"; |
2120 | - print "graph.warning 240\n"; |
2121 | - print "graph.critical 285\n"; |
2122 | exit 0; |
2123 | } |
2124 | |
2125 | |
2126 | === modified file 'plugins/plugin.sh.in' |
2127 | --- plugins/plugin.sh.in 2012-03-19 15:17:42 +0000 |
2128 | +++ plugins/plugin.sh.in 2012-07-23 03:02:19 +0000 |
2129 | @@ -9,8 +9,9 @@ |
2130 | # very much still break munin. |
2131 | # |
2132 | # usage: name="$(clean_fieldname "$item")" |
2133 | - # |
2134 | - echo "$@" | sed -e 's/^[^A-Za-z_]/_/' -e 's/[^A-Za-z0-9_]/_/g' |
2135 | + |
2136 | + # "root" is *not* allowed due to a 2.0 bug |
2137 | + echo "$@" | sed -e 's/^[^A-Za-z_]/_/' -e 's/[^A-Za-z0-9_]/_/g' -e 's/^root$/__root/' |
2138 | } |
2139 | |
2140 |
This looks great. Thanks! ACK