[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: call_usermodehelper dont't execute mysql client?
hi,
> WHAT?!?! You are trying to run *MYSQL CLIENT* from kernel?!?!
yes, i know it's not a good idea!
i've rewritten my code using Jan and Tetsuo replies
and wrote a user-space wrapper that gets the data,
assemble the SQL, and 'execve' mysql client
it works fine!
thanks for your help!
toni
>
> I believe it does not like value of HOME='/', or lacks some other
> environment vairalbe or somethig, or does not like being called without
> stdin, stdout and stderr or something like that.
>
> > the code is: (connection is a global structure)
> >
> > static void my_call_usermodehelper(void *data) {
> > int err;
> > struct sendbuffer_t *sendbuffer = data;
> >
> > /* prepare data */
> > sendbuffer->argv[0] = "/usr/bin/mysql";
> > sendbuffer->argv[1] = "--host='localhost'";
> > sendbuffer->argv[2] = "--user='user'";
> > sendbuffer->argv[3] = "--password='passwd'";
> > sprintf(tmp, "--execute=\"USE pnvoip; INSERT INTO connections
> > (id,src_ip,src_port,dst_ip,dst_port,bytes,packets,start_time,finish_time) VALUES ('%s',%u,%d,%u,%d,%d,%d,'%lu','%lu');\"",connection->id,connection->saddr,connection->sport,connection->daddr,connection->dport,connection->bytes,connection->packets,connection->first_seen,connection->last_seen);
> > sendbuffer->argv[4] = tmp;
> > sendbuffer->argv[5] = NULL;
> >
> > sendbuffer->envp[0] = "HOME=/";
> > sendbuffer->envp[1] = "PATH=/sbin:/bin:/usr/sbin:/usr/bin";
> > sendbuffer->envp[2] = NULL;
> >
> > printk(KERN_INFO "call_usermodehelper(%s %s %s %s %s %s);
> > \n",sendbuffer->argv[0],sendbuffer->argv[1],sendbuffer->argv[2],sendbuffer->argv[3],sendbuffer->argv[4], sendbuffer->argv[5]);
> >
> > if ((err = call_usermodehelper(sendbuffer->argv[0], sendbuffer->argv,
> > sendbuffer->envp, 0)) < 0)
> > printk(KERN_INFO "exec mysql failed (error = %d)!\n", err);
> > }
> >
> > the /var/log/messages file prints out:
> >
> > Jan 4 14:12:28 localhost kernel: call_usermodehelper(/usr/bin/mysql
> > --host='localhost' --user='pnvoip_user' --password='pnvoip_passwd'
> > --execute="USE pnvoip; INSERT INTO connections
> > (callid,src_ip,src_port,dst_ip,dst_port,bytes,packets,start_time,finish_time) VALUES ('RTP_192.168.0.1.53_192.168.0.23.32790',16820416,53,385919168,32790,13560,1,'1136380346','1136380346'); COMMIT;" <NULL>);
> >
> > (this command is correct, i've pasted on a termnal and it adds a row to
> > my table)
>
> Then the command is *NOT* correct! Because from the terminal, the shell
> strips the quotes. But direct call to execve passes the arguments
> exactly. And you do use a lot of quotes in the command.
>
> > any idea to solve that? or what it's not working?
>
> Well, you shouldn't be directly calling mysql client anyway. You should
> be calling some wrapper that would get the data and assemble the SQL.
> Why should the name of the table be hardcoded or even known to kernel?
>
> Also if you call it often, you should instead create some communication
> channel (/proc entry, device or netlink socket) and have the process
> hang on there, reading data you send to it and doing the database work.
>
--
toni <agar9938@xxxxxxxxxxxxxxxxxx>
--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive: http://mail.nl.linux.org/kernelnewbies/
FAQ: http://kernelnewbies.org/faq/