/* 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 #include /********************************* 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