Browse Source

tratar reconexão do banco de dados e a ami(asterisk)

pull/9/head
Rodgger 2 years ago
parent
commit
12bcc69b61
  1. 7
      dev
  2. 31
      src/database/database.c
  3. 68
      src/database/database.h
  4. 18
      src/log/log.h
  5. 10
      src/main.h
  6. 115
      src/peer/peer.c
  7. 35
      src/peer/peer.h
  8. 40
      src/peer/peer_db.c
  9. 1
      src/queue/queue_db.c
  10. 42
      src/settings/settings.c

7
dev

@ -0,0 +1,7 @@
Developer
Rodgger Bruno
- Colocar a estrutura RESPONSE_MARIADB como está na função para os eventos
parse_event_extensionstatus e banco de dados get_extensionstatus_db

31
src/database/database.c

@ -128,13 +128,24 @@ pthread_mutex_t m_db = PTHREAD_MUTEX_INITIALIZER;
*/
int db_connection(){
pthread_mutex_lock(&m_db);
if(mysql_ping( _database.mariadb)){
if(_database.disconnected == 0){
_WARNING("Não foi possível reconectar ao banco de dados.");
}
_database.disconnected = 1;
goto fail;
}
else{ //Banco de dados conectado
if(_database.disconnected == 1){ //banco de dados estava desconectado
_database.thread_id = 0;
_database.disconnected = 0;
}
}
if(_database.thread_id != mysql_thread_id(_database.mariadb)){
_database.disconnected = 0;
_NOTICE("Banco de dados reconectado");
_database.thread_id = mysql_thread_id(_database.mariadb);
if(init_stmt() == -1){
@ -144,6 +155,7 @@ int db_connection(){
pthread_mutex_unlock(&m_db);
return 0;
fail:
pthread_mutex_unlock(&m_db);
return -1;
@ -183,6 +195,7 @@ int connect_db(s_manager *smanager){
else {
_NOTICE("Banco de dados connectado");
_database.disconnected = 0;
_database.thread_id = mysql_thread_id(_database.mariadb);
break;
}
@ -202,6 +215,7 @@ void *init_thread(void *param){
s_manager *smanager = param;
_database.reconnect = 1;
_database.disconnected = 0;
_database.mariadb = mysql_init(NULL);
@ -234,10 +248,17 @@ void *init_thread(void *param){
}
}
else{
if(log_active_connect == 1){
if( log_active_connect == 1 ){
log_active_connect = 0;
_NOTICE("Reconectado com a AMI");
_NOTICE( "Reconectado com a AMI" );
action_complete(ZERO_FILL_ACTION, smanager);
}
}
unsigned short int p = _database.disconnected;
if( db_connection() == 0 && p != _database.disconnected){
action_complete(ZERO_FILL_ACTION, smanager);
}
/* se existe retorno de action */
@ -246,6 +267,7 @@ void *init_thread(void *param){
/* se existe eventos do asterisk */
verify_event ( smanager );
/* cada 0,05 segundos esse loop será executado */
usleep(50000);
}
@ -841,7 +863,10 @@ MARIADB_BIND *get_bind_result(MYSQL_STMT *stmt){
bind = create_bind_manager( size_columns );
rs_metadata = mysql_stmt_result_metadata(stmt);
if( rs_metadata == NULL ) goto fail;
if( rs_metadata == NULL ){
destroy_bind_manager(bind);
goto fail;
}
fields = mysql_fetch_fields(rs_metadata);

68
src/database/database.h

@ -21,6 +21,7 @@
#define DATABASE_H 1
#include <mariadb/mysql.h>
#include <main.h>
#define LEN_VARCHAR 255
@ -33,7 +34,7 @@
#define SET_STMT(stmt, type_stmt, integer) \
stmt = get_stmt(type_stmt); \
if(!stmt){ \
return (integer == 0 ? 0 : -1); \
FAIL(NULL); \
}
typedef unsigned int stmt_t;
@ -100,9 +101,23 @@ typedef struct {
MYSQL *mariadb;
my_bool reconnect;
unsigned long thread_id;
unsigned short int disconnected;
unsigned int seconds;
}s_database;
typedef struct {
long int error;
int success:1;
int no_data;
unsigned int row;
int data_truncated;
void *data;
} RESPONSE_MARIADB;
typedef struct MARIADB_BIND{
MYSQL_BIND *bind;
int id;
@ -123,23 +138,48 @@ typedef struct MARIADB_BIND{
} MARIADB_BIND;
/* row exten */
/*struct s_table_exten {
unsigned long long int id;
unsigned long long exten;
int status;
char *type;
char *status_text;
char *context;
struct s_table_exten *next;
};
*/
#define BIND_PARAM 1 //Para identificar as bind para destruir
#define BIND_RESULT 2 //bind para resultado são usado calloc e destroy_bind_manager free
#define NEW_RESPONSE_MARIADB(ptr) \
ptr = (RESPONSE_MARIADB *) calloc( 1, sizeof(RESPONSE_MARIADB) ); \
if(!ptr){ \
_EMERG( "calloc retornou NULL RESPONSE_MARIADB" ); \
ptr->error = -1; \
ptr->success = 0; \
ptr->data = NULL; \
goto fail; \
}
#define SET_SUCCESS_MARIADB( ptr, boolean ) \
ptr->success = boolean
#define SET_ERROR_MARIADB( ptr, stmt ) \
ptr->error = (long int) mysql_stmt_errno(stmt)
#define BIND_PARAM 1 //Para identificar as bind para destruir
#define BIND_RESULT 2 //bind para resultado são usado calloc e destroy_bind_manager free
#define GET_ERROR_MARIADB( ptr ) \
ptr->error
#define GET_SUCCESS_MARIADB( ptr ) \
ptr->success
#define GET_DATA_MARIADB( ptr ) \
ptr->data
#define SET_DATA_MARIADB( ptr, table ) \
ptr->data = (void *) table
#define SET_TRUNCATED_MARIADB( ptr ) \
ptr->data_truncated = 1;
#define INCREMENT_ROW_MARIADB(ptr) \
ptr->row++
#define FREE_RESPONSE_MARIADB( ptr, func, a ) \
func( (a **)&ptr->data ); \
free( ptr ); \
ptr = NULL;
/* QUERYS PARA PREPARED */
#define QueryInsertexten "INSERT INTO exten ( exten, context, status, status_text, exten_type) VALUES (?, ?, ?, ?, ?)"

18
src/log/log.h

@ -55,16 +55,16 @@
#define FLAG_LOG_FILE O_APPEND
#define _EMERG(a, ...) system_log( FLAG_EMERG, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _ALERT(a, ...) system_log( FLAG_ALERT, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _CRIT(a, ...) system_log( FLAG_CRIT, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _ERROR(a, ...) system_log( FLAG_ERR, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _WARNING(a, ...) system_log( FLAG_WARNING, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _NOTICE(a, ...) system_log( FLAG_NOTICE, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _INFO(a, ...) system_log( FLAG_INFO, a, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _LOG(a, ...) system_log( 0, a, ##__VA_ARGS__) /* Envia apenas log amid sem syslog */
#define _EMERG(str, ...) system_log( FLAG_EMERG, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _ALERT( str, ...) system_log( FLAG_ALERT, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _CRIT( str, ...) system_log( FLAG_CRIT, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _ERROR( str, ...) system_log( FLAG_ERR, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _WARNING( str, ...) system_log( FLAG_WARNING, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _NOTICE( str, ...) system_log( FLAG_NOTICE, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _INFO( str, ...) system_log( FLAG_INFO, str, ##__VA_ARGS__) /* Envia log amid e syslog */
#define _LOG( str, ...) system_log( 0, str, ##__VA_ARGS__) /* Envia apenas log amid sem syslog */
#ifdef DEBUG
#define _DEBUG(str) system_log(FLAG_DEBUG, str, __LINE__, __FILE__)
#define _DEBUG(str, ...) system_log( FLAG_DEBUG, str, ##__VA_ARGS__ )
#endif

10
src/main.h

@ -47,6 +47,16 @@
#define AST_UPDATE 240 /* tempo para atualizar dados do asterisk, isto é, peer(tronco e ramal), agents, queue, queue_member, exten */
#ifdef DEBUG
#define FAIL(str, ...) \
if(str != NULL) \
_DEBUG(str, ##__VA_ARGS__); \
goto fail
#else
#define FAIL(useless, ...) \
goto fail
#endif
/* status da ligação - dial status

115
src/peer/peer.c

@ -27,11 +27,12 @@
/*
* field peer_callerid_number
* peer_callerid_name (mesmo que peer_callerid_number)
* type
* peer_trunk
/*!
* Essa função será chamada para analisar e manipular event
* extensionstatus
*
* \param event estrutura do evento extensionstatus
* \param smanager principal estrutura amid
*/
int parse_event_extensionstatus(EVENT *event, s_manager *smanager){
@ -74,7 +75,7 @@ int parse_event_extensionstatus(EVENT *event, s_manager *smanager){
int i_status, peer_trunk;
exten = ami_get_value( smanager->ami, event->args, "Exten" );
if( !exten ) goto fail;
if( !exten ){ FAIL( "Fail Exten - function %s", __func__ ); } // str em FAIL, apenas para debug
{ // analisar se é um tronco
struct s_peer *peer = get_peer( exten );
@ -87,47 +88,57 @@ int parse_event_extensionstatus(EVENT *event, s_manager *smanager){
}
status = ami_get_value( smanager->ami, event->args, "Status");
if(!status) { i_status = 0; } else{ i_status = atoi(status); }
status = ami_get_value( smanager->ami, event->args, "Status" );
if( !status ) { i_status = 0; } else{ i_status = atoi( status ); }
status_text = ami_get_value( smanager->ami, event->args, "StatusText");
if(!status_text) { goto fail; }
status_text = ami_get_value( smanager->ami, event->args, "StatusText" );
if( !status_text ) { FAIL("FAIL StatusText - function %s", __func__ ); }
{/* banco de dados */
{ /* banco de dados */
struct s_table_peer *table_peer;
RESPONSE_MARIADB *response_mariadb = NULL;
response_mariadb = get_extensionstatus_db( Select_extensionstatus, exten );
if( !GET_SUCCESS_MARIADB( response_mariadb ) ){
FREE_RESPONSE_MARIADB( response_mariadb, free_table_peer, struct s_table_peer );
FAIL( "FAIL get_extensionstatus_db - function %s", __func__ );
}
table_peer = get_extensionstatus_db( Select_extensionstatus, exten );
table_peer = (struct s_table_peer *) GET_DATA_MARIADB(response_mariadb);
if( table_peer ){
/* Retirar extension */
if( i_status == -2 || i_status == -1 ){
/* delete row no banco
* The extension was removed from the dialplan. */
delete_extensionstatus_db(Delete_extensionstatus, table_peer->id);
struct s_peer *peer = get_peer(exten);
if(peer){
remove_peer(peer);
}
free_table_peer(&table_peer);
goto fail;
FREE_RESPONSE_MARIADB( response_mariadb, free_table_peer, struct s_table_peer );
}
/* verifica se houve mudança na extension */
else if( (table_peer->trunk != peer_trunk) ||
table_peer->exten_status != i_status ||
strcmp_n(table_peer->exten_statustext, status_text)) {
if(update_extensionstatus_db(Update_extensionstatus, i_status, status_text, peer_trunk, table_peer->id) == -1){
_WARNING("Falha %s %d\n", exten, __LINE__);
/* atualiza a linha da extensão no banco de dados */
if( update_extensionstatus_db( Update_extensionstatus, i_status, status_text, peer_trunk, table_peer->id ) == -1 ){
_WARNING("ERRO update row %s %s\n", exten, __func__);
FREE_RESPONSE_MARIADB( response_mariadb, free_table_peer, struct s_table_peer );
FAIL( "FAIL update_extensionstatus_db - function %s", __func__ );
}
}
free_table_peer(&table_peer);
}
else if (i_status != -2) { /* inserir novo extension no banco */
insert_extensionstatus_db(Insert_extensionstatus, exten, i_status, status_text, peer_trunk);
if( insert_extensionstatus_db(Insert_extensionstatus, exten, i_status, status_text, peer_trunk) == -1){
_WARNING("ERRO insert row %s %s\n", exten, __func__);
FREE_RESPONSE_MARIADB( response_mariadb, free_table_peer, struct s_table_peer );
FAIL( "FAIL insert_extensionstatus_db - function %s", __func__ );
}
}
FREE_RESPONSE_MARIADB( response_mariadb, free_table_peer, struct s_table_peer );
}
{/* camada de persistência */
@ -196,7 +207,13 @@ fail:
}
/*!
* Essa função será chamada para analisar e manipular event
* peerentry
*
* \param event estrutura do evento peerentry
* \param smanager principal estrutura
*/
int parse_event_peerentry( EVENT *event, s_manager *smanager ){
/*
Event: PeerEntry
@ -224,10 +241,11 @@ int parse_event_peerentry( EVENT *event, s_manager *smanager ){
int peer_trunk;
channeltype = ami_get_value(smanager->ami, event->args, "Channeltype");
if(!channeltype) goto fail;
_LOG("Channeltype - %s function %s", channeltype, __func__ );
if(!channeltype){ FAIL("FAIL Channeltype - function %s", __func__ ); }
objectname = ami_get_value(smanager->ami, event->args, "ObjectName");
if(!objectname) goto fail;
if(!objectname){ FAIL( "FAIL ObjectName - function %s", __func__);}
ipaddress = ami_get_value(smanager->ami, event->args, "IPaddress");
if(!strncmp(ipaddress, "-none-", 6)){
@ -263,13 +281,19 @@ int parse_event_peerentry( EVENT *event, s_manager *smanager ){
(strcmp_n(table_peer->protocol, channeltype) != 0) ||
(strcmp_n(table_peer->address, ipaddress) != 0) ) {
update_peerentry_db(Update_peerentry, channeltype, ipaddress, table_peer->trunk, table_peer->id);
if(update_peerentry_db(Update_peerentry, channeltype, ipaddress, table_peer->trunk, table_peer->id) == -1){
_WARNING("ERRO update row %s %s\n", objectname, __func__ );
FAIL( "FAIL update_peerentry_db - function %s", __func__ );
}
}
free_table_peer(&table_peer);
}
else{
insert_peerentry_db(Insert_peerentry, objectname, channeltype, ipaddress, peer_trunk);
if( insert_peerentry_db(Insert_peerentry, objectname, channeltype, ipaddress, peer_trunk) == -1 ){
_WARNING("ERRO insert row %s %s\n", objectname, __func__);
FAIL( "FAIL insert_peerentry_db - function %s", __func__ );
}
}
}
@ -309,7 +333,6 @@ int parse_event_peerentry( EVENT *event, s_manager *smanager ){
}
}
return 1;
fail:
@ -317,7 +340,13 @@ fail:
}
/*!
* Essa função será chamada para analisar e manipular event
* peerstatus
*
* \param event estrutura do evento peerstatus
* \param smanager principal estrutura
*/
int parse_event_peerstatus( EVENT *event, s_manager *smanager ){
/*
@ -337,21 +366,19 @@ int parse_event_peerstatus( EVENT *event, s_manager *smanager ){
const char *protocol, *peer, *status, *address, *exten;
protocol = ami_get_value(smanager->ami, event->args, "Channeltype");
if(!protocol) goto fail;
protocol = ami_get_value( smanager->ami, event->args, "Channeltype" );
// if(!protocol){ FAIL( "ERRO Channeltype - function %s", __func__ ); }
peer = ami_get_value(smanager->ami, event->args, "Peer");
if(!peer) goto fail;
peer = ami_get_value( smanager->ami, event->args, "Peer" );
if(!peer){ FAIL( "ERRO Peer - function %s", __func__ ); }
exten = get_parse_exten(peer);
if(!exten) goto fail;
// if(!exten){ FAIL( "ERRO get_parse_exten - function %s", __func__ ); }
status = ami_get_value(smanager->ami, event->args, "PeerStatus");
status = ami_get_value(smanager->ami, event->args, "PeerStatus" );
address = ami_get_value(smanager->ami, event->args, "Address");
address = ami_get_value(smanager->ami, event->args, "Address" );
{ /* Database
*
*
*/
struct s_table_peer *table_peer = NULL;
table_peer = get_peerstatus_db( Select_peerstatus, exten );
@ -360,13 +387,19 @@ int parse_event_peerstatus( EVENT *event, s_manager *smanager ){
strcmp_n( table_peer->address, ( !strcasecmp_n(status, "Reachable") ? table_peer->address : address )) ||
strcmp_n( table_peer->status, status )){
update_peerstatus_db( Update_peerstatus, protocol, status, address, table_peer->id );
if(update_peerstatus_db( Update_peerstatus, protocol, status, address, table_peer->id ) == -1){
_WARNING("ERRO update row %s %s\n", peer, __func__ );
FAIL( "FAIL update_peerstatus_db - function %s", __func__ );
}
}
free_table_peer(&table_peer);
}
else {
insert_peerstatus_db( Insert_peerstatus, exten, protocol, status, address );
if(insert_peerstatus_db( Insert_peerstatus, exten, protocol, status, address ) == -1){
_WARNING("ERRO update row %s %s\n", peer, __func__ );
FAIL( "FAIL insert_peerstatus_db - function %s", __func__ );
}
}
}

35
src/peer/peer.h

@ -40,6 +40,39 @@ struct s_table_peer {
};
#define column_id(tb) \
tb->id
#define column_callerid_number(tb) \
tb->callerid_number
#define column_callerid_name(tb) \
tb->callerid_name
#define column_protocol(tb) \
tb->protocol
#define column_status(tb) \
tb->status
#define column_exten_status(tb) \
tb->exten_status
#define column_exten_statustext(tb) \
tb->exten_statustext
#define column_address(tb) \
tb->address
#define column_trunk(tb) \
tb->trunk
#define column__time(tb) \
tb->_time
int parse_event_peerentry( EVENT *event, s_manager *smanager );
int parse_event_peerlistcomplete(EVENT *event, s_manager *smanager);
int parse_event_peerstatus( EVENT *event, s_manager *smanager );
@ -61,7 +94,7 @@ int update_extensionstatus_db( stmt_t type_stmt,
const char *status_text,
int peer_trunk,
unsigned long long int id );
struct s_table_peer *get_extensionstatus_db(stmt_t type_stmt, const char *peer_callerid_number);
RESPONSE_MARIADB *get_extensionstatus_db(stmt_t type_stmt, const char *peer_callerid_number);
int delete_extensionstatus_db(stmt_t type_stmt, unsigned long long peer_id);
int update_peer_dynamic(stmt_t type_stmt, int dynamic, unsigned long long peer_id);

40
src/peer/peer_db.c

@ -127,10 +127,12 @@ fail:
/* ExtensionStatus */
struct s_table_peer *get_extensionstatus_db(stmt_t type_stmt, const char *peer_callerid_number){
RESPONSE_MARIADB *get_extensionstatus_db(stmt_t type_stmt, const char *peer_callerid_number){
// SELECT id, callerid_number, trunk, exten_status, exten_statustext FROM peer where callerid_number = ?;
MYSQL_STMT *stmt;
RESPONSE_MARIADB *response_mariadb = NULL;
MYSQL_STMT *stmt = NULL;
NEW_RESPONSE_MARIADB( response_mariadb );
SET_STMT( stmt, type_stmt, 0 );
pthread_mutex_lock(&m_db);
@ -138,22 +140,24 @@ struct s_table_peer *get_extensionstatus_db(stmt_t type_stmt, const char *peer_c
MARIADB_BIND *bind = create_bind_manager( 1 );
set_in_mariadb_column(&bind[0], ARG_STR_DB((char *)peer_callerid_number), (char *)peer_callerid_number, 0, isNULL(peer_callerid_number));
if(mariadb_stmt_execute(stmt, bind) == -1){
_CRIT("ERRO: %s - FILE %s - Line %d\n", mysql_stmt_error(stmt), __FILE__, __LINE__);
SET_ERROR_MARIADB( response_mariadb, stmt );
_CRIT("ERRO: %s - FUNC:%s", mysql_stmt_error(stmt), __func__ );
goto fail;
}
MARIADB_BIND *bind_result;
bind_result = get_bind_result(stmt);
if(!bind_result){
SET_SUCCESS_MARIADB(response_mariadb, 0);
goto fail;
}
struct s_table_peer *table_peer = NULL, *table_peer_next = NULL;
int returnf = 0;
while(1){
returnf = mysql_stmt_fetch(stmt);
SET_SUCCESS_MARIADB( response_mariadb, 1 );
if(returnf == 1 || returnf == MYSQL_NO_DATA){
break;
}
struct s_table_peer *table_peer = NULL, *table_peer_next = NULL;
while(!mysql_stmt_fetch(stmt)){
table_peer_next = (struct s_table_peer *)calloc(1, sizeof(struct s_table_peer));
if(!table_peer_next){ break; }
@ -184,16 +188,22 @@ struct s_table_peer *get_extensionstatus_db(stmt_t type_stmt, const char *peer_c
table_peer_next->exten_statustext = NULL;
}
add_table_peer(&table_peer, table_peer_next);
INCREMENT_ROW_MARIADB( response_mariadb );
add_table_peer( &table_peer, table_peer_next );
}
destroy_bind_manager(bind_result);
destroy_bind_manager( bind_result );
pthread_mutex_unlock( &m_db );
SET_DATA_MARIADB( response_mariadb, table_peer );
//s response_mariadb->data = (void *) table_peer;
return response_mariadb;
pthread_mutex_unlock(&m_db);
return table_peer;
fail:
pthread_mutex_unlock(&m_db);
return NULL;
return response_mariadb;
}

1
src/queue/queue_db.c

@ -250,6 +250,7 @@ struct s_table_queue_member_update *get_queue_member_update_db(stmt_t type_stmt)
destroy_bind_manager(bind_result);
pthread_mutex_unlock(&m_db);
return table_member_update;
fail:

42
src/settings/settings.c

@ -44,27 +44,27 @@ int parse_response_CoreSettings(RESPONSE *response, s_manager *smanager, const c
return -1;
}
char *amiversion = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_AMIversion );
char *asteriskversion = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_AsteriskVersion );
char *systemname = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_SystemName );
char *coremaxcalls = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxCalls );
char *coremaxloadavg = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxLoadAvg );
char *corerunuser = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRunUser );
char *corerungroup = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRunGroup );
char *coremaxfilehandles = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxFilehandles );
char *corerealtimeenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRealTimeEnabled );
char *corecdrenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreCDRenabled );
char *corehttpenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreHTTPenabled );
{ // DATABASE
/* AMIversion */
struct s_table_settings *table_settings = NULL;
// table_settings = get_settings_db( Select_key_settings, KEY_SETTINGS_AMIversion );
}
// char *amiversion = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_AMIversion );
// char *asteriskversion = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_AsteriskVersion );
// char *systemname = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_SystemName );
// char *coremaxcalls = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxCalls );
// char *coremaxloadavg = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxLoadAvg );
// char *corerunuser = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRunUser );
// char *corerungroup = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRunGroup );
// char *coremaxfilehandles = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreMaxFilehandles );
// char *corerealtimeenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreRealTimeEnabled );
// char *corecdrenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreCDRenabled );
// char *corehttpenabled = ami_get_value( smanager->ami, response->args, KEY_SETTINGS_CoreHTTPenabled );
//
// { // DATABASE
//
// /* AMIversion */
// struct s_table_settings *table_settings = NULL;
// // table_settings = get_settings_db( Select_key_settings, KEY_SETTINGS_AMIversion );
//
//
//
// }
return 0;

Loading…
Cancel
Save