2
0
mirror of https://github.com/munin-monitoring/contrib.git synced 2018-11-08 00:59:34 +01:00

Update for BOINC 6.12

This commit is contained in:
Paul Saunders 2011-03-22 12:16:01 +01:00 committed by Steve Schnepp
parent 562e63a7bc
commit 6ddb169d59

View File

@ -1,444 +1,448 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
# #
# boinc_wus - Munin plugin to monitor states of all BOINC WUs # boinc_wus - Munin plugin to monitor states of all BOINC WUs
# #
# Run 'perldoc boinc_wus' for full man page # Run 'perldoc boinc_wus' for full man page
# #
# Author: Palo M. <palo.gm@gmail.com> # Author: Palo M. <palo.gm@gmail.com>
# License: GPLv3 <http://www.gnu.org/licenses/gpl-3.0.txt> # Modified by: Paul Saunders <darac+munin@darac.org.uk>
# # License: GPLv3 <http://www.gnu.org/licenses/gpl-3.0.txt>
# #
# Parameters supported: #
# config # Parameters supported:
# # config
# #
# Configurable variables #
# boinccmd - command-line control program (default: boinc_cmd) # Configurable variables
# host - Host to query (default: none) # boinccmd - command-line control program (default: boinc_cmd)
# port - GUI RPC port (default: none = use BOINC-default) # host - Host to query (default: none)
# boincdir - Directory containing appropriate password file # port - GUI RPC port (default: none = use BOINC-default)
# gui_rpc_auth.cfg (default: none) # boincdir - Directory containing appropriate password file
# verbose - Whether display more detailed states (default: 0) # gui_rpc_auth.cfg (default: none)
# password - Password for BOINC (default: none) !!! UNSAFE !!! # verbose - Whether display more detailed states (default: 0)
# # password - Password for BOINC (default: none) !!! UNSAFE !!!
# #
# $Log$ #
# # $Log$
# Revision 1.0 2009/09/13 Palo M. #
# Add documentation and license information # Revision 1.1 2011/03/22 Paul Saunders
# Ready to publish on Munin Exchange # Update for BOINC 6.12
# Revision 0.9 2009/09/13 Palo M. # Add colours from http://boinc.netsoft-online.com/e107_plugins/forum/forum_viewtopic.php?3
# Add possibility to read password from file # Revision 1.0 2009/09/13 Palo M.
# Revision 0.8 2009/09/12 Palo M. # Add documentation and license information
# Update default binary name: boinc_cmd -> boinccmd # Ready to publish on Munin Exchange
# Revision 0.7 2008/08/29 Palo M. # Revision 0.9 2009/09/13 Palo M.
# Creation - Attempt to port functionality from C++ code # Add possibility to read password from file
# # Revision 0.8 2009/09/12 Palo M.
# (Revisions 0.1 - 0.6) were done in C++ # Update default binary name: boinc_cmd -> boinccmd
# # Revision 0.7 2008/08/29 Palo M.
# # Creation - Attempt to port functionality from C++ code
# #
# Magic markers: # (Revisions 0.1 - 0.6) were done in C++
#%# family=contrib #
#
use strict; #
# Magic markers:
#%# family=contrib
#########################################################################
# 1. Parse configuration variables use strict;
#
my $BOINCCMD = exists $ENV{'boinccmd'} ? $ENV{'boinccmd'} : "boinccmd";
my $HOST = exists $ENV{'host'} ? $ENV{'host'} : undef; #########################################################################
my $PORT = exists $ENV{'port'} ? $ENV{'port'} : undef; # 1. Parse configuration variables
my $PASSWORD = exists $ENV{'password'} ? $ENV{'password'} : undef; #
my $BOINCDIR = exists $ENV{'boincdir'} ? $ENV{'boincdir'} : undef; my $BOINCCMD = exists $ENV{'boinccmd'} ? $ENV{'boinccmd'} : "boinccmd";
my $VERBOSE = exists $ENV{'verbose'} ? $ENV{'verbose'} : "0"; my $HOST = exists $ENV{'host'} ? $ENV{'host'} : undef;
my $PORT = exists $ENV{'port'} ? $ENV{'port'} : undef;
######################################################################### my $PASSWORD = exists $ENV{'password'} ? $ENV{'password'} : undef;
# 2. Basic executable my $BOINCDIR = exists $ENV{'boincdir'} ? $ENV{'boincdir'} : undef;
# my $VERBOSE = exists $ENV{'verbose'} ? $ENV{'verbose'} : "0";
if (defined $HOST) {
$BOINCCMD .= " --host $HOST"; #########################################################################
if (defined $PORT) { # 2. Basic executable
$BOINCCMD .= ":$PORT"; #
} if (defined $HOST) {
} $BOINCCMD .= " --host $HOST";
if (defined $PASSWORD) { if (defined $PORT) {
$BOINCCMD .= " --passwd $PASSWORD"; $BOINCCMD .= ":$PORT";
} }
if (defined $BOINCDIR) { }
chdir $BOINCDIR; if (defined $PASSWORD) {
} $BOINCCMD .= " --passwd $PASSWORD";
}
######################################################################### if (defined $BOINCDIR) {
# 3. Initialize output structure chdir $BOINCDIR;
# }
my $wu_states = {
wu_run => 0, #########################################################################
wu_pre => 0, # 3. Initialize output structure
wu_sus => 0, #
wu_dld => 0, my $wu_states = {
wu_rtr => 0, wu_run => 0,
wu_dlg => 0, wu_pre => 0,
wu_upl => 0, wu_sus => 0,
wu_err => 0, wu_dld => 0,
wu_abt => 0, wu_rtr => 0,
wu_other => 0 wu_dlg => 0,
}; wu_upl => 0,
wu_err => 0,
######################################################################### wu_abt => 0,
# 4. Fetch all needed data from BOINC-client with single call wu_other => 0
# };
my $prj_status = "";
my $results = ""; #########################################################################
# 4. Fetch all needed data from BOINC-client with single call
my $simpleGuiInfo = `$BOINCCMD --get_simple_gui_info 2>/dev/null`; #
if ($simpleGuiInfo ne "") { my $prj_status = "";
# Some data were retrieved, so let's split them my $results = "";
my @sections;
my @section1; my $simpleGuiInfo = `$BOINCCMD --get_simple_gui_info 2>/dev/null`;
@sections = split /=+ Projects =+\n/, $simpleGuiInfo; if ($simpleGuiInfo ne "") {
@section1 = split /=+ [A-z]+ =+\n/, $sections[1]; # Some data were retrieved, so let's split them
$prj_status = $section1[0]; my @sections;
my @section1;
@sections = split /=+ Results =+\n/, $simpleGuiInfo; @sections = split /=+ Projects =+\n/, $simpleGuiInfo;
@section1 = split /=+ [A-z]+ =+\n/, $sections[1]; @section1 = split /=+ [A-z]+ =+\n/, $sections[1];
$results = $section1[0]; $prj_status = $section1[0];
}
@sections = split /=+ (?:Results|Tasks) =+\n/, $simpleGuiInfo;
######################################################################### @section1 = split /=+ [A-z]+ =+\n/, $sections[1];
# 5. Parse BOINC data $results = $section1[0];
# }
# 5.a) Create project info structure
my @prjInfos = split /\d+\) -+\n/, $prj_status; #########################################################################
shift @prjInfos; # Throw out first empty line # 5. Parse BOINC data
#
my @susp_projects; # array of suspended projects # 5.a) Create project info structure
for my $prj_info (@prjInfos) { my @prjInfos = split /\d+\) -+\n/, $prj_status;
my @lines = split /\n/, $prj_info; shift @prjInfos; # Throw out first empty line
my @prjURL = grep /^\s+master URL: /,@lines;
if ($#prjURL != 0) {die "Unexpected output from boinccmd"; } my @susp_projects; # array of suspended projects
my $prjURL =$prjURL[0]; for my $prj_info (@prjInfos) {
$prjURL =~ s/^\s+master URL: //; my @lines = split /\n/, $prj_info;
my @suspGUI = grep /^\s+suspended via GUI: /,@lines; my @prjURL = grep /^\s+master URL: /,@lines;
if ($#suspGUI != 0) {die "Unexpected output from boinccmd"; } if ($#prjURL != 0) {die "Unexpected output from boinccmd"; }
my $suspGUI =$suspGUI[0]; my $prjURL =$prjURL[0];
$suspGUI =~ s/^\s+suspended via GUI: //; $prjURL =~ s/^\s+master URL: //;
if ($suspGUI eq "yes") { my @suspGUI = grep /^\s+suspended via GUI: /,@lines;
push @susp_projects, $prjURL if ($#suspGUI != 0) {die "Unexpected output from boinccmd"; }
} my $suspGUI =$suspGUI[0];
} $suspGUI =~ s/^\s+suspended via GUI: //;
if ($suspGUI eq "yes") {
# 5.b) Parse results, check their states push @susp_projects, $prjURL
my @rsltInfos = split /\d+\) -+\n/, $results; }
shift @rsltInfos; # Throw out first empty line }
for my $rslt_info (@rsltInfos) { # 5.b) Parse results, check their states
my @lines = split /\n/, $rslt_info; my @rsltInfos = split /\d+\) -+\n/, $results;
my @schedstat = grep /^\s+scheduler state: /,@lines; shift @rsltInfos; # Throw out first empty line
my $schedstat = $schedstat[0];
$schedstat =~ s/^\s+scheduler state: //; for my $rslt_info (@rsltInfos) {
my @state = grep /^\s+state: /,@lines; my @lines = split /\n/, $rslt_info;
my $state = $state[0]; my @schedstat = grep /^\s+scheduler state: /,@lines;
$state =~ s/^\s+state: //; my $schedstat = $schedstat[0];
my @acttask = grep /^\s+active_task_state: /,@lines; $schedstat =~ s/^\s+scheduler state: //;
my $acttask = $acttask[0]; my @state = grep /^\s+state: /,@lines;
$acttask =~ s/^\s+active_task_state: //; my $state = $state[0];
my @suspGUI = grep /^\s+suspended via GUI: /,@lines; $state =~ s/^\s+state: //;
my $suspGUI =$suspGUI[0]; my @acttask = grep /^\s+active_task_state: /,@lines;
$suspGUI =~ s/^\s+suspended via GUI: //; my $acttask = $acttask[0];
my @prjURL = grep /^\s+project URL: /,@lines; $acttask =~ s/^\s+active_task_state: //;
my $prjURL =$prjURL[0]; my @suspGUI = grep /^\s+suspended via GUI: /,@lines;
$prjURL =~ s/^\s+project URL: //; my $suspGUI =$suspGUI[0];
if ($suspGUI eq "yes") { $suspGUI =~ s/^\s+suspended via GUI: //;
$wu_states->{wu_sus} += 1; my @prjURL = grep /^\s+project URL: /,@lines;
next; my $prjURL =$prjURL[0];
} $prjURL =~ s/^\s+project URL: //;
my @suspPRJ = grep /^$prjURL$/,@susp_projects; if ($suspGUI eq "yes") {
if ($#suspPRJ == 0) { $wu_states->{wu_sus} += 1;
$wu_states->{wu_sus} += 1; next;
next; }
} my @suspPRJ = grep /^$prjURL$/,@susp_projects;
if ($state eq "1") { if ($#suspPRJ == 0) {
# RESULT_FILES_DOWNLOADING $wu_states->{wu_sus} += 1;
$wu_states->{wu_dlg} += 1; next;
next; }
} if ($state eq "1") {
if ($state eq "2") { # RESULT_FILES_DOWNLOADING
# RESULT_FILES_DOWNLOADED $wu_states->{wu_dlg} += 1;
if ($schedstat eq "0") { next;
# CPU_SCHED_UNINITIALIZED 0 }
$wu_states->{wu_dld} += 1; if ($state eq "2") {
next; # RESULT_FILES_DOWNLOADED
} if ($schedstat eq "0") {
if ($schedstat eq "1") { # CPU_SCHED_UNINITIALIZED 0
# CPU_SCHED_PREEMPTED 1 $wu_states->{wu_dld} += 1;
$wu_states->{wu_pre} += 1; next;
next; }
} if ($schedstat eq "1") {
if ($schedstat eq "2") { # CPU_SCHED_PREEMPTED 1
# CPU_SCHED_SCHEDULED 2 $wu_states->{wu_pre} += 1;
if ($acttask eq "1") { next;
# PROCESS_EXECUTING 1 }
$wu_states->{wu_run} += 1; if ($schedstat eq "2") {
next; # CPU_SCHED_SCHEDULED 2
} if ($acttask eq "1") {
if ( ($acttask eq "0") || ($acttask eq "9") ) { # PROCESS_EXECUTING 1
# PROCESS_UNINITIALIZED 0 $wu_states->{wu_run} += 1;
# PROCESS_SUSPENDED 9 next;
# suspended by "user active"? }
$wu_states->{wu_sus} += 1; if ( ($acttask eq "0") || ($acttask eq "9") ) {
next; # PROCESS_UNINITIALIZED 0
} # PROCESS_SUSPENDED 9
$wu_states->{wu_other} += 1; # suspended by "user active"?
next; $wu_states->{wu_sus} += 1;
} next;
$wu_states->{wu_other} += 1; }
next; $wu_states->{wu_other} += 1;
} next;
if ($state eq "3") { }
# RESULT_COMPUTE_ERROR $wu_states->{wu_other} += 1;
$wu_states->{wu_err} += 1; next;
next; }
} if ($state eq "3") {
if ($state eq "4") { # RESULT_COMPUTE_ERROR
# RESULT_FILES_UPLOADING $wu_states->{wu_err} += 1;
$wu_states->{wu_upl} += 1; next;
next; }
} if ($state eq "4") {
if ($state eq "5") { # RESULT_FILES_UPLOADING
# RESULT_FILES_UPLOADED $wu_states->{wu_upl} += 1;
$wu_states->{wu_rtr} += 1; next;
next; }
} if ($state eq "5") {
if ($state eq "6") { # RESULT_FILES_UPLOADED
# RESULT_ABORTED $wu_states->{wu_rtr} += 1;
$wu_states->{wu_abt} += 1; next;
next; }
} if ($state eq "6") {
$wu_states->{wu_other} += 1; # RESULT_ABORTED
} $wu_states->{wu_abt} += 1;
next;
}
######################################################################### $wu_states->{wu_other} += 1;
# 6. Display output }
#
if ( (defined $ARGV[0]) && ($ARGV[0] eq "config") ) { #########################################################################
# # 6. Display output
# 6.a) Display config #
#
if ( (defined $ARGV[0]) && ($ARGV[0] eq "config") ) {
if (defined $HOST) { #
print "host_name $HOST\n"; # 6.a) Display config
} #
print "graph_title BOINC work status\n"; if (defined $HOST) {
print "graph_category BOINC\n"; print "host_name $HOST\n";
print "graph_args --base 1000 -l 0\n"; }
print "graph_vlabel Workunits\n";
print "graph_total total\n"; print "graph_title BOINC work status\n";
print "graph_category BOINC\n";
# First state is AREA, next are STACK print "graph_args --base 1000 -l 0\n";
print "wu_run.label Running\n"; print "graph_vlabel Workunits\n";
print "wu_run.draw AREA\n"; print "graph_total total\n";
print "wu_run.type GAUGE\n";
print "wu_pre.label Preempted\n"; # First state is AREA, next are STACK
print "wu_pre.draw STACK\n"; print "wu_run.label Running\n";
print "wu_pre.type GAUGE\n"; print "wu_run.draw AREA\n";
print "wu_sus.label Suspended\n"; print "wu_run.type GAUGE\n";
print "wu_sus.draw STACK\n"; print "wu_pre.label Preempted\n";
print "wu_sus.type GAUGE\n"; print "wu_pre.draw STACK\n";
print "wu_dld.label Ready to run\n"; print "wu_pre.type GAUGE\n";
print "wu_dld.draw STACK\n"; print "wu_sus.label Suspended\n";
print "wu_dld.type GAUGE\n"; print "wu_sus.draw STACK\n";
print "wu_rtr.label Ready to report\n"; print "wu_sus.type GAUGE\n";
print "wu_rtr.draw STACK\n"; print "wu_dld.label Ready to run\n";
print "wu_rtr.type GAUGE\n"; print "wu_dld.draw STACK\n";
print "wu_dlg.label Downloading\n"; print "wu_dld.type GAUGE\n";
print "wu_dlg.draw STACK\n"; print "wu_rtr.label Ready to report\n";
print "wu_dlg.type GAUGE\n"; print "wu_rtr.draw STACK\n";
print "wu_upl.label Uploading\n"; print "wu_rtr.type GAUGE\n";
print "wu_upl.draw STACK\n"; print "wu_dlg.label Downloading\n";
print "wu_upl.type GAUGE\n"; print "wu_dlg.draw STACK\n";
if ($VERBOSE ne "0") { print "wu_dlg.type GAUGE\n";
print "wu_err.label Computation Error\n"; print "wu_upl.label Uploading\n";
print "wu_err.draw STACK\n"; print "wu_upl.draw STACK\n";
print "wu_err.type GAUGE\n"; print "wu_upl.type GAUGE\n";
print "wu_abt.label Aborted\n"; if ($VERBOSE ne "0") {
print "wu_abt.draw STACK\n"; print "wu_err.label Computation Error\n";
print "wu_abt.type GAUGE\n"; print "wu_err.draw STACK\n";
} print "wu_err.type GAUGE\n";
print "wu_other.label other states\n"; print "wu_abt.label Aborted\n";
print "wu_other.draw STACK\n"; print "wu_abt.draw STACK\n";
print "wu_other.type GAUGE\n"; print "wu_abt.type GAUGE\n";
}
exit 0; print "wu_other.label other states\n";
} print "wu_other.draw STACK\n";
print "wu_other.type GAUGE\n";
#
# 6.b) Display state of WUs exit 0;
# }
print "wu_run.value $wu_states->{wu_run}\n"; #
print "wu_pre.value $wu_states->{wu_pre}\n"; # 6.b) Display state of WUs
print "wu_sus.value $wu_states->{wu_sus}\n"; #
print "wu_dld.value $wu_states->{wu_dld}\n";
print "wu_rtr.value $wu_states->{wu_rtr}\n"; print "wu_run.value $wu_states->{wu_run}\n";
print "wu_dlg.value $wu_states->{wu_dlg}\n"; print "wu_pre.value $wu_states->{wu_pre}\n";
print "wu_upl.value $wu_states->{wu_upl}\n"; print "wu_sus.value $wu_states->{wu_sus}\n";
if ($VERBOSE ne "0") { print "wu_dld.value $wu_states->{wu_dld}\n";
print "wu_err.value $wu_states->{wu_err}\n"; print "wu_rtr.value $wu_states->{wu_rtr}\n";
print "wu_abt.value $wu_states->{wu_abt}\n"; print "wu_dlg.value $wu_states->{wu_dlg}\n";
print "wu_other.value $wu_states->{wu_other}\n"; print "wu_upl.value $wu_states->{wu_upl}\n";
} if ($VERBOSE ne "0") {
else { print "wu_err.value $wu_states->{wu_err}\n";
my $other = $wu_states->{wu_err} + $wu_states->{wu_abt} + $wu_states->{wu_other}; print "wu_abt.value $wu_states->{wu_abt}\n";
print "wu_other.value $other\n"; print "wu_other.value $wu_states->{wu_other}\n";
} }
else {
exit 0; my $other = $wu_states->{wu_err} + $wu_states->{wu_abt} + $wu_states->{wu_other};
print "wu_other.value $other\n";
}
#########################################################################
# perldoc section exit 0;
=head1 NAME
#########################################################################
boinc_wus - Munin plugin to monitor states of all BOINC WUs # perldoc section
=head1 APPLICABLE SYSTEMS =head1 NAME
Linux machines running BOINC and munin-node boinc_wus - Munin plugin to monitor states of all BOINC WUs
- or - =head1 APPLICABLE SYSTEMS
Linux servers (running munin-node) used to collect data from other systems Linux machines running BOINC and munin-node
which are running BOINC, but not running munin-node (e.g. non-Linux systems)
- or -
=head1 CONFIGURATION
Linux servers (running munin-node) used to collect data from other systems
Following configuration variables are supported: which are running BOINC, but not running munin-node (e.g. non-Linux systems)
=over 12 =head1 CONFIGURATION
=item B<boinccmd> Following configuration variables are supported:
command-line control program (default: boinccmd) =over 12
=item B<host> =item B<boinccmd>
Host to query (default: none) command-line control program (default: boinccmd)
=item B<port> =item B<host>
GUI RPC port (default: none = use BOINC-default) Host to query (default: none)
=item B<boincdir> =item B<port>
Directory containing appropriate file gui_rpc_auth.cfg (default: none) GUI RPC port (default: none = use BOINC-default)
=item B<verbose> =item B<boincdir>
Display unusual states details (default: 0 = Summarize unusual states as C<other>) Directory containing appropriate file gui_rpc_auth.cfg (default: none)
=item B<password> =item B<verbose>
Password for BOINC (default: none) Display unusual states details (default: 0 = Summarize unusual states as C<other>)
=back =item B<password>
=head2 B<Security Consideration:> Password for BOINC (default: none)
Using of variable B<password> poses a security risk. Even if the Munin =back
configuration file for this plugin containing BOINC-password is properly
protected, the password is exposed as environment variable and finally passed =head2 B<Security Consideration:>
to boinccmd as a parameter. It is therefore possible for local users of the
machine running this plugin to eavesdrop the BOINC password. Using of variable B<password> poses a security risk. Even if the Munin
configuration file for this plugin containing BOINC-password is properly
Using of variable password is therefore strongly discouraged and is left here protected, the password is exposed as environment variable and finally passed
as a legacy option and for testing purposes. to boinccmd as a parameter. It is therefore possible for local users of the
machine running this plugin to eavesdrop the BOINC password.
It should be always possible to use B<boincdir> variable instead - in such case
the file gui_rpc_auth.cfg is read by boinccmd binary directly. Using of variable password is therefore strongly discouraged and is left here
If this plugin is used to fetch data from remote system, the gui_rpc_auth.cfg as a legacy option and for testing purposes.
can be copied to special directory in a secure way (e.g. via scp) and properly
protected by file permissions. It should be always possible to use B<boincdir> variable instead - in such case
the file gui_rpc_auth.cfg is read by boinccmd binary directly.
=head1 INTERPRETATION If this plugin is used to fetch data from remote system, the gui_rpc_auth.cfg
can be copied to special directory in a secure way (e.g. via scp) and properly
This plugin shows how many BOINC workunits are in all the various states. protected by file permissions.
The most important states C<Running>, C<Preempted>, C<Suspended>,
C<Ready to run>, C<Ready to report>, C<Downloading> and C<Uploading> are always =head1 INTERPRETATION
displayed. All other states are shown as C<other>.
This plugin shows how many BOINC workunits are in all the various states.
If the variable B<verbose> is used, additionally also states The most important states C<Running>, C<Preempted>, C<Suspended>,
C<Computation Error> and C<Aborted> are shown separately (they are included in C<Ready to run>, C<Ready to report>, C<Downloading> and C<Uploading> are always
C<other> otherwise). displayed. All other states are shown as C<other>.
=head1 EXAMPLES If the variable B<verbose> is used, additionally also states
C<Computation Error> and C<Aborted> are shown separately (they are included in
=head2 Local BOINC Example C<other> otherwise).
BOINC is running on local machine. The BOINC binaries are installed in =head1 EXAMPLES
F</opt/boinc/custom-6.10.1/>, the BOINC is running in directory
F</usr/local/boinc/> under username boinc, group boinc and the password is used =head2 Local BOINC Example
to protect access to BOINC:
BOINC is running on local machine. The BOINC binaries are installed in
[boinc_*] F</opt/boinc/custom-6.10.1/>, the BOINC is running in directory
group boinc F</usr/local/boinc/> under username boinc, group boinc and the password is used
env.boinccmd /opt/boinc/custom-6.10.1/boinccmd to protect access to BOINC:
env.boincdir /usr/local/boinc
env.verbose 1 [boinc_*]
group boinc
=head2 Remote BOINC Example env.boinccmd /opt/boinc/custom-6.10.1/boinccmd
env.boincdir /usr/local/boinc
BOINC is running on 2 remote machines C<foo> and C<bar>. env.verbose 1
On the local machine the binary of command-line interface is installed in
directory F</usr/local/bin/>. =head2 Remote BOINC Example
The BOINC password used on the remote machine C<foo> is stored in file
F</etc/munin/boinc/foo/gui_rpc_auth.cfg>. BOINC is running on 2 remote machines C<foo> and C<bar>.
The BOINC password used on the remote machine C<bar> is stored in file On the local machine the binary of command-line interface is installed in
F</etc/munin/boinc/bar/gui_rpc_auth.cfg>. directory F</usr/local/bin/>.
These files are owned and readable by root, readable by group munin and not The BOINC password used on the remote machine C<foo> is stored in file
readable by others. F</etc/munin/boinc/foo/gui_rpc_auth.cfg>.
There are 2 symbolic links to this plugin created in the munin plugins The BOINC password used on the remote machine C<bar> is stored in file
directory (usually F</etc/munin/plugins/>): F<snmp_foo_boincwus> and F</etc/munin/boinc/bar/gui_rpc_auth.cfg>.
F<snmp_bar_boincwus> These files are owned and readable by root, readable by group munin and not
readable by others.
[snmp_foo_boinc*] There are 2 symbolic links to this plugin created in the munin plugins
group munin directory (usually F</etc/munin/plugins/>): F<snmp_foo_boincwus> and
env.boinccmd /usr/local/bin/boinccmd F<snmp_bar_boincwus>
env.host foo
env.boincdir /etc/munin/boinc/foo [snmp_foo_boinc*]
group munin
[snmp_bar_boinc*] env.boinccmd /usr/local/bin/boinccmd
group munin env.host foo
env.boinccmd /usr/local/bin/boinccmd env.boincdir /etc/munin/boinc/foo
env.host bar
env.boincdir /etc/munin/boinc/bar [snmp_bar_boinc*]
group munin
This way the plugin can be used by Munin the same way as the Munin plugins env.boinccmd /usr/local/bin/boinccmd
utilizng SNMP (although this plugin itself does not use SNMP). env.host bar
env.boincdir /etc/munin/boinc/bar
=head1 BUGS
This way the plugin can be used by Munin the same way as the Munin plugins
There is no C<autoconf> capability at the moment. This is due to the fact, that utilizng SNMP (although this plugin itself does not use SNMP).
BOINC installations may vary over different systems, sometimes using default
directory from distribution (e.g. F</var/lib/boinc/> in Debian or Ubuntu), but =head1 BUGS
often running in user directories or in other separate directories.
Also the user-ID under which BOINC runs often differs. There is no C<autoconf> capability at the moment. This is due to the fact, that
Under these circumstances the C<autoconf> would be either lame or too BOINC installations may vary over different systems, sometimes using default
complicated. directory from distribution (e.g. F</var/lib/boinc/> in Debian or Ubuntu), but
often running in user directories or in other separate directories.
=head1 AUTHOR Also the user-ID under which BOINC runs often differs.
Under these circumstances the C<autoconf> would be either lame or too
Palo M. <palo.gm@gmail.com> complicated.
=head1 LICENSE =head1 AUTHOR
GPLv3 L<http://www.gnu.org/licenses/gpl-3.0.txt> Palo M. <palo.gm@gmail.com>
=cut =head1 LICENSE
# vim:syntax=perl GPLv3 L<http://www.gnu.org/licenses/gpl-3.0.txt>
=cut
# vim:syntax=perl