more work on aqhome-cgi.
This commit is contained in:
2
0BUILD
2
0BUILD
@@ -51,6 +51,8 @@
|
|||||||
<setVar name="pkgincludedir">$(includedir)/aqhome/$(package)</setVar>
|
<setVar name="pkgincludedir">$(includedir)/aqhome/$(package)</setVar>
|
||||||
<setVar name="pkgdatadir">$(datadir)/$(package)</setVar>
|
<setVar name="pkgdatadir">$(datadir)/$(package)</setVar>
|
||||||
|
|
||||||
|
<setVar name="httpdatadir">/var/www</setVar>
|
||||||
|
|
||||||
<option id="enable_testcode" type="string">
|
<option id="enable_testcode" type="string">
|
||||||
<default>TRUE</default>
|
<default>TRUE</default>
|
||||||
<choices>TRUE FALSE</choices>
|
<choices>TRUE FALSE</choices>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<gwbuild>
|
<gwbuild>
|
||||||
|
|
||||||
|
|
||||||
<target type="Program" name="aqhome-cgi" install="$(sbindir)" >
|
<target type="Program" name="aqhome-cgi" install="$(libdir)/cgi-bin" >
|
||||||
|
|
||||||
<includes type="c" >
|
<includes type="c" >
|
||||||
$(gwenhywfar_cflags)
|
$(gwenhywfar_cflags)
|
||||||
@@ -55,6 +55,7 @@
|
|||||||
<libraries>
|
<libraries>
|
||||||
$(gwenhywfar_libs)
|
$(gwenhywfar_libs)
|
||||||
-lm
|
-lm
|
||||||
|
$(aqcgi_libs)
|
||||||
</libraries>
|
</libraries>
|
||||||
|
|
||||||
<subdirs>
|
<subdirs>
|
||||||
@@ -117,6 +118,7 @@
|
|||||||
<useTargets>
|
<useTargets>
|
||||||
aqhome
|
aqhome
|
||||||
aqhcgi_service
|
aqhcgi_service
|
||||||
|
aqhcgi_modules
|
||||||
</useTargets>
|
</useTargets>
|
||||||
|
|
||||||
<libraries>
|
<libraries>
|
||||||
@@ -127,6 +129,7 @@
|
|||||||
|
|
||||||
<subdirs>
|
<subdirs>
|
||||||
service
|
service
|
||||||
|
modules
|
||||||
</subdirs>
|
</subdirs>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
14
apps/aqhome-cgi/README
Normal file
14
apps/aqhome-cgi/README
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
|
||||||
|
Modules:
|
||||||
|
- login
|
||||||
|
- devices
|
||||||
|
- list
|
||||||
|
- show?id="nodes/12345678"
|
||||||
|
- add
|
||||||
|
- edit
|
||||||
|
- delete
|
||||||
|
- values
|
||||||
|
- rooms
|
||||||
|
|
||||||
|
- dashboards
|
||||||
@@ -1,11 +1,167 @@
|
|||||||
|
|
||||||
|
|
||||||
|
#include "./service_file.h"
|
||||||
|
#include "aqhome-cgi/modules/mroot.h"
|
||||||
|
#include "aqhome/aqhome.h"
|
||||||
|
|
||||||
|
#include <aqcgi/cgi.h>
|
||||||
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/logger.h>
|
||||||
|
#include <gwenhywfar/text.h>
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define AQHOME_CGI_LOGFILE "/var/www/aqhome-cgi/log/aqhome-cgi.log"
|
||||||
|
|
||||||
|
#define AQHOME_CGI_DEFAULT_STATIC_FILES "0-build/services/static"
|
||||||
|
#define AQHOME_CGI_DEFAULT_RUNTIME_FILES "0-build/services/runtime"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles);
|
||||||
|
int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles);
|
||||||
|
AQH_MODULE *_loadModule(AQH_SERVICE *sv, AQCGI_REQUEST *rq, AQH_MODULE *mParent, const char *sModuleName);
|
||||||
|
static void logStart(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
AQCGI_REQUEST *rq;
|
||||||
|
|
||||||
|
logStart();
|
||||||
|
GWEN_Logger_Open(GWEN_LOGDOMAIN, "gwenhywfar", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
GWEN_Logger_Open(AQH_LOGDOMAIN, "aqhome", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
GWEN_Logger_Open(AQCGI_LOGDOMAIN, "aqcgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
GWEN_Logger_SetLevel(AQCGI_LOGDOMAIN, GWEN_LoggerLevel_Debug);
|
||||||
|
GWEN_Logger_Open(NULL, "aqhome-cgi", AQHOME_CGI_LOGFILE, GWEN_LoggerType_File, GWEN_LoggerFacility_Daemon);
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Init CGI");
|
||||||
|
AQCGI_Init();
|
||||||
|
|
||||||
|
rq=AQCGI_ReadRequest();
|
||||||
|
if (rq) {
|
||||||
|
const char *sPathStaticFiles;
|
||||||
|
const char *sPathRuntimeFiles;
|
||||||
|
|
||||||
|
sPathStaticFiles=getenv("AQHOME_STATIC_FILES");
|
||||||
|
if (!(sPathStaticFiles && *sPathStaticFiles))
|
||||||
|
sPathStaticFiles=AQHOME_CGI_DEFAULT_STATIC_FILES;
|
||||||
|
|
||||||
|
sPathRuntimeFiles=getenv("AQHOME_RUNTIME_FILES");
|
||||||
|
if (!(sPathRuntimeFiles && *sPathRuntimeFiles))
|
||||||
|
sPathRuntimeFiles=AQHOME_CGI_DEFAULT_RUNTIME_FILES;
|
||||||
|
|
||||||
|
_handleRequest(rq, sPathStaticFiles, sPathRuntimeFiles);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf(stdout, "Content-type: text/plain\n\n");
|
||||||
|
fprintf(stdout, "Error: No Request!\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
AQCGI_Fini();
|
||||||
|
|
||||||
|
fprintf(stdout, "Content-type: text/plain\n\n");
|
||||||
|
fprintf(stdout, "Request handled\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _handleRequest(AQCGI_REQUEST *rq, const char *sPathStaticFiles, const char *sPathRuntimeFiles)
|
||||||
|
{
|
||||||
|
AQH_SERVICE *sv;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
sv=AQH_ServiceFiles_new(sPathRuntimeFiles);
|
||||||
|
|
||||||
|
rv=_handlePath(sv, rq, sPathStaticFiles);
|
||||||
|
if (rv<0) {
|
||||||
|
}
|
||||||
|
AQH_Service_free(sv);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handlePath(AQH_SERVICE *sv, AQCGI_REQUEST *rq, const char *sPathStaticFiles)
|
||||||
|
{
|
||||||
|
AQH_MODULE *mRoot;
|
||||||
|
AQH_MODULE *mParent;
|
||||||
|
const GWEN_STRINGLIST *sl;
|
||||||
|
|
||||||
|
mRoot=AQH_ModRoot_new(sv, sPathStaticFiles);
|
||||||
|
mParent=mRoot;
|
||||||
|
|
||||||
|
sl=AQCGI_Request_GetStringlistPath(rq);
|
||||||
|
if (sl) {
|
||||||
|
GWEN_STRINGLISTENTRY *se;
|
||||||
|
|
||||||
|
se=GWEN_StringList_FirstEntry(sl);
|
||||||
|
while(se) {
|
||||||
|
GWEN_STRINGLISTENTRY *seNext;
|
||||||
|
const char *s;
|
||||||
|
|
||||||
|
seNext=GWEN_StringListEntry_Next(se);
|
||||||
|
s=GWEN_StringListEntry_Data(se);
|
||||||
|
if (s && *s) {
|
||||||
|
if (seNext) {
|
||||||
|
AQH_MODULE *m;
|
||||||
|
|
||||||
|
DBG_ERROR(NULL, "Entry: %s (%s)", s, seNext?"not last":"last");
|
||||||
|
m=AQH_ModService_LoadSubModule(mParent, rq, s);
|
||||||
|
if (m==NULL) {
|
||||||
|
AQH_Module_free(mRoot);
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 404, "Not found");
|
||||||
|
return GWEN_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
mParent=m;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
/* last, let module handle remaining part */
|
||||||
|
rv=AQH_ModService_HandleRequest(mParent, rq, s);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
AQH_Module_free(mRoot);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
se=seNext;
|
||||||
|
}
|
||||||
|
AQH_Module_free(mRoot);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AQH_Module_free(mRoot);
|
||||||
|
return GWEN_ERROR_GENERIC;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void logStart()
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
f=fopen(AQHOME_CGI_LOGFILE, "a+");
|
||||||
|
if (f!=NULL) {
|
||||||
|
fprintf(f, "Started.\n");
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
84
apps/aqhome-cgi/modules/0BUILD
Normal file
84
apps/aqhome-cgi/modules/0BUILD
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<target type="ConvenienceLibrary" name="aqhcgi_modules" >
|
||||||
|
|
||||||
|
<includes type="c" >
|
||||||
|
$(gwenhywfar_cflags)
|
||||||
|
-I$(topsrcdir)
|
||||||
|
-I$(topbuilddir)
|
||||||
|
-I$(topsrcdir)/apps
|
||||||
|
-I$(topbuilddir)/apps
|
||||||
|
-I$(builddir)
|
||||||
|
-I$(srcdir)
|
||||||
|
</includes>
|
||||||
|
|
||||||
|
<includes type="tm2" >
|
||||||
|
--include=$(builddir)
|
||||||
|
--include=$(srcdir)
|
||||||
|
</includes>
|
||||||
|
|
||||||
|
|
||||||
|
<define name="BUILDING_AQHOME" />
|
||||||
|
|
||||||
|
<setVar name="local/cflags">$(visibility_cflags)</setVar>
|
||||||
|
|
||||||
|
|
||||||
|
<setVar name="tm2flags-INACTIVE" >
|
||||||
|
--api=AQHOME_API
|
||||||
|
</setVar>
|
||||||
|
|
||||||
|
<setVar name="local/typefiles" >
|
||||||
|
</setVar>
|
||||||
|
|
||||||
|
<setVar name="local/built_sources" >
|
||||||
|
</setVar>
|
||||||
|
|
||||||
|
<setVar name="local/built_headers_pub">
|
||||||
|
</setVar>
|
||||||
|
|
||||||
|
|
||||||
|
<setVar name="local/built_headers_priv" >
|
||||||
|
</setVar>
|
||||||
|
|
||||||
|
|
||||||
|
<headers dist="false" install="$(pkgincludedir)/service" >
|
||||||
|
$(local/built_headers_pub)
|
||||||
|
</headers>
|
||||||
|
|
||||||
|
|
||||||
|
<headers dist="true" install="$(pkgincludedir)/service" >
|
||||||
|
mservice.h
|
||||||
|
mroot.h
|
||||||
|
</headers>
|
||||||
|
|
||||||
|
|
||||||
|
<headers dist="true" >
|
||||||
|
mservice_p.h
|
||||||
|
mroot_p.h
|
||||||
|
</headers>
|
||||||
|
|
||||||
|
|
||||||
|
<sources>
|
||||||
|
$(local/typefiles)
|
||||||
|
|
||||||
|
mservice.c
|
||||||
|
mroot.c
|
||||||
|
</sources>
|
||||||
|
|
||||||
|
|
||||||
|
<extradist>
|
||||||
|
</extradist>
|
||||||
|
|
||||||
|
|
||||||
|
<useTargets>
|
||||||
|
</useTargets>
|
||||||
|
|
||||||
|
<subdirs>
|
||||||
|
static
|
||||||
|
</subdirs>
|
||||||
|
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
109
apps/aqhome-cgi/modules/mroot.c
Normal file
109
apps/aqhome-cgi/modules/mroot.c
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "./mroot_p.h"
|
||||||
|
|
||||||
|
#include "aqhome-cgi/service/module.h"
|
||||||
|
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* defs and enums
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* global vars
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* forward declarations
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
|
static int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
|
static int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq);
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* code
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder)
|
||||||
|
{
|
||||||
|
AQH_MODULE *m;
|
||||||
|
|
||||||
|
m=AQH_ModService_new(sv, baseFolder);
|
||||||
|
AQH_ModService_SetHandleRequestFn(m, _handleRequest);
|
||||||
|
AQH_ModService_SetLoadSubModuleFn(m, _loadSubModule);
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_MODULE *_loadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName)
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem)
|
||||||
|
{
|
||||||
|
if (strcasecmp(sLastPathElem, "login")==0)
|
||||||
|
return _handleRqLogin(m, rq);
|
||||||
|
else if (strcasecmp(sLastPathElem, "signup")==0) {
|
||||||
|
}
|
||||||
|
else if (strcasecmp(sLastPathElem, "confirm")==0) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int _handleRqLogin(AQH_MODULE *m, AQCGI_REQUEST *rq)
|
||||||
|
{
|
||||||
|
if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_GET) {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv=AQH_ModService_RespondWithFile(m, rq, "login.html");
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
else if (AQCGI_Request_GetRequestMethod(rq)==AQCGI_REQUEST_METHOD_POST) {
|
||||||
|
GWEN_DB_NODE *dbPost;
|
||||||
|
|
||||||
|
dbPost=AQCGI_Request_GetDbPostBody(rq);
|
||||||
|
if (dbPost) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
27
apps/aqhome-cgi/modules/mroot.h
Normal file
27
apps/aqhome-cgi/modules/mroot.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQHOME_CGI_MROOT_H
|
||||||
|
#define AQHOME_CGI_MROOT_H
|
||||||
|
|
||||||
|
#include <aqhome-cgi/modules/mservice.h>
|
||||||
|
|
||||||
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/buffer.h>
|
||||||
|
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModRoot_new(AQH_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModRoot_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
|
int AQH_ModRoot_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
18
apps/aqhome-cgi/modules/mroot_p.h
Normal file
18
apps/aqhome-cgi/modules/mroot_p.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQHOME_CGI_MROOT_P_H
|
||||||
|
#define AQHOME_CGI_MROOT_P_H
|
||||||
|
|
||||||
|
#include "aqhome-cgi/modules/mroot.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
284
apps/aqhome-cgi/modules/mservice.c
Normal file
284
apps/aqhome-cgi/modules/mservice.c
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#include "./mservice_p.h"
|
||||||
|
|
||||||
|
#include "aqhome-cgi/service/module.h"
|
||||||
|
|
||||||
|
#include <gwenhywfar/debug.h>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* defs and enums
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define AQH_MOD_SERVICE_HEADERFILE "header.html"
|
||||||
|
#define AQH_MOD_SERVICE_FOOTERFILE "footer.html"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* global vars
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
GWEN_INHERIT(AQH_MODULE, AQH_MOD_SERVICE)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* forward declarations
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void GWENHYWFAR_CB _freeData(void *bp, void *p);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------------------------------
|
||||||
|
* code
|
||||||
|
* ------------------------------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModService_new(AQH_SERVICE *sv, const char *baseFolder)
|
||||||
|
{
|
||||||
|
AQH_MODULE *m;
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
m=AQH_Module_new();
|
||||||
|
GWEN_NEW_OBJECT(AQH_MOD_SERVICE, xm);
|
||||||
|
GWEN_INHERIT_SETDATA(AQH_MODULE, AQH_MOD_SERVICE, m, xm, _freeData);
|
||||||
|
|
||||||
|
xm->service=sv;
|
||||||
|
xm->baseFolder=(baseFolder && *baseFolder)?strdup(baseFolder):NULL;
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void _freeData(GWEN_UNUSED void *bp, void *p)
|
||||||
|
{
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=(AQH_MOD_SERVICE*) p;
|
||||||
|
free(xm->baseFolder);
|
||||||
|
GWEN_FREE_OBJECT(xm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm) {
|
||||||
|
return xm->service;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm) {
|
||||||
|
return xm->baseFolder;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm) {
|
||||||
|
xm->handleRequestFn=fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm) {
|
||||||
|
xm->loadSubModuleFn=fn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
if (m && dbuf) {
|
||||||
|
AQH_MODULE *mParent;
|
||||||
|
|
||||||
|
mParent=AQH_Module_Tree2_GetParent(m);
|
||||||
|
if (mParent) {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv=AQH_ModService_AddHeader(mParent, dbuf);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return AQH_ModService_ReadStaticFile(m, AQH_MOD_SERVICE_HEADERFILE, dbuf);
|
||||||
|
}
|
||||||
|
DBG_ERROR(NULL, "Argument missing");
|
||||||
|
return GWEN_ERROR_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
if (m && dbuf) {
|
||||||
|
AQH_MODULE *mParent;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv=AQH_ModService_ReadStaticFile(m, AQH_MOD_SERVICE_FOOTERFILE, dbuf);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
mParent=AQH_Module_Tree2_GetParent(m);
|
||||||
|
if (mParent) {
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv=AQH_ModService_AddFooter(mParent, dbuf);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_INFO(NULL, "here (%d)", rv);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBG_ERROR(NULL, "Argument missing");
|
||||||
|
return GWEN_ERROR_INVALID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sFilename)
|
||||||
|
{
|
||||||
|
GWEN_BUFFER *buf;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
buf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
rv=AQH_ModService_AddHeader(m, buf);
|
||||||
|
if (rv<0) {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
|
GWEN_Buffer_free(buf);
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
rv=AQH_ModService_ReadStaticFile(m, sFilename, buf);
|
||||||
|
if (rv<0) {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
|
GWEN_Buffer_free(buf);
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
rv=AQH_ModService_AddFooter(m, buf);
|
||||||
|
if (rv<0) {
|
||||||
|
AQCGI_SendResponseWithStatus(rq, 500, "Internal error");
|
||||||
|
GWEN_Buffer_free(buf);
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
AQCGI_Request_SetBufferResponseBody(rq, buf);
|
||||||
|
AQCGI_Request_AddResponseHeaderData(rq, "Content-type: text/html");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm && xm->handleRequestFn)
|
||||||
|
return xm->handleRequestFn(m, rq, sLastPathElem);
|
||||||
|
}
|
||||||
|
return GWEN_ERROR_NOT_IMPLEMENTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName)
|
||||||
|
{
|
||||||
|
if (m) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm && xm->loadSubModuleFn)
|
||||||
|
return xm->loadSubModuleFn(m, rq, sModuleName);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFFER *dbuf)
|
||||||
|
{
|
||||||
|
if (m && filename && dbuf) {
|
||||||
|
AQH_MOD_SERVICE *xm;
|
||||||
|
|
||||||
|
xm=GWEN_INHERIT_GETDATA(AQH_MODULE, AQH_MOD_SERVICE, m);
|
||||||
|
if (xm) {
|
||||||
|
GWEN_BUFFER *fbuf;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
fbuf=GWEN_Buffer_new(0, 256, 0, 1);
|
||||||
|
GWEN_Buffer_AppendString(fbuf, xm->baseFolder);
|
||||||
|
GWEN_Buffer_AppendString(fbuf, GWEN_DIR_SEPARATOR_S);
|
||||||
|
GWEN_Buffer_AppendString(fbuf, filename);
|
||||||
|
DBG_ERROR(NULL, "Reading file \"%s\"", GWEN_Buffer_GetStart(fbuf));
|
||||||
|
rv=GWEN_SyncIo_Helper_ReadFile(GWEN_Buffer_GetStart(fbuf), dbuf);
|
||||||
|
if (rv<0) {
|
||||||
|
DBG_ERROR(NULL, "Read(%s): %d", GWEN_Buffer_GetStart(fbuf), rv);
|
||||||
|
GWEN_Buffer_free(fbuf);
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
GWEN_Buffer_free(fbuf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DBG_ERROR(NULL, "Any arg is missing (or is not a AQH_MOD_SERVICE object)");
|
||||||
|
return GWEN_ERROR_INTERNAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
46
apps/aqhome-cgi/modules/mservice.h
Normal file
46
apps/aqhome-cgi/modules/mservice.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQHOME_CGI_MSERVICE_H
|
||||||
|
#define AQHOME_CGI_MSERVICE_H
|
||||||
|
|
||||||
|
#include <aqhome-cgi/service/module.h>
|
||||||
|
#include <aqhome-cgi/service/service.h>
|
||||||
|
|
||||||
|
#include <aqcgi/request.h>
|
||||||
|
|
||||||
|
#include <gwenhywfar/buffer.h>
|
||||||
|
|
||||||
|
|
||||||
|
typedef int (*AQH_MODSERVICE_HANDLEREQUEST_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
|
typedef AQH_MODULE* (*AQH_MODSERVICE_LOADSUBMODULE_FN)(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModService_new(AQH_SERVICE *sv, const char *baseFolder);
|
||||||
|
|
||||||
|
AQH_SERVICE *AQH_ModService_GetService(const AQH_MODULE *m);
|
||||||
|
const char *AQH_ModService_GetBaseFolder(const AQH_MODULE *m);
|
||||||
|
|
||||||
|
|
||||||
|
int AQH_ModService_AddHeader(AQH_MODULE *m, GWEN_BUFFER *dbuf);
|
||||||
|
int AQH_ModService_AddFooter(AQH_MODULE *m, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
AQH_MODULE *AQH_ModService_LoadSubModule(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sModuleName);
|
||||||
|
int AQH_ModService_HandleRequest(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sLastPathElem);
|
||||||
|
|
||||||
|
int AQH_ModService_RespondWithFile(AQH_MODULE *m, AQCGI_REQUEST *rq, const char *sFilename);
|
||||||
|
int AQH_ModService_ReadStaticFile(AQH_MODULE *m, const char *filename, GWEN_BUFFER *dbuf);
|
||||||
|
|
||||||
|
|
||||||
|
void AQH_ModService_SetHandleRequestFn(AQH_MODULE *m, AQH_MODSERVICE_HANDLEREQUEST_FN fn);
|
||||||
|
void AQH_ModService_SetLoadSubModuleFn(AQH_MODULE *m, AQH_MODSERVICE_LOADSUBMODULE_FN fn);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
27
apps/aqhome-cgi/modules/mservice_p.h
Normal file
27
apps/aqhome-cgi/modules/mservice_p.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
* This file is part of the project AqHome.
|
||||||
|
* AqHome (c) by 2025 Martin Preuss, all rights reserved.
|
||||||
|
*
|
||||||
|
* The license for this file can be found in the file COPYING which you
|
||||||
|
* should have received along with this file.
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef AQHOME_CGI_MSERVICE_P_H
|
||||||
|
#define AQHOME_CGI_MSERVICE_P_H
|
||||||
|
|
||||||
|
#include "aqhome-cgi/modules/mservice.h"
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct AQH_MOD_SERVICE AQH_MOD_SERVICE;
|
||||||
|
struct AQH_MOD_SERVICE {
|
||||||
|
AQH_SERVICE *service;
|
||||||
|
char *baseFolder;
|
||||||
|
|
||||||
|
AQH_MODSERVICE_HANDLEREQUEST_FN handleRequestFn;
|
||||||
|
AQH_MODSERVICE_LOADSUBMODULE_FN loadSubModuleFn;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
7
apps/aqhome-cgi/modules/static/0BUILD
Normal file
7
apps/aqhome-cgi/modules/static/0BUILD
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
<subdirs>
|
||||||
|
en
|
||||||
|
</subdirs>
|
||||||
|
</gwbuild>
|
||||||
13
apps/aqhome-cgi/modules/static/en/0BUILD
Normal file
13
apps/aqhome-cgi/modules/static/en/0BUILD
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml?>
|
||||||
|
|
||||||
|
<gwbuild>
|
||||||
|
|
||||||
|
<data dist="true" install="$(httpdatadir)/aqhome-cgi/static/en">
|
||||||
|
header.html
|
||||||
|
footer.html
|
||||||
|
login.html
|
||||||
|
</data>
|
||||||
|
|
||||||
|
|
||||||
|
</gwbuild>
|
||||||
|
|
||||||
4
apps/aqhome-cgi/modules/static/en/footer.html
Normal file
4
apps/aqhome-cgi/modules/static/en/footer.html
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
17
apps/aqhome-cgi/modules/static/en/header.html
Normal file
17
apps/aqhome-cgi/modules/static/en/header.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<!-- copyright (c) 2025 by martin@libchipcard.de -->
|
||||||
|
<meta name="generator" content="FTE 1.1" />
|
||||||
|
<meta name="revised" content="martin,2025-06-12" />
|
||||||
|
<meta name="keywords" content="" />
|
||||||
|
<meta name="description" content="" />
|
||||||
|
<meta name="author" content="martin" />
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
|
||||||
|
<title>AqHome</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
25
apps/aqhome-cgi/modules/static/en/login.html
Normal file
25
apps/aqhome-cgi/modules/static/en/login.html
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
|
||||||
|
<div class="main">
|
||||||
|
<h1>AqHome</h1>
|
||||||
|
<h3>Enter your login credentials</h3>
|
||||||
|
|
||||||
|
<form action="login" method="post">
|
||||||
|
<label for="first">Username:</label>
|
||||||
|
<input type="text" id="first" name="first" placeholder="Enter your Username" required>
|
||||||
|
<label for="password">Password:</label>
|
||||||
|
<input type="password" id="password" name="password" placeholder="Enter your Password" required>
|
||||||
|
|
||||||
|
<div class="wrap">
|
||||||
|
<button type="submit">Submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<p>Not registered?
|
||||||
|
<a href="signup" style="text-decoration: none;">
|
||||||
|
Create an account
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
@@ -13,6 +13,7 @@
|
|||||||
#include "aqhome-cgi/service/service.h"
|
#include "aqhome-cgi/service/service.h"
|
||||||
|
|
||||||
|
|
||||||
|
AQH_SERVICE *AQH_ServiceFiles_new(const char *baseFolder);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
14
aqhome-cgi.sh
Normal file
14
aqhome-cgi.sh
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# AQHOME_LOGLEVEL=info LD_LIBRARY_PATH="../../aqhome/:$LD_LIBRARY_PATH" ./aqhomed -l aqhome.log -db aqhome.db -ma 127.0.0.1
|
||||||
|
|
||||||
|
# export AQHOME_LOGLEVEL=info
|
||||||
|
export LD_LIBRARY_PATH="0-build/aqhome/:$LD_LIBRARY_PATH"
|
||||||
|
|
||||||
|
# aqhomed -l /var/log/aqhome.log -db /var/cache/aqhome/nodes.db -ma 192.168.117.192 -mp 1883 -t 127.0.0.1 -W /var/cache/aqhome
|
||||||
|
|
||||||
|
# 0-build/apps/aqhomed/aqhomed -l aqhome.log -db aqhome.db -ma 192.168.117.192 -mp 1883 -t 127.0.0.1 -p aqhomed.pid
|
||||||
|
|
||||||
|
# 0-build/apps/aqhomed/aqhomed -l aqhome.log -db aqhome.db -p aqhomed.pid -W /tmp/aqhome/aqhomed -ma 192.168.117.192 -mp 1883 -t 127.0.0.1 --mqttclientid=AQHOMEMQTTLOGTEST1
|
||||||
|
0-build/apps/aqhome-cgi/aqhome-cgi
|
||||||
|
#0-build/apps/aqhome-nodes/aqhome-nodes -l aqhome-nodes.log -db aqhome-nodes.db -p aqhome-nodes.pid -t 127.0.0.1 -ba 127.0.0.1 "$@"
|
||||||
Reference in New Issue
Block a user