19 Commits
1.0 ... main

Author SHA1 Message Date
wasabi
1ab31bb2dc Colon to semicolon bug fixed 2024-08-11 18:09:56 -05:00
wasabi
0b22e1267e Fixed bug 2024-08-11 18:07:49 -05:00
wasabi
c4dd3401f8 Added retry logic 2024-08-11 18:02:18 -05:00
wasabi
318cacd918 cleaned up help output 2024-08-10 14:40:01 -05:00
wasabi
6541f9da75 WIP Man page for transfer utility 2024-08-10 14:33:27 -05:00
Elia Farin
ae03d04d15 Fixed bug with artifacts of old functionality 2024-08-10 00:58:13 -05:00
Elia Farin
076180f4cb Fixed bug regarding spelling of 2024-08-10 00:53:02 -05:00
wasabi
111f7bcac0 Updated to allow directory copy, changed the --file option to --path to support this functionality 2024-08-09 23:29:27 -05:00
wasabi
bc073154e7 Changed install.sh to make the commands more unix-like 2024-08-09 23:03:36 -05:00
wasabi
44d3715566 restructured directory structure 2024-08-09 23:02:40 -05:00
wasabi
1953f7dfd9 Fixed install to prompt user to check their PATH if /usr/local/bin isn't found 2024-08-09 23:02:11 -05:00
wasabi
a40e1bc0fd moved .gitignre to .gitignore 2024-08-09 20:51:23 -05:00
wasabi
77f295ba56 fixed spelling mistake in gitignre 2024-08-09 20:51:10 -05:00
wasabi
f4b32c93da fixed gitignore 2024-08-09 20:49:54 -05:00
wasabi
b685d21e3f Updated to print progress message before each transfer 2024-08-09 20:49:09 -05:00
wasabi
034afa8b53 updated install to install one of the dependancies 2024-08-09 20:48:42 -05:00
wasabi
2d87c5392c added gitignore for testing 2024-08-09 20:48:26 -05:00
Elia Farin
4f2d382916 Updated readme 2024-08-09 13:48:45 -05:00
Elia Farin
93a95bc70f Removed PIDfile nonsense, if you need a pid file, figure it out yourself 2024-08-09 13:41:25 -05:00
8 changed files with 275 additions and 112 deletions

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
testfolder/*
test*.txt

View File

@@ -1,2 +1,78 @@
# transfer_scripts
A few scripts for estimating size and transferring files
## Function
transfer.pl - Use rsync to copy over files in a list or directory.
estimate.pl - Estimate the total size of a list of files or a directory.
fixlist.sh - fix your file list to the format these programs expect
## Usage
These scripts are used as follows:
$ transfer.pl
Usage: --file= --host= --directory= --user= --dest= --flags= [--verbose] [--help]
--file - Input file to read with list of files/folders to transfer
--host - IP address or hostname of the remote system
--directory - Relative or absolute path to the folder containing the files/folders to transfer,
with no trailing slash
--user - User account on the remote system to use
--dest - Destination on the remote system to copy files to
--flags - rsync flags to use when copying the files over
--verbose - run rsync with -vvv
--help - show this help
$ estimate.pl
Usage: [--dir=] [--infile=] [--help]
--dir - directory to estimate the size of
--infile - file with a list of filenames to estimate the size of
--prefix - prefix path for filenames in the infile
--help - print this help
$ fixlist.sh
Usage: /usr/local/bin/fixlist.sh <filename>
## Contributing
Feel free to fork and submit pull requests, I will review them and merge into main if I like them. If you do submit a pull request,
please also email me at elia@sassysalamander.net so I can look at it faster.
## License
Affero General Public License 3.0
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
## Copyright
2024 Elia Farin <elia@sassysalamander.net>

View File

@@ -24,9 +24,16 @@ if [ "$EUID" -ne 0 ]; then
echo "This script must be run as root to install system-wide"
exit 1
fi
cp ./transfer.pl /usr/local/bin/transfer.pl
cp ./estimate.pl /usr/local/bin/estimate.pl
cp ./fixlist.sh /usr/local/bin/fixlist.sh
cp ./src/transfer.pl /usr/local/bin/transfer
cp ./src/estimate.pl /usr/local/bin/estimate
cp ./src/fixlist.sh /usr/local/bin/fixlist
chmod 755 /usr/local/bin/transfer.pl
chmod 755 /usr/local/bin/estimate.pl
chmod 755 /usr/local/bin/fixlist.sh
cpan install Getopt::Long
if [ -z "$(echo $PATH | grep '.usr.local.bin')" ]; then
echo "/usr/local/bin not found in your PATH."
echo "Please add /usr/local/bin to your PATH export"
fi

33
man/transfer.1 Normal file
View File

@@ -0,0 +1,33 @@
.Dd August 09, 2024
.Os FreeBSD 14.1
.Dt TRANSFER [1]
.Sh NAME
.Nm transfer
.Nd transfer files using rsync
.Sh SYNOPSIS
.Nm transfer
.Op Fl path Ar inpath
.Op Fl host Ar host
.Op Fl user Ar username
.Op Fl dest Ar outpath
.Op Fl flags Ar rsyncflags
.Op Fl verbose
.Op Fl help
.Op Fl dir
.Sh DESCRIPTION
The .Nm transfer utility takes as input a list of absolute file or directory
paths, and transfers those files or directories and their contents to a remote
system.
The following options are available:
.Op path
.Bd -offset indent
.Sh ENVIRONMENT
.Sh FILES
.Sh EXAMPLES

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env perl
#
# Author: Elia Farin 2024
# Author: Elia Farin
# Written: 8/9/24
# Modified: 8/9/24
# License: AGPL-3.0-or-later

View File

@@ -5,7 +5,7 @@
# Modified: 8/9/24
# License: AGPL-3.0-or-later
#
# Copyright (C) 2024 Elia Farin
# Copyright (C) 2024 Elia Farin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -19,7 +19,8 @@
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
#
if [ -z "${1}" ]; then
echo "Usage: ${0} <filename>"
exit 1

150
src/transfer.pl Executable file
View File

@@ -0,0 +1,150 @@
#!/usr/bin/env perl
# Transfer script transfer.pl
# Author: Elia Farin
# Written: 8/9/24
# Modified: 8/9/24
# License: AGPL-3.0-or-later
#
# Copyright (C) 2024 Elia Farin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
use strict;
use Getopt::Long;
# sane defaults
my $path= "";
my $host = "";
# get running user's name
my $user = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};
my $dest= "/home/$user/Downloads/";
my $flags = "rvz";
my $verbose;
my $help;
my $dir;
my $retries = 2;
my $tries = 0;
my $returncode;
# options
my $result = GetOptions ( "path=s" => \$path,
"host=s" => \$host,
"dir" => \$dir,
"user=s" => \$user,
"dest=s" => \$dest,
"flags=s" => \$flags,
"verbose" => \$verbose,
"retries" => \$retries,
"help" => \$help);
sub transfer {
#print "file: $file, host: $host, srcdir: $dir, user: $user, dest: $dest flags: $flags verbose: $verbose help: $help\n";
### Begin main logic
# help catch
if ($help) {
help();
}
# if we're passed the directory flag and we have the required options set
elsif ($dir && length $host && length $dest && length $user) {
print "Transferring object 1 of 1 \n\n";
$tries = 0;
# transfer our directory
while ($tries <= $retries) {
$returncode = system("rsync", "-$flags", "$dir", "$user\@$host:$dest");
if ($returncode == 0) {
last;
} else {
$tries++;
}
}
}
# If we have all the right options set for an infile, begin the copy
elsif (length $path && length $host && length $user && length $dest) {
#print "in elsif block\n";
# Open our filehandle
open my $info, $path or die "Could not open $path: $!";
my $linesnum = 0;
while( my $iterline = <$info>) {
#print "in first while loop\n";
$linesnum++;
}
# wqe need to close the filehandle or we won't be able to read the file again
close $path;
# open our filehandle, this time for taking action
open $info, $path or die "Could not open $path: $!";
my $xfernum = 0;
# read line by line
while( my $line = <$info> ) {
#print "in second while loop\n";
$xfernum++;
chomp $line;
$tries = 0;
# actual copy logic
if (length $verbose) {
while ($tries <= $retries) {
#print "in verbose section";
print "\n\nTransferring object $xfernum of $linesnum\n\n";
$returncode = system("rsync", "-vvv", "-$flags", "$line", "$user\@$host:$dest");
if ($returncode == 0) {
last;
} else {
$tries++;
}
}
} else {
while ($tries <= $retries) {
#print "in non-verbose section";
print "\n\nTransferring object $xfernum of $linesnum\n\n";
$returncode = system("rsync", "-$flags", "$line", "$user\@$host:$dest");
if ($returncode == 0) {
last;
} else {
$tries++;
}
}
}
}
close $path;
}
# if we fail the variables check, print usage help
else {
#print "In help else\n";
help();
}
# help subroutine
sub help {
print "Usage: $ARGV[0] --path <infile or directory> [--dir] --host <IP or DNS name> --user <username> --dest <destination path> [--flags <rsync flags>] [--verbose] [--help]\n
--path - Input file to read or directory to copy
--host - IP address or hostname of the remote system
--dir - enable directory copy mode
--user - User account on the remote system to use
--dest - Destination on the remote system to copy files to
--flags - rsync flags to use when copying the files over. Defaults to rvz
--retries - number of retries on failed rsync (default 2)
--verbose - run rsync with -vvv
--help - show this help\n";
}
}
transfer();

View File

@@ -1,106 +0,0 @@
#!/usr/local/bin/perl
use strict;
use Getopt::Long;
use Proc::Pidfile;
# Transfer script transfer.pl
# Author: Elia Farin
# Written: 8/9/24
# Modified: 8/9/24
# License: AGPL-3.0-or-later
#
# Copyright (C) 2024 Elia Farin
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
#
my $pidfile;
# if we are root, create a pidfile
if ($> = 0) {
my $pp = Proc::Pidfile->new( pidfile => "/var/run/transfer.pl.pid" );
} else {
# if not, create our home pidfile
my $home = $ENV("$HOME");
my $pp = Proc::Pidfile->new( pidfile => "$home/transfer.pl.pid");
}
# die if we cannot get pidfile lock
$pidfile = $pp->$pidfile();
# sane defaults
my $file = "";
my $host = "192.168.42.100";
my $directory = ".";
my $user = "char";
my $dest= "/home/char/Downloads/";
my $flags = "rvz";
my $verbose;
my $help;
# options
my $result = GetOptions ( "file=s" => \$file,
"host=s" => \$host,
"directory=s" => \$directory,
"user=s" => \$user,
"dest=s" => \$dest,
"flags=s" => \$flags,
"verbose" => \$verbose,
"help" => \$help);
### Begin main logic
# help catch
if ($help) {
help();
}
# If we have all the right arguments, begin the copy
elsif (length $file && length $host && length $user && length $dest && length $directory) {
# Open our filehandle
open my $info, $file or die "Could not open $file: $!";
# read line by line
while( my $line = <$info> ) {
chomp $line;
# actual copy logic
if (length $verbose) {
system("rsync", "-vvv", "-$flags", "$directory/$line", "$user\@$host:$dest");
} else {
system("rsync", "-$flags", "$directory/$line", "$user\@$host:$dest");
}
}
}
# if we fail the variables check, print usage help
else {
help();
}
# remove the pidfile
undef $pp;
# help subroutine
sub help {
print "Usage: $ARGV[0] --file= --host= --directory= --user= --dest= --flags= [--verbose] [--help]\n
--file - Input file to read with list of files/folders to transfer \n
--host - IP address or hostname of the remote system\n
--directory - Relative or absolute path to the folder containing the files/folders to transfer, \n
with no trailing slash\n
--user - User account on the remote system to use\n
--dest - Destination on the remote system to copy files to\n
--flags - rsync flags to use when copying the files over\n
--verbose - run rsync with -vvv\n
--help - show this help\n";
}