11 Commits
1.2 ... 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
6 changed files with 192 additions and 112 deletions

View File

@@ -24,11 +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
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

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,108 +0,0 @@
#!/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 $file = "";
my $host = "";
my $directory = ".";
my $user = getlogin() || (getpwuid($<))[0] || $ENV{LOGNAME} || $ENV{USER};
my $dest= "/home/$user/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);
print "file: $file, host: $host, directory: $directory, user: $user, dest: $dest flags: $flags verbose: $verbose help: $help\n";
### 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) {
#print "in elsif block\n";
# Open our filehandle
open my $info, $file or die "Could not open $file: $!";
my $linenum = 0;
while( my $iterline = <$info>) {
#print "in first while loop\n";
$linenum++;
}
close $file;
open $info, $file or die "Could not open $file: $!";
my $xfernum = 0;
# read line by line
while( my $line = <$info> ) {
#print "in second while loop\n";
$xfernum++;
chomp $line;
# actual copy logic
if (length $verbose) {
#print "in verbose section";
print "\n\nTransferring object $xfernum of $linenum\n\n";
system("rsync", "-vvv", "-$flags", "$directory/$line", "$user\@$host:$dest");
} else {
#print "in non-verbose section";
print "\n\nTransferring object $xfernum of $linenum\n\n";
system("rsync", "-$flags", "$directory/$line", "$user\@$host:$dest");
}
}
close $file;
}
# if we fail the variables check, print usage help
else {
#print "In help else\n";
help();
}
# 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";
}