This repository has been archived on 2025-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
wifi-sd/.wifisd/autoupload.pl
2014-08-12 00:27:35 +02:00

152 lines
3.8 KiB
Perl

#!/usr/bin/perl
# Custom Upload script for a Transcend Wi-Fi SD Card
# Copyright (C) Glen Pitt-Pladdy 2014
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#
# See: https://www.pitt-pladdy.com/blog/_20140202-083815_0000_Transcend_Wi-Fi_SD_Hacks_CF_adaptor_telnet_custom_upload_/
#
use strict;
use warnings;
# delay between itterations
my $LOOPDELAY = 5;
# path to mirror
my $PATH = '/mnt/sd/DCIM';
my $PATHLENGTH = length $PATH;
my $FINDCMD = "find $PATH -type f";
# curl command and URL to send to
my $CURL = 'curl --user-agent \'WiFISD Uploader\' --cacert /mnt/sd/.wifisd/ca/SomeRootCert.pem --user user:pass';
my $URL = 'https://upload.somedomain.com/tscardupload/';
# keep track of files already sent
my %DONEFILES;
# find files available to upload
sub findfiles {
my ( $files ) = @_;
open my $find, '-|', $FINDCMD or die "FATAL - can't run find: $!\n";
while ( defined ( my $line = <$find> ) ) {
chomp $line;
substr ( $line, 0, $PATHLENGTH, '' );
$line =~ s/^\/+//;
push @$files, $line;
}
close $find;
}
# verify file is uploaded
sub checkfile {
my ( $file ) = @_;
my $fileesc = $file;
$fileesc =~ s/\\/\\\\/g;
$fileesc =~ s/`/\\`/g;
$fileesc =~ s/\$/\\\$/g;
$fileesc =~ s/"/\\"/g;
my $fullpath = "$PATH/$file";
open my $curl, '-|', "$CURL --silent --form time=".(stat $fullpath)[9]." --form size=".(-s $fullpath)." --form verifypath=\"$fileesc\" $URL"
or return 0;
my $result = <$curl>;
if ( ! defined($result) ) { return 0; }
chomp $result;
close $curl;
if ( $result eq 'OK' ) {
return 1;
}
return 0;
}
# upload a file
sub upload {
my ( $file ) = @_;
my $fullpath = "$PATH/$file";
my $fullpathesc = $fullpath;
$fullpathesc =~ s/\\/\\\\/g;
$fullpathesc =~ s/`/\\`/g;
$fullpathesc =~ s/\$/\\\$/g;
$fullpathesc =~ s/"/\\"/g;
my $fileesc = $file;
$fileesc =~ s/\\/\\\\/g;
$fileesc =~ s/`/\\`/g;
$fileesc =~ s/\$/\\\$/g;
$fileesc =~ s/"/\\"/g;
my $start = time();
system ( "$CURL --form time=".(stat $fullpath)[9]." --form size=".(-s $fullpath)." --form filepath=\"$fileesc\" --form uploadfile=\"\@$fullpathesc;type=application/octet-stream\" $URL" );
my $elapsed = time() - $start;
if ( $elapsed == 0 ) { return; }
my $rate = (-s $fullpath) / $elapsed;
print "$rate B/s\n";
}
# signal handler - exit cleanly
my $run = 1;
sub exitclean {
warn "got signal - exiting\n";
$run = 0;
}
# signal handler - doesn't seem to work TODO
$SIG{'TERM'} = 'exitclean';
$SIG{'QUIT'} = 'exitclean';
$SIG{'INT'} = 'exitclean';
$SIG{'HUP'} = 'exitclean';
# wait for crypto lib available
while ( ! -f '/mnt/mtd/libcrypto.so.0.9.8.bz2' ) { sleep 1; }
# do initial scan of all files
my @files;
system ( 'sh /usr/bin/refresh_sd' );
findfiles ( \@files );
foreach my $file (@files) {
if ( checkfile ( $file ) ) {
$DONEFILES{$file} = 1;
}
}
# loop checking files
while ( $run ) {
# get file list
undef @files;
system ( 'sh /usr/bin/refresh_sd' );
findfiles ( \@files );
foreach my $file (@files) {
if ( $DONEFILES{$file} ) { next; }
upload ( $file );
if ( checkfile ( $file ) ) {
$DONEFILES{$file} = 1;
}
}
# clean removed files
foreach my $file (keys %DONEFILES) {
if ( ! -f "$PATH/$file" ) {
delete $DONEFILES{$file};
}
}
# delay before next try
sleep $LOOPDELAY;
}