Commit 5bf0ba3c authored by bmortier's avatar bmortier

Fixes: #2887 adding manpages and licence

parent 364d5fed
Argonaut AUTHORS
=======================
This is the alphabetical list of all people that have
contributed to the Argonaut project, beeing code, translations,
documentation and additional help.
* Benoit Mortier <benoit.mortier@opensides.be>
Butracking, QA
* Antoine Gallavardin <antoine.gallavardin@free.fr>
Quota original code
* Bernigaud Côme <come.bernigaud@laposte.net>
All the new deployment stuff :)
This diff is collapsed.
Argonaut changelog
==================
* Argonaut 0.9
First upstream release
......@@ -71,9 +71,6 @@ $App::Daemon::as_user = "root";
daemonize();
=pod
This just launch a JSONRPC server with ClientDaemon.pm methods.
=cut
my $server = JSON::RPC::Server::Daemon->new(
LocalPort => $client_settings->{'port'},
($server_settings->{'protocol'} eq 'https') ? (SSL_server => 1,
......@@ -90,11 +87,7 @@ my $modules = import_modules();
$server->dispatch_to($modules)->handle();
=pod
=item readConfig
Read from the config file argonaut.conf all the informations
No parameters needed
=cut
sub readConfig {
my $config = Config::IniFiles->new( -file => $configfile, -allowempty => 1, -nocase => 1);
......@@ -108,9 +101,7 @@ sub readConfig {
$client_settings = argonaut_get_client_settings($ldap_configfile,$ldap_dn,$ldap_password,$client_ip);
}
=item import_modules
Import the available modules
=cut
sub import_modules {
foreach my $module (modules()) {
$log->notice("Loaded module $module");
......@@ -118,22 +109,12 @@ sub import_modules {
return ['Argonaut::ClientDaemon',modules()];
}
=pod
=item sig_int_handler
Get the sigint signals, and exit
=cut
sub sig_int_handler {
$log->notice("argonaut-client-management on port ".$client_settings->{'port'}." terminated by sigint");
exit(0);
}
=pod
=item sig_term_handler
Get the sigterm signals, and exit
=cut
sub sig_term_handler {
$log->notice("argonaut-client-management on port ".$client_settings->{'port'}." terminated by sigterm");
......@@ -142,3 +123,38 @@ sub sig_term_handler {
__END__
=head1 NAME
argonaut-client - running actions given by the argonaut server
=head1 SYNOPSIS
argonaut-client
=head1 DESCRIPTION
argonaut-client is getting actions from argonaut server and run them. It is modular
and can load various modules at run time.
=head1 BUGS
Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/argonaut-agents/issues/new>
=head1 LICENCE AND COPYRIGHT
This code is part of FusionDirectory <http://www.fusiondirectory.org>
=over 1
=item Copyright (C) 2011-2013 FusionDirectory project
=back
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
=cut
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "ARGONAUT-CLIENT 1"
.TH ARGONAUT-CLIENT 1 "2013-11-29" "Argonaut 0.9" "Argonaut Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
argonaut\-client \- running actions given by the argonaut server
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
argonaut-client
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
argonaut-client is getting actions from argonaut server and run them. It is modular
and can load various modules at run time
.SH "BUGS"
.IX Header "BUGS"
Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/argonaut\-agents/issues/new>
.SH "LICENCE AND COPYRIGHT"
.IX Header "LICENCE AND COPYRIGHT"
This code is part of FusionDirectory <http://www.fusiondirectory.org>
.IP "Copyright (C) 2011\-2013 FusionDirectory project" 1
.IX Item "Copyright (C) 2011-2013 FusionDirectory project"
.PP
This program is distributed in the hope that it will be useful,
but \s-1WITHOUT\s0 \s-1ANY\s0 \s-1WARRANTY\s0; without even the implied warranty of
\&\s-1MERCHANTABILITY\s0 or \s-1FITNESS\s0 \s-1FOR\s0 A \s-1PARTICULAR\s0 \s-1PURPOSE\s0. See the
\&\s-1GNU\s0 General Public License for more details.
......@@ -89,13 +89,9 @@ Please report any bugs, or post any suggestions, to the fusiondirectory mailing
This code is part of FusionDirectory <http://www.fusiondirectory.org>
=over 3
=over 1
=item Copyright (C) 2005-2006 Jan-Marek Glogowski
=item Copyright (C) 2007-2010 The GOsa project
=item Copyright (C) 2011-2012 FusionDirectory project
=item Copyright (C) 2011-2013 FusionDirectory project
=back
......
......@@ -124,7 +124,7 @@
.\" ========================================================================
.\"
.IX Title "ARGONAUT-LDAP2ZONE 1"
.TH ARGONAUT-LDAP2ZONE 1 "2013-11-27" "Argonaut 0.9" "Argonaut Documentation"
.TH ARGONAUT-LDAP2ZONE 1 "2013-11-29" "Argonaut 0.9" "Argonaut Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
......@@ -153,14 +153,8 @@ Please report any bugs, or post any suggestions, to the fusiondirectory mailing
.SH "LICENCE AND COPYRIGHT"
.IX Header "LICENCE AND COPYRIGHT"
This code is part of FusionDirectory <http://www.fusiondirectory.org>
.IP "Copyright (C) 2005\-2006 Jan-Marek Glogowski" 3
.IX Item "Copyright (C) 2005-2006 Jan-Marek Glogowski"
.PD 0
.IP "Copyright (C) 2007\-2010 The GOsa project" 3
.IX Item "Copyright (C) 2007-2010 The GOsa project"
.IP "Copyright (C) 2011\-2012 FusionDirectory project" 3
.IX Item "Copyright (C) 2011-2012 FusionDirectory project"
.PD
.IP "Copyright (C) 2011\-2013 FusionDirectory project" 1
.IX Item "Copyright (C) 2011-2013 FusionDirectory project"
.PP
This program is distributed in the hope that it will be useful,
but \s-1WITHOUT\s0 \s-1ANY\s0 \s-1WARRANTY\s0; without even the implied warranty of
......
......@@ -48,3 +48,39 @@ write_warnquota_file ($settings,$warnquota_file);
write_quotatab_file ($settings,$quotatab_file);
apply_quotas ($ldap_configfile,$ldap_dn,$ldap_password,$settings->{'hostname'});
__END__
=head1 NAME
argonaut-apply-quota - applying quota from data stored in the ldap server
=head1 SYNOPSIS
argonaut-apply-quota
=head1 DESCRIPTION
argonaut-apply-quota is a program used to apply quota on server based on the data stored in the ldap server
=head1 BUGS
Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/argonaut-agents/issues/new>
=head1 LICENCE AND COPYRIGHT
This code is part of FusionDirectory <http://www.fusiondirectory.org>
=over 1
=item Copyright (C) 2011-2013 FusionDirectory project
=back
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
=cut
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
. \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
. \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "ARGONAUT-APPLY-QUOTA 1"
.TH ARGONAUT-APPLY-QUOTA 1 "2013-11-29" "Argonaut 0.9" "Argonaut Documentation"
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
.nh
.SH "NAME"
argonaut\-apply\-quota \- applying quota from data stored in the ldap server
.SH "SYNOPSIS"
.IX Header "SYNOPSIS"
argonaut-apply-quota
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
argonaut-apply-quota is a program used to apply quota on server based on the data stored in the ldap server
.SH "BUGS"
.IX Header "BUGS"
Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/argonaut\-agents/issues/new>
.SH "LICENCE AND COPYRIGHT"
.IX Header "LICENCE AND COPYRIGHT"
This code is part of FusionDirectory <http://www.fusiondirectory.org>
.IP "Copyright (C) 2011\-2013 FusionDirectory project" 1
.IX Item "Copyright (C) 2011-2013 FusionDirectory project"
.PP
This program is distributed in the hope that it will be useful,
but \s-1WITHOUT\s0 \s-1ANY\s0 \s-1WARRANTY\s0; without even the implied warranty of
\&\s-1MERCHANTABILITY\s0 or \s-1FITNESS\s0 \s-1FOR\s0 A \s-1PARTICULAR\s0 \s-1PURPOSE\s0. See the
\&\s-1GNU\s0 General Public License for more details.
......@@ -92,21 +92,11 @@ $log->add(
}
);
=pod
=item readConfig
Read config infos from the config file and erase them with LDAP infos
No parameters needed
=cut
sub readConfig {
readConfigFile();
readLdapConfig();
}
=pod
=item readConfigFile
Read from the config file argonaut.conf all the informations
No parameters needed
=cut
sub readConfigFile {
my $config = Config::IniFiles->new( -file => $configfile, -allowempty => 1, -nocase => 1);
......@@ -116,11 +106,6 @@ sub readConfigFile {
$ldap_password = $config->val( ldap => "password" ,"");
}
=pod
=item readLdapConfig
Read config infos from the LDAP
No parameters needed
=cut
sub readLdapConfig {
my $settings = argonaut_get_server_settings($ldap_configfile,$ldap_dn,$ldap_password,$server_ip);
......@@ -136,19 +121,11 @@ sub readLdapConfig {
$packages_folder = "/var/cache/argonaut/packages";
}
=item bindLdap
Connect to ldap and return handle.
=cut
sub bindLdap {
my $ldapinfos = argonaut_ldap_init ($ldap_configfile, 0, $ldap_dn, 0, $ldap_password);
return ($ldapinfos->{'HANDLE'},$ldapinfos->{'BASE'});
}
=pod
=item getIpFromMac
Search in the ldap for the IP associated to a Mac address.
Parameter : the mac address
=cut
sub getIpFromMac {
my ($mac) = @_;
......@@ -177,12 +154,6 @@ sub getIpFromMac {
return $ip;
}
=pod
=item wakeOnLan
Send a wake on lan package to a mac address
Parameter : the mac address
inspired by WakeOnLan.pm file from FusionInventory
=cut
sub wakeOnLan {
my ($macaddress) = @_;
......@@ -266,45 +237,6 @@ sub refresh_task {
}
}
=pod
=head2 POE Session
=over
=item _start
=item echo
=item ping
Ping the jsonrpc daemon of a client.
=item id_of_mac
Used by clients to get the taskid associated to them
=item set_task_substatus
Used by clients to set the fai status
=item set_error
Used by clients to signal fai errors
=item schedule
Internal state used for scheduling
=item add
Internal state corresponding at external action method call.
Launch the action or schedule it.
=item get_entries_by_id
Used by FD to get a bunch of entries by giving a bunch of ids
=item get_entries_by_mac
Used by FD to get a bunch of entries by giving a bunch of macs
=item remove_entries
Used by FD to remove entries by giving their ids
=item process_entries
Used by FD to ask the immediate launch of a bunch of actions by giving their ids
=item action
Internal state called by the scheduler to actually launch the action.
It calls do_action.
=item load_dump
Unused right now
=item sighup
When sighup received, reload config. See readConfig above.
(Also restart the server since its port might have changed)
=item sigint
When sigint received, write a json dump before quitting.
=item _stop
=back
=cut
POE::Session->create(
inline_states => {
_start => sub {
......@@ -752,4 +684,37 @@ exit 0;
__END__
# vim:ts=2:sw=2:expandtab:shiftwidth=2:syntax:paste
=head1 NAME
argonaut-server - Dispatching action received from FusionDirectory to the clients
=head1 SYNOPSIS
argonaut-server
=head1 DESCRIPTION
argonaut-server - argonaut-server dispatch actions received from FusionDirectory and send it to the clients. It is modular
and can load various modules at run time.
=head1 BUGS
Please report any bugs, or post any suggestions, to the fusiondirectory mailing list fusiondirectory-users or to
<https://forge.fusiondirectory.org/projects/argonaut-agents/issues/new>
=head1 LICENCE AND COPYRIGHT
This code is part of FusionDirectory <http://www.fusiondirectory.org>
=over 1
=item Copyright (C) 2011-2013 FusionDirectory project
=back
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
=cut
.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings. \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote. \*(C+ will
.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
.el\{\
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
.ie \n(.g .ds Aq \(aq
.el .ds Aq '
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
.\" entries marked with X<> in POD. Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.ie \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. nr % 0
. rr F
.\}
.el \{\
. de IX
..
.\}
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear. Run. Save yourself. No user-serviceable parts.
. \" fudge factors for nroff and troff
.if n \{\
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #] \fP
.\}
.if t \{\
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
.if n \{\
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
.if t \{\
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]