/* #Specification: shellmod / principles
The shellmod module is an interface between scripting language
and linuxconf. By using a simple textual protocol, simple shell scripts
(or any language that can read and print, any language in fact)
can interact with Linuxconf. They can do many things a normal
module can do:
- insert into menus
- build dialog
*/
#pragma implementation
#include
#include
#include
#include "shellmod.h"
#include "shellmod.m"
#include
extern HELP_FILE help_shellmod;
MODULE_DEFINE_VERSION(shellmod);
PUBLIC MODULE_shellmod::MODULE_shellmod()
: LINUXCONF_MODULE("shellmod")
{
linuxconf_loadmsg ("shellmod",PACKAGE_REV);
shellmod_setdebug ();
}
static const char *keymenu;
PUBLIC void MODULE_shellmod::setmenu (
DIALOG &dia,
MENU_CONTEXT context)
{
if (context == MENU_CTRL_FILE){
keymenu = MSG_U(M_SHELLMOD,"Shell module management");
dia.new_menuitem ("",keymenu);
}
modules_setmenu (dia,context);
}
PUBLIC void MODULE_shellmod::setmenu (
DIALOG &dia,
const char *menuid)
{
modules_setmenu (dia,menuid);
}
static bool privi_changed = false;
static void shellmod_mainmenu()
{
const char *config = MSG_U(M_CONFIG,"Shellmod configuration");
const char *editmod = MSG_U(M_EDITMODULES,"Edit modules");
const char *buildmod = MSG_U(M_BUILDMOD,"Build a new module");
static const char *menuopt[]={
"", config,
"", editmod,
"", buildmod,
NULL
};
DIALOG_MENU dia;
dia.new_menuitems(menuopt);
int nof = 0;
while (1){
MENU_STATUS code = dia.editmenu (MSG_U(T_SHELLMOD,"shellmod management")
,MSG_U(I_SHELLMOD,"You register and unregister shell module\n"
"using this menu")
,help_shellmod
,nof,0);
if (code == MENU_QUIT || code == MENU_ESCAPE){
break;
}else if (perm_rootaccess(MSG_R(P_MNGMOD))){
const char *key = dia.getmenustr(nof);
if (key == editmod){
shellmod_edit();
privi_changed = true;
}else if (key == buildmod){
shellmod_build();
}else if (key == config){
shellmod_config();
}
}
}
}
PUBLIC int MODULE_shellmod::domenu (
MENU_CONTEXT context,
const char *key)
{
if (key == keymenu){
shellmod_mainmenu();
}else{
modules_domenu (context,key);
}
return 0;
}
PUBLIC int MODULE_shellmod::domenu (
const char *menuid,
const char *key)
{
return modules_domenu (menuid,key);
}
PUBLIC int MODULE_shellmod::dohtml (const char *key)
{
int ret = LNCF_NOT_APPLICABLE;
if (strcmp(key,"shellmod")==0){
// ### Insert any menu and dialog here
ret = 0;
}
return ret;
}
PUBLIC int MODULE_shellmod::message (const char *msg, int argc, const char *argv[])
{
int ret = LNCF_NOT_APPLICABLE;
if (strcmp(msg,"treemenu-depend")==0 && argc >= 1){
SSTRINGS *ss = (SSTRINGS*)argv[0];
modules_getmenudepend (*ss);
ret = 0;
}
return ret;
}
static void usage()
{
xconf_notice (MSG_U(T_USAGE
,"Module shellmod\n"
"linuxconf --modulemain shellmod [ specific options ]\n"
"\n"
" --build\n"
" --exec script_path [--debug] [--perl] script options\n"
" --setmod module_path\n"
" --unsetmod module_path\n"
" Without argument, start the module main menu\n"
"\n")
);
}
PUBLIC void MODULE_shellmod::usage (SSTRINGS &tb)
{
tb.add (new SSTRING(MSG_R(T_USAGE)));
}
PUBLIC int MODULE_shellmod::execmain (int argc , char *argv[], bool)
{
int ret = LNCF_NOT_APPLICABLE;
const char *pt = strrchr(argv[0],'/');
if (pt != NULL){
pt++;
}else{
pt = argv[0];
}
if (strcmp(pt,"shellmod")==0){
ret = -1;
if (perm_rootaccess (MSG_U(P_MNGMOD,"Manage modules"))){
if (argc == 1){
modules_loadcur();
shellmod_mainmenu();
}else if (argc == 3 && strcmp(argv[1],"--setmod")==0){
ret = modules_setmod (argv[2],false);
}else if (argc == 3 && strcmp(argv[1],"--unsetmod")==0){
ret = modules_unsetmod (argv[2]);
}else if (argc == 3 && strcmp(argv[1],"--build")==0){
shellmod_build();
ret = 0;
}else if (argc >= 3 && strcmp(argv[1],"--exec")==0){
shellprg_exec(argc-2,argv+2);
ret = 0;
}else{
::usage();
}
}
}
return ret;
}
static MODULE_shellmod shellmod;
static HELP_FILE help_privi ("shellmod","modprivi");
static REGISTER_PRIVI_HELP p (help_privi
,P_MSG_U(T_MODPRIVI,"Privileges: Shellmod modules"));
static PRIVILEGES tb;
static void modules_setprivi()
{
if (tb.getnb()==0 || privi_changed){
privi_changed = false;
tb.remove_all();
SSTRINGS mods;
modules_getlist (mods);
int n = mods.getnb();
for (int i=0; iget();
char id[PATH_MAX];
sprintf (id,"shellmod_%s",mod);
SSTRING title (mod);
int len = strlen(mod);
if (strlen(mod)>30){
title.setfromf ("...%s",mod+len-27);
}
tb.add (new PRIVILEGE (id,title.get()
,MSG_U(T_MODPRIV,"Shellmod modules")));
}
}
}
static PRIVILEGE_DECLARATOR modules_decl(modules_setprivi);
bool shellmod_haspriv (const char *path)
{
modules_setprivi();
char id[PATH_MAX];
sprintf (id,"shellmod_%s",path);
PRIVILEGE *priv = privilege_lookup (id);
return perm_access(priv,MSG_U(P_ANYSHELLMOD
,"to access any shell module"));
}