| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Mail::Toaster::Setup; | 
| 2 | 4 |  |  | 4 |  | 2018 | use strict; | 
|  | 4 |  |  |  |  | 6 |  | 
|  | 4 |  |  |  |  | 99 |  | 
| 3 | 4 |  |  | 4 |  | 11 | use warnings; | 
|  | 4 |  |  |  |  | 4 |  | 
|  | 4 |  |  |  |  | 138 |  | 
| 4 |  |  |  |  |  |  |  | 
| 5 |  |  |  |  |  |  | our $VERSION = '5.54'; | 
| 6 |  |  |  |  |  |  |  | 
| 7 | 4 |  |  | 4 |  | 13 | use Carp; | 
|  | 4 |  |  |  |  | 5 |  | 
|  | 4 |  |  |  |  | 195 |  | 
| 8 | 4 |  |  | 4 |  | 14 | use Config; | 
|  | 4 |  |  |  |  | 5 |  | 
|  | 4 |  |  |  |  | 132 |  | 
| 9 | 4 |  |  | 4 |  | 15 | use Cwd; | 
|  | 4 |  |  |  |  | 6 |  | 
|  | 4 |  |  |  |  | 174 |  | 
| 10 | 4 |  |  | 4 |  | 2101 | use Data::Dumper; | 
|  | 4 |  |  |  |  | 17074 |  | 
|  | 4 |  |  |  |  | 185 |  | 
| 11 | 4 |  |  | 4 |  | 407 | use File::Copy; | 
|  | 4 |  |  |  |  | 1850 |  | 
|  | 4 |  |  |  |  | 160 |  | 
| 12 | 4 |  |  | 4 |  | 15 | use File::Path; | 
|  | 4 |  |  |  |  | 4 |  | 
|  | 4 |  |  |  |  | 160 |  | 
| 13 | 4 |  |  | 4 |  | 379 | use English qw( -no_match_vars ); | 
|  | 4 |  |  |  |  | 1191 |  | 
|  | 4 |  |  |  |  | 20 |  | 
| 14 | 4 |  |  | 4 |  | 1589 | use Params::Validate qw( :all ); | 
|  | 4 |  |  |  |  | 5841 |  | 
|  | 4 |  |  |  |  | 510 |  | 
| 15 | 4 |  |  | 4 |  | 353 | use Sys::Hostname; | 
|  | 4 |  |  |  |  | 751 |  | 
|  | 4 |  |  |  |  | 145 |  | 
| 16 |  |  |  |  |  |  |  | 
| 17 | 4 |  |  | 4 |  | 13 | use lib 'lib'; | 
|  | 4 |  |  |  |  | 4 |  | 
|  | 4 |  |  |  |  | 23 |  | 
| 18 | 4 |  |  | 4 |  | 647 | use parent 'Mail::Toaster::Base'; | 
|  | 4 |  |  |  |  | 207 |  | 
|  | 4 |  |  |  |  | 19 |  | 
| 19 |  |  |  |  |  |  |  | 
| 20 |  |  |  |  |  |  | sub autorespond { | 
| 21 | 3 |  |  | 3 | 0 | 13 | my $self  = shift; | 
| 22 | 3 |  |  |  |  | 15 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 23 |  |  |  |  |  |  |  | 
| 24 | 3 | 100 |  |  |  | 25 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 25 |  |  |  |  |  |  |  | 
| 26 | 1 | 50 |  |  |  | 2 | my $ver = $self->conf->{install_autorespond} or do { | 
| 27 | 1 |  |  |  |  | 3 | $self->audit( "autorespond install skipped (disabled)" ); | 
| 28 | 1 |  |  |  |  | 4 | return; | 
| 29 |  |  |  |  |  |  | }; | 
| 30 |  |  |  |  |  |  |  | 
| 31 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 32 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "autorespond" ); | 
| 33 |  |  |  |  |  |  | } | 
| 34 |  |  |  |  |  |  |  | 
| 35 | 0 |  |  |  |  | 0 | my $autorespond = $self->util->find_bin( "autorespond", fatal => 0, verbose => 0 ); | 
| 36 |  |  |  |  |  |  |  | 
| 37 |  |  |  |  |  |  | # return success if it is installed. | 
| 38 | 0 | 0 | 0 |  |  | 0 | if ( $autorespond &&  -x $autorespond ) { | 
| 39 | 0 |  |  |  |  | 0 | $self->audit( "autorespond: installed ok (exists)" ); | 
| 40 | 0 |  |  |  |  | 0 | return 1; | 
| 41 |  |  |  |  |  |  | } | 
| 42 |  |  |  |  |  |  |  | 
| 43 | 0 | 0 |  |  |  | 0 | if ( $ver eq "port" ) { | 
| 44 | 0 |  |  |  |  | 0 | print | 
| 45 |  |  |  |  |  |  | "autorespond: port install failed, attempting to install from source.\n"; | 
| 46 | 0 |  |  |  |  | 0 | $ver = "2.0.5"; | 
| 47 |  |  |  |  |  |  | } | 
| 48 |  |  |  |  |  |  |  | 
| 49 | 0 |  |  |  |  | 0 | my @targets = ( 'make', 'make install' ); | 
| 50 |  |  |  |  |  |  |  | 
| 51 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "darwin" || $OSNAME eq "freebsd" ) { | 
| 52 | 0 |  |  |  |  | 0 | print "autorespond: applying strcasestr patch.\n"; | 
| 53 | 0 |  |  |  |  | 0 | my $sed = $self->util->find_bin( "sed", verbose => 0 ); | 
| 54 | 0 |  | 0 |  |  | 0 | my $prefix = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 55 | 0 |  |  |  |  | 0 | $prefix =~ s/\//\\\//g; | 
| 56 | 0 |  |  |  |  | 0 | @targets = ( | 
| 57 |  |  |  |  |  |  | "$sed -i '' 's/strcasestr/strcasestr2/g' autorespond.c", | 
| 58 |  |  |  |  |  |  | "$sed -i '' 's/PREFIX=\$(DESTDIR)\\/usr/PREFIX=\$(DESTDIR)$prefix/g' Makefile", | 
| 59 |  |  |  |  |  |  | 'make', 'make install' | 
| 60 |  |  |  |  |  |  | ); | 
| 61 |  |  |  |  |  |  | } | 
| 62 |  |  |  |  |  |  |  | 
| 63 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 64 | 0 |  |  |  |  | 0 | package        => "autorespond-$ver", | 
| 65 |  |  |  |  |  |  | site           => 'http://www.inter7.com', | 
| 66 |  |  |  |  |  |  | url            => '/devel', | 
| 67 |  |  |  |  |  |  | targets        => \@targets, | 
| 68 |  |  |  |  |  |  | bintest        => 'autorespond', | 
| 69 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 70 |  |  |  |  |  |  | ); | 
| 71 |  |  |  |  |  |  |  | 
| 72 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "autorespond", fatal => 0, verbose => 0, ) ) { | 
| 73 | 0 |  |  |  |  | 0 | $self->audit( "autorespond: installed ok" ); | 
| 74 | 0 |  |  |  |  | 0 | return 1; | 
| 75 |  |  |  |  |  |  | } | 
| 76 |  |  |  |  |  |  |  | 
| 77 | 0 |  |  |  |  | 0 | return 0; | 
| 78 |  |  |  |  |  |  | } | 
| 79 |  |  |  |  |  |  |  | 
| 80 |  |  |  |  |  |  | sub clamav { | 
| 81 | 3 |  |  | 3 | 1 | 10 | my $self  = shift; | 
| 82 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 83 |  |  |  |  |  |  |  | 
| 84 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 85 |  |  |  |  |  |  |  | 
| 86 | 1 |  | 50 |  |  | 2 | my $prefix   = $self->conf->{toaster_prefix}      || "/usr/local"; | 
| 87 | 1 |  | 50 |  |  | 3 | my $confdir  = $self->conf->{system_config_dir}   || "/usr/local/etc"; | 
| 88 | 1 |  |  |  |  | 2 | my $share    = "$prefix/share/clamav"; | 
| 89 | 1 |  | 50 |  |  | 2 | my $clamuser = $self->conf->{install_clamav_user} || "clamav"; | 
| 90 | 1 | 50 |  |  |  | 1 | my $ver      = $self->conf->{install_clamav} or do { | 
| 91 | 1 |  |  |  |  | 2 | $self->audit( "clamav: installing, skipping (disabled)" ); | 
| 92 | 1 |  |  |  |  | 3 | return; | 
| 93 |  |  |  |  |  |  | }; | 
| 94 |  |  |  |  |  |  |  | 
| 95 | 0 |  |  |  |  | 0 | my $installed; | 
| 96 |  |  |  |  |  |  |  | 
| 97 |  |  |  |  |  |  | # install via ports if selected | 
| 98 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 99 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "clamav", flags => "BATCH=yes WITHOUT_LDAP=1"); | 
| 100 | 0 |  |  |  |  | 0 | return $self->clamav_post_install; | 
| 101 |  |  |  |  |  |  | } | 
| 102 |  |  |  |  |  |  |  | 
| 103 |  |  |  |  |  |  | # add the clamav user and group | 
| 104 | 0 | 0 |  |  |  | 0 | unless ( getpwuid($clamuser) ) { | 
| 105 | 0 |  |  |  |  | 0 | $self->group_add( 'clamav', '90' ); | 
| 106 | 0 |  |  |  |  | 0 | $self->user_add( $clamuser, 90, 90 ); | 
| 107 |  |  |  |  |  |  | } | 
| 108 |  |  |  |  |  |  |  | 
| 109 | 0 | 0 |  |  |  | 0 | unless ( getpwnam($clamuser) ) { | 
| 110 | 0 |  |  |  |  | 0 | print "User clamav user installation FAILED, I cannot continue!\n"; | 
| 111 | 0 |  |  |  |  | 0 | return 0; | 
| 112 |  |  |  |  |  |  | } | 
| 113 |  |  |  |  |  |  |  | 
| 114 |  |  |  |  |  |  | # install via ports if selected | 
| 115 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "darwin" && $ver eq "port" ) { | 
| 116 | 0 | 0 |  |  |  | 0 | $self->darwin->install_port( "clamav" ) or return; | 
| 117 | 0 |  |  |  |  | 0 | return $self->clamav_post_install; | 
| 118 |  |  |  |  |  |  | } | 
| 119 |  |  |  |  |  |  |  | 
| 120 |  |  |  |  |  |  | # port installs didn't work out, time to build from sources | 
| 121 |  |  |  |  |  |  |  | 
| 122 |  |  |  |  |  |  | # set a default version of ClamAV if not provided | 
| 123 | 0 | 0 |  |  |  | 0 | if ( $ver eq "1" ) { $ver = "0.97.8"; }; # latest as of 6/2013 | 
|  | 0 |  |  |  |  | 0 |  | 
| 124 |  |  |  |  |  |  |  | 
| 125 |  |  |  |  |  |  | # download the sources, build, and install ClamAV | 
| 126 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 127 |  |  |  |  |  |  | package        => 'clamav-' . $ver, | 
| 128 |  |  |  |  |  |  | site           => 'http://' . $self->conf->{toaster_sf_mirror}, | 
| 129 | 0 |  |  |  |  | 0 | url            => '/clamav', | 
| 130 |  |  |  |  |  |  | targets        => [ './configure', 'make', 'make install' ], | 
| 131 |  |  |  |  |  |  | bintest        => 'clamdscan', | 
| 132 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 133 |  |  |  |  |  |  | ); | 
| 134 |  |  |  |  |  |  |  | 
| 135 | 0 | 0 |  |  |  | 0 | $self->util->find_bin( "clamdscan", fatal => 0 ) or | 
| 136 |  |  |  |  |  |  | return $self->error( "clamav: install FAILED" ); | 
| 137 |  |  |  |  |  |  |  | 
| 138 | 0 |  |  |  |  | 0 | $self->audit( "clamav: installed ok" ); | 
| 139 |  |  |  |  |  |  |  | 
| 140 | 0 |  |  |  |  | 0 | return $self->clamav_post_install; | 
| 141 |  |  |  |  |  |  | } | 
| 142 |  |  |  |  |  |  |  | 
| 143 |  |  |  |  |  |  | sub clamav_post_install { | 
| 144 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 145 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 146 |  |  |  |  |  |  |  | 
| 147 | 0 | 0 |  |  |  | 0 | $self->clamav_update or return; | 
| 148 | 0 | 0 |  |  |  | 0 | $self->clamav_perms  or return; | 
| 149 | 0 | 0 |  |  |  | 0 | $self->clamav_start  or return; | 
| 150 | 0 |  |  |  |  | 0 | return 1; | 
| 151 |  |  |  |  |  |  | } | 
| 152 |  |  |  |  |  |  |  | 
| 153 |  |  |  |  |  |  | sub clamav_perms { | 
| 154 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 155 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 156 |  |  |  |  |  |  |  | 
| 157 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix}      || "/usr/local"; | 
| 158 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir}   || "/usr/local/etc"; | 
| 159 | 0 |  | 0 |  |  | 0 | my $clamuid = $self->conf->{install_clamav_user} || "clamav"; | 
| 160 | 0 |  |  |  |  | 0 | my $share   = "$prefix/share/clamav"; | 
| 161 |  |  |  |  |  |  |  | 
| 162 | 0 |  |  |  |  | 0 | foreach my $file ( $share, "$share/daily.cvd", "$share/main.cvd", | 
| 163 |  |  |  |  |  |  | "$share/viruses.db", "$share/viruses.db2", "/var/log/clamav/freshclam.log", ) { | 
| 164 |  |  |  |  |  |  |  | 
| 165 | 0 | 0 |  |  |  | 0 | if ( -e $file ) { | 
| 166 | 0 |  |  |  |  | 0 | print "setting the ownership of $file to $clamuid.\n"; | 
| 167 | 0 |  |  |  |  | 0 | $self->util->chown( $file, uid => $clamuid, gid => 'clamav' ); | 
| 168 |  |  |  |  |  |  | }; | 
| 169 |  |  |  |  |  |  | } | 
| 170 |  |  |  |  |  |  |  | 
| 171 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "pw user mod clamav -G qmail" ) | 
| 172 |  |  |  |  |  |  | or return $self->error( "failed to add clamav to the qmail group" ); | 
| 173 |  |  |  |  |  |  |  | 
| 174 | 0 |  |  |  |  | 0 | return 1; | 
| 175 |  |  |  |  |  |  | } | 
| 176 |  |  |  |  |  |  |  | 
| 177 |  |  |  |  |  |  | sub clamav_start { | 
| 178 |  |  |  |  |  |  | # get ClamAV running | 
| 179 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 180 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 181 |  |  |  |  |  |  |  | 
| 182 | 0 | 0 |  |  |  | 0 | if ( $self->util->is_process_running('clamd') ) { | 
| 183 | 0 |  |  |  |  | 0 | $self->audit( "clamav: starting up, ok (already running)" ); | 
| 184 |  |  |  |  |  |  | } | 
| 185 |  |  |  |  |  |  |  | 
| 186 | 0 |  |  |  |  | 0 | print "Starting up ClamAV...\n"; | 
| 187 |  |  |  |  |  |  |  | 
| 188 | 0 | 0 |  |  |  | 0 | if ( $OSNAME ne "freebsd" ) { | 
| 189 | 0 |  |  |  |  | 0 | $self->util->_incomplete_feature( { | 
| 190 |  |  |  |  |  |  | mess   => "start up ClamAV on $OSNAME", | 
| 191 |  |  |  |  |  |  | action => | 
| 192 |  |  |  |  |  |  | 'You will need to start up ClamAV yourself and make sure it is configured to launch at boot time.', | 
| 193 |  |  |  |  |  |  | } | 
| 194 |  |  |  |  |  |  | ); | 
| 195 | 0 |  |  |  |  | 0 | return; | 
| 196 |  |  |  |  |  |  | }; | 
| 197 |  |  |  |  |  |  |  | 
| 198 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 199 |  |  |  |  |  |  | check => "clamav_clamd_enable", | 
| 200 |  |  |  |  |  |  | line  => 'clamav_clamd_enable="YES"', | 
| 201 |  |  |  |  |  |  | ); | 
| 202 |  |  |  |  |  |  |  | 
| 203 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 204 |  |  |  |  |  |  | check => "clamav_freshclam_enable", | 
| 205 |  |  |  |  |  |  | line  => 'clamav_freshclam_enable="YES"', | 
| 206 |  |  |  |  |  |  | ); | 
| 207 |  |  |  |  |  |  |  | 
| 208 | 0 |  |  |  |  | 0 | print "(Re)starting ClamAV's clamd..."; | 
| 209 | 0 |  |  |  |  | 0 | my $start = "/usr/local/etc/rc.d/clamav-freshclam"; | 
| 210 | 0 | 0 |  |  |  | 0 | $start = "$start.sh" if ! -x $start; | 
| 211 |  |  |  |  |  |  |  | 
| 212 | 0 | 0 |  |  |  | 0 | if ( -x $start ) { | 
| 213 | 0 |  |  |  |  | 0 | system "$start restart"; | 
| 214 | 0 |  |  |  |  | 0 | print "done.\n"; | 
| 215 |  |  |  |  |  |  | } | 
| 216 |  |  |  |  |  |  | else { | 
| 217 | 0 |  |  |  |  | 0 | print | 
| 218 |  |  |  |  |  |  | "ERROR: I could not find the startup (rc.d) file for clamAV!\n"; | 
| 219 |  |  |  |  |  |  | } | 
| 220 |  |  |  |  |  |  |  | 
| 221 | 0 |  |  |  |  | 0 | print "(Re)starting ClamAV's freshclam..."; | 
| 222 | 0 |  |  |  |  | 0 | $start = "/usr/local/etc/rc.d/clamav-clamd"; | 
| 223 | 0 | 0 |  |  |  | 0 | $start = "$start.sh" if ! -x $start; | 
| 224 | 0 |  |  |  |  | 0 | system "$start restart"; | 
| 225 |  |  |  |  |  |  |  | 
| 226 | 0 | 0 |  |  |  | 0 | if ( $self->util->is_process_running('clamd', verbose=>0) ) { | 
| 227 | 0 |  |  |  |  | 0 | $self->audit( "clamav: starting up, ok" ); | 
| 228 |  |  |  |  |  |  | } | 
| 229 |  |  |  |  |  |  |  | 
| 230 |  |  |  |  |  |  | # These are no longer required as the FreeBSD ports now installs | 
| 231 |  |  |  |  |  |  | # startup files of its own. | 
| 232 | 0 |  |  |  |  | 0 | foreach ( qw/ clamav.sh freshclam.sh / ) { | 
| 233 | 0 | 0 |  |  |  | 0 | unlink "/usr/local/etc/rc.d/$_" if -e "/usr/local/etc/rc.d/$_"; | 
| 234 |  |  |  |  |  |  | }; | 
| 235 |  |  |  |  |  |  |  | 
| 236 | 0 |  |  |  |  | 0 | return 1; | 
| 237 |  |  |  |  |  |  | } | 
| 238 |  |  |  |  |  |  |  | 
| 239 |  |  |  |  |  |  | sub clamav_update { | 
| 240 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 241 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 242 |  |  |  |  |  |  |  | 
| 243 |  |  |  |  |  |  | # set up freshclam (keeps virus databases updated) | 
| 244 | 0 |  |  |  |  | 0 | my $logfile = "/var/log/clamav/freshclam.log"; | 
| 245 | 0 | 0 |  |  |  | 0 | unless ( -e $logfile ) { | 
| 246 | 0 |  |  |  |  | 0 | $self->util->syscmd( "touch $logfile", verbose=>0 ); | 
| 247 | 0 |  |  |  |  | 0 | $self->util->chmod( file => $logfile, mode => '0644', verbose=>0 ); | 
| 248 | 0 |  |  |  |  | 0 | $self->clamav_perms(  verbose=>0 ); | 
| 249 |  |  |  |  |  |  | } | 
| 250 |  |  |  |  |  |  |  | 
| 251 | 0 | 0 |  |  |  | 0 | my $freshclam = $self->util->find_bin( "freshclam", verbose=>0 ) | 
| 252 |  |  |  |  |  |  | or return $self->error( "couldn't find freshclam!", fatal=>0); | 
| 253 |  |  |  |  |  |  |  | 
| 254 | 0 |  |  |  |  | 0 | $self->audit("updating ClamAV database with freshclam"); | 
| 255 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$freshclam", verbose => 0, fatal => 0 ); | 
| 256 | 0 |  |  |  |  | 0 | return 1; | 
| 257 |  |  |  |  |  |  | } | 
| 258 |  |  |  |  |  |  |  | 
| 259 |  |  |  |  |  |  | sub config { | 
| 260 | 2 |  |  | 2 | 1 | 455 | require Mail::Toaster::Setup::Config; | 
| 261 | 2 |  |  |  |  | 11 | return Mail::Toaster::Setup::Config->new; | 
| 262 |  |  |  |  |  |  | }; | 
| 263 |  |  |  |  |  |  |  | 
| 264 |  |  |  |  |  |  | sub courier_imap { | 
| 265 | 3 |  |  | 3 | 0 | 12 | my $self  = shift; | 
| 266 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 267 |  |  |  |  |  |  |  | 
| 268 | 3 | 100 |  |  |  | 19 | return $p{test_ok} if defined $p{test_ok}; | 
| 269 |  |  |  |  |  |  |  | 
| 270 | 1 | 50 |  |  |  | 2 | my $ver = $self->conf->{install_courier_imap} or do { | 
| 271 | 1 |  |  |  |  | 2 | $self->audit( "courier: installing, skipping (disabled)" ); | 
| 272 | 1 | 50 |  |  |  | 5 | $self->courier_startup_freebsd() if $OSNAME eq 'freebsd'; # enable startup | 
| 273 | 1 |  |  |  |  | 3 | return; | 
| 274 |  |  |  |  |  |  | }; | 
| 275 |  |  |  |  |  |  |  | 
| 276 | 0 |  |  |  |  | 0 | $self->audit("courier $ver is selected" ); | 
| 277 |  |  |  |  |  |  |  | 
| 278 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 279 | 0 |  |  |  |  | 0 | $self->audit("using courier from FreeBSD ports" ); | 
| 280 | 0 |  |  |  |  | 0 | $self->courier_authlib; | 
| 281 | 0 |  |  |  |  | 0 | $self->courier_imap_freebsd; | 
| 282 | 0 |  |  |  |  | 0 | $self->courier_startup; | 
| 283 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed( "courier-imap", verbose=>0); | 
| 284 |  |  |  |  |  |  | } | 
| 285 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 286 | 0 |  |  |  |  | 0 | return $self->darwin->install_port( "courier-imap", ); | 
| 287 |  |  |  |  |  |  | } | 
| 288 |  |  |  |  |  |  |  | 
| 289 |  |  |  |  |  |  | # if a specific version has been requested, install it from sources | 
| 290 |  |  |  |  |  |  | # but first, a default for users who didn't edit toaster-watcher.conf | 
| 291 | 0 | 0 |  |  |  | 0 | $ver = "4.8.0" if ( $ver eq "port" ); | 
| 292 |  |  |  |  |  |  |  | 
| 293 | 0 |  |  |  |  | 0 | my $site    = "http://" . $self->conf->{toaster_sf_mirror}; | 
| 294 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 295 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 296 |  |  |  |  |  |  |  | 
| 297 | 0 |  |  |  |  | 0 | $ENV{"HAVE_OPEN_SMTP_RELAY"} = 1;    # circumvent bug in courier | 
| 298 |  |  |  |  |  |  |  | 
| 299 | 0 |  |  |  |  | 0 | my $conf_args = "--prefix=$prefix --exec-prefix=$prefix --without-authldap --without-authshadow --with-authvchkpw --sysconfdir=/usr/local/etc/courier-imap --datadir=$prefix/share/courier-imap --libexecdir=$prefix/libexec/courier-imap --enable-workarounds-for-imap-client-bugs --disable-root-check --without-authdaemon"; | 
| 300 |  |  |  |  |  |  |  | 
| 301 | 0 |  |  |  |  | 0 | print "./configure $conf_args\n"; | 
| 302 | 0 |  | 0 |  |  | 0 | my $make = $self->util->find_bin( "gmake", verbose=>0, fatal=>0 ) || | 
| 303 |  |  |  |  |  |  | $self->util->find_bin( "make", verbose=>0); | 
| 304 | 0 |  |  |  |  | 0 | my @targets = ( "./configure " . $conf_args, $make, "$make install" ); | 
| 305 |  |  |  |  |  |  |  | 
| 306 | 0 |  |  |  |  | 0 | $self->util->install_from_source( | 
| 307 |  |  |  |  |  |  | package        => "courier-imap-$ver", | 
| 308 |  |  |  |  |  |  | site           => $site, | 
| 309 |  |  |  |  |  |  | url            => "/courier", | 
| 310 |  |  |  |  |  |  | targets        => \@targets, | 
| 311 |  |  |  |  |  |  | bintest        => "imapd", | 
| 312 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 313 |  |  |  |  |  |  | ); | 
| 314 |  |  |  |  |  |  |  | 
| 315 | 0 |  |  |  |  | 0 | $self->courier_startup(); | 
| 316 |  |  |  |  |  |  | } | 
| 317 |  |  |  |  |  |  |  | 
| 318 |  |  |  |  |  |  | sub courier_imap_freebsd { | 
| 319 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 320 |  |  |  |  |  |  |  | 
| 321 |  |  |  |  |  |  | #   my @defs = "WITH_VPOPMAIL=1"; | 
| 322 |  |  |  |  |  |  | #   push @defs, "WITHOUT_AUTHDAEMON=1"; | 
| 323 |  |  |  |  |  |  | #   push @defs, "WITH_CRAM=1"; | 
| 324 |  |  |  |  |  |  | #   push @defs, "AUTHMOD=authvchkpw"; | 
| 325 |  |  |  |  |  |  |  | 
| 326 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "courier-imap", | 
| 327 |  |  |  |  |  |  | #flags  => join( ",", @defs ), | 
| 328 |  |  |  |  |  |  | options => "#\n# This file was generated by mail-toaster | 
| 329 |  |  |  |  |  |  | # No user-servicable parts inside! | 
| 330 |  |  |  |  |  |  | # Options for courier-imap-4.1.1,1 | 
| 331 |  |  |  |  |  |  | _OPTIONS_READ=courier-imap-4.1.1,1 | 
| 332 |  |  |  |  |  |  | WITH_OPENSSL=true | 
| 333 |  |  |  |  |  |  | WITHOUT_FAM=true | 
| 334 |  |  |  |  |  |  | WITHOUT_DRAC=true | 
| 335 |  |  |  |  |  |  | WITHOUT_TRASHQUOTA=true | 
| 336 |  |  |  |  |  |  | WITHOUT_GDBM=true | 
| 337 |  |  |  |  |  |  | WITHOUT_IPV6=true | 
| 338 |  |  |  |  |  |  | WITHOUT_AUTH_LDAP=true | 
| 339 |  |  |  |  |  |  | WITHOUT_AUTH_MYSQL=true | 
| 340 |  |  |  |  |  |  | WITHOUT_AUTH_PGSQL=true | 
| 341 |  |  |  |  |  |  | WITHOUT_AUTH_USERDB=true | 
| 342 |  |  |  |  |  |  | WITH_AUTH_VCHKPW=true", | 
| 343 |  |  |  |  |  |  | ); | 
| 344 |  |  |  |  |  |  | } | 
| 345 |  |  |  |  |  |  |  | 
| 346 |  |  |  |  |  |  | sub courier_authlib { | 
| 347 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 348 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 349 |  |  |  |  |  |  |  | 
| 350 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix}    || "/usr/local"; | 
| 351 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 352 |  |  |  |  |  |  |  | 
| 353 | 0 | 0 |  |  |  | 0 | if ( $OSNAME ne "freebsd" ) { | 
| 354 | 0 |  |  |  |  | 0 | print "courier-authlib build support is not available for $OSNAME yet.\n"; | 
| 355 | 0 |  |  |  |  | 0 | return 0; | 
| 356 |  |  |  |  |  |  | }; | 
| 357 |  |  |  |  |  |  |  | 
| 358 | 0 | 0 |  |  |  | 0 | if ( ! $self->freebsd->is_port_installed( "courier-authlib" ) ) { | 
| 359 |  |  |  |  |  |  |  | 
| 360 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "courier-authlib", | 
| 361 |  |  |  |  |  |  | options => "# Options for courier-authlib-0.65.0 | 
| 362 |  |  |  |  |  |  | _OPTIONS_READ=courier-authlib-0.65.0 | 
| 363 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=AUTH_LDAP AUTH_MYSQL AUTH_PGSQL AUTH_USERDB AUTH_VCHKPW GDBM | 
| 364 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_LDAP | 
| 365 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_MYSQL | 
| 366 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_PGSQL | 
| 367 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_USERDB | 
| 368 |  |  |  |  |  |  | OPTIONS_FILE_SET+=AUTH_VCHKPW | 
| 369 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GDBM | 
| 370 |  |  |  |  |  |  | ", | 
| 371 |  |  |  |  |  |  | ); | 
| 372 |  |  |  |  |  |  | } | 
| 373 |  |  |  |  |  |  |  | 
| 374 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "courier-authlib-vchkpw", | 
| 375 |  |  |  |  |  |  | flags => "AUTHMOD=authvchkpw", | 
| 376 |  |  |  |  |  |  | ); | 
| 377 |  |  |  |  |  |  |  | 
| 378 |  |  |  |  |  |  | # install a default authdaemonrc | 
| 379 | 0 |  |  |  |  | 0 | my $authrc = "$confdir/authlib/authdaemonrc"; | 
| 380 |  |  |  |  |  |  |  | 
| 381 | 0 | 0 |  |  |  | 0 | if ( ! -e $authrc ) { | 
| 382 | 0 | 0 |  |  |  | 0 | if ( -e "$authrc.dist" ) { | 
| 383 | 0 |  |  |  |  | 0 | print "installing default authdaemonrc.\n"; | 
| 384 | 0 |  |  |  |  | 0 | copy("$authrc.dist", $authrc); | 
| 385 |  |  |  |  |  |  | } | 
| 386 |  |  |  |  |  |  | }; | 
| 387 |  |  |  |  |  |  |  | 
| 388 | 0 | 0 |  |  |  | 0 | if ( `grep 'authmodulelist=' $authrc | grep ldap` ) { | 
| 389 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 390 |  |  |  |  |  |  | file => $authrc, | 
| 391 |  |  |  |  |  |  | changes => [ | 
| 392 |  |  |  |  |  |  | {   search  => q{authmodulelist="authuserdb authvchkpw authpam authldap authmysql authpgsql"}, | 
| 393 |  |  |  |  |  |  | replace => q{authmodulelist="authvchkpw"}, | 
| 394 |  |  |  |  |  |  | }, | 
| 395 |  |  |  |  |  |  | ], | 
| 396 |  |  |  |  |  |  | ); | 
| 397 | 0 |  |  |  |  | 0 | $self->audit( "courier_authlib: fixed up $authrc" ); | 
| 398 |  |  |  |  |  |  | } | 
| 399 |  |  |  |  |  |  |  | 
| 400 |  |  |  |  |  |  | $self->freebsd->conf_check( | 
| 401 | 0 |  |  |  |  | 0 | check => "courier_authdaemond_enable", | 
| 402 |  |  |  |  |  |  | line  => "courier_authdaemond_enable=\"YES\"", | 
| 403 |  |  |  |  |  |  | ); | 
| 404 |  |  |  |  |  |  |  | 
| 405 | 0 | 0 |  |  |  | 0 | if ( ! -e "/var/run/authdaemond/pid" ) { | 
| 406 | 0 |  |  |  |  | 0 | my $start = "$prefix/etc/rc.d/courier-authdaemond"; | 
| 407 | 0 |  |  |  |  | 0 | foreach ( $start, "$start.sh" ) { | 
| 408 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$_ start", verbose=>0) if -x $_; | 
| 409 |  |  |  |  |  |  | }; | 
| 410 |  |  |  |  |  |  | }; | 
| 411 | 0 |  |  |  |  | 0 | return 1; | 
| 412 |  |  |  |  |  |  | } | 
| 413 |  |  |  |  |  |  |  | 
| 414 |  |  |  |  |  |  | sub courier_ssl { | 
| 415 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 416 |  |  |  |  |  |  |  | 
| 417 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 418 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 419 | 0 |  |  |  |  | 0 | my $share   = "$prefix/share/courier-imap"; | 
| 420 |  |  |  |  |  |  |  | 
| 421 |  |  |  |  |  |  | # apply ssl_ values from t-w.conf to courier's .cnf files | 
| 422 | 0 | 0 | 0 |  |  | 0 | if ( ! -e "$share/pop3d.pem" || ! -e "$share/imapd.pem" ) { | 
| 423 | 0 |  |  |  |  | 0 | my $pop3d_ssl_conf = "$confdir/courier-imap/pop3d.cnf"; | 
| 424 | 0 |  |  |  |  | 0 | my $imapd_ssl_conf = "$confdir/courier-imap/imapd.cnf"; | 
| 425 |  |  |  |  |  |  |  | 
| 426 | 0 |  | 0 |  |  | 0 | my $common_name = $self->conf->{ssl_common_name} || $self->conf->{toaster_hostname}; | 
| 427 | 0 |  |  |  |  | 0 | my $org      = $self->conf->{ssl_organization}; | 
| 428 | 0 |  |  |  |  | 0 | my $locality = $self->conf->{ssl_locality}; | 
| 429 | 0 |  |  |  |  | 0 | my $state    = $self->conf->{ssl_state}; | 
| 430 | 0 |  |  |  |  | 0 | my $country  = $self->conf->{ssl_country}; | 
| 431 |  |  |  |  |  |  |  | 
| 432 | 0 |  |  |  |  | 0 | my $sed_command = "sed -i .bak -e 's/US/$country/' "; | 
| 433 | 0 |  |  |  |  | 0 | $sed_command .= "-e 's/NY/$state/' "; | 
| 434 | 0 |  |  |  |  | 0 | $sed_command .= "-e 's/New York/$locality/' "; | 
| 435 | 0 |  |  |  |  | 0 | $sed_command .= "-e 's/Courier Mail Server/$org/' "; | 
| 436 | 0 |  |  |  |  | 0 | $sed_command .= "-e 's/localhost/$common_name/' "; | 
| 437 |  |  |  |  |  |  |  | 
| 438 | 0 |  |  |  |  | 0 | print "$sed_command\n"; | 
| 439 | 0 |  |  |  |  | 0 | system "$sed_command $pop3d_ssl_conf $imapd_ssl_conf"; | 
| 440 |  |  |  |  |  |  | }; | 
| 441 |  |  |  |  |  |  |  | 
| 442 |  |  |  |  |  |  | # use the toaster generated cert, if available | 
| 443 | 0 |  |  |  |  | 0 | my $crt = "/usr/local/openssl/certs/server.pem"; | 
| 444 | 0 |  |  |  |  | 0 | foreach my $courier_pem ( "$share/pop3d.pem", "$share/imapd.pem" ) { | 
| 445 | 0 | 0 | 0 |  |  | 0 | copy( $crt, $courier_pem ) if ( -f $crt && ! -e $courier_pem ); | 
| 446 |  |  |  |  |  |  | }; | 
| 447 |  |  |  |  |  |  |  | 
| 448 |  |  |  |  |  |  | # generate self-signed SSL certificates for pop3/imap | 
| 449 | 0 | 0 |  |  |  | 0 | if ( ! -e "$share/pop3d.pem" ) { | 
| 450 | 0 |  |  |  |  | 0 | chdir $share; | 
| 451 | 0 |  |  |  |  | 0 | $self->util->syscmd( "./mkpop3dcert", verbose => 0 ); | 
| 452 |  |  |  |  |  |  | } | 
| 453 |  |  |  |  |  |  |  | 
| 454 | 0 | 0 |  |  |  | 0 | if ( !-e "$share/imapd.pem" ) { | 
| 455 | 0 |  |  |  |  | 0 | chdir $share; | 
| 456 | 0 |  |  |  |  | 0 | $self->util->syscmd( "./mkimapdcert", verbose => 0 ); | 
| 457 |  |  |  |  |  |  | } | 
| 458 |  |  |  |  |  |  | }; | 
| 459 |  |  |  |  |  |  |  | 
| 460 |  |  |  |  |  |  | sub courier_startup { | 
| 461 |  |  |  |  |  |  |  | 
| 462 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 463 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 464 |  |  |  |  |  |  |  | 
| 465 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 466 | 0 |  |  |  |  | 0 | my $ver     = $self->conf->{install_courier_imap}; | 
| 467 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 468 |  |  |  |  |  |  |  | 
| 469 | 0 | 0 |  |  |  | 0 | chdir("$confdir/courier-imap") or | 
| 470 |  |  |  |  |  |  | return $self->error( "could not chdir $confdir/courier-imap."); | 
| 471 |  |  |  |  |  |  |  | 
| 472 | 0 | 0 |  |  |  | 0 | copy( "pop3d.cnf.dist",       "pop3d.cnf" )    if ( !-e "pop3d.cnf" ); | 
| 473 | 0 | 0 |  |  |  | 0 | copy( "pop3d.dist",           "pop3d" )        if ( !-e "pop3d" ); | 
| 474 | 0 | 0 |  |  |  | 0 | copy( "pop3d-ssl.dist",       "pop3d-ssl" )    if ( !-e "pop3d-ssl" ); | 
| 475 | 0 | 0 |  |  |  | 0 | copy( "imapd.cnf.dist",       "imapd.cnf" )    if ( !-e "imapd.cnf" ); | 
| 476 | 0 | 0 |  |  |  | 0 | copy( "imapd.dist",           "imapd" )        if ( !-e "imapd" ); | 
| 477 | 0 | 0 |  |  |  | 0 | copy( "imapd-ssl.dist",       "imapd-ssl" )    if ( !-e "imapd-ssl" ); | 
| 478 | 0 | 0 |  |  |  | 0 | copy( "quotawarnmsg.example", "quotawarnmsg" ) if ( !-e "quotawarnmsg" ); | 
| 479 |  |  |  |  |  |  |  | 
| 480 | 0 |  |  |  |  | 0 | $self->courier_ssl(); | 
| 481 |  |  |  |  |  |  |  | 
| 482 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 483 | 0 |  |  |  |  | 0 | $self->courier_startup_freebsd(); | 
| 484 |  |  |  |  |  |  | } | 
| 485 |  |  |  |  |  |  | else { | 
| 486 | 0 |  |  |  |  | 0 | my $libe = "$prefix/libexec/courier-imap"; | 
| 487 | 0 | 0 |  |  |  | 0 | if ( -e "$libe/imapd.rc" ) { | 
| 488 | 0 |  |  |  |  | 0 | print "creating symlinks in /usr/local/sbin for courier daemons\n"; | 
| 489 | 0 |  |  |  |  | 0 | symlink( "$libe/imapd.rc",     "$prefix/sbin/imap" ); | 
| 490 | 0 |  |  |  |  | 0 | symlink( "$libe/pop3d.rc",     "$prefix/sbin/pop3" ); | 
| 491 | 0 |  |  |  |  | 0 | symlink( "$libe/imapd-ssl.rc", "$prefix/sbin/imapssl" ); | 
| 492 | 0 |  |  |  |  | 0 | symlink( "$libe/pop3d-ssl.rc", "$prefix/sbin/pop3ssl" ); | 
| 493 |  |  |  |  |  |  | } | 
| 494 |  |  |  |  |  |  | else { | 
| 495 | 0 |  |  |  |  | 0 | print | 
| 496 |  |  |  |  |  |  | "FAILURE: sorry, I can't find the courier rc files on $OSNAME.\n"; | 
| 497 |  |  |  |  |  |  | } | 
| 498 |  |  |  |  |  |  | } | 
| 499 |  |  |  |  |  |  |  | 
| 500 | 0 |  |  |  |  | 0 | $self->courier_authlib(); | 
| 501 |  |  |  |  |  |  |  | 
| 502 | 0 | 0 |  |  |  | 0 | unless ( -e "/var/run/imapd-ssl.pid" ) { | 
| 503 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$prefix/sbin/imapssl start", verbose=>0 ) | 
| 504 |  |  |  |  |  |  | if -x "$prefix/sbin/imapssl"; | 
| 505 |  |  |  |  |  |  | } | 
| 506 |  |  |  |  |  |  |  | 
| 507 | 0 | 0 |  |  |  | 0 | unless ( -e "/var/run/imapd.pid" ) { | 
| 508 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$prefix/sbin/imap start", verbose=>0 ) | 
| 509 |  |  |  |  |  |  | if -x "$prefix/sbin/imapssl"; | 
| 510 |  |  |  |  |  |  | } | 
| 511 |  |  |  |  |  |  |  | 
| 512 | 0 | 0 |  |  |  | 0 | unless ( -e "/var/run/pop3d-ssl.pid" ) { | 
| 513 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$prefix/sbin/pop3ssl start", verbose=>0 ) | 
| 514 |  |  |  |  |  |  | if -x "$prefix/sbin/pop3ssl"; | 
| 515 |  |  |  |  |  |  | } | 
| 516 |  |  |  |  |  |  |  | 
| 517 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{pop3_daemon} eq "courier" ) { | 
| 518 | 0 | 0 |  |  |  | 0 | if ( !-e "/var/run/pop3d.pid" ) { | 
| 519 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$prefix/sbin/pop3 start", verbose=>0 ) | 
| 520 |  |  |  |  |  |  | if -x "$prefix/sbin/pop3"; | 
| 521 |  |  |  |  |  |  | } | 
| 522 |  |  |  |  |  |  | } | 
| 523 |  |  |  |  |  |  | } | 
| 524 |  |  |  |  |  |  |  | 
| 525 |  |  |  |  |  |  | sub courier_startup_freebsd { | 
| 526 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 527 |  |  |  |  |  |  |  | 
| 528 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 529 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 530 |  |  |  |  |  |  |  | 
| 531 | 0 | 0 |  |  |  | 0 | return 1 if ! $self->freebsd->is_port_installed( 'courier-imap' ); | 
| 532 |  |  |  |  |  |  |  | 
| 533 |  |  |  |  |  |  | # cleanup stale links, created long ago when rc.d files had .sh endings | 
| 534 | 0 |  |  |  |  | 0 | foreach ( qw/ imap imapssl pop3 pop3ssl / ) { | 
| 535 | 0 | 0 |  |  |  | 0 | if ( -e "$prefix/sbin/$_" ) { | 
| 536 | 0 | 0 |  |  |  | 0 | readlink "$prefix/sbin/$_" or unlink "$prefix/sbin/$_"; | 
| 537 |  |  |  |  |  |  | }; | 
| 538 |  |  |  |  |  |  | }; | 
| 539 |  |  |  |  |  |  |  | 
| 540 | 0 | 0 |  |  |  | 0 | if ( ! -e "$prefix/sbin/imap" ) { | 
| 541 | 0 |  |  |  |  | 0 | $self->audit( "setting up startup file shortcuts for daemons"); | 
| 542 | 0 |  |  |  |  | 0 | symlink( "$confdir/rc.d/courier-imap-imapd", "$prefix/sbin/imap" ); | 
| 543 | 0 |  |  |  |  | 0 | symlink( "$confdir/rc.d/courier-imap-pop3d", "$prefix/sbin/pop3" ); | 
| 544 | 0 |  |  |  |  | 0 | symlink( "$confdir/rc.d/courier-imap-imapd-ssl", "$prefix/sbin/imapssl" ); | 
| 545 | 0 |  |  |  |  | 0 | symlink( "$confdir/rc.d/courier-imap-pop3d-ssl", "$prefix/sbin/pop3ssl" ); | 
| 546 |  |  |  |  |  |  | } | 
| 547 |  |  |  |  |  |  |  | 
| 548 | 0 | 0 |  |  |  | 0 | my $start = $self->conf->{install_courier_imap} ? 'YES' : 'NO'; | 
| 549 |  |  |  |  |  |  |  | 
| 550 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 551 |  |  |  |  |  |  | check => "courier_imap_imapd_enable", | 
| 552 |  |  |  |  |  |  | line  => "courier_imap_imapd_enable=\"$start\"", | 
| 553 |  |  |  |  |  |  | ); | 
| 554 |  |  |  |  |  |  |  | 
| 555 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 556 |  |  |  |  |  |  | check => "courier_imap_imapdssl_enable", | 
| 557 |  |  |  |  |  |  | line  => "courier_imap_imapdssl_enable=\"$start\"", | 
| 558 |  |  |  |  |  |  | ); | 
| 559 |  |  |  |  |  |  |  | 
| 560 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 561 |  |  |  |  |  |  | check => "courier_imap_imapd_ssl_enable", | 
| 562 |  |  |  |  |  |  | line  => "courier_imap_imapd_ssl_enable=\"$start\"", | 
| 563 |  |  |  |  |  |  | ); | 
| 564 |  |  |  |  |  |  |  | 
| 565 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 566 |  |  |  |  |  |  | check => "courier_imap_pop3dssl_enable", | 
| 567 |  |  |  |  |  |  | line  => "courier_imap_pop3dssl_enable=\"$start\"", | 
| 568 |  |  |  |  |  |  | ); | 
| 569 |  |  |  |  |  |  |  | 
| 570 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 571 |  |  |  |  |  |  | check => "courier_imap_pop3d_ssl_enable", | 
| 572 |  |  |  |  |  |  | line  => "courier_imap_pop3d_ssl_enable=\"$start\"", | 
| 573 |  |  |  |  |  |  | ); | 
| 574 |  |  |  |  |  |  |  | 
| 575 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{pop3_daemon} eq "courier" ) { | 
| 576 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 577 |  |  |  |  |  |  | check => "courier_imap_pop3d_enable", | 
| 578 |  |  |  |  |  |  | line  => "courier_imap_pop3d_enable=\"YES\"", | 
| 579 |  |  |  |  |  |  | ); | 
| 580 |  |  |  |  |  |  | } | 
| 581 |  |  |  |  |  |  | else { | 
| 582 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 583 |  |  |  |  |  |  | check => "courier_imap_pop3d_enable", | 
| 584 |  |  |  |  |  |  | line  => "courier_imap_pop3d_enable=\"NO\"", | 
| 585 |  |  |  |  |  |  | ); | 
| 586 |  |  |  |  |  |  | }; | 
| 587 |  |  |  |  |  |  | }; | 
| 588 |  |  |  |  |  |  |  | 
| 589 |  |  |  |  |  |  | sub cronolog { | 
| 590 | 3 |  |  | 3 | 0 | 11 | my $self  = shift; | 
| 591 | 3 |  |  |  |  | 8 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 592 |  |  |  |  |  |  |  | 
| 593 | 3 | 100 |  |  |  | 17 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 594 |  |  |  |  |  |  |  | 
| 595 | 1 | 50 |  |  |  | 3 | my $ver = $self->conf->{install_cronolog} or do { | 
| 596 | 1 |  |  |  |  | 3 | $self->audit( "cronolog: skipping install (disabled)"); | 
| 597 | 1 |  |  |  |  | 3 | return; | 
| 598 |  |  |  |  |  |  | }; | 
| 599 |  |  |  |  |  |  |  | 
| 600 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 601 | 0 |  |  |  |  | 0 | return $self->cronolog_freebsd(); | 
| 602 |  |  |  |  |  |  | } | 
| 603 |  |  |  |  |  |  |  | 
| 604 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "cronolog", fatal => 0 ) ) { | 
| 605 | 0 |  |  |  |  | 0 | $self->audit( "cronolog: install cronolog, ok (exists)",verbose=>1 ); | 
| 606 | 0 |  |  |  |  | 0 | return 2; | 
| 607 |  |  |  |  |  |  | } | 
| 608 |  |  |  |  |  |  |  | 
| 609 | 0 |  |  |  |  | 0 | $self->audit( "attempting cronolog install from source"); | 
| 610 |  |  |  |  |  |  |  | 
| 611 | 0 | 0 |  |  |  | 0 | if ( $ver eq "port" ) { $ver = "1.6.2" };  # a fallback version | 
|  | 0 |  |  |  |  | 0 |  | 
| 612 |  |  |  |  |  |  |  | 
| 613 | 0 |  |  |  |  | 0 | $self->util->install_from_source( | 
| 614 |  |  |  |  |  |  | package => "cronolog-$ver", | 
| 615 |  |  |  |  |  |  | site    => 'http://www.cronolog.org', | 
| 616 |  |  |  |  |  |  | url     => '/download', | 
| 617 |  |  |  |  |  |  | targets => [ './configure', 'make', 'make install' ], | 
| 618 |  |  |  |  |  |  | bintest => 'cronolog', | 
| 619 |  |  |  |  |  |  | ); | 
| 620 |  |  |  |  |  |  |  | 
| 621 | 0 | 0 |  |  |  | 0 | $self->util->find_bin( "cronolog" ) or return; | 
| 622 |  |  |  |  |  |  |  | 
| 623 | 0 |  |  |  |  | 0 | $self->audit( "cronolog: install cronolog, ok" ); | 
| 624 | 0 |  |  |  |  | 0 | return 1; | 
| 625 |  |  |  |  |  |  | } | 
| 626 |  |  |  |  |  |  |  | 
| 627 |  |  |  |  |  |  | sub cronolog_freebsd { | 
| 628 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 629 | 0 |  |  |  |  | 0 | $self->freebsd->install_package('cronolog'); | 
| 630 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed('cronolog'); | 
| 631 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( "cronolog", | 
| 632 |  |  |  |  |  |  | fatal => 0, | 
| 633 |  |  |  |  |  |  | options => "# This file generated by mail-toaster | 
| 634 |  |  |  |  |  |  | # Options for cronolog-1.6.2_4 | 
| 635 |  |  |  |  |  |  | _OPTIONS_READ=cronolog-1.6.2_4 | 
| 636 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=SETUID_PATCH | 
| 637 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SETUID_PATCH\n", | 
| 638 |  |  |  |  |  |  | ); | 
| 639 |  |  |  |  |  |  | }; | 
| 640 |  |  |  |  |  |  |  | 
| 641 |  |  |  |  |  |  | sub daemontools { | 
| 642 | 3 |  |  | 3 | 1 | 24 | my $self  = shift; | 
| 643 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 644 |  |  |  |  |  |  |  | 
| 645 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; | 
| 646 |  |  |  |  |  |  |  | 
| 647 | 1 | 50 |  |  |  | 4 | my $ver = $self->conf->{install_daemontools} or do { | 
| 648 | 1 |  |  |  |  | 2 | $self->audit( "daemontools: installing, (disabled)" ); | 
| 649 | 1 |  |  |  |  | 3 | return; | 
| 650 |  |  |  |  |  |  | }; | 
| 651 |  |  |  |  |  |  |  | 
| 652 | 0 | 0 |  |  |  | 0 | $self->daemontools_freebsd() if $OSNAME eq "freebsd"; | 
| 653 |  |  |  |  |  |  |  | 
| 654 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "darwin" && $ver eq "port" ) { | 
| 655 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "daemontools" ); | 
| 656 |  |  |  |  |  |  |  | 
| 657 | 0 |  |  |  |  | 0 | print | 
| 658 |  |  |  |  |  |  | "\a\n\nWARNING: there is a bug in the OS 10.4 kernel that requires daemontools to be built with a special tweak. This must be done once. You will be prompted to install daemontools now. If you haven't already allowed this script to build daemontools from source, please do so now!\n\n"; | 
| 659 | 0 |  |  |  |  | 0 | sleep 2; | 
| 660 |  |  |  |  |  |  | } | 
| 661 |  |  |  |  |  |  |  | 
| 662 |  |  |  |  |  |  | # see if the svscan binary is already installed | 
| 663 | 0 | 0 |  |  |  | 0 | $self->util->find_bin( "svscan", fatal => 0, verbose => 0 ) and do { | 
| 664 | 0 |  |  |  |  | 0 | $self->audit( "daemontools: installing, ok (exists)" ); | 
| 665 | 0 |  |  |  |  | 0 | return 1; | 
| 666 |  |  |  |  |  |  | }; | 
| 667 |  |  |  |  |  |  |  | 
| 668 | 0 |  |  |  |  | 0 | $self->daemontools_src(); | 
| 669 |  |  |  |  |  |  | }; | 
| 670 |  |  |  |  |  |  |  | 
| 671 |  |  |  |  |  |  | sub daemontools_src { | 
| 672 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 673 |  |  |  |  |  |  |  | 
| 674 | 0 |  |  |  |  | 0 | my $ver = $self->conf->{install_daemontools}; | 
| 675 | 0 | 0 |  |  |  | 0 | $ver = "0.76" if $ver eq "port"; | 
| 676 |  |  |  |  |  |  |  | 
| 677 | 0 |  |  |  |  | 0 | my $package = "daemontools-$ver"; | 
| 678 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 679 |  |  |  |  |  |  |  | 
| 680 | 0 |  |  |  |  | 0 | my @targets = ('package/install'); | 
| 681 | 0 |  |  |  |  | 0 | my @patches; | 
| 682 | 0 |  |  |  |  | 0 | my $patch_args = "";    # cannot be undef | 
| 683 |  |  |  |  |  |  |  | 
| 684 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "darwin" ) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 685 | 0 |  |  |  |  | 0 | print "daemontools: applying fixups for Darwin.\n"; | 
| 686 | 0 |  |  |  |  | 0 | @targets = ( | 
| 687 |  |  |  |  |  |  | "echo cc -Wl,-x > src/conf-ld", | 
| 688 |  |  |  |  |  |  | "echo $prefix/bin > src/home", | 
| 689 |  |  |  |  |  |  | "echo x >> src/trypoll.c", | 
| 690 |  |  |  |  |  |  | "cd src", | 
| 691 |  |  |  |  |  |  | "make", | 
| 692 |  |  |  |  |  |  | ); | 
| 693 |  |  |  |  |  |  | } | 
| 694 |  |  |  |  |  |  | elsif ( $OSNAME eq "linux" ) { | 
| 695 | 0 |  |  |  |  | 0 | print "daemontools: applying fixups for Linux.\n"; | 
| 696 | 0 |  |  |  |  | 0 | @patches    = ('daemontools-0.76.errno.patch'); | 
| 697 | 0 |  |  |  |  | 0 | $patch_args = "-p0"; | 
| 698 |  |  |  |  |  |  | } | 
| 699 |  |  |  |  |  |  | elsif ( $OSNAME eq "freebsd" ) { | 
| 700 |  |  |  |  |  |  | @targets = ( | 
| 701 | 0 |  |  |  |  | 0 | 'echo "' . $self->conf->{toaster_prefix} . '" > src/home', | 
| 702 |  |  |  |  |  |  | "cd src", "make", | 
| 703 |  |  |  |  |  |  | ); | 
| 704 |  |  |  |  |  |  | } | 
| 705 |  |  |  |  |  |  |  | 
| 706 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 707 |  |  |  |  |  |  | package    => $package, | 
| 708 |  |  |  |  |  |  | site       => 'http://cr.yp.to', | 
| 709 |  |  |  |  |  |  | url        => '/daemontools', | 
| 710 |  |  |  |  |  |  | targets    => \@targets, | 
| 711 |  |  |  |  |  |  | patches    => \@patches, | 
| 712 |  |  |  |  |  |  | patch_args => $patch_args, | 
| 713 | 0 |  |  |  |  | 0 | patch_url  => $self->conf->{toaster_dl_site}.$self->conf->{toaster_dl_url}.'/patches', | 
| 714 |  |  |  |  |  |  | bintest    => 'svscan', | 
| 715 |  |  |  |  |  |  | ); | 
| 716 |  |  |  |  |  |  |  | 
| 717 | 0 | 0 |  |  |  | 0 | if ( $OSNAME =~ /darwin|freebsd/i ) { | 
| 718 |  |  |  |  |  |  |  | 
| 719 |  |  |  |  |  |  | # manually install the daemontools binaries in $prefix/local/bin | 
| 720 | 0 |  |  |  |  | 0 | chdir $self->conf->{toaster_src_dir}."/admin/$package"; | 
| 721 |  |  |  |  |  |  |  | 
| 722 | 0 |  |  |  |  | 0 | foreach ( $self->util->file_read( "package/commands" ) ) { | 
| 723 | 0 |  |  |  |  | 0 | my $install = $self->util->find_bin( 'install' ); | 
| 724 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$install src/$_ $prefix/bin", verbose=>0 ); | 
| 725 |  |  |  |  |  |  | } | 
| 726 |  |  |  |  |  |  | } | 
| 727 |  |  |  |  |  |  |  | 
| 728 | 0 |  |  |  |  | 0 | return 1; | 
| 729 |  |  |  |  |  |  | } | 
| 730 |  |  |  |  |  |  |  | 
| 731 |  |  |  |  |  |  | sub daemontools_freebsd { | 
| 732 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 733 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( "daemontools", | 
| 734 |  |  |  |  |  |  | options => '# This file is generated by Mail Toaster | 
| 735 |  |  |  |  |  |  | # Options for daemontools-0.76_16 | 
| 736 |  |  |  |  |  |  | _OPTIONS_READ=daemontools-0.76_16 | 
| 737 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=MAN SIGQ12 TESTS S_EARLY S_NORMAL | 
| 738 |  |  |  |  |  |  | OPTIONS_FILE_SET+=MAN | 
| 739 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SIGQ12 | 
| 740 |  |  |  |  |  |  | OPTIONS_FILE_SET+=TESTS | 
| 741 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=S_EARLY | 
| 742 |  |  |  |  |  |  | OPTIONS_FILE_SET+=S_NORMAL | 
| 743 |  |  |  |  |  |  | ', | 
| 744 |  |  |  |  |  |  | fatal => 0, | 
| 745 |  |  |  |  |  |  | ); | 
| 746 |  |  |  |  |  |  | }; | 
| 747 |  |  |  |  |  |  |  | 
| 748 |  |  |  |  |  |  | sub daemontools_test { | 
| 749 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 750 |  |  |  |  |  |  |  | 
| 751 | 0 |  |  |  |  | 0 | print "checking daemontools binaries...\n"; | 
| 752 | 0 |  |  |  |  | 0 | my @bins = qw{ multilog softlimit setuidgid supervise svok svscan tai64nlocal }; | 
| 753 | 0 |  |  |  |  | 0 | foreach my $test ( @bins ) { | 
| 754 | 0 |  |  |  |  | 0 | my $bin = $self->util->find_bin( $test, fatal => 0, verbose=>0); | 
| 755 | 0 |  |  |  |  | 0 | $self->test->pretty("  $test", -x $bin ); | 
| 756 |  |  |  |  |  |  | }; | 
| 757 |  |  |  |  |  |  |  | 
| 758 | 0 |  |  |  |  | 0 | return 1; | 
| 759 |  |  |  |  |  |  | } | 
| 760 |  |  |  |  |  |  |  | 
| 761 |  |  |  |  |  |  | sub dependencies { | 
| 762 | 2 |  |  | 2 | 1 | 2 | my $self  = shift; | 
| 763 | 2 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 764 |  |  |  |  |  |  |  | 
| 765 | 2 | 50 |  |  |  | 16 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 766 |  |  |  |  |  |  |  | 
| 767 | 0 |  |  |  |  | 0 | my $qmaildir = $self->qmail->get_qmail_dir; | 
| 768 |  |  |  |  |  |  |  | 
| 769 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 770 | 0 |  |  |  |  | 0 | $self->dependencies_freebsd(); | 
| 771 |  |  |  |  |  |  | } | 
| 772 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 773 | 0 |  |  |  |  | 0 | my @dports = | 
| 774 |  |  |  |  |  |  | qw/ cronolog gdbm gmake ucspi-tcp daemontools DarwinPortsStartup /; | 
| 775 |  |  |  |  |  |  |  | 
| 776 | 0 | 0 |  |  |  | 0 | push @dports, "maildrop" if $self->conf->{install_maildrop}; | 
| 777 | 0 | 0 |  |  |  | 0 | push @dports, "openldap" if $self->conf->{install_openldap_client}; | 
| 778 | 0 | 0 |  |  |  | 0 | push @dports, "gnupg"    if $self->conf->{install_gnupg}; | 
| 779 |  |  |  |  |  |  |  | 
| 780 | 0 |  |  |  |  | 0 | foreach (@dports) { $self->darwin->install_port( $_ ) } | 
|  | 0 |  |  |  |  | 0 |  | 
| 781 |  |  |  |  |  |  | } | 
| 782 |  |  |  |  |  |  | else { | 
| 783 | 0 |  |  |  |  | 0 | $self->dependencies_other(); | 
| 784 |  |  |  |  |  |  | }; | 
| 785 |  |  |  |  |  |  |  | 
| 786 | 0 |  |  |  |  | 0 | $self->util->install_module( "Params::Validate" ); | 
| 787 | 0 |  |  |  |  | 0 | $self->util->install_module( "IO::Compress" ); | 
| 788 | 0 |  |  |  |  | 0 | $self->util->install_module( "Compress::Raw::Zlib" ); | 
| 789 |  |  |  |  |  |  | #   $self->util->install_module( "Crypt::PasswdMD5" ); | 
| 790 | 0 |  |  |  |  | 0 | $self->util->install_module( "Net::DNS" ); | 
| 791 | 0 | 0 |  |  |  | 0 | $self->util->install_module( "Quota", fatal => 0 ) if $self->conf->{install_quota_tools}; | 
| 792 | 0 |  |  |  |  | 0 | $self->util->install_module( "Date::Format", port => "p5-TimeDate"); | 
| 793 | 0 |  |  |  |  | 0 | $self->util->install_module( "Date::Parse" ); | 
| 794 | 0 |  |  |  |  | 0 | $self->util->install_module( "Mail::Send",  port => "p5-Mail-Tools"); | 
| 795 | 0 | 0 |  |  |  | 0 | $self->util->install_module( "Qmail::Deliverable") if $self->conf->{install_qmail_deliverable}; | 
| 796 |  |  |  |  |  |  |  | 
| 797 | 0 | 0 |  |  |  | 0 | if ( ! -x "$qmaildir/bin/qmail-queue" ) { | 
| 798 | 0 |  |  |  |  | 0 | $self->conf->{qmail_chk_usr_patch} = 0; | 
| 799 | 0 |  |  |  |  | 0 | $self->qmail->netqmail_virgin(); | 
| 800 |  |  |  |  |  |  | } | 
| 801 |  |  |  |  |  |  |  | 
| 802 | 0 |  |  |  |  | 0 | $self->daemontools(); | 
| 803 | 0 |  |  |  |  | 0 | $self->autorespond(); | 
| 804 |  |  |  |  |  |  | } | 
| 805 |  |  |  |  |  |  |  | 
| 806 |  |  |  |  |  |  | sub dependencies_freebsd { | 
| 807 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 808 | 0 |  | 0 |  |  | 0 | my $package = $self->conf->{package_install_method} || "packages"; | 
| 809 |  |  |  |  |  |  |  | 
| 810 | 0 |  |  |  |  | 0 | $self->periodic_conf;    # create /etc/periodic.conf | 
| 811 | 0 |  |  |  |  | 0 | $self->gmake_freebsd; | 
| 812 | 0 |  |  |  |  | 0 | $self->openssl_install; | 
| 813 | 0 | 0 |  |  |  | 0 | $self->stunnel if $self->conf->{pop3_ssl_daemon} eq "qpop3d"; | 
| 814 | 0 |  |  |  |  | 0 | $self->ucspi_tcp_freebsd; | 
| 815 | 0 |  |  |  |  | 0 | $self->cronolog_freebsd; | 
| 816 |  |  |  |  |  |  |  | 
| 817 | 0 |  |  |  |  | 0 | my  @to_install = ( | 
| 818 |  |  |  |  |  |  | { port => "p5-Params-Validate" }, | 
| 819 |  |  |  |  |  |  | { port => "p5-Net-DNS" }, | 
| 820 |  |  |  |  |  |  | ); | 
| 821 | 0 | 0 |  |  |  | 0 | push @to_install, { port => "setquota" }  if $self->conf->{install_quota_tools}; | 
| 822 | 0 |  |  |  |  | 0 | push @to_install, { | 
| 823 |  |  |  |  |  |  | port    => 'gdbm', | 
| 824 |  |  |  |  |  |  | options => "# This file generated by Mail::Toaster | 
| 825 |  |  |  |  |  |  | # Options for gdbm-1.10 | 
| 826 |  |  |  |  |  |  | _OPTIONS_READ=gdbm-1.10 | 
| 827 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=COMPAT NLS | 
| 828 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=COMPAT | 
| 829 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=NLS\n", | 
| 830 |  |  |  |  |  |  | }; | 
| 831 |  |  |  |  |  |  | push @to_install, { port  => 'openldap23-client', | 
| 832 |  |  |  |  |  |  | check    => "openldap-client", | 
| 833 |  |  |  |  |  |  | category => 'net', | 
| 834 | 0 | 0 |  |  |  | 0 | } if $self->conf->{install_openldap_client}; | 
| 835 | 0 |  |  |  |  | 0 | push @to_install, { port  => "qmail", | 
| 836 |  |  |  |  |  |  | flags   => "BATCH=yes", | 
| 837 |  |  |  |  |  |  | options => "#\n# Installed by Mail::Toaster | 
| 838 |  |  |  |  |  |  | # Options for qmail-1.03_7\n_OPTIONS_READ=qmail-1.03_7", | 
| 839 |  |  |  |  |  |  | }; | 
| 840 | 0 |  |  |  |  | 0 | push @to_install, { port => "qmailanalog", fatal => 0 }; | 
| 841 |  |  |  |  |  |  | push @to_install, { port => "qmail-notify", fatal => 0 } | 
| 842 | 0 | 0 |  |  |  | 0 | if $self->conf->{install_qmail_notify}; | 
| 843 |  |  |  |  |  |  |  | 
| 844 |  |  |  |  |  |  | # if package method is selected, try it | 
| 845 | 0 | 0 |  |  |  | 0 | if ( $package eq "packages" ) { | 
| 846 | 0 |  |  |  |  | 0 | foreach ( @to_install ) { | 
| 847 | 0 |  | 0 |  |  | 0 | my $port = $_->{port} || $_->{name}; | 
| 848 | 0 |  |  |  |  | 0 | $self->freebsd->install_package( $port, fatal => 0 ); | 
| 849 |  |  |  |  |  |  | }; | 
| 850 |  |  |  |  |  |  | } | 
| 851 |  |  |  |  |  |  |  | 
| 852 | 0 |  |  |  |  | 0 | foreach my $port (@to_install) { | 
| 853 |  |  |  |  |  |  | $self->freebsd->install_port( $port->{port}, | 
| 854 |  |  |  |  |  |  | defined $port->{flags}   ? (flags   => $port->{flags}   ) : (), | 
| 855 |  |  |  |  |  |  | defined $port->{options} ? (options => $port->{options} ) : (), | 
| 856 |  |  |  |  |  |  | defined $port->{check}   ? (check   => $port->{check}   ) : (), | 
| 857 |  |  |  |  |  |  | defined $port->{fatal}   ? (fatal   => $port->{fatal}   ) : (), | 
| 858 | 0 | 0 |  |  |  | 0 | defined $port->{category}? (category=> $port->{category}) : (), | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 859 |  |  |  |  |  |  | ); | 
| 860 |  |  |  |  |  |  | } | 
| 861 |  |  |  |  |  |  | }; | 
| 862 |  |  |  |  |  |  |  | 
| 863 |  |  |  |  |  |  | sub dependencies_other { | 
| 864 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 865 | 0 |  |  |  |  | 0 | print "no ports for $OSNAME, installing from sources.\n"; | 
| 866 |  |  |  |  |  |  |  | 
| 867 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "linux" ) { | 
| 868 | 0 |  |  |  |  | 0 | my $vpopdir = $self->vpopmail->get_vpop_dir; | 
| 869 | 0 |  |  |  |  | 0 | $self->qmail->install_qmail_groups_users; | 
| 870 |  |  |  |  |  |  |  | 
| 871 | 0 |  |  |  |  | 0 | $self->util->syscmd( "groupadd -g 89 vchkpw" ); | 
| 872 | 0 |  |  |  |  | 0 | $self->util->syscmd( "useradd -g vchkpw -d $vpopdir vpopmail" ); | 
| 873 | 0 |  |  |  |  | 0 | $self->util->syscmd( "groupadd clamav" ); | 
| 874 | 0 |  |  |  |  | 0 | $self->util->syscmd( "useradd -g clamav clamav" ); | 
| 875 |  |  |  |  |  |  | } | 
| 876 |  |  |  |  |  |  |  | 
| 877 | 0 |  |  |  |  | 0 | my @progs = qw(gmake expect cronolog autorespond ); | 
| 878 | 0 | 0 |  |  |  | 0 | push @progs, "setquota" if $self->conf->{install_quota_tools}; | 
| 879 | 0 | 0 |  |  |  | 0 | push @progs, "gnupg" if $self->conf->{install_gnupg}; | 
| 880 |  |  |  |  |  |  |  | 
| 881 | 0 |  |  |  |  | 0 | foreach (@progs) { | 
| 882 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( $_, verbose=>0,fatal=>0 ) ) { | 
| 883 | 0 |  |  |  |  | 0 | $self->audit( "checking for $_, ok" ); | 
| 884 |  |  |  |  |  |  | } | 
| 885 |  |  |  |  |  |  | else { | 
| 886 | 0 |  |  |  |  | 0 | print "$_ not installed. FAILED, please install manually.\n"; | 
| 887 |  |  |  |  |  |  | } | 
| 888 |  |  |  |  |  |  | } | 
| 889 |  |  |  |  |  |  | } | 
| 890 |  |  |  |  |  |  |  | 
| 891 |  |  |  |  |  |  | sub djbdns { | 
| 892 | 3 |  |  | 3 | 1 | 10 | my $self  = shift; | 
| 893 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 894 |  |  |  |  |  |  |  | 
| 895 | 3 | 100 |  |  |  | 16 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 896 |  |  |  |  |  |  |  | 
| 897 | 1 | 50 |  |  |  | 2 | if ( ! $self->conf->{install_djbdns} ) { | 
| 898 | 1 |  |  |  |  | 3 | $self->audit( "djbdns: installing, skipping (disabled)" ); | 
| 899 | 1 |  |  |  |  | 3 | return; | 
| 900 |  |  |  |  |  |  | }; | 
| 901 |  |  |  |  |  |  |  | 
| 902 | 0 |  |  |  |  | 0 | $self->daemontools(); | 
| 903 | 0 |  |  |  |  | 0 | $self->ucspi_tcp(); | 
| 904 |  |  |  |  |  |  |  | 
| 905 | 0 | 0 |  |  |  | 0 | return $self->audit( "djbdns: installing djbdns, ok (already installed)" ) | 
| 906 |  |  |  |  |  |  | if $self->util->find_bin( 'tinydns', fatal => 0 ); | 
| 907 |  |  |  |  |  |  |  | 
| 908 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 909 | 0 |  |  |  |  | 0 | $self->djbdns_freebsd(); | 
| 910 |  |  |  |  |  |  |  | 
| 911 | 0 | 0 |  |  |  | 0 | return $self->audit( "djbdns: installing djbdns, ok" ) | 
| 912 |  |  |  |  |  |  | if $self->util->find_bin( 'tinydns', fatal => 0 ); | 
| 913 |  |  |  |  |  |  | } | 
| 914 |  |  |  |  |  |  |  | 
| 915 | 0 |  |  |  |  | 0 | return $self->djbdns_src(); | 
| 916 |  |  |  |  |  |  | }; | 
| 917 |  |  |  |  |  |  |  | 
| 918 |  |  |  |  |  |  | sub djbdns_src { | 
| 919 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 920 |  |  |  |  |  |  |  | 
| 921 | 0 |  |  |  |  | 0 | my @targets = ( 'make', 'make setup check' ); | 
| 922 |  |  |  |  |  |  |  | 
| 923 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "linux" ) { | 
| 924 | 0 |  |  |  |  | 0 | unshift @targets, | 
| 925 |  |  |  |  |  |  | 'echo gcc -O2 -include /usr/include/errno.h > conf-cc'; | 
| 926 |  |  |  |  |  |  | } | 
| 927 |  |  |  |  |  |  |  | 
| 928 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 929 | 0 |  |  |  |  | 0 | package => "djbdns-1.05", | 
| 930 |  |  |  |  |  |  | site    => 'http://cr.yp.to', | 
| 931 |  |  |  |  |  |  | url     => '/djbdns', | 
| 932 |  |  |  |  |  |  | targets => \@targets, | 
| 933 |  |  |  |  |  |  | bintest => 'tinydns', | 
| 934 |  |  |  |  |  |  | ); | 
| 935 |  |  |  |  |  |  | } | 
| 936 |  |  |  |  |  |  |  | 
| 937 |  |  |  |  |  |  | sub djbdns_freebsd { | 
| 938 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 939 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "djbdns", | 
| 940 |  |  |  |  |  |  | options => "#\n | 
| 941 |  |  |  |  |  |  | # Options for djbdns-1.05_13 | 
| 942 |  |  |  |  |  |  | _OPTIONS_READ=djbdns-1.05_13 | 
| 943 |  |  |  |  |  |  | WITHOUT_DUMPCACHE=true | 
| 944 |  |  |  |  |  |  | WITHOUT_IPV6=true | 
| 945 |  |  |  |  |  |  | WITHOUT_IGNOREIP=true | 
| 946 |  |  |  |  |  |  | WITHOUT_JUMBO=true | 
| 947 |  |  |  |  |  |  | WITH_MAN=true | 
| 948 |  |  |  |  |  |  | WITHOUT_PERSISTENT_MMAP=true | 
| 949 |  |  |  |  |  |  | WITHOUT_SRV=true\n", | 
| 950 |  |  |  |  |  |  | ); | 
| 951 |  |  |  |  |  |  | }; | 
| 952 |  |  |  |  |  |  |  | 
| 953 |  |  |  |  |  |  | sub docs { | 
| 954 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 955 |  |  |  |  |  |  |  | 
| 956 | 0 |  |  |  |  | 0 | my $cmd; | 
| 957 |  |  |  |  |  |  |  | 
| 958 | 0 | 0 | 0 |  |  | 0 | if ( !-f "README" && !-f "lib/toaster.conf.pod" ) { | 
| 959 | 0 |  |  |  |  | 0 | print <<"EO_NOT_IN_DIST_ERR"; | 
| 960 |  |  |  |  |  |  |  | 
| 961 |  |  |  |  |  |  | ERROR: This setup target can only be run in the Mail::Toaster distibution directory! | 
| 962 |  |  |  |  |  |  |  | 
| 963 |  |  |  |  |  |  | Try switching into there and trying again. | 
| 964 |  |  |  |  |  |  | EO_NOT_IN_DIST_ERR | 
| 965 |  |  |  |  |  |  |  | 
| 966 | 0 |  |  |  |  | 0 | return; | 
| 967 |  |  |  |  |  |  | }; | 
| 968 |  |  |  |  |  |  |  | 
| 969 |  |  |  |  |  |  | # convert pod to text files | 
| 970 | 0 |  |  |  |  | 0 | my $pod2text = $self->util->find_bin( "pod2text", verbose=>0); | 
| 971 |  |  |  |  |  |  |  | 
| 972 | 0 |  |  |  |  | 0 | $self->util->syscmd("$pod2text bin/toaster_setup.pl       > README", verbose=>0); | 
| 973 | 0 |  |  |  |  | 0 | $self->util->syscmd("$pod2text lib/toaster.conf.pod          > doc/toaster.conf", verbose=>0); | 
| 974 | 0 |  |  |  |  | 0 | $self->util->syscmd("$pod2text lib/toaster-watcher.conf.pod  > doc/toaster-watcher.conf", verbose=>0); | 
| 975 |  |  |  |  |  |  |  | 
| 976 |  |  |  |  |  |  |  | 
| 977 |  |  |  |  |  |  | # convert pod docs to HTML pages for the web site | 
| 978 |  |  |  |  |  |  |  | 
| 979 | 0 |  |  |  |  | 0 | my $pod2html = $self->util->find_bin("pod2html", verbose=>0); | 
| 980 |  |  |  |  |  |  |  | 
| 981 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$pod2html --title='toaster.conf' lib/toaster.conf.pod > doc/toaster.conf.html", | 
| 982 |  |  |  |  |  |  | verbose=>0, ); | 
| 983 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$pod2html --title='watcher.conf' lib/toaster-watcher.conf.pod  > doc/toaster-watcher.conf.html", | 
| 984 |  |  |  |  |  |  | verbose=>0, ); | 
| 985 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$pod2html --title='mailadmin' bin/mailadmin > doc/mailadmin.html", | 
| 986 |  |  |  |  |  |  | verbose=>0, ); | 
| 987 |  |  |  |  |  |  |  | 
| 988 | 0 |  |  |  |  | 0 | my @modules = qw/ Toaster   Apache  CGI     Darwin   DNS | 
| 989 |  |  |  |  |  |  | Ezmlm     FreeBSD   Logs    Mysql   Perl | 
| 990 |  |  |  |  |  |  | Qmail     Setup   Utility /; | 
| 991 |  |  |  |  |  |  |  | 
| 992 |  |  |  |  |  |  | MODULE: | 
| 993 | 0 |  |  |  |  | 0 | foreach my $module (@modules ) { | 
| 994 | 0 | 0 |  |  |  | 0 | if ( $module =~ m/\AToaster\z/ ) { | 
| 995 | 0 |  |  |  |  | 0 | $cmd = "$pod2html --title='Mail::Toaster' lib/Mail/$module.pm > doc/modules/$module.html"; | 
| 996 | 0 |  |  |  |  | 0 | print "$cmd\n"; | 
| 997 | 0 |  |  |  |  | 0 | next MODULE; | 
| 998 | 0 |  |  |  |  | 0 | $self->util->syscmd( $cmd, verbose=>0 ); | 
| 999 |  |  |  |  |  |  | }; | 
| 1000 |  |  |  |  |  |  |  | 
| 1001 | 0 |  |  |  |  | 0 | $cmd = "$pod2html --title='Mail::Toaster::$module' lib/Mail/Toaster/$module.pm > doc/modules/$module.html"; | 
| 1002 | 0 |  |  |  |  | 0 | warn "$cmd\n"; | 
| 1003 | 0 |  |  |  |  | 0 | $self->util->syscmd( $cmd, verbose=>0 ); | 
| 1004 |  |  |  |  |  |  | }; | 
| 1005 |  |  |  |  |  |  |  | 
| 1006 | 0 |  |  |  |  | 0 | unlink <pod2htm*>; | 
| 1007 |  |  |  |  |  |  | #$self->util->syscmd( "rm pod2html*"); | 
| 1008 |  |  |  |  |  |  | }; | 
| 1009 |  |  |  |  |  |  |  | 
| 1010 |  |  |  |  |  |  | sub domainkeys { | 
| 1011 |  |  |  |  |  |  |  | 
| 1012 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 1013 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1014 |  |  |  |  |  |  |  | 
| 1015 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing only | 
| 1016 |  |  |  |  |  |  |  | 
| 1017 | 0 | 0 |  |  |  | 0 | if ( !$self->conf->{qmail_domainkeys} ) { | 
| 1018 | 0 |  |  |  |  | 0 | $self->audit( "domainkeys: installing, skipping (disabled)" ); | 
| 1019 | 0 |  |  |  |  | 0 | return 0; | 
| 1020 |  |  |  |  |  |  | } | 
| 1021 |  |  |  |  |  |  |  | 
| 1022 |  |  |  |  |  |  | # test to see if it is installed. | 
| 1023 | 0 | 0 |  |  |  | 0 | if ( -f "/usr/local/include/domainkeys.h" ) { | 
| 1024 | 0 |  |  |  |  | 0 | $self->audit( "domainkeys: installing domainkeys, ok (already installed)" ); | 
| 1025 | 0 |  |  |  |  | 0 | return 1; | 
| 1026 |  |  |  |  |  |  | } | 
| 1027 |  |  |  |  |  |  |  | 
| 1028 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 1029 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "libdomainkeys" ); | 
| 1030 |  |  |  |  |  |  |  | 
| 1031 |  |  |  |  |  |  | # test to see if it installed. | 
| 1032 | 0 | 0 |  |  |  | 0 | if ( -f "/usr/local/include/domainkeys.h" ) { | 
| 1033 | 0 |  |  |  |  | 0 | $self->audit( "domainkeys: installing domainkeys, ok (already installed)" ); | 
| 1034 | 0 |  |  |  |  | 0 | return 1; | 
| 1035 |  |  |  |  |  |  | } | 
| 1036 |  |  |  |  |  |  | } | 
| 1037 |  |  |  |  |  |  |  | 
| 1038 | 0 |  |  |  |  | 0 | my @targets = ( 'make', 'make setup check' ); | 
| 1039 |  |  |  |  |  |  |  | 
| 1040 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "linux" ) { | 
| 1041 | 0 |  |  |  |  | 0 | unshift @targets, | 
| 1042 |  |  |  |  |  |  | 'echo gcc -O2 -include /usr/include/errno.h > conf-cc'; | 
| 1043 |  |  |  |  |  |  | } | 
| 1044 |  |  |  |  |  |  |  | 
| 1045 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 1046 | 0 |  |  |  |  | 0 | package => "libdomainkeys-0.68", | 
| 1047 |  |  |  |  |  |  | site    => 'http://superb-east.dl.sourceforge.net', | 
| 1048 |  |  |  |  |  |  | url     => '/sourceforge/domainkeys', | 
| 1049 |  |  |  |  |  |  | targets => \@targets, | 
| 1050 |  |  |  |  |  |  | ); | 
| 1051 |  |  |  |  |  |  | } | 
| 1052 |  |  |  |  |  |  |  | 
| 1053 |  |  |  |  |  |  | sub dovecot { | 
| 1054 | 3 |  |  | 3 | 0 | 9 | my $self  = shift; | 
| 1055 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1056 |  |  |  |  |  |  |  | 
| 1057 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 1058 |  |  |  |  |  |  |  | 
| 1059 | 1 | 50 |  |  |  | 3 | my $ver = $self->conf->{install_dovecot} or do { | 
| 1060 | 1 |  |  |  |  | 2 | $self->audit( "dovecot install not selected."); | 
| 1061 | 1 |  |  |  |  | 3 | return; | 
| 1062 |  |  |  |  |  |  | }; | 
| 1063 |  |  |  |  |  |  |  | 
| 1064 | 0 | 0 | 0 |  |  | 0 | if ( $ver eq "port" || $ver eq "1" ) { | 
| 1065 |  |  |  |  |  |  |  | 
| 1066 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "dovecot", fatal => 0 ) ) { | 
| 1067 | 0 |  |  |  |  | 0 | print "dovecot: is already installed...done.\n\n"; | 
| 1068 | 0 |  |  |  |  | 0 | return $self->dovecot_start(); | 
| 1069 |  |  |  |  |  |  | } | 
| 1070 |  |  |  |  |  |  |  | 
| 1071 | 0 |  |  |  |  | 0 | print "dovecot: installing...\n"; | 
| 1072 |  |  |  |  |  |  |  | 
| 1073 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 1074 | 0 | 0 |  |  |  | 0 | $self->dovecot_install_freebsd() or return; | 
| 1075 | 0 |  |  |  |  | 0 | return $self->dovecot_start(); | 
| 1076 |  |  |  |  |  |  | } | 
| 1077 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 1078 | 0 | 0 |  |  |  | 0 | return 1 if $self->darwin->install_port( "dovecot" ); | 
| 1079 |  |  |  |  |  |  | } | 
| 1080 |  |  |  |  |  |  |  | 
| 1081 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "dovecot", fatal => 0 ) ) { | 
| 1082 | 0 |  |  |  |  | 0 | print "dovecot: install successful.\n"; | 
| 1083 | 0 |  |  |  |  | 0 | return $self->dovecot_start(); | 
| 1084 |  |  |  |  |  |  | } | 
| 1085 |  |  |  |  |  |  |  | 
| 1086 | 0 |  |  |  |  | 0 | $ver = "1.0.7"; | 
| 1087 |  |  |  |  |  |  | } | 
| 1088 |  |  |  |  |  |  |  | 
| 1089 | 0 |  |  |  |  | 0 | my $dovecot = $self->util->find_bin( "dovecot", fatal => 0 ); | 
| 1090 | 0 | 0 |  |  |  | 0 | if ( -x $dovecot ) { | 
| 1091 | 0 |  |  |  |  | 0 | my $installed = `$dovecot --version`; | 
| 1092 |  |  |  |  |  |  |  | 
| 1093 | 0 | 0 |  |  |  | 0 | if ( $ver eq $installed ) { | 
| 1094 | 0 |  |  |  |  | 0 | print | 
| 1095 |  |  |  |  |  |  | "dovecot: the selected version ($ver) is already installed!\n"; | 
| 1096 | 0 |  |  |  |  | 0 | $self->dovecot_start(); | 
| 1097 | 0 |  |  |  |  | 0 | return 1; | 
| 1098 |  |  |  |  |  |  | } | 
| 1099 |  |  |  |  |  |  | } | 
| 1100 |  |  |  |  |  |  |  | 
| 1101 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 1102 | 0 |  |  |  |  | 0 | package        => "dovecot-$ver", | 
| 1103 |  |  |  |  |  |  | site           => 'http://www.dovecot.org', | 
| 1104 |  |  |  |  |  |  | url            => '/releases', | 
| 1105 |  |  |  |  |  |  | targets        => [ './configure', 'make', 'make install' ], | 
| 1106 |  |  |  |  |  |  | bintest        => 'dovecot', | 
| 1107 |  |  |  |  |  |  | verbose          => 1, | 
| 1108 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 1109 |  |  |  |  |  |  | ); | 
| 1110 |  |  |  |  |  |  |  | 
| 1111 | 0 |  |  |  |  | 0 | $self->dovecot_start(); | 
| 1112 |  |  |  |  |  |  | } | 
| 1113 |  |  |  |  |  |  |  | 
| 1114 |  |  |  |  |  |  | sub dovecot_1_conf { | 
| 1115 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1116 |  |  |  |  |  |  |  | 
| 1117 | 0 |  |  |  |  | 0 | my $dconf = '/usr/local/etc/dovecot.conf'; | 
| 1118 | 0 | 0 |  |  |  | 0 | if ( ! -f $dconf ) { | 
| 1119 | 0 |  |  |  |  | 0 | foreach ( qw{ /opt/local/etc /etc } ) { | 
| 1120 | 0 |  |  |  |  | 0 | $dconf = "$_/dovecot.conf"; | 
| 1121 | 0 | 0 |  |  |  | 0 | last if -e $dconf; | 
| 1122 |  |  |  |  |  |  | }; | 
| 1123 | 0 | 0 |  |  |  | 0 | if ( ! -f $dconf ) { | 
| 1124 | 0 |  |  |  |  | 0 | return $self->error( "could not locate dovecot.conf. Toaster modifications not applied."); | 
| 1125 |  |  |  |  |  |  | }; | 
| 1126 |  |  |  |  |  |  | }; | 
| 1127 |  |  |  |  |  |  |  | 
| 1128 | 0 |  |  |  |  | 0 | my $updated = `grep 'Mail Toaster' $dconf`; | 
| 1129 | 0 | 0 |  |  |  | 0 | if ( $updated ) { | 
| 1130 | 0 |  |  |  |  | 0 | $self->audit( "Toaster modifications detected, skipping config" ); | 
| 1131 | 0 |  |  |  |  | 0 | return 1; | 
| 1132 |  |  |  |  |  |  | }; | 
| 1133 |  |  |  |  |  |  |  | 
| 1134 | 0 |  |  |  |  | 0 | my $qmaildir = $self->qmail->get_qmail_dir; | 
| 1135 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1136 |  |  |  |  |  |  | file => $dconf, | 
| 1137 |  |  |  |  |  |  | changes => [ | 
| 1138 |  |  |  |  |  |  | {   search  => "protocols = imap pop3 imaps pop3s managesieve", | 
| 1139 |  |  |  |  |  |  | replace => "protocols = imap pop3 imaps pop3s", | 
| 1140 |  |  |  |  |  |  | nowarn  => 1, | 
| 1141 |  |  |  |  |  |  | }, | 
| 1142 |  |  |  |  |  |  | {   search  => "protocol pop3 {", | 
| 1143 |  |  |  |  |  |  | search2 => "section", | 
| 1144 |  |  |  |  |  |  | replace => "protocol pop3 { | 
| 1145 |  |  |  |  |  |  | pop3_uidl_format = %08Xu%08Xv | 
| 1146 |  |  |  |  |  |  | mail_plugins = quota | 
| 1147 |  |  |  |  |  |  | pop3_client_workarounds = outlook-no-nuls oe-ns-eoh | 
| 1148 |  |  |  |  |  |  | }", | 
| 1149 |  |  |  |  |  |  | }, | 
| 1150 |  |  |  |  |  |  | {   search  => "protocol managesieve {", | 
| 1151 |  |  |  |  |  |  | search2 => "section", | 
| 1152 |  |  |  |  |  |  | replace => " ", | 
| 1153 |  |  |  |  |  |  | nowarn  => 1,   # manageseive is optional build | 
| 1154 |  |  |  |  |  |  | }, | 
| 1155 |  |  |  |  |  |  | {   search  => "#shutdown_clients = yes", | 
| 1156 |  |  |  |  |  |  | replace => "#shutdown_clients = yes\nshutdown_clients = no", | 
| 1157 |  |  |  |  |  |  | }, | 
| 1158 |  |  |  |  |  |  | {   search  => "#ssl_cert_file = /etc/ssl/certs/dovecot.pem", | 
| 1159 |  |  |  |  |  |  | replace => "#ssl_cert_file = /etc/ssl/certs/dovecot.pem | 
| 1160 |  |  |  |  |  |  | ssl_cert_file = $qmaildir/control/servercert.pem", | 
| 1161 |  |  |  |  |  |  | }, | 
| 1162 |  |  |  |  |  |  | {   search  => "#ssl_key_file = /etc/ssl/private/dovecot.pem", | 
| 1163 |  |  |  |  |  |  | replace => "#ssl_key_file = /etc/ssl/private/dovecot.pem | 
| 1164 |  |  |  |  |  |  | ssl_key_file = $qmaildir/control/servercert.pem", | 
| 1165 |  |  |  |  |  |  | }, | 
| 1166 |  |  |  |  |  |  | {   search  => "#login_greeting = Dovecot ready.", | 
| 1167 |  |  |  |  |  |  | replace => "#login_greeting = Dovecot ready. | 
| 1168 |  |  |  |  |  |  | login_greeting = Mail Toaster (Dovecot) ready.", | 
| 1169 |  |  |  |  |  |  | }, | 
| 1170 |  |  |  |  |  |  | { | 
| 1171 |  |  |  |  |  |  | search  => "mail_location = mbox:~/mail/:INBOX=/var/mail/%u", | 
| 1172 |  |  |  |  |  |  | replace => "#mail_location = mbox:~/mail/:INBOX=/var/mail/%u | 
| 1173 |  |  |  |  |  |  | mail_location = maildir:~/Maildir", | 
| 1174 |  |  |  |  |  |  | }, | 
| 1175 |  |  |  |  |  |  | {   search  => "first_valid_uid = 1000", | 
| 1176 |  |  |  |  |  |  | replace => "#first_valid_uid = 1000 | 
| 1177 |  |  |  |  |  |  | first_valid_uid = 89", | 
| 1178 |  |  |  |  |  |  | }, | 
| 1179 |  |  |  |  |  |  | {   search  => "#last_valid_uid = 0", | 
| 1180 |  |  |  |  |  |  | replace => "#last_valid_uid = 0 | 
| 1181 |  |  |  |  |  |  | last_valid_uid = 89", | 
| 1182 |  |  |  |  |  |  | }, | 
| 1183 |  |  |  |  |  |  | {   search  => "first_valid_gid = 1000", | 
| 1184 |  |  |  |  |  |  | replace => "#first_valid_gid = 1000 | 
| 1185 |  |  |  |  |  |  | first_valid_gid = 89", | 
| 1186 |  |  |  |  |  |  | }, | 
| 1187 |  |  |  |  |  |  | {   search  => "#last_valid_gid = 0", | 
| 1188 |  |  |  |  |  |  | replace => "#last_valid_gid = 0\nlast_valid_gid = 89", | 
| 1189 |  |  |  |  |  |  | }, | 
| 1190 |  |  |  |  |  |  | {   search  => "  #mail_plugins = ", | 
| 1191 |  |  |  |  |  |  | replace => "  #mail_plugins = \n  mail_plugins = quota imap_quota", | 
| 1192 |  |  |  |  |  |  | }, | 
| 1193 |  |  |  |  |  |  | {   search  => "  sendmail_path = /usr/sbin/sendmail", | 
| 1194 |  |  |  |  |  |  | replace => "#  sendmail_path = /usr/sbin/sendmail | 
| 1195 |  |  |  |  |  |  | sendmail_path = $qmaildir/bin/sendmail", | 
| 1196 |  |  |  |  |  |  | }, | 
| 1197 |  |  |  |  |  |  | {   search  => "auth_username_format = %Ln", | 
| 1198 |  |  |  |  |  |  | replace => "#auth_username_format = %Ln | 
| 1199 |  |  |  |  |  |  | auth_username_format = %Lu", | 
| 1200 |  |  |  |  |  |  | nowarn  => 1, | 
| 1201 |  |  |  |  |  |  | }, | 
| 1202 |  |  |  |  |  |  | {   search  => "  mechanisms = plain login", | 
| 1203 |  |  |  |  |  |  | replace => "  mechanisms = plain login digest-md5 cram-md5", | 
| 1204 |  |  |  |  |  |  | }, | 
| 1205 |  |  |  |  |  |  | {   search  => "  passdb pam {", | 
| 1206 |  |  |  |  |  |  | search2 => "section", | 
| 1207 |  |  |  |  |  |  | replace => " ", | 
| 1208 |  |  |  |  |  |  | }, | 
| 1209 |  |  |  |  |  |  | {   search  => "  #passdb vpopmail {", | 
| 1210 |  |  |  |  |  |  | replace => "  passdb vpopmail {\n  }", | 
| 1211 |  |  |  |  |  |  | }, | 
| 1212 |  |  |  |  |  |  | {   search  => "  #userdb vpopmail {", | 
| 1213 |  |  |  |  |  |  | replace => "  userdb vpopmail {\n  }", | 
| 1214 |  |  |  |  |  |  | }, | 
| 1215 |  |  |  |  |  |  | {   search  => "  user = root", | 
| 1216 |  |  |  |  |  |  | replace => "  user = vpopmail", | 
| 1217 |  |  |  |  |  |  | }, | 
| 1218 |  |  |  |  |  |  | {   search  => "  #quota = maildir", | 
| 1219 |  |  |  |  |  |  | replace => "  quota = maildir", | 
| 1220 |  |  |  |  |  |  | }, | 
| 1221 |  |  |  |  |  |  | ], | 
| 1222 |  |  |  |  |  |  | ); | 
| 1223 | 0 |  |  |  |  | 0 | return 1; | 
| 1224 |  |  |  |  |  |  | }; | 
| 1225 |  |  |  |  |  |  |  | 
| 1226 |  |  |  |  |  |  | sub dovecot_2_conf { | 
| 1227 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1228 |  |  |  |  |  |  |  | 
| 1229 | 0 |  |  |  |  | 0 | my $dconf = '/usr/local/etc/dovecot'; | 
| 1230 | 0 | 0 |  |  |  | 0 | return if ! -d $dconf; | 
| 1231 |  |  |  |  |  |  |  | 
| 1232 | 0 | 0 |  |  |  | 0 | if ( ! -f "$dconf/dovecot.conf" ) { | 
| 1233 | 0 |  |  |  |  | 0 | my $ex = '/usr/local/share/doc/dovecot/example-config'; | 
| 1234 |  |  |  |  |  |  |  | 
| 1235 | 0 |  |  |  |  | 0 | foreach ( qw/ dovecot.conf / ) { | 
| 1236 | 0 | 0 |  |  |  | 0 | if ( -f "$ex/$_" ) { | 
| 1237 | 0 |  |  |  |  | 0 | copy("$ex/$_", $dconf); | 
| 1238 |  |  |  |  |  |  | }; | 
| 1239 |  |  |  |  |  |  | }; | 
| 1240 | 0 |  |  |  |  | 0 | system "cp $ex/conf.d /usr/local/etc/dovecot"; | 
| 1241 |  |  |  |  |  |  | }; | 
| 1242 |  |  |  |  |  |  |  | 
| 1243 | 0 |  |  |  |  | 0 | my $updated = `grep 'Mail Toaster' $dconf/dovecot.conf`; | 
| 1244 | 0 | 0 |  |  |  | 0 | if ( $updated ) { | 
| 1245 | 0 |  |  |  |  | 0 | $self->audit( "Toaster modifications detected, skipping config" ); | 
| 1246 | 0 |  |  |  |  | 0 | return 1; | 
| 1247 |  |  |  |  |  |  | }; | 
| 1248 |  |  |  |  |  |  |  | 
| 1249 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1250 |  |  |  |  |  |  | file => "$dconf/dovecot.conf", | 
| 1251 |  |  |  |  |  |  | changes => [ | 
| 1252 |  |  |  |  |  |  | {   search  => "#login_greeting = Dovecot ready.", | 
| 1253 |  |  |  |  |  |  | replace => "#login_greeting = Dovecot ready. | 
| 1254 |  |  |  |  |  |  | login_greeting = Mail Toaster (Dovecot) ready.", | 
| 1255 |  |  |  |  |  |  | }, | 
| 1256 |  |  |  |  |  |  | {   search  => "#listen = *, ::", | 
| 1257 |  |  |  |  |  |  | replace => "#listen = *, ::\nlisten = *", | 
| 1258 |  |  |  |  |  |  | }, | 
| 1259 |  |  |  |  |  |  | ], | 
| 1260 |  |  |  |  |  |  | ); | 
| 1261 |  |  |  |  |  |  |  | 
| 1262 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1263 |  |  |  |  |  |  | file => "$dconf/conf.d/10-auth.conf", | 
| 1264 |  |  |  |  |  |  | changes => [ | 
| 1265 |  |  |  |  |  |  | {   search  => "#auth_username_format =", | 
| 1266 |  |  |  |  |  |  | replace => "#auth_username_format =\nauth_username_format = %Lu", | 
| 1267 |  |  |  |  |  |  | nowarn  => 1, | 
| 1268 |  |  |  |  |  |  | }, | 
| 1269 |  |  |  |  |  |  | {   search  => "auth_mechanisms = plain", | 
| 1270 |  |  |  |  |  |  | replace => "auth_mechanisms = plain login digest-md5 cram-md5", | 
| 1271 |  |  |  |  |  |  | }, | 
| 1272 |  |  |  |  |  |  | {   search  => "!include auth-system.conf.ext", | 
| 1273 |  |  |  |  |  |  | replace => "#!include auth-system.conf.ext", | 
| 1274 |  |  |  |  |  |  | nowarn  => 1, | 
| 1275 |  |  |  |  |  |  | }, | 
| 1276 |  |  |  |  |  |  | {   search  => "#!include auth-vpopmail.conf.ext", | 
| 1277 |  |  |  |  |  |  | replace => "!include auth-vpopmail.conf.ext", | 
| 1278 |  |  |  |  |  |  | nowarn  => 1, | 
| 1279 |  |  |  |  |  |  | }, | 
| 1280 |  |  |  |  |  |  | ], | 
| 1281 |  |  |  |  |  |  | ); | 
| 1282 |  |  |  |  |  |  |  | 
| 1283 | 0 |  |  |  |  | 0 | my $qmaildir = $self->qmail->get_qmail_dir; | 
| 1284 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1285 |  |  |  |  |  |  | file => "$dconf/conf.d/10-ssl.conf", | 
| 1286 |  |  |  |  |  |  | changes => [ | 
| 1287 |  |  |  |  |  |  | {   search  => "ssl_cert = </etc/ssl/certs/dovecot.pem", | 
| 1288 |  |  |  |  |  |  | replace => "#ssl_cert = </etc/ssl/certs/dovecot.pem | 
| 1289 |  |  |  |  |  |  | ssl_cert = <$qmaildir/control/servercert.pem", | 
| 1290 |  |  |  |  |  |  | }, | 
| 1291 |  |  |  |  |  |  | {   search  => "ssl_key = </etc/ssl/private/dovecot.pem", | 
| 1292 |  |  |  |  |  |  | replace => "#ssl_key = </etc/ssl/private/dovecot.pem | 
| 1293 |  |  |  |  |  |  | ssl_key = <$qmaildir/control/servercert.pem", | 
| 1294 |  |  |  |  |  |  | }, | 
| 1295 |  |  |  |  |  |  | ], | 
| 1296 |  |  |  |  |  |  | ); | 
| 1297 |  |  |  |  |  |  |  | 
| 1298 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1299 |  |  |  |  |  |  | file => "$dconf/conf.d/10-mail.conf", | 
| 1300 |  |  |  |  |  |  | changes => [ | 
| 1301 |  |  |  |  |  |  | { | 
| 1302 |  |  |  |  |  |  | search  => "#mail_location = ", | 
| 1303 |  |  |  |  |  |  | replace => "#mail_location = | 
| 1304 |  |  |  |  |  |  | mail_location = maildir:~/Maildir", | 
| 1305 |  |  |  |  |  |  | }, | 
| 1306 |  |  |  |  |  |  | {   search  => "#first_valid_uid = 500", | 
| 1307 |  |  |  |  |  |  | replace => "#first_valid_uid = 500\nfirst_valid_uid = 89", | 
| 1308 |  |  |  |  |  |  | }, | 
| 1309 |  |  |  |  |  |  | {   search  => "#last_valid_uid = 0", | 
| 1310 |  |  |  |  |  |  | replace => "#last_valid_uid = 0\nlast_valid_uid = 89", | 
| 1311 |  |  |  |  |  |  | }, | 
| 1312 |  |  |  |  |  |  | {   search  => "first_valid_gid = 1", | 
| 1313 |  |  |  |  |  |  | replace => "#first_valid_gid = 1\nfirst_valid_gid = 89", | 
| 1314 |  |  |  |  |  |  | }, | 
| 1315 |  |  |  |  |  |  | {   search  => "#last_valid_gid = 0", | 
| 1316 |  |  |  |  |  |  | replace => "#last_valid_gid = 0\nlast_valid_gid = 89", | 
| 1317 |  |  |  |  |  |  | }, | 
| 1318 |  |  |  |  |  |  | {   search  => "#mail_plugins =", | 
| 1319 |  |  |  |  |  |  | replace => "#mail_plugins =\nmail_plugins = quota", | 
| 1320 |  |  |  |  |  |  | }, | 
| 1321 |  |  |  |  |  |  | ], | 
| 1322 |  |  |  |  |  |  | ); | 
| 1323 |  |  |  |  |  |  |  | 
| 1324 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1325 |  |  |  |  |  |  | file => "$dconf/conf.d/20-pop3.conf", | 
| 1326 |  |  |  |  |  |  | changes => [ | 
| 1327 |  |  |  |  |  |  | {   search => "  #pop3_client_workarounds = ", | 
| 1328 |  |  |  |  |  |  | replace => "  #pop3_client_workarounds = \n  pop3_client_workarounds = outlook-no-nuls oe-ns-eo", | 
| 1329 |  |  |  |  |  |  | }, | 
| 1330 |  |  |  |  |  |  | ], | 
| 1331 |  |  |  |  |  |  | ); | 
| 1332 |  |  |  |  |  |  |  | 
| 1333 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1334 |  |  |  |  |  |  | file => "$dconf/conf.d/15-lda.conf", | 
| 1335 |  |  |  |  |  |  | changes => [ | 
| 1336 |  |  |  |  |  |  | {   search  => "#sendmail_path = /usr/sbin/sendmail", | 
| 1337 |  |  |  |  |  |  | replace => "#sendmail_path = /usr/sbin/sendmail\nsendmail_path = $qmaildir/bin/sendmail", | 
| 1338 |  |  |  |  |  |  | }, | 
| 1339 |  |  |  |  |  |  | ], | 
| 1340 |  |  |  |  |  |  | ); | 
| 1341 |  |  |  |  |  |  |  | 
| 1342 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1343 |  |  |  |  |  |  | file => "$dconf/conf.d/90-quota.conf", | 
| 1344 |  |  |  |  |  |  | changes => [ | 
| 1345 |  |  |  |  |  |  | {   search  => "  #quota = maildir:User quota", | 
| 1346 |  |  |  |  |  |  | replace => "  quota = maildir:User quota", | 
| 1347 |  |  |  |  |  |  | }, | 
| 1348 |  |  |  |  |  |  | ], | 
| 1349 |  |  |  |  |  |  | ); | 
| 1350 |  |  |  |  |  |  |  | 
| 1351 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 1352 |  |  |  |  |  |  | file => "$dconf/conf.d/20-imap.conf", | 
| 1353 |  |  |  |  |  |  | changes => [ | 
| 1354 |  |  |  |  |  |  | {   search  => "  #mail_plugins = ", | 
| 1355 |  |  |  |  |  |  | replace => "  #mail_plugins = \n  mail_plugins = \$mail_plugins imap_quota", | 
| 1356 |  |  |  |  |  |  | }, | 
| 1357 |  |  |  |  |  |  | ], | 
| 1358 |  |  |  |  |  |  | ); | 
| 1359 |  |  |  |  |  |  | }; | 
| 1360 |  |  |  |  |  |  |  | 
| 1361 |  |  |  |  |  |  | sub dovecot_install_freebsd { | 
| 1362 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1363 |  |  |  |  |  |  |  | 
| 1364 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed('dovecot'); | 
| 1365 |  |  |  |  |  |  |  | 
| 1366 | 0 |  |  |  |  | 0 | $self->audit( "starting port install of dovecot" ); | 
| 1367 |  |  |  |  |  |  |  | 
| 1368 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "dovecot", | 
| 1369 |  |  |  |  |  |  | options => "# This file is generated by Mail Toaster. | 
| 1370 |  |  |  |  |  |  | # Options for dovecot-1.2.17 | 
| 1371 |  |  |  |  |  |  | _OPTIONS_READ=dovecot-1.2.17 | 
| 1372 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=BDB GSSAPI KQUEUE LDAP MANAGESIEVE MYSQL PGSQL SQLITE SSL VPOPMAIL | 
| 1373 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=BDB | 
| 1374 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GSSAPI | 
| 1375 |  |  |  |  |  |  | OPTIONS_FILE_SET+=KQUEUE | 
| 1376 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LDAP | 
| 1377 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MANAGESIEVE | 
| 1378 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MYSQL | 
| 1379 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=PGSQL | 
| 1380 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SQLITE | 
| 1381 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SSL | 
| 1382 |  |  |  |  |  |  | OPTIONS_FILE_SET+=VPOPMAIL | 
| 1383 |  |  |  |  |  |  | ", | 
| 1384 |  |  |  |  |  |  | ) or return; | 
| 1385 |  |  |  |  |  |  |  | 
| 1386 | 0 | 0 |  |  |  | 0 | return if ! $self->freebsd->is_port_installed('dovecot'); | 
| 1387 |  |  |  |  |  |  |  | 
| 1388 | 0 |  |  |  |  | 0 | my $config = "/usr/local/etc/dovecot.conf"; | 
| 1389 | 0 | 0 |  |  |  | 0 | if ( ! -e $config ) { | 
| 1390 | 0 | 0 |  |  |  | 0 | if ( -e "/usr/local/etc/dovecot-example.conf" ) { | 
| 1391 | 0 |  |  |  |  | 0 | copy("/usr/local/etc/dovecot-example.conf", $config); | 
| 1392 |  |  |  |  |  |  | } | 
| 1393 |  |  |  |  |  |  | else { | 
| 1394 | 0 |  |  |  |  | 0 | $self->error("unable to find dovecot.conf sample", fatal => 0); | 
| 1395 | 0 |  |  |  |  | 0 | sleep 3; | 
| 1396 | 0 |  |  |  |  | 0 | return; | 
| 1397 |  |  |  |  |  |  | }; | 
| 1398 |  |  |  |  |  |  | }; | 
| 1399 |  |  |  |  |  |  |  | 
| 1400 | 0 |  |  |  |  | 0 | return 1; | 
| 1401 |  |  |  |  |  |  | } | 
| 1402 |  |  |  |  |  |  |  | 
| 1403 |  |  |  |  |  |  | sub dovecot_start { | 
| 1404 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1405 |  |  |  |  |  |  |  | 
| 1406 | 0 | 0 |  |  |  | 0 | unless ( $OSNAME eq "freebsd" ) { | 
| 1407 | 0 |  |  |  |  | 0 | $self->error( "sorry, no dovecot startup support on $OSNAME", fatal => 0); | 
| 1408 | 0 |  |  |  |  | 0 | return; | 
| 1409 |  |  |  |  |  |  | }; | 
| 1410 |  |  |  |  |  |  |  | 
| 1411 | 0 |  |  |  |  | 0 | $self->dovecot_1_conf(); | 
| 1412 | 0 |  |  |  |  | 0 | $self->dovecot_2_conf(); | 
| 1413 |  |  |  |  |  |  |  | 
| 1414 |  |  |  |  |  |  | # append dovecot_enable to /etc/rc.conf | 
| 1415 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 1416 |  |  |  |  |  |  | check => "dovecot_enable", | 
| 1417 |  |  |  |  |  |  | line  => 'dovecot_enable="YES"', | 
| 1418 |  |  |  |  |  |  | ); | 
| 1419 |  |  |  |  |  |  |  | 
| 1420 |  |  |  |  |  |  | # start dovecot | 
| 1421 | 0 | 0 |  |  |  | 0 | if ( -x "/usr/local/etc/rc.d/dovecot" ) { | 
| 1422 | 0 |  |  |  |  | 0 | $self->util->syscmd("/usr/local/etc/rc.d/dovecot restart", verbose=>0); | 
| 1423 |  |  |  |  |  |  | }; | 
| 1424 |  |  |  |  |  |  | } | 
| 1425 |  |  |  |  |  |  |  | 
| 1426 |  |  |  |  |  |  | sub enable_all_spam { | 
| 1427 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 1428 |  |  |  |  |  |  |  | 
| 1429 | 0 |  |  |  |  | 0 | my $qmail_dir = $self->qmail->get_qmail_dir; | 
| 1430 |  |  |  |  |  |  | my $spam_cmd  = $self->conf->{qmailadmin_spam_command} || | 
| 1431 | 0 |  | 0 |  |  | 0 | '| /usr/local/bin/maildrop /usr/local/etc/mail/mailfilter'; | 
| 1432 |  |  |  |  |  |  |  | 
| 1433 | 0 |  |  |  |  | 0 | my @domains = $self->qmail->get_domains_from_assign( | 
| 1434 |  |  |  |  |  |  | assign => "$qmail_dir/users/assign", | 
| 1435 |  |  |  |  |  |  | ); | 
| 1436 |  |  |  |  |  |  |  | 
| 1437 | 0 |  |  |  |  | 0 | my $number_of_domains = @domains; | 
| 1438 | 0 |  |  |  |  | 0 | $self->audit( "enable_all_spam: found $number_of_domains domains."); | 
| 1439 |  |  |  |  |  |  |  | 
| 1440 | 0 |  |  |  |  | 0 | for (my $i = 0; $i < $number_of_domains; $i++) { | 
| 1441 |  |  |  |  |  |  |  | 
| 1442 | 0 |  |  |  |  | 0 | my $domain = $domains[$i]{dom}; | 
| 1443 | 0 |  |  |  |  | 0 | $self->audit( "Enabling spam processing for $domain mailboxes"); | 
| 1444 |  |  |  |  |  |  |  | 
| 1445 | 0 |  |  |  |  | 0 | my @paths = `~vpopmail/bin/vuserinfo -d -D $domain`; | 
| 1446 |  |  |  |  |  |  |  | 
| 1447 |  |  |  |  |  |  | PATH: | 
| 1448 | 0 |  |  |  |  | 0 | foreach my $path (@paths) { | 
| 1449 | 0 |  |  |  |  | 0 | chomp($path); | 
| 1450 | 0 | 0 | 0 |  |  | 0 | if ( ! $path || ! -d $path) { | 
| 1451 | 0 |  |  |  |  | 0 | $self->audit( "  $path does not exist!"); | 
| 1452 | 0 |  |  |  |  | 0 | next PATH; | 
| 1453 |  |  |  |  |  |  | }; | 
| 1454 |  |  |  |  |  |  |  | 
| 1455 | 0 |  |  |  |  | 0 | my $qpath = "$path/.qmail"; | 
| 1456 | 0 | 0 |  |  |  | 0 | if (-f $qpath) { | 
| 1457 | 0 |  |  |  |  | 0 | $self->audit( "  .qmail already exists in $path."); | 
| 1458 | 0 |  |  |  |  | 0 | next PATH; | 
| 1459 |  |  |  |  |  |  | }; | 
| 1460 |  |  |  |  |  |  |  | 
| 1461 | 0 |  |  |  |  | 0 | $self->audit( "  .qmail created in $path."); | 
| 1462 | 0 |  |  |  |  | 0 | system "echo \"$spam_cmd \" >> $path/.qmail"; | 
| 1463 |  |  |  |  |  |  |  | 
| 1464 | 0 |  |  |  |  | 0 | my $uid = getpwnam("vpopmail"); | 
| 1465 | 0 |  |  |  |  | 0 | my $gid = getgrnam("vchkpw"); | 
| 1466 | 0 |  |  |  |  | 0 | chown( $uid, $gid, "$path/.qmail" ); | 
| 1467 | 0 |  |  |  |  | 0 | chmod oct('0644'), "$path/.qmail"; | 
| 1468 |  |  |  |  |  |  | } | 
| 1469 |  |  |  |  |  |  | } | 
| 1470 |  |  |  |  |  |  |  | 
| 1471 | 0 |  |  |  |  | 0 | return 1; | 
| 1472 |  |  |  |  |  |  | } | 
| 1473 |  |  |  |  |  |  |  | 
| 1474 |  |  |  |  |  |  | sub expat { | 
| 1475 | 3 |  |  | 3 | 0 | 8 | my $self  = shift; | 
| 1476 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1477 |  |  |  |  |  |  |  | 
| 1478 | 3 | 100 |  |  |  | 16 | return $p{test_ok} if defined $p{test_ok}; # for testing only | 
| 1479 |  |  |  |  |  |  |  | 
| 1480 | 1 | 50 |  |  |  | 2 | if ( !$self->conf->{install_expat} ) { | 
| 1481 | 1 |  |  |  |  | 2 | $self->audit( "expat: installing, skipping (disabled)" ); | 
| 1482 | 1 |  |  |  |  | 3 | return; | 
| 1483 |  |  |  |  |  |  | } | 
| 1484 |  |  |  |  |  |  |  | 
| 1485 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 1486 | 0 | 0 |  |  |  | 0 | if ( -d "/usr/ports/textproc/expat" ) { | 
| 1487 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( "expat" ); | 
| 1488 |  |  |  |  |  |  | } | 
| 1489 |  |  |  |  |  |  | else { | 
| 1490 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( "expat", dir => 'expat2'); | 
| 1491 |  |  |  |  |  |  | } | 
| 1492 |  |  |  |  |  |  | } | 
| 1493 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 1494 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "expat" ); | 
| 1495 |  |  |  |  |  |  | } | 
| 1496 |  |  |  |  |  |  | else { | 
| 1497 | 0 |  |  |  |  | 0 | print "Sorry, build support for expat on $OSNAME is incomplete.\n"; | 
| 1498 |  |  |  |  |  |  | } | 
| 1499 |  |  |  |  |  |  | } | 
| 1500 |  |  |  |  |  |  |  | 
| 1501 |  |  |  |  |  |  | sub expect { | 
| 1502 | 0 |  |  | 0 | 1 | 0 | my $self  = shift; | 
| 1503 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1504 |  |  |  |  |  |  |  | 
| 1505 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; | 
| 1506 |  |  |  |  |  |  |  | 
| 1507 | 0 | 0 |  |  |  | 0 | return if $OSNAME ne "freebsd"; | 
| 1508 |  |  |  |  |  |  |  | 
| 1509 |  |  |  |  |  |  | return $self->freebsd->install_port( 'expect', | 
| 1510 |  |  |  |  |  |  | flags => "WITHOUT_X11=yes", | 
| 1511 |  |  |  |  |  |  | fatal => $p{fatal}, | 
| 1512 | 0 |  |  |  |  | 0 | ); | 
| 1513 |  |  |  |  |  |  | } | 
| 1514 |  |  |  |  |  |  |  | 
| 1515 |  |  |  |  |  |  | sub ezmlm { | 
| 1516 | 3 |  |  | 3 | 1 | 8 | my $self  = shift; | 
| 1517 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1518 |  |  |  |  |  |  |  | 
| 1519 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 1520 |  |  |  |  |  |  |  | 
| 1521 | 1 |  |  |  |  | 4 | my $ver     = $self->conf->{install_ezmlm}; | 
| 1522 | 1 |  | 50 |  |  | 3 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 1523 |  |  |  |  |  |  |  | 
| 1524 | 1 | 50 |  |  |  | 3 | if ( !$ver ) { | 
| 1525 | 1 |  |  |  |  | 2 | $self->audit( "installing Ezmlm-Idx, (disabled)", verbose=>1 ); | 
| 1526 | 1 |  |  |  |  | 3 | return; | 
| 1527 |  |  |  |  |  |  | } | 
| 1528 |  |  |  |  |  |  |  | 
| 1529 | 0 |  |  |  |  | 0 | my $ezmlm = $self->util->find_bin( 'ezmlm-sub', | 
| 1530 |  |  |  |  |  |  | dir   => '/usr/local/bin/ezmlm', | 
| 1531 |  |  |  |  |  |  | fatal => 0, | 
| 1532 |  |  |  |  |  |  | ); | 
| 1533 |  |  |  |  |  |  |  | 
| 1534 | 0 | 0 | 0 |  |  | 0 | if ( $ezmlm && -x $ezmlm ) { | 
| 1535 | 0 |  |  |  |  | 0 | $self->audit( "installing Ezmlm-Idx, ok (installed)",verbose=>1 ); | 
| 1536 | 0 |  |  |  |  | 0 | return $self->ezmlm_cgi(); | 
| 1537 |  |  |  |  |  |  | } | 
| 1538 |  |  |  |  |  |  |  | 
| 1539 | 0 | 0 |  |  |  | 0 | $self->ezmlm_freebsd_port() and return 1; | 
| 1540 | 0 |  |  |  |  | 0 | $self->ezmlm_src(); | 
| 1541 |  |  |  |  |  |  | }; | 
| 1542 |  |  |  |  |  |  |  | 
| 1543 |  |  |  |  |  |  | sub ezmlm_src { | 
| 1544 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1545 | 0 |  |  |  |  | 0 | print "ezmlm: attemping to install ezmlm from sources.\n"; | 
| 1546 |  |  |  |  |  |  |  | 
| 1547 | 0 |  |  |  |  | 0 | my $ezmlm_dist = "ezmlm-0.53"; | 
| 1548 | 0 |  |  |  |  | 0 | my $ver     = $self->conf->{install_ezmlm}; | 
| 1549 | 0 |  |  |  |  | 0 | my $idx     = "ezmlm-idx-$ver"; | 
| 1550 | 0 |  |  |  |  | 0 | my $site    = "http://untroubled.org/ezmlm"; | 
| 1551 | 0 |  | 0 |  |  | 0 | my $src     = $self->conf->{toaster_src_dir} || "/usr/local/src/mail"; | 
| 1552 | 0 |  | 0 |  |  | 0 | my $httpdir = $self->conf->{toaster_http_base} || "/usr/local/www"; | 
| 1553 | 0 | 0 |  |  |  | 0 | my $cgi     = $self->toaster->get_toaster_cgibin() or die "unable to determine cgi-bin dir\n"; | 
| 1554 |  |  |  |  |  |  |  | 
| 1555 | 0 |  |  |  |  | 0 | $self->util->cwd_source_dir( "$src/mail" ); | 
| 1556 |  |  |  |  |  |  |  | 
| 1557 | 0 | 0 |  |  |  | 0 | if ( -d $ezmlm_dist ) { | 
| 1558 | 0 | 0 |  |  |  | 0 | unless ( | 
| 1559 |  |  |  |  |  |  | $self->util->source_warning( package => $ezmlm_dist, src => "$src/mail" ) ) | 
| 1560 |  |  |  |  |  |  | { | 
| 1561 | 0 |  |  |  |  | 0 | carp "\nezmlm: OK then, skipping install.\n"; | 
| 1562 | 0 |  |  |  |  | 0 | return; | 
| 1563 |  |  |  |  |  |  | } | 
| 1564 |  |  |  |  |  |  | else { | 
| 1565 | 0 |  |  |  |  | 0 | print "ezmlm: removing any previous build sources.\n"; | 
| 1566 | 0 |  |  |  |  | 0 | $self->util->syscmd( "rm -rf $ezmlm_dist" ); | 
| 1567 |  |  |  |  |  |  | } | 
| 1568 |  |  |  |  |  |  | } | 
| 1569 |  |  |  |  |  |  |  | 
| 1570 | 0 | 0 |  |  |  | 0 | $self->util->get_url( "$site/archive/$ezmlm_dist.tar.gz" ) | 
| 1571 |  |  |  |  |  |  | if ! -e "$ezmlm_dist.tar.gz"; | 
| 1572 |  |  |  |  |  |  |  | 
| 1573 | 0 | 0 |  |  |  | 0 | $self->util->get_url( "$site/archive/$ver/$idx.tar.gz" ) | 
| 1574 |  |  |  |  |  |  | if ! -e "$idx.tar.gz"; | 
| 1575 |  |  |  |  |  |  |  | 
| 1576 | 0 | 0 |  |  |  | 0 | $self->util->extract_archive( "$ezmlm_dist.tar.gz" ) | 
| 1577 |  |  |  |  |  |  | or croak "Couldn't expand $ezmlm_dist.tar.gz: $!\n"; | 
| 1578 |  |  |  |  |  |  |  | 
| 1579 | 0 | 0 |  |  |  | 0 | $self->util->extract_archive( "$idx.tar.gz" ) | 
| 1580 |  |  |  |  |  |  | or croak "Couldn't expand $idx.tar.gz: $!\n"; | 
| 1581 |  |  |  |  |  |  |  | 
| 1582 | 0 |  |  |  |  | 0 | $self->util->syscmd( "mv $idx/* $ezmlm_dist/", ); | 
| 1583 | 0 |  |  |  |  | 0 | $self->util->syscmd( "rm -rf $idx", ); | 
| 1584 |  |  |  |  |  |  |  | 
| 1585 | 0 |  |  |  |  | 0 | chdir($ezmlm_dist); | 
| 1586 |  |  |  |  |  |  |  | 
| 1587 | 0 |  |  |  |  | 0 | $self->util->syscmd( "patch < idx.patch", ); | 
| 1588 | 0 |  |  |  |  | 0 | $self->ezmlm_conf_fixups(); | 
| 1589 |  |  |  |  |  |  |  | 
| 1590 | 0 |  |  |  |  | 0 | $self->util->syscmd( "make" ); | 
| 1591 | 0 |  |  |  |  | 0 | $self->util->syscmd( "chmod 775 makelang" ); | 
| 1592 |  |  |  |  |  |  |  | 
| 1593 |  |  |  |  |  |  | #$self->util->syscmd( "make mysql" );  # haven't figured this out yet (compile problems) | 
| 1594 | 0 |  |  |  |  | 0 | $self->util->syscmd( "make man" ); | 
| 1595 | 0 |  |  |  |  | 0 | $self->util->syscmd( "make setup"); | 
| 1596 |  |  |  |  |  |  |  | 
| 1597 | 0 |  |  |  |  | 0 | $self->ezmlm_cgi(); | 
| 1598 | 0 |  |  |  |  | 0 | return 1; | 
| 1599 |  |  |  |  |  |  | } | 
| 1600 |  |  |  |  |  |  |  | 
| 1601 |  |  |  |  |  |  | sub ezmlm_conf_fixups { | 
| 1602 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1603 |  |  |  |  |  |  |  | 
| 1604 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "darwin" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 1605 | 0 |  |  |  |  | 0 | my $local_include = "/usr/local/mysql/include"; | 
| 1606 | 0 |  |  |  |  | 0 | my $local_lib     = "/usr/local/mysql/lib"; | 
| 1607 |  |  |  |  |  |  |  | 
| 1608 | 0 | 0 |  |  |  | 0 | if ( !-d $local_include ) { | 
| 1609 | 0 |  |  |  |  | 0 | $local_include = "/opt/local/include/mysql"; | 
| 1610 | 0 |  |  |  |  | 0 | $local_lib     = "/opt/local/lib/mysql"; | 
| 1611 |  |  |  |  |  |  | } | 
| 1612 |  |  |  |  |  |  |  | 
| 1613 | 0 |  |  |  |  | 0 | $self->util->file_write( "sub_mysql/conf-sqlcc", | 
| 1614 |  |  |  |  |  |  | lines => ["-I$local_include"], | 
| 1615 |  |  |  |  |  |  | ); | 
| 1616 |  |  |  |  |  |  |  | 
| 1617 | 0 |  |  |  |  | 0 | $self->util->file_write( "sub_mysql/conf-sqlld", | 
| 1618 |  |  |  |  |  |  | lines => ["-L$local_lib -lmysqlclient -lm"], | 
| 1619 |  |  |  |  |  |  | ); | 
| 1620 |  |  |  |  |  |  | } | 
| 1621 |  |  |  |  |  |  | elsif ( $OSNAME eq "freebsd" ) { | 
| 1622 | 0 |  |  |  |  | 0 | $self->util->file_write( "sub_mysql/conf-sqlcc", | 
| 1623 |  |  |  |  |  |  | lines => ["-I/usr/local/include/mysql"], | 
| 1624 |  |  |  |  |  |  | ); | 
| 1625 |  |  |  |  |  |  |  | 
| 1626 | 0 |  |  |  |  | 0 | $self->util->file_write( "sub_mysql/conf-sqlld", | 
| 1627 |  |  |  |  |  |  | lines => ["-L/usr/local/lib/mysql -lmysqlclient -lnsl -lm"], | 
| 1628 |  |  |  |  |  |  | ); | 
| 1629 |  |  |  |  |  |  | } | 
| 1630 |  |  |  |  |  |  |  | 
| 1631 | 0 |  |  |  |  | 0 | $self->util->file_write( "conf-bin", lines => ["/usr/local/bin"] ); | 
| 1632 | 0 |  |  |  |  | 0 | $self->util->file_write( "conf-man", lines => ["/usr/local/man"] ); | 
| 1633 | 0 |  |  |  |  | 0 | $self->util->file_write( "conf-etc", lines => ["/usr/local/etc"] ); | 
| 1634 |  |  |  |  |  |  | }; | 
| 1635 |  |  |  |  |  |  |  | 
| 1636 |  |  |  |  |  |  | sub ezmlm_cgi { | 
| 1637 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 1638 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 1639 |  |  |  |  |  |  |  | 
| 1640 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 1641 |  |  |  |  |  |  |  | 
| 1642 | 0 | 0 |  |  |  | 0 | return 1 if ! $self->conf->{install_ezmlm_cgi}; | 
| 1643 |  |  |  |  |  |  |  | 
| 1644 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 1645 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "p5-Archive-Tar", | 
| 1646 |  |  |  |  |  |  | options=>"# | 
| 1647 |  |  |  |  |  |  | # This file was generated by Mail::Toaster | 
| 1648 |  |  |  |  |  |  | # No user-servicable parts inside! | 
| 1649 |  |  |  |  |  |  | # Options for p5-Archive-Tar-1.30 | 
| 1650 |  |  |  |  |  |  | _OPTIONS_READ=p5-Archive-Tar-1.30 | 
| 1651 |  |  |  |  |  |  | WITHOUT_TEXT_DIFF=true", | 
| 1652 |  |  |  |  |  |  | ); | 
| 1653 |  |  |  |  |  |  | } | 
| 1654 |  |  |  |  |  |  |  | 
| 1655 | 0 |  |  |  |  | 0 | $self->util->install_module( "Email::Valid" ); | 
| 1656 | 0 |  |  |  |  | 0 | $self->util->install_module( "Mail::Ezmlm" ); | 
| 1657 |  |  |  |  |  |  |  | 
| 1658 | 0 |  |  |  |  | 0 | return 1; | 
| 1659 |  |  |  |  |  |  | } | 
| 1660 |  |  |  |  |  |  |  | 
| 1661 |  |  |  |  |  |  | sub ezmlm_freebsd_port { | 
| 1662 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1663 |  |  |  |  |  |  |  | 
| 1664 | 0 | 0 |  |  |  | 0 | return if $OSNAME ne "freebsd"; | 
| 1665 | 0 | 0 |  |  |  | 0 | return if $self->conf->{install_ezmlm} ne "port"; | 
| 1666 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed( "ezmlm", fatal=>0 ); | 
| 1667 |  |  |  |  |  |  |  | 
| 1668 | 0 |  |  |  |  | 0 | my $defs = ''; | 
| 1669 | 0 | 0 |  |  |  | 0 | my $myopt = $self->conf->{install_ezmlm_mysql} ? 'SET' : 'UNSET'; | 
| 1670 |  |  |  |  |  |  |  | 
| 1671 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "ezmlm-idx", | 
| 1672 |  |  |  |  |  |  | options => "# This file was generated by mail-toaster | 
| 1673 |  |  |  |  |  |  | # Options for ezmlm-idx-7.1.1_1 | 
| 1674 |  |  |  |  |  |  | _OPTIONS_READ=ezmlm-idx-7.1.1_1 | 
| 1675 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=DB DOCS MYSQL PGSQL SQLITE | 
| 1676 |  |  |  |  |  |  | OPTIONS_FILE_$myopt+=DB | 
| 1677 |  |  |  |  |  |  | OPTIONS_FILE_SET+=DOCS | 
| 1678 |  |  |  |  |  |  | OPTIONS_FILE_$myopt+=MYSQL | 
| 1679 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=PGSQL | 
| 1680 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SQLITE | 
| 1681 |  |  |  |  |  |  | ", | 
| 1682 |  |  |  |  |  |  | ) | 
| 1683 |  |  |  |  |  |  | or return $self->error( "ezmlm-idx install failed" ); | 
| 1684 |  |  |  |  |  |  |  | 
| 1685 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 1686 | 0 |  |  |  |  | 0 | chdir("$confdir/ezmlm"); | 
| 1687 | 0 | 0 |  |  |  | 0 | copy( "ezmlmglrc.sample", "ezmlmglrc" ) | 
| 1688 |  |  |  |  |  |  | or $self->util->error( "copy ezmlmglrc failed: $!"); | 
| 1689 |  |  |  |  |  |  |  | 
| 1690 | 0 | 0 |  |  |  | 0 | copy( "ezmlmrc.sample", "ezmlmrc" ) | 
| 1691 |  |  |  |  |  |  | or $self->util->error( "copy ezmlmrc failed: $!"); | 
| 1692 |  |  |  |  |  |  |  | 
| 1693 | 0 | 0 |  |  |  | 0 | copy( "ezmlmsubrc.sample", "ezmlmsubrc" ) | 
| 1694 |  |  |  |  |  |  | or $self->util->error( "copy ezmlmsubrc failed: $!"); | 
| 1695 |  |  |  |  |  |  |  | 
| 1696 | 0 |  |  |  |  | 0 | return $self->ezmlm_cgi(); | 
| 1697 |  |  |  |  |  |  | }; | 
| 1698 |  |  |  |  |  |  |  | 
| 1699 |  |  |  |  |  |  | sub filtering { | 
| 1700 | 2 |  |  | 2 | 1 | 3 | my $self  = shift; | 
| 1701 | 2 |  |  |  |  | 6 | my %p = validate( @_, { $self->get_std_opts },); | 
| 1702 |  |  |  |  |  |  |  | 
| 1703 | 2 | 50 |  |  |  | 17 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 1704 |  |  |  |  |  |  |  | 
| 1705 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 1706 |  |  |  |  |  |  |  | 
| 1707 | 0 |  |  |  |  | 0 | $self->maildrop->install; | 
| 1708 |  |  |  |  |  |  |  | 
| 1709 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "p5-Archive-Tar", | 
| 1710 |  |  |  |  |  |  | options=> "# This file was generated by mail-toaster | 
| 1711 |  |  |  |  |  |  | # No user-servicable parts inside! | 
| 1712 |  |  |  |  |  |  | # Options for p5-Archive-Tar-1.30 | 
| 1713 |  |  |  |  |  |  | _OPTIONS_READ=p5-Archive-Tar-1.30 | 
| 1714 |  |  |  |  |  |  | WITHOUT_TEXT_DIFF=true", | 
| 1715 |  |  |  |  |  |  | ); | 
| 1716 |  |  |  |  |  |  |  | 
| 1717 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "p5-Mail-Audit" ); | 
| 1718 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "unzip" ); | 
| 1719 |  |  |  |  |  |  |  | 
| 1720 | 0 |  |  |  |  | 0 | $self->razor(); | 
| 1721 |  |  |  |  |  |  |  | 
| 1722 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "pyzor" ) if $self->conf->{install_pyzor}; | 
| 1723 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "bogofilter" ) if $self->conf->{install_bogofilter}; | 
| 1724 |  |  |  |  |  |  | $self->freebsd->install_port( "dcc-dccd", | 
| 1725 |  |  |  |  |  |  | flags => "WITHOUT_SENDMAIL=yes", | 
| 1726 |  |  |  |  |  |  | options => "# This file generated by mail-toaster | 
| 1727 |  |  |  |  |  |  | # Options for dcc-dccd-1.3.116 | 
| 1728 |  |  |  |  |  |  | _OPTIONS_READ=dcc-dccd-1.3.116 | 
| 1729 |  |  |  |  |  |  | WITH_DCCIFD=true | 
| 1730 |  |  |  |  |  |  | WITHOUT_DCCM=true | 
| 1731 |  |  |  |  |  |  | WITH_DCCD=true | 
| 1732 |  |  |  |  |  |  | WITH_DCCGREY=true | 
| 1733 |  |  |  |  |  |  | WITH_IPV6=true | 
| 1734 |  |  |  |  |  |  | WITHOUT_ALT_HOME=true | 
| 1735 |  |  |  |  |  |  | WITHOUT_PORTS_SENDMAIL=true\n", | 
| 1736 | 0 | 0 |  |  |  | 0 | ) if $self->conf->{install_dcc}; | 
| 1737 |  |  |  |  |  |  |  | 
| 1738 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "procmail" ) if $self->conf->{install_procmail}; | 
| 1739 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "p5-Email-Valid" ); | 
| 1740 |  |  |  |  |  |  | } | 
| 1741 |  |  |  |  |  |  |  | 
| 1742 | 0 |  |  |  |  | 0 | $self->spamassassin; | 
| 1743 | 0 |  |  |  |  | 0 | $self->razor; | 
| 1744 | 0 |  |  |  |  | 0 | $self->clamav; | 
| 1745 | 0 |  |  |  |  | 0 | $self->simscan->install; | 
| 1746 |  |  |  |  |  |  | } | 
| 1747 |  |  |  |  |  |  |  | 
| 1748 |  |  |  |  |  |  | sub gmake_freebsd { | 
| 1749 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1750 |  |  |  |  |  |  |  | 
| 1751 |  |  |  |  |  |  | # iconv to suppress a prompt, and because gettext requires it | 
| 1752 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('libiconv')) { | 
| 1753 | 0 |  |  |  |  | 0 | $self->freebsd->install_package('libiconv'); | 
| 1754 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('libiconv')) { | 
| 1755 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'libiconv', | 
| 1756 |  |  |  |  |  |  | options => "#\n# This file was generated by mail-toaster | 
| 1757 |  |  |  |  |  |  | # Options for libiconv-1.13.1_1 | 
| 1758 |  |  |  |  |  |  | _OPTIONS_READ=libiconv-1.13.1_1 | 
| 1759 |  |  |  |  |  |  | WITH_EXTRA_ENCODINGS=true | 
| 1760 |  |  |  |  |  |  | WITHOUT_EXTRA_PATCHES=true\n", | 
| 1761 |  |  |  |  |  |  | ); | 
| 1762 |  |  |  |  |  |  | } | 
| 1763 |  |  |  |  |  |  | } | 
| 1764 |  |  |  |  |  |  |  | 
| 1765 |  |  |  |  |  |  | # required by gmake | 
| 1766 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('gettext')) { | 
| 1767 | 0 |  |  |  |  | 0 | $self->freebsd->install_package('gettext'); | 
| 1768 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('gettext')) { | 
| 1769 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "gettext", | 
| 1770 |  |  |  |  |  |  | options => "#\n# This file was generated by mail-toaster | 
| 1771 |  |  |  |  |  |  | # Options for gettext-0.14.5_2 | 
| 1772 |  |  |  |  |  |  | _OPTIONS_READ=gettext-0.14.5_2\n", | 
| 1773 |  |  |  |  |  |  | ); | 
| 1774 |  |  |  |  |  |  | } | 
| 1775 |  |  |  |  |  |  | } | 
| 1776 |  |  |  |  |  |  |  | 
| 1777 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('gmake')) { | 
| 1778 | 0 |  |  |  |  | 0 | $self->freebsd->install_package('gmake'); | 
| 1779 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed('gmake')) { | 
| 1780 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'gmake' ); | 
| 1781 |  |  |  |  |  |  | } | 
| 1782 |  |  |  |  |  |  | } | 
| 1783 |  |  |  |  |  |  | }; | 
| 1784 |  |  |  |  |  |  |  | 
| 1785 |  |  |  |  |  |  | sub gnupg_install { | 
| 1786 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1787 | 0 | 0 |  |  |  | 0 | return if ! $self->conf->{install_gnupg}; | 
| 1788 |  |  |  |  |  |  |  | 
| 1789 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{package_install_method} eq 'packages' ) { | 
| 1790 | 0 |  |  |  |  | 0 | $self->freebsd->install_package( "gnupg", verbose=>0, fatal => 0 ); | 
| 1791 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed('gnupg'); | 
| 1792 |  |  |  |  |  |  | }; | 
| 1793 |  |  |  |  |  |  |  | 
| 1794 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "gnupg", | 
| 1795 |  |  |  |  |  |  | verbose   => 0, | 
| 1796 |  |  |  |  |  |  | options => "# This file was generated by mail-toaster | 
| 1797 |  |  |  |  |  |  | # No user-servicable parts inside! | 
| 1798 |  |  |  |  |  |  | # Options for gnupg-1.4.5 | 
| 1799 |  |  |  |  |  |  | _OPTIONS_READ=gnupg-1.4.5 | 
| 1800 |  |  |  |  |  |  | WITHOUT_LDAP=true | 
| 1801 |  |  |  |  |  |  | WITHOUT_LIBICONV=true | 
| 1802 |  |  |  |  |  |  | WITHOUT_LIBUSB=true | 
| 1803 |  |  |  |  |  |  | WITHOUT_SUID_GPG=true | 
| 1804 |  |  |  |  |  |  | WITH_NLS=true", | 
| 1805 |  |  |  |  |  |  | ); | 
| 1806 |  |  |  |  |  |  | }; | 
| 1807 |  |  |  |  |  |  |  | 
| 1808 |  |  |  |  |  |  | sub group_add { | 
| 1809 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1810 | 0 |  |  |  |  | 0 | my ($group, $gid) = @_; | 
| 1811 | 0 | 0 |  |  |  | 0 | return if ! $group; | 
| 1812 | 0 | 0 |  |  |  | 0 | return if $self->group_exists($group); | 
| 1813 | 0 |  |  |  |  | 0 | my $cmd; | 
| 1814 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'linux' ) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 1815 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin('groupadd'); | 
| 1816 | 0 | 0 |  |  |  | 0 | $cmd .= " -g $gid" if $gid; | 
| 1817 | 0 |  |  |  |  | 0 | $cmd .= " $group"; | 
| 1818 |  |  |  |  |  |  | } | 
| 1819 |  |  |  |  |  |  | elsif ( $OSNAME eq 'freebsd' ) { | 
| 1820 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( 'pw' ); | 
| 1821 | 0 |  |  |  |  | 0 | $cmd .= " groupadd -n $group"; | 
| 1822 | 0 | 0 |  |  |  | 0 | $cmd .= " -g $gid" if $gid; | 
| 1823 |  |  |  |  |  |  | } | 
| 1824 |  |  |  |  |  |  | elsif ( $OSNAME eq 'darwin' ) { | 
| 1825 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( "dscl", fatal => 0 ); | 
| 1826 | 0 |  |  |  |  | 0 | my $path = "/groups/$group"; | 
| 1827 | 0 | 0 |  |  |  | 0 | if ($cmd) {    # use dscl 10.5+ | 
| 1828 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -create $path" ); | 
| 1829 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path gid $gid") if $gid; | 
| 1830 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path passwd '*'" ); | 
| 1831 |  |  |  |  |  |  | } | 
| 1832 |  |  |  |  |  |  | else { | 
| 1833 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( "niutil", fatal => 0 ); | 
| 1834 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -create . $path" ); | 
| 1835 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path gid $gid") if $gid; | 
| 1836 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path passwd '*'" ); | 
| 1837 |  |  |  |  |  |  | } | 
| 1838 | 0 |  |  |  |  | 0 | return 1; | 
| 1839 |  |  |  |  |  |  | } | 
| 1840 |  |  |  |  |  |  | else { | 
| 1841 | 0 |  |  |  |  | 0 | warn "unable to create users on OS $OSNAME\n"; | 
| 1842 | 0 |  |  |  |  | 0 | return; | 
| 1843 |  |  |  |  |  |  | }; | 
| 1844 | 0 |  |  |  |  | 0 | return $self->util->syscmd( $cmd ); | 
| 1845 |  |  |  |  |  |  | }; | 
| 1846 |  |  |  |  |  |  |  | 
| 1847 |  |  |  |  |  |  | sub group_exists { | 
| 1848 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1849 | 0 | 0 |  |  |  | 0 | my $group = lc(shift) or die "missing group"; | 
| 1850 | 0 |  |  |  |  | 0 | my $gid = getgrnam($group); | 
| 1851 | 0 | 0 | 0 |  |  | 0 | return ( $gid && $gid > 0 ) ? $gid : undef; | 
| 1852 |  |  |  |  |  |  | }; | 
| 1853 |  |  |  |  |  |  |  | 
| 1854 |  |  |  |  |  |  | sub has_module { | 
| 1855 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 1856 | 0 |  |  |  |  | 0 | my ($name, $ver) = @_; | 
| 1857 |  |  |  |  |  |  |  | 
| 1858 |  |  |  |  |  |  | ## no critic ( ProhibitStringyEval ) | 
| 1859 | 0 | 0 |  |  |  | 0 | eval "use $name" . ($ver ? " $ver;" : ";"); | 
| 1860 |  |  |  |  |  |  | ## use critic | 
| 1861 |  |  |  |  |  |  |  | 
| 1862 | 0 |  |  |  |  | 0 | !$EVAL_ERROR; | 
| 1863 |  |  |  |  |  |  | }; | 
| 1864 |  |  |  |  |  |  |  | 
| 1865 |  |  |  |  |  |  | sub is_newer { | 
| 1866 | 6 |  |  | 6 | 0 | 8 | my $self  = shift; | 
| 1867 | 6 |  |  |  |  | 15 | my %p = validate( @_, { 'min' => SCALAR, 'cur' => SCALAR, $self->get_std_opts } ); | 
| 1868 |  |  |  |  |  |  |  | 
| 1869 | 6 |  |  |  |  | 23 | my ( $min, $cur ) = ( $p{min}, $p{cur} ); | 
| 1870 |  |  |  |  |  |  |  | 
| 1871 | 6 |  |  |  |  | 12 | my @mins = split( q{\.}, $min ); | 
| 1872 | 6 |  |  |  |  | 9 | my @curs = split( q{\.}, $cur ); | 
| 1873 |  |  |  |  |  |  |  | 
| 1874 |  |  |  |  |  |  | #use Data::Dumper; | 
| 1875 |  |  |  |  |  |  | #print Dumper(@mins, @curs); | 
| 1876 |  |  |  |  |  |  |  | 
| 1877 | 6 | 100 |  |  |  | 15 | if ( $curs[0] > $mins[0] ) { return 1; }    # major version num | 
|  | 1 |  |  |  |  | 4 |  | 
| 1878 | 5 | 100 |  |  |  | 8 | if ( $curs[1] > $mins[1] ) { return 1; }    # minor version num | 
|  | 1 |  |  |  |  | 6 |  | 
| 1879 | 4 | 100 | 33 |  |  | 22 | if ( $curs[2] && $mins[2] && $curs[2] > $mins[2] ) { return 1; }    # revision level | 
|  | 1 |  | 66 |  |  | 6 |  | 
| 1880 | 3 | 0 | 33 |  |  | 7 | if ( $curs[3] && $mins[3] && $curs[3] > $mins[3] ) { return 1; }    # just in case | 
|  | 0 |  | 0 |  |  | 0 |  | 
| 1881 |  |  |  |  |  |  |  | 
| 1882 | 3 |  |  |  |  | 10 | return 0; | 
| 1883 |  |  |  |  |  |  | } | 
| 1884 |  |  |  |  |  |  |  | 
| 1885 |  |  |  |  |  |  | sub isoqlog { | 
| 1886 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 1887 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 1888 |  |  |  |  |  |  |  | 
| 1889 |  |  |  |  |  |  | my $ver = $self->conf->{install_isoqlog} | 
| 1890 | 0 | 0 |  |  |  | 0 | or return $self->audit( "install_isoqlog is disabled",verbose=>1 ); | 
| 1891 |  |  |  |  |  |  |  | 
| 1892 | 0 |  |  |  |  | 0 | my $return = 0; | 
| 1893 |  |  |  |  |  |  |  | 
| 1894 | 0 | 0 |  |  |  | 0 | if ( $ver eq "port" ) { | 
| 1895 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 1896 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "isoqlog" ); | 
| 1897 | 0 |  |  |  |  | 0 | $self->isoqlog_conf(); | 
| 1898 | 0 | 0 |  |  |  | 0 | return 1 if $self->freebsd->is_port_installed( "isoqlog", %p ); | 
| 1899 |  |  |  |  |  |  | } | 
| 1900 |  |  |  |  |  |  | else { | 
| 1901 | 0 |  |  |  |  | 0 | return $self->error( | 
| 1902 |  |  |  |  |  |  | "isoqlog: install_isoqlog = port is not valid for $OSNAME" ); | 
| 1903 |  |  |  |  |  |  | } | 
| 1904 |  |  |  |  |  |  | } | 
| 1905 |  |  |  |  |  |  | else { | 
| 1906 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "isoqlog", fatal => 0 ) ) { | 
| 1907 | 0 |  |  |  |  | 0 | $self->isoqlog_conf(); | 
| 1908 | 0 |  |  |  |  | 0 | $self->audit( "isoqlog: install, ok (exists)" ); | 
| 1909 | 0 |  |  |  |  | 0 | return 2; | 
| 1910 |  |  |  |  |  |  | } | 
| 1911 |  |  |  |  |  |  | } | 
| 1912 |  |  |  |  |  |  |  | 
| 1913 | 0 | 0 |  |  |  | 0 | return $return if $self->util->find_bin( "isoqlog", fatal => 0 ); | 
| 1914 |  |  |  |  |  |  |  | 
| 1915 | 0 |  |  |  |  | 0 | $self->audit( "isoqlog not found. Attempting source install ($ver) on $OSNAME!"); | 
| 1916 |  |  |  |  |  |  |  | 
| 1917 | 0 | 0 | 0 |  |  | 0 | $ver = 2.2 if ( $ver eq "port" || $ver == 1 ); | 
| 1918 |  |  |  |  |  |  |  | 
| 1919 | 0 |  |  |  |  | 0 | my $configure = "./configure "; | 
| 1920 |  |  |  |  |  |  |  | 
| 1921 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{toaster_prefix} ) { | 
| 1922 | 0 |  |  |  |  | 0 | $configure .= "--prefix=" . $self->conf->{toaster_prefix} . " "; | 
| 1923 | 0 |  |  |  |  | 0 | $configure .= "--exec-prefix=" . $self->conf->{toaster_prefix} . " "; | 
| 1924 |  |  |  |  |  |  | } | 
| 1925 |  |  |  |  |  |  |  | 
| 1926 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{system_config_dir} ) { | 
| 1927 | 0 |  |  |  |  | 0 | $configure .= "--sysconfdir=" . $self->conf->{system_config_dir} . " "; | 
| 1928 |  |  |  |  |  |  | } | 
| 1929 |  |  |  |  |  |  |  | 
| 1930 | 0 |  |  |  |  | 0 | $self->audit( "isoqlog: building with $configure" ); | 
| 1931 |  |  |  |  |  |  |  | 
| 1932 | 0 |  |  |  |  | 0 | $self->util->install_from_source( | 
| 1933 |  |  |  |  |  |  | package => "isoqlog-$ver", | 
| 1934 |  |  |  |  |  |  | site    => 'http://www.enderunix.org', | 
| 1935 |  |  |  |  |  |  | url     => '/isoqlog', | 
| 1936 |  |  |  |  |  |  | targets => [ $configure, 'make', 'make install', 'make clean' ], | 
| 1937 |  |  |  |  |  |  | bintest => 'isoqlog', | 
| 1938 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 1939 |  |  |  |  |  |  | %p | 
| 1940 |  |  |  |  |  |  | ); | 
| 1941 |  |  |  |  |  |  |  | 
| 1942 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{toaster_prefix} ne "/usr/local" ) { | 
| 1943 |  |  |  |  |  |  | symlink( "/usr/local/share/isoqlog", | 
| 1944 | 0 |  |  |  |  | 0 | $self->conf->{toaster_prefix} . "/share/isoqlog" ); | 
| 1945 |  |  |  |  |  |  | } | 
| 1946 |  |  |  |  |  |  |  | 
| 1947 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "isoqlog", fatal => 0 ) ) { | 
| 1948 | 0 |  |  |  |  | 0 | return $self->isoqlog_conf(); | 
| 1949 |  |  |  |  |  |  | }; | 
| 1950 |  |  |  |  |  |  |  | 
| 1951 | 0 |  |  |  |  | 0 | return; | 
| 1952 |  |  |  |  |  |  | } | 
| 1953 |  |  |  |  |  |  |  | 
| 1954 |  |  |  |  |  |  | sub isoqlog_conf { | 
| 1955 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 1956 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 1957 |  |  |  |  |  |  |  | 
| 1958 |  |  |  |  |  |  | # isoqlog doesn't honor --sysconfdir yet | 
| 1959 |  |  |  |  |  |  | #my $etc = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 1960 | 0 |  |  |  |  | 0 | my $etc  = "/usr/local/etc"; | 
| 1961 | 0 |  |  |  |  | 0 | my $file = "$etc/isoqlog.conf"; | 
| 1962 |  |  |  |  |  |  |  | 
| 1963 | 0 | 0 |  |  |  | 0 | if ( -e $file ) { | 
| 1964 | 0 |  |  |  |  | 0 | $self->audit( "isoqlog_conf: creating $file, ok (exists)" ); | 
| 1965 | 0 |  |  |  |  | 0 | return 2; | 
| 1966 |  |  |  |  |  |  | } | 
| 1967 |  |  |  |  |  |  |  | 
| 1968 | 0 |  |  |  |  | 0 | my @lines; | 
| 1969 |  |  |  |  |  |  |  | 
| 1970 | 0 |  | 0 |  |  | 0 | my $htdocs = $self->conf->{toaster_http_docs} || "/usr/local/www/data"; | 
| 1971 | 0 |  | 0 |  |  | 0 | my $hostn  = $self->conf->{toaster_hostname}  || hostname; | 
| 1972 | 0 |  | 0 |  |  | 0 | my $logdir = $self->conf->{qmail_log_base}    || "/var/log/mail"; | 
| 1973 | 0 |  |  |  |  | 0 | my $qmaild = $self->qmail->get_qmail_dir; | 
| 1974 | 0 |  | 0 |  |  | 0 | my $prefix = $self->conf->{toaster_prefix}    || "/usr/local"; | 
| 1975 |  |  |  |  |  |  |  | 
| 1976 | 0 |  |  |  |  | 0 | push @lines, <<EO_ISOQLOG; | 
| 1977 |  |  |  |  |  |  | #isoqlog Configuration file | 
| 1978 |  |  |  |  |  |  |  | 
| 1979 |  |  |  |  |  |  | logtype     = "qmail-multilog" | 
| 1980 |  |  |  |  |  |  | logstore    = "$logdir/send" | 
| 1981 |  |  |  |  |  |  | domainsfile = "$qmaild/control/rcpthosts" | 
| 1982 |  |  |  |  |  |  | outputdir   = "$htdocs/isoqlog" | 
| 1983 |  |  |  |  |  |  | htmldir     = "$prefix/share/isoqlog/htmltemp" | 
| 1984 |  |  |  |  |  |  | langfile    = "$prefix/share/isoqlog/lang/english" | 
| 1985 |  |  |  |  |  |  | hostname    = "$hostn" | 
| 1986 |  |  |  |  |  |  |  | 
| 1987 |  |  |  |  |  |  | maxsender   = 100 | 
| 1988 |  |  |  |  |  |  | maxreceiver = 100 | 
| 1989 |  |  |  |  |  |  | maxtotal    = 100 | 
| 1990 |  |  |  |  |  |  | maxbyte     = 100 | 
| 1991 |  |  |  |  |  |  | EO_ISOQLOG | 
| 1992 |  |  |  |  |  |  |  | 
| 1993 | 0 | 0 |  |  |  | 0 | $self->util->file_write( $file, lines => \@lines ) | 
| 1994 |  |  |  |  |  |  | or $self->error( "couldn't write $file: $!"); | 
| 1995 | 0 |  |  |  |  | 0 | $self->audit( "isoqlog_conf: created $file, ok" ); | 
| 1996 |  |  |  |  |  |  |  | 
| 1997 | 0 |  |  |  |  | 0 | $self->util->syscmd( "isoqlog", fatal => 0 ); | 
| 1998 |  |  |  |  |  |  |  | 
| 1999 |  |  |  |  |  |  | # if missing, create the isoqlog web directory | 
| 2000 | 0 | 0 |  |  |  | 0 | if ( ! -e "$htdocs/isoqlog" ) { | 
| 2001 | 0 |  |  |  |  | 0 | mkdir oct('0755'), "$htdocs/isoqlog"; | 
| 2002 |  |  |  |  |  |  | }; | 
| 2003 |  |  |  |  |  |  |  | 
| 2004 |  |  |  |  |  |  | # to fix the missing images problem, add a web server alias like: | 
| 2005 |  |  |  |  |  |  | # Alias /isoqlog/images/ "/usr/local/share/isoqlog/htmltemp/images/" | 
| 2006 |  |  |  |  |  |  | } | 
| 2007 |  |  |  |  |  |  |  | 
| 2008 |  |  |  |  |  |  | sub lighttpd { | 
| 2009 | 3 |  |  | 3 | 0 | 10 | my $self = shift; | 
| 2010 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 2011 | 3 | 100 |  |  |  | 16 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 2012 |  |  |  |  |  |  |  | 
| 2013 | 1 | 50 |  |  |  | 4 | if ( ! $self->conf->{install_lighttpd} ) { | 
| 2014 | 1 |  |  |  |  | 2 | $self->audit("skipping lighttpd install (disabled)"); | 
| 2015 | 1 |  |  |  |  | 3 | return; | 
| 2016 |  |  |  |  |  |  | }; | 
| 2017 |  |  |  |  |  |  |  | 
| 2018 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'freebsd' ) { | 
| 2019 | 0 |  |  |  |  | 0 | $self->lighttpd_freebsd(); | 
| 2020 |  |  |  |  |  |  | } | 
| 2021 |  |  |  |  |  |  | else { | 
| 2022 | 0 | 0 |  |  |  | 0 | $self->util->find_bin( 'lighttpd', fatal=>0) | 
| 2023 |  |  |  |  |  |  | or return $self->error("no support for install lighttpd on $OSNAME. Report this error to support\@tnpi.net"); | 
| 2024 |  |  |  |  |  |  | }; | 
| 2025 |  |  |  |  |  |  |  | 
| 2026 | 0 |  |  |  |  | 0 | $self->lighttpd_config(); | 
| 2027 | 0 |  |  |  |  | 0 | $self->lighttpd_vhost(); | 
| 2028 | 0 |  |  |  |  | 0 | $self->php(); | 
| 2029 | 0 |  |  |  |  | 0 | $self->lighttpd_start(); | 
| 2030 | 0 |  |  |  |  | 0 | return 1; | 
| 2031 |  |  |  |  |  |  | }; | 
| 2032 |  |  |  |  |  |  |  | 
| 2033 |  |  |  |  |  |  | sub lighttpd_freebsd { | 
| 2034 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2035 |  |  |  |  |  |  |  | 
| 2036 |  |  |  |  |  |  | # installing manually overrides the dialogs | 
| 2037 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'm4', | 
| 2038 |  |  |  |  |  |  | options => "# this file installed by mail-toaster | 
| 2039 |  |  |  |  |  |  | # Options for m4-1.4.16_1,1 | 
| 2040 |  |  |  |  |  |  | _OPTIONS_READ=m4-1.4.16_1,1 | 
| 2041 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=LIBSIGSEGV | 
| 2042 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LIBSIGSEGV | 
| 2043 |  |  |  |  |  |  | ", | 
| 2044 |  |  |  |  |  |  | ); | 
| 2045 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'help2man', | 
| 2046 |  |  |  |  |  |  | options => "# this file installed by mail-toaster | 
| 2047 |  |  |  |  |  |  | # Options for help2man-1.43.2 | 
| 2048 |  |  |  |  |  |  | _OPTIONS_READ=help2man-1.43.2 | 
| 2049 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=NLS | 
| 2050 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=NLS | 
| 2051 |  |  |  |  |  |  | ", | 
| 2052 |  |  |  |  |  |  | ); | 
| 2053 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'lighttpd', | 
| 2054 |  |  |  |  |  |  | options => "#\n# This file was generated by mail-toaster | 
| 2055 |  |  |  |  |  |  | # Options for lighttpd-1.4.32_1 | 
| 2056 |  |  |  |  |  |  | _OPTIONS_READ=lighttpd-1.4.32_1 | 
| 2057 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=BZIP2 FAM GDBM IPV6 LDAP LIBEV LUA MEMCACHE MYSQL MYSQLAUTH NODELAY OPENSSL REMOTEUSER SPAWNFCGI VALGRIND WEBDAV | 
| 2058 |  |  |  |  |  |  | OPTIONS_FILE_SET+=BZIP2 | 
| 2059 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=FAM | 
| 2060 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GDBM | 
| 2061 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=IPV6 | 
| 2062 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LDAP | 
| 2063 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LIBEV | 
| 2064 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LUA | 
| 2065 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MEMCACHE | 
| 2066 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MYSQL | 
| 2067 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MYSQLAUTH | 
| 2068 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=NODELAY | 
| 2069 |  |  |  |  |  |  | OPTIONS_FILE_SET+=OPENSSL | 
| 2070 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=REMOTEUSER | 
| 2071 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SPAWNFCGI | 
| 2072 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=VALGRIND | 
| 2073 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=WEBDAV | 
| 2074 |  |  |  |  |  |  | ", | 
| 2075 |  |  |  |  |  |  | ); | 
| 2076 |  |  |  |  |  |  |  | 
| 2077 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 2078 |  |  |  |  |  |  | check => "lighttpd_enable", | 
| 2079 |  |  |  |  |  |  | line  => 'lighttpd_enable="YES"', | 
| 2080 |  |  |  |  |  |  | ); | 
| 2081 |  |  |  |  |  |  |  | 
| 2082 | 0 |  |  |  |  | 0 | my @logs = qw/ lighttpd.error.log lighttpd.access.log /; | 
| 2083 | 0 |  |  |  |  | 0 | foreach ( @logs ) { | 
| 2084 | 0 | 0 |  |  |  | 0 | $self->util->file_write( "/var/log/$_", lines => [' '] ) | 
| 2085 |  |  |  |  |  |  | if ! -e "/var/log/$_"; | 
| 2086 | 0 |  |  |  |  | 0 | $self->util->chown("/var/log/$_", uid => 'www', gid => 'www'); | 
| 2087 |  |  |  |  |  |  | }; | 
| 2088 |  |  |  |  |  |  | }; | 
| 2089 |  |  |  |  |  |  |  | 
| 2090 |  |  |  |  |  |  | sub lighttpd_config { | 
| 2091 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2092 |  |  |  |  |  |  |  | 
| 2093 | 0 |  |  |  |  | 0 | my $letc = '/usr/local/etc'; | 
| 2094 | 0 | 0 |  |  |  | 0 | $letc = "$letc/lighttpd" if -d "$letc/lighttpd"; | 
| 2095 |  |  |  |  |  |  |  | 
| 2096 | 0 |  |  |  |  | 0 | my $lconf = "$letc/lighttpd.conf"; | 
| 2097 |  |  |  |  |  |  |  | 
| 2098 | 0 | 0 |  |  |  | 0 | `grep toaster $letc/lighttpd.conf` | 
| 2099 |  |  |  |  |  |  | and return $self->audit("lighttpd configuration already done"); | 
| 2100 |  |  |  |  |  |  |  | 
| 2101 | 0 |  | 0 |  |  | 0 | my $cgi_bin = $self->conf->{toaster_cgi_bin} || '/usr/local/www/cgi-bin.toaster/'; | 
| 2102 | 0 |  | 0 |  |  | 0 | my $htdocs = $self->conf->{toaster_http_docs} || '/usr/local/www/toaster'; | 
| 2103 |  |  |  |  |  |  |  | 
| 2104 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 2105 |  |  |  |  |  |  | file    => "$letc/lighttpd.conf", | 
| 2106 |  |  |  |  |  |  | changes => [ | 
| 2107 |  |  |  |  |  |  | {   search  => q{#                               "mod_redirect",}, | 
| 2108 |  |  |  |  |  |  | replace => q{                                "mod_redirect",}, | 
| 2109 |  |  |  |  |  |  | }, | 
| 2110 |  |  |  |  |  |  | {   search  => q{#                               "mod_alias",}, | 
| 2111 |  |  |  |  |  |  | replace => q{                                "mod_alias",}, | 
| 2112 |  |  |  |  |  |  | }, | 
| 2113 |  |  |  |  |  |  | {   search  => q{#                               "mod_auth",}, | 
| 2114 |  |  |  |  |  |  | replace => q{                                "mod_auth",}, | 
| 2115 |  |  |  |  |  |  | }, | 
| 2116 |  |  |  |  |  |  | {   search  => q{#                               "mod_setenv",}, | 
| 2117 |  |  |  |  |  |  | replace => q{                                "mod_setenv",}, | 
| 2118 |  |  |  |  |  |  | }, | 
| 2119 |  |  |  |  |  |  | {   search  => q{#                               "mod_fastcgi",}, | 
| 2120 |  |  |  |  |  |  | replace => q{                                "mod_fastcgi",}, | 
| 2121 |  |  |  |  |  |  | }, | 
| 2122 |  |  |  |  |  |  | {   search  => q{#                               "mod_cgi",}, | 
| 2123 |  |  |  |  |  |  | replace => q{                                "mod_cgi",}, | 
| 2124 |  |  |  |  |  |  | }, | 
| 2125 |  |  |  |  |  |  | {   search  => q{#                               "mod_compress",}, | 
| 2126 |  |  |  |  |  |  | replace => q{                                "mod_compress",}, | 
| 2127 |  |  |  |  |  |  | }, | 
| 2128 |  |  |  |  |  |  | {   search  => q{server.document-root        = "/usr/local/www/data/"}, | 
| 2129 |  |  |  |  |  |  | replace => qq{server.document-root        = "$htdocs/"}, | 
| 2130 |  |  |  |  |  |  | }, | 
| 2131 |  |  |  |  |  |  | {   search  => q{server.document-root = "/usr/local/www/data/"}, | 
| 2132 |  |  |  |  |  |  | replace => qq{server.document-root = "$htdocs/"}, | 
| 2133 |  |  |  |  |  |  | }, | 
| 2134 |  |  |  |  |  |  | {   search  => q{var.server_root = "/usr/local/www/data"}, | 
| 2135 |  |  |  |  |  |  | replace => qq{var.server_root = "$htdocs"}, | 
| 2136 |  |  |  |  |  |  | }, | 
| 2137 |  |  |  |  |  |  | {   search  => q{#include_shell "cat /usr/local/etc/lighttpd/vhosts.d/*.conf"}, | 
| 2138 |  |  |  |  |  |  | replace => q{include_shell "cat /usr/local/etc/lighttpd/vhosts.d/*.conf"}, | 
| 2139 |  |  |  |  |  |  | }, | 
| 2140 |  |  |  |  |  |  | {   search  => q'$SERVER["socket"] == "0.0.0.0:80" { }', | 
| 2141 |  |  |  |  |  |  | replace => q'#$SERVER["socket"] == "0.0.0.0:80" { }', | 
| 2142 |  |  |  |  |  |  | }, | 
| 2143 |  |  |  |  |  |  | ], | 
| 2144 |  |  |  |  |  |  | ); | 
| 2145 |  |  |  |  |  |  |  | 
| 2146 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 2147 |  |  |  |  |  |  | file    => "$letc/modules.conf", | 
| 2148 |  |  |  |  |  |  | changes => [ | 
| 2149 |  |  |  |  |  |  | {   search  => q{#  "mod_alias",}, | 
| 2150 |  |  |  |  |  |  | replace => q{  "mod_alias",}, | 
| 2151 |  |  |  |  |  |  | }, | 
| 2152 |  |  |  |  |  |  | {   search  => q{#  "mod_auth",}, | 
| 2153 |  |  |  |  |  |  | replace => q{  "mod_auth",}, | 
| 2154 |  |  |  |  |  |  | }, | 
| 2155 |  |  |  |  |  |  | {   search  => q{#  "mod_redirect",}, | 
| 2156 |  |  |  |  |  |  | replace => q{  "mod_redirect",}, | 
| 2157 |  |  |  |  |  |  | }, | 
| 2158 |  |  |  |  |  |  | {   search  => q{#  "mod_setenv",}, | 
| 2159 |  |  |  |  |  |  | replace => q{  "mod_setenv",}, | 
| 2160 |  |  |  |  |  |  | }, | 
| 2161 |  |  |  |  |  |  | {   search  => q{#include "conf.d/cgi.conf"}, | 
| 2162 |  |  |  |  |  |  | replace => q{include "conf.d/cgi.conf"}, | 
| 2163 |  |  |  |  |  |  | }, | 
| 2164 |  |  |  |  |  |  | {   search  => q{#include "conf.d/fastcgi.conf"}, | 
| 2165 |  |  |  |  |  |  | replace => q{include "conf.d/fastcgi.conf"}, | 
| 2166 |  |  |  |  |  |  | }, | 
| 2167 |  |  |  |  |  |  | ], | 
| 2168 |  |  |  |  |  |  | ); | 
| 2169 |  |  |  |  |  |  |  | 
| 2170 | 0 |  |  |  |  | 0 | return 1; | 
| 2171 |  |  |  |  |  |  | }; | 
| 2172 |  |  |  |  |  |  |  | 
| 2173 |  |  |  |  |  |  | sub lighttpd_start { | 
| 2174 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2175 |  |  |  |  |  |  |  | 
| 2176 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'freebsd' ) { | 
|  |  | 0 |  |  |  |  |  | 
| 2177 | 0 |  |  |  |  | 0 | system "/usr/local/etc/rc.d/lighttpd restart"; | 
| 2178 | 0 |  |  |  |  | 0 | return 1; | 
| 2179 |  |  |  |  |  |  | } | 
| 2180 |  |  |  |  |  |  | elsif ( $OSNAME eq 'linux' ) { | 
| 2181 | 0 |  |  |  |  | 0 | system "service lighttpd start"; | 
| 2182 | 0 |  |  |  |  | 0 | return 1; | 
| 2183 |  |  |  |  |  |  | }; | 
| 2184 | 0 |  |  |  |  | 0 | print "not sure how to start lighttpd on $OSNAME\n"; | 
| 2185 | 0 |  |  |  |  | 0 | return; | 
| 2186 |  |  |  |  |  |  | }; | 
| 2187 |  |  |  |  |  |  |  | 
| 2188 |  |  |  |  |  |  | sub lighttpd_vhost { | 
| 2189 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2190 |  |  |  |  |  |  |  | 
| 2191 | 0 |  |  |  |  | 0 | my $letc = '/usr/local/etc'; | 
| 2192 | 0 | 0 |  |  |  | 0 | $letc = "$letc/lighttpd" if -d "$letc/lighttpd"; | 
| 2193 |  |  |  |  |  |  |  | 
| 2194 | 0 |  |  |  |  | 0 | my $www   = '/usr/local/www'; | 
| 2195 | 0 |  | 0 |  |  | 0 | my $cgi_bin = $self->conf->{toaster_cgi_bin} || "$www/cgi-bin.toaster/"; | 
| 2196 | 0 |  | 0 |  |  | 0 | my $htdocs = $self->conf->{toaster_http_docs} || "$www/toaster"; | 
| 2197 |  |  |  |  |  |  |  | 
| 2198 | 0 |  |  |  |  | 0 | my $vhost = ' | 
| 2199 |  |  |  |  |  |  | alias.url = ( | 
| 2200 |  |  |  |  |  |  | "/sqwebmail/"     => "' . $htdocs . '/sqwebmail/", | 
| 2201 |  |  |  |  |  |  | "/qmailadmin/"         => "/usr/local/www/data.default/qmailadmin/", | 
| 2202 |  |  |  |  |  |  | "/cgi-bin/qmailadmin/" => "/usr/local/www/cgi-bin.default/qmailadmin/" | 
| 2203 |  |  |  |  |  |  | "/cgi-bin/"       => "' . $cgi_bin . '/", | 
| 2204 |  |  |  |  |  |  | "/squirrelmail/"  => "' . $www . '/squirrelmail/", | 
| 2205 |  |  |  |  |  |  | "/roundcube/"     => "' . $www . '/roundcube/", | 
| 2206 |  |  |  |  |  |  | "/v-webmail/"     => "' . $www . '/v-webmail/htdocs/", | 
| 2207 |  |  |  |  |  |  | "/horde/"         => "' . $www . '/horde/", | 
| 2208 |  |  |  |  |  |  | "/awstatsclasses" => "' . $www . '/awstats/classes/", | 
| 2209 |  |  |  |  |  |  | "/awstatscss"     => "' . $www . '/awstats/css/", | 
| 2210 |  |  |  |  |  |  | "/awstatsicons"   => "' . $www . '/awstats/icons/", | 
| 2211 |  |  |  |  |  |  | "/awstats/"       => "' . $www . '/awstats/cgi-bin/", | 
| 2212 |  |  |  |  |  |  | "/munin/"         => "' . $www . '/munin/", | 
| 2213 |  |  |  |  |  |  | "/rrdutil/"       => "/usr/local/rrdutil/html/", | 
| 2214 |  |  |  |  |  |  | "/isoqlog/images/"=> "/usr/local/share/isoqlog/htmltemp/images/", | 
| 2215 |  |  |  |  |  |  | "/phpMyAdmin/"    => "' . $www . '/phpMyAdmin/", | 
| 2216 |  |  |  |  |  |  | ) | 
| 2217 |  |  |  |  |  |  |  | 
| 2218 |  |  |  |  |  |  | $HTTP["url"] =~ "^/awstats/" { | 
| 2219 |  |  |  |  |  |  | cgi.assign = ( "" => "/usr/bin/perl" ) | 
| 2220 |  |  |  |  |  |  | } | 
| 2221 |  |  |  |  |  |  | $HTTP["url"] =~ "^/cgi-bin" { | 
| 2222 |  |  |  |  |  |  | cgi.assign = ( "" => "" ) | 
| 2223 |  |  |  |  |  |  | } | 
| 2224 |  |  |  |  |  |  | $HTTP["url"] =~ "^/ezmlm.cgi" { | 
| 2225 |  |  |  |  |  |  | cgi.assign = ( "" => "/usr/bin/perl" ) | 
| 2226 |  |  |  |  |  |  | } | 
| 2227 |  |  |  |  |  |  |  | 
| 2228 |  |  |  |  |  |  | # redirect users to a secure connection | 
| 2229 |  |  |  |  |  |  | $SERVER["socket"] == ":80" { | 
| 2230 |  |  |  |  |  |  | $HTTP["host"] =~ "(.*)" { | 
| 2231 |  |  |  |  |  |  | url.redirect = ( "^/(.*)" => "https://%1/$1" ) | 
| 2232 |  |  |  |  |  |  | } | 
| 2233 |  |  |  |  |  |  | } | 
| 2234 |  |  |  |  |  |  |  | 
| 2235 |  |  |  |  |  |  | $SERVER["socket"] == ":443" { | 
| 2236 |  |  |  |  |  |  | ssl.engine   = "enable" | 
| 2237 |  |  |  |  |  |  | ssl.pemfile = "/usr/local/openssl/certs/server.pem" | 
| 2238 |  |  |  |  |  |  | # sqwebmail needs this | 
| 2239 |  |  |  |  |  |  | setenv.add-environment = ( "HTTPS" => "on" ) | 
| 2240 |  |  |  |  |  |  | } | 
| 2241 |  |  |  |  |  |  |  | 
| 2242 |  |  |  |  |  |  | fastcgi.server = ( | 
| 2243 |  |  |  |  |  |  | ".php" => | 
| 2244 |  |  |  |  |  |  | ( "localhost" => | 
| 2245 |  |  |  |  |  |  | ( | 
| 2246 |  |  |  |  |  |  | "socket"       => "/tmp/php-fastcgi.socket", | 
| 2247 |  |  |  |  |  |  | "bin-path"     => "/usr/local/bin/php-cgi", | 
| 2248 |  |  |  |  |  |  | "idle-timeout" => 1200, | 
| 2249 |  |  |  |  |  |  | "min-procs"    => 1, | 
| 2250 |  |  |  |  |  |  | "max-procs"    => 3, | 
| 2251 |  |  |  |  |  |  | "bin-environment" => ( | 
| 2252 |  |  |  |  |  |  | "PHP_FCGI_CHILDREN"     => "2", | 
| 2253 |  |  |  |  |  |  | "PHP_FCGI_MAX_REQUESTS" => "100" | 
| 2254 |  |  |  |  |  |  | ), | 
| 2255 |  |  |  |  |  |  | ) | 
| 2256 |  |  |  |  |  |  | ) | 
| 2257 |  |  |  |  |  |  | ) | 
| 2258 |  |  |  |  |  |  |  | 
| 2259 |  |  |  |  |  |  | auth.backend               = "htdigest" | 
| 2260 |  |  |  |  |  |  | auth.backend.htdigest.userfile = "/usr/local/etc/WebUsers" | 
| 2261 |  |  |  |  |  |  |  | 
| 2262 |  |  |  |  |  |  | auth.require   = (   "/isoqlog" => | 
| 2263 |  |  |  |  |  |  | ( | 
| 2264 |  |  |  |  |  |  | "method"  => "digest", | 
| 2265 |  |  |  |  |  |  | "realm"   => "Admins Only", | 
| 2266 |  |  |  |  |  |  | "require" => "valid-user" | 
| 2267 |  |  |  |  |  |  | ), | 
| 2268 |  |  |  |  |  |  | "/cgi-bin/vqadmin" => | 
| 2269 |  |  |  |  |  |  | ( | 
| 2270 |  |  |  |  |  |  | "method"  => "digest", | 
| 2271 |  |  |  |  |  |  | "realm"   => "Admins Only", | 
| 2272 |  |  |  |  |  |  | "require" => "valid-user" | 
| 2273 |  |  |  |  |  |  | ), | 
| 2274 |  |  |  |  |  |  | "/ezmlm.cgi" => | 
| 2275 |  |  |  |  |  |  | ( | 
| 2276 |  |  |  |  |  |  | "method"  => "digest", | 
| 2277 |  |  |  |  |  |  | "realm"   => "Admins Only", | 
| 2278 |  |  |  |  |  |  | "require" => "valid-user" | 
| 2279 |  |  |  |  |  |  | ) | 
| 2280 |  |  |  |  |  |  | #                     "/munin" => | 
| 2281 |  |  |  |  |  |  | #                     ( | 
| 2282 |  |  |  |  |  |  | #                         "method"  => "digest", | 
| 2283 |  |  |  |  |  |  | #                         "realm"   => "Admins Only", | 
| 2284 |  |  |  |  |  |  | #                         "require" => "valid-user" | 
| 2285 |  |  |  |  |  |  | #                      ) | 
| 2286 |  |  |  |  |  |  | ) | 
| 2287 |  |  |  |  |  |  | '; | 
| 2288 |  |  |  |  |  |  |  | 
| 2289 | 0 |  |  |  |  | 0 | $self->util->file_write("$letc/vhosts.d/mail-toaster.conf", lines => [ $vhost ],); | 
| 2290 | 0 |  |  |  |  | 0 | return 1; | 
| 2291 |  |  |  |  |  |  | }; | 
| 2292 |  |  |  |  |  |  |  | 
| 2293 |  |  |  |  |  |  | sub logmonster { | 
| 2294 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2295 | 0 |  |  |  |  | 0 | my $verbose = $self->verbose; | 
| 2296 |  |  |  |  |  |  |  | 
| 2297 | 0 |  |  |  |  | 0 | my %p = validate( @_, { | 
| 2298 |  |  |  |  |  |  | fatal   => { type => BOOLEAN, optional => 1, default => 1 }, | 
| 2299 |  |  |  |  |  |  | verbose => { type => BOOLEAN, optional => 1, default => $verbose }, | 
| 2300 |  |  |  |  |  |  | test_ok => { type => BOOLEAN, optional => 1, }, | 
| 2301 |  |  |  |  |  |  | }, | 
| 2302 |  |  |  |  |  |  | ); | 
| 2303 |  |  |  |  |  |  |  | 
| 2304 | 0 |  |  |  |  | 0 | my $fatal = $p{fatal}; | 
| 2305 | 0 |  |  |  |  | 0 | $verbose = $p{verbose}; | 
| 2306 |  |  |  |  |  |  |  | 
| 2307 | 0 |  |  |  |  | 0 | my $perlbin = $self->util->find_bin( "perl", verbose => $verbose ); | 
| 2308 |  |  |  |  |  |  |  | 
| 2309 | 0 |  |  |  |  | 0 | my @targets = ( "$perlbin Makefile.PL", "make", "make install" ); | 
| 2310 | 0 | 0 |  |  |  | 0 | push @targets, "make test" if $verbose; | 
| 2311 |  |  |  |  |  |  |  | 
| 2312 | 0 |  |  |  |  | 0 | $self->util->install_module_from_src( 'Apache-Logmonster', | 
| 2313 |  |  |  |  |  |  | site    => 'http://www.tnpi.net', | 
| 2314 |  |  |  |  |  |  | archive => 'Apache-Logmonster', | 
| 2315 |  |  |  |  |  |  | url     => '/internet/www/logmonster', | 
| 2316 |  |  |  |  |  |  | targets => \@targets, | 
| 2317 |  |  |  |  |  |  | verbose => $verbose, | 
| 2318 |  |  |  |  |  |  | ); | 
| 2319 |  |  |  |  |  |  | } | 
| 2320 |  |  |  |  |  |  |  | 
| 2321 |  |  |  |  |  |  | sub maildrop { | 
| 2322 | 0 |  |  | 0 | 0 | 0 | require Mail::Toaster::Setup::Maildrop; | 
| 2323 | 0 |  |  |  |  | 0 | return Mail::Toaster::Setup::Maildrop->new; | 
| 2324 |  |  |  |  |  |  | }; | 
| 2325 |  |  |  |  |  |  |  | 
| 2326 |  |  |  |  |  |  | sub maillogs { | 
| 2327 | 0 |  |  | 0 | 1 | 0 | my $self  = shift; | 
| 2328 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 2329 | 0 |  |  |  |  | 0 | my %args = $self->get_std_args( %p ); | 
| 2330 |  |  |  |  |  |  |  | 
| 2331 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 2332 |  |  |  |  |  |  |  | 
| 2333 | 0 |  | 0 |  |  | 0 | my $user  = $self->conf->{qmail_log_user}  || "qmaill"; | 
| 2334 | 0 |  | 0 |  |  | 0 | my $group = $self->conf->{qmail_log_group} || "qnofiles"; | 
| 2335 | 0 |  | 0 |  |  | 0 | my $logdir = $self->conf->{qmail_log_base} || "/var/log/mail"; | 
| 2336 |  |  |  |  |  |  |  | 
| 2337 | 0 |  |  |  |  | 0 | my $uid = getpwnam($user); | 
| 2338 | 0 |  |  |  |  | 0 | my $gid = getgrnam($group); | 
| 2339 |  |  |  |  |  |  |  | 
| 2340 | 0 | 0 | 0 |  |  | 0 | return $self->error( "The user $user or group $group does not exist." ) | 
| 2341 |  |  |  |  |  |  | unless ( defined $uid && defined $gid ); | 
| 2342 |  |  |  |  |  |  |  | 
| 2343 | 0 |  |  |  |  | 0 | $self->toaster->supervise_dirs_create( verbose=>1 ); | 
| 2344 |  |  |  |  |  |  |  | 
| 2345 | 0 |  |  |  |  | 0 | $self->maillogs_create_dirs(); | 
| 2346 |  |  |  |  |  |  |  | 
| 2347 | 0 |  |  |  |  | 0 | $self->cronolog(); | 
| 2348 | 0 |  |  |  |  | 0 | $self->isoqlog(); | 
| 2349 |  |  |  |  |  |  |  | 
| 2350 | 0 |  |  |  |  | 0 | $self->logs->verify_settings(); | 
| 2351 |  |  |  |  |  |  | } | 
| 2352 |  |  |  |  |  |  |  | 
| 2353 |  |  |  |  |  |  | sub maillogs_create_dirs { | 
| 2354 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2355 |  |  |  |  |  |  |  | 
| 2356 | 0 |  | 0 |  |  | 0 | my $user  = $self->conf->{qmail_log_user}  || "qmaill"; | 
| 2357 | 0 |  | 0 |  |  | 0 | my $group = $self->conf->{qmail_log_group} || "qnofiles"; | 
| 2358 | 0 |  |  |  |  | 0 | my $uid = getpwnam($user); | 
| 2359 | 0 |  |  |  |  | 0 | my $gid = getgrnam($group); | 
| 2360 |  |  |  |  |  |  |  | 
| 2361 |  |  |  |  |  |  | # if it exists, make sure it's owned by qmail:qnofiles | 
| 2362 | 0 |  | 0 |  |  | 0 | my $logdir = $self->conf->{qmail_log_base} || "/var/log/mail"; | 
| 2363 | 0 | 0 |  |  |  | 0 | if ( -w $logdir ) { | 
| 2364 | 0 | 0 |  |  |  | 0 | chown( $uid, $gid, $logdir ) | 
| 2365 |  |  |  |  |  |  | or $self->error( "Couldn't chown $logdir to $uid: $!"); | 
| 2366 | 0 |  |  |  |  | 0 | $self->audit( "maillogs: set ownership of $logdir to $user",verbose=>1 ); | 
| 2367 |  |  |  |  |  |  | } | 
| 2368 |  |  |  |  |  |  |  | 
| 2369 | 0 | 0 |  |  |  | 0 | if ( ! -d $logdir ) { | 
| 2370 | 0 | 0 |  |  |  | 0 | mkdir( $logdir, oct('0755') ) | 
| 2371 |  |  |  |  |  |  | or $self->error( "maillogs: couldn't create $logdir: $!" ); | 
| 2372 | 0 | 0 |  |  |  | 0 | chown( $uid, $gid, $logdir ) | 
| 2373 |  |  |  |  |  |  | or $self->error( "maillogs: couldn't chown $logdir: $!"); | 
| 2374 | 0 |  |  |  |  | 0 | $self->audit( "maillogs: created $logdir", verbose=>1 ); | 
| 2375 |  |  |  |  |  |  | } | 
| 2376 |  |  |  |  |  |  |  | 
| 2377 | 0 |  |  |  |  | 0 | foreach my $prot (qw/ send smtp pop3 submit /) { | 
| 2378 | 0 |  |  |  |  | 0 | my $dir = "$logdir/$prot"; | 
| 2379 | 0 | 0 |  |  |  | 0 | if ( -d $dir ) { | 
| 2380 | 0 |  |  |  |  | 0 | $self->audit( "maillogs: create $dir, (exists)", verbose=>1 ); | 
| 2381 |  |  |  |  |  |  | } | 
| 2382 |  |  |  |  |  |  | else { | 
| 2383 | 0 | 0 |  |  |  | 0 | mkdir( $dir, oct('0755') ) | 
| 2384 |  |  |  |  |  |  | or $self->error( "maillogs: couldn't create $dir: $!" ); | 
| 2385 | 0 |  |  |  |  | 0 | $self->audit( "maillogs: created $dir", verbose=>1); | 
| 2386 |  |  |  |  |  |  | } | 
| 2387 | 0 | 0 |  |  |  | 0 | chown( $uid, $gid, $dir ) | 
| 2388 |  |  |  |  |  |  | or $self->error( "maillogs: chown $dir failed: $!"); | 
| 2389 |  |  |  |  |  |  | } | 
| 2390 |  |  |  |  |  |  | }; | 
| 2391 |  |  |  |  |  |  |  | 
| 2392 |  |  |  |  |  |  | sub mrm { | 
| 2393 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 2394 | 0 |  |  |  |  | 0 | my $verbose = $self->{verbose}; | 
| 2395 |  |  |  |  |  |  |  | 
| 2396 | 0 |  |  |  |  | 0 | my %p = validate( @_, { | 
| 2397 |  |  |  |  |  |  | 'fatal'   => { type => BOOLEAN, optional => 1, default => 1 }, | 
| 2398 |  |  |  |  |  |  | 'verbose'   => { type => BOOLEAN, optional => 1, default => $verbose }, | 
| 2399 |  |  |  |  |  |  | 'test_ok' => { type => BOOLEAN, optional => 1, }, | 
| 2400 |  |  |  |  |  |  | }, | 
| 2401 |  |  |  |  |  |  | ); | 
| 2402 |  |  |  |  |  |  |  | 
| 2403 | 0 |  |  |  |  | 0 | my $fatal = $p{fatal}; | 
| 2404 | 0 |  |  |  |  | 0 | $verbose = $p{verbose}; | 
| 2405 |  |  |  |  |  |  |  | 
| 2406 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing only | 
| 2407 |  |  |  |  |  |  |  | 
| 2408 | 0 |  |  |  |  | 0 | my $perlbin = $self->util->find_bin( "perl" ); | 
| 2409 |  |  |  |  |  |  |  | 
| 2410 | 0 |  |  |  |  | 0 | my @targets = ( "$perlbin Makefile.PL", "make", "make install" ); | 
| 2411 | 0 | 0 |  |  |  | 0 | push @targets, "make test" if $verbose; | 
| 2412 |  |  |  |  |  |  |  | 
| 2413 | 0 |  |  |  |  | 0 | $self->util->install_module_from_src( | 
| 2414 |  |  |  |  |  |  | 'Mysql-Replication', | 
| 2415 |  |  |  |  |  |  | archive => 'Mysql-Replication.tar.gz', | 
| 2416 |  |  |  |  |  |  | url     => '/internet/sql/mrm', | 
| 2417 |  |  |  |  |  |  | targets => \@targets, | 
| 2418 |  |  |  |  |  |  | ); | 
| 2419 |  |  |  |  |  |  | } | 
| 2420 |  |  |  |  |  |  |  | 
| 2421 |  |  |  |  |  |  | sub munin { | 
| 2422 | 3 |  |  | 3 | 0 | 10 | my $self = shift; | 
| 2423 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 2424 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 2425 |  |  |  |  |  |  |  | 
| 2426 | 1 | 50 |  |  |  | 2 | if ( ! $self->conf->{install_munin} ) { | 
| 2427 | 1 |  |  |  |  | 2 | $self->audit("skipping munin install (disabled)"); | 
| 2428 | 1 |  |  |  |  | 3 | return; | 
| 2429 |  |  |  |  |  |  | }; | 
| 2430 |  |  |  |  |  |  |  | 
| 2431 | 0 |  |  |  |  | 0 | $self->rrdtool(); | 
| 2432 |  |  |  |  |  |  |  | 
| 2433 | 0 | 0 |  |  |  | 0 | return $self->audit("no munin install support for $OSNAME") | 
| 2434 |  |  |  |  |  |  | if $OSNAME ne 'freebsd'; | 
| 2435 |  |  |  |  |  |  |  | 
| 2436 | 0 |  |  |  |  | 0 | $self->freebsd->install_port('p5-Date-Manip'); | 
| 2437 | 0 |  |  |  |  | 0 | $self->munin_node(); | 
| 2438 | 0 |  |  |  |  | 0 | $self->freebsd->install_port('munin-master'); | 
| 2439 |  |  |  |  |  |  |  | 
| 2440 | 0 |  |  |  |  | 0 | return 1; | 
| 2441 |  |  |  |  |  |  | }; | 
| 2442 |  |  |  |  |  |  |  | 
| 2443 |  |  |  |  |  |  | sub munin_node { | 
| 2444 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2445 |  |  |  |  |  |  |  | 
| 2446 | 0 |  |  |  |  | 0 | $self->freebsd->install_port('munin-node'); | 
| 2447 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 2448 |  |  |  |  |  |  | check => "munin_node_enable", | 
| 2449 |  |  |  |  |  |  | line  => 'munin_node_enable="YES"', | 
| 2450 |  |  |  |  |  |  | ); | 
| 2451 |  |  |  |  |  |  |  | 
| 2452 | 0 |  |  |  |  | 0 | my $locals = ''; | 
| 2453 | 0 |  |  |  |  | 0 | foreach ( @{ $self->util->get_my_ips( exclude_internals => 0 ) } ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 2454 | 0 |  |  |  |  | 0 | my ($a,$b,$c,$d) = split( /\./, $_ ); | 
| 2455 | 0 |  |  |  |  | 0 | $locals .= "allow ^$a\\.$b\\.$c\\.$d" . '$'; | 
| 2456 |  |  |  |  |  |  | }; | 
| 2457 |  |  |  |  |  |  |  | 
| 2458 | 0 |  |  |  |  | 0 | my $munin_etc = '/usr/local/etc/munin'; | 
| 2459 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 2460 |  |  |  |  |  |  | file => "$munin_etc/munin-node.conf", | 
| 2461 |  |  |  |  |  |  | changes => [ | 
| 2462 |  |  |  |  |  |  | {   search => q{allow ^127\.0\.0\.1$}, | 
| 2463 |  |  |  |  |  |  | replace => q{allow ^127\.0\.0\.1$} . qq{\n$locals\n}, | 
| 2464 |  |  |  |  |  |  | } | 
| 2465 |  |  |  |  |  |  | ], | 
| 2466 |  |  |  |  |  |  | ); | 
| 2467 |  |  |  |  |  |  |  | 
| 2468 | 0 |  |  |  |  | 0 | my $qmdir = $self->qmail->get_qmail_dir; | 
| 2469 | 0 | 0 |  |  |  | 0 | $self->util->file_write( "$munin_etc/plugin-conf.d/plugins.conf", | 
| 2470 |  |  |  |  |  |  | append => 1, | 
| 2471 |  |  |  |  |  |  | lines => [ "\n[qmailqstat]\nuser qmails\nenv.qmailstat $qmdir/bin/qmail-qstat"], | 
| 2472 |  |  |  |  |  |  | ) if ! `grep qmailqstat "$munin_etc/plugin-conf.d/plugins.conf"`; | 
| 2473 |  |  |  |  |  |  |  | 
| 2474 | 0 |  |  |  |  | 0 | my @setup_links = `/usr/local/sbin/munin-node-configure --suggest --shell`; | 
| 2475 | 0 |  |  |  |  | 0 | @setup_links = grep {/^ln/} @setup_links; | 
|  | 0 |  |  |  |  | 0 |  | 
| 2476 | 0 |  |  |  |  | 0 | @setup_links = grep {!/sendmail_/} @setup_links; | 
|  | 0 |  |  |  |  | 0 |  | 
| 2477 | 0 |  |  |  |  | 0 | @setup_links = grep {!/ntp_/} @setup_links; | 
|  | 0 |  |  |  |  | 0 |  | 
| 2478 |  |  |  |  |  |  |  | 
| 2479 | 0 |  |  |  |  | 0 | foreach ( @setup_links ) { system $_; }; | 
|  | 0 |  |  |  |  | 0 |  | 
| 2480 |  |  |  |  |  |  |  | 
| 2481 | 0 |  |  |  |  | 0 | my $t_ver = $Mail::Toaster::VERSION; | 
| 2482 | 0 |  |  |  |  | 0 | my $dist = "/usr/local/src/Mail-Toaster-$t_ver"; | 
| 2483 | 0 | 0 |  |  |  | 0 | if ( -d $dist ) { | 
| 2484 | 0 |  |  |  |  | 0 | my @plugins = qw/ qmail_rbl spamassassin /; | 
| 2485 | 0 |  |  |  |  | 0 | foreach ( @plugins ) { | 
| 2486 | 0 |  |  |  |  | 0 | copy("$dist/contrib/munin/$_", "$munin_etc/plugins" ); | 
| 2487 | 0 |  |  |  |  | 0 | chmod oct('0755'), "$munin_etc/plugins/$_"; | 
| 2488 |  |  |  |  |  |  | }; | 
| 2489 | 0 |  |  |  |  | 0 | copy ("$dist/contrib/logtail", "/usr/local/bin/logtail"); | 
| 2490 | 0 |  |  |  |  | 0 | chmod oct('0755'), "/usr/local/bin/logtail"; | 
| 2491 |  |  |  |  |  |  | }; | 
| 2492 |  |  |  |  |  |  |  | 
| 2493 | 0 |  |  |  |  | 0 | system "/usr/local/etc/rc.d/munin-node", "restart"; | 
| 2494 |  |  |  |  |  |  | }; | 
| 2495 |  |  |  |  |  |  |  | 
| 2496 |  |  |  |  |  |  | sub nictool { | 
| 2497 | 2 |  |  | 2 | 0 | 3 | my $self  = shift; | 
| 2498 | 2 |  |  |  |  | 6 | my %p = validate( @_, { $self->get_std_opts, },); | 
| 2499 |  |  |  |  |  |  |  | 
| 2500 | 2 | 50 |  |  |  | 15 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 2501 |  |  |  |  |  |  |  | 
| 2502 | 0 |  |  |  |  | 0 | $self->conf->{install_expat} = 1;    # this must be set for expat to install | 
| 2503 |  |  |  |  |  |  |  | 
| 2504 | 0 |  |  |  |  | 0 | $self->expat(); | 
| 2505 | 0 |  |  |  |  | 0 | $self->rsync(); | 
| 2506 | 0 |  |  |  |  | 0 | $self->djbdns(); | 
| 2507 | 0 |  |  |  |  | 0 | $self->mysql->install(); | 
| 2508 |  |  |  |  |  |  |  | 
| 2509 |  |  |  |  |  |  | # make sure these perl modules are installed | 
| 2510 | 0 |  |  |  |  | 0 | $self->util->install_module( "LWP::UserAgent", port => 'p5-libwww' ); | 
| 2511 | 0 |  |  |  |  | 0 | $self->util->install_module( "SOAP::Lite"); | 
| 2512 | 0 |  |  |  |  | 0 | $self->util->install_module( "RPC::XML" ); | 
| 2513 | 0 |  |  |  |  | 0 | $self->util->install_module( "DBI" ); | 
| 2514 | 0 |  |  |  |  | 0 | $self->util->install_module( "DBD::mysql" ); | 
| 2515 |  |  |  |  |  |  |  | 
| 2516 | 0 |  |  |  |  | 0 | $self->util->install_module( "Apache::DBI" ); | 
| 2517 | 0 |  |  |  |  | 0 | $self->util->install_module( "Apache2::SOAP" ); | 
| 2518 |  |  |  |  |  |  |  | 
| 2519 |  |  |  |  |  |  | # install NicTool Server | 
| 2520 | 0 |  |  |  |  | 0 | my $perlbin   = $self->util->find_bin( "perl", fatal => 0 ); | 
| 2521 | 0 |  |  |  |  | 0 | my $version   = "NicToolServer-2.06"; | 
| 2522 | 0 |  |  |  |  | 0 | my $http_base = $self->conf->{toaster_http_base}; | 
| 2523 |  |  |  |  |  |  |  | 
| 2524 | 0 |  |  |  |  | 0 | my @targets = ( "$perlbin Makefile.PL", "make", "make install" ); | 
| 2525 |  |  |  |  |  |  |  | 
| 2526 | 0 |  |  |  |  | 0 | push @targets, "make test"; | 
| 2527 |  |  |  |  |  |  |  | 
| 2528 | 0 | 0 |  |  |  | 0 | push @targets, "mv ../$version $http_base" | 
| 2529 |  |  |  |  |  |  | unless ( -d "$http_base/$version" ); | 
| 2530 |  |  |  |  |  |  |  | 
| 2531 | 0 | 0 |  |  |  | 0 | push @targets, "ln -s $http_base/$version $http_base/NicToolServer" | 
| 2532 |  |  |  |  |  |  | unless ( -l "$http_base/NicToolServer" ); | 
| 2533 |  |  |  |  |  |  |  | 
| 2534 | 0 |  |  |  |  | 0 | $self->util->install_module_from_src( $version, | 
| 2535 |  |  |  |  |  |  | archive => "$version.tar.gz", | 
| 2536 |  |  |  |  |  |  | site    => 'http://www.nictool.com', | 
| 2537 |  |  |  |  |  |  | url     => '/download/', | 
| 2538 |  |  |  |  |  |  | targets => \@targets, | 
| 2539 |  |  |  |  |  |  | ); | 
| 2540 |  |  |  |  |  |  |  | 
| 2541 |  |  |  |  |  |  | # install NicTool Client | 
| 2542 | 0 |  |  |  |  | 0 | $version = "NicToolClient-2.06"; | 
| 2543 | 0 |  |  |  |  | 0 | @targets = ( "$perlbin Makefile.PL", "make", "make install" ); | 
| 2544 | 0 |  |  |  |  | 0 | push @targets, "make test"; | 
| 2545 |  |  |  |  |  |  |  | 
| 2546 | 0 | 0 |  |  |  | 0 | push @targets, "mv ../$version $http_base" if ( !-d "$http_base/$version" ); | 
| 2547 | 0 | 0 |  |  |  | 0 | push @targets, "ln -s $http_base/$version $http_base/NicToolClient" | 
| 2548 |  |  |  |  |  |  | if ( !-l "$http_base/NicToolClient" ); | 
| 2549 |  |  |  |  |  |  |  | 
| 2550 | 0 |  |  |  |  | 0 | $self->util->install_module_from_src( $version, | 
| 2551 |  |  |  |  |  |  | archive => "$version.tar.gz", | 
| 2552 |  |  |  |  |  |  | site    => 'http://www.nictool.com', | 
| 2553 |  |  |  |  |  |  | url     => '/download/', | 
| 2554 |  |  |  |  |  |  | targets => \@targets, | 
| 2555 |  |  |  |  |  |  | ); | 
| 2556 |  |  |  |  |  |  | } | 
| 2557 |  |  |  |  |  |  |  | 
| 2558 |  |  |  |  |  |  | sub openssl_cert { | 
| 2559 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2560 |  |  |  |  |  |  |  | 
| 2561 | 0 |  |  |  |  | 0 | my $dir = "/usr/local/openssl/certs"; | 
| 2562 | 0 |  |  |  |  | 0 | my $csr = "$dir/server.csr"; | 
| 2563 | 0 |  |  |  |  | 0 | my $crt = "$dir/server.crt"; | 
| 2564 | 0 |  |  |  |  | 0 | my $key = "$dir/server.key"; | 
| 2565 | 0 |  |  |  |  | 0 | my $pem = "$dir/server.pem"; | 
| 2566 |  |  |  |  |  |  |  | 
| 2567 | 0 | 0 |  |  |  | 0 | $self->util->mkdir_system(dir=>$dir, verbose=>0) if ! -d $dir; | 
| 2568 |  |  |  |  |  |  |  | 
| 2569 | 0 |  |  |  |  | 0 | my $openssl = $self->util->find_bin('openssl', verbose=>0); | 
| 2570 | 0 | 0 |  |  |  | 0 | system "$openssl genrsa 2048 > $key" if ! -e $key; | 
| 2571 | 0 | 0 |  |  |  | 0 | $self->error( "ssl cert key generation failed!") if ! -e $key; | 
| 2572 |  |  |  |  |  |  |  | 
| 2573 | 0 | 0 |  |  |  | 0 | system "$openssl req -new -key $key -out $csr" if ! -e $csr; | 
| 2574 | 0 | 0 |  |  |  | 0 | $self->error( "cert sign request ($csr) generation failed!") if ! -e $csr; | 
| 2575 |  |  |  |  |  |  |  | 
| 2576 | 0 | 0 |  |  |  | 0 | system "$openssl req -x509 -days 999 -key $key -in $csr -out $crt" if ! -e $crt; | 
| 2577 | 0 | 0 |  |  |  | 0 | $self->error( "cert generation ($crt) failed!") if ! -e $crt; | 
| 2578 |  |  |  |  |  |  |  | 
| 2579 | 0 | 0 |  |  |  | 0 | system "cat $key $crt > $pem" if ! -e $pem; | 
| 2580 | 0 | 0 |  |  |  | 0 | $self->error( "pem generation ($pem) failed!") if ! -e $pem; | 
| 2581 |  |  |  |  |  |  |  | 
| 2582 | 0 |  |  |  |  | 0 | return 1; | 
| 2583 |  |  |  |  |  |  | }; | 
| 2584 |  |  |  |  |  |  |  | 
| 2585 |  |  |  |  |  |  | sub openssl_conf { | 
| 2586 | 3 |  |  | 3 | 0 | 10 | my $self  = shift; | 
| 2587 | 3 |  |  |  |  | 9 | my %p = validate( @_, { $self->get_std_opts, },); | 
| 2588 | 3 | 100 |  |  |  | 17 | return $p{test_ok} if defined $p{test_ok}; | 
| 2589 |  |  |  |  |  |  |  | 
| 2590 | 1 | 50 |  |  |  | 3 | if ( !$self->conf->{install_openssl} ) { | 
| 2591 | 0 |  |  |  |  | 0 | $self->audit( "openssl: configuring, skipping (disabled)" ); | 
| 2592 | 0 |  |  |  |  | 0 | return; | 
| 2593 |  |  |  |  |  |  | } | 
| 2594 |  |  |  |  |  |  |  | 
| 2595 |  |  |  |  |  |  | return if ( defined $self->conf->{install_openssl_conf} | 
| 2596 | 1 | 50 | 33 |  |  | 2 | && !$self->conf->{install_openssl_conf} ); | 
| 2597 |  |  |  |  |  |  |  | 
| 2598 |  |  |  |  |  |  | # make sure openssl libraries are available | 
| 2599 | 0 |  |  |  |  | 0 | $self->openssl_install(); | 
| 2600 |  |  |  |  |  |  |  | 
| 2601 | 0 |  |  |  |  | 0 | my $sslconf = $self->openssl_conf_find_config(); | 
| 2602 |  |  |  |  |  |  |  | 
| 2603 |  |  |  |  |  |  | # get/set the settings to alter | 
| 2604 | 0 |  | 0 |  |  | 0 | my $country  = $self->conf->{ssl_country}      || "US"; | 
| 2605 | 0 |  | 0 |  |  | 0 | my $state    = $self->conf->{ssl_state}        || "Texas"; | 
| 2606 | 0 |  | 0 |  |  | 0 | my $org      = $self->conf->{ssl_organization} || "DisOrganism, Inc."; | 
| 2607 | 0 |  | 0 |  |  | 0 | my $locality = $self->conf->{ssl_locality}     || "Dallas"; | 
| 2608 |  |  |  |  |  |  | my $name     = $self->conf->{ssl_common_name}  || $self->conf->{toaster_hostname} | 
| 2609 | 0 |  | 0 |  |  | 0 | || "mail.example.com"; | 
| 2610 |  |  |  |  |  |  | my $email = $self->conf->{ssl_email_address}   || $self->conf->{toaster_admin_email} | 
| 2611 | 0 |  | 0 |  |  | 0 | || "postmaster\@example.com"; | 
| 2612 |  |  |  |  |  |  |  | 
| 2613 |  |  |  |  |  |  | # update openssl.cnf with our settings | 
| 2614 | 0 |  |  |  |  | 0 | my $inside; | 
| 2615 |  |  |  |  |  |  | my $discard; | 
| 2616 | 0 |  |  |  |  | 0 | my @lines = $self->util->file_read( $sslconf, verbose=>0 ); | 
| 2617 | 0 |  |  |  |  | 0 | foreach my $line (@lines) { | 
| 2618 |  |  |  |  |  |  |  | 
| 2619 | 0 | 0 |  |  |  | 0 | next if $line =~ /^#/;    # comment lines | 
| 2620 | 0 | 0 |  |  |  | 0 | $inside++ if ( $line =~ /req_distinguished_name/ ); | 
| 2621 | 0 | 0 |  |  |  | 0 | next unless $inside; | 
| 2622 | 0 | 0 | 0 |  |  | 0 | $discard++ if ( $line =~ /emailAddress_default/ && $line !~ /example\.com/ ); | 
| 2623 |  |  |  |  |  |  |  | 
| 2624 | 0 | 0 |  |  |  | 0 | $line = "countryName_default\t\t= $country" | 
| 2625 |  |  |  |  |  |  | if $line =~ /^countryName_default/; | 
| 2626 | 0 | 0 |  |  |  | 0 | $line = "stateOrProvinceName_default\t= $state" | 
| 2627 |  |  |  |  |  |  | if $line =~ /^stateOrProvinceName_default/; | 
| 2628 | 0 | 0 |  |  |  | 0 | $line = "localityName\t\t\t= Locality Name (eg, city)\nlocalityName_default\t\t= $locality" if $line =~ /^localityName\s+/; | 
| 2629 |  |  |  |  |  |  |  | 
| 2630 | 0 | 0 |  |  |  | 0 | $line = "0.organizationName_default\t= $org" | 
| 2631 |  |  |  |  |  |  | if $line =~ /^0.organizationName_default/; | 
| 2632 | 0 | 0 |  |  |  | 0 | $line = "commonName_max\t\t\t= 64\ncommonName_default\t\t= $name" | 
| 2633 |  |  |  |  |  |  | if $line =~ /^commonName_max/; | 
| 2634 | 0 | 0 |  |  |  | 0 | $line = "emailAddress_max\t\t= 64\nemailAddress_default\t\t= $email" | 
| 2635 |  |  |  |  |  |  | if $line =~ /^emailAddress_max/; | 
| 2636 |  |  |  |  |  |  | } | 
| 2637 |  |  |  |  |  |  |  | 
| 2638 | 0 | 0 |  |  |  | 0 | if ($discard) { | 
| 2639 | 0 |  |  |  |  | 0 | $self->audit( "openssl: updating $sslconf, ok (no change)" ); | 
| 2640 | 0 |  |  |  |  | 0 | return 2; | 
| 2641 |  |  |  |  |  |  | } | 
| 2642 |  |  |  |  |  |  |  | 
| 2643 | 0 |  |  |  |  | 0 | my $tmpfile = "/tmp/openssl.cnf"; | 
| 2644 | 0 |  |  |  |  | 0 | $self->util->file_write( $tmpfile, lines => \@lines, verbose => 0 ); | 
| 2645 | 0 |  |  |  |  | 0 | $self->util->install_if_changed( | 
| 2646 |  |  |  |  |  |  | newfile  => $tmpfile, | 
| 2647 |  |  |  |  |  |  | existing => $sslconf, | 
| 2648 |  |  |  |  |  |  | verbose    => 0, | 
| 2649 |  |  |  |  |  |  | ); | 
| 2650 |  |  |  |  |  |  |  | 
| 2651 | 0 |  |  |  |  | 0 | return $self->openssl_cert(); | 
| 2652 |  |  |  |  |  |  | } | 
| 2653 |  |  |  |  |  |  |  | 
| 2654 |  |  |  |  |  |  | sub openssl_conf_find_config { | 
| 2655 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2656 |  |  |  |  |  |  |  | 
| 2657 |  |  |  |  |  |  | # figure out where openssl.cnf is | 
| 2658 | 0 |  |  |  |  | 0 | my $sslconf = "/etc/ssl/openssl.cnf"; | 
| 2659 |  |  |  |  |  |  |  | 
| 2660 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 2661 | 0 |  |  |  |  | 0 | $sslconf = "/etc/ssl/openssl.cnf";   # built-in | 
| 2662 | 0 |  |  |  |  | 0 | $self->openssl_conf_freebsd( $sslconf ); | 
| 2663 |  |  |  |  |  |  | } | 
| 2664 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 2665 | 0 |  |  |  |  | 0 | $sslconf = "/System/Library/OpenSSL/openssl.cnf"; | 
| 2666 |  |  |  |  |  |  | } | 
| 2667 |  |  |  |  |  |  | elsif ( $OSNAME eq "linux" ) { | 
| 2668 | 0 | 0 |  |  |  | 0 | if ( ! -e $sslconf ) { | 
| 2669 |  |  |  |  |  |  | # centos (and probably RedHat/Fedora) | 
| 2670 | 0 |  |  |  |  | 0 | $sslconf = "/etc/share/ssl/openssl.cnf"; | 
| 2671 |  |  |  |  |  |  | }; | 
| 2672 |  |  |  |  |  |  | } | 
| 2673 |  |  |  |  |  |  |  | 
| 2674 | 0 | 0 |  |  |  | 0 | $self->error( "openssl: could not find your openssl.cnf file!") if ! -e $sslconf; | 
| 2675 | 0 | 0 |  |  |  | 0 | $self->error( "openssl: no write permission to $sslconf!" ) if ! -w $sslconf; | 
| 2676 |  |  |  |  |  |  |  | 
| 2677 | 0 |  |  |  |  | 0 | $self->audit( "openssl: found $sslconf, ok" ); | 
| 2678 | 0 |  |  |  |  | 0 | return $sslconf; | 
| 2679 |  |  |  |  |  |  | }; | 
| 2680 |  |  |  |  |  |  |  | 
| 2681 |  |  |  |  |  |  | sub openssl_conf_freebsd { | 
| 2682 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2683 | 0 | 0 |  |  |  | 0 | my $conf = shift or return; | 
| 2684 |  |  |  |  |  |  |  | 
| 2685 | 0 | 0 | 0 |  |  | 0 | if ( ! -e $conf && -e '/usr/local/openssl/openssl.cnf.sample' ) { | 
| 2686 | 0 |  |  |  |  | 0 | mkpath "/etc/ssl"; | 
| 2687 | 0 |  |  |  |  | 0 | system "cp /usr/local/openssl/openssl.cnf.sample $conf"; | 
| 2688 |  |  |  |  |  |  | }; | 
| 2689 |  |  |  |  |  |  |  | 
| 2690 | 0 | 0 |  |  |  | 0 | if ( -d "/usr/local/openssl" ) { | 
| 2691 | 0 | 0 |  |  |  | 0 | if ( ! -e "/usr/local/openssl/openssl.cnf" ) { | 
| 2692 | 0 |  |  |  |  | 0 | symlink($conf, "/usr/local/openssl/openssl.cnf"); | 
| 2693 |  |  |  |  |  |  | }; | 
| 2694 |  |  |  |  |  |  | }; | 
| 2695 |  |  |  |  |  |  | }; | 
| 2696 |  |  |  |  |  |  |  | 
| 2697 |  |  |  |  |  |  | sub openssl_get_ciphers { | 
| 2698 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2699 | 0 |  |  |  |  | 0 | my $ciphers = shift; | 
| 2700 | 0 |  |  |  |  | 0 | my $openssl = $self->util->find_bin( 'openssl', verbose=>0 ); | 
| 2701 |  |  |  |  |  |  |  | 
| 2702 | 0 | 0 |  |  |  | 0 | my $s = $ciphers eq 'all'    ? 'ALL' | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 2703 |  |  |  |  |  |  | : $ciphers eq 'high'   ? 'HIGH:!SSLv2' | 
| 2704 |  |  |  |  |  |  | : $ciphers eq 'medium' ? 'HIGH:MEDIUM:!SSLv2' | 
| 2705 |  |  |  |  |  |  | : $ciphers eq 'pci'    ? 'DEFAULT:!ADH:!LOW:!EXP:!SSLv2:+HIGH:+MEDIUM' | 
| 2706 |  |  |  |  |  |  | :                        'DEFAULT'; | 
| 2707 | 0 |  |  |  |  | 0 | $ciphers = `$openssl ciphers $s`; | 
| 2708 | 0 |  |  |  |  | 0 | chomp $ciphers; | 
| 2709 | 0 |  |  |  |  | 0 | return $ciphers; | 
| 2710 |  |  |  |  |  |  | }; | 
| 2711 |  |  |  |  |  |  |  | 
| 2712 |  |  |  |  |  |  | sub openssl_install { | 
| 2713 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2714 |  |  |  |  |  |  |  | 
| 2715 | 0 | 0 |  |  |  | 0 | return if ! $self->conf->{install_openssl}; | 
| 2716 |  |  |  |  |  |  |  | 
| 2717 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'freebsd' ) { | 
| 2718 | 0 | 0 |  |  |  | 0 | if (!$self->freebsd->is_port_installed( 'openssl' ) ) { | 
| 2719 | 0 |  |  |  |  | 0 | $self->openssl_install_freebsd(); | 
| 2720 |  |  |  |  |  |  | }; | 
| 2721 |  |  |  |  |  |  | } | 
| 2722 |  |  |  |  |  |  | else { | 
| 2723 | 0 |  |  |  |  | 0 | my $bin = $self->util->find_bin('openssl',verbose=>0,fatal=>0); | 
| 2724 | 0 | 0 |  |  |  | 0 | if ( ! $bin ) { | 
| 2725 | 0 |  |  |  |  | 0 | warn "no openssl support for OS $OSNAME, please install manually.\n"; | 
| 2726 |  |  |  |  |  |  | } | 
| 2727 |  |  |  |  |  |  | else { | 
| 2728 | 0 |  |  |  |  | 0 | warn "using detected openssl on $OSNAME.\n"; | 
| 2729 |  |  |  |  |  |  | }; | 
| 2730 |  |  |  |  |  |  | }; | 
| 2731 |  |  |  |  |  |  | }; | 
| 2732 |  |  |  |  |  |  |  | 
| 2733 |  |  |  |  |  |  | sub openssl_install_freebsd { | 
| 2734 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2735 |  |  |  |  |  |  |  | 
| 2736 | 0 | 0 |  |  |  | 0 | if ($self->freebsd->install_package('openssl')) { | 
| 2737 | 0 |  |  |  |  | 0 | return 1; | 
| 2738 |  |  |  |  |  |  | } | 
| 2739 |  |  |  |  |  |  |  | 
| 2740 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( 'openssl', | 
| 2741 |  |  |  |  |  |  | category=> 'security', | 
| 2742 |  |  |  |  |  |  | options => "# Options for openssl-1.0.1_8 | 
| 2743 |  |  |  |  |  |  | _OPTIONS_READ=openssl-1.0.1_8 | 
| 2744 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=SHARED THREADS I386 SSE2 ASM PADLOCK ZLIB SCTP MD2 RC5 RFC3779 GMP EC | 
| 2745 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SHARED | 
| 2746 |  |  |  |  |  |  | OPTIONS_FILE_SET+=THREADS | 
| 2747 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=I386 | 
| 2748 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SSE2 | 
| 2749 |  |  |  |  |  |  | OPTIONS_FILE_SET+=ASM | 
| 2750 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=PADLOCK | 
| 2751 |  |  |  |  |  |  | OPTIONS_FILE_SET+=ZLIB | 
| 2752 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SCTP | 
| 2753 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MD2 | 
| 2754 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=RC5 | 
| 2755 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=RFC3779 | 
| 2756 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GMP | 
| 2757 |  |  |  |  |  |  | OPTIONS_FILE_SET+=EC | 
| 2758 |  |  |  |  |  |  | ", | 
| 2759 |  |  |  |  |  |  | ); | 
| 2760 |  |  |  |  |  |  | }; | 
| 2761 |  |  |  |  |  |  |  | 
| 2762 |  |  |  |  |  |  | sub periodic_conf { | 
| 2763 |  |  |  |  |  |  |  | 
| 2764 | 0 | 0 |  | 0 | 0 | 0 | return if -e "/etc/periodic.conf"; | 
| 2765 |  |  |  |  |  |  |  | 
| 2766 | 0 |  |  |  |  | 0 | open my $PERIODIC, '>>', '/etc/periodic.conf'; | 
| 2767 | 0 |  |  |  |  | 0 | print $PERIODIC ' | 
| 2768 |  |  |  |  |  |  | #--periodic.conf-- | 
| 2769 |  |  |  |  |  |  | # 210.backup-aliases | 
| 2770 |  |  |  |  |  |  | daily_backup_aliases_enable="NO"                       # Backup mail aliases | 
| 2771 |  |  |  |  |  |  |  | 
| 2772 |  |  |  |  |  |  | # 440.status-mailq | 
| 2773 |  |  |  |  |  |  | daily_status_mailq_enable="YES"                         # Check mail status | 
| 2774 |  |  |  |  |  |  | daily_status_mailq_shorten="NO"                         # Shorten output | 
| 2775 |  |  |  |  |  |  | daily_status_include_submit_mailq="NO"                 # Also submit queue | 
| 2776 |  |  |  |  |  |  |  | 
| 2777 |  |  |  |  |  |  | # 460.status-mail-rejects | 
| 2778 |  |  |  |  |  |  | daily_status_mail_rejects_enable="NO"                  # Check mail rejects | 
| 2779 |  |  |  |  |  |  | daily_status_mail_rejects_logs=3                        # How many logs to check | 
| 2780 |  |  |  |  |  |  | #-- end -- | 
| 2781 |  |  |  |  |  |  | '; | 
| 2782 | 0 |  |  |  |  | 0 | close $PERIODIC; | 
| 2783 |  |  |  |  |  |  | } | 
| 2784 |  |  |  |  |  |  |  | 
| 2785 |  |  |  |  |  |  | sub php { | 
| 2786 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2787 |  |  |  |  |  |  |  | 
| 2788 | 0 | 0 | 0 |  |  | 0 | if ( ! $self->conf->{install_squirrelmail} && ! $self->conf->{install_roundcube} ) { | 
| 2789 | 0 |  |  |  |  | 0 | $self->audit("skipping PHP install"); | 
| 2790 | 0 |  |  |  |  | 0 | return; | 
| 2791 |  |  |  |  |  |  | }; | 
| 2792 |  |  |  |  |  |  |  | 
| 2793 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'freebsd' ) { | 
| 2794 | 0 |  |  |  |  | 0 | return $self->php_freebsd; | 
| 2795 |  |  |  |  |  |  | }; | 
| 2796 |  |  |  |  |  |  |  | 
| 2797 | 0 |  |  |  |  | 0 | my $php = $self->util->find_bin('php',fatal=>0); | 
| 2798 | 0 |  |  |  |  | 0 | $self->error( "no php install support for $OSNAME yet, and php is not installed. Please install and try again." ); | 
| 2799 | 0 |  |  |  |  | 0 | return; | 
| 2800 |  |  |  |  |  |  | }; | 
| 2801 |  |  |  |  |  |  |  | 
| 2802 |  |  |  |  |  |  | sub php_freebsd { | 
| 2803 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2804 |  |  |  |  |  |  |  | 
| 2805 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "php5", | 
| 2806 |  |  |  |  |  |  | category=> 'lang', | 
| 2807 |  |  |  |  |  |  | options => "# This file generated by mail-toaster | 
| 2808 |  |  |  |  |  |  | # Options for php5-5.4.16 | 
| 2809 |  |  |  |  |  |  | _OPTIONS_READ=php5-5.4.16 | 
| 2810 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=CLI CGI FPM APACHE AP2FILTER EMBED DEBUG DTRACE IPV6 MAILHEAD LINKTHR | 
| 2811 |  |  |  |  |  |  | OPTIONS_FILE_SET+=CLI | 
| 2812 |  |  |  |  |  |  | OPTIONS_FILE_SET+=CGI | 
| 2813 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=FPM | 
| 2814 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=APACHE | 
| 2815 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AP2FILTER | 
| 2816 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=EMBED | 
| 2817 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=DEBUG | 
| 2818 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=DTRACE | 
| 2819 |  |  |  |  |  |  | OPTIONS_FILE_SET+=IPV6 | 
| 2820 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MAILHEAD | 
| 2821 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LINKTHR | 
| 2822 |  |  |  |  |  |  | ", | 
| 2823 |  |  |  |  |  |  | ) or return; | 
| 2824 |  |  |  |  |  |  |  | 
| 2825 | 0 |  |  |  |  | 0 | my $config = "/usr/local/etc/php.ini"; | 
| 2826 | 0 | 0 |  |  |  | 0 | if ( ! -e $config ) { | 
| 2827 | 0 | 0 |  |  |  | 0 | copy("$config-production", $config) if -e "$config-production"; | 
| 2828 | 0 |  |  |  |  | 0 | chmod oct('0644'), $config; | 
| 2829 |  |  |  |  |  |  |  | 
| 2830 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 2831 |  |  |  |  |  |  | file => "/usr/local/etc/php.ini", | 
| 2832 |  |  |  |  |  |  | changes => [ | 
| 2833 |  |  |  |  |  |  | {   search  => q{;include_path = ".:/php/includes"}, | 
| 2834 |  |  |  |  |  |  | replace => q{include_path = ".:/usr/local/share/pear"}, | 
| 2835 |  |  |  |  |  |  | }, | 
| 2836 |  |  |  |  |  |  | {   search  => q{;date.timezone =}, | 
| 2837 |  |  |  |  |  |  | replace => q{date.timezone = America/Denver}, | 
| 2838 |  |  |  |  |  |  | }, | 
| 2839 |  |  |  |  |  |  | ], | 
| 2840 |  |  |  |  |  |  | ); | 
| 2841 |  |  |  |  |  |  | }; | 
| 2842 |  |  |  |  |  |  |  | 
| 2843 | 0 | 0 |  |  |  | 0 | return 1 if -f $config; | 
| 2844 | 0 |  |  |  |  | 0 | return; | 
| 2845 |  |  |  |  |  |  | }; | 
| 2846 |  |  |  |  |  |  |  | 
| 2847 |  |  |  |  |  |  | sub phpmyadmin { | 
| 2848 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 2849 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 2850 |  |  |  |  |  |  |  | 
| 2851 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing only | 
| 2852 |  |  |  |  |  |  |  | 
| 2853 | 0 | 0 |  |  |  | 0 | unless ( $self->conf->{install_phpmyadmin} ) { | 
| 2854 | 0 |  |  |  |  | 0 | print "phpMyAdmin install disabled. Set install_phpmyadmin in " | 
| 2855 |  |  |  |  |  |  | . "toaster-watcher.conf if you want to install it.\n"; | 
| 2856 | 0 |  |  |  |  | 0 | return 0; | 
| 2857 |  |  |  |  |  |  | } | 
| 2858 |  |  |  |  |  |  |  | 
| 2859 |  |  |  |  |  |  | # prevent t1lib from installing X11 | 
| 2860 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 2861 | 0 |  |  |  |  | 0 | $self->php(); | 
| 2862 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "t1lib", flags => "WITHOUT_X11=yes" ); | 
| 2863 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "php5-gd" ); | 
| 2864 |  |  |  |  |  |  | } | 
| 2865 |  |  |  |  |  |  |  | 
| 2866 | 0 |  |  |  |  | 0 | $self->mysql->phpmyadmin_install; | 
| 2867 |  |  |  |  |  |  | } | 
| 2868 |  |  |  |  |  |  |  | 
| 2869 |  |  |  |  |  |  | sub portmaster { | 
| 2870 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2871 |  |  |  |  |  |  |  | 
| 2872 | 0 | 0 |  |  |  | 0 | if ( ! $self->conf->{install_portmaster} ) { | 
| 2873 | 0 |  |  |  |  | 0 | $self->audit("install portmaster skipped, not selected", verbose=>1); | 
| 2874 | 0 |  |  |  |  | 0 | return; | 
| 2875 |  |  |  |  |  |  | }; | 
| 2876 |  |  |  |  |  |  |  | 
| 2877 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "portmaster" ); | 
| 2878 |  |  |  |  |  |  | }; | 
| 2879 |  |  |  |  |  |  |  | 
| 2880 |  |  |  |  |  |  | sub ports { | 
| 2881 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 2882 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 2883 |  |  |  |  |  |  |  | 
| 2884 | 0 | 0 |  |  |  | 0 | return $self->freebsd->update_ports() if $OSNAME eq "freebsd"; | 
| 2885 | 0 | 0 |  |  |  | 0 | return $self->darwin->update_ports()  if $OSNAME eq "darwin"; | 
| 2886 |  |  |  |  |  |  |  | 
| 2887 | 0 |  |  |  |  | 0 | print "Sorry, no ports support for $OSNAME yet.\n"; | 
| 2888 | 0 |  |  |  |  | 0 | return; | 
| 2889 |  |  |  |  |  |  | } | 
| 2890 |  |  |  |  |  |  |  | 
| 2891 |  |  |  |  |  |  | sub qmailadmin { | 
| 2892 | 3 |  |  | 3 | 0 | 10 | my $self  = shift; | 
| 2893 | 3 |  |  |  |  | 6 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 2894 |  |  |  |  |  |  |  | 
| 2895 | 3 | 100 |  |  |  | 17 | return $p{test_ok} if defined $p{test_ok}; | 
| 2896 |  |  |  |  |  |  |  | 
| 2897 | 1 | 50 |  |  |  | 2 | my $ver = $self->conf->{install_qmailadmin} or do { | 
| 2898 | 1 |  |  |  |  | 2 | $self->audit( "skipping qmailadmin install, it's not selected!"); | 
| 2899 | 1 |  |  |  |  | 2 | return; | 
| 2900 |  |  |  |  |  |  | }; | 
| 2901 |  |  |  |  |  |  |  | 
| 2902 | 0 |  |  |  |  | 0 | my $package = "qmailadmin-$ver"; | 
| 2903 | 0 |  |  |  |  | 0 | my $site    = "http://" . $self->conf->{toaster_sf_mirror}; | 
| 2904 | 0 |  |  |  |  | 0 | my $url     = "/qmailadmin/qmailadmin-stable/$ver"; | 
| 2905 |  |  |  |  |  |  |  | 
| 2906 | 0 |  |  |  |  | 0 | my $toaster = $self->conf->{toaster_dl_site}.$self->conf->{toaster_dl_url}; | 
| 2907 | 0 |  | 0 |  |  | 0 | $toaster ||= "http://mail-toaster.org"; | 
| 2908 |  |  |  |  |  |  |  | 
| 2909 | 0 |  |  |  |  | 0 | my $cgi = $self->conf->{toaster_cgi_bin}; | 
| 2910 |  |  |  |  |  |  |  | 
| 2911 | 0 |  |  |  |  | 0 | my $docroot = $self->conf->{toaster_http_docs}; | 
| 2912 |  |  |  |  |  |  |  | 
| 2913 | 0 |  |  |  |  | 0 | my ($help); | 
| 2914 | 0 | 0 |  |  |  | 0 | $help++ if $self->conf->{qmailadmin_help_links}; | 
| 2915 |  |  |  |  |  |  |  | 
| 2916 | 0 | 0 |  |  |  | 0 | if ( $ver eq "port" ) { | 
| 2917 | 0 | 0 |  |  |  | 0 | if ( $OSNAME ne "freebsd" ) { | 
| 2918 | 0 |  |  |  |  | 0 | print | 
| 2919 |  |  |  |  |  |  | "FAILURE: Sorry, no port install of qmailadmin (yet). Please edit | 
| 2920 |  |  |  |  |  |  | toaster-watcher.conf and select a version of qmailadmin to install.\n"; | 
| 2921 | 0 |  |  |  |  | 0 | return 0; | 
| 2922 |  |  |  |  |  |  | } | 
| 2923 |  |  |  |  |  |  |  | 
| 2924 | 0 |  |  |  |  | 0 | $self->qmailadmin_freebsd_port(); | 
| 2925 | 0 | 0 |  |  |  | 0 | $self->qmailadmin_help() if $help; | 
| 2926 | 0 |  |  |  |  | 0 | return 1; | 
| 2927 |  |  |  |  |  |  | } | 
| 2928 |  |  |  |  |  |  |  | 
| 2929 | 0 |  |  |  |  | 0 | my $conf_args; | 
| 2930 |  |  |  |  |  |  |  | 
| 2931 | 0 | 0 |  |  |  | 0 | if ( -x "$cgi/qmailadmin" ) { | 
| 2932 | 0 | 0 |  |  |  | 0 | return 0 | 
| 2933 |  |  |  |  |  |  | unless $self->util->yes_or_no( | 
| 2934 |  |  |  |  |  |  | "qmailadmin is installed, do you want to reinstall?", | 
| 2935 |  |  |  |  |  |  | timeout  => 60, | 
| 2936 |  |  |  |  |  |  | ); | 
| 2937 |  |  |  |  |  |  | } | 
| 2938 |  |  |  |  |  |  |  | 
| 2939 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{qmailadmin_domain_autofill} ) { | 
| 2940 | 0 |  |  |  |  | 0 | $conf_args = " --enable-domain-autofill=Y"; | 
| 2941 | 0 |  |  |  |  | 0 | print "domain autofill: yes\n"; | 
| 2942 |  |  |  |  |  |  | } | 
| 2943 |  |  |  |  |  |  |  | 
| 2944 | 0 | 0 |  |  |  | 0 | if ( $self->util->yes_or_no( "\nDo you want spam options? " ) ) { | 
| 2945 |  |  |  |  |  |  | $conf_args .= | 
| 2946 |  |  |  |  |  |  | " --enable-modify-spam=Y" | 
| 2947 |  |  |  |  |  |  | . " --enable-spam-command=\"" | 
| 2948 | 0 |  |  |  |  | 0 | . $self->conf->{qmailadmin_spam_command} . "\""; | 
| 2949 |  |  |  |  |  |  | } | 
| 2950 |  |  |  |  |  |  |  | 
| 2951 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{qmailadmin_modify_quotas} ) { | 
| 2952 | 0 |  |  |  |  | 0 | $conf_args .= " --enable-modify-quota=y"; | 
| 2953 | 0 |  |  |  |  | 0 | print "modify quotas: yes\n"; | 
| 2954 |  |  |  |  |  |  | } | 
| 2955 |  |  |  |  |  |  |  | 
| 2956 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{qmailadmin_install_as_root} ) { | 
| 2957 | 0 |  |  |  |  | 0 | $conf_args .= " --enable-vpopuser=root"; | 
| 2958 | 0 |  |  |  |  | 0 | print "install as root: yes\n"; | 
| 2959 |  |  |  |  |  |  | } | 
| 2960 |  |  |  |  |  |  |  | 
| 2961 | 0 |  |  |  |  | 0 | $conf_args .= " --enable-autoresponder-path=".$self->conf->{toaster_prefix}."/bin"; | 
| 2962 |  |  |  |  |  |  |  | 
| 2963 | 0 | 0 |  |  |  | 0 | if ( defined $self->conf->{qmailadmin_catchall} ) { | 
| 2964 | 0 | 0 |  |  |  | 0 | $conf_args .= " --disable-catchall" if ! $self->conf->{qmailadmin_catchall}; | 
| 2965 |  |  |  |  |  |  | }; | 
| 2966 |  |  |  |  |  |  |  | 
| 2967 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{qmailadmin_help_links} ) { | 
| 2968 | 0 |  |  |  |  | 0 | $conf_args .= " --enable-help=y"; | 
| 2969 | 0 |  |  |  |  | 0 | $help = 1; | 
| 2970 |  |  |  |  |  |  | } | 
| 2971 |  |  |  |  |  |  |  | 
| 2972 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "darwin" ) { | 
| 2973 | 0 |  |  |  |  | 0 | my $vpopdir = $self->vpopmail->get_vpop_dir; | 
| 2974 | 0 |  |  |  |  | 0 | $self->util->syscmd( "ranlib $vpopdir/lib/libvpopmail.a", verbose => 0 ); | 
| 2975 |  |  |  |  |  |  | } | 
| 2976 |  |  |  |  |  |  |  | 
| 2977 | 0 |  | 0 |  |  | 0 | my $make = $self->util->find_bin( "gmake", fatal=>0, verbose=>0) || | 
| 2978 |  |  |  |  |  |  | $self->util->find_bin( "make", verbose=>0 ); | 
| 2979 |  |  |  |  |  |  |  | 
| 2980 | 0 |  |  |  |  | 0 | $self->util->install_from_source( | 
| 2981 |  |  |  |  |  |  | package   => $package, | 
| 2982 |  |  |  |  |  |  | site      => $site, | 
| 2983 |  |  |  |  |  |  | url       => $url, | 
| 2984 |  |  |  |  |  |  | targets   => | 
| 2985 |  |  |  |  |  |  | [ "./configure " . $conf_args, "$make", "$make install-strip" ], | 
| 2986 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 2987 |  |  |  |  |  |  | ); | 
| 2988 |  |  |  |  |  |  |  | 
| 2989 | 0 | 0 |  |  |  | 0 | $self->qmailadmin_help() if $help; | 
| 2990 |  |  |  |  |  |  |  | 
| 2991 | 0 |  |  |  |  | 0 | return 1; | 
| 2992 |  |  |  |  |  |  | } | 
| 2993 |  |  |  |  |  |  |  | 
| 2994 |  |  |  |  |  |  | sub qmailadmin_help { | 
| 2995 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 2996 |  |  |  |  |  |  |  | 
| 2997 | 0 | 0 |  |  |  | 0 | my $ver     = $self->conf->{qmailadmin_help_links} or return; | 
| 2998 | 0 |  |  |  |  | 0 | my $docroot = $self->conf->{toaster_http_docs}; | 
| 2999 | 0 |  |  |  |  | 0 | my $helpdir = $docroot . "/qmailadmin/images/help"; | 
| 3000 |  |  |  |  |  |  |  | 
| 3001 | 0 | 0 |  |  |  | 0 | if ( -d $helpdir ) { | 
| 3002 | 0 |  |  |  |  | 0 | $self->audit( "qmailadmin: installing help files, ok (exists)" ); | 
| 3003 | 0 |  |  |  |  | 0 | return 1; | 
| 3004 |  |  |  |  |  |  | } | 
| 3005 |  |  |  |  |  |  |  | 
| 3006 | 0 |  | 0 |  |  | 0 | my $src  = $self->conf->{toaster_src_dir} || "/usr/local/src"; | 
| 3007 | 0 |  |  |  |  | 0 | $src .= "/mail"; | 
| 3008 |  |  |  |  |  |  |  | 
| 3009 | 0 |  |  |  |  | 0 | print "qmailadmin: Installing help files in $helpdir\n"; | 
| 3010 | 0 |  |  |  |  | 0 | $self->util->cwd_source_dir( $src ); | 
| 3011 |  |  |  |  |  |  |  | 
| 3012 | 0 |  |  |  |  | 0 | my $helpfile = "qmailadmin-help-$ver"; | 
| 3013 | 0 | 0 |  |  |  | 0 | unless ( -e "$helpfile.tar.gz" ) { | 
| 3014 |  |  |  |  |  |  | $self->util->get_url( | 
| 3015 | 0 |  |  |  |  | 0 | "http://".$self->conf->{toaster_sf_mirror}."/qmailadmin/qmailadmin-help/$ver/$helpfile.tar.gz" | 
| 3016 |  |  |  |  |  |  | ); | 
| 3017 |  |  |  |  |  |  | } | 
| 3018 |  |  |  |  |  |  |  | 
| 3019 | 0 | 0 |  |  |  | 0 | if ( !-e "$helpfile.tar.gz" ) { | 
| 3020 | 0 |  |  |  |  | 0 | carp "qmailadmin: FAILED: help files couldn't be downloaded!\n"; | 
| 3021 | 0 |  |  |  |  | 0 | return; | 
| 3022 |  |  |  |  |  |  | } | 
| 3023 |  |  |  |  |  |  |  | 
| 3024 | 0 |  |  |  |  | 0 | $self->util->extract_archive( "$helpfile.tar.gz" ); | 
| 3025 |  |  |  |  |  |  |  | 
| 3026 | 0 | 0 |  |  |  | 0 | move( $helpfile, $helpdir ) or | 
| 3027 |  |  |  |  |  |  | $self->error( "Could not move $helpfile to $helpdir"); | 
| 3028 |  |  |  |  |  |  |  | 
| 3029 | 0 |  |  |  |  | 0 | $self->audit( "qmailadmin: installed help files, ok" ); | 
| 3030 |  |  |  |  |  |  | } | 
| 3031 |  |  |  |  |  |  |  | 
| 3032 |  |  |  |  |  |  | sub qmailadmin_freebsd_port { | 
| 3033 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3034 | 0 |  |  |  |  | 0 | my $conf = $self->conf; | 
| 3035 |  |  |  |  |  |  |  | 
| 3036 | 0 | 0 |  |  |  | 0 | my $help     = $conf->{qmailadmin_help_links} ? 'SET' : 'UNSET'; | 
| 3037 | 0 | 0 |  |  |  | 0 | my $catchall = $conf->{qmailadmin_catchall} ? 'SET' : 'UNSET'; | 
| 3038 | 0 | 0 |  |  |  | 0 | my $quotam   = $conf->{qmailadmin_modify_quotas} ? 'SET' : 'UNSET'; | 
| 3039 | 0 | 0 |  |  |  | 0 | my $domauto  = $conf->{qmailadmin_domain_autofill} ? 'SET' : 'UNSET'; | 
| 3040 | 0 | 0 |  |  |  | 0 | my $spam     = $conf->{qmailadmin_spam_option} ? 'SET' : 'UNSET'; | 
| 3041 |  |  |  |  |  |  |  | 
| 3042 | 0 |  |  |  |  | 0 | my @args; | 
| 3043 |  |  |  |  |  |  |  | 
| 3044 |  |  |  |  |  |  | push @args, 'QMAIL_DIR="'.$conf->{qmail_dir}.'"' | 
| 3045 | 0 | 0 |  |  |  | 0 | if $conf->{qmail_dir} ne '/var/qmail'; | 
| 3046 |  |  |  |  |  |  |  | 
| 3047 | 0 | 0 | 0 |  |  | 0 | if ( $spam eq 'SET' && $conf->{qmailadmin_spam_command} ) { | 
| 3048 | 0 |  |  |  |  | 0 | push @args, 'SPAM_COMMAND="'.$conf->{qmailadmin_spam_command}.'"'; | 
| 3049 |  |  |  |  |  |  | } | 
| 3050 |  |  |  |  |  |  |  | 
| 3051 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "qmailadmin", | 
| 3052 |  |  |  |  |  |  | flags => join( ',', @args ), | 
| 3053 |  |  |  |  |  |  | options => "# This file installed by mail::toaster | 
| 3054 |  |  |  |  |  |  | # Options for qmailadmin-1.2.15_5,2 | 
| 3055 |  |  |  |  |  |  | _OPTIONS_READ=qmailadmin-1.2.15_5,2 | 
| 3056 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=CATCHALL DOMAIN_AUTOFILL HELP IDX IDX_SQL IPAUTH MODIFY_QUOTA NOCACHE SPAM_DETECTION SPAM_NEEDS_EMAIL TRIVIAL_PASSWORD USER_INDEX | 
| 3057 |  |  |  |  |  |  | OPTIONS_FILE_$catchall+=CATCHALL | 
| 3058 |  |  |  |  |  |  | OPTIONS_FILE_SET+=DOMAIN_AUTOFILL | 
| 3059 |  |  |  |  |  |  | OPTIONS_FILE_$help+=HELP | 
| 3060 |  |  |  |  |  |  | OPTIONS_FILE_SET+=IDX | 
| 3061 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=IDX_SQL | 
| 3062 |  |  |  |  |  |  | OPTIONS_FILE_SET+=IPAUTH | 
| 3063 |  |  |  |  |  |  | OPTIONS_FILE_$quotam+=MODIFY_QUOTA | 
| 3064 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=NOCACHE | 
| 3065 |  |  |  |  |  |  | OPTIONS_FILE_$spam+=SPAM_DETECTION | 
| 3066 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SPAM_NEEDS_EMAIL | 
| 3067 |  |  |  |  |  |  | OPTIONS_FILE_SET+=TRIVIAL_PASSWORD | 
| 3068 |  |  |  |  |  |  | OPTIONS_FILE_SET+=USER_INDEX | 
| 3069 |  |  |  |  |  |  | ", | 
| 3070 |  |  |  |  |  |  | ); | 
| 3071 |  |  |  |  |  |  |  | 
| 3072 | 0 | 0 |  |  |  | 0 | if ( $conf->{qmailadmin_install_as_root} ) { | 
| 3073 | 0 |  |  |  |  | 0 | my $gid = getgrnam("vchkpw"); | 
| 3074 | 0 |  |  |  |  | 0 | chown( 0, $gid, "/usr/local/www/cgi-bin.default/qmailadmin/qmailadmin" ); | 
| 3075 |  |  |  |  |  |  | } | 
| 3076 |  |  |  |  |  |  | } | 
| 3077 |  |  |  |  |  |  |  | 
| 3078 |  |  |  |  |  |  | sub qpsmtpd { | 
| 3079 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3080 |  |  |  |  |  |  |  | 
| 3081 |  |  |  |  |  |  | # install Qmail::Deliverable | 
| 3082 |  |  |  |  |  |  | # install vpopmaild service | 
| 3083 |  |  |  |  |  |  |  | 
| 3084 |  |  |  |  |  |  | # install qpsmtpd | 
| 3085 | 0 |  |  |  |  | 0 | print ' | 
| 3086 |  |  |  |  |  |  | - git clone https://github.com/qpsmtpd-dev/qpsmtpd-dev | 
| 3087 |  |  |  |  |  |  | - cp -r config.sample config | 
| 3088 |  |  |  |  |  |  | - chown smtpd:smtpd qpsmtpd | 
| 3089 |  |  |  |  |  |  | - chmod +s qpsmtpd | 
| 3090 |  |  |  |  |  |  | '; | 
| 3091 |  |  |  |  |  |  |  | 
| 3092 |  |  |  |  |  |  | # install qpsmtpd service | 
| 3093 | 0 |  |  |  |  | 0 | print ' | 
| 3094 |  |  |  |  |  |  | - services stop | 
| 3095 |  |  |  |  |  |  | - rm /var/service/smtp | 
| 3096 |  |  |  |  |  |  | - stop toaster-watcher and do previous step again | 
| 3097 |  |  |  |  |  |  | - ln -s /usr/local/src/qpsmtpd-dev/  /var/serivces/qpsmtpd | 
| 3098 |  |  |  |  |  |  | - cp /var/qmail/supervise/smtp/log/run log/run | 
| 3099 |  |  |  |  |  |  | '; | 
| 3100 |  |  |  |  |  |  |  | 
| 3101 |  |  |  |  |  |  | # install qpsmtpd SSL certs | 
| 3102 | 0 |  |  |  |  | 0 | print ' | 
| 3103 |  |  |  |  |  |  | - add clamav user to smtpd user group | 
| 3104 |  |  |  |  |  |  | - echo 0770 > config/spool_perms   # Hmmmm... quite open.. how did we do | 
| 3105 |  |  |  |  |  |  | this with current toaster? clamav needs to read vpopmail files | 
| 3106 |  |  |  |  |  |  | - echo /var/spool/clamd > spool_dir | 
| 3107 |  |  |  |  |  |  | - edits in config/plugins | 
| 3108 |  |  |  |  |  |  | - disable: ident/geoip | 
| 3109 |  |  |  |  |  |  | - disable: quit_fortune | 
| 3110 |  |  |  |  |  |  | - enable: auth/auth_checkpassword | 
| 3111 |  |  |  |  |  |  | checkpw /usr/local/vpopmail/bin/vchkpw true /usr/bin/true | 
| 3112 |  |  |  |  |  |  | - disable: auth/auth_flat_file | 
| 3113 |  |  |  |  |  |  | - disable: dspam learn_from_sa 7 reject 1 | 
| 3114 |  |  |  |  |  |  | - enable: virus/clamdscan deny_viruses yes | 
| 3115 |  |  |  |  |  |  | clamd_socket /var/run/clamav/clamd.sock max_size 3072 | 
| 3116 |  |  |  |  |  |  | - enable: queue/qmail-queue | 
| 3117 |  |  |  |  |  |  | - enable: sender_permitted_from | 
| 3118 |  |  |  |  |  |  | - install Qmail::Deliverable | 
| 3119 |  |  |  |  |  |  | - enable: qmail_deliverable | 
| 3120 |  |  |  |  |  |  | - install clamav::client | 
| 3121 |  |  |  |  |  |  | - edit run file QPUSER=vpopmail | 
| 3122 |  |  |  |  |  |  | - services start | 
| 3123 |  |  |  |  |  |  | - clamdscan plugin modification: | 
| 3124 |  |  |  |  |  |  | '; | 
| 3125 |  |  |  |  |  |  | }; | 
| 3126 |  |  |  |  |  |  |  | 
| 3127 |  |  |  |  |  |  | sub razor { | 
| 3128 | 3 |  |  | 3 | 0 | 8 | my $self  = shift; | 
| 3129 | 3 |  |  |  |  | 10 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3130 |  |  |  |  |  |  |  | 
| 3131 | 3 | 100 |  |  |  | 12 | my $ver = $self->conf->{install_razor} or do { | 
| 3132 | 1 |  |  |  |  | 3 | $self->audit( "razor: installing, skipping (disabled)" ); | 
| 3133 | 1 |  |  |  |  | 3 | return; | 
| 3134 |  |  |  |  |  |  | }; | 
| 3135 |  |  |  |  |  |  |  | 
| 3136 | 2 | 50 |  |  |  | 9 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3137 |  |  |  |  |  |  |  | 
| 3138 | 0 |  |  |  |  | 0 | $self->util->install_module( "Digest::Nilsimsa" ); | 
| 3139 | 0 |  |  |  |  | 0 | $self->util->install_module( "Digest::SHA1" ); | 
| 3140 |  |  |  |  |  |  |  | 
| 3141 | 0 | 0 |  |  |  | 0 | if ( $ver eq "port" ) { | 
| 3142 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 3143 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "razor-agents" ); | 
| 3144 |  |  |  |  |  |  | } | 
| 3145 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 3146 |  |  |  |  |  |  | # old ports tree, deprecated | 
| 3147 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "razor" ); | 
| 3148 |  |  |  |  |  |  | # this one should work | 
| 3149 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "p5-razor-agents" ); | 
| 3150 |  |  |  |  |  |  | } | 
| 3151 |  |  |  |  |  |  | } | 
| 3152 |  |  |  |  |  |  |  | 
| 3153 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "razor-client", fatal => 0 ) ) { | 
| 3154 | 0 |  |  |  |  | 0 | print "It appears you have razor installed, skipping manual build.\n"; | 
| 3155 | 0 |  |  |  |  | 0 | $self->razor_config(); | 
| 3156 | 0 |  |  |  |  | 0 | return 1; | 
| 3157 |  |  |  |  |  |  | } | 
| 3158 |  |  |  |  |  |  |  | 
| 3159 | 0 | 0 | 0 |  |  | 0 | $ver = "2.80" if ( $ver == 1 || $ver eq "port" ); | 
| 3160 |  |  |  |  |  |  |  | 
| 3161 | 0 |  |  |  |  | 0 | $self->util->install_module_from_src( 'razor-agents-' . $ver, | 
| 3162 |  |  |  |  |  |  | archive => 'razor-agents-' . $ver . '.tar.gz', | 
| 3163 |  |  |  |  |  |  | site    => 'http://umn.dl.sourceforge.net/sourceforge', | 
| 3164 |  |  |  |  |  |  | url     => '/razor', | 
| 3165 |  |  |  |  |  |  | ); | 
| 3166 |  |  |  |  |  |  |  | 
| 3167 | 0 |  |  |  |  | 0 | $self->razor_config(); | 
| 3168 | 0 |  |  |  |  | 0 | return 1; | 
| 3169 |  |  |  |  |  |  | } | 
| 3170 |  |  |  |  |  |  |  | 
| 3171 |  |  |  |  |  |  | sub razor_config { | 
| 3172 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3173 |  |  |  |  |  |  |  | 
| 3174 | 0 |  |  |  |  | 0 | print "razor: beginning configuration.\n"; | 
| 3175 |  |  |  |  |  |  |  | 
| 3176 | 0 | 0 |  |  |  | 0 | if ( -d "/etc/razor" ) { | 
| 3177 | 0 |  |  |  |  | 0 | print "razor_config: it appears you have razor configured, skipping.\n"; | 
| 3178 | 0 |  |  |  |  | 0 | return 1; | 
| 3179 |  |  |  |  |  |  | } | 
| 3180 |  |  |  |  |  |  |  | 
| 3181 | 0 |  |  |  |  | 0 | my $client = $self->util->find_bin( "razor-client", fatal => 0 ); | 
| 3182 | 0 |  |  |  |  | 0 | my $admin  = $self->util->find_bin( "razor-admin",  fatal => 0 ); | 
| 3183 |  |  |  |  |  |  |  | 
| 3184 |  |  |  |  |  |  | # for old versions of razor | 
| 3185 | 0 | 0 | 0 |  |  | 0 | if ( -x $client && !-x $admin ) { | 
| 3186 | 0 |  |  |  |  | 0 | $self->util->syscmd( $client, verbose=>0 ); | 
| 3187 |  |  |  |  |  |  | } | 
| 3188 |  |  |  |  |  |  |  | 
| 3189 | 0 | 0 |  |  |  | 0 | unless ( -x $admin ) { | 
| 3190 | 0 |  |  |  |  | 0 | print "FAILED: couldn't find $admin!\n"; | 
| 3191 | 0 |  |  |  |  | 0 | return 0; | 
| 3192 |  |  |  |  |  |  | } | 
| 3193 |  |  |  |  |  |  |  | 
| 3194 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$admin -home=/etc/razor -create -d", verbose=>0 ); | 
| 3195 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$admin -home=/etc/razor -register -d", verbose=>0 ); | 
| 3196 |  |  |  |  |  |  |  | 
| 3197 | 0 |  |  |  |  | 0 | my $file = "/etc/razor/razor-agent.conf"; | 
| 3198 | 0 | 0 |  |  |  | 0 | if ( -e $file ) { | 
| 3199 | 0 |  |  |  |  | 0 | my @lines = $self->util->file_read( $file ); | 
| 3200 | 0 |  |  |  |  | 0 | foreach my $line (@lines) { | 
| 3201 | 0 | 0 |  |  |  | 0 | if ( $line =~ /^logfile/ ) { | 
| 3202 | 0 |  |  |  |  | 0 | $line = 'logfile                = /var/log/razor-agent.log'; | 
| 3203 |  |  |  |  |  |  | } | 
| 3204 |  |  |  |  |  |  | } | 
| 3205 | 0 |  |  |  |  | 0 | $self->util->file_write( $file, lines => \@lines, verbose=>0 ); | 
| 3206 |  |  |  |  |  |  | } | 
| 3207 |  |  |  |  |  |  |  | 
| 3208 | 0 |  |  |  |  | 0 | $file = "/etc/newsyslog.conf"; | 
| 3209 | 0 | 0 |  |  |  | 0 | if ( -e $file ) { | 
| 3210 | 0 | 0 |  |  |  | 0 | if ( !`grep razor-agent $file` ) { | 
| 3211 | 0 |  |  |  |  | 0 | $self->util->file_write( $file, | 
| 3212 |  |  |  |  |  |  | lines  => ["/var/log/razor-agent.log	600	5	1000 *	Z"], | 
| 3213 |  |  |  |  |  |  | append => 1, | 
| 3214 |  |  |  |  |  |  | verbose  => 0, | 
| 3215 |  |  |  |  |  |  | ); | 
| 3216 |  |  |  |  |  |  | } | 
| 3217 |  |  |  |  |  |  | } | 
| 3218 |  |  |  |  |  |  |  | 
| 3219 | 0 |  |  |  |  | 0 | print "razor: configuration completed.\n"; | 
| 3220 | 0 |  |  |  |  | 0 | return 1; | 
| 3221 |  |  |  |  |  |  | } | 
| 3222 |  |  |  |  |  |  |  | 
| 3223 |  |  |  |  |  |  | sub refresh_config { | 
| 3224 | 0 |  |  | 0 | 0 | 0 | my ($self, $file_path) = @_; | 
| 3225 |  |  |  |  |  |  |  | 
| 3226 | 0 | 0 |  |  |  | 0 | if ( ! -f $file_path ) { | 
| 3227 | 0 |  |  |  |  | 0 | $self->audit( "config: $file_path is missing!, FAILED" ); | 
| 3228 | 0 |  |  |  |  | 0 | return; | 
| 3229 |  |  |  |  |  |  | }; | 
| 3230 |  |  |  |  |  |  |  | 
| 3231 | 0 | 0 |  |  |  | 0 | warn "found: $file_path \n" if $self->{verbose}; | 
| 3232 |  |  |  |  |  |  |  | 
| 3233 |  |  |  |  |  |  | # refresh our $conf | 
| 3234 |  |  |  |  |  |  | my $conf = $self->util->parse_config( $file_path, | 
| 3235 |  |  |  |  |  |  | verbose => $self->{verbose}, | 
| 3236 |  |  |  |  |  |  | fatal => $self->{fatal}, | 
| 3237 | 0 |  |  |  |  | 0 | ); | 
| 3238 |  |  |  |  |  |  |  | 
| 3239 | 0 |  |  |  |  | 0 | $self->set_config($conf); | 
| 3240 |  |  |  |  |  |  |  | 
| 3241 | 0 | 0 |  |  |  | 0 | warn "refreshed \$conf from: $file_path \n" if $self->{verbose}; | 
| 3242 | 0 |  |  |  |  | 0 | return $conf; | 
| 3243 |  |  |  |  |  |  | }; | 
| 3244 |  |  |  |  |  |  |  | 
| 3245 |  |  |  |  |  |  | sub ripmime { | 
| 3246 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3247 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3248 |  |  |  |  |  |  |  | 
| 3249 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3250 |  |  |  |  |  |  |  | 
| 3251 | 0 |  |  |  |  | 0 | my $ver = $self->conf->{install_ripmime}; | 
| 3252 | 0 | 0 |  |  |  | 0 | if ( !$ver ) { | 
| 3253 | 0 |  |  |  |  | 0 | print "ripmime install not selected.\n"; | 
| 3254 | 0 |  |  |  |  | 0 | return 0; | 
| 3255 |  |  |  |  |  |  | } | 
| 3256 |  |  |  |  |  |  |  | 
| 3257 | 0 |  |  |  |  | 0 | print "rimime: installing...\n"; | 
| 3258 |  |  |  |  |  |  |  | 
| 3259 | 0 | 0 | 0 |  |  | 0 | if ( $ver eq "port" || $ver eq "1" ) { | 
| 3260 |  |  |  |  |  |  |  | 
| 3261 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "ripmime", fatal => 0 ) ) { | 
| 3262 | 0 |  |  |  |  | 0 | print "ripmime: already installed...done.\n\n"; | 
| 3263 | 0 |  |  |  |  | 0 | return 1; | 
| 3264 |  |  |  |  |  |  | } | 
| 3265 |  |  |  |  |  |  |  | 
| 3266 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 3267 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "ripmime" ) and return 1; | 
| 3268 |  |  |  |  |  |  | } | 
| 3269 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 3270 | 0 | 0 |  |  |  | 0 | $self->darwin->install_port( "ripmime" ) and return 1; | 
| 3271 |  |  |  |  |  |  | } | 
| 3272 |  |  |  |  |  |  |  | 
| 3273 | 0 | 0 |  |  |  | 0 | if ( $self->util->find_bin( "ripmime", fatal => 0 ) ) { | 
| 3274 | 0 |  |  |  |  | 0 | print "ripmime: ripmime has been installed successfully.\n"; | 
| 3275 | 0 |  |  |  |  | 0 | return 1; | 
| 3276 |  |  |  |  |  |  | } | 
| 3277 |  |  |  |  |  |  |  | 
| 3278 | 0 |  |  |  |  | 0 | $ver = "1.4.0.6"; | 
| 3279 |  |  |  |  |  |  | } | 
| 3280 |  |  |  |  |  |  |  | 
| 3281 | 0 |  |  |  |  | 0 | my $ripmime = $self->util->find_bin( "ripmime", fatal => 0 ); | 
| 3282 | 0 | 0 |  |  |  | 0 | if ( -x $ripmime ) { | 
| 3283 | 0 |  |  |  |  | 0 | my $installed = `$ripmime -V`; | 
| 3284 | 0 |  |  |  |  | 0 | ($installed) = $installed =~ /v(.*) - /; | 
| 3285 |  |  |  |  |  |  |  | 
| 3286 | 0 | 0 |  |  |  | 0 | if ( $ver eq $installed ) { | 
| 3287 | 0 |  |  |  |  | 0 | print "ripmime: version ($ver) is already installed!\n"; | 
| 3288 | 0 |  |  |  |  | 0 | return 1; | 
| 3289 |  |  |  |  |  |  | } | 
| 3290 |  |  |  |  |  |  | } | 
| 3291 |  |  |  |  |  |  |  | 
| 3292 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 3293 | 0 |  |  |  |  | 0 | package        => "ripmime-$ver", | 
| 3294 |  |  |  |  |  |  | site           => 'http://www.pldaniels.com', | 
| 3295 |  |  |  |  |  |  | url            => '/ripmime', | 
| 3296 |  |  |  |  |  |  | targets        => [ 'make', 'make install' ], | 
| 3297 |  |  |  |  |  |  | bintest        => 'ripmime', | 
| 3298 |  |  |  |  |  |  | verbose        => 1, | 
| 3299 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 3300 |  |  |  |  |  |  | ); | 
| 3301 |  |  |  |  |  |  | } | 
| 3302 |  |  |  |  |  |  |  | 
| 3303 |  |  |  |  |  |  | sub rrdtool { | 
| 3304 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3305 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3306 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3307 |  |  |  |  |  |  |  | 
| 3308 | 0 | 0 |  |  |  | 0 | unless ( $self->conf->{install_rrdutil} ) { | 
| 3309 | 0 |  |  |  |  | 0 | print "install_rrdutil is not set in toaster-watcher.conf! Skipping.\n"; | 
| 3310 | 0 |  |  |  |  | 0 | return; | 
| 3311 |  |  |  |  |  |  | } | 
| 3312 |  |  |  |  |  |  |  | 
| 3313 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 3314 |  |  |  |  |  |  |  | 
| 3315 |  |  |  |  |  |  | # the newer (default) version of rrdtool requires an obscene amount | 
| 3316 |  |  |  |  |  |  | # of x11 software be installed. Install the older one instead. | 
| 3317 | 0 |  |  |  |  | 0 | $self->freebsd->install_port('rrdtool', | 
| 3318 |  |  |  |  |  |  | dir     => 'rrdtool12', | 
| 3319 |  |  |  |  |  |  | options => "#\n# Options for rrdtool-1.2.30_1 | 
| 3320 |  |  |  |  |  |  | _OPTIONS_READ=rrdtool-1.2.30_1 | 
| 3321 |  |  |  |  |  |  | WITHOUT_PYTHON_MODULE=true | 
| 3322 |  |  |  |  |  |  | WITHOUT_RUBY_MODULE=true | 
| 3323 |  |  |  |  |  |  | WITH_PERL_MODULE=true\n", | 
| 3324 |  |  |  |  |  |  | ); | 
| 3325 |  |  |  |  |  |  | } | 
| 3326 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 3327 | 0 |  |  |  |  | 0 | $self->darwin->port_install( port_name => "rrdtool" ); | 
| 3328 |  |  |  |  |  |  | } | 
| 3329 |  |  |  |  |  |  |  | 
| 3330 | 0 | 0 |  |  |  | 0 | return 1 if -x $self->util->find_bin( 'rrdtool', fatal => 0 ); | 
| 3331 |  |  |  |  |  |  |  | 
| 3332 | 0 |  |  |  |  | 0 | $self->util->install_from_source( | 
| 3333 |  |  |  |  |  |  | package => "rrdtool-1.2.23", | 
| 3334 |  |  |  |  |  |  | site    => 'http://people.ee.ethz.ch', | 
| 3335 |  |  |  |  |  |  | url     => '/~oetiker/webtools/rrdtool/pub', | 
| 3336 |  |  |  |  |  |  | targets => [ './configure', 'make', 'make install' ], | 
| 3337 |  |  |  |  |  |  | patches => [ ], | 
| 3338 |  |  |  |  |  |  | bintest => 'rrdtool', | 
| 3339 |  |  |  |  |  |  | verbose   => 1, | 
| 3340 |  |  |  |  |  |  | ); | 
| 3341 |  |  |  |  |  |  | } | 
| 3342 |  |  |  |  |  |  |  | 
| 3343 |  |  |  |  |  |  | sub roundcube { | 
| 3344 | 3 |  |  | 3 | 0 | 11 | my $self  = shift; | 
| 3345 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3346 |  |  |  |  |  |  |  | 
| 3347 | 3 | 100 |  |  |  | 17 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3348 |  |  |  |  |  |  |  | 
| 3349 | 1 | 50 |  |  |  | 2 | if ( ! $self->conf->{install_roundcube} ) { | 
| 3350 | 1 |  |  |  |  | 2 | $self->audit( "not installing roundcube, not selected!" ); | 
| 3351 | 1 |  |  |  |  | 3 | return; | 
| 3352 |  |  |  |  |  |  | }; | 
| 3353 |  |  |  |  |  |  |  | 
| 3354 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 3355 | 0 | 0 |  |  |  | 0 | $self->php() or return; | 
| 3356 | 0 | 0 |  |  |  | 0 | $self->roundcube_freebsd() or return; | 
| 3357 |  |  |  |  |  |  | } | 
| 3358 |  |  |  |  |  |  | else { | 
| 3359 | 0 |  |  |  |  | 0 | print | 
| 3360 |  |  |  |  |  |  | "please install roundcube manually. Support for install on $OSNAME is not available yet.\n"; | 
| 3361 | 0 |  |  |  |  | 0 | return; | 
| 3362 |  |  |  |  |  |  | } | 
| 3363 |  |  |  |  |  |  |  | 
| 3364 | 0 |  |  |  |  | 0 | return 1; | 
| 3365 |  |  |  |  |  |  | } | 
| 3366 |  |  |  |  |  |  |  | 
| 3367 |  |  |  |  |  |  | sub roundcube_freebsd { | 
| 3368 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3369 |  |  |  |  |  |  |  | 
| 3370 | 0 |  |  |  |  | 0 | $self->sqlite_freebsd(); | 
| 3371 |  |  |  |  |  |  |  | 
| 3372 | 0 | 0 |  |  |  | 0 | $self->freebsd->install_port( "roundcube", | 
| 3373 |  |  |  |  |  |  | category=> 'mail', | 
| 3374 |  |  |  |  |  |  | options => "# Options for roundcube-0.9.2,1 | 
| 3375 |  |  |  |  |  |  | _OPTIONS_READ=roundcube-0.9.2,1 | 
| 3376 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=GD LDAP NSC PSPELL SSL MYSQL PGSQL SQLITE | 
| 3377 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GD | 
| 3378 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=LDAP | 
| 3379 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=NSC | 
| 3380 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=PSPELL | 
| 3381 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SSL | 
| 3382 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MYSQL | 
| 3383 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=PGSQL | 
| 3384 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SQLITE | 
| 3385 |  |  |  |  |  |  | ", | 
| 3386 |  |  |  |  |  |  | ) or return; | 
| 3387 |  |  |  |  |  |  |  | 
| 3388 | 0 |  |  |  |  | 0 | $self->roundcube_config(); | 
| 3389 |  |  |  |  |  |  | }; | 
| 3390 |  |  |  |  |  |  |  | 
| 3391 |  |  |  |  |  |  | sub roundcube_config { | 
| 3392 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3393 | 0 |  |  |  |  | 0 | my $rcdir = "/usr/local/www/roundcube"; | 
| 3394 | 0 |  |  |  |  | 0 | my $config = "$rcdir/config"; | 
| 3395 |  |  |  |  |  |  |  | 
| 3396 | 0 |  |  |  |  | 0 | foreach my $c ( qw/ db.inc.php main.inc.php / ) { | 
| 3397 | 0 | 0 |  |  |  | 0 | copy( "$config/$c.dist", "$config/$c" ) if ! -e "$config/$c"; | 
| 3398 |  |  |  |  |  |  | }; | 
| 3399 |  |  |  |  |  |  |  | 
| 3400 | 0 | 0 |  |  |  | 0 | if ( ! -f "$config/db.inc.php" ) { | 
| 3401 | 0 |  |  |  |  | 0 | warn "unable to find roundcube/config/db.inc.php. Edit it with appropriate DSN settings\n"; | 
| 3402 | 0 |  |  |  |  | 0 | return; | 
| 3403 |  |  |  |  |  |  | }; | 
| 3404 |  |  |  |  |  |  |  | 
| 3405 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 3406 |  |  |  |  |  |  | file => "$config/main.inc.php", | 
| 3407 |  |  |  |  |  |  | changes => [ | 
| 3408 |  |  |  |  |  |  | {   search  => q{$rcmail_config['default_host'] = '';}, | 
| 3409 |  |  |  |  |  |  | replace => q{$rcmail_config['default_host'] = 'localhost';}, | 
| 3410 |  |  |  |  |  |  | }, | 
| 3411 |  |  |  |  |  |  | {   search  => q{$rcmail_config['session_lifetime'] = 10;}, | 
| 3412 |  |  |  |  |  |  | replace => q{$rcmail_config['session_lifetime'] = 30;}, | 
| 3413 |  |  |  |  |  |  | }, | 
| 3414 |  |  |  |  |  |  | {   search  => q{$rcmail_config['imap_auth_type'] = null;}, | 
| 3415 |  |  |  |  |  |  | replace => q{$rcmail_config['imap_auth_type'] = plain;}, | 
| 3416 |  |  |  |  |  |  | }, | 
| 3417 |  |  |  |  |  |  | ], | 
| 3418 |  |  |  |  |  |  | ); | 
| 3419 |  |  |  |  |  |  |  | 
| 3420 | 0 |  |  |  |  | 0 | return $self->roundcube_config_sqlite(); | 
| 3421 |  |  |  |  |  |  | }; | 
| 3422 |  |  |  |  |  |  |  | 
| 3423 |  |  |  |  |  |  | sub roundcube_config_sqlite { | 
| 3424 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3425 |  |  |  |  |  |  |  | 
| 3426 | 0 |  |  |  |  | 0 | my $rcdir = "/usr/local/www/roundcube"; | 
| 3427 | 0 |  |  |  |  | 0 | my $config = "$rcdir/config/db.inc.php"; | 
| 3428 |  |  |  |  |  |  |  | 
| 3429 | 0 |  |  |  |  | 0 | my $spool = '/var/spool/roundcubemail'; | 
| 3430 | 0 |  |  |  |  | 0 | mkpath $spool; | 
| 3431 | 0 |  |  |  |  | 0 | my (undef,undef,$uid,$gid) = getpwnam('www'); | 
| 3432 | 0 |  |  |  |  | 0 | chown $uid, $gid, $spool; | 
| 3433 |  |  |  |  |  |  |  | 
| 3434 |  |  |  |  |  |  | # configure roundcube to use sqlite for DB | 
| 3435 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 3436 |  |  |  |  |  |  | file => $config, | 
| 3437 |  |  |  |  |  |  | changes => [ | 
| 3438 |  |  |  |  |  |  | {   search  => q{$rcmail_config['db_dsnw'] = 'mysql://roundcube:pass@localhost/roundcubemail';}, | 
| 3439 |  |  |  |  |  |  | replace => q{$rcmail_config['db_dsnw'] = 'sqlite:////var/spool/roundcubemail/sqlite.db?mode=0646';}, | 
| 3440 |  |  |  |  |  |  | }, | 
| 3441 |  |  |  |  |  |  | ], | 
| 3442 |  |  |  |  |  |  | ); | 
| 3443 |  |  |  |  |  |  | }; | 
| 3444 |  |  |  |  |  |  |  | 
| 3445 |  |  |  |  |  |  | sub rsync { | 
| 3446 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3447 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3448 |  |  |  |  |  |  |  | 
| 3449 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3450 |  |  |  |  |  |  |  | 
| 3451 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 3452 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "rsync", | 
| 3453 |  |  |  |  |  |  | options => "#\n | 
| 3454 |  |  |  |  |  |  | # This file was generated by mail-toaster | 
| 3455 |  |  |  |  |  |  | # Options for rsync-3.0.9_3 | 
| 3456 |  |  |  |  |  |  | _OPTIONS_READ=rsync-3.0.9_3 | 
| 3457 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=ACL ATIMES DOCS FLAGS ICONV POPT_PORT RENAMED SSH TIMELIMIT | 
| 3458 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=ACL | 
| 3459 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=ATIMES | 
| 3460 |  |  |  |  |  |  | OPTIONS_FILE_SET+=DOCS | 
| 3461 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=FLAGS | 
| 3462 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=ICONV | 
| 3463 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=POPT_PORT | 
| 3464 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=RENAMED | 
| 3465 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SSH | 
| 3466 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=TIMELIMIT\n", | 
| 3467 |  |  |  |  |  |  | ); | 
| 3468 |  |  |  |  |  |  | } | 
| 3469 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 3470 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "rsync" ); | 
| 3471 |  |  |  |  |  |  | } | 
| 3472 |  |  |  |  |  |  | else { | 
| 3473 | 0 |  |  |  |  | 0 | die | 
| 3474 |  |  |  |  |  |  | "please install rsync manually. Support for $OSNAME is not available yet.\n"; | 
| 3475 |  |  |  |  |  |  | } | 
| 3476 |  |  |  |  |  |  |  | 
| 3477 | 0 |  |  |  |  | 0 | return $self->util->find_bin('rsync',verbose=>0); | 
| 3478 |  |  |  |  |  |  | } | 
| 3479 |  |  |  |  |  |  |  | 
| 3480 |  |  |  |  |  |  | sub set_config { | 
| 3481 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3482 | 0 |  |  |  |  | 0 | my $newconf = shift; | 
| 3483 | 0 | 0 |  |  |  | 0 | return $self->conf if ! $newconf; | 
| 3484 | 0 |  |  |  |  | 0 | $self->conf( $newconf ); | 
| 3485 | 0 |  |  |  |  | 0 | return $newconf; | 
| 3486 |  |  |  |  |  |  | }; | 
| 3487 |  |  |  |  |  |  |  | 
| 3488 |  |  |  |  |  |  | sub simscan { | 
| 3489 | 0 |  |  | 0 | 0 | 0 | require Mail::Toaster::Setup::Simscan; | 
| 3490 | 0 |  |  |  |  | 0 | return Mail::Toaster::Setup::Simscan->new; | 
| 3491 |  |  |  |  |  |  | } | 
| 3492 |  |  |  |  |  |  |  | 
| 3493 |  |  |  |  |  |  | sub socklog { | 
| 3494 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3495 | 0 |  |  |  |  | 0 | my %p = validate( @_, { 'ip' => SCALAR, $self->get_std_opts, },); | 
| 3496 |  |  |  |  |  |  |  | 
| 3497 | 0 |  |  |  |  | 0 | my $ip    = $p{ip}; | 
| 3498 |  |  |  |  |  |  |  | 
| 3499 | 0 |  | 0 |  |  | 0 | my $user  = $self->conf->{qmail_log_user}  || "qmaill"; | 
| 3500 | 0 |  | 0 |  |  | 0 | my $group = $self->conf->{qmail_log_group} || "qnofiles"; | 
| 3501 |  |  |  |  |  |  |  | 
| 3502 | 0 |  |  |  |  | 0 | my $uid = getpwnam($user); | 
| 3503 | 0 |  |  |  |  | 0 | my $gid = getgrnam($group); | 
| 3504 |  |  |  |  |  |  |  | 
| 3505 | 0 |  |  |  |  | 0 | my $logdir = $self->conf->{qmail_log_base}; | 
| 3506 | 0 | 0 |  |  |  | 0 | unless ( -d $logdir ) { $logdir = "/var/log/mail" } | 
|  | 0 |  |  |  |  | 0 |  | 
| 3507 |  |  |  |  |  |  |  | 
| 3508 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 3509 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "socklog" ); | 
| 3510 |  |  |  |  |  |  | } | 
| 3511 |  |  |  |  |  |  | else { | 
| 3512 | 0 |  |  |  |  | 0 | print "\n\nNOTICE: Be sure to install socklog!!\n\n"; | 
| 3513 |  |  |  |  |  |  | } | 
| 3514 | 0 |  |  |  |  | 0 | $self->socklog_qmail_control( 'send', $ip, $user, $logdir ); | 
| 3515 | 0 |  |  |  |  | 0 | $self->socklog_qmail_control( 'smtp', $ip, $user, $logdir ); | 
| 3516 | 0 |  |  |  |  | 0 | $self->socklog_qmail_control( 'pop3', $ip, $user, $logdir ); | 
| 3517 |  |  |  |  |  |  |  | 
| 3518 | 0 | 0 |  |  |  | 0 | unless ( -d $logdir ) { | 
| 3519 | 0 | 0 |  |  |  | 0 | mkdir( $logdir, oct('0755') ) or croak "socklog: couldn't create $logdir: $!"; | 
| 3520 | 0 | 0 |  |  |  | 0 | chown( $uid, $gid, $logdir ) or croak "socklog: couldn't chown  $logdir: $!"; | 
| 3521 |  |  |  |  |  |  | } | 
| 3522 |  |  |  |  |  |  |  | 
| 3523 | 0 |  |  |  |  | 0 | foreach my $prot (qw/ send smtp pop3 /) { | 
| 3524 | 0 | 0 |  |  |  | 0 | unless ( -d "$logdir/$prot" ) { | 
| 3525 | 0 | 0 |  |  |  | 0 | mkdir( "$logdir/$prot", oct('0755') ) | 
| 3526 |  |  |  |  |  |  | or croak "socklog: couldn't create $logdir/$prot: $!"; | 
| 3527 |  |  |  |  |  |  | } | 
| 3528 | 0 | 0 |  |  |  | 0 | chown( $uid, $gid, "$logdir/$prot" ) | 
| 3529 |  |  |  |  |  |  | or croak "socklog: couldn't chown $logdir/$prot: $!"; | 
| 3530 |  |  |  |  |  |  | } | 
| 3531 |  |  |  |  |  |  | } | 
| 3532 |  |  |  |  |  |  |  | 
| 3533 |  |  |  |  |  |  | sub socklog_qmail_control { | 
| 3534 | 0 |  |  | 0 | 0 | 0 | my ( $self, $serv, $ip, $user, $log ) = @_; | 
| 3535 |  |  |  |  |  |  |  | 
| 3536 | 0 |  | 0 |  |  | 0 | $ip        ||= "192.168.2.9"; | 
| 3537 | 0 |  | 0 |  |  | 0 | $user      ||= "qmaill"; | 
| 3538 | 0 |  |  |  |  | 0 | my $qmdir = $self->qmail->get_qmail_dir; | 
| 3539 | 0 |  |  |  |  | 0 | my $supervise = $self->qmail->get_supervise_dir; | 
| 3540 | 0 |  | 0 |  |  | 0 | $log       ||= "/var/log/mail"; | 
| 3541 |  |  |  |  |  |  |  | 
| 3542 | 0 |  |  |  |  | 0 | my $run_f = "$supervise/$serv/log/run"; | 
| 3543 |  |  |  |  |  |  |  | 
| 3544 | 0 | 0 |  |  |  | 0 | if ( -s $run_f ) { | 
| 3545 | 0 |  |  |  |  | 0 | print "socklog_qmail_control skipping: $run_f exists!\n"; | 
| 3546 | 0 |  |  |  |  | 0 | return 1; | 
| 3547 |  |  |  |  |  |  | } | 
| 3548 |  |  |  |  |  |  |  | 
| 3549 | 0 |  |  |  |  | 0 | print "socklog_qmail_control creating: $run_f..."; | 
| 3550 | 0 |  |  |  |  | 0 | my @socklog_run_file = <<EO_SOCKLOG; | 
| 3551 |  |  |  |  |  |  | #!/bin/sh | 
| 3552 |  |  |  |  |  |  | LOGDIR=$log | 
| 3553 |  |  |  |  |  |  | LOGSERVERIP=$ip | 
| 3554 |  |  |  |  |  |  | PORT=10116 | 
| 3555 |  |  |  |  |  |  |  | 
| 3556 |  |  |  |  |  |  | PATH=$qmdir/bin:/usr/local/bin:/usr/bin:/bin | 
| 3557 |  |  |  |  |  |  | export PATH | 
| 3558 |  |  |  |  |  |  |  | 
| 3559 |  |  |  |  |  |  | exec setuidgid $user multilog t s4096 n20 \ | 
| 3560 |  |  |  |  |  |  | !"tryto -pv tcpclient -v \$LOGSERVERIP \$PORT sh -c 'cat >&7'" \ | 
| 3561 |  |  |  |  |  |  | \${LOGDIR}/$serv | 
| 3562 |  |  |  |  |  |  | EO_SOCKLOG | 
| 3563 | 0 |  |  |  |  | 0 | $self->util->file_write( $run_f, lines => \@socklog_run_file, mode => '0755' ); | 
| 3564 | 0 |  |  |  |  | 0 | print "done.\n"; | 
| 3565 |  |  |  |  |  |  | } | 
| 3566 |  |  |  |  |  |  |  | 
| 3567 |  |  |  |  |  |  | sub spamassassin { | 
| 3568 | 3 |  |  | 3 | 0 | 13 | my $self  = shift; | 
| 3569 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3570 |  |  |  |  |  |  |  | 
| 3571 | 3 | 100 |  |  |  | 34 | return $p{test_ok} if defined $p{test_ok}; | 
| 3572 |  |  |  |  |  |  |  | 
| 3573 | 1 | 50 |  |  |  | 2 | if ( !$self->conf->{install_spamassassin} ) { | 
| 3574 | 1 |  |  |  |  | 2 | $self->audit( "spamassassin: installing, skipping (disabled)" ); | 
| 3575 | 1 |  |  |  |  | 3 | return; | 
| 3576 |  |  |  |  |  |  | } | 
| 3577 |  |  |  |  |  |  |  | 
| 3578 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
| 3579 | 0 |  |  |  |  | 0 | $self->spamassassin_freebsd(); | 
| 3580 |  |  |  |  |  |  | } | 
| 3581 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 3582 |  |  |  |  |  |  | $self->darwin->install_port( "procmail" ) | 
| 3583 | 0 | 0 |  |  |  | 0 | if $self->conf->{install_procmail}; | 
| 3584 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "unzip" ); | 
| 3585 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "p5-mail-audit" ); | 
| 3586 | 0 |  |  |  |  | 0 | $self->darwin->install_port( "p5-mail-spamassassin" ); | 
| 3587 | 0 | 0 |  |  |  | 0 | $self->darwin->install_port( "bogofilter" ) if $self->conf->{install_bogofilter}; | 
| 3588 |  |  |  |  |  |  | } | 
| 3589 |  |  |  |  |  |  |  | 
| 3590 | 0 |  |  |  |  | 0 | $self->util->install_module( "Time::HiRes" ); | 
| 3591 | 0 |  |  |  |  | 0 | $self->util->install_module( "Mail::Audit" ); | 
| 3592 | 0 |  |  |  |  | 0 | $self->util->install_module( "HTML::Parser" ); | 
| 3593 | 0 |  |  |  |  | 0 | $self->util->install_module( "Archive::Tar" ); | 
| 3594 | 0 |  |  |  |  | 0 | $self->util->install_module( "NetAddr::IP" ); | 
| 3595 | 0 |  |  |  |  | 0 | $self->util->install_module( "LWP::UserAgent" );  # used by sa-update | 
| 3596 | 0 |  |  |  |  | 0 | $self->util->install_module( "Mail::SpamAssassin" ); | 
| 3597 | 0 |  |  |  |  | 0 | $self->maildrop->install; | 
| 3598 |  |  |  |  |  |  |  | 
| 3599 | 0 |  |  |  |  | 0 | $self->spamassassin_sql(); | 
| 3600 |  |  |  |  |  |  | } | 
| 3601 |  |  |  |  |  |  |  | 
| 3602 |  |  |  |  |  |  | sub spamassassin_freebsd { | 
| 3603 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3604 |  |  |  |  |  |  |  | 
| 3605 | 0 |  |  |  |  | 0 | my $mysql = "WITHOUT_MYSQL=true"; | 
| 3606 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{install_spamassassin_sql} ) { | 
| 3607 | 0 |  |  |  |  | 0 | $mysql = "WITH_MYSQL=true"; | 
| 3608 |  |  |  |  |  |  | }; | 
| 3609 |  |  |  |  |  |  |  | 
| 3610 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "p5-Mail-SPF", | 
| 3611 |  |  |  |  |  |  | options => "# Options for p5-Mail-SPF-2.007_3 | 
| 3612 |  |  |  |  |  |  | _OPTIONS_READ=p5-Mail-SPF-2.007_3 | 
| 3613 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=DOCS | 
| 3614 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=DOCS | 
| 3615 |  |  |  |  |  |  | ", | 
| 3616 |  |  |  |  |  |  | ); | 
| 3617 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "spamassassin", | 
| 3618 |  |  |  |  |  |  | category => 'mail', | 
| 3619 |  |  |  |  |  |  | flags => "WITHOUT_SSL=1 BATCH=yes", | 
| 3620 |  |  |  |  |  |  | options => "# This file is generated by Mail::Toaster | 
| 3621 |  |  |  |  |  |  | # Options for spamassassin-3.2.5_2 | 
| 3622 |  |  |  |  |  |  | _OPTIONS_READ=spamassassin-3.2.5_2 | 
| 3623 |  |  |  |  |  |  | WITH_AS_ROOT=true | 
| 3624 |  |  |  |  |  |  | WITH_SPAMC=true | 
| 3625 |  |  |  |  |  |  | WITHOUT_SACOMPILE=true | 
| 3626 |  |  |  |  |  |  | WITH_DKIM=true | 
| 3627 |  |  |  |  |  |  | WITHOUT_SSL=true | 
| 3628 |  |  |  |  |  |  | WITH_GNUPG=true | 
| 3629 |  |  |  |  |  |  | $mysql | 
| 3630 |  |  |  |  |  |  | WITHOUT_PGSQL=true | 
| 3631 |  |  |  |  |  |  | WITH_RAZOR=true | 
| 3632 |  |  |  |  |  |  | WITH_SPF_QUERY=true | 
| 3633 |  |  |  |  |  |  | WITH_RELAY_COUNTRY=true", | 
| 3634 |  |  |  |  |  |  | verbose => 0, | 
| 3635 |  |  |  |  |  |  | ); | 
| 3636 |  |  |  |  |  |  |  | 
| 3637 |  |  |  |  |  |  | # the very old port didn't install a spamd.sh file | 
| 3638 |  |  |  |  |  |  | # new versions install sa-spamd and require the rc.conf flag | 
| 3639 | 0 | 0 |  |  |  | 0 | my $start = -f "/usr/local/etc/rc.d/spamd.sh" ? "/usr/local/etc/rc.d/spamd.sh" | 
|  |  | 0 |  |  |  |  |  | 
| 3640 |  |  |  |  |  |  | : -f "/usr/local/etc/rc.d/spamd"  ? "/usr/local/etc/rc.d/spamd" | 
| 3641 |  |  |  |  |  |  | : "/usr/local/etc/rc.d/sa-spamd";   # current location, 9/23/06 | 
| 3642 |  |  |  |  |  |  |  | 
| 3643 | 0 |  |  |  |  | 0 | my $flags = $self->conf->{install_spamassassin_flags}; | 
| 3644 |  |  |  |  |  |  |  | 
| 3645 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 3646 |  |  |  |  |  |  | check => "spamd_enable", | 
| 3647 |  |  |  |  |  |  | line  => 'spamd_enable="YES"', | 
| 3648 |  |  |  |  |  |  | verbose => 0, | 
| 3649 |  |  |  |  |  |  | ); | 
| 3650 |  |  |  |  |  |  |  | 
| 3651 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 3652 |  |  |  |  |  |  | check => "spamd_flags", | 
| 3653 |  |  |  |  |  |  | line  => qq{spamd_flags="$flags"}, | 
| 3654 |  |  |  |  |  |  | verbose => 0, | 
| 3655 |  |  |  |  |  |  | ); | 
| 3656 |  |  |  |  |  |  |  | 
| 3657 | 0 |  |  |  |  | 0 | $self->gnupg_install(); | 
| 3658 | 0 |  |  |  |  | 0 | $self->spamassassin_update(); | 
| 3659 |  |  |  |  |  |  |  | 
| 3660 | 0 | 0 |  |  |  | 0 | unless ( $self->util->is_process_running("spamd") ) { | 
| 3661 | 0 | 0 |  |  |  | 0 | if ( -x $start ) { | 
| 3662 | 0 |  |  |  |  | 0 | print "Starting SpamAssassin..."; | 
| 3663 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$start restart", verbose=>0 ); | 
| 3664 | 0 |  |  |  |  | 0 | print "done.\n"; | 
| 3665 |  |  |  |  |  |  | } | 
| 3666 | 0 |  |  |  |  | 0 | else { print "WARN: couldn't start SpamAssassin's spamd.\n"; } | 
| 3667 |  |  |  |  |  |  | } | 
| 3668 |  |  |  |  |  |  | }; | 
| 3669 |  |  |  |  |  |  |  | 
| 3670 |  |  |  |  |  |  | sub spamassassin_sql { | 
| 3671 |  |  |  |  |  |  |  | 
| 3672 |  |  |  |  |  |  | # set up the mysql database for use with SpamAssassin | 
| 3673 |  |  |  |  |  |  | # http://svn.apache.org/repos/asf/spamassassin/branches/3.0/sql/README | 
| 3674 |  |  |  |  |  |  |  | 
| 3675 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3676 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3677 |  |  |  |  |  |  |  | 
| 3678 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3679 |  |  |  |  |  |  |  | 
| 3680 | 0 | 0 | 0 |  |  | 0 | if ( ! $self->conf->{install_mysql} || ! $self->conf->{install_spamassassin_sql} ) { | 
| 3681 | 0 |  |  |  |  | 0 | print "SpamAssasin MySQL integration not selected. skipping.\n"; | 
| 3682 | 0 |  |  |  |  | 0 | return 0; | 
| 3683 |  |  |  |  |  |  | } | 
| 3684 |  |  |  |  |  |  |  | 
| 3685 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 3686 | 0 |  |  |  |  | 0 | $self->spamassassin_sql_freebsd(); | 
| 3687 |  |  |  |  |  |  | } | 
| 3688 |  |  |  |  |  |  | else { | 
| 3689 | 0 |  |  |  |  | 0 | $self->spamassassin_sql_manual(); | 
| 3690 |  |  |  |  |  |  | }; | 
| 3691 |  |  |  |  |  |  | }; | 
| 3692 |  |  |  |  |  |  |  | 
| 3693 |  |  |  |  |  |  | sub spamassassin_sql_manual { | 
| 3694 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3695 |  |  |  |  |  |  |  | 
| 3696 | 0 |  |  |  |  | 0 | print | 
| 3697 |  |  |  |  |  |  | "Sorry, automatic MySQL SpamAssassin setup is not available on $OSNAME yet. You must | 
| 3698 |  |  |  |  |  |  | do this process manually by locating the *_mysql.sql files that arrived with SpamAssassin. Run | 
| 3699 |  |  |  |  |  |  | each one like this: | 
| 3700 |  |  |  |  |  |  | mysql spamassassin < awl_mysql.sql | 
| 3701 |  |  |  |  |  |  | mysql spamassassin < bayes_mysql.sql | 
| 3702 |  |  |  |  |  |  | mysql spamassassin < userpref_mysql.sql | 
| 3703 |  |  |  |  |  |  |  | 
| 3704 |  |  |  |  |  |  | Then configure SpamAssassin to use them by creating a sql.cf file in SpamAssassin's etc dir with | 
| 3705 |  |  |  |  |  |  | the following contents: | 
| 3706 |  |  |  |  |  |  |  | 
| 3707 |  |  |  |  |  |  | user_scores_dsn                 DBI:mysql:spamassassin:localhost | 
| 3708 |  |  |  |  |  |  | user_scores_sql_username        $self->conf->{install_spamassassin_dbuser} | 
| 3709 |  |  |  |  |  |  | user_scores_sql_password        $self->conf->{install_spamassassin_dbpass} | 
| 3710 |  |  |  |  |  |  |  | 
| 3711 |  |  |  |  |  |  | # default query | 
| 3712 |  |  |  |  |  |  | #SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '\@GLOBAL' ORDER BY username ASC | 
| 3713 |  |  |  |  |  |  | # global, then domain level | 
| 3714 |  |  |  |  |  |  | #SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '\@GLOBAL' OR username = '@~'||_DOMAIN_ ORDER BY username ASC | 
| 3715 |  |  |  |  |  |  | # global overrides user prefs | 
| 3716 |  |  |  |  |  |  | #SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '\@GLOBAL' ORDER BY username DESC | 
| 3717 |  |  |  |  |  |  | # from the SA SQL README | 
| 3718 |  |  |  |  |  |  | #user_scores_sql_custom_query     SELECT preference, value FROM _TABLE_ WHERE username = _USERNAME_ OR username = '\$GLOBAL' OR username = CONCAT('%',_DOMAIN_) ORDER BY username ASC | 
| 3719 |  |  |  |  |  |  |  | 
| 3720 |  |  |  |  |  |  | bayes_store_module              Mail::SpamAssassin::BayesStore::SQL | 
| 3721 |  |  |  |  |  |  | bayes_sql_dsn                   DBI:mysql:spamassassin:localhost | 
| 3722 |  |  |  |  |  |  | bayes_sql_username              $self->conf->{install_spamassassin_dbuser} | 
| 3723 |  |  |  |  |  |  | bayes_sql_password              $self->conf->{install_spamassassin_dbpass} | 
| 3724 |  |  |  |  |  |  | #bayes_sql_override_username    someusername | 
| 3725 |  |  |  |  |  |  |  | 
| 3726 |  |  |  |  |  |  | auto_whitelist_factory       Mail::SpamAssassin::SQLBasedAddrList | 
| 3727 |  |  |  |  |  |  | user_awl_dsn                 DBI:mysql:spamassassin:localhost | 
| 3728 |  |  |  |  |  |  | user_awl_sql_username        $self->conf->{install_spamassassin_dbuser} | 
| 3729 |  |  |  |  |  |  | user_awl_sql_password        $self->conf->{install_spamassassin_dbpass} | 
| 3730 |  |  |  |  |  |  | user_awl_sql_table           awl | 
| 3731 |  |  |  |  |  |  | "; | 
| 3732 |  |  |  |  |  |  | }; | 
| 3733 |  |  |  |  |  |  |  | 
| 3734 |  |  |  |  |  |  | sub spamassassin_sql_freebsd { | 
| 3735 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3736 |  |  |  |  |  |  |  | 
| 3737 |  |  |  |  |  |  | # is SpamAssassin installed? | 
| 3738 | 0 | 0 |  |  |  | 0 | if ( ! $self->freebsd->is_port_installed( "spamassassin" ) ) { | 
| 3739 | 0 |  |  |  |  | 0 | print "SpamAssassin is not installed, skipping database setup.\n"; | 
| 3740 | 0 |  |  |  |  | 0 | return; | 
| 3741 |  |  |  |  |  |  | } | 
| 3742 |  |  |  |  |  |  |  | 
| 3743 |  |  |  |  |  |  | # have we been here already? | 
| 3744 | 0 | 0 |  |  |  | 0 | if ( -f "/usr/local/etc/mail/spamassassin/sql.cf" ) { | 
| 3745 | 0 |  |  |  |  | 0 | print "SpamAssassin database setup already done...skipping.\n"; | 
| 3746 | 0 |  |  |  |  | 0 | return 1; | 
| 3747 |  |  |  |  |  |  | }; | 
| 3748 |  |  |  |  |  |  |  | 
| 3749 | 0 |  |  |  |  | 0 | print "SpamAssassin is installed, setting up MySQL databases\n"; | 
| 3750 |  |  |  |  |  |  |  | 
| 3751 | 0 |  |  |  |  | 0 | my $user = $self->conf->{install_spamassassin_dbuser}; | 
| 3752 | 0 |  |  |  |  | 0 | my $pass = $self->conf->{install_spamassassin_dbpass}; | 
| 3753 |  |  |  |  |  |  |  | 
| 3754 | 0 |  |  |  |  | 0 | my $dot = $self->mysql->parse_dot_file( ".my.cnf", "[mysql]", 0 ); | 
| 3755 | 0 |  |  |  |  | 0 | my ( $dbh, $dsn, $drh ) = $self->mysql->connect( $dot, 1 ); | 
| 3756 |  |  |  |  |  |  |  | 
| 3757 | 0 | 0 |  |  |  | 0 | if ($dbh) { | 
| 3758 | 0 |  |  |  |  | 0 | my $query = "use spamassassin"; | 
| 3759 | 0 |  |  |  |  | 0 | my $sth = $self->mysql->query( $dbh, $query, 1 ); | 
| 3760 | 0 | 0 |  |  |  | 0 | if ( $sth->errstr ) { | 
| 3761 | 0 |  |  |  |  | 0 | print "oops, no spamassassin database.\n"; | 
| 3762 | 0 |  |  |  |  | 0 | print "creating MySQL spamassassin database.\n"; | 
| 3763 | 0 |  |  |  |  | 0 | $query = "CREATE DATABASE spamassassin"; | 
| 3764 | 0 |  |  |  |  | 0 | $sth   = $self->mysql->query( $dbh, $query ); | 
| 3765 | 0 |  |  |  |  | 0 | $query = | 
| 3766 |  |  |  |  |  |  | "GRANT ALL PRIVILEGES ON spamassassin.* TO $user\@'localhost' IDENTIFIED BY '$pass'"; | 
| 3767 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, $query ); | 
| 3768 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, "flush privileges" ); | 
| 3769 | 0 |  |  |  |  | 0 | $sth->finish; | 
| 3770 |  |  |  |  |  |  | } | 
| 3771 |  |  |  |  |  |  | else { | 
| 3772 | 0 |  |  |  |  | 0 | print "spamassassin: spamassassin database exists!\n"; | 
| 3773 | 0 |  |  |  |  | 0 | $sth->finish; | 
| 3774 |  |  |  |  |  |  | } | 
| 3775 |  |  |  |  |  |  | } | 
| 3776 |  |  |  |  |  |  |  | 
| 3777 | 0 |  |  |  |  | 0 | my $mysqlbin = $self->util->find_bin( 'mysql', fatal => 0 ); | 
| 3778 | 0 | 0 |  |  |  | 0 | if ( ! -x $mysqlbin ) { | 
| 3779 | 0 |  |  |  |  | 0 | $mysqlbin = $self->util->find_bin( 'mysql5' ); | 
| 3780 |  |  |  |  |  |  | }; | 
| 3781 | 0 |  |  |  |  | 0 | my $sqldir = "/usr/local/share/doc/spamassassin/sql"; | 
| 3782 | 0 |  |  |  |  | 0 | foreach my $f (qw/bayes_mysql.sql awl_mysql.sql userpref_mysql.sql/) { | 
| 3783 | 0 | 0 |  |  |  | 0 | if ( ! -f "$sqldir/$f" ) { | 
| 3784 | 0 |  |  |  |  | 0 | warn "missing .sql file: $f\n"; | 
| 3785 | 0 |  |  |  |  | 0 | next; | 
| 3786 |  |  |  |  |  |  | }; | 
| 3787 | 0 | 0 |  |  |  | 0 | if ( `grep MyISAM "$sqldir/$f"` ) { | 
| 3788 | 0 |  |  |  |  | 0 | my @lines = $self->util->file_read( "$sqldir/$f" ); | 
| 3789 | 0 |  |  |  |  | 0 | foreach my $line (@lines) { | 
| 3790 | 0 | 0 |  |  |  | 0 | if ( $line eq ') TYPE=MyISAM;' ) { | 
| 3791 | 0 |  |  |  |  | 0 | $line = ');'; | 
| 3792 |  |  |  |  |  |  | }; | 
| 3793 |  |  |  |  |  |  | }; | 
| 3794 | 0 |  |  |  |  | 0 | $self->util->file_write( "$sqldir/$f", lines=>\@lines ); | 
| 3795 |  |  |  |  |  |  | }; | 
| 3796 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$mysqlbin spamassassin < $sqldir/$f" ); | 
| 3797 |  |  |  |  |  |  | } | 
| 3798 |  |  |  |  |  |  |  | 
| 3799 | 0 |  |  |  |  | 0 | my $file = "/usr/local/etc/mail/spamassassin/sql.cf"; | 
| 3800 | 0 | 0 |  |  |  | 0 | unless ( -f $file ) { | 
| 3801 | 0 |  |  |  |  | 0 | my @lines = <<EO_SQL_CF; | 
| 3802 |  |  |  |  |  |  | loadplugin Mail::SpamAssassin::Plugin::AWL | 
| 3803 |  |  |  |  |  |  |  | 
| 3804 |  |  |  |  |  |  | user_scores_dsn                 DBI:mysql:spamassassin:localhost | 
| 3805 |  |  |  |  |  |  | user_scores_sql_username        $self->conf->{install_spamassassin_dbuser} | 
| 3806 |  |  |  |  |  |  | user_scores_sql_password        $self->conf->{install_spamassassin_dbpass} | 
| 3807 |  |  |  |  |  |  | #user_scores_sql_table           userpref | 
| 3808 |  |  |  |  |  |  |  | 
| 3809 |  |  |  |  |  |  | bayes_store_module              Mail::SpamAssassin::BayesStore::SQL | 
| 3810 |  |  |  |  |  |  | bayes_sql_dsn                   DBI:mysql:spamassassin:localhost | 
| 3811 |  |  |  |  |  |  | bayes_sql_username              $self->conf->{install_spamassassin_dbuser} | 
| 3812 |  |  |  |  |  |  | bayes_sql_password              $self->conf->{install_spamassassin_dbpass} | 
| 3813 |  |  |  |  |  |  | #bayes_sql_override_username    someusername | 
| 3814 |  |  |  |  |  |  |  | 
| 3815 |  |  |  |  |  |  | auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList | 
| 3816 |  |  |  |  |  |  | user_awl_dsn                    DBI:mysql:spamassassin:localhost | 
| 3817 |  |  |  |  |  |  | user_awl_sql_username           $self->conf->{install_spamassassin_dbuser} | 
| 3818 |  |  |  |  |  |  | user_awl_sql_password           $self->conf->{install_spamassassin_dbpass} | 
| 3819 |  |  |  |  |  |  | user_awl_sql_table              awl | 
| 3820 |  |  |  |  |  |  | EO_SQL_CF | 
| 3821 | 0 |  |  |  |  | 0 | $self->util->file_write( $file, lines => \@lines ); | 
| 3822 |  |  |  |  |  |  | } | 
| 3823 |  |  |  |  |  |  | } | 
| 3824 |  |  |  |  |  |  |  | 
| 3825 |  |  |  |  |  |  | sub spamassassin_update { | 
| 3826 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3827 |  |  |  |  |  |  |  | 
| 3828 | 0 | 0 |  |  |  | 0 | my $update = $self->util->find_bin( "sa-update", fatal => 0 ) or return; | 
| 3829 | 0 | 0 |  |  |  | 0 | system $update and do { | 
| 3830 | 0 |  |  |  |  | 0 | $self->error( "error updating spamassassin rules", fatal => 0); | 
| 3831 |  |  |  |  |  |  | }; | 
| 3832 | 0 |  |  |  |  | 0 | $self->audit( "trying again without GPG" ); | 
| 3833 |  |  |  |  |  |  |  | 
| 3834 | 0 | 0 |  |  |  | 0 | system "$update --nogpg" and | 
| 3835 |  |  |  |  |  |  | return $self->error( "error updating spamassassin rules", fatal => 0); | 
| 3836 |  |  |  |  |  |  |  | 
| 3837 | 0 |  |  |  |  | 0 | return 1; | 
| 3838 |  |  |  |  |  |  | }; | 
| 3839 |  |  |  |  |  |  |  | 
| 3840 |  |  |  |  |  |  | sub sqlite_freebsd { | 
| 3841 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3842 |  |  |  |  |  |  |  | 
| 3843 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'icu', | 
| 3844 |  |  |  |  |  |  | options => "# Options for icu-50.1.2 | 
| 3845 |  |  |  |  |  |  | _OPTIONS_READ=icu-50.1.2 | 
| 3846 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=THREADS | 
| 3847 |  |  |  |  |  |  | OPTIONS_FILE_SET+=THREADS | 
| 3848 |  |  |  |  |  |  | ", | 
| 3849 |  |  |  |  |  |  | ); | 
| 3850 |  |  |  |  |  |  |  | 
| 3851 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( 'sqlite3', | 
| 3852 |  |  |  |  |  |  | options => " | 
| 3853 |  |  |  |  |  |  | # Options for sqlite3-3.7.17_1 | 
| 3854 |  |  |  |  |  |  | _OPTIONS_READ=sqlite3-3.7.17_1 | 
| 3855 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=DIRECT_READ EXTENSION FTS3 ICU MEMMAN METADATA RAMTABLE RTREE SECURE_DELETE SOUNDEX STAT3 THREADSAFE UNLOCK_NOTIFY UPD_DEL_LIMIT URI | 
| 3856 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=DIRECT_READ | 
| 3857 |  |  |  |  |  |  | OPTIONS_FILE_SET+=EXTENSION | 
| 3858 |  |  |  |  |  |  | OPTIONS_FILE_SET+=FTS3 | 
| 3859 |  |  |  |  |  |  | OPTIONS_FILE_SET+=ICU | 
| 3860 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=MEMMAN | 
| 3861 |  |  |  |  |  |  | OPTIONS_FILE_SET+=METADATA | 
| 3862 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=RAMTABLE | 
| 3863 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=RTREE | 
| 3864 |  |  |  |  |  |  | OPTIONS_FILE_SET+=SECURE_DELETE | 
| 3865 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SOUNDEX | 
| 3866 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=STAT3 | 
| 3867 |  |  |  |  |  |  | OPTIONS_FILE_SET+=THREADSAFE | 
| 3868 |  |  |  |  |  |  | OPTIONS_FILE_SET+=UNLOCK_NOTIFY | 
| 3869 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=UPD_DEL_LIMIT | 
| 3870 |  |  |  |  |  |  | OPTIONS_FILE_SET+=URI | 
| 3871 |  |  |  |  |  |  | ", | 
| 3872 |  |  |  |  |  |  | ); | 
| 3873 |  |  |  |  |  |  | } | 
| 3874 |  |  |  |  |  |  |  | 
| 3875 |  |  |  |  |  |  | sub squirrelmail { | 
| 3876 | 3 |  |  | 3 | 0 | 12 | my $self  = shift; | 
| 3877 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts },); | 
| 3878 |  |  |  |  |  |  |  | 
| 3879 | 3 | 100 |  |  |  | 15 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 3880 |  |  |  |  |  |  |  | 
| 3881 | 1 | 50 |  |  |  | 2 | my $ver = $self->conf->{install_squirrelmail} or do { | 
| 3882 | 1 |  |  |  |  | 2 | $self->audit( 'skipping squirrelmail install (disabled)'); | 
| 3883 | 1 |  |  |  |  | 3 | return; | 
| 3884 |  |  |  |  |  |  | }; | 
| 3885 |  |  |  |  |  |  |  | 
| 3886 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 3887 | 0 |  |  |  |  | 0 | $self->php(); | 
| 3888 | 0 | 0 |  |  |  | 0 | $self->squirrelmail_freebsd() and return; | 
| 3889 |  |  |  |  |  |  | }; | 
| 3890 |  |  |  |  |  |  |  | 
| 3891 | 0 | 0 |  |  |  | 0 | $ver = "1.4.6" if $ver eq 'port'; | 
| 3892 |  |  |  |  |  |  |  | 
| 3893 | 0 |  |  |  |  | 0 | print "squirrelmail: attempting to install from sources.\n"; | 
| 3894 |  |  |  |  |  |  |  | 
| 3895 | 0 |  | 0 |  |  | 0 | my $htdocs = $self->conf->{toaster_http_docs} || "/usr/local/www/data"; | 
| 3896 | 0 |  | 0 |  |  | 0 | my $srcdir = $self->conf->{toaster_src_dir}   || "/usr/local/src"; | 
| 3897 | 0 |  |  |  |  | 0 | $srcdir .= "/mail"; | 
| 3898 |  |  |  |  |  |  |  | 
| 3899 | 0 | 0 |  |  |  | 0 | unless ( -d $htdocs ) { | 
| 3900 | 0 | 0 |  |  |  | 0 | $htdocs = "/var/www/data" if ( -d "/var/www/data" );    # linux | 
| 3901 | 0 | 0 |  |  |  | 0 | $htdocs = "/Library/Webserver/Documents" | 
| 3902 |  |  |  |  |  |  | if ( -d "/Library/Webserver/Documents" );             # OS X | 
| 3903 |  |  |  |  |  |  | } | 
| 3904 |  |  |  |  |  |  |  | 
| 3905 | 0 | 0 |  |  |  | 0 | if ( -d "$htdocs/squirrelmail" ) { | 
| 3906 | 0 |  |  |  |  | 0 | print "Squirrelmail is already installed, I won't install it again!\n"; | 
| 3907 | 0 |  |  |  |  | 0 | return 0; | 
| 3908 |  |  |  |  |  |  | } | 
| 3909 |  |  |  |  |  |  |  | 
| 3910 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 3911 |  |  |  |  |  |  | package        => "squirrelmail-$ver", | 
| 3912 |  |  |  |  |  |  | site           => "http://" . $self->conf->{toaster_sf_mirror}, | 
| 3913 | 0 |  |  |  |  | 0 | url            => "/squirrelmail", | 
| 3914 |  |  |  |  |  |  | targets        => ["mv $srcdir/squirrelmail-$ver $htdocs/squirrelmail"], | 
| 3915 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 3916 |  |  |  |  |  |  | ); | 
| 3917 |  |  |  |  |  |  |  | 
| 3918 | 0 |  |  |  |  | 0 | $self->squirrelmail_config(); | 
| 3919 | 0 |  |  |  |  | 0 | $self->squirrelmail_mysql(); | 
| 3920 |  |  |  |  |  |  | } | 
| 3921 |  |  |  |  |  |  |  | 
| 3922 |  |  |  |  |  |  | sub squirrelmail_freebsd { | 
| 3923 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 3924 |  |  |  |  |  |  |  | 
| 3925 | 0 |  |  |  |  | 0 | my @squirrel_flags; | 
| 3926 | 0 | 0 |  |  |  | 0 | push @squirrel_flags, 'WITH_DATABASE=1' if $self->conf->{install_squirrelmail_sql}; | 
| 3927 |  |  |  |  |  |  |  | 
| 3928 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "squirrelmail", | 
| 3929 |  |  |  |  |  |  | flags => join(',', @squirrel_flags), | 
| 3930 |  |  |  |  |  |  | ); | 
| 3931 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "squirrelmail-quota_usage-plugin" ); | 
| 3932 |  |  |  |  |  |  |  | 
| 3933 | 0 | 0 |  |  |  | 0 | return if ! $self->freebsd->is_port_installed( "squirrelmail" ); | 
| 3934 | 0 |  |  |  |  | 0 | my $sqdir = "/usr/local/www/squirrelmail"; | 
| 3935 | 0 | 0 |  |  |  | 0 | return if ! -d $sqdir; | 
| 3936 |  |  |  |  |  |  |  | 
| 3937 | 0 |  |  |  |  | 0 | $self->squirrelmail_config(); | 
| 3938 | 0 |  |  |  |  | 0 | $self->squirrelmail_mysql(); | 
| 3939 |  |  |  |  |  |  |  | 
| 3940 | 0 |  |  |  |  | 0 | return 1; | 
| 3941 |  |  |  |  |  |  | } | 
| 3942 |  |  |  |  |  |  |  | 
| 3943 |  |  |  |  |  |  | sub squirrelmail_mysql { | 
| 3944 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 3945 |  |  |  |  |  |  |  | 
| 3946 | 0 | 0 |  |  |  | 0 | return if ! $self->conf->{install_mysql}; | 
| 3947 | 0 | 0 |  |  |  | 0 | return if ! $self->conf->{install_squirrelmail_sql}; | 
| 3948 |  |  |  |  |  |  |  | 
| 3949 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
| 3950 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "pear-DB" ); | 
| 3951 |  |  |  |  |  |  |  | 
| 3952 | 0 |  |  |  |  | 0 | print | 
| 3953 |  |  |  |  |  |  | '\nHEY!  You need to add include_path = ".:/usr/local/share/pear" to php.ini.\n\n'; | 
| 3954 |  |  |  |  |  |  |  | 
| 3955 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "php5-mysql" ); | 
| 3956 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "squirrelmail-sasql-plugin" ); | 
| 3957 |  |  |  |  |  |  | } | 
| 3958 |  |  |  |  |  |  |  | 
| 3959 | 0 |  |  |  |  | 0 | my $db   = "squirrelmail"; | 
| 3960 | 0 |  |  |  |  | 0 | my $user = "squirrel"; | 
| 3961 | 0 |  | 0 |  |  | 0 | my $pass = $self->conf->{install_squirrelmail_sql_pass} || "secret"; | 
| 3962 | 0 |  |  |  |  | 0 | my $host = "localhost"; | 
| 3963 |  |  |  |  |  |  |  | 
| 3964 | 0 |  |  |  |  | 0 | my $dot = $self->mysql->parse_dot_file( ".my.cnf", "[mysql]", 0 ); | 
| 3965 | 0 |  |  |  |  | 0 | my ( $dbh, $dsn, $drh ) = $self->mysql->connect( $dot, 1 ); | 
| 3966 |  |  |  |  |  |  |  | 
| 3967 | 0 | 0 |  |  |  | 0 | if ($dbh) { | 
| 3968 | 0 |  |  |  |  | 0 | my $query = "use squirrelmail"; | 
| 3969 | 0 |  |  |  |  | 0 | my $sth   = $self->mysql->query( $dbh, $query, 1 ); | 
| 3970 |  |  |  |  |  |  |  | 
| 3971 | 0 | 0 |  |  |  | 0 | if ( !$sth->errstr ) { | 
| 3972 | 0 |  |  |  |  | 0 | print "squirrelmail: squirrelmail database already exists.\n"; | 
| 3973 | 0 |  |  |  |  | 0 | $sth->finish; | 
| 3974 | 0 |  |  |  |  | 0 | return 1; | 
| 3975 |  |  |  |  |  |  | } | 
| 3976 |  |  |  |  |  |  |  | 
| 3977 | 0 |  |  |  |  | 0 | print "squirrelmail: creating MySQL database for squirrelmail.\n"; | 
| 3978 | 0 |  |  |  |  | 0 | $query = "CREATE DATABASE squirrelmail"; | 
| 3979 | 0 |  |  |  |  | 0 | $sth   = $self->mysql->query( $dbh, $query ); | 
| 3980 |  |  |  |  |  |  |  | 
| 3981 | 0 |  |  |  |  | 0 | $query = | 
| 3982 |  |  |  |  |  |  | "GRANT ALL PRIVILEGES ON $db.* TO $user\@'$host' IDENTIFIED BY '$pass'"; | 
| 3983 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, $query ); | 
| 3984 |  |  |  |  |  |  |  | 
| 3985 | 0 |  |  |  |  | 0 | $query = | 
| 3986 |  |  |  |  |  |  | "CREATE TABLE squirrelmail.address ( owner varchar(128) DEFAULT '' NOT NULL, | 
| 3987 |  |  |  |  |  |  | nickname varchar(16) DEFAULT '' NOT NULL, firstname varchar(128) DEFAULT '' NOT NULL, | 
| 3988 |  |  |  |  |  |  | lastname varchar(128) DEFAULT '' NOT NULL, email varchar(128) DEFAULT '' NOT NULL, | 
| 3989 |  |  |  |  |  |  | label varchar(255), PRIMARY KEY (owner,nickname), KEY firstname (firstname,lastname)); | 
| 3990 |  |  |  |  |  |  | "; | 
| 3991 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, $query ); | 
| 3992 |  |  |  |  |  |  |  | 
| 3993 | 0 |  |  |  |  | 0 | $query = | 
| 3994 |  |  |  |  |  |  | "CREATE TABLE squirrelmail.global_abook ( owner varchar(128) DEFAULT '' NOT NULL, nickname varchar(16) DEFAULT '' NOT NULL, firstname varchar(128) DEFAULT '' NOT NULL, | 
| 3995 |  |  |  |  |  |  | lastname varchar(128) DEFAULT '' NOT NULL, email varchar(128) DEFAULT '' NOT NULL, | 
| 3996 |  |  |  |  |  |  | label varchar(255), PRIMARY KEY (owner,nickname), KEY firstname (firstname,lastname));"; | 
| 3997 |  |  |  |  |  |  |  | 
| 3998 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, $query ); | 
| 3999 |  |  |  |  |  |  |  | 
| 4000 | 0 |  |  |  |  | 0 | $query = | 
| 4001 |  |  |  |  |  |  | "CREATE TABLE squirrelmail.userprefs ( user varchar(128) DEFAULT '' NOT NULL, prefkey varchar(64) DEFAULT '' NOT NULL, prefval BLOB DEFAULT '' NOT NULL, PRIMARY KEY (user,prefkey))"; | 
| 4002 | 0 |  |  |  |  | 0 | $sth = $self->mysql->query( $dbh, $query ); | 
| 4003 |  |  |  |  |  |  |  | 
| 4004 | 0 |  |  |  |  | 0 | $sth->finish; | 
| 4005 | 0 |  |  |  |  | 0 | return 1; | 
| 4006 |  |  |  |  |  |  | } | 
| 4007 |  |  |  |  |  |  |  | 
| 4008 | 0 |  |  |  |  | 0 | print " | 
| 4009 |  |  |  |  |  |  |  | 
| 4010 |  |  |  |  |  |  | WARNING: I could not connect to your database server!  If this is a new install, | 
| 4011 |  |  |  |  |  |  | you will need to connect to your database server and run this command manually: | 
| 4012 |  |  |  |  |  |  |  | 
| 4013 |  |  |  |  |  |  | mysql -u root -h $host -p | 
| 4014 |  |  |  |  |  |  | CREATE DATABASE squirrelmail; | 
| 4015 |  |  |  |  |  |  | GRANT ALL PRIVILEGES ON $db.* TO $user\@'$host' IDENTIFIED BY '$pass'; | 
| 4016 |  |  |  |  |  |  | CREATE TABLE squirrelmail.address ( | 
| 4017 |  |  |  |  |  |  | owner varchar(128) DEFAULT '' NOT NULL, | 
| 4018 |  |  |  |  |  |  | nickname varchar(16) DEFAULT '' NOT NULL, | 
| 4019 |  |  |  |  |  |  | firstname varchar(128) DEFAULT '' NOT NULL, | 
| 4020 |  |  |  |  |  |  | lastname varchar(128) DEFAULT '' NOT NULL, | 
| 4021 |  |  |  |  |  |  | email varchar(128) DEFAULT '' NOT NULL, | 
| 4022 |  |  |  |  |  |  | label varchar(255), | 
| 4023 |  |  |  |  |  |  | PRIMARY KEY (owner,nickname), | 
| 4024 |  |  |  |  |  |  | KEY firstname (firstname,lastname) | 
| 4025 |  |  |  |  |  |  | ); | 
| 4026 |  |  |  |  |  |  | CREATE TABLE squirrelmail.global_abook ( | 
| 4027 |  |  |  |  |  |  | owner varchar(128) DEFAULT '' NOT NULL, | 
| 4028 |  |  |  |  |  |  | nickname varchar(16) DEFAULT '' NOT NULL, | 
| 4029 |  |  |  |  |  |  | firstname varchar(128) DEFAULT '' NOT NULL, | 
| 4030 |  |  |  |  |  |  | lastname varchar(128) DEFAULT '' NOT NULL, | 
| 4031 |  |  |  |  |  |  | email varchar(128) DEFAULT '' NOT NULL, | 
| 4032 |  |  |  |  |  |  | label varchar(255), | 
| 4033 |  |  |  |  |  |  | PRIMARY KEY (owner,nickname), | 
| 4034 |  |  |  |  |  |  | KEY firstname (firstname,lastname) | 
| 4035 |  |  |  |  |  |  | ); | 
| 4036 |  |  |  |  |  |  | CREATE TABLE squirrelmail.userprefs ( | 
| 4037 |  |  |  |  |  |  | user varchar(128) DEFAULT '' NOT NULL, | 
| 4038 |  |  |  |  |  |  | prefkey varchar(64) DEFAULT '' NOT NULL, | 
| 4039 |  |  |  |  |  |  | prefval BLOB DEFAULT '' NOT NULL, | 
| 4040 |  |  |  |  |  |  | PRIMARY KEY (user,prefkey) | 
| 4041 |  |  |  |  |  |  | ); | 
| 4042 |  |  |  |  |  |  | quit; | 
| 4043 |  |  |  |  |  |  |  | 
| 4044 |  |  |  |  |  |  | If this is an upgrade, you can probably ignore this warning. | 
| 4045 |  |  |  |  |  |  |  | 
| 4046 |  |  |  |  |  |  | "; | 
| 4047 |  |  |  |  |  |  | } | 
| 4048 |  |  |  |  |  |  |  | 
| 4049 |  |  |  |  |  |  | sub squirrelmail_config { | 
| 4050 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4051 |  |  |  |  |  |  |  | 
| 4052 | 0 |  |  |  |  | 0 | my $sqdir = "/usr/local/www/squirrelmail"; | 
| 4053 | 0 | 0 |  |  |  | 0 | return 1 if -e "$sqdir/config/config.php"; | 
| 4054 |  |  |  |  |  |  |  | 
| 4055 | 0 |  |  |  |  | 0 | chdir("$sqdir/config"); | 
| 4056 | 0 |  |  |  |  | 0 | print "squirrelmail: installing a default config.php\n"; | 
| 4057 |  |  |  |  |  |  |  | 
| 4058 | 0 |  |  |  |  | 0 | copy('config_default.php', 'config.php'); | 
| 4059 |  |  |  |  |  |  |  | 
| 4060 | 0 |  |  |  |  | 0 | my $mailhost = $self->conf->{toaster_hostname}; | 
| 4061 | 0 |  |  |  |  | 0 | my $dsn      = ''; | 
| 4062 |  |  |  |  |  |  |  | 
| 4063 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{install_squirrelmail_sql} ) { | 
| 4064 | 0 |  | 0 |  |  | 0 | my $pass = $self->conf->{install_squirrelmail_sql_pass} || 's3kret'; | 
| 4065 | 0 |  |  |  |  | 0 | $dsn = "mysql://squirrel:$pass\@localhost/squirrelmail"; | 
| 4066 |  |  |  |  |  |  | } | 
| 4067 |  |  |  |  |  |  |  | 
| 4068 | 0 |  |  |  |  | 0 | my $string = <<"EOCONFIG"; | 
| 4069 |  |  |  |  |  |  | <?php | 
| 4070 |  |  |  |  |  |  | \$signout_page  = 'https://$mailhost/'; | 
| 4071 |  |  |  |  |  |  | \$provider_name     = 'Powered by Mail::Toaster'; | 
| 4072 |  |  |  |  |  |  | \$provider_uri     = 'http://www.tnpi.net/wiki/Mail_Toaster'; | 
| 4073 |  |  |  |  |  |  | \$domain                 = '$mailhost'; | 
| 4074 |  |  |  |  |  |  | \$useSendmail            = true; | 
| 4075 |  |  |  |  |  |  | \$imap_server_type       = 'dovecot'; | 
| 4076 |  |  |  |  |  |  | \$addrbook_dsn = '$dsn'; | 
| 4077 |  |  |  |  |  |  | \$prefs_dsn = '$dsn'; | 
| 4078 |  |  |  |  |  |  | ?> | 
| 4079 |  |  |  |  |  |  | EOCONFIG | 
| 4080 |  |  |  |  |  |  | ; | 
| 4081 |  |  |  |  |  |  |  | 
| 4082 | 0 |  |  |  |  | 0 | $self->util->file_write( "config_local.php", lines => [ $string ] ); | 
| 4083 |  |  |  |  |  |  |  | 
| 4084 | 0 | 0 |  |  |  | 0 | if ( -d "$sqdir/plugins/sasql" ) { | 
| 4085 | 0 | 0 |  |  |  | 0 | if ( ! -e "$sqdir/plugins/sasql/sasql_conf.php" ) { | 
| 4086 | 0 |  |  |  |  | 0 | copy('sasql_conf.php.dist', 'sasql_conf.php'); | 
| 4087 |  |  |  |  |  |  | }; | 
| 4088 |  |  |  |  |  |  |  | 
| 4089 | 0 |  |  |  |  | 0 | my $user = $self->conf->{install_spamassassin_dbuser}; | 
| 4090 | 0 |  |  |  |  | 0 | my $pass = $self->conf->{install_spamassassin_dbpass}; | 
| 4091 | 0 |  |  |  |  | 0 | $self->config->apply_tweaks( | 
| 4092 |  |  |  |  |  |  | file => "$sqdir/plugins/sasql/sasql_conf.php", | 
| 4093 |  |  |  |  |  |  | changes => [ | 
| 4094 |  |  |  |  |  |  | {   search  => q{$SqlDSN = 'mysql://<user>:<pass>@<host>/<db>';}, | 
| 4095 |  |  |  |  |  |  | replace => "\$SqlDSN = 'mysql://$user:$pass\@localhost/spamassassin'", | 
| 4096 |  |  |  |  |  |  | }, | 
| 4097 |  |  |  |  |  |  | ], | 
| 4098 |  |  |  |  |  |  | ); | 
| 4099 |  |  |  |  |  |  | }; | 
| 4100 |  |  |  |  |  |  | } | 
| 4101 |  |  |  |  |  |  |  | 
| 4102 |  |  |  |  |  |  | sub sqwebmail { | 
| 4103 | 3 |  |  | 3 | 0 | 11 | my $self  = shift; | 
| 4104 | 3 |  |  |  |  | 8 | my %p = validate( @_, { $self->get_std_opts },); | 
| 4105 |  |  |  |  |  |  |  | 
| 4106 | 3 | 100 |  |  |  | 16 | return $p{test_ok} if defined $p{test_ok}; | 
| 4107 |  |  |  |  |  |  |  | 
| 4108 | 1 | 50 |  |  |  | 3 | my $ver = $self->conf->{install_sqwebmail} or do { | 
| 4109 | 1 |  |  |  |  | 2 | $self->audit( 'skipping sqwebmail install (disabled)'); | 
| 4110 | 1 |  |  |  |  | 3 | return; | 
| 4111 |  |  |  |  |  |  | }; | 
| 4112 |  |  |  |  |  |  |  | 
| 4113 | 0 |  | 0 |  |  | 0 | my $httpdir = $self->conf->{toaster_http_base} || "/usr/local/www"; | 
| 4114 | 0 |  |  |  |  | 0 | my $cgi     = $self->conf->{toaster_cgi_bin}; | 
| 4115 | 0 |  | 0 |  |  | 0 | my $prefix  = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 4116 |  |  |  |  |  |  |  | 
| 4117 | 0 | 0 | 0 |  |  | 0 | unless ( $cgi && -d $cgi ) { $cgi = "$httpdir/cgi-bin" } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4118 |  |  |  |  |  |  |  | 
| 4119 | 0 |  |  |  |  | 0 | my $datadir = $self->conf->{toaster_http_docs}; | 
| 4120 | 0 | 0 |  |  |  | 0 | unless ( -d $datadir ) { | 
| 4121 | 0 | 0 |  |  |  | 0 | if    ( -d "$httpdir/data/mail" ) { $datadir = "$httpdir/data/mail"; } | 
|  | 0 | 0 |  |  |  | 0 |  | 
| 4122 | 0 |  |  |  |  | 0 | elsif ( -d "$httpdir/mail" )      { $datadir = "$httpdir/mail"; } | 
| 4123 | 0 |  |  |  |  | 0 | else { $datadir = "$httpdir/data"; } | 
| 4124 |  |  |  |  |  |  | } | 
| 4125 |  |  |  |  |  |  |  | 
| 4126 | 0 | 0 |  |  |  | 0 | my $mime = -e "$prefix/etc/apache2/mime.types"  ? "$prefix/etc/apache2/mime.types" | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 4127 |  |  |  |  |  |  | : -e "$prefix/etc/apache22/mime.types" ? "$prefix/etc/apache22/mime.types" | 
| 4128 |  |  |  |  |  |  | : -e "$prefix/etc/apache24/mime.types" ? "$prefix/etc/apache24/mime.types" | 
| 4129 |  |  |  |  |  |  | : "$prefix/etc/apache/mime.types"; | 
| 4130 |  |  |  |  |  |  |  | 
| 4131 | 0 |  |  |  |  | 0 | my $cachedir = "/var/run/sqwebmail"; | 
| 4132 |  |  |  |  |  |  |  | 
| 4133 | 0 | 0 | 0 |  |  | 0 | if ( $OSNAME eq "freebsd" && $ver eq "port" ) { | 
| 4134 | 0 |  |  |  |  | 0 | return $self->sqwebmail_freebsd_port(); | 
| 4135 |  |  |  |  |  |  | }; | 
| 4136 |  |  |  |  |  |  |  | 
| 4137 | 0 | 0 |  |  |  | 0 | $ver = "5.3.1" if $ver eq "port"; | 
| 4138 |  |  |  |  |  |  |  | 
| 4139 | 0 | 0 |  |  |  | 0 | if ( -x "$prefix/libexec/sqwebmail/sqwebmaild" ) { | 
| 4140 | 0 | 0 |  |  |  | 0 | if ( !$self->util->yes_or_no( | 
| 4141 |  |  |  |  |  |  | "Sqwebmail is already installed, re-install it?", | 
| 4142 |  |  |  |  |  |  | timeout  => 300 | 
| 4143 |  |  |  |  |  |  | ) | 
| 4144 |  |  |  |  |  |  | ) | 
| 4145 |  |  |  |  |  |  | { | 
| 4146 | 0 |  |  |  |  | 0 | print "ok, skipping.\n"; | 
| 4147 | 0 |  |  |  |  | 0 | return; | 
| 4148 |  |  |  |  |  |  | } | 
| 4149 |  |  |  |  |  |  | } | 
| 4150 |  |  |  |  |  |  |  | 
| 4151 | 0 |  |  |  |  | 0 | my $package = "sqwebmail-$ver"; | 
| 4152 | 0 |  |  |  |  | 0 | my $site    = "http://" . $self->conf->{toaster_sf_mirror} . "/courier"; | 
| 4153 | 0 |  | 0 |  |  | 0 | my $src     = $self->conf->{toaster_src_dir} || "/usr/local/src"; | 
| 4154 |  |  |  |  |  |  |  | 
| 4155 | 0 |  |  |  |  | 0 | $self->util->cwd_source_dir( "$src/mail" ); | 
| 4156 |  |  |  |  |  |  |  | 
| 4157 | 0 | 0 |  |  |  | 0 | if ( -d "$package" ) { | 
| 4158 | 0 | 0 |  |  |  | 0 | unless ( $self->util->source_warning( $package, 1, $src ) ) { | 
| 4159 | 0 |  |  |  |  | 0 | carp "sqwebmail: OK, skipping sqwebmail.\n"; | 
| 4160 | 0 |  |  |  |  | 0 | return; | 
| 4161 |  |  |  |  |  |  | } | 
| 4162 |  |  |  |  |  |  | } | 
| 4163 |  |  |  |  |  |  |  | 
| 4164 | 0 | 0 |  |  |  | 0 | unless ( -e "$package.tar.bz2" ) { | 
| 4165 | 0 |  |  |  |  | 0 | $self->util->get_url( "$site/$package.tar.bz2" ); | 
| 4166 | 0 | 0 |  |  |  | 0 | unless ( -e "$package.tar.bz2" ) { | 
| 4167 | 0 |  |  |  |  | 0 | croak "sqwebmail FAILED: coudn't fetch $package\n"; | 
| 4168 |  |  |  |  |  |  | } | 
| 4169 |  |  |  |  |  |  | } | 
| 4170 |  |  |  |  |  |  |  | 
| 4171 | 0 |  |  |  |  | 0 | $self->util->extract_archive( "$package.tar.bz2" ); | 
| 4172 |  |  |  |  |  |  |  | 
| 4173 | 0 | 0 |  |  |  | 0 | chdir($package) or croak "sqwebmail FAILED: coudn't chdir $package\n"; | 
| 4174 |  |  |  |  |  |  |  | 
| 4175 | 0 |  |  |  |  | 0 | my $cmd = "./configure --prefix=$prefix --with-htmldir=$prefix/share/sqwebmail " | 
| 4176 |  |  |  |  |  |  | . "--with-cachedir=/var/run/sqwebmail --enable-webpass=vpopmail " | 
| 4177 |  |  |  |  |  |  | . "--with-module=authvchkpw --enable-https --enable-logincache " | 
| 4178 |  |  |  |  |  |  | . "--enable-imagedir=$datadir/webmail --without-authdaemon " | 
| 4179 |  |  |  |  |  |  | . "--enable-mimetypes=$mime --enable-cgibindir=" . $cgi; | 
| 4180 |  |  |  |  |  |  |  | 
| 4181 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "darwin" ) { $cmd .= " --with-cacheowner=daemon"; }; | 
|  | 0 |  |  |  |  | 0 |  | 
| 4182 |  |  |  |  |  |  |  | 
| 4183 | 0 |  |  |  |  | 0 | my $make  = $self->util->find_bin("gmake", fatal=>0, verbose=>0); | 
| 4184 | 0 |  | 0 |  |  | 0 | $make   ||= $self->util->find_bin("make", fatal=>0, verbose=>0); | 
| 4185 |  |  |  |  |  |  |  | 
| 4186 | 0 |  |  |  |  | 0 | $self->util->syscmd( $cmd ); | 
| 4187 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$make configure-check" ); | 
| 4188 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$make check" ); | 
| 4189 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$make" ); | 
| 4190 |  |  |  |  |  |  |  | 
| 4191 | 0 |  |  |  |  | 0 | my $share = "$prefix/share/sqwebmail"; | 
| 4192 | 0 | 0 |  |  |  | 0 | if ( -d $share ) { | 
| 4193 | 0 |  |  |  |  | 0 | $self->util->syscmd( "make install-exec" ); | 
| 4194 | 0 |  |  |  |  | 0 | print | 
| 4195 |  |  |  |  |  |  | "\n\nWARNING: I have only installed the $package binaries, thus\n"; | 
| 4196 | 0 |  |  |  |  | 0 | print "preserving any custom settings you might have in $share.\n"; | 
| 4197 | 0 |  |  |  |  | 0 | print | 
| 4198 |  |  |  |  |  |  | "If you wish to do a full install, overwriting any customizations\n"; | 
| 4199 | 0 |  |  |  |  | 0 | print "you might have, then do this:\n\n"; | 
| 4200 | 0 |  |  |  |  | 0 | print "\tcd $src/mail/$package; make install\n"; | 
| 4201 |  |  |  |  |  |  | } | 
| 4202 |  |  |  |  |  |  | else { | 
| 4203 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$make install" ); | 
| 4204 | 0 |  |  |  |  | 0 | chmod oct('0755'), $share; | 
| 4205 | 0 |  |  |  |  | 0 | chmod oct('0755'), "$datadir/sqwebmail"; | 
| 4206 | 0 | 0 |  |  |  | 0 | copy( "$share/ldapaddressbook.dist", "$share/ldapaddressbook" ) | 
| 4207 |  |  |  |  |  |  | or croak "copy failed: $!"; | 
| 4208 |  |  |  |  |  |  | } | 
| 4209 |  |  |  |  |  |  |  | 
| 4210 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$make install-configure", fatal => 0 ); | 
| 4211 | 0 |  |  |  |  | 0 | $self->sqwebmail_conf(); | 
| 4212 |  |  |  |  |  |  | } | 
| 4213 |  |  |  |  |  |  |  | 
| 4214 |  |  |  |  |  |  | sub sqwebmail_conf { | 
| 4215 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4216 | 0 |  |  |  |  | 0 | my %p = validate(@_, { $self->get_std_opts },); | 
| 4217 |  |  |  |  |  |  |  | 
| 4218 | 0 |  |  |  |  | 0 | my $cachedir = "/var/run/sqwebmail"; | 
| 4219 | 0 |  | 0 |  |  | 0 | my $prefix   = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 4220 |  |  |  |  |  |  |  | 
| 4221 | 0 | 0 |  |  |  | 0 | unless ( -e $cachedir ) { | 
| 4222 | 0 |  |  |  |  | 0 | my $uid = getpwnam("bin"); | 
| 4223 | 0 |  |  |  |  | 0 | my $gid = getgrnam("bin"); | 
| 4224 | 0 |  |  |  |  | 0 | mkdir( $cachedir, oct('0755') ); | 
| 4225 | 0 |  |  |  |  | 0 | chown( $uid, $gid, $cachedir ); | 
| 4226 |  |  |  |  |  |  | } | 
| 4227 |  |  |  |  |  |  |  | 
| 4228 | 0 |  |  |  |  | 0 | my $file = "/usr/local/etc/sqwebmail/sqwebmaild"; | 
| 4229 | 0 | 0 |  |  |  | 0 | return if ! -w $file; | 
| 4230 |  |  |  |  |  |  |  | 
| 4231 | 0 |  |  |  |  | 0 | my @lines = $self->util->file_read( $file ); | 
| 4232 | 0 |  |  |  |  | 0 | foreach my $line (@lines) { # | 
| 4233 | 0 | 0 |  |  |  | 0 | if ( $line =~ /^[#]{0,1}PIDFILE/ ) { | 
| 4234 | 0 |  |  |  |  | 0 | $line = "PIDFILE=$cachedir/sqwebmaild.pid"; | 
| 4235 |  |  |  |  |  |  | }; | 
| 4236 |  |  |  |  |  |  | }; | 
| 4237 | 0 |  |  |  |  | 0 | $self->util->file_write( $file, lines=>\@lines ); | 
| 4238 |  |  |  |  |  |  | } | 
| 4239 |  |  |  |  |  |  |  | 
| 4240 |  |  |  |  |  |  | sub sqwebmail_freebsd_port { | 
| 4241 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4242 |  |  |  |  |  |  |  | 
| 4243 | 0 |  |  |  |  | 0 | $self->gnupg_install; | 
| 4244 | 0 |  |  |  |  | 0 | $self->courier_authlib; | 
| 4245 |  |  |  |  |  |  |  | 
| 4246 | 0 |  |  |  |  | 0 | my $cgi     = $self->conf->{toaster_cgi_bin}; | 
| 4247 | 0 |  |  |  |  | 0 | my $datadir = $self->conf->{toaster_http_docs}; | 
| 4248 | 0 |  |  |  |  | 0 | my $cachedir = "/var/run/sqwebmail"; | 
| 4249 |  |  |  |  |  |  |  | 
| 4250 | 0 | 0 |  |  |  | 0 | if ( $cgi     =~ /\/usr\/local\/(.*)$/ ) { $cgi     = $1; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4251 | 0 | 0 |  |  |  | 0 | if ( $datadir =~ /\/usr\/local\/(.*)$/ ) { $datadir = $1; } | 
|  | 0 |  |  |  |  | 0 |  | 
| 4252 |  |  |  |  |  |  |  | 
| 4253 | 0 |  |  |  |  | 0 | my @args = "CGIBINDIR=$cgi"; | 
| 4254 | 0 |  |  |  |  | 0 | push @args, "CGIBINSUBDIR=''"; | 
| 4255 | 0 |  |  |  |  | 0 | push @args, "WEBDATADIR=$datadir"; | 
| 4256 | 0 |  |  |  |  | 0 | push @args, "CACHEDIR=$cachedir"; | 
| 4257 |  |  |  |  |  |  |  | 
| 4258 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "sqwebmail", | 
| 4259 |  |  |  |  |  |  | flags => join( ",", @args ), | 
| 4260 |  |  |  |  |  |  | options => "# Options for sqwebmail-5.6.1 | 
| 4261 |  |  |  |  |  |  | _OPTIONS_READ=sqwebmail-5.6.1 | 
| 4262 |  |  |  |  |  |  | _FILE_COMPLETE_OPTIONS_LIST=AUTH_LDAP AUTH_MYSQL AUTH_PGSQL AUTH_USERDB AUTH_VCHKPW CACHEDIR CHARSET FAM GDBM GZIP HTTPS HTTPS_LOGIN ISPELL MIMETYPES SENTRENAME | 
| 4263 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_LDAP | 
| 4264 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_MYSQL | 
| 4265 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_PGSQL | 
| 4266 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=AUTH_USERDB | 
| 4267 |  |  |  |  |  |  | OPTIONS_FILE_SET+=AUTH_VCHKPW | 
| 4268 |  |  |  |  |  |  | OPTIONS_FILE_SET+=CACHEDIR | 
| 4269 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=CHARSET | 
| 4270 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=FAM | 
| 4271 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=GDBM | 
| 4272 |  |  |  |  |  |  | OPTIONS_FILE_SET+=GZIP | 
| 4273 |  |  |  |  |  |  | OPTIONS_FILE_SET+=HTTPS | 
| 4274 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=HTTPS_LOGIN | 
| 4275 |  |  |  |  |  |  | OPTIONS_FILE_SET+=ISPELL | 
| 4276 |  |  |  |  |  |  | OPTIONS_FILE_SET+=MIMETYPES | 
| 4277 |  |  |  |  |  |  | OPTIONS_FILE_UNSET+=SENTRENAME | 
| 4278 |  |  |  |  |  |  | ", | 
| 4279 |  |  |  |  |  |  | ); | 
| 4280 |  |  |  |  |  |  |  | 
| 4281 | 0 |  |  |  |  | 0 | $self->freebsd->conf_check( | 
| 4282 |  |  |  |  |  |  | check => "sqwebmaild_enable", | 
| 4283 |  |  |  |  |  |  | line  => 'sqwebmaild_enable="YES"', | 
| 4284 |  |  |  |  |  |  | ); | 
| 4285 |  |  |  |  |  |  |  | 
| 4286 | 0 |  |  |  |  | 0 | $self->sqwebmail_conf(); | 
| 4287 |  |  |  |  |  |  |  | 
| 4288 | 0 |  |  |  |  | 0 | print "sqwebmail: starting sqwebmaild.\n"; | 
| 4289 | 0 |  | 0 |  |  | 0 | my $prefix = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 4290 | 0 |  |  |  |  | 0 | my $start  = "$prefix/etc/rc.d/sqwebmail-sqwebmaild"; | 
| 4291 |  |  |  |  |  |  |  | 
| 4292 | 0 | 0 |  |  |  | 0 | -x $start      ? $self->util->syscmd( "$start start" ) | 
|  |  | 0 |  |  |  |  |  | 
| 4293 |  |  |  |  |  |  | : -x "$start.sh" ? $self->util->syscmd( "$start.sh start" ) | 
| 4294 |  |  |  |  |  |  | : carp "could not find the startup file for sqwebmaild!\n"; | 
| 4295 |  |  |  |  |  |  |  | 
| 4296 | 0 |  |  |  |  | 0 | $self->freebsd->is_port_installed( "sqwebmail" ); | 
| 4297 |  |  |  |  |  |  | } | 
| 4298 |  |  |  |  |  |  |  | 
| 4299 |  |  |  |  |  |  | sub stunnel { | 
| 4300 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4301 |  |  |  |  |  |  |  | 
| 4302 | 0 | 0 |  |  |  | 0 | return $self->stunnel_freebsd() if $OSNAME eq 'freebsd'; | 
| 4303 |  |  |  |  |  |  |  | 
| 4304 | 0 |  |  |  |  | 0 | my $stunnel = $self->util->find_bin('stunnel', fatal=>0); | 
| 4305 |  |  |  |  |  |  |  | 
| 4306 | 0 | 0 |  |  |  | 0 | $self->error("stunnel is not installed and you selected pop3_ssl_daemon eq 'qpop3d'. Either install stunnel or change your configuration settings." ) if ! -x $stunnel; | 
| 4307 | 0 |  |  |  |  | 0 | return; | 
| 4308 |  |  |  |  |  |  | }; | 
| 4309 |  |  |  |  |  |  |  | 
| 4310 |  |  |  |  |  |  | sub stunnel_freebsd { | 
| 4311 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4312 | 0 |  |  |  |  | 0 | return $self->freebsd->install_port( "stunnel", | 
| 4313 |  |  |  |  |  |  | options => "# | 
| 4314 |  |  |  |  |  |  | # This file was generated by mail-toaster\n | 
| 4315 |  |  |  |  |  |  | # Options for stunnel-4.33 | 
| 4316 |  |  |  |  |  |  | _OPTIONS_READ=stunnel-4.33 | 
| 4317 |  |  |  |  |  |  | WITHOUT_FORK=true | 
| 4318 |  |  |  |  |  |  | WITH_PTHREAD=true | 
| 4319 |  |  |  |  |  |  | WITHOUT_UCONTEXT=true | 
| 4320 |  |  |  |  |  |  | WITHOUT_DH=true | 
| 4321 |  |  |  |  |  |  | WITHOUT_IPV6=true | 
| 4322 |  |  |  |  |  |  | WITH_LIBWRAP=true\n", | 
| 4323 |  |  |  |  |  |  | ); | 
| 4324 |  |  |  |  |  |  | }; | 
| 4325 |  |  |  |  |  |  |  | 
| 4326 |  |  |  |  |  |  | sub supervise { | 
| 4327 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4328 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 4329 |  |  |  |  |  |  |  | 
| 4330 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; | 
| 4331 |  |  |  |  |  |  |  | 
| 4332 | 0 |  |  |  |  | 0 | $self->toaster->supervise_dirs_create(%p); | 
| 4333 | 0 |  |  |  |  | 0 | $self->toaster->service_dir_create(%p); | 
| 4334 |  |  |  |  |  |  |  | 
| 4335 | 0 |  |  |  |  | 0 | $self->qmail->control_create(%p); | 
| 4336 | 0 |  |  |  |  | 0 | $self->qmail->install_qmail_control_files(%p); | 
| 4337 | 0 |  |  |  |  | 0 | $self->qmail->install_qmail_control_log_files(%p); | 
| 4338 |  |  |  |  |  |  |  | 
| 4339 | 0 |  |  |  |  | 0 | $self->startup_script(); | 
| 4340 | 0 |  |  |  |  | 0 | $self->toaster->service_symlinks(); | 
| 4341 | 0 |  |  |  |  | 0 | $self->qmail->config(); | 
| 4342 | 0 |  |  |  |  | 0 | $self->supervise_startup(%p); | 
| 4343 |  |  |  |  |  |  | }; | 
| 4344 |  |  |  |  |  |  |  | 
| 4345 |  |  |  |  |  |  | sub supervise_startup { | 
| 4346 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4347 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts } ); | 
| 4348 |  |  |  |  |  |  |  | 
| 4349 | 0 |  |  |  |  | 0 | my $svok = $self->util->find_bin( 'svok', verbose => 0); | 
| 4350 | 0 |  | 0 |  |  | 0 | my $svc_dir = $self->conf->{qmail_service} || '/var/service'; | 
| 4351 | 0 | 0 |  |  |  | 0 | if ( (system "$svok $svc_dir/send") == 0 ) { | 
| 4352 | 0 |  |  |  |  | 0 | $self->audit("supervised processes are already started"); | 
| 4353 | 0 |  |  |  |  | 0 | return; | 
| 4354 |  |  |  |  |  |  | }; | 
| 4355 |  |  |  |  |  |  |  | 
| 4356 | 0 |  |  |  |  | 0 | my $start  = $self->util->find_bin( 'services', verbose => 0); | 
| 4357 | 0 |  |  |  |  | 0 | print "\n\nStarting up qmail services (Ctrl-C to cancel). | 
| 4358 |  |  |  |  |  |  |  | 
| 4359 |  |  |  |  |  |  | If there's problems, you can stop all supervised services by running:\n | 
| 4360 |  |  |  |  |  |  | $start stop\n | 
| 4361 |  |  |  |  |  |  | \n\nStarting in 5 seconds: "; | 
| 4362 | 0 |  |  |  |  | 0 | foreach ( 1 .. 5 ) { print '.'; sleep 1; }; | 
|  | 0 |  |  |  |  | 0 |  | 
|  | 0 |  |  |  |  | 0 |  | 
| 4363 | 0 |  |  |  |  | 0 | print "\n"; | 
| 4364 |  |  |  |  |  |  |  | 
| 4365 | 0 |  |  |  |  | 0 | system "$start start"; | 
| 4366 |  |  |  |  |  |  | } | 
| 4367 |  |  |  |  |  |  |  | 
| 4368 |  |  |  |  |  |  | sub startup_script { | 
| 4369 | 0 |  |  | 0 | 1 | 0 | my $self  = shift; | 
| 4370 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 4371 |  |  |  |  |  |  |  | 
| 4372 | 0 |  | 0 |  |  | 0 | my $dl_site = $self->conf->{toaster_dl_site} || "http://www.tnpi.net"; | 
| 4373 | 0 |  |  |  |  | 0 | my $dl_url = "$dl_site/internet/mail/toaster"; | 
| 4374 |  |  |  |  |  |  |  | 
| 4375 |  |  |  |  |  |  | # make sure the service dir is set up | 
| 4376 | 0 | 0 |  |  |  | 0 | return $self->error( "the service directories don't appear to be set up. I refuse to start them until this is fixed.") unless $self->toaster->service_dir_test(); | 
| 4377 |  |  |  |  |  |  |  | 
| 4378 | 0 | 0 |  |  |  | 0 | return $p{test_ok} if defined $p{test_ok}; | 
| 4379 |  |  |  |  |  |  |  | 
| 4380 | 0 | 0 |  |  |  | 0 | return $self->startup_script_freebsd() if $OSNAME eq 'freebsd'; | 
| 4381 | 0 | 0 |  |  |  | 0 | return $self->startup_script_darwin()  if $OSNAME eq 'darwin'; | 
| 4382 |  |  |  |  |  |  |  | 
| 4383 | 0 |  |  |  |  | 0 | $self->error( "There is no startup script support written for $OSNAME. If you know the proper method of doing so, please have a look at $dl_url/start/services.txt, adapt it to $OSNAME, and send it to matt\@tnpi.net." ); | 
| 4384 |  |  |  |  |  |  | }; | 
| 4385 |  |  |  |  |  |  |  | 
| 4386 |  |  |  |  |  |  | sub startup_script_darwin { | 
| 4387 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4388 |  |  |  |  |  |  |  | 
| 4389 | 0 |  |  |  |  | 0 | my $start = "/Library/LaunchDaemons/to.yp.cr.daemontools-svscan.plist"; | 
| 4390 | 0 |  | 0 |  |  | 0 | my $dl_site = $self->conf->{toaster_dl_site} || "http://www.tnpi.net"; | 
| 4391 | 0 |  |  |  |  | 0 | my $dl_url = "$dl_site/internet/mail/toaster"; | 
| 4392 |  |  |  |  |  |  |  | 
| 4393 | 0 | 0 |  |  |  | 0 | unless ( -e $start ) { | 
| 4394 | 0 |  |  |  |  | 0 | $self->util->get_url( "$dl_url/start/to.yp.cr.daemontools-svscan.plist" ); | 
| 4395 | 0 | 0 |  |  |  | 0 | my $r = $self->util->install_if_changed( | 
| 4396 |  |  |  |  |  |  | newfile  => "to.yp.cr.daemontools-svscan.plist", | 
| 4397 |  |  |  |  |  |  | existing => $start, | 
| 4398 |  |  |  |  |  |  | mode     => '0551', | 
| 4399 |  |  |  |  |  |  | clean    => 1, | 
| 4400 |  |  |  |  |  |  | ) or return; | 
| 4401 | 0 | 0 |  |  |  | 0 | $r == 1 ? $r = "ok" : $r = "ok (current)"; | 
| 4402 | 0 |  |  |  |  | 0 | $self->audit( "startup_script: updating $start, $r" ); | 
| 4403 |  |  |  |  |  |  | } | 
| 4404 |  |  |  |  |  |  |  | 
| 4405 | 0 |  | 0 |  |  | 0 | my $prefix = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 4406 | 0 |  |  |  |  | 0 | $start = "$prefix/sbin/services"; | 
| 4407 |  |  |  |  |  |  |  | 
| 4408 | 0 | 0 |  |  |  | 0 | if ( -w $start ) { | 
| 4409 | 0 |  |  |  |  | 0 | $self->util->get_url( "$dl_url/start/services-darwin.txt" ); | 
| 4410 |  |  |  |  |  |  |  | 
| 4411 | 0 | 0 |  |  |  | 0 | my $r = $self->util->install_if_changed( | 
| 4412 |  |  |  |  |  |  | newfile  => "services-darwin.txt", | 
| 4413 |  |  |  |  |  |  | existing => $start, | 
| 4414 |  |  |  |  |  |  | mode     => '0551', | 
| 4415 |  |  |  |  |  |  | clean    => 1, | 
| 4416 |  |  |  |  |  |  | ) or return; | 
| 4417 |  |  |  |  |  |  |  | 
| 4418 | 0 | 0 |  |  |  | 0 | $r == 1 ? $r = "ok" : $r = "ok (current)"; | 
| 4419 |  |  |  |  |  |  |  | 
| 4420 | 0 |  |  |  |  | 0 | $self->audit( "startup_script: updating $start, $r" ); | 
| 4421 |  |  |  |  |  |  | } | 
| 4422 |  |  |  |  |  |  | }; | 
| 4423 |  |  |  |  |  |  |  | 
| 4424 |  |  |  |  |  |  | sub startup_script_freebsd { | 
| 4425 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4426 |  |  |  |  |  |  |  | 
| 4427 |  |  |  |  |  |  | # The FreeBSD port for daemontools includes rc.d/svscan so we use it | 
| 4428 | 0 |  | 0 |  |  | 0 | my $confdir = $self->conf->{system_config_dir} || "/usr/local/etc"; | 
| 4429 | 0 |  |  |  |  | 0 | my $start = "$confdir/rc.d/svscan"; | 
| 4430 |  |  |  |  |  |  |  | 
| 4431 | 0 | 0 |  |  |  | 0 | unless ( -f $start ) { | 
| 4432 | 0 |  |  |  |  | 0 | print "WARNING: no svscan, is daemontools installed?\n"; | 
| 4433 | 0 |  |  |  |  | 0 | print "\n\nInstalling a generic startup file...."; | 
| 4434 |  |  |  |  |  |  |  | 
| 4435 | 0 |  | 0 |  |  | 0 | my $dl_site = $self->conf->{toaster_dl_site} || "http://www.tnpi.net"; | 
| 4436 | 0 |  |  |  |  | 0 | my $dl_url = "$dl_site/internet/mail/toaster"; | 
| 4437 | 0 |  |  |  |  | 0 | $self->util->get_url( "$dl_url/start/services.txt" ); | 
| 4438 | 0 | 0 |  |  |  | 0 | my $r = $self->util->install_if_changed( | 
| 4439 |  |  |  |  |  |  | newfile  => "services.txt", | 
| 4440 |  |  |  |  |  |  | existing => $start, | 
| 4441 |  |  |  |  |  |  | mode     => '0751', | 
| 4442 |  |  |  |  |  |  | clean    => 1, | 
| 4443 |  |  |  |  |  |  | ) or return; | 
| 4444 |  |  |  |  |  |  |  | 
| 4445 | 0 | 0 |  |  |  | 0 | $r == 1 ? $r = "ok" : $r = "ok (current)"; | 
| 4446 |  |  |  |  |  |  |  | 
| 4447 | 0 |  |  |  |  | 0 | $self->audit( "startup_script: updating $start, $r" ); | 
| 4448 |  |  |  |  |  |  | } | 
| 4449 |  |  |  |  |  |  |  | 
| 4450 |  |  |  |  |  |  | $self->freebsd->conf_check( | 
| 4451 | 0 |  |  |  |  | 0 | check => "svscan_enable", | 
| 4452 |  |  |  |  |  |  | line  => 'svscan_enable="YES"', | 
| 4453 |  |  |  |  |  |  | ); | 
| 4454 |  |  |  |  |  |  |  | 
| 4455 |  |  |  |  |  |  | # if the qmail start file is installed, nuke it | 
| 4456 | 0 | 0 |  |  |  | 0 | unlink "$confdir/rc.d/qmail.sh" if -e "$confdir/rc.d/qmail"; | 
| 4457 | 0 | 0 |  |  |  | 0 | unlink "$confdir/rc.d/qmail.sh" if -e "$confdir/rc.d/qmail.sh"; | 
| 4458 |  |  |  |  |  |  |  | 
| 4459 | 0 |  | 0 |  |  | 0 | my $prefix = $self->conf->{toaster_prefix} || "/usr/local"; | 
| 4460 | 0 |  |  |  |  | 0 | my $sym = "$prefix/sbin/services"; | 
| 4461 | 0 | 0 | 0 |  |  | 0 | return 1 if ( -l $sym && -x $sym ); # already exists | 
| 4462 |  |  |  |  |  |  |  | 
| 4463 | 0 | 0 | 0 |  |  | 0 | unlink $sym | 
| 4464 |  |  |  |  |  |  | or return $self->error( "Please [re]move '$sym' and run again.",fatal=>0) if -e $sym; | 
| 4465 |  |  |  |  |  |  |  | 
| 4466 | 0 |  |  |  |  | 0 | symlink( $start, $sym ); | 
| 4467 | 0 |  |  |  |  | 0 | $self->audit( "startup_script: added $sym as symlink to $start"); | 
| 4468 |  |  |  |  |  |  | }; | 
| 4469 |  |  |  |  |  |  |  | 
| 4470 |  |  |  |  |  |  | sub tcp_smtp { | 
| 4471 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4472 | 0 |  |  |  |  | 0 | my %p = validate( @_, { etc_dir => SCALAR } ); | 
| 4473 |  |  |  |  |  |  |  | 
| 4474 | 0 |  |  |  |  | 0 | my $etc_dir = $p{etc_dir}; | 
| 4475 |  |  |  |  |  |  |  | 
| 4476 |  |  |  |  |  |  | # test for an existing one | 
| 4477 | 0 | 0 |  |  |  | 0 | if ( -s "$etc_dir/tcp.smtp" ) { | 
| 4478 | 0 |  |  |  |  | 0 | my $count = $self->util->file_read( "$etc_dir/tcp.smtp" ); | 
| 4479 | 0 | 0 |  |  |  | 0 | if ( $count > 1 ) { | 
| 4480 | 0 |  |  |  |  | 0 | return $self->audit("$etc_dir/tcp.smtp has customizations"); | 
| 4481 |  |  |  |  |  |  | }; | 
| 4482 | 0 |  |  |  |  | 0 | $self->util->archive_file( "$etc_dir/tcp.smtp" ); # back it up | 
| 4483 |  |  |  |  |  |  | } | 
| 4484 |  |  |  |  |  |  |  | 
| 4485 | 0 |  |  |  |  | 0 | my $qdir = $self->qmail->get_qmail_dir; | 
| 4486 |  |  |  |  |  |  |  | 
| 4487 | 0 |  |  |  |  | 0 | my @lines = <<"EO_TCP_SMTP"; | 
| 4488 |  |  |  |  |  |  | # RELAYCLIENT="" means IP can relay | 
| 4489 |  |  |  |  |  |  | # RBLSMTPD=""    means DNSBLs are ignored for this IP | 
| 4490 |  |  |  |  |  |  | # QMAILQUEUE=""  is the qmail queue process, defaults to $qdir/bin/qmail-queue | 
| 4491 |  |  |  |  |  |  | # CHKUSER_MBXQUOTA rejects messages when the users mailbox quota is filled | 
| 4492 |  |  |  |  |  |  | # | 
| 4493 |  |  |  |  |  |  | #    common QMAILQUEUE settings: | 
| 4494 |  |  |  |  |  |  | # QMAILQUEUE="$qdir/bin/qmail-queue" | 
| 4495 |  |  |  |  |  |  | # QMAILQUEUE="$qdir/bin/simscan" | 
| 4496 |  |  |  |  |  |  | # | 
| 4497 |  |  |  |  |  |  | #      handy test settings | 
| 4498 |  |  |  |  |  |  | # 127.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="$qdir/bin/simscan" | 
| 4499 |  |  |  |  |  |  | # 127.:allow,RELAYCLIENT="",RBLSMTPD="",QMAILQUEUE="$qdir/bin/qscanq/bin/qscanq" | 
| 4500 |  |  |  |  |  |  | 127.0.0.1:allow,RELAYCLIENT="",RBLSMTPD="" | 
| 4501 |  |  |  |  |  |  |  | 
| 4502 |  |  |  |  |  |  | # | 
| 4503 |  |  |  |  |  |  | # Allow anyone with reverse DNS set up | 
| 4504 |  |  |  |  |  |  | #=:allow | 
| 4505 |  |  |  |  |  |  | #    soft block on no reverse DNS | 
| 4506 |  |  |  |  |  |  | #:allow,RBLSMTPD="Blocked - Reverse DNS queries for your IP fail. Fix your DNS!" | 
| 4507 |  |  |  |  |  |  | #    hard block on no reverse DNS | 
| 4508 |  |  |  |  |  |  | #:allow,RBLSMTPD="-Blocked - Reverse DNS queries for your IP fail. You cannot send me mail." | 
| 4509 |  |  |  |  |  |  | #    default allow | 
| 4510 |  |  |  |  |  |  | #:allow,QMAILQUEUE="$qdir/bin/simscan",CHKUSER_MBXQUOTA="99" | 
| 4511 |  |  |  |  |  |  | :allow,CHKUSER_MBXQUOTA="99" | 
| 4512 |  |  |  |  |  |  | EO_TCP_SMTP | 
| 4513 |  |  |  |  |  |  | ; | 
| 4514 | 0 |  |  |  |  | 0 | $self->util->file_write( "$etc_dir/tcp.smtp", lines => \@lines, mode => '0644' ); | 
| 4515 |  |  |  |  |  |  | } | 
| 4516 |  |  |  |  |  |  |  | 
| 4517 |  |  |  |  |  |  | sub tcp_smtp_cdb { | 
| 4518 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4519 | 0 |  |  |  |  | 0 | my %p = validate( @_, { 'etc_dir' => SCALAR } ); | 
| 4520 | 0 |  |  |  |  | 0 | my $dir = $p{etc_dir}; | 
| 4521 |  |  |  |  |  |  |  | 
| 4522 | 0 |  |  |  |  | 0 | my $tcprules = $self->util->find_bin('tcprules'); | 
| 4523 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$tcprules $dir/tcp.smtp.cdb $dir/tcp.smtp.tmp < $dir/tcp.smtp" ) | 
| 4524 |  |  |  |  |  |  | or return; | 
| 4525 | 0 |  |  |  |  | 0 | chmod 0644, "$dir/tcp.smtp"; | 
| 4526 | 0 |  |  |  |  | 0 | chmod 0644, "$dir/tcp.smtp.cdb"; | 
| 4527 | 0 |  |  |  |  | 0 | print "Reloaded $dir/tcp.smtp"; | 
| 4528 | 0 |  |  |  |  | 0 | return 1; | 
| 4529 |  |  |  |  |  |  | }; | 
| 4530 |  |  |  |  |  |  |  | 
| 4531 |  |  |  |  |  |  | sub test { | 
| 4532 | 0 |  |  | 0 | 1 | 0 | require Mail::Toaster::Setup::Test; | 
| 4533 | 0 |  |  |  |  | 0 | return Mail::Toaster::Setup::Test->new; | 
| 4534 |  |  |  |  |  |  | }; | 
| 4535 |  |  |  |  |  |  |  | 
| 4536 |  |  |  |  |  |  | sub ucspi_tcp { | 
| 4537 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4538 | 0 |  |  |  |  | 0 | my %p = validate( @_, { $self->get_std_opts },); | 
| 4539 |  |  |  |  |  |  |  | 
| 4540 |  |  |  |  |  |  | # pre-declarations. We configure these for each platform and use them | 
| 4541 |  |  |  |  |  |  | # at the end to build ucspi_tcp from source. | 
| 4542 |  |  |  |  |  |  |  | 
| 4543 | 0 |  |  |  |  | 0 | my $patches = []; | 
| 4544 | 0 |  |  |  |  | 0 | my @targets = ( 'make', 'make setup check' ); | 
| 4545 |  |  |  |  |  |  |  | 
| 4546 | 0 | 0 | 0 |  |  | 0 | if ( $self->conf->{install_mysql} && $self->conf->{vpopmail_mysql} ) { | 
| 4547 | 0 |  |  |  |  | 0 | $patches = ["ucspi-tcp-0.88-mysql+rss.patch"]; | 
| 4548 |  |  |  |  |  |  | } | 
| 4549 |  |  |  |  |  |  |  | 
| 4550 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq "freebsd" ) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 4551 |  |  |  |  |  |  | # install it from ports so it is registered in the ports db | 
| 4552 | 0 |  |  |  |  | 0 | $self->ucspi_tcp_freebsd(); | 
| 4553 |  |  |  |  |  |  | } | 
| 4554 |  |  |  |  |  |  | elsif ( $OSNAME eq "darwin" ) { | 
| 4555 | 0 |  |  |  |  | 0 | $patches = ["ucspi-tcp-0.88-mysql+rss-darwin.patch"]; | 
| 4556 | 0 |  |  |  |  | 0 | @targets = $self->ucspi_tcp_darwin(); | 
| 4557 |  |  |  |  |  |  | } | 
| 4558 |  |  |  |  |  |  | elsif ( $OSNAME eq "linux" ) { | 
| 4559 | 0 |  |  |  |  | 0 | @targets = ( | 
| 4560 |  |  |  |  |  |  | "echo gcc -O2 -include /usr/include/errno.h > conf-cc", | 
| 4561 |  |  |  |  |  |  | "make", "make setup check" | 
| 4562 |  |  |  |  |  |  | ); | 
| 4563 |  |  |  |  |  |  |  | 
| 4564 |  |  |  |  |  |  | #		Need to test MySQL patch on linux before enabling it. | 
| 4565 |  |  |  |  |  |  | #		$patches = ['ucspi-tcp-0.88-mysql+rss.patch', 'ucspi-tcp-0.88.errno.patch']; | 
| 4566 |  |  |  |  |  |  | #		$patch_args = "-p0"; | 
| 4567 |  |  |  |  |  |  | } | 
| 4568 |  |  |  |  |  |  |  | 
| 4569 |  |  |  |  |  |  | # see if it is installed | 
| 4570 | 0 |  |  |  |  | 0 | my $tcpserver = $self->util->find_bin( "tcpserver", fatal => 0, verbose=>0 ); | 
| 4571 | 0 | 0 |  |  |  | 0 | if ( $tcpserver ) { | 
| 4572 | 0 | 0 | 0 |  |  | 0 | if ( ! $self->conf->{install_mysql} || !$self->conf->{vpopmail_mysql} ) { | 
| 4573 | 0 |  |  |  |  | 0 | $self->audit( "ucspi-tcp: install, ok (exists)" ); | 
| 4574 | 0 |  |  |  |  | 0 | return 2; # we don't need mysql | 
| 4575 |  |  |  |  |  |  | } | 
| 4576 | 0 |  |  |  |  | 0 | my $strings = $self->util->find_bin( "strings", verbose=>0 ); | 
| 4577 | 0 | 0 |  |  |  | 0 | if ( grep {/sql/} `$strings $tcpserver` ) { | 
|  | 0 |  |  |  |  | 0 |  | 
| 4578 | 0 |  |  |  |  | 0 | $self->audit( "ucspi-tcp: mysql support check, ok (exists)" ); | 
| 4579 | 0 |  |  |  |  | 0 | return 1; | 
| 4580 |  |  |  |  |  |  | } | 
| 4581 | 0 |  |  |  |  | 0 | $self->audit( "ucspi-tcp is installed but w/o mysql support, " . | 
| 4582 |  |  |  |  |  |  | "compiling from sources."); | 
| 4583 |  |  |  |  |  |  | } | 
| 4584 |  |  |  |  |  |  |  | 
| 4585 |  |  |  |  |  |  | # save some bandwidth | 
| 4586 | 0 | 0 |  |  |  | 0 | if ( -e "/usr/ports/distfiles/ucspi-tcp-0.88.tar.gz" ) { | 
| 4587 | 0 |  |  |  |  | 0 | copy( "/usr/ports/distfiles/ucspi-tcp-0.88.tar.gz", | 
| 4588 |  |  |  |  |  |  | "/usr/local/src/ucspi-tcp-0.88.tar.gz" | 
| 4589 |  |  |  |  |  |  | ); | 
| 4590 |  |  |  |  |  |  | } | 
| 4591 |  |  |  |  |  |  |  | 
| 4592 |  |  |  |  |  |  | $self->util->install_from_source( | 
| 4593 |  |  |  |  |  |  | package   => "ucspi-tcp-0.88", | 
| 4594 |  |  |  |  |  |  | patches   => $patches, | 
| 4595 | 0 |  |  |  |  | 0 | patch_url => $self->conf->{toaster_dl_site} . $self->conf->{toaster_dl_url} . "/patches", | 
| 4596 |  |  |  |  |  |  | site      => 'http://cr.yp.to', | 
| 4597 |  |  |  |  |  |  | url       => '/ucspi-tcp', | 
| 4598 |  |  |  |  |  |  | targets   => \@targets, | 
| 4599 |  |  |  |  |  |  | ); | 
| 4600 |  |  |  |  |  |  |  | 
| 4601 | 0 | 0 |  |  |  | 0 | return $self->util->find_bin( "tcpserver", fatal => 0, verbose => 0 ) ? 1 : 0; | 
| 4602 |  |  |  |  |  |  | } | 
| 4603 |  |  |  |  |  |  |  | 
| 4604 |  |  |  |  |  |  | sub ucspi_tcp_darwin { | 
| 4605 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4606 |  |  |  |  |  |  |  | 
| 4607 | 0 |  |  |  |  | 0 | my @targets = "echo '/opt/local' > conf-home"; | 
| 4608 |  |  |  |  |  |  |  | 
| 4609 | 0 | 0 |  |  |  | 0 | if ( $self->conf->{vpopmail_mysql} ) { | 
| 4610 | 0 |  |  |  |  | 0 | my $mysql_prefix = "/opt/local"; | 
| 4611 | 0 | 0 |  |  |  | 0 | if ( !-d "$mysql_prefix/include/mysql" ) { | 
| 4612 | 0 | 0 |  |  |  | 0 | if ( -d "/usr/include/mysql" ) { | 
| 4613 | 0 |  |  |  |  | 0 | $mysql_prefix = "/usr"; | 
| 4614 |  |  |  |  |  |  | } | 
| 4615 |  |  |  |  |  |  | } | 
| 4616 | 0 |  |  |  |  | 0 | push @targets, | 
| 4617 |  |  |  |  |  |  | "echo 'gcc -s -I$mysql_prefix/include/mysql -L$mysql_prefix/lib/mysql -lmysqlclient' > conf-ld"; | 
| 4618 | 0 |  |  |  |  | 0 | push @targets, | 
| 4619 |  |  |  |  |  |  | "echo 'gcc -O2 -I$mysql_prefix/include/mysql' > conf-cc"; | 
| 4620 |  |  |  |  |  |  | } | 
| 4621 |  |  |  |  |  |  |  | 
| 4622 | 0 |  |  |  |  | 0 | push @targets, "make"; | 
| 4623 | 0 |  |  |  |  | 0 | push @targets, "make setup"; | 
| 4624 | 0 |  |  |  |  | 0 | return @targets; | 
| 4625 |  |  |  |  |  |  | }; | 
| 4626 |  |  |  |  |  |  |  | 
| 4627 |  |  |  |  |  |  | sub ucspi_tcp_freebsd { | 
| 4628 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4629 | 0 |  |  |  |  | 0 | $self->freebsd->install_port( "ucspi-tcp", | 
| 4630 |  |  |  |  |  |  | flags   => "BATCH=yes WITH_RSS_DIFF=1", | 
| 4631 |  |  |  |  |  |  | options => "#\n# This file is auto-generated by 'make config'. | 
| 4632 |  |  |  |  |  |  | # No user-servicable parts inside! | 
| 4633 |  |  |  |  |  |  | # Options for ucspi-tcp-0.88_2 | 
| 4634 |  |  |  |  |  |  | _OPTIONS_READ=ucspi-tcp-0.88_2 | 
| 4635 |  |  |  |  |  |  | WITHOUT_MAN=true | 
| 4636 |  |  |  |  |  |  | WITH_RSS_DIFF=true | 
| 4637 |  |  |  |  |  |  | WITHOUT_SSL=true | 
| 4638 |  |  |  |  |  |  | WITHOUT_RBL2SMTPD=true\n", | 
| 4639 |  |  |  |  |  |  | ); | 
| 4640 |  |  |  |  |  |  | }; | 
| 4641 |  |  |  |  |  |  |  | 
| 4642 |  |  |  |  |  |  | sub ucspi_test { | 
| 4643 | 0 |  |  | 0 | 0 | 0 | my $self  = shift; | 
| 4644 |  |  |  |  |  |  |  | 
| 4645 | 0 |  |  |  |  | 0 | print "checking ucspi-tcp binaries...\n"; | 
| 4646 | 0 |  |  |  |  | 0 | foreach (qw( tcprules tcpserver rblsmtpd tcpclient recordio )) { | 
| 4647 | 0 |  |  |  |  | 0 | $self->test->pretty("  $_", $self->util->find_bin( $_, fatal => 0, verbose=>0 ) ); | 
| 4648 |  |  |  |  |  |  | } | 
| 4649 |  |  |  |  |  |  |  | 
| 4650 | 0 | 0 | 0 |  |  | 0 | if ( $self->conf->{install_mysql} && $self->conf->{vpopmail_mysql} ) { | 
| 4651 | 0 |  |  |  |  | 0 | my $tcpserver = $self->util->find_bin( "tcpserver", fatal => 0, verbose=>0 ); | 
| 4652 | 0 |  |  |  |  | 0 | $self->test->pretty( "  tcpserver mysql support", | 
| 4653 |  |  |  |  |  |  | scalar `strings $tcpserver | grep sql` | 
| 4654 |  |  |  |  |  |  | ); | 
| 4655 |  |  |  |  |  |  | } | 
| 4656 |  |  |  |  |  |  |  | 
| 4657 | 0 |  |  |  |  | 0 | return 1; | 
| 4658 |  |  |  |  |  |  | } | 
| 4659 |  |  |  |  |  |  |  | 
| 4660 |  |  |  |  |  |  | sub user_add { | 
| 4661 | 0 |  |  | 0 | 0 | 0 | my ($self, $user, $uid, $gid, %opts) = @_; | 
| 4662 |  |  |  |  |  |  |  | 
| 4663 | 0 | 0 |  |  |  | 0 | return if ! $user; | 
| 4664 | 0 | 0 |  |  |  | 0 | return if $self->user_exists($user); | 
| 4665 |  |  |  |  |  |  |  | 
| 4666 | 0 |  |  |  |  | 0 | my $homedir = $opts{homedir}; | 
| 4667 | 0 |  | 0 |  |  | 0 | my $shell = $opts{shell} || '/sbin/nologin'; | 
| 4668 |  |  |  |  |  |  |  | 
| 4669 | 0 |  |  |  |  | 0 | my $cmd; | 
| 4670 | 0 | 0 |  |  |  | 0 | if ( $OSNAME eq 'linux' ) { | 
|  |  | 0 |  |  |  |  |  | 
|  |  | 0 |  |  |  |  |  | 
| 4671 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( 'useradd' ); | 
| 4672 | 0 |  |  |  |  | 0 | $cmd .= " -s $shell"; | 
| 4673 | 0 | 0 |  |  |  | 0 | $cmd .= " -d $homedir" if $homedir; | 
| 4674 | 0 | 0 |  |  |  | 0 | $cmd .= " -u $uid" if $uid; | 
| 4675 | 0 | 0 |  |  |  | 0 | $cmd .= " -g $gid" if $gid; | 
| 4676 | 0 |  |  |  |  | 0 | $cmd .= " -m $user"; | 
| 4677 |  |  |  |  |  |  | } | 
| 4678 |  |  |  |  |  |  | elsif ( $OSNAME eq 'freebsd' ) { | 
| 4679 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( 'pw' ); | 
| 4680 | 0 |  |  |  |  | 0 | $cmd .= " useradd -n $user -s $shell"; | 
| 4681 | 0 | 0 |  |  |  | 0 | $cmd .= " -d $homedir" if $homedir; | 
| 4682 | 0 | 0 |  |  |  | 0 | $cmd .= " -u $uid " if $uid; | 
| 4683 | 0 | 0 |  |  |  | 0 | $cmd .= " -g $gid " if $gid; | 
| 4684 | 0 |  |  |  |  | 0 | $cmd .= " -m -h-"; | 
| 4685 |  |  |  |  |  |  | } | 
| 4686 |  |  |  |  |  |  | elsif ( $OSNAME eq 'darwin' ) { | 
| 4687 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( 'dscl', fatal => 0 ); | 
| 4688 | 0 |  |  |  |  | 0 | my $path = "/users/$user"; | 
| 4689 | 0 | 0 |  |  |  | 0 | if ( $cmd ) { | 
| 4690 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -create $path" ); | 
| 4691 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path uid $uid"); | 
| 4692 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path gid $gid"); | 
| 4693 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path shell $shell" ); | 
| 4694 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path home $homedir" ) if $homedir; | 
| 4695 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd . -createprop $path passwd '*'" ); | 
| 4696 |  |  |  |  |  |  | } | 
| 4697 |  |  |  |  |  |  | else { | 
| 4698 | 0 |  |  |  |  | 0 | $cmd = $self->util->find_bin( 'niutil' ); | 
| 4699 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path uid $uid"); | 
| 4700 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path gid $gid"); | 
| 4701 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path shell $shell"); | 
| 4702 | 0 | 0 |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path home $homedir" ) if $homedir; | 
| 4703 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path _shadow_passwd"); | 
| 4704 | 0 |  |  |  |  | 0 | $self->util->syscmd( "$cmd -createprop . $path passwd '*'"); | 
| 4705 |  |  |  |  |  |  | }; | 
| 4706 | 0 |  |  |  |  | 0 | return 1; | 
| 4707 |  |  |  |  |  |  | } | 
| 4708 |  |  |  |  |  |  | else { | 
| 4709 | 0 |  |  |  |  | 0 | warn "cannot add user on OS $OSNAME\n"; | 
| 4710 | 0 |  |  |  |  | 0 | return; | 
| 4711 |  |  |  |  |  |  | }; | 
| 4712 | 0 |  |  |  |  | 0 | return $self->util->syscmd( $cmd ); | 
| 4713 |  |  |  |  |  |  | }; | 
| 4714 |  |  |  |  |  |  |  | 
| 4715 |  |  |  |  |  |  | sub user_exists { | 
| 4716 | 0 |  |  | 0 | 0 | 0 | my $self = shift; | 
| 4717 | 0 | 0 |  |  |  | 0 | my $user = lc(shift) or die "missing user"; | 
| 4718 | 0 |  |  |  |  | 0 | my $uid = getpwnam($user); | 
| 4719 | 0 | 0 | 0 |  |  | 0 | return ( $uid && $uid > 0 ) ? $uid : undef; | 
| 4720 |  |  |  |  |  |  | }; | 
| 4721 |  |  |  |  |  |  |  | 
| 4722 |  |  |  |  |  |  | sub vpopmail { | 
| 4723 | 3 |  |  | 3 | 0 | 950 | require Mail::Toaster::Setup::Vpopmail; | 
| 4724 | 3 |  |  |  |  | 21 | return Mail::Toaster::Setup::Vpopmail->new; | 
| 4725 |  |  |  |  |  |  | }; | 
| 4726 |  |  |  |  |  |  |  | 
| 4727 |  |  |  |  |  |  | sub vqadmin { | 
| 4728 | 3 |  |  | 3 | 0 | 11 | my $self  = shift; | 
| 4729 | 3 |  |  |  |  | 7 | my %p = validate( @_, { $self->get_std_opts },); | 
| 4730 |  |  |  |  |  |  |  | 
| 4731 | 3 | 100 |  |  |  | 18 | return $p{test_ok} if defined $p{test_ok}; # for testing | 
| 4732 |  |  |  |  |  |  |  | 
| 4733 | 1 | 50 |  |  |  | 3 | if ( ! $self->conf->{install_vqadmin} ) { | 
| 4734 | 1 |  |  |  |  | 3 | $self->audit( "vqadmin: installing, skipping (disabled)" ); | 
| 4735 | 1 |  |  |  |  | 3 | return; | 
| 4736 |  |  |  |  |  |  | } | 
| 4737 |  |  |  |  |  |  |  | 
| 4738 | 0 |  | 0 |  |  |  | my $cgi  = $self->conf->{toaster_cgi_bin}   || "/usr/local/www/cgi-bin"; | 
| 4739 | 0 |  | 0 |  |  |  | my $data = $self->conf->{toaster_http_docs} || "/usr/local/www/data"; | 
| 4740 |  |  |  |  |  |  |  | 
| 4741 | 0 | 0 | 0 |  |  |  | if ( $cgi && $cgi =~ /\/usr\/local\/(.*)$/ ) { | 
| 4742 | 0 |  |  |  |  |  | $cgi = $1; | 
| 4743 | 0 | 0 |  |  |  |  | chop $cgi if $cgi =~ /\/$/; # remove trailing / | 
| 4744 |  |  |  |  |  |  | } | 
| 4745 |  |  |  |  |  |  |  | 
| 4746 | 0 | 0 |  |  |  |  | if ( $data =~ /\/usr\/local\/(.*)$/ ) { | 
| 4747 | 0 | 0 |  |  |  |  | chop $data if $data =~ /\/$/; # remove trailing / | 
| 4748 | 0 |  |  |  |  |  | $data = $1; | 
| 4749 |  |  |  |  |  |  | } | 
| 4750 |  |  |  |  |  |  |  | 
| 4751 | 0 |  |  |  |  |  | my @defs = 'CGIBINDIR="' . $cgi . '"'; | 
| 4752 | 0 |  |  |  |  |  | push @defs, 'WEBDATADIR="' . $data . '"'; | 
| 4753 |  |  |  |  |  |  |  | 
| 4754 | 0 | 0 |  |  |  |  | return $p{test_ok} if defined $p{test_ok}; # for testing only | 
| 4755 |  |  |  |  |  |  |  | 
| 4756 | 0 | 0 |  |  |  |  | if ( $OSNAME eq "freebsd" ) { | 
| 4757 | 0 | 0 |  |  |  |  | $self->freebsd->install_port( "vqadmin", flags => join( ",", @defs ) ) | 
| 4758 |  |  |  |  |  |  | and return 1; | 
| 4759 |  |  |  |  |  |  | } | 
| 4760 |  |  |  |  |  |  |  | 
| 4761 | 0 |  |  |  |  |  | my $make  = $self->util->find_bin("gmake", fatal=>0, verbose=>0); | 
| 4762 | 0 |  | 0 |  |  |  | $make   ||= $self->util->find_bin("make", fatal=>0, verbose=>0); | 
| 4763 |  |  |  |  |  |  |  | 
| 4764 | 0 |  |  |  |  |  | print "trying to build vqadmin from sources\n"; | 
| 4765 |  |  |  |  |  |  |  | 
| 4766 | 0 |  |  |  |  |  | $self->util->install_from_source( | 
| 4767 |  |  |  |  |  |  | package        => "vqadmin", | 
| 4768 |  |  |  |  |  |  | site           => "http://vpopmail.sf.net", | 
| 4769 |  |  |  |  |  |  | url            => "/downloads", | 
| 4770 |  |  |  |  |  |  | targets        => [ "./configure ", $make, "$make install-strip" ], | 
| 4771 |  |  |  |  |  |  | source_sub_dir => 'mail', | 
| 4772 |  |  |  |  |  |  | ); | 
| 4773 |  |  |  |  |  |  | } | 
| 4774 |  |  |  |  |  |  |  | 
| 4775 |  |  |  |  |  |  | sub webmail { | 
| 4776 | 0 |  |  | 0 | 0 |  | my $self  = shift; | 
| 4777 | 0 |  |  |  |  |  | my %p = validate( @_, { $self->get_std_opts },); | 
| 4778 |  |  |  |  |  |  |  | 
| 4779 |  |  |  |  |  |  | # if the cgi_files dir is not available, we can't do much. | 
| 4780 | 0 |  |  |  |  |  | my $tver = $Mail::Toaster::VERSION; | 
| 4781 | 0 |  |  |  |  |  | my $dir = './cgi_files'; | 
| 4782 | 0 | 0 |  |  |  |  | if ( ! -d $dir ) { | 
| 4783 | 0 | 0 |  |  |  |  | if ( -d "/usr/local/src/Mail-Toaster-$tver/cgi_files" ) { | 
| 4784 | 0 |  |  |  |  |  | $dir = "/usr/local/src/Mail-Toaster-$tver/cgi_files"; | 
| 4785 |  |  |  |  |  |  | } | 
| 4786 |  |  |  |  |  |  | }; | 
| 4787 |  |  |  |  |  |  |  | 
| 4788 | 0 | 0 |  |  |  |  | return $self->error( "You need to run this target while in the Mail::Toaster directory!\n" | 
| 4789 |  |  |  |  |  |  | . "Try this instead: | 
| 4790 |  |  |  |  |  |  |  | 
| 4791 |  |  |  |  |  |  | cd /usr/local/src/Mail-Toaster-$tver | 
| 4792 |  |  |  |  |  |  | bin/toaster_setup.pl -s webmail | 
| 4793 |  |  |  |  |  |  |  | 
| 4794 |  |  |  |  |  |  | You are currently in " . Cwd::cwd ) if ! -d $dir; | 
| 4795 |  |  |  |  |  |  |  | 
| 4796 |  |  |  |  |  |  | # set the hostname in mt-script.js | 
| 4797 | 0 |  |  |  |  |  | my $hostname = $self->conf->{toaster_hostname}; | 
| 4798 |  |  |  |  |  |  |  | 
| 4799 | 0 |  |  |  |  |  | my @lines = $self->util->file_read("$dir/mt-script.js"); | 
| 4800 | 0 |  |  |  |  |  | foreach my $line ( @lines ) { | 
| 4801 | 0 | 0 |  |  |  |  | if ( $line =~ /\Avar mailhost / ) { | 
| 4802 | 0 |  |  |  |  |  | $line = qq{var mailhost = 'https://$hostname'}; | 
| 4803 |  |  |  |  |  |  | }; | 
| 4804 |  |  |  |  |  |  | } | 
| 4805 | 0 |  |  |  |  |  | $self->util->file_write( "$dir/mt-script.js", lines => \@lines ); | 
| 4806 |  |  |  |  |  |  |  | 
| 4807 | 0 |  | 0 |  |  |  | my $htdocs = $self->conf->{toaster_http_docs} || '/usr/local/www/toaster'; | 
| 4808 | 0 | 0 |  |  |  |  | my $rsync = $self->rsync() or return; | 
| 4809 |  |  |  |  |  |  |  | 
| 4810 | 0 |  |  |  |  |  | my $cmd = "$rsync -av $dir/ $htdocs/"; | 
| 4811 | 0 |  |  |  |  |  | print "about to run cmd: $cmd\n"; | 
| 4812 |  |  |  |  |  |  |  | 
| 4813 | 0 |  |  |  |  |  | print "\a"; | 
| 4814 | 0 | 0 |  |  |  |  | return if ! $self->util->yes_or_no( | 
| 4815 |  |  |  |  |  |  | "\n\n\t CAUTION! DANGER! CAUTION! | 
| 4816 |  |  |  |  |  |  |  | 
| 4817 |  |  |  |  |  |  | This action will install the Mail::Toaster webmail interface. Doing | 
| 4818 |  |  |  |  |  |  | so may overwrite existing files in $htdocs. Is is safe to proceed?\n\n", | 
| 4819 |  |  |  |  |  |  | timeout  => 60, | 
| 4820 |  |  |  |  |  |  | ); | 
| 4821 |  |  |  |  |  |  |  | 
| 4822 | 0 |  |  |  |  |  | $self->util->syscmd( $cmd ); | 
| 4823 | 0 |  |  |  |  |  | return 1; | 
| 4824 |  |  |  |  |  |  | }; | 
| 4825 |  |  |  |  |  |  |  | 
| 4826 |  |  |  |  |  |  | 1; | 
| 4827 |  |  |  |  |  |  | __END__; | 
| 4828 |  |  |  |  |  |  |  | 
| 4829 |  |  |  |  |  |  |  | 
| 4830 |  |  |  |  |  |  | =head1 NAME | 
| 4831 |  |  |  |  |  |  |  | 
| 4832 |  |  |  |  |  |  | Mail::Toaster::Setup -  methods to configure and build all the components of a modern email server. | 
| 4833 |  |  |  |  |  |  |  | 
| 4834 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 4835 |  |  |  |  |  |  |  | 
| 4836 |  |  |  |  |  |  | The meat and potatoes of toaster_setup.pl. This is where the majority of the work gets done. Big chunks of the code and logic for getting all the various applications and scripts installed and configured resides in here. | 
| 4837 |  |  |  |  |  |  |  | 
| 4838 |  |  |  |  |  |  |  | 
| 4839 |  |  |  |  |  |  | =head1 METHODS | 
| 4840 |  |  |  |  |  |  |  | 
| 4841 |  |  |  |  |  |  | All documented methods in this package (shown below) accept two optional arguments, verbose and fatal. Setting verbose to zero will supress nearly all informational and debugging output. If you want more output, simply pass along verbose=>1 and status messages will print out. Fatal allows you to override the default behaviour of these methods, which is to die upon error. Each sub returns 0 if the action failed and 1 for success. | 
| 4842 |  |  |  |  |  |  |  | 
| 4843 |  |  |  |  |  |  | arguments required: | 
| 4844 |  |  |  |  |  |  | varies (most require conf) | 
| 4845 |  |  |  |  |  |  |  | 
| 4846 |  |  |  |  |  |  | arguments optional: | 
| 4847 |  |  |  |  |  |  | verbose - print status messages | 
| 4848 |  |  |  |  |  |  | fatal   - die on errors (default) | 
| 4849 |  |  |  |  |  |  |  | 
| 4850 |  |  |  |  |  |  | result: | 
| 4851 |  |  |  |  |  |  | 0 - failure | 
| 4852 |  |  |  |  |  |  | 1 - success | 
| 4853 |  |  |  |  |  |  |  | 
| 4854 |  |  |  |  |  |  | =over | 
| 4855 |  |  |  |  |  |  |  | 
| 4856 |  |  |  |  |  |  | =item new | 
| 4857 |  |  |  |  |  |  |  | 
| 4858 |  |  |  |  |  |  | To use any methods in Mail::Toaster::Setup, you must create a setup object: | 
| 4859 |  |  |  |  |  |  |  | 
| 4860 |  |  |  |  |  |  | use Mail::Toaster::Setup; | 
| 4861 |  |  |  |  |  |  | my $setup = Mail::Toaster::Setup->new; | 
| 4862 |  |  |  |  |  |  |  | 
| 4863 |  |  |  |  |  |  | From there you can run any of the following methods via $setup->method as documented below. | 
| 4864 |  |  |  |  |  |  |  | 
| 4865 |  |  |  |  |  |  | Many of the methods require $conf, which is a hashref containing the contents of toaster-watcher.conf. | 
| 4866 |  |  |  |  |  |  |  | 
| 4867 |  |  |  |  |  |  | =item clamav | 
| 4868 |  |  |  |  |  |  |  | 
| 4869 |  |  |  |  |  |  | Install ClamAV, configure the startup and config files, download the latest virus definitions, and start up the daemons. | 
| 4870 |  |  |  |  |  |  |  | 
| 4871 |  |  |  |  |  |  |  | 
| 4872 |  |  |  |  |  |  | =item config - personalize your toaster-watcher.conf settings | 
| 4873 |  |  |  |  |  |  |  | 
| 4874 |  |  |  |  |  |  | There are a subset of the settings in toaster-watcher.conf which must be personalized for your server. Things like the hostname, where you store your configuration files, html documents, passwords, etc. This function checks to make sure these settings have been changed and prompts for any necessary changes. | 
| 4875 |  |  |  |  |  |  |  | 
| 4876 |  |  |  |  |  |  | required arguments: | 
| 4877 |  |  |  |  |  |  | conf | 
| 4878 |  |  |  |  |  |  |  | 
| 4879 |  |  |  |  |  |  |  | 
| 4880 |  |  |  |  |  |  | =item config_tweaks | 
| 4881 |  |  |  |  |  |  |  | 
| 4882 |  |  |  |  |  |  | Makes changes to the config file, dynamically based on detected circumstances such as a jailed hostname, or OS platform. Platforms like FreeBSD, Darwin, and Debian have package management capabilities. Rather than installing software via sources, we prefer to try using the package manager first. The toaster-watcher.conf file typically includes the latest stable version of each application to install. This subroutine will replace those version numbers with with 'port', 'package', or other platform specific tweaks. | 
| 4883 |  |  |  |  |  |  |  | 
| 4884 |  |  |  |  |  |  | =item daemontools | 
| 4885 |  |  |  |  |  |  |  | 
| 4886 |  |  |  |  |  |  | Fetches sources from DJB's web site and installs daemontools, per his instructions. | 
| 4887 |  |  |  |  |  |  |  | 
| 4888 |  |  |  |  |  |  | =item dependencies | 
| 4889 |  |  |  |  |  |  |  | 
| 4890 |  |  |  |  |  |  | $setup->dependencies( ); | 
| 4891 |  |  |  |  |  |  |  | 
| 4892 |  |  |  |  |  |  | Installs a bunch of dependency programs that are needed by other programs we will install later during the build of a Mail::Toaster. You can install these yourself if you would like, this does not do anything special beyond installing them: | 
| 4893 |  |  |  |  |  |  |  | 
| 4894 |  |  |  |  |  |  | gdbm, setquota, expect, maildrop, autorespond, qmail, qmailanalog, daemontools, openldap-client, Crypt::OpenSSL-RSA, DBI, DBD::mysql. | 
| 4895 |  |  |  |  |  |  |  | 
| 4896 |  |  |  |  |  |  | required arguments: | 
| 4897 |  |  |  |  |  |  | conf | 
| 4898 |  |  |  |  |  |  |  | 
| 4899 |  |  |  |  |  |  | result: | 
| 4900 |  |  |  |  |  |  | 1 - success | 
| 4901 |  |  |  |  |  |  | 0 - failure | 
| 4902 |  |  |  |  |  |  |  | 
| 4903 |  |  |  |  |  |  |  | 
| 4904 |  |  |  |  |  |  | =item djbdns | 
| 4905 |  |  |  |  |  |  |  | 
| 4906 |  |  |  |  |  |  | Fetches djbdns, compiles and installs it. | 
| 4907 |  |  |  |  |  |  |  | 
| 4908 |  |  |  |  |  |  | $setup->djbdns( ); | 
| 4909 |  |  |  |  |  |  |  | 
| 4910 |  |  |  |  |  |  | required arguments: | 
| 4911 |  |  |  |  |  |  | conf | 
| 4912 |  |  |  |  |  |  |  | 
| 4913 |  |  |  |  |  |  | result: | 
| 4914 |  |  |  |  |  |  | 1 - success | 
| 4915 |  |  |  |  |  |  | 0 - failure | 
| 4916 |  |  |  |  |  |  |  | 
| 4917 |  |  |  |  |  |  |  | 
| 4918 |  |  |  |  |  |  | =item expect | 
| 4919 |  |  |  |  |  |  |  | 
| 4920 |  |  |  |  |  |  | Expect is a component used by courier-imap and sqwebmail to enable password changing via those tools. Since those do not really work with a Mail::Toaster, we could live just fine without it, but since a number of FreeBSD ports want it installed, we install it without all the extra X11 dependencies. | 
| 4921 |  |  |  |  |  |  |  | 
| 4922 |  |  |  |  |  |  |  | 
| 4923 |  |  |  |  |  |  | =item ezmlm | 
| 4924 |  |  |  |  |  |  |  | 
| 4925 |  |  |  |  |  |  | Installs Ezmlm-idx. This also tweaks the port Makefile so that it will build against MySQL 4.0 libraries if you don't have MySQL 3 installed. It also copies the sample config files into place so that you have some default settings. | 
| 4926 |  |  |  |  |  |  |  | 
| 4927 |  |  |  |  |  |  | $setup->ezmlm( ); | 
| 4928 |  |  |  |  |  |  |  | 
| 4929 |  |  |  |  |  |  | required arguments: | 
| 4930 |  |  |  |  |  |  | conf | 
| 4931 |  |  |  |  |  |  |  | 
| 4932 |  |  |  |  |  |  | result: | 
| 4933 |  |  |  |  |  |  | 1 - success | 
| 4934 |  |  |  |  |  |  | 0 - failure | 
| 4935 |  |  |  |  |  |  |  | 
| 4936 |  |  |  |  |  |  |  | 
| 4937 |  |  |  |  |  |  | =item filtering | 
| 4938 |  |  |  |  |  |  |  | 
| 4939 |  |  |  |  |  |  | Installs SpamAssassin, ClamAV, simscan, QmailScanner, maildrop, procmail, and programs that support the aforementioned ones. See toaster-watcher.conf for options that allow you to customize which programs are installed and any options available. | 
| 4940 |  |  |  |  |  |  |  | 
| 4941 |  |  |  |  |  |  | $setup->filtering(); | 
| 4942 |  |  |  |  |  |  |  | 
| 4943 |  |  |  |  |  |  |  | 
| 4944 |  |  |  |  |  |  | =item maillogs | 
| 4945 |  |  |  |  |  |  |  | 
| 4946 |  |  |  |  |  |  | Installs the maillogs script, creates the logging directories (toaster_log_dir/), creates the qmail supervise dirs, installs maillogs as a log post-processor and then builds the corresponding service/log/run file to use with each post-processor. | 
| 4947 |  |  |  |  |  |  |  | 
| 4948 |  |  |  |  |  |  | $setup->maillogs(); | 
| 4949 |  |  |  |  |  |  |  | 
| 4950 |  |  |  |  |  |  |  | 
| 4951 |  |  |  |  |  |  | =item startup_script | 
| 4952 |  |  |  |  |  |  |  | 
| 4953 |  |  |  |  |  |  | Sets up the supervised mail services for Mail::Toaster | 
| 4954 |  |  |  |  |  |  |  | 
| 4955 |  |  |  |  |  |  | $setup->startup_script( ); | 
| 4956 |  |  |  |  |  |  |  | 
| 4957 |  |  |  |  |  |  | If they don't already exist, this sub will create: | 
| 4958 |  |  |  |  |  |  |  | 
| 4959 |  |  |  |  |  |  | daemontools service directory (default /var/service) | 
| 4960 |  |  |  |  |  |  | symlink to the services script | 
| 4961 |  |  |  |  |  |  |  | 
| 4962 |  |  |  |  |  |  | The services script allows you to run "services stop" or "services start" on your system to control the supervised daemons (qmail-smtpd, qmail-pop3, qmail-send, qmail-submit). It affects the following files: | 
| 4963 |  |  |  |  |  |  |  | 
| 4964 |  |  |  |  |  |  | $prefix/etc/rc.d/[svscan|services].sh | 
| 4965 |  |  |  |  |  |  | $prefix/sbin/services | 
| 4966 |  |  |  |  |  |  |  | 
| 4967 |  |  |  |  |  |  |  | 
| 4968 |  |  |  |  |  |  | =item test | 
| 4969 |  |  |  |  |  |  |  | 
| 4970 |  |  |  |  |  |  | Run a variety of tests to verify that your Mail::Toaster installation is working correctly. | 
| 4971 |  |  |  |  |  |  |  | 
| 4972 |  |  |  |  |  |  |  | 
| 4973 |  |  |  |  |  |  | =back | 
| 4974 |  |  |  |  |  |  |  | 
| 4975 |  |  |  |  |  |  |  | 
| 4976 |  |  |  |  |  |  | =head1 DEPENDENCIES | 
| 4977 |  |  |  |  |  |  |  | 
| 4978 |  |  |  |  |  |  | IO::Socket::SSL | 
| 4979 |  |  |  |  |  |  |  | 
| 4980 |  |  |  |  |  |  |  | 
| 4981 |  |  |  |  |  |  | =head1 AUTHOR | 
| 4982 |  |  |  |  |  |  |  | 
| 4983 |  |  |  |  |  |  | Matt Simerson - matt@tnpi.net | 
| 4984 |  |  |  |  |  |  |  | 
| 4985 |  |  |  |  |  |  |  | 
| 4986 |  |  |  |  |  |  | =head1 SEE ALSO | 
| 4987 |  |  |  |  |  |  |  | 
| 4988 |  |  |  |  |  |  | The following are all perldoc pages: | 
| 4989 |  |  |  |  |  |  |  | 
| 4990 |  |  |  |  |  |  | Mail::Toaster | 
| 4991 |  |  |  |  |  |  | Mail::Toaster::Conf | 
| 4992 |  |  |  |  |  |  | toaster.conf | 
| 4993 |  |  |  |  |  |  | toaster-watcher.conf | 
| 4994 |  |  |  |  |  |  |  | 
| 4995 |  |  |  |  |  |  | http://mail-toaster.org/ | 
| 4996 |  |  |  |  |  |  |  | 
| 4997 |  |  |  |  |  |  | =cut |