// Initializes a lua chisel bool sinsp_chisel::init_lua_chisel(chisel_desc &cd, string const &fpath) { lua_State* ls = lua_open(); luaL_openlibs(ls); // // Load our own lua libs // luaL_openlib(ls, "sysdig", ll_sysdig, 0); luaL_openlib(ls, "chisel", ll_chisel, 0); luaL_openlib(ls, "evt", ll_evt, 0); // // Add our chisel paths to package.path // for(vector<chiseldir_info>::const_iterator it = g_chisel_dirs->begin(); it != g_chisel_dirs->end(); ++it) { string path(it->m_dir); path += "?.lua"; add_lua_package_path(ls, path.c_str()); } // // Load the script // if(luaL_loadfile(ls, fpath.c_str()) || lua_pcall(ls, 0, 0, 0)) { goto failure; } // // Extract the description // lua_getglobal(ls, "description"); if(!lua_isstring(ls, -1)) { goto failure; } cd.m_description = lua_tostring(ls, -1); // // Extract the short description // lua_getglobal(ls, "short_description"); if(!lua_isstring(ls, -1)) { goto failure; } cd.m_shortdesc = lua_tostring(ls, -1); // // Extract the category // cd.m_category = ""; lua_getglobal(ls, "category"); if(lua_isstring(ls, -1)) { cd.m_category = lua_tostring(ls, -1); } // // Extract the hidden flag and skip the chisel if it's set // lua_getglobal(ls, "hidden"); if(lua_isboolean(ls, -1)) { int sares = lua_toboolean(ls, -1); if(sares) { goto failure; } } // // Extract the args // lua_getglobal(ls, "args"); try { parse_lua_chisel_args(ls, &cd); } catch(...) { goto failure; } return true; failure: lua_close(ls); return false; }
void sinsp_chisel::load(string cmdstr) { m_filename = cmdstr; trim(cmdstr); ifstream is; // // Try to open the file as is // if(!openfile(m_filename, &is)) { // // Try to add the .sc extension // if(!openfile(m_filename + ".sc", &is)) { if(!openfile(m_filename + ".lua", &is)) { throw sinsp_exception("can't open file " + m_filename); } } } // // Bring the file into a string // string docstr((istreambuf_iterator<char>(is)), istreambuf_iterator<char>()); #ifdef HAS_LUA_CHISELS // // Rewind the stream // is.seekg(0); // // Load the file // std::istreambuf_iterator<char> eos; std::string scriptstr(std::istreambuf_iterator<char>(is), eos); // // Open the script // m_ls = lua_open(); luaL_openlibs(m_ls); // // Load our own lua libs // luaL_openlib(m_ls, "sysdig", ll_sysdig, 0); luaL_openlib(m_ls, "chisel", ll_chisel, 0); luaL_openlib(m_ls, "evt", ll_evt, 0); // // Add our chisel paths to package.path // for(uint32_t j = 0; j < g_chisel_dirs->size(); j++) { string path(g_chisel_dirs->at(j).m_dir); path += "?.lua"; add_lua_package_path(m_ls, path.c_str()); } // // Load the script // if(luaL_loadstring(m_ls, scriptstr.c_str()) || lua_pcall(m_ls, 0, 0, 0)) { throw sinsp_exception("Failed to load chisel " + m_filename + ": " + lua_tostring(m_ls, -1)); } // // Allocate the chisel context for the script // m_lua_cinfo = new chiselinfo(m_inspector); // // Set the context globals // lua_pushlightuserdata(m_ls, this); lua_setglobal(m_ls, "sichisel"); // // Extract the args // lua_getglobal(m_ls, "args"); if(!lua_istable(m_ls, -1)) { throw sinsp_exception("Failed to load chisel " + m_filename + ": args table missing"); } try { parse_lua_chisel_args(m_ls, &m_lua_script_info); } catch(sinsp_exception& e) { throw e; } // // Check if the script has an on_event // lua_getglobal(m_ls, "on_event"); if(lua_isfunction(m_ls, -1)) { m_lua_has_handle_evt = true; lua_pop(m_ls, 1); } #endif is.close(); }
// // 1. Iterates through the chisel files on disk (.sc and .lua) // 2. Opens them and extracts the fields (name, description, etc) // 3. Adds them to the chisel_descs vector. // void sinsp_chisel::get_chisel_list(vector<chisel_desc>* chisel_descs) { uint32_t j; for(j = 0; j < g_chisel_dirs->size(); j++) { if(string(g_chisel_dirs->at(j).m_dir) == "") { continue; } tinydir_dir dir; tinydir_open(&dir, g_chisel_dirs->at(j).m_dir); while(dir.has_next) { tinydir_file file; tinydir_readfile(&dir, &file); string fname(file.name); string fpath(file.path); if(fname.find(".sc") == fname.size() - 3) { try { sinsp_chisel ch(NULL, fpath); chisel_desc cd; cd.m_name = fname.substr(0, fname.rfind('.')); cd.m_description = ch.m_description; const Json::Value args = (*ch.m_root)["info"]["arguments"]; for(uint32_t k = 0; k < args.size(); k++) { cd.m_args.push_back(chiselarg_desc( args[k]["name"].asString(), args[k]["type"].asString(), args[k]["description"].asString() )); } chisel_descs->push_back(cd); } catch(...) { // // If there was an error opening the chisel, skip to the next one // goto next_file; } } #ifdef HAS_LUA_CHISELS if(fname.find(".lua") == fname.size() - 4) { chisel_desc cd; cd.m_name = fname.substr(0, fname.rfind('.')); lua_State* ls = lua_open(); luaL_openlibs(ls); // // Load our own lua libs // luaL_openlib(ls, "sysdig", ll_sysdig, 0); luaL_openlib(ls, "chisel", ll_chisel, 0); luaL_openlib(ls, "evt", ll_evt, 0); // // Add our chisel paths to package.path // for(uint32_t k = 0; k < g_chisel_dirs->size(); k++) { string path(g_chisel_dirs->at(k).m_dir); path += "?.lua"; add_lua_package_path(ls, path.c_str()); } // // Load the script // if(luaL_loadfile(ls, fpath.c_str()) || lua_pcall(ls, 0, 0, 0)) { goto next_lua_file; } // // Extract the description // lua_getglobal(ls, "description"); if(!lua_isstring(ls, -1)) { goto next_lua_file; } cd.m_description = lua_tostring(ls, -1); // // Extract the short description // lua_getglobal(ls, "short_description"); if(!lua_isstring(ls, -1)) { goto next_lua_file; } cd.m_shortdesc = lua_tostring(ls, -1); // // Extract the category // cd.m_category = ""; lua_getglobal(ls, "category"); if(lua_isstring(ls, -1)) { cd.m_category = lua_tostring(ls, -1); } // // Extract the hidden flag and skip the chisel if it's set // lua_getglobal(ls, "hidden"); if(lua_isboolean(ls, -1)) { int sares = lua_toboolean(ls, -1); if(sares) { goto next_lua_file; } } // // Extract the args // lua_getglobal(ls, "args"); try { parse_lua_chisel_args(ls, &cd); } catch(...) { goto next_lua_file; } chisel_descs->push_back(cd); next_lua_file: lua_close(ls); } #endif next_file: tinydir_next(&dir); } tinydir_close(&dir); } }