make all exchange-tools load configs properly like other Taler tools

This commit is contained in:
Christian Grothoff 2016-04-16 13:57:22 +02:00
parent 3abb3bc372
commit a34891981c
3 changed files with 216 additions and 183 deletions

View File

@ -34,8 +34,12 @@ static char *exchange_directory;
/**
* Our configuration.
*/
static struct GNUNET_CONFIGURATION_Handle *kcfg;
static const struct GNUNET_CONFIGURATION_Handle *kcfg;
/**
* Return value from main().
*/
static int global_ret;
/**
* Function called on each signing key.
@ -194,42 +198,20 @@ exchange_denomkeys_check ()
/**
* The main function of the keyup tool
* Main function that will be run.
*
* @param argc number of arguments from the command line
* @param argv command line arguments
* @return 0 ok, 1 on error
* @param cls closure
* @param args remaining command-line arguments
* @param cfgfile name of the configuration file used (for saving, can be NULL!)
* @param cfg configuration
*/
int
main (int argc, char *const *argv)
static void
run (void *cls,
char *const *args,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
char *cfgfile;
const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile),
GNUNET_GETOPT_OPTION_HELP ("gnunet-exchange-keycheck OPTIONS"),
GNUNET_GETOPT_OPTION_END
};
GNUNET_assert (GNUNET_OK ==
GNUNET_log_setup ("taler-exchange-keycheck",
"WARNING",
NULL));
if (GNUNET_GETOPT_run ("taler-exchange-keycheck",
options,
argc, argv) < 0)
return 1;
kcfg = GNUNET_CONFIGURATION_create ();
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (kcfg,
cfgfile))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Malformed configuration file `%s', exit ...\n"),
cfgfile);
GNUNET_free_non_null (cfgfile);
return 1;
}
GNUNET_free_non_null (cfgfile);
kcfg = cfg;
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (kcfg,
"exchange",
@ -239,17 +221,46 @@ main (int argc, char *const *argv)
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchange",
"KEYDIR");
return 1;
global_ret = 1;
return;
}
if ( (GNUNET_OK != exchange_signkeys_check ()) ||
(GNUNET_OK != exchange_denomkeys_check ()) )
{
GNUNET_CONFIGURATION_destroy (kcfg);
return 1;
global_ret = 1;
return;
}
GNUNET_CONFIGURATION_destroy (kcfg);
return 0;
}
/**
* The main function of the keyup tool
*
* @param argc number of arguments from the command line
* @param argv command line arguments
* @return 0 ok, 1 on error
*/
int
main (int argc, char *const *argv)
{
const struct GNUNET_GETOPT_CommandLineOption options[] = {
GNUNET_GETOPT_OPTION_END
};
GNUNET_assert (GNUNET_OK ==
GNUNET_log_setup ("taler-exchange-keycheck",
"WARNING",
NULL));
if (GNUNET_OK !=
GNUNET_PROGRAM_run (argc, argv,
"taler-exchange-keycheck",
"Check keys of the exchange for validity",
options,
&run, NULL))
return 1;
return global_ret;
}
/* end of taler-exchange-keycheck.c */

View File

@ -30,16 +30,170 @@
*/
static char *exchange_directory;
/**
* Handle to the exchange's configuration
*/
static struct GNUNET_CONFIGURATION_Handle *cfg;
/**
* Our DB plugin.
*/
static struct TALER_EXCHANGEDB_Plugin *plugin;
/**
* Public key of the reserve as a string.
*/
static char *reserve_pub_str;
/**
* Amount to add as a string.
*/
static char *add_str;
/**
* Details about the wire transfer in JSON format.
*/
static char *details;
/**
* Return value from main().
*/
static int global_ret;
/**
* Run the database transaction.
*
* @param reserve_pub public key of the reserve to use
* @param add_value value to add
* @param jdetails JSON details
* @return #GNUNET_OK on success, #GNUNET_SYSERR on hard error,
* #GNUNET_NO if record exists
*/
static int
run_transaction (const struct TALER_ReservePublicKeyP *reserve_pub,
const struct TALER_Amount *add_value,
json_t *jdetails)
{
int ret;
struct TALER_EXCHANGEDB_Session *session;
session = plugin->get_session (plugin->cls,
GNUNET_NO);
if (NULL == session)
{
fprintf (stderr,
"Failed to initialize DB session\n");
return GNUNET_SYSERR;
}
/* FIXME: maybe allow passing timestamp via command-line? */
ret = plugin->reserves_in_insert (plugin->cls,
session,
reserve_pub,
add_value,
GNUNET_TIME_absolute_get (),
jdetails);
if (GNUNET_SYSERR == ret)
{
fprintf (stderr,
"Failed to update reserve.\n");
}
if (GNUNET_NO == ret)
{
fprintf (stderr,
"Record exists, reserve not updated.\n");
}
return ret;
}
/**
* Main function that will be run.
*
* @param cls closure
* @param args remaining command-line arguments
* @param cfgfile name of the configuration file used (for saving, can be NULL!)
* @param cfg configuration
*/
static void
run (void *cls,
char *const *args,
const char *cfgfile,
const struct GNUNET_CONFIGURATION_Handle *cfg)
{
struct TALER_Amount add_value;
json_t *jdetails;
json_error_t error;
struct TALER_ReservePublicKeyP reserve_pub;
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg,
"exchange",
"KEYDIR",
&exchange_directory))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchange",
"KEYDIR");
global_ret = 1;
return;
}
if ((NULL == reserve_pub_str) ||
(GNUNET_OK !=
GNUNET_STRINGS_string_to_data (reserve_pub_str,
strlen (reserve_pub_str),
&reserve_pub,
sizeof (struct TALER_ReservePublicKeyP))))
{
fprintf (stderr,
"Parsing reserve key invalid\n");
global_ret = 1;
return;
}
if ( (NULL == add_str) ||
(GNUNET_OK !=
TALER_string_to_amount (add_str,
&add_value)) )
{
fprintf (stderr,
"Failed to parse currency amount `%s'\n",
add_str);
global_ret = 1;
return;
}
if (NULL == details)
{
fprintf (stderr,
"No wiring details given (justification required)\n");
global_ret = 1;
return;
}
jdetails = json_loads (details,
JSON_REJECT_DUPLICATES,
&error);
if (NULL == jdetails)
{
fprintf (stderr,
"Failed to parse JSON transaction details `%s': %s (%s)\n",
details,
error.text,
error.source);
global_ret = 1;
return;
}
if (NULL ==
(plugin = TALER_EXCHANGEDB_plugin_load (cfg)))
{
fprintf (stderr,
"Failed to initialize database plugin.\n");
global_ret = 1;
return;
}
if (GNUNET_SYSERR ==
run_transaction (&reserve_pub,
&add_value,
jdetails))
global_ret = 1;
TALER_EXCHANGEDB_plugin_unload (plugin);
json_decref (jdetails);
}
/**
* The main function of the reservemod tool
@ -51,20 +205,10 @@ static struct TALER_EXCHANGEDB_Plugin *plugin;
int
main (int argc, char *const *argv)
{
char *cfgfile = NULL;
char *reserve_pub_str = NULL;
char *add_str = NULL;
struct TALER_Amount add_value;
char *details = NULL;
json_t *jdetails;
json_error_t error;
struct TALER_ReservePublicKeyP reserve_pub;
struct TALER_EXCHANGEDB_Session *session;
const struct GNUNET_GETOPT_CommandLineOption options[] = {
{'a', "add", "DENOM",
"value to add", 1,
&GNUNET_GETOPT_set_string, &add_str},
GNUNET_GETOPT_OPTION_CFG_FILE (&cfgfile),
{'d', "details", "JSON",
"details about the bank transaction which justify why we add this amount", 1,
&GNUNET_GETOPT_set_string, &details},
@ -72,143 +216,21 @@ main (int argc, char *const *argv)
{'R', "reserve", "KEY",
"reserve (public key) to modify", 1,
&GNUNET_GETOPT_set_string, &reserve_pub_str},
GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION),
GNUNET_GETOPT_OPTION_END
};
int ret;
GNUNET_assert (GNUNET_OK ==
GNUNET_log_setup ("taler-exchange-reservemod",
"WARNING",
NULL));
if (GNUNET_GETOPT_run ("taler-exchange-reservemod",
options,
argc, argv) < 0)
return 1;
cfg = GNUNET_CONFIGURATION_create ();
if (GNUNET_SYSERR == GNUNET_CONFIGURATION_load (cfg,
cfgfile))
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
_("Malformed configuration file `%s', exit ...\n"),
cfgfile);
GNUNET_free_non_null (cfgfile);
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (details);
GNUNET_free_non_null (reserve_pub_str);
return 1;
}
GNUNET_free_non_null (cfgfile);
if (GNUNET_OK !=
GNUNET_CONFIGURATION_get_value_filename (cfg,
"exchange",
"KEYDIR",
&exchange_directory))
{
GNUNET_log_config_missing (GNUNET_ERROR_TYPE_ERROR,
"exchange",
"KEYDIR");
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (details);
GNUNET_free_non_null (reserve_pub_str);
GNUNET_PROGRAM_run (argc, argv,
"taler-exchange-reservemod",
"Deposit funds into a Taler reserve",
options,
&run, NULL))
return 1;
}
if ((NULL == reserve_pub_str) ||
(GNUNET_OK !=
GNUNET_STRINGS_string_to_data (reserve_pub_str,
strlen (reserve_pub_str),
&reserve_pub,
sizeof (struct TALER_ReservePublicKeyP))))
{
fprintf (stderr,
"Parsing reserve key invalid\n");
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (details);
GNUNET_free_non_null (reserve_pub_str);
return 1;
}
if ( (NULL == add_str) ||
(GNUNET_OK !=
TALER_string_to_amount (add_str,
&add_value)) )
{
fprintf (stderr,
"Failed to parse currency amount `%s'\n",
add_str);
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (details);
GNUNET_free_non_null (reserve_pub_str);
return 1;
}
if (NULL == details)
{
fprintf (stderr,
"No wiring details given (justification required)\n");
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (reserve_pub_str);
return 1;
}
ret = 1;
if (NULL ==
(plugin = TALER_EXCHANGEDB_plugin_load (cfg)))
{
fprintf (stderr,
"Failed to initialize database plugin.\n");
goto cleanup;
}
session = plugin->get_session (plugin->cls,
GNUNET_NO);
if (NULL == session)
{
fprintf (stderr,
"Failed to initialize DB session\n");
goto cleanup;
}
jdetails = json_loads (details,
JSON_REJECT_DUPLICATES,
&error);
if (NULL == jdetails)
{
fprintf (stderr,
"Failed to parse JSON transaction details `%s': %s (%s)\n",
details,
error.text,
error.source);
goto cleanup;
}
/* FIXME: maybe allow passing timestamp via command-line? */
ret = plugin->reserves_in_insert (plugin->cls,
session,
&reserve_pub,
&add_value,
GNUNET_TIME_absolute_get (),
jdetails);
json_decref (jdetails);
if (GNUNET_SYSERR == ret)
{
fprintf (stderr,
"Failed to update reserve.\n");
goto cleanup;
}
if (GNUNET_NO == ret)
{
fprintf (stderr,
"Record exists, reserve not updated.\n");
}
ret = 0;
cleanup:
if (NULL != plugin)
TALER_EXCHANGEDB_plugin_unload (plugin);
if (NULL != cfg)
GNUNET_CONFIGURATION_destroy (cfg);
GNUNET_free_non_null (add_str);
GNUNET_free_non_null (details);
GNUNET_free_non_null (reserve_pub_str);
return ret;
return global_ret;
}
/* end taler-exchange-reservemod.c */