Skip to content

Commit

Permalink
Merge pull request #40 from tobozo/1.0.5-beta
Browse files Browse the repository at this point in the history
1.0.5 beta
  • Loading branch information
tobozo authored May 12, 2021
2 parents f604df9 + 85f7c00 commit dc8c8c3
Show file tree
Hide file tree
Showing 7 changed files with 476 additions and 128 deletions.
131 changes: 94 additions & 37 deletions examples/ESP32/Update_from_gz_stream/Update_from_gz_stream.ino
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,56 @@
#include <rom/rtc.h> // to get reset reason
HTTPClient http;

// 1) Choose between testing tarGzStreamUpdater or gzStreamUpdater (default is tar.gz)
// /!\ tarGzStreamUpdater can update both spiffs *and* the firmware while
// gzStreamUpdater can only do spiffs *or* the firmware
// The choice is made by uncommenting one of those defines:
//
#define TEST_gzStreamUpdater
//#define TEST_tarGzStreamUpdater
//
// 2) Get the binaries of the firmware and/or spiffs partition you want to make available as gz/targz OTA update
//
// 3) Depending on the choice, make sure
// - the firmware binary filename is suffixed by "ino.bin" (rename if necessary)
// - the spiffs binary filename is suffixed by "spiffs.bin" (rename if necessary)
//
// 4) Create either:
// - the .tar.gz archive:
// $ cd /tmp/arduino_build_xxxxxx/ && tar cvzf partitions_bundle.tar.gz Your_Sketch.ino.bin Your_Sketch.spiffs.bin
// - the .gz archive:
// $ cd /tmp/arduino_build_xxxxxx/ && gzip -c Your_Sketch.spiffs.bin > firmware.gz
//
// 5) Publish the archive file on a web server
//
// 6) Edit the value of "const char* bundleURL" in this sketch to match the url to this archive file
//
// 7) Setup WIFI_SSID and WIFI_PASS if necessary (optional if your ESP32 had a previous successful connection to WiFi)
//
//#define WIFI_SSID "blahSSID"
//#define WIFI_PASS "blahPASSWORD"
//
// 8) Flash this sketch
//


#if (defined TEST_tarGzStreamUpdater && defined TEST_gzStreamUpdater ) || (!defined TEST_tarGzStreamUpdater && !defined TEST_gzStreamUpdater )

#error "Please define either TEST_gzStreamUpdater or TEST_tarGzStreamUpdater"

#elif defined TEST_tarGzStreamUpdater

const char* bundleURL = "https://raw.githubusercontent.com/tobozo/ESP32-targz/tarGzStreamUpdater/examples/Test_tar_gz_tgz/SD/partitions_bundle_esp32.tar.gz" ;

#else // TEST_gzStreamUpdater

const char* bundleURL = "https://raw.githubusercontent.com/tobozo/ESP32-targz/tarGzStreamUpdater/examples/Test_tar_gz_tgz/data/firmware_example_esp32.gz" ;

#endif


// 1) Produce the binaries for both the firmware the spiffs
// 2) Make sure the firmware binary filename is suffixed by "ino.bin" (rename if necessary)
// 3) Make sure the spiffs binary filename is suffixed by "spiffs.bin" (rename if necessary)
// 4) Create the .tar.gz archive:
// $ cd /tmp/arduino_build_xxxxxx/ && tar cvzf partitions_bundle.tar.gz Your_Sketch.ino.bin Your_Sketch.spiffs.bin
// 2) Publish the partitions_bundle.tar.gz file on a web server
// 3) Edit the value of "const char* bundleURL" in this sketch to match the url to this .tar.gz file
// 4) Setup WIFI_SSID and WIFI_PASS if necessary
// 5) Flash this sketch

const char* bundleURL = "https://raw.githubusercontent.com/tobozo/ESP32-targz/tarGzStreamUpdater/examples/Test_tar_gz_tgz/SD/partitions_bundle_esp32.tar.gz" ;
const char *certificate = NULL; // change this as needed, leave as is for no TLS check (yolo security)

//#define WIFI_SSID "blahSSID"
//#define WIFI_PASS "blahPASSWORD"

void stubbornConnect()
{
Expand Down Expand Up @@ -66,7 +100,8 @@ void stubbornConnect()

WiFiClient *getFirmwareClientPtr( WiFiClientSecure *client, const char* url, const char *cert = NULL )
{
client->setCACert( cert );
if( cert == NULL ) client->setInsecure();
else client->setCACert( cert );
const char* UserAgent = "ESP32-HTTP-TarGzUpdater-Client";
http.setReuse(true); // handle 301 redirects gracefully
http.setUserAgent( UserAgent );
Expand Down Expand Up @@ -111,19 +146,33 @@ void setup()

Serial.begin( 115200 );
tarGzFS.begin();
TarGzUnpacker *TARGZUnpacker = new TarGzUnpacker();

if( rtc_get_reset_reason(0) != 1 ) // software reset or crash
{
Serial.println("Listing destination Filesystem contents:");
TARGZUnpacker->tarGzListDir( tarGzFS, "/", 3 );
Serial.println("Press reset to restart test");
return;
}
#if defined TEST_tarGzStreamUpdater
TarGzUnpacker *Unpacker = new TarGzUnpacker();

if( rtc_get_reset_reason(0) != 1 ) // software reset or crash
{
Serial.println("Listing destination Filesystem contents:");
Unpacker->tarGzListDir( tarGzFS, "/", 3 );
Serial.println("Press reset to restart test");
return;
}

Serial.println("Pre formattings filesystem");
tarGzFS.format();
Serial.println("Done!");

#elif defined TEST_gzStreamUpdater
GzUnpacker *Unpacker = new GzUnpacker();

if( rtc_get_reset_reason(0) != 1 ) // software reset or crash
{
Serial.println("Press reset to restart test");
return;
}

#endif


Serial.println("Pre formattings filesystem");
tarGzFS.format();
Serial.println("Done!");

stubbornConnect();
WiFiClientSecure *client = new WiFiClientSecure;
Expand All @@ -147,17 +196,25 @@ void setup()
*/

if( streamptr != nullptr ) {

TARGZUnpacker->haltOnError( true ); // stop on fail (manual restart/reset required)
TARGZUnpacker->setTarVerify( false ); // disable verify as we're writing to a partition
TARGZUnpacker->setGzProgressCallback( BaseUnpacker::targzNullProgressCallback ); // gz progress is irrelevant for this operation
TARGZUnpacker->setTarProgressCallback( BaseUnpacker::defaultProgressCallback ); // print the untarring progress for each individual partition
TARGZUnpacker->setTarStatusProgressCallback( BaseUnpacker::defaultTarStatusProgressCallback ); // print the filenames as they're expanded
TARGZUnpacker->setTarMessageCallback( BaseUnpacker::targzPrintLoggerCallback ); // tar log verbosity

if( !TARGZUnpacker->tarGzStreamUpdater( streamptr ) ) {
Serial.printf("tarGzStreamUpdater failed with return code #%d\n", TARGZUnpacker->tarGzGetError() );
} else {
#if defined TEST_tarGzStreamUpdater
Unpacker->haltOnError( true ); // stop on fail (manual restart/reset required)
Unpacker->setTarVerify( false ); // disable verify as we're writing to a partition
Unpacker->setGzProgressCallback( BaseUnpacker::targzNullProgressCallback ); // gz progress is irrelevant for this operation
Unpacker->setTarProgressCallback( BaseUnpacker::defaultProgressCallback ); // print the untarring progress for each individual partition
Unpacker->setTarStatusProgressCallback( BaseUnpacker::defaultTarStatusProgressCallback ); // print the filenames as they're expanded
Unpacker->setTarMessageCallback( BaseUnpacker::targzPrintLoggerCallback ); // tar log verbosity
if( !Unpacker->tarGzStreamUpdater( streamptr ) ) {
Serial.printf("tarGzStreamUpdater failed with return code #%d\n", Unpacker->tarGzGetError() );
}
#elif defined TEST_gzStreamUpdater
//GzUnpacker *Unpacker = new GzUnpacker();
Unpacker->setGzProgressCallback( BaseUnpacker::targzNullProgressCallback );
Unpacker->setPsram( true );
if( !Unpacker->gzStreamUpdater( streamptr, UPDATE_SIZE_UNKNOWN, 0, false ) ) {
Serial.printf("tarGzStreamUpdater failed with return code #%d\n", Unpacker->tarGzGetError() );
}
#endif
else {
Serial.println("Update successful, now loading the new firmware!");
ESP.restart();
}
Expand Down
46 changes: 44 additions & 2 deletions examples/Test_tar_gz_tgz/Test_tar_gz_tgz.ino
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,44 @@ bool test_gzExpander()
}


// test #2.5 gzStreamExpander()
// Requires: gz stream (file, http) + stream write callback function
bool test_gzStreamExpander()
{
bool ret = false;
const char* gzFile = "/gz_example.jpg.gz";
myPackage.folder = "/"; // for md5 tests

SerialPrintCentered("Testing gzExpander", false, true );

GzUnpacker *GZUnpacker = new GzUnpacker();
GZUnpacker->haltOnError( true ); // stop on fail (manual restart/reset required)
GZUnpacker->setGzProgressCallback( BaseUnpacker::defaultProgressCallback ); // targzNullProgressCallback or defaultProgressCallback
GZUnpacker->setLoggerCallback( BaseUnpacker::targzPrintLoggerCallback ); // gz log verbosity
GZUnpacker->setGzMessageCallback( myTarMessageCallback/*BaseUnpacker::targzPrintLoggerCallback*/ );

GZUnpacker->setStreamWriter( myStreamWriter );

fs::File file = tarGzFS.open( gzFile, "r" );

if (!file) {
Serial.println( OpenLine );
SerialPrintfCentered("Can't open file");
Serial.println( CloseLine );
while(1) { yield(); }
}
Stream *streamptr = &file;

if( !GZUnpacker->gzStreamExpander( streamptr, file.size() ) ) {
Serial.println( OpenLine );
SerialPrintfCentered("test_gzStreamExpander failed with return code #%d", GZUnpacker->tarGzGetError() );
Serial.println( CloseLine );
} else {
ret = true;
}
return ret;
}


// Test #3: tarGzExpander() with intermediate file
// Requires: targz file, no filename requirements
Expand Down Expand Up @@ -111,6 +149,10 @@ bool test_tarGzExpander()
TARGZUnpacker->setTarStatusProgressCallback( BaseUnpacker::defaultTarStatusProgressCallback ); // print the filenames as they're expanded
TARGZUnpacker->setTarMessageCallback( myTarMessageCallback/*BaseUnpacker::targzPrintLoggerCallback*/ ); // tar log verbosity

// include/exclude filters, can be set/omitted both or separately
TARGZUnpacker->setTarExcludeFilter( myTarExcludeFilter ); // will ignore files/folders
TARGZUnpacker->setTarIncludeFilter( myTarIncludeFilter ); // will allow files/folders

if( !TARGZUnpacker->tarGzExpander(tarGzFS, tarGzFile, tarGzFS, myPackage.folder ) ) {
Serial.println( OpenLine );
SerialPrintfCentered("tarGzExpander+intermediate file failed with return code #%d", TARGZUnpacker->tarGzGetError() );
Expand Down Expand Up @@ -154,7 +196,7 @@ bool test_tarGzExpander_no_intermediate()
Serial.println("Testing tarGzExpander without intermediate file");
if( !TARGZUnpacker->tarGzExpander(tarGzFS, tarGzFile, tarGzFS, myPackage.folder, nullptr ) ) {
Serial.println( OpenLine );
SerialPrintfCentered("tarGzExpander+intermediate file failed with return code #%d", TARGZUnpacker->tarGzGetError() );
SerialPrintfCentered("tarGzExpander direct expanding failed with return code #%d", TARGZUnpacker->tarGzGetError() );
Serial.println( CloseLine );
} else {
ret = true;
Expand Down Expand Up @@ -367,7 +409,7 @@ void setup()
switch( testNum )
{
case 0: test_succeeded = test_tarExpander(); break;
case 1: test_succeeded = test_gzExpander(); break;
case 1: test_succeeded = test_gzExpander() && test_gzStreamExpander(); break;
case 2: test_succeeded = test_tarGzExpander(); break;
case 3: test_succeeded = test_tarGzExpander_no_intermediate(); break;
case 4: test_succeeded = test_tarGzStreamExpander(); break;
Expand Down
32 changes: 32 additions & 0 deletions examples/Test_tar_gz_tgz/test_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -211,3 +211,35 @@ void myTarMessageCallback(const char* format, ...)

}




bool myTarIncludeFilter( TAR::header_translated_t *proper )
{
// unpack files from "img/" and "css/" folders only
return (strstr(proper->filename, "img/") != NULL) || (strstr(proper->filename, "css/") != NULL);
// only unpack small files
// return (proper->filesize < 256*1024);
}

bool myTarExcludeFilter( TAR::header_translated_t *proper )
{
// exclude "logo.png"
return (strstr(proper->filename, "logo.png") != NULL);
// don't unpack folders
// return (proper->type == TAR::T_DIRECTORY);
// ignore dotfiles
// return String( basename( proper->filename ) ).startsWith("." );
}


BaseUnpacker *Base = new BaseUnpacker();

bool myStreamWriter( unsigned char* buff, size_t buffsize )
{
Base->hexDumpData( (const char*)buff, buffsize, 32 );
return true;
}



2 changes: 1 addition & 1 deletion library.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name=ESP32-targz
version=1.0.4-beta
version=1.0.5-beta
author=tobozo <[email protected]>
maintainer=tobozo <[email protected]>
sentence=A library to unpack/uncompress tar, gz, and tar.gz files on ESP32 and ESP8266
Expand Down
Loading

0 comments on commit dc8c8c3

Please sign in to comment.