2017-03-02 18:23:23 +08:00
#!/usr/bin/perl
use DBI ;
use LockFile::Simple qw( lock trylock unlock ) ;
2017-07-31 14:17:56 +08:00
use Proc::ProcessTable ;
2017-03-02 18:23:23 +08:00
use Data::Dumper qw( Dumper ) ;
use IPC::Run 'run' ;
use String::Util 'trim' ;
2017-06-19 17:40:50 +08:00
use File::Temp ;
2017-03-02 18:23:23 +08:00
2017-07-31 14:17:56 +08:00
my $ t = Proc::ProcessTable - > new ;
my $ imapsync_running = grep { $ _ - > { cmndline } =~ /^\/usr\/bin\/perl \/usr\/local\/bin\/imapsync\s/ } @ { $ t - > table } ;
if ( $ imapsync_running eq 1 )
{
print "imapsync is active, exiting..." ;
exit ;
}
2017-03-02 18:23:23 +08:00
$ DBNAME = '' ;
$ DBUSER = '' ;
$ DBPASS = '' ;
$ run_dir = "/tmp" ;
$ dsn = "DBI:mysql:database=" . $ DBNAME . ";host=mysql" ;
$ lock_file = $ run_dir . "/imapsync_busy" ;
$ lockmgr = LockFile::Simple - > make ( - autoclean = > 1 , - max = > 1 ) ;
$ lockmgr - > lock ( $ lock_file ) || die "can't lock ${lock_file}" ;
2017-07-31 14:17:56 +08:00
$ dbh = DBI - > connect ( $ dsn , $ DBUSER , $ DBPASS , {
mysql_auto_reconnect = > 1 ,
mysql_enable_utf8mb4 = > 1
} ) ;
2017-03-02 18:23:23 +08:00
open my $ file , '<' , "/etc/sogo/sieve.creds" ;
my $ creds = <$file> ;
close $ file ;
my ( $ master_user , $ master_pass ) = split /:/ , $ creds ;
2018-02-08 12:24:04 +08:00
my $ sth = $ dbh - > prepare ( "SELECT id, user1, user2, host1, authmech1, password1, exclude, port1, enc1, delete2duplicates, maxage, subfolder2, delete1, delete2, automap, skipcrossduplicates, maxbytespersecond FROM imapsync WHERE active = 1 AND is_running = 0 AND (UNIX_TIMESTAMP(NOW()) - UNIX_TIMESTAMP(last_run) > mins_interval * 60 OR last_run IS NULL) ORDER BY last_run" ) ;
2017-03-02 18:23:23 +08:00
$ sth - > execute ( ) ;
my $ row ;
while ( $ row = $ sth - > fetchrow_arrayref ( ) ) {
2018-01-24 19:59:04 +08:00
$ id = @$ row [ 0 ] ;
$ user1 = @$ row [ 1 ] ;
$ user2 = @$ row [ 2 ] ;
$ host1 = @$ row [ 3 ] ;
$ authmech1 = @$ row [ 4 ] ;
$ password1 = @$ row [ 5 ] ;
$ exclude = @$ row [ 6 ] ;
$ port1 = @$ row [ 7 ] ;
$ enc1 = @$ row [ 8 ] ;
$ delete2duplicates = @$ row [ 9 ] ;
$ maxage = @$ row [ 10 ] ;
$ subfolder2 = @$ row [ 11 ] ;
$ delete1 = @$ row [ 12 ] ;
$ delete2 = @$ row [ 13 ] ;
$ automap = @$ row [ 14 ] ;
$ skipcrossduplicates = @$ row [ 15 ] ;
$ maxbytespersecond = @$ row [ 16 ] ;
2017-03-02 18:23:23 +08:00
2017-11-08 18:07:32 +08:00
$ is_running = $ dbh - > prepare ( "UPDATE imapsync SET is_running = 1 WHERE id = ?" ) ;
$ is_running - > bind_param ( 1 , $ { id } ) ;
$ is_running - > execute ( ) ;
2017-03-02 18:23:23 +08:00
if ( $ enc1 eq "TLS" ) { $ enc1 = "--tls1" ; } elsif ( $ enc1 eq "SSL" ) { $ enc1 = "--ssl1" ; } else { undef $ enc1 ; }
2017-06-19 17:40:50 +08:00
my $ template = $ run_dir . '/imapsync.XXXXXXX' ;
my $ passfile1 = File::Temp - > new ( TEMPLATE = > $ template ) ;
my $ passfile2 = File::Temp - > new ( TEMPLATE = > $ template ) ;
print $ passfile1 "$password1\n" ;
print $ passfile2 trim ( $ master_pass ) . "\n" ;
2017-03-02 18:23:23 +08:00
run [ "/usr/local/bin/imapsync" ,
"--timeout1" , "10" ,
"--tmpdir" , "/tmp" ,
"--subscribeall" ,
2018-02-14 19:27:30 +08:00
"--nofoldersizes" ,
"--skipsize" ,
"--buffersize 8192000" ,
2018-02-14 20:02:56 +08:00
"--skipheader 'X-*'" ,
2018-02-14 19:27:30 +08:00
"--split1 3000" ,
"--split2 3000" ,
"--fastio1" ,
"--fastio2" ,
2017-04-10 19:08:02 +08:00
( $ exclude eq "" ? ( ) : ( "--exclude" , $ exclude ) ) ,
2018-01-24 19:59:04 +08:00
( $ subfolder2 eq "" ? ( ) : ( '--subfolder2' , $ subfolder2 ) ) ,
( $ maxage eq "0" ? ( ) : ( '--maxage' , $ maxage ) ) ,
2018-02-26 23:26:17 +08:00
( $ maxbytespersecond eq "0" ? ( ) : ( '--maxbytespersecond' , $ maxbytespersecond ) ) ,
2018-01-24 19:59:04 +08:00
( $ delete2duplicates ne "1" ? ( ) : ( '--delete2duplicates' ) ) ,
( $ delete1 ne "1" ? ( ) : ( '--delete' ) ) ,
( $ delete2 ne "1" ? ( ) : ( '--delete2' ) ) ,
( $ automap ne "1" ? ( ) : ( '--automap' ) ) ,
( $ skipcrossduplicates ne "1" ? ( ) : ( '--skipcrossduplicates' ) ) ,
2017-04-10 19:08:02 +08:00
( ! defined ( $ enc1 ) ? ( ) : ( $ enc1 ) ) ,
2017-03-02 18:23:23 +08:00
"--host1" , $ host1 ,
"--user1" , $ user1 ,
2017-06-19 17:40:50 +08:00
"--passfile1" , $ passfile1 - > filename ,
2017-03-02 18:23:23 +08:00
"--port1" , $ port1 ,
"--host2" , "localhost" ,
"--user2" , $ user2 . '*' . trim ( $ master_user ) ,
2017-06-19 17:40:50 +08:00
"--passfile2" , $ passfile2 - > filename ,
2017-03-02 18:23:23 +08:00
'--no-modulesversion' ] , ">" , \ my $ stdout ;
2017-11-08 18:07:32 +08:00
$ update = $ dbh - > prepare ( "UPDATE imapsync SET returned_text = ?, last_run = NOW(), is_running = 0 WHERE id = ?" ) ;
2017-03-02 18:23:23 +08:00
$ update - > bind_param ( 1 , $ { stdout } ) ;
$ update - > bind_param ( 2 , $ { id } ) ;
$ update - > execute ( ) ;
}
$ sth - > finish ( ) ;
$ dbh - > disconnect ( ) ;
$ lockmgr - > unlock ( $ lock_file ) ;