incomplete working on taler-auditor

This commit is contained in:
Christian Grothoff 2017-03-14 12:22:03 +01:00
parent b06e314dbb
commit 9aec6f7727
No known key found for this signature in database
GPG Key ID: 939E6BE1E29FC3CC
2 changed files with 150 additions and 21 deletions

View File

@ -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 = \

View File

@ -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);
}