#!/usr/bin/perl # cpanel10 - cpanelsync_build_cpaddons_dir Copyright(c) 2006 cPanel, Inc. # All rights Reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited use strict; use warnings; use cPanel::SyncUtil; use File::Spec; my $version = '0.0.1'; my $copyright = 'Copyright(c) 2006 cPanel, Inc.'; # intitialize input vars my $user = ''; # -u user who's home directory this is # my $group = ''; # -g $user's group my $vendor = ''; # -v "cPAddon Vendor Info url" default output my $cpaddons_root = ''; # -d path of http://[cphost][cphuri' from your "cPAddon Vendor Info url" my $clustersync = ''; # -s optional script to sync (-t sync) file to other servers however you need, executed with same args as $0 my $message = ''; my %options = cPanel::SyncUtil::_get_opts_hash('qha:c:n:u:g:d:v:s:'); if ( exists $options{'h'} || ! scalar keys %options ) { print <<"EOM"; $0 v $version $copyright This application assists in setting up a cpanelsync directory structure suitable for usage with cPanel servers. Usage: $0 [option] Command Line Options: Booleans Flag: -h Argument Flags: -c cPAddon_category -n cPAddon_name -a Action -u user -g group (defaults to the value of -u if not given) -d directory -v cPAddon_vendor_name -s sync/script to use with -a sync (gets same arguments as $0) EOM exit; } # Directory if ( exists $options{'d'} ) { if ( ! -d $options{'d'} ) { $message .= "Directory $options{'d'} is not a directory\n"; } else { $cpaddons_root = $options{'d'}; } } else { $message .= "Directory must be specified with the -d option\n"; } # name if ( exists $options{'n'} ) { if ( ! $options{'n'} ) { $message .= "cPAddon name is required with -n\n"; } } # catagory if ( exists $options{'c'} ) { if ( ! $options{'c'} ) { $message .= "cPAddon catagory is required with -c\n"; } } # user if(!$options{'u'}) { $message .= "You must specify a user with -u\n"; } else { $user = $options{'u'}; } # group my $group = !$options{'g'} ? $user : $options{'g'}; # vendor if($options{'v'} !~ m{^\w+$}) { $message .= "You must specify your Vendor name\n"; } else { $vendor = $options{'v'}; } # sync script if($options{'a'} eq 'sync') { if(!$options{'s'} || !-x $options{'s'}) { $message .= "Please specify the path to your sync script with -s\n"; } else { $clustersync = $options{'s'} =~ m{^/} || $options{'s'} =~ m{^[.]} ? $options{'s'} : "./$options{'s'}"; } } # action if ( exists $options{'a'} ) { if ( $options{'a'} ne 'bz2' && $options{'a'} ne 'all' && $options{'a'} ne 'lock' && $options{'a'} ne 'unlock' && $options{'a'} ne 'sync' ) { $message .= "Option -a requires a valid argument (bz2|lock|unlock|sync|all) Note: all does bz2, unlock, then sync\n"; } } else { $message .= "Action must be specified with the -a option (bz2|lock|unlock|sync|all)\n"; } if ($message) { print $message; exit 1; } my $root = File::Spec->catdir( $cpaddons_root, $vendor ); chdir $cpaddons_root or die "Could not go into base dir: $!"; if($options{'a'} eq 'all') { delete $options{'a'}; my @cmds; for(sort keys %options) { push @cmds, "-$_", $options{$_}; } system $0, '-a', 'bz2', @cmds; system $0, '-a', 'unlock', @cmds; system $0, '-a', 'sync', @cmds; exit; } cPanel::SyncUtil::_chown_pwd_recursively( $user, $group ); if ($clustersync) { if(-x $clustersync ) { exec $clustersync, @ARGV if $options{'a'} eq 'sync'; } else { die "$clustersync is not executable"; } } if( $options{'a'} eq 'bz2' ) { cPanel::SyncUtil::_raw_dir( $cpaddons_root, 'cPAddonsAvailable', 1, cPanel::SyncUtil::_read_dir('./cPAddonsAvailable') ) or warn "_raw_dir cPAddonsAvailable/: $!"; my @md5files = grep { m/\.pm$/ } cPanel::SyncUtil::_read_dir('./cPAddonsMD5'); cPanel::SyncUtil::_raw_dir( $cpaddons_root, 'cPAddonsMD5', 1, @md5files ) or warn "_raw_dir cPAddonsMD5/: $!"; } elsif ( $options{'a'} eq 'lock' ) { cPanel::SyncUtil::_lock(qw(./ cPAddonsAvailable/ cPAddonsMD5/)); } elsif ( $options{'a'} eq 'unlock' ) { cPanel::SyncUtil::_unlock(qw(./ cPAddonsAvailable/ cPAddonsMD5/)); } die "-c may only be one of the directories in $root" if defined $options{'c'} && $options{'c'} ne '' && ! -d "$root/$options{'c'}"; chdir $root or die "Could not go into $root: $!"; ROOT: for my $dir ( cPanel::SyncUtil::_read_dir($root) ) { next ROOT if !cPanel::SyncUtil::_safe_cpsync_dir($dir) || ( defined $options{'c'} && $options{'c'} ne '' && $dir ne $options{'c'} ) ; cPanel::SyncUtil::_chown_pwd_recursively( $user, $group ); SUBDIR: for my $name ( cPanel::SyncUtil::_read_dir($dir) ) { next SUBDIR if $name =~ /^\./ || !cPanel::SyncUtil::_safe_cpsync_dir("$dir/$name") || ( defined $options{'n'} && $options{'n'} ne '' && $name !~ /^$options{'n'}/ ) ; if ( $options{'a'} eq 'bz2' ) { system 'bzip2', '-k', "$dir/$name.pm"; cPanel::SyncUtil::_raw_dir( "$dir", $name, 1 ) or warn "cPanel::SyncUtil::_raw_dir $root/$dir: $!"; cPanel::SyncUtil::_sync_touchlock_pwd(); } elsif ( $options{'a'} eq 'lock' ) { cPanel::SyncUtil::_lock( "$dir/$name/" ); } elsif ( $options{'a'} eq 'unlock' ) { cPanel::SyncUtil::_unlock( "$dir/$name/" ); } cPanel::SyncUtil::_chown_pwd_recursively( $user, $group ); } }