From 0c45dfb98bed60b07196d81e451318c1eb0ab0a8 Mon Sep 17 00:00:00 2001 From: Dave Hansen Date: Tue, 4 May 2010 10:53:06 -0700 Subject: [PATCH] Add firmware fetch perl script --- eyefi-firmware-fetch.pl | 69 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 eyefi-firmware-fetch.pl diff --git a/eyefi-firmware-fetch.pl b/eyefi-firmware-fetch.pl new file mode 100644 index 0000000..67d35b6 --- /dev/null +++ b/eyefi-firmware-fetch.pl @@ -0,0 +1,69 @@ +#!/usr/bin/perl +use strict; +use LWP::UserAgent; +use Compress::Raw::Zlib ; + +sub cat +{ + my $filename = shift;; + my $contents; + my $line; + open FILE, "< $filename"; + while ($line = ) { + $contents .= $line; + } + close FILE; + return $contents; +} + +my $ua = LWP::UserAgent->new; + +my $xml; +my $ver = $ARGV[0];#'3.0144'; #'2.0400'; +my $mac = $ARGV[1]; +if ( ! defined $ver) { + die "usage: eyefi-firmware-fetch.pl [optional MAC]"; +} +while (1) { + my $m1 = 0x2d; #rand 0x30; + my $m2 = rand 256; + my $m3 = rand 256; + if (! length($mac)) { + $mac = sprintf '00-18-56-%02x-%02x-%02x', $m1, $m2, $m3; + } + my $url = sprintf 'http://api.eye.fi/api/rest/eyeserver/v1/getCardFirmware?Card=%s&Version=%s', $mac, $ver; + print $url."\n"; + my $res = $ua->get($url); + $xml = $res->content(); + #rint $xml."\n"; + next if $xml =~ /Card not found./; + next if $xml =~ /File not found./; + last; +} +my $filename .= "EYEFIFWU-$ver-$mac.bin"; +printf STDERR "got %d bytes of xml\n", length($xml); +#strip the XML off: +$xml =~ s/<\?xml.*//s; +printf STDERR "got %d bytes of xml\n", length($xml); +$xml =~ s/<\/Firmware>.*Response>//s; +printf STDERR "got %d bytes of xml\n", length($xml); +my $base64_encoded = $xml; +printf STDERR "got %d bytes of base64 encoded data\n", length($base64_encoded); + +use Email::MIME::Encodings; +my $zlib_encoded = Email::MIME::Encodings::decode(base64 => $base64_encoded); + +printf STDERR "got %d bytes of zlib encoded data\n", length($zlib_encoded); + +my $status; +my $output; + +my $i; +($i, $status) = new Compress::Raw::Zlib::Inflate() ; +$status = $i->inflate($zlib_encoded, $output); +$status = $i->inflateSync($zlib_encoded); + +open FILE, "> $filename"; +print FILE $output; +close FILE; +printf STDERR "done, wrote %d bytes to '$filename'\n", length($output); -- 2.42.0