123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- /*
- goahead.c -- Main program for GoAhead
- Usage: goahead [options] [documents] [IP][:port] ...
- Options:
- --auth authFile # User and role configuration
- --background # Run as a Linux daemon
- --home directory # Change to directory to run
- --log logFile:level # Log to file file at verbosity level
- --route routeFile # Route configuration file
- --verbose # Same as --log stdout:2
- --version # Output version information
- Copyright (c) All Rights Reserved. See details at the end of the file.
- */
- /********************************* Includes ***********************************/
- #include "goahead.h"
- #include "dashboard.h"
- #include "cJSON.h"
- #include "com_BmcType.h"
- #include "remote_control.h"
- #include "fan.h"
- #include "fru.h"
- #include "sel.h"
- #include "server_health.h"
- #include "fw_update.h"
- #include "config.h"
- #include "user.h"
- #include <stdio.h>
- #include <string.h>
- /********************************* Defines ************************************/
- static int finished = 0;
- UserInfo_T UserInfoTbl[MAX_USER_NUM];
- /********************************* Forwards ***********************************/
- static void initPlatform();
- static void logHeader();
- static void usage();
- #if WINDOWS
- static void windowsClose();
- static int windowsInit();
- static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp);
- #endif
- #if ME_UNIX_LIKE
- static void sigHandler(int signo);
- #endif
- /*********************************** Code *************************************/
- MAIN(goahead, int argc, char **argv, char **envp)
- {
- char *argp, *home, *documents, *endpoints, *endpoint, *route, *auth, *tok, *lspec;
- int argind;
- #if WINDOWS
- if (windowsInit() < 0) {
- return 0;
- }
- #endif
- route = "/etc/goahead/route.txt";
- auth = "/etc/goahead/auth.txt";
- /**************** user code before goahead ************************/
- cJSON_Hooks hooks;
- hooks.malloc_fn = (void *(*)(size_t))walloc;
- hooks.free_fn = (void (*)(void *))wfree;
- cJSON_InitHooks(&hooks);
- /**************** user code before goahead end************************/
- for (argind = 1; argind < argc; argind++) {
- argp = argv[argind];
- if (*argp != '-') {
- break;
- } else if (smatch(argp, "--auth") || smatch(argp, "-a")) {
- if (argind >= argc) usage();
- auth = argv[++argind];
- #if ME_UNIX_LIKE && !MACOSX
- } else if (smatch(argp, "--background") || smatch(argp, "-b")) {
- websSetBackground(1);
- #endif
- } else if (smatch(argp, "--debugger") || smatch(argp, "-d") || smatch(argp, "-D")) {
- websSetDebug(1);
- } else if (smatch(argp, "--home")) {
- if (argind >= argc) usage();
- home = argv[++argind];
- if (chdir(home) < 0) {
- error("Cannot change directory to %s", home);
- exit(-1);
- }
- } else if (smatch(argp, "--log") || smatch(argp, "-l")) {
- if (argind >= argc) usage();
- logSetPath(argv[++argind]);
- } else if (smatch(argp, "--verbose") || smatch(argp, "-v")) {
- logSetPath("stdout:2"); //2
- } else if (smatch(argp, "--route") || smatch(argp, "-r")) {
- route = argv[++argind];
- } else if (smatch(argp, "--version") || smatch(argp, "-V")) {
- printf("%s\n", ME_VERSION);
- exit(0);
- } else if (*argp == '-' && isdigit((uchar) argp[1])) {
- lspec = sfmt("stdout:%s", &argp[1]);
- logSetPath(lspec);
- wfree(lspec);
- } else {
- usage();
- }
- }
- documents = ME_GOAHEAD_DOCUMENTS;
- if (argc > argind) {
- documents = argv[argind++];
- }
- // printf("---> initPlatform\n");
- initPlatform(); //注册信号
- // printf("---> websOpen\n");
- // printf(">>>>>>>>>>>>>>>>>>>>>>>>>>2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
- if (websOpen(documents, route) < 0) {
- error("Cannot initialize server. Exiting.");
- return -1;
- }
- #if ME_GOAHEAD_AUTH
- // printf("---> websLoad\n");
- if (websLoad(auth) < 0) {
- error("Cannot load %s", auth);
- return -1;
- }
- #endif
- logHeader();
- if (argind < argc) {
- while (argind < argc) {
- endpoint = argv[argind++];
- // printf("---> websListen log1\n");
- if (websListen(endpoint) < 0) {
- return -1;
- }
- }
- } else {
- endpoints = sclone(ME_GOAHEAD_LISTEN);
- for (endpoint = stok(endpoints, ", \t", &tok); endpoint; endpoint = stok(NULL, ", \t,", &tok)) {
- #if !ME_COM_SSL
- if (strstr(endpoint, "https")) continue;
- #endif
- // printf("---> websListen log2\n");
- if (websListen(endpoint) < 0) {
- wfree(endpoints);
- return -1;
- }
- }
- wfree(endpoints);
- }
- #if ME_ROM && KEEP
- /*
- If not using a route/auth config files, then manually create the routes like this:
- If custom matching is required, use websSetRouteMatch. If authentication is required, use websSetRouteAuth.
- */
- websAddRoute("/", "file", 0);
- #endif
- /**************** user code after goahead ************************/
- websDefineAction("test", actionTest);
- websDefineAction("buy", buy);
- //dashboard
- websDefineAction("getDeviceInfo", getDeviceInfo);
- websDefineAction("getSysInfo", getSysInfo);
- websDefineAction("getCardInfo", getCardInfo);
- websDefineAction("getSensorInfo", getSensorInfo);
- websDefineAction("getChassisInfo", getChassisInfo);
- websDefineAction("getBladeManage", getBladeManage);
- websDefineAction("setBladeManage", setBladeManage);
- websDefineAction("getAllBladeInfo", getAllBladeInfo);
- //remote control
- websDefineAction("chassisPwrCtrl", chassisPwrCtrl);
- websDefineAction("getChassisStatus", getChassisStatus);
- //Fru
- //websDefineAction("getFruInfo", getFruInfo);
- websDefineAction("getFruChassisInfo", getFruChassisInfo);
- websDefineAction("getFruBoardInfo", getFruBoardInfo);
- websDefineAction("getFruProductInfo", getFruProductInfo);
- //sel
- websDefineAction("Web_ClearSEL", Web_ClearSEL);
- websDefineAction("GetAllSELEntriesSorted", GetAllSELEntriesSorted);
- websDefineAction("SetTime", SetTime);
- websDefineAction("GetTime", GetTime);
- //websDefineAction("SetTimeUTCOffset", SetTimeUTCOffset);
- //websDefineAction("GetTimeUTCOffset", GetTimeUTCOffset);
- //user
- websDefineAction("getAllUserInfo", getAllUserInfo);
- websDefineAction("setUserPassword", setUserPassword);
- websDefineAction("addUser", addUser);
- websDefineAction("delUser", delUser);
- //update firmware
- // websDefineAction("uploadTest", uploadTest);
- websDefineAction("prepareDevice", prepareDevice);
- websDefineAction("uploadFirmware", uploadFirmware);
- websDefineAction("updateFlash", updateFlash);
- websDefineAction("getUpdateProgress", getUpdateProgress);
- websDefineAction("getVerifyStatus", getVerifyStatus);
- websDefineAction("resetBmc", resetBmc);
- //server_health
- websDefineAction("setThreshold", setThreshold);
- websDefineAction("webGetSensorHistory", webGetSensorHistory);
- //fan
- websDefineAction("getAllFanInfo", getAllFanInfo);
- websDefineAction("setFanInfo", setFanInfo);
- //config
- websDefineAction("restoreFactorySettings", restoreFactorySettings);
- websDefineAction("web_ResetBMC", web_ResetBMC);
- websDefineAction("web_GetLanInfo", web_GetLanInfo);
- websDefineAction("web_SetLanInfo", web_SetLanInfo);
- websDefineAction("checkLoginStatus", checkLoginStatus);
- websDefineAction("logout", logout);
- websDefineAction("web_GetRunTime", web_GetRunTime);
- /**************** user code after goahead end************************/
- #if ME_UNIX_LIKE && !MACOSX
- /*
- Service events till terminated
- */
- if (websGetBackground()) {
- printf("---> daemon\n");
- if (daemon(0, 0) < 0) {
- error("Cannot run as daemon");
- return -1;
- }
- }
- #endif
- printf("---> websServiceEvents\n");
- websServiceEvents(&finished);
- logmsg(1, "Instructed to exit");
- printf("---> websClose\n");
- websClose();
- #if WINDOWS
- windowsClose();
- #endif
- return 0;
- }
- static void logHeader()
- {
- char home[ME_GOAHEAD_LIMIT_STRING];
- getcwd(home, sizeof(home));
- logmsg(2, "Configuration for %s", ME_TITLE);
- logmsg(2, "---------------------------------------------");
- logmsg(2, "Version: %s", ME_VERSION);
- logmsg(2, "BuildType: %s", ME_DEBUG ? "Debug" : "Release");
- logmsg(2, "CPU: %s", ME_CPU);
- logmsg(2, "OS: %s", ME_OS);
- logmsg(2, "Host: %s", websGetServer());
- logmsg(2, "Directory: %s", home);
- logmsg(2, "Documents: %s", websGetDocuments());
- logmsg(2, "Configure: %s", ME_CONFIG_CMD);
- logmsg(2, "---------------------------------------------");
- }
- static void usage() {
- fprintf(stderr, "\n%s Usage:\n\n"
- " %s [options] [documents] [[IPaddress][:port] ...]\n\n"
- " Options:\n"
- #if ME_GOAHEAD_AUTH
- " --auth authFile # User and role configuration\n"
- #endif
- #if ME_UNIX_LIKE && !MACOSX
- " --background # Run as a Unix daemon\n"
- #endif
- " --debugger # Run in debug mode\n"
- " --home directory # Change to directory to run\n"
- " --log logFile:level # Log to file file at verbosity level\n"
- " --route routeFile # Route configuration file\n"
- " --verbose # Same as --log stdout:2\n"
- " --version # Output version information\n\n",
- ME_TITLE, ME_NAME);
- exit(-1);
- }
- static void initPlatform()
- {
- #if ME_UNIX_LIKE
- signal(SIGTERM, sigHandler);
- #ifdef SIGPIPE
- signal(SIGPIPE, SIG_IGN);
- #endif
- #elif ME_WIN_LIKE
- _fmode=_O_BINARY;
- #endif
- }
- #if ME_UNIX_LIKE
- static void sigHandler(int signo)
- {
- finished = 1;
- }
- #endif
- #if WINDOWS
- /*
- Create a taskbar entry. Register the window class and create a window
- */
- static int windowsInit()
- {
- HINSTANCE inst;
- WNDCLASS wc; /* Window class */
- HMENU hSysMenu;
- HWND hwnd;
- inst = websGetInst();
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = inst;
- wc.hIcon = NULL;
- wc.lpfnWndProc = (WNDPROC) websWindProc;
- wc.lpszMenuName = wc.lpszClassName = ME_NAME;
- if (! RegisterClass(&wc)) {
- return -1;
- }
- /*
- Create a window just so we can have a taskbar to close this web server
- */
- hwnd = CreateWindow(ME_NAME, ME_TITLE, WS_MINIMIZE | WS_POPUPWINDOW, CW_USEDEFAULT,
- 0, 0, 0, NULL, NULL, inst, NULL);
- if (hwnd == NULL) {
- return -1;
- }
- /*
- Add the about box menu item to the system menu
- */
- hSysMenu = GetSystemMenu(hwnd, FALSE);
- if (hSysMenu != NULL) {
- AppendMenu(hSysMenu, MF_SEPARATOR, 0, NULL);
- }
- ShowWindow(hwnd, SW_SHOWNORMAL);
- UpdateWindow(hwnd);
- return 0;
- }
- static void windowsClose()
- {
- HINSTANCE inst;
- inst = websGetInst();
- UnregisterClass(ME_NAME, inst);
- }
- /*
- Main menu window message handler.
- */
- static LRESULT CALLBACK websWindProc(HWND hwnd, UINT msg, UINT wp, LPARAM lp)
- {
- switch (msg) {
- case WM_DESTROY:
- PostQuitMessage(0);
- finished++;
- return 0;
- case WM_SYSCOMMAND:
- break;
- }
- return DefWindowProc(hwnd, msg, wp, lp);
- }
- /*
- Check for Windows Messages
- */
- WPARAM checkWindowsMsgLoop()
- {
- MSG msg;
- if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) {
- if (!GetMessage(&msg, NULL, 0, 0) || msg.message == WM_QUIT) {
- return msg.wParam;
- }
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
- /*
- Windows message handler
- */
- static LRESULT CALLBACK websAboutProc(HWND hwndDlg, uint msg, uint wp, long lp)
- {
- LRESULT lResult;
- lResult = DefWindowProc(hwndDlg, msg, wp, lp);
- switch (msg) {
- case WM_CREATE:
- break;
- case WM_DESTROY:
- break;
- case WM_COMMAND:
- break;
- }
- return lResult;
- }
- #endif
|