From 3fb7a0b0cc3dcc94591cfbb7d21de394e8c1e22d Mon Sep 17 00:00:00 2001 From: Steffen Pohle Date: Tue, 18 Jan 2022 18:25:11 +0100 Subject: [PATCH] first list command --- fbsh-cli.cc | 18 +++++++++-- fbsh.cc | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++ fbsh.h | 13 ++++++++ 3 files changed, 121 insertions(+), 2 deletions(-) diff --git a/fbsh-cli.cc b/fbsh-cli.cc index cc3b55d..4f262d1 100644 --- a/fbsh-cli.cc +++ b/fbsh-cli.cc @@ -49,8 +49,22 @@ void connect() { -void list(int argpos, int argc, char **argv) { +void getlist(int argpos, int argc, char **argv) { + std::list *devlist; + std::list::iterator iter; + connect (); + devlist = fbsh.GetDevices(); + if (devlist == NULL) { + fprintf (stderr, "Error Retrieving Devices: %s\n", strerror(errno)); + return; + } + + for (iter = devlist->begin(); iter != devlist->end(); iter++) { + printf ("%s,%s,%s,%s,%d,%s\n", iter->id.c_str(), iter->name.c_str(), iter->product.c_str(), + iter->vendor.c_str(), iter->present, iter->attributes.c_str()); + } + delete devlist; } @@ -73,7 +87,7 @@ int main(int argc, char** argv) { break; } else if (strcmp(argv[i], "list") == 0) { - list(i, argc, argv); + getlist(i, argc, argv); break; } else if (strcmp(argv[i], "saveconfig") == 0) { diff --git a/fbsh.cc b/fbsh.cc index c66edbc..04dda13 100644 --- a/fbsh.cc +++ b/fbsh.cc @@ -262,3 +262,95 @@ int FBSmartHome::CloseSIDFile() { } return 0; } + + + +/* + * retrieve the device list from the fritzbox + */ +std::list *FBSmartHome::GetDevices() { + std::list *devlist = NULL; + FBSmartHomeDevice smd; + xmlDocPtr xmldoc; + xmlNodePtr xmlnode; + xmlAttr *xmlattr; + + int len; + + // retrieve data + len = tcp.WebGetFile(hostname+"/webservices/homeautoswitch.lua?sid="+SID+"&switchcmd=getdevicelistinfos", inbuffer, FB_BUFFER, NULL); + if (len > FB_BUFFER) len = FB_BUFFER; + else if (len < 0) { + fprintf (stderr, "%s:%d Error getting challenge from Fritzbox\n", __FILE__, __LINE__); + errno = EAI_FAIL; + return NULL; + } + inbuffer[len] = '\0'; + XMLPrepare(inbuffer, len, &xmldoc, &xmlnode); + printf ("*********************************************\n%s\n*********************************\n", inbuffer); + + // + // parse for SID and Challange + while (xmlnode) { + if ((!xmlStrcmp(xmlnode->name, (const xmlChar *)"devicelist"))){ + xmlNodePtr xmlchild = xmlnode->xmlChildrenNode; + + // + // read each device details + // + while (xmlchild) { + printf ("Name:%s\n", xmlchild->name); + // + // read attributes + xmlattr = xmlchild->properties; + while (xmlattr) { + printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1)); + xmlattr = xmlattr->next; + } + printf ("\n"); + + // go thought all the subchildreen + xmlNodePtr xmlsubchild = xmlchild->children; + while (xmlsubchild) { + printf (" %s,%s ", xmlsubchild->name, + (char *)xmlNodeListGetString(xmldoc, xmlsubchild->children, 1)); + xmlattr = xmlsubchild->properties; + while (xmlattr) { + printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1)); + xmlattr = xmlattr->next; + } + printf ("\n"); + + xmlNodePtr xmlsubchild2 = xmlsubchild->children; + while (xmlsubchild2) { + printf (" %s,%s ", xmlsubchild2->name, + (char *)xmlNodeListGetString(xmldoc, xmlsubchild2->children, 1)); + xmlattr = xmlsubchild2->properties; + while (xmlattr) { + printf (" %s:%s ", xmlattr->name, xmlNodeListGetString(xmldoc, xmlattr->children, 1)); + xmlattr = xmlattr->next; + } + printf ("\n"); + xmlsubchild2 = xmlsubchild2->next; + } + + xmlsubchild = xmlsubchild->next; + } + printf ("\n"); + xmlchild = xmlchild->next; + } + } + xmlnode = xmlnode->next; + } + xmlFreeDoc(xmldoc); + + if (SID.compare("0000000000000000") == 0) { + hostname = ""; + errno = ENOTCONN; + return NULL; + } + + return devlist; +} + + diff --git a/fbsh.h b/fbsh.h index ca55093..602561c 100644 --- a/fbsh.h +++ b/fbsh.h @@ -6,6 +6,7 @@ #define _FBSH_H_ #include +#include #include #include @@ -15,6 +16,16 @@ std::string generateMD5 (char* input, int size); #define FB_BUFFER (4*1024*1024) +struct { + std::string id; + std::string name; + std::string product; + std::string vendor; + int present; + std::string attributes; +} typedef FBSmartHomeDevice; + + class FBSmartHome { private: char inbuffer[FB_BUFFER]; @@ -37,6 +48,8 @@ public: int Connect(std::string host); // return 0 on success int Connect(std::string host, std::string username, std::string password); + + std::list *GetDevices(); }; #endif