Skip to content
Snippets Groups Projects
Commit 6933365f authored by dmitriy.gerasimov's avatar dmitriy.gerasimov
Browse files

Merge branch 'features-2392' into 'master'

Features 2392

See merge request libdap-server-core-python!1
parents 3f53442d 2a315c48
No related branches found
No related tags found
1 merge request!26Support 3689
[submodule "libdap-server-core"]
path = libdap-server-core
url = https://gitlab.demlabs.net/cellframe/libdap-server-core.git
[submodule "libdap"]
path = libdap
url = https://gitlab.demlabs.net/cellframe/libdap.git
[submodule "libdap-crypto"]
path = libdap-crypto
url = https://gitlab.demlabs.net/cellframe/libdap-crypto.git
project(DapServerCore C)
cmake_minimum_required(VERSION 2.8)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_C_STANDARD 11)
set(SUBMODULES_NO_BUILD ON)
add_subdirectory(libdap)
add_subdirectory(libdap-crypto)
add_subdirectory(libdap-server-core)
file(GLOB SERVER_CORE_PYTHON_SRCS src/*.c)
file(GLOB SERVER_CORE_PYTHON_HEADERS include/*.h)
set(Python_ADDITIONAL_VERSIONS 3.7)
find_package (PythonLibs REQUIRED)
#find_package(PkgConfig)
#pkg_check_modules(PC_JSON-C REQUIRED json-c)
include_directories(${PYTHON_INCLUDE_DIR} include/)
add_library(${PROJECT_NAME} SHARED ${SERVER_CORE_PYTHON_SRCS} ${SERVER_CORE_PYTHON_HEADERS})
target_link_libraries(${PROJECT_NAME})
target_compile_options(
dap_server_core PRIVATE
"-fpic"
)
target_compile_options(
dap_core PRIVATE
"-fpic"
)
target_compile_options(
dap_crypto PRIVATE
"-fpic"
)
#target_link_libraries(${PROJECT_NAME} dap_core dap_crypto)
#targat_link_libraries(${PROJECT_NAME} dap_server_core)
target_link_libraries(${PROJECT_NAME} dap_core dap_crypto dap_server_core)
#if(BUILD_DAP_PYTHON_TESTS)
# add_subdirectory(test)
# enable_testing()
#endif()
#pragma once
#include "Python.h"
#include "dap_events.h"
#include "dap_events_socket_python.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct PyDapEvents{
PyObject_HEAD
dap_events_t *t_events;
}PyDapEventsObject;
void PyDapEventsObject_dealloc(PyDapEventsObject *eventsObject);
PyObject *PyDapEventsObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds);
//PyObject *dap_events_new_py();
//PyObject *dap_events_delete_py(PyObject *self, PyObject *args); //dap_events_t * sh );
//void dap_events_socket_remove_and_delete( dap_events_socket_t* a_es );
PyObject *dap_events_socket_remove_and_delete_py(PyDapEventsObject *self, PyObject *args); //dap_events_socket_t* a_es, bool preserve_inheritor );
PyObject *dap_events_kill_socket_py(PyDapEventsObject *self, PyObject *args); //dap_events_socket_t *a_es );
PyObject *dap_events_start_py(PyDapEventsObject *self); //dap_events_t *sh );
PyObject *dap_events_wait_py(PyDapEventsObject *self); //dap_events_t *sh );
static PyMethodDef PyDapEventsObject_methods[] = {
{"start", (PyCFunction)dap_events_start_py, METH_NOARGS, ""},
{"wait", (PyCFunction)dap_events_wait_py, METH_NOARGS, ""},
{"killSocket", (PyCFunction)dap_events_kill_socket_py, METH_VARARGS, ""},
{"removeAndDeleteSocket", (PyCFunction)dap_events_socket_remove_and_delete_py, METH_VARARGS, ""},
{NULL, NULL, 0, NULL} /* Sentinel */
};
static PyTypeObject dapEvents_dapEventsType = {
PyVarObject_HEAD_INIT(NULL, 0)
"libDapServerCore.DapEvents", /* tp_name */
sizeof(PyDapEventsObject), /* tp_basicsize */
0, /* tp_itemsize */
(destructor)PyDapEventsObject_dealloc,//(destructor)Noddy_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"DapEvents objects", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
PyDapEventsObject_methods,//Noddy_methods, /* tp_methods */
0,//Noddy_members, /* tp_members */
0,//Noddy_getseters, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0,//(initproc)PyDapEventsObject_init,//(initproc)Noddy_init, /* tp_init */
0, /* tp_alloc */
PyDapEventsObject_new,//Noddy_new, /* tp_new */
};
#ifdef __cplusplus
}
#endif
#pragma once
#include "Python.h"
#include "dap_events_socket.h"
#include "dap_events_python.h"
#include "dap_common.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct PyDapEventsSocket{
PyObject_HEAD
dap_events_socket_t *t_events_socket;
}PyDapEventsSocketObject;
PyObject *dap_events_socket_create_after_py(PyDapEventsSocketObject *self);//dap_events_socket_t * a_es);
//PyObject *dap_events_socket_wrap_no_add_py(PyObject *self, PyObject *args);//struct dap_events * a_events,
// int s, dap_events_socket_callbacks_t * a_callbacks); // Create new client and add it to the list
PyObject *dap_events_socket_find_py(PyDapEventsSocketObject *self, PyObject *args);//int sock, struct dap_events * sh); // Find client by socket
//PyObject *dap_events_socket_is_ready_to_read_py(PyDapEventsSocketObject *self);//dap_events_socket_t * sc);
//PyObject *dap_events_socket_is_ready_to_write_py(PyDapEventsSocketObject *self);//dap_events_socket_t * sc);
PyObject *dap_events_socket_set_readable_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * sc,bool is_ready);
PyObject *dap_events_socket_set_writable_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * sc,bool is_ready);
PyObject *dap_events_socket_write_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, const void * data, size_t data_size);
PyObject *dap_events_socket_write_f_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, const char * format,...);
PyObject *dap_events_socket_read_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc, void * data, size_t data_size);
PyObject *dap_events_socket_delete_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t *sc,bool preserve_inheritor); // Removes the client from the list
PyObject *dap_events_socket_shrink_buf_in_py(PyDapEventsSocketObject *self, PyObject *args);//dap_events_socket_t * cl, size_t shrink_size);
static PyMethodDef PyDapEventsObjectSocket_methods[] = {
{"createAfter", (PyCFunction)dap_events_socket_create_after_py, METH_NOARGS, ""},
{"find", (PyCFunction)dap_events_socket_find_py, METH_VARARGS, ""},
// {"isReadyToRead", (PyCFunction)dap_events_socket_is_ready_to_read_py, METH_NOARGS, ""},
// {"isReadyToWrite", (PyCFunction)dap_events_socket_is_ready_to_write_py, METH_NOARGS, ""},
{"setReadable", (PyCFunction)dap_events_socket_set_readable_py, METH_VARARGS, ""},
{"setWritable", (PyCFunction)dap_events_socket_set_writable_py, METH_VARARGS, ""},
{"write", (PyCFunction)dap_events_socket_write_py, METH_VARARGS, ""},
{"writeF", (PyCFunction)dap_events_socket_write_f_py, METH_VARARGS, ""},
{"read", (PyCFunction)dap_events_socket_read_py, METH_VARARGS, ""},
{"delete", (PyCFunction)dap_events_socket_delete_py, METH_VARARGS, ""},
{"shringBufIn", (PyCFunction)dap_events_socket_shrink_buf_in_py, METH_VARARGS, ""},
{NULL, NULL, 0, NULL} /* Sentinel */
};
static PyTypeObject dapEventsSocket_dapEventsSocketType = {
PyVarObject_HEAD_INIT(NULL, 0)
"libDapServerCore.DapEventsSocket", /* tp_name */
sizeof(PyDapEventsSocketObject), /* tp_basicsize */
0, /* tp_itemsize */
0,//(destructor)Noddy_dealloc, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_reserved */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT |
Py_TPFLAGS_BASETYPE, /* tp_flags */
"DapEventsSocket objects", /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
PyDapEventsObjectSocket_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0,//(initproc)PyDapEventsObject_init,//(initproc)Noddy_init, /* tp_init */
0, /* tp_alloc */
PyType_GenericNew,//PyDapEventsObject_new,//Noddy_new, /* tp_new */
};
#ifdef __cplusplus
}
#endif
#define PY_SSIZE_T_CLEAN
#include "Python.h"
#include "dap_server.h"
#include "dap_client_remote.h"
#include "dap_events.h"
#include "dap_common.h"
#include "dap_events_python.h"
#include "dap_events_socket_python.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef struct PyDapServer {
PyObject_HEAD
dap_server_t *t_server;
}PyDapServerObject;
PyTypeObject dapServer_dapServerType = {
PyVarObject_HEAD_INIT(NULL, 0)
"libDapServerCore.DapServer", /* tp_name */
sizeof(PyDapServerObject), /* tp_basicsize */
0, /* tp_itemsize */
0, /* tp_dealloc */
0, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
0, /* tp_compare */
0, /* tp_repr */
0, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
0, /* tp_hash */
0, /* tp_call */
0, /* tp_str */
0, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT, /* tp_flags */
"DapServer objects", /* tp_doc */
};
#define LOG_TAG "libdap-server-core-python"
static PyObject *dap_server_core_init(PyObject *self, PyObject *args);
static PyObject *dap_server_core_deinit();
static PyObject *dap_server_core_loop(PyObject *self, PyObject *args);
static PyObject *dap_server_core_listen(PyObject *self, PyObject *args);
static PyMethodDef DapServerCorePythonMethods[] = {
{"init", dap_server_core_init, METH_VARARGS, "Initialization of the DAP (Deus Applicaions Prototypes) server core library"},
{"deinit", dap_server_core_deinit, METH_NOARGS, "Deinitialization of the DAP (Deus Applicaions Prototypes) server core library"},
{"loop", dap_server_core_loop, METH_VARARGS, ""},
{"listen", dap_server_core_listen, METH_VARARGS, ""},
{NULL, NULL, 0, NULL}
};
static struct PyModuleDef dapservercorepythonmodule = {
PyModuleDef_HEAD_INIT,
"libDapServerCore", /* name of module */
NULL, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module,
or -1 if the module keeps state in global variables. */
DapServerCorePythonMethods
};
PyMODINIT_FUNC PyInit_libDapServerCore(void);
#ifdef __cplusplus
}
#endif
Subproject commit 67993d1f4cec44de464acee32a4d4f71d51c7e7d
Subproject commit 6249887fdd5c9ed88eb26c1e10f853ea9f7001b6
Subproject commit 6778521f9f646e2985994e63f470067b3e2c1e48
#include "dap_events_python.h"
PyObject *PyDapEventsObject_new(PyTypeObject *type_object, PyObject *args, PyObject *kwds){
PyDapEventsObject *new_EO = (PyDapEventsObject*)PyType_GenericNew(type_object, args, kwds);
new_EO->t_events = dap_events_new();
return (PyObject *)new_EO;
}
void PyDapEventsObject_dealloc(PyDapEventsObject *eventsObject){
dap_events_delete(eventsObject->t_events);
Py_TYPE(eventsObject)->tp_free((PyObject*)eventsObject);
}
//void dap_events_socket_remove_and_delete( dap_events_socket_t* a_es );
PyObject *dap_events_socket_remove_and_delete_py(PyDapEventsObject *self, PyObject *args){
PyObject *in_obj;
PyObject *in_bool;
if (!PyArg_ParseTuple(args, "O|O", &in_obj, &in_bool)){
return NULL;
}
bool preserve_inheritor = true;
if (in_bool == Py_False)
preserve_inheritor = false;
dap_events_socket_remove_and_delete(((PyDapEventsSocketObject*)in_obj)->t_events_socket, preserve_inheritor);
return PyLong_FromLong(0);
}
PyObject *dap_events_kill_socket_py(PyDapEventsObject *self, PyObject *args){
PyObject *in_obj;
if (!PyArg_ParseTuple(args, "O", &in_obj)){
return NULL;
}
dap_events_kill_socket(((PyDapEventsSocketObject*)in_obj)->t_events_socket);
return PyLong_FromLong(0);
}
PyObject *dap_events_start_py(PyDapEventsObject *self){
int32_t result = dap_events_start(self->t_events);
return PyLong_FromLong(result);
}
PyObject *dap_events_wait_py(PyDapEventsObject *self){
int32_t result = dap_events_wait(self->t_events);
return PyLong_FromLong(result);
}
#include "dap_events_socket_python.h"
PyObject *dap_events_socket_create_after_py(PyDapEventsSocketObject *self){
if (self->t_events_socket == NULL){
return NULL;
}
dap_events_socket_create_after(self->t_events_socket);
return PyLong_FromLong(0);
}
//PyObject *dap_events_socket_wrap_no_add_py(PyObject *self, PyObject *args){
// return PyLong_FromLong(0);
//}
PyObject *dap_events_socket_find_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket != NULL){
return NULL;
}
int socket;
PyObject *in_object;
if (!PyArg_ParseTuple(args, "i|O", &socket, &in_object)){
return NULL;
}
self->t_events_socket = dap_events_socket_find(socket, ((PyDapEventsObject*)in_object)->t_events);
return PyLong_FromLong(0);
}
//PyObject *dap_events_socket_is_ready_to_read_py(PyDapEventsSocketObject *self){
// bool result = dap_events_socket_is_ready_to_read(self->t_events_socket);
// if (result)
// return Py_BuildValue("O", Py_True);
// else
// return Py_BuildValue("O", Py_False);
//}
//PyObject *dap_events_socket_is_ready_to_write_py(PyDapEventsSocketObject *self){
// bool result = dap_events_socket_is_ready_to_write(self->t_events_socket);
// if (result)
// return Py_BuildValue("O", Py_True);
// else
// return Py_BuildValue("O", Py_False);
//}
PyObject *dap_events_socket_set_readable_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
PyObject *l_is_ready;
if (!PyArg_ParseTuple(args, "O", &l_is_ready)){
return NULL;
}
bool is_ready = true;
if (l_is_ready == Py_False)
is_ready = false;
dap_events_socket_set_readable(self->t_events_socket, is_ready);
return PyLong_FromLong(0);
}
PyObject *dap_events_socket_set_writable_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
PyObject *l_is_ready;
if (!PyArg_ParseTuple(args, "O", &l_is_ready)){
return NULL;
}
bool is_ready = true;
if (l_is_ready == Py_False)
is_ready = false;
dap_events_socket_set_writable(self->t_events_socket, is_ready);
return PyLong_FromLong(0);
}
PyObject *dap_events_socket_write_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
PyBytesObject *in_bytes;
size_t in_size;
if (!PyArg_ParseTuple(args, "S|n", &in_bytes, &in_size)){
return NULL;
}
char *in_v_bytes = PyBytes_AsString((PyObject*)in_bytes);
size_t res_size = dap_events_socket_write(self->t_events_socket,
in_v_bytes, in_size);
return Py_BuildValue("n", res_size);
}
PyObject *dap_events_socket_write_f_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
const char *format;
PyTupleObject *pto;
if (!PyArg_ParseTuple(args, "s|O", &format, &pto)){
return NULL;
}
va_list ap;
if (!PyArg_VaParse(args, format, ap)){
return NULL;
}
size_t res_size = dap_events_socket_write_f(self->t_events_socket, format, ap);
return Py_BuildValue("n", res_size);
}
PyObject *dap_events_socket_read_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
size_t in_size;
if (!PyArg_ParseTuple(args, "n", &in_size)){
return NULL;
}
void *res = DAP_NEW_SIZE(void*, in_size);
size_t res_size = dap_events_socket_read(self->t_events_socket, res, in_size);
PyBytesObject *res_obj = (PyBytesObject*)PyBytes_FromString(res);
return Py_BuildValue("nS", res_size, res_obj);
}
PyObject *dap_events_socket_delete_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
PyObject *in_bool;
if (!PyArg_ParseTuple(args, "O", &in_bool)){
return NULL;
}
bool boolean = true;
if (in_bool == Py_False)
boolean = false;
dap_events_socket_delete(self->t_events_socket, boolean);
return PyLong_FromLong(0);
}
PyObject *dap_events_socket_shrink_buf_in_py(PyDapEventsSocketObject *self, PyObject *args){
if (self->t_events_socket == NULL){
return NULL;
}
size_t in_size;
if(!PyArg_ParseTuple(args, "n", &in_size)){
return NULL;
}
dap_events_socket_shrink_buf_in(self->t_events_socket, in_size);
return PyLong_FromLong(0);
}
#include "libdap-server-core-python.h"
static PyObject *dap_server_core_init(PyObject *self, PyObject *args){
uint32_t l_thread_cnt;
size_t conn_t;
dap_common_init("CVNT", "CVNT.log");
if (!PyArg_ParseTuple(args, "I|n", &l_thread_cnt, &conn_t)){
return NULL;
}
int32_t result = dap_server_init(l_thread_cnt);
if ( result != 0 ) {
log_it( L_CRITICAL, "Can't init socket server module" );
}
dap_events_init(l_thread_cnt, conn_t);
dap_client_remote_init();
return PyLong_FromLong(result);
}
static PyObject *dap_server_core_deinit(){
dap_client_remote_deinit();
dap_server_deinit();
dap_events_deinit();
return PyLong_FromLong(0);
}
static PyObject *dap_server_core_loop(PyObject *self, PyObject *args){
PyObject *obj_server;
if (!PyArg_ParseTuple(args, "O", &obj_server)){
return NULL;
}
int32_t result = dap_server_loop(((PyDapServerObject*)obj_server)->t_server);
log_it( result ? L_CRITICAL : L_NOTICE, "Server loop stopped with return code %d", ((PyDapServerObject*)obj_server)->t_server );
return PyLong_FromLong(result);
}
static PyObject *dap_server_core_listen(PyObject *self, PyObject *args){
const char *addr;
uint16_t port;
uint16_t type;
if (!PyArg_ParseTuple(args, "s|H|H", &addr, &port, &type)){
return NULL;
}
if (type > 1)
return NULL;
PyObject *obj = _PyObject_New(&dapServer_dapServerType);
((PyDapServerObject*)obj)->t_server = dap_server_listen(addr, port, type);
return Py_BuildValue("O", obj);
}
PyMODINIT_FUNC PyInit_libDapServerCore(void){
dapServer_dapServerType.tp_new = PyType_GenericNew;
//dapEvents_dapEventsType.tp_new = PyType_GenericNew;
dapEventsSocket_dapEventsSocketType.tp_new = PyType_GenericNew;
if (PyType_Ready(&dapServer_dapServerType) < 0 || PyType_Ready(&dapEvents_dapEventsType) < 0
|| PyType_Ready(&dapEventsSocket_dapEventsSocketType) < 0)
return NULL;
PyObject *module = PyModule_Create(&dapservercorepythonmodule);
PyModule_AddObject(module, "DapEvents", (PyObject*)&dapEvents_dapEventsType);
PyModule_AddObject(module, "DapEventsSocket", (PyObject*)&dapEventsSocket_dapEventsSocketType);
return module;
}
int main(int argc, char **argv) {
wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("libDapServerCore", PyInit_libDapServerCore);
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);
/* Initialize the Python interpreter. Required. */
Py_Initialize();
/* Optionally import the module; alternatively,
import can be deferred until the embedded script
imports it. */
PyImport_ImportModule("libDapServerCore");
PyMem_RawFree(program);
return 0;
}
import libDapServerCore as server
print ("Start wrapping libdap server core python module")
res_i = server.init(1, 0)
rc = server.listen("0.0.0.0", 3307, 0)
server.deinit()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment