diff --git a/src/auditor/Makefile.am b/src/auditor/Makefile.am index 724b43205..739195459 100644 --- a/src/auditor/Makefile.am +++ b/src/auditor/Makefile.am @@ -1,5 +1,5 @@ # This Makefile.am is in the public domain -AM_CPPFLAGS = -I$(top_srcdir)/src/include +AM_CPPFLAGS = -I$(top_srcdir)/src/include if USE_COVERAGE AM_CFLAGS = --coverage -O0 @@ -12,7 +12,6 @@ pkgcfg_DATA = \ auditor.conf bin_PROGRAMS = \ - taler-auditor \ taler-auditor-sign taler_auditor_SOURCES = \ diff --git a/src/auditor/taler-auditor.c b/src/auditor/taler-auditor.c index 0f43f454d..483f30353 100644 --- a/src/auditor/taler-auditor.c +++ b/src/auditor/taler-auditor.c @@ -1,6 +1,6 @@ /* This file is part of TALER - Copyright (C) 2016 Inria + Copyright (C) 2016, 2017 Inria TALER 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 @@ -44,6 +44,16 @@ static struct TALER_EXCHANGEDB_Session *esession; */ static struct TALER_AUDITORDB_Plugin *adb; +/** + * Our session with the #adb. + */ +static struct TALER_AUDITORDB_Session *asession; + +/** + * Master public key of the exchange to audit. + */ +static struct TALER_MasterPublicKeyP master_pub; + /** * Last reserve_in serial ID seen. */ @@ -54,6 +64,26 @@ static uint64_t reserve_in_serial_id; */ static uint64_t reserve_out_serial_id; +/** + * Last deposit serial ID seen. + */ +static uint64_t last_deposit_serial_id; + +/** + * Last melt serial ID seen. + */ +static uint64_t melt_serial_id; + +/** + * Last deposit refund ID seen. + */ +static uint64_t last_refund_serial_id; + +/** + * Last prewire serial ID seen. + */ +static uint64_t last_prewire_serial_id; + /** * Summary data we keep per reserve. @@ -274,10 +304,11 @@ verify_reserve_balance (void *cls, /** * Analyze reserves for being well-formed. * + * @param cls NULL * @return #GNUNET_OK on success, #GNUNET_SYSERR on invariant violation */ static int -analyze_reserves () +analyze_reserves (void *cls) { reserves = GNUNET_CONTAINER_multihashmap_create (512, GNUNET_NO); @@ -303,6 +334,121 @@ analyze_reserves () } +/** + * Type of an analysis function. + * + * @param cls closure + * @param int #GNUNET_OK on success + */ +typedef int +(*Analysis)(void *cls); + + +/** + * Perform the given @a analysis within a transaction scope. + * Commit on success. + * + * @param analysis analysis to run + * @param analysis_cls closure for @a analysis + * @return #GNUNET_OK if @a analysis succeessfully committed + */ +static int +transact (Analysis analysis, + void *analysis_cls) +{ + ret = adb->get_auditor_progress (adb->cls, + asession, + &master_pub, + &reserve_in_serial_id, + &reserve_out_serial_id, + &deposit_serial_id, + &melt_serial_id, + &refund_serial_id, + &prewire_serial_id); + if (GNUNET_SYSERR == ret) + { + GNUNET_break (0); + return; + } + if (GNUNET_NO == ret) + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("First analysis using this auditor, starting audit from scratch\n")); + } + else + { + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("Resuming audit at %llu/%llu/%llu/%llu/%llu/%llu\n\n"), + (unsigned long long) reserve_in_serial_id, + (unsigned long long) reserve_out_serial_id, + (unsigned long long) deposit_serial_id, + (unsigned long long) melt_serial_id, + (unsigned long long) refund_serial_id, + (unsigned long long) prewire_serial_id); + } + + ret = analysis (analysis_cls); + // FIXME: add other 'analyze' calls here... + + ret = adb->update_auditor_progress (adb->cls, + asession, + &master_pub, + reserve_in_serial_id, + reserve_out_serial_id, + deposit_serial_id, + melt_serial_id, + refund_serial_id, + prewire_serial_id); + if (GNUNET_OK != ret) + { + GNUNET_break (0); + global_ret = 1; + return; + } + + GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE, + _("Resuming audit at %llu/%llu/%llu/%llu/%llu/%llu\n\n"), + (unsigned long long) reserve_in_serial_id, + (unsigned long long) reserve_out_serial_id, + (unsigned long long) deposit_serial_id, + (unsigned long long) melt_serial_id, + (unsigned long long) refund_serial_id, + (unsigned long long) prewire_serial_id); + +} + + +/** + * Initialize DB sessions and run the analysis. + */ +static void +setup_sessions_and_run () +{ + int ret; + + esession = edb->get_session (edb->cls); + if (NULL == esession) + { + fprintf (stderr, + "Failed to initialize exchange session.\n"); + global_ret = 1; + return; + } + asession = adb->get_session (adb->cls); + if (NULL == asession) + { + fprintf (stderr, + "Failed to initialize auditor session.\n"); + global_ret = 1; + return; + } + + transact (&analyze_reserves, + NULL); + // FIXME: add other 'analyze' calls here... +} + + /** * Main function that will be run. * @@ -334,23 +480,7 @@ run (void *cls, TALER_EXCHANGEDB_plugin_unload (edb); return; } - esession = edb->get_session (edb->cls); - if (NULL == esession) - { - fprintf (stderr, - "Failed to initialize exchange session.\n"); - global_ret = 1; - TALER_AUDITORDB_plugin_unload (adb); - TALER_EXCHANGEDB_plugin_unload (edb); - return; - } - - /* FIXME: init these from auditordb */ - reserve_in_serial_id = 1; - reserve_out_serial_id = 1; - - analyze_reserves (); - + setup_sessions_and_run (); TALER_AUDITORDB_plugin_unload (adb); TALER_EXCHANGEDB_plugin_unload (edb); }