[ SEA-GHOST MINI SHELL]
Path : /scripts/ |
|
Current File : //scripts/backups_list_user_files |
#!/usr/local/cpanel/3rdparty/bin/perl
# cpanel - scripts/backups_list_user_files Copyright 2022 cPanel, L.L.C.
# All rights reserved.
# copyright@cpanel.net http://cpanel.net
# This code is subject to the cPanel license. Unauthorized copying is prohibited
################################################################################
package scripts::backups_list_user_files;
use strict;
use warnings;
use Cpanel::Backup::Metadata ();
use Cpanel::DBI::SQLite ();
use Getopt::Long ();
################################################################################
Cpanel::Backup::Metadata::metadata_disabled_check(1);
################################################################################
sub _help {
my ($msg) = @_;
$msg //= '';
print qq{$msg
Usage:
$0 --user=user [--regexp=regexp]
user - is the name of the user files to list
regexp - is an optional regex to refine your file list
};
exit 0;
}
sub _invalid_parms {
_help();
die "Invalid Command Line Parameters\n";
}
our $user;
our $regexp;
sub generate_output {
my ( $user, $regexp ) = @_;
$regexp //= '';
my $meta_path = Cpanel::Backup::Metadata::get_metadata_filename($user);
my $dbh = Cpanel::DBI::SQLite->connect( { 'database' => $meta_path } );
# Get all the backup IDs and their paths
my $sth = $dbh->prepare(qq{SELECT backup_id,backup_path FROM backup_paths});
my $results = $sth->execute();
my @backups;
while ( my $row = $sth->fetchrow_arrayref() ) {
push @backups, { 'id' => $row->[0], 'path' => $row->[1] };
}
# type == 0 uncompressed
# type == 1 compressed
# type == 2 incremental
# type == 3 other
foreach my $backup (@backups) {
# Get basedir with date by stripping /accounts/
$backup->{'path'} =~ s/\/accounts$//;
my $ref = Cpanel::Backup::Metadata::load_master_meta( $backup->{'path'} );
if ( defined( $ref->{'backup_type'} ) and $ref->{'backup_type'} eq 'ERROR' ) {
# print "Could not load .master.meta from " . $backup->{'path'} . "/accounts/\n"; # This would be a good case for adding a debugging/verbose flag to this script
next;
}
my $backup_type_text = Cpanel::Backup::Metadata::get_backup_type_text( $ref->{'users'}{$user}{'backup_type'} );
my $full_path_to_backup;
if ( $ref->{'users'}{$user}{'backup_type'} == 0 ) {
$full_path_to_backup = $backup->{'path'} . '/accounts/' . $user . '.tar';
}
elsif ( $ref->{'users'}{$user}{'backup_type'} == 1 ) {
$full_path_to_backup = $backup->{'path'} . '/accounts/' . $user . '.tar.gz';
}
elsif ( $ref->{'users'}{$user}{'backup_type'} == 2 ) {
$full_path_to_backup = $backup->{'path'} . '/accounts/' . $user;
}
else {
$full_path_to_backup = '';
}
my $resolution_query = <<END;
SELECT
b.backup_path,
f.size,
s.path,
f.mtime,
f.operation,
f.type
FROM file_changes AS f
JOIN seen_files AS s ON f.seen_files_id = s.file_id
JOIN backup_paths AS b ON f.backup_id = b.backup_id
WHERE f.backup_id <= ?
GROUP BY path
HAVING operation != ?
ORDER BY s.path ASC
END
my $sth = $dbh->prepare($resolution_query);
$sth->execute( $backup->{'id'}, $Cpanel::Backup::Metadata::REMOVE_OPERATION );
while ( my $row = $sth->fetchrow_arrayref() ) {
my ( $bu_path, $size, $path, $mtime, $operation, $file_type ) = @{$row};
my $full_path_to_backup_file;
if ($regexp) {
next if $path !~ m/$regexp/;
}
if ( $ref->{'users'}{$user}{'backup_type'} == 2 ) {
$full_path_to_backup_file = $full_path_to_backup . '/homedir' . $path;
}
else {
$full_path_to_backup_file = $full_path_to_backup;
}
my $file_type_text = Cpanel::Backup::Metadata::get_file_type_text($file_type);
print '"' . gmtime($mtime) . '",' . $size . ',' . $backup_type_text . ',' . '"' . $path . '"' . ',"' . $full_path_to_backup_file . '",' . $file_type_text . "\n";
}
}
return;
}
sub script {
my (@args) = @_;
my $opts = Getopt::Long::GetOptionsFromArray(
\@args,
'user=s' => \$user,
'regexp=s' => \$regexp,
) or _invalid_parms();
_help("no user provided") if !$user;
generate_output( $user, $regexp );
return 1;
}
exit( script(@ARGV) ? 0 : 1 ) unless caller();
SEA-GHOST - SHELL CODING BY SEA-GHOST