Utilizzare Trigger e Stored Procedure in Mysql per eseguire un comando shell

From RVM Wiki
Jump to navigation Jump to search

Obiettivo

L'obiettivo è creare un link in /home quando si modifica un record in mysql

Installazione Plugin MySQL

  • Per fare eseguire un comando shell a MySQL occorre installare un semplice plugin:
sudo apt-get install libmysqlclient-dev 
cd /tmp
git clone https://github.com/mysqludf/lib_mysqludf_sys.git
cd lib_mysqludf_sys/
  • Modificare il MAkefile per Debian:
vi Makefile
#LIBDIR=/usr/lib
LIBDIR=/usr/lib/mysql/plugin/

install:
	gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so
	#gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o $(LIBDIR)/lib_mysqludf_sys.so

  • Installarlo:
sudo ./install.sh 
[sudo] password for mnt.vvngrl: 
Compiling the MySQL UDF
gcc -DMYSQL_DYNAMIC_PLUGIN -fPIC -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/mysql/plugin//lib_mysqludf_sys.so
#gcc -Wall -I/usr/include/mysql -I. -shared lib_mysqludf_sys.c -o /usr/lib/mysql/plugin//lib_mysqludf_sys.so
MySQL UDF compiled successfully

Please provide your MySQL root password
Enter password: 
MySQL UDF installed successfully

Creazione link su INSERT

  • Creiamo ora la stored procedure che richiama il comando che crea il link:
DROP PROCEDURE IF EXISTS create_ftp_home_link_proc;

DELIMITER $$
CREATE PROCEDURE create_ftp_home_link_proc
(username CHAR(16),
 homedir  CHAR(255) )
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/create_ftp_home_link ', homedir, ' ' , username);
 SET result = sys_eval(cmd);
END$$;

DELIMITER ;
  • Creiamo il trigger eseguito all'inserimento:
DROP TRIGGER IF EXISTS create_ftp_home_link_trig;

CREATE TRIGGER create_ftp_home_link_trig AFTER INSERT ON accounts
FOR EACH ROW
CALL create_ftp_home_link_proc(NEW.username, NEW.homedir);
  • Creiamo lo script da eseguire:
sudoedit /usr/local/sbin/create_ftp_home_link
#/bin/bash
# i comandi vengono eseguiti come user mysql, quindi questo script deve essere richiamato con sudo
/bin/ln -s "$1" "/home/vsftpd/$2"
  • Rendiamolo eseguibile
sudo chmod +x /usr/local/sbin/create_ftp_home_link
  • Impostiamo la regola sudo per far eseguire il comando come root senza richiesta di password:
sudo visudo -f /etc/sudoers.d/create_ftp_home_link
mysql      ALL=(root) NOPASSWD: /usr/local/sbin/create_ftp_home_link
  • Testare lo script con sudo: deve creare il link senza chiedere la password per mysql
sudo ls
sudo -u mysql sudo /usr/local/sbin/create_ftp_home_link /var/www/pippo /home/pippo
  • Testare una insert e vedere se crea il link
  • Se tutto funziona, creare la stessa procedura per l'eliminazione del link:

Eliminazione Link su DELETE

  • Procedura eliminazione link:
  • Creiamo ora la stored procedure che richiama il comando che crea il link:
DROP PROCEDURE delete_ftp_home_link_proc;

DELIMITER $$
CREATE PROCEDURE delete_ftp_home_link_proc
(username CHAR(16))
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/delete_ftp_home_link ', username);
 SET result = sys_eval(cmd);
END$$;

DELIMITER ;
  • Creare il trigger:
DROP TRIGGER  IF EXISTS delete_ftp_home_link_trig;


CREATE TRIGGER delete_ftp_home_link_trig AFTER DELETE ON accounts
FOR EACH ROW
CALL delete_ftp_home_link_proc(OLD.username);
  • Creiamo lo script da eseguire:
sudoedit /usr/local/sbin/delete_ftp_home_link
#/bin/bash
# i comandi vengono eseguiti come user mysql, quindi questo script deve essere richiamato con sudo
/bin/rm -f "/home/vsftpd/$1"
  • Rendiamolo eseguibile
sudo chmod +x /usr/local/sbin/delete_ftp_home_link
  • Impostiamo la regola sudo per far eseguire il comando come root senza richiesta di password:
sudo visudo -f /etc/sudoers.d/delete_ftp_home_link
mysql      ALL=(root) NOPASSWD: /usr/local/sbin/delete_ftp_home_link
  • Rimuovere la riga e vedere se cancella il link

Modifica Link su UPDATE

  • Si crea il trigger e la stored procedure del caso, richiamando gli script precedenti:
DROP PROCEDURE IF EXISTS modify_ftp_home_link_proc;

DELIMITER $$
CREATE PROCEDURE modify_ftp_home_link_proc
(username     CHAR(16),
 old_username CHAR(16),
 homedir      CHAR(255),
 old_homedir  CHAR(255))
BEGIN
 DECLARE cmd CHAR(255);
 DECLARE result CHAR(255);
 SET cmd = CONCAT('/usr/bin/sudo /usr/local/sbin/delete_ftp_home_link ', old_username, ' ; /usr/bin/sudo /usr/local/sbin/create_ftp_home_link ', homedir, ' ' , username );
 SET result = sys_eval(cmd);
END$$;

DELIMITER ;
  • Creare il trigger:
DROP TRIGGER  IF EXISTS modify_ftp_home_link_trig;

CREATE TRIGGER modify_ftp_home_link_trig AFTER UPDATE ON accounts
FOR EACH ROW
CALL modify_ftp_home_link_proc(NEW.username, OLD.username, NEW.homedir, OLD.homedir);

Riferimenti