From d54a51a328e70be9d8082993fa0449811ef25a7c Mon Sep 17 00:00:00 2001 From: Bernardo Damele Date: Thu, 22 Jan 2009 21:28:56 +0000 Subject: [PATCH] Updated the HTML manual for the MySQL UDF and consequently other files. Thanks Roland! --- .../lib_mysqludf_sys/lib_mysqludf_sys.html | 72 +++++++- .../lib_mysqludf_sys/lib_mysqludf_sys.sql | 40 ++--- .../mysqludfsys/lib_mysqludf_sys_0.0.3.patch | 154 ++++++++++++++++-- .../mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz | Bin 15310 -> 12538 bytes 4 files changed, 229 insertions(+), 37 deletions(-) diff --git a/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html b/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html index 2997df399..d762f5fe1 100644 --- a/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html +++ b/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.html @@ -23,7 +23,8 @@ This library lib_mysqludf_sys contains a number of functions that allows one to interact with the operating system.

    -
  1. sys_exec - executes an arbitrary command, and can thus be used to launch an external application.
  2. +
  3. sys_eval - executes an arbitrary command, and returns it's output.
  4. +
  5. sys_exec - executes an arbitrary command, and returns it's exit code.
  6. sys_get - gets the value of an environment variable.
  7. sys_set - create an environment variable, or update the value of an existing environment variable.
@@ -31,6 +32,72 @@ Use lib_mysqludf_sys_info() to obtain information about the currently installed version of lib_mysqludf_sys.

+ +

sys_eval

+

+ sys_eval takes one command string argument and executes it, returning its output. +

+

Syntax

+
sys_eval(arg1)
+

Parameters and Return Values

+
+
arg1
+
+ A command string valid for the current operating system or execution environment. +
+
returns
+
+ Whatever output the command pushed to the standard output stream. +
+
+

Installation

+

+ Place the shared library binary in an appropriate location. + Log in to mysql as root or as another user with sufficient privileges, and select any database. + Then, create the function using the following DDL statement: +

+
+CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';	
+	
+

+ The function will be globally available in all databases. +

+

+ The deinstall the function, run the following statement: +

+
+DROP FUNCTION sys_eval;
+	
+

Examples

+

+ None yet +

+

A Note of Caution

+

+ Be very careful in deciding whether you need this function. + UDFs are available to all database users - you cannot grant EXECUTE privileges for them. + As the commandstring passed to sys_exec can do pretty much everything, + exposing the function poses a very real security hazard. +

+

+ Even for a benign user, it is possible to accidentally do a lot of damage with it. + The call will be executed with the privileges of the os user that runs MySQL, + so it is entirely feasible to delete MySQL's data directory, or worse. +

+

+ The function is intended for specialized MySQL applications where one needs extended + control over the operating system. + Currently, we do not have UDF's for ftp, email and http, + and this function can be used to implement such functionality in case it is really necessary + (datawarehouse staging areas could be a case in example). +

+

+ You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. +

+

+ If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. +

+

sys_exec

sys_exec takes one command string argument and executes it. @@ -92,6 +159,9 @@ DROP FUNCTION sys_exec;

You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this.

+

+ If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. +

sys_get

sys_get takes the name of an environment variable and returns the value of the variable. diff --git a/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql b/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql index 7abb3d012..6fb7933ba 100644 --- a/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql +++ b/extra/mysqludfsys/lib_mysqludf_sys/lib_mysqludf_sys.sql @@ -1,23 +1,23 @@ -/* - lib_mysqludf_sys - a library with miscellaneous (operating) system level functions - Copyright (C) 2007 Roland Bouman - Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G. - web: http://www.mysqludf.org/ - email: mysqludfs@gmail.com, bernardo.damele@gmail.com - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +/* + lib_mysqludf_sys - a library with miscellaneous (operating) system level functions + Copyright (C) 2007 Roland Bouman + Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G. + web: http://www.mysqludf.org/ + email: roland.bouman@gmail.com, bernardo.damele@gmail.com + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ DROP FUNCTION IF EXISTS lib_mysqludf_sys_info; diff --git a/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch b/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch index 1eb0ec338..7e09a9bc7 100644 --- a/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch +++ b/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.patch @@ -47,7 +47,7 @@ diff -uN lib_mysqludf_sys_0.0.2/install.sh lib_mysqludf_sys/install.sh +fi Binary files lib_mysqludf_sys_0.0.2/lib_mysqludf_sys_0.0.2.tar.gz and lib_mysqludf_sys/lib_mysqludf_sys_0.0.2.tar.gz differ diff -uN lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.c lib_mysqludf_sys/lib_mysqludf_sys.c ---- lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.c 2009-01-21 20:52:54.000000000 +0000 +--- lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.c 2009-01-22 12:01:55.000000000 +0000 +++ lib_mysqludf_sys/lib_mysqludf_sys.c 2009-01-21 00:06:13.000000000 +0000 @@ -1,8 +1,9 @@ /* @@ -177,24 +177,146 @@ diff -uN lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.c lib_mysqludf_sys/lib_mysqludf + #endif /* HAVE_DLOPEN */ +diff -uN lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.html lib_mysqludf_sys/lib_mysqludf_sys.html +--- lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.html 2009-01-22 12:01:55.000000000 +0000 ++++ lib_mysqludf_sys/lib_mysqludf_sys.html 2009-01-22 10:21:46.000000000 +0000 +@@ -23,7 +23,8 @@ + This library lib_mysqludf_sys contains a number of functions that allows one to interact with the operating system. +

+
    +-
  1. sys_exec - executes an arbitrary command, and can thus be used to launch an external application.
  2. ++
  3. sys_eval - executes an arbitrary command, and returns it's output.
  4. ++
  5. sys_exec - executes an arbitrary command, and returns it's exit code.
  6. +
  7. sys_get - gets the value of an environment variable.
  8. +
  9. sys_set - create an environment variable, or update the value of an existing environment variable.
  10. +
+@@ -31,6 +32,72 @@ + Use lib_mysqludf_sys_info() to obtain information about the currently installed version of lib_mysqludf_sys. +

+ ++ ++

sys_eval

++

++ sys_eval takes one command string argument and executes it, returning its output. ++

++

Syntax

++
sys_eval(arg1)
++

Parameters and Return Values

++
++
arg1
++
++ A command string valid for the current operating system or execution environment. ++
++
returns
++
++ Whatever output the command pushed to the standard output stream. ++
++
++

Installation

++

++ Place the shared library binary in an appropriate location. ++ Log in to mysql as root or as another user with sufficient privileges, and select any database. ++ Then, create the function using the following DDL statement: ++

++
++CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys.so';	
++	
++

++ The function will be globally available in all databases. ++

++

++ The deinstall the function, run the following statement: ++

++
++DROP FUNCTION sys_eval;
++	
++

Examples

++

++ None yet ++

++

A Note of Caution

++

++ Be very careful in deciding whether you need this function. ++ UDFs are available to all database users - you cannot grant EXECUTE privileges for them. ++ As the commandstring passed to sys_exec can do pretty much everything, ++ exposing the function poses a very real security hazard. ++

++

++ Even for a benign user, it is possible to accidentally do a lot of damage with it. ++ The call will be executed with the privileges of the os user that runs MySQL, ++ so it is entirely feasible to delete MySQL's data directory, or worse. ++

++

++ The function is intended for specialized MySQL applications where one needs extended ++ control over the operating system. ++ Currently, we do not have UDF's for ftp, email and http, ++ and this function can be used to implement such functionality in case it is really necessary ++ (datawarehouse staging areas could be a case in example). ++

++

++ You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. ++

++

++ If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. ++

++ +

sys_exec

+

+ sys_exec takes one command string argument and executes it. +@@ -92,6 +159,9 @@ +

+ You have been warned! If you don't see the hazard, please don't try to find it; just trust me on this. +

++

++ If you do decide to use this library in a production environment, make sure that only specific commands can be run and file access is limited by using AppArmor. ++

+

sys_get

+

+ sys_get takes the name of an environment variable and returns the value of the variable. Binary files lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.so and lib_mysqludf_sys/lib_mysqludf_sys.so differ diff -uN lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.sql lib_mysqludf_sys/lib_mysqludf_sys.sql ---- lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.sql 2009-01-21 20:52:54.000000000 +0000 -+++ lib_mysqludf_sys/lib_mysqludf_sys.sql 2009-01-21 00:51:00.000000000 +0000 -@@ -1,8 +1,9 @@ - /* - lib_mysqludf_sys - a library with miscellaneous (operating) system level functions - Copyright (C) 2007 Roland Bouman +--- lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.sql 2009-01-22 12:01:55.000000000 +0000 ++++ lib_mysqludf_sys/lib_mysqludf_sys.sql 2009-01-22 10:21:53.000000000 +0000 +@@ -1,30 +1,33 @@ +-/* +- lib_mysqludf_sys - a library with miscellaneous (operating) system level functions +- Copyright (C) 2007 Roland Bouman - web: http://www.xcdsql.org/MySQL/UDF/ - email: mysqludfs@gmail.com -+ Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G. -+ web: http://www.mysqludf.org/ -+ email: mysqludfs@gmail.com, bernardo.damele@gmail.com - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public -@@ -19,12 +20,14 @@ - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +- +- This library is free software; you can redistribute it and/or +- modify it under the terms of the GNU Lesser General Public +- License as published by the Free Software Foundation; either +- version 2.1 of the License, or (at your option) any later version. +- +- This library is distributed in the hope that it will be useful, +- but WITHOUT ANY WARRANTY; without even the implied warranty of +- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +- Lesser General Public License for more details. +- +- You should have received a copy of the GNU Lesser General Public +- License along with this library; if not, write to the Free Software +- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ++/* ++ lib_mysqludf_sys - a library with miscellaneous (operating) system level functions ++ Copyright (C) 2007 Roland Bouman ++ Copyright (C) 2008-2009 Roland Bouman and Bernardo Damele A. G. ++ web: http://www.mysqludf.org/ ++ email: roland.bouman@gmail.com, bernardo.damele@gmail.com ++ ++ This library is free software; you can redistribute it and/or ++ modify it under the terms of the GNU Lesser General Public ++ License as published by the Free Software Foundation; either ++ version 2.1 of the License, or (at your option) any later version. ++ ++ This library is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++ Lesser General Public License for more details. ++ ++ You should have received a copy of the GNU Lesser General Public ++ License along with this library; if not, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -drop function lib_mysqludf_sys_info; @@ -217,7 +339,7 @@ diff -uN lib_mysqludf_sys_0.0.2/lib_mysqludf_sys.sql lib_mysqludf_sys/lib_mysqlu +CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'; +CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so'; diff -uN lib_mysqludf_sys_0.0.2/Makefile lib_mysqludf_sys/Makefile ---- lib_mysqludf_sys_0.0.2/Makefile 2009-01-21 20:52:54.000000000 +0000 +--- lib_mysqludf_sys_0.0.2/Makefile 2009-01-22 12:01:55.000000000 +0000 +++ lib_mysqludf_sys/Makefile 2009-01-19 09:11:00.000000000 +0000 @@ -1,6 +1,4 @@ -linux: \ diff --git a/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz b/extra/mysqludfsys/lib_mysqludf_sys_0.0.3.tar.gz index 867bcd192c887055d1cc8fd6bf8c0affdaed0c72..f4af753925460491678b806e84b8f9163785e55c 100644 GIT binary patch literal 12538 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 literal 15310 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