Rename trunk directory to public_html
[ldapsaisie.git] / public_html / includes / addons / LSaddons.ftp.php
1 <?php
2 /*******************************************************************************
3  * Copyright (C) 2007 Easter-eggs
4  * http://ldapsaisie.labs.libre-entreprise.org
5  *
6  * Author: See AUTHORS file in top-level directory.
7  *
8  * This program is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU General Public License version 2
10  * as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20
21 ******************************************************************************/
22
23 // Messages d'erreur
24
25 // Support
26 LSerror :: defineError('FTP_SUPPORT_01',
27   _("FTP Support : Pear::Net_FTP is missing.")
28 );
29
30 LSerror :: defineError('FTP_SUPPORT_02',
31   _("FTP Support : The constant %{const} is not defined.")
32 );
33
34
35 // Autres erreurs
36 LSerror :: defineError('FTP_00',
37   _("Net_FTP Error : %{msg}")
38 );
39
40 LSerror :: defineError('FTP_01',
41   _("FTP Support : Unable to connect to FTP Server (Step : %{step}).")
42 );
43 LSerror :: defineError('FTP_02',
44   _("FTP Support : Unable to make directory %{dir} on the remote server.")
45 );
46 LSerror :: defineError('FTP_03',
47   _("FTP Support : Unable to delete directory %{dir} on the remote server.")
48 );
49 LSerror :: defineError('FTP_04',
50   _("FTP Support : Unable to modify rights on the directory %{dir} on the remote server.")
51 );
52 LSerror :: defineError('FTP_05',
53   _("FTP Support : Unable to rename folder from %{old} to %{new} on the remote server.")
54 );
55
56  /**
57   * Verification du support FTP par ldapSaisie
58   * 
59   * @author Benjamin Renard <brenard@easter-eggs.com>
60   *
61   * @retval boolean true si FTP est pleinement supporté, false sinon
62   */
63   function LSaddon_ftp_support() {
64     $retval=true;
65
66     // Dependance de librairie
67     if (!class_exists('Net_FTP')) {
68       if (!defined('NET_FTP')) {
69         LSerror :: addErrorCode('FTP_SUPPORT_02','NET_FTP');
70         $retval=false;
71       } else if(!LSsession::includeFile(NET_FTP)) {
72         LSerror :: addErrorCode('FTP_SUPPORT_01');
73         $retval=false;
74       }
75     }
76     
77     return $retval;
78   }
79
80
81
82  /**
83   * Connexion a un serveur FTP
84   * 
85   * @author Benjamin Renard <brenard@easter-eggs.com>
86   * 
87   * @param[in] $host string Le nom ou l'IP du serveur FTP
88   * @param[in] $port string Le port de connexion au serveur ftp
89   * @param[in] $user string Le nom d'utilidateur de connexion
90   * @param[in] $pwd  string Le mot de passe de connexion
91   *
92   * @retval mixed Net_FTP object en cas de succès, false sinon
93   */
94   function connectToFTP($host,$port,$user,$pwd) {
95     $cnx = new Net_FTP();
96     $do = $cnx -> connect($host,$port);
97     if (! $do instanceof PEAR_Error){
98       $do = $cnx -> login($user,$pwd);
99       if (! $do instanceof PEAR_Error) {
100         return $cnx;
101       }
102       else {
103         LSerror :: addErrorCode('FTP_01',"2");
104         LSerror :: addErrorCode('FTP_00',$do -> getMessage());
105         return;         
106       }
107     }
108     else {
109       LSerror :: addErrorCode('FTP_01',"1");
110       LSerror :: addErrorCode('FTP_00',$do -> getMessage());
111       return;
112     }
113   }
114   
115  /**
116   * Creation d'un ou plusieurs dossiers via FTP
117   * 
118   * @author Benjamin Renard <brenard@easter-eggs.com>
119   * 
120   * @param[in] $host string Le nom ou l'IP du serveur FTP
121   * @param[in] $port string Le port de connexion au serveur ftp
122   * @param[in] $user string Le nom d'utilidateur de connexion
123   * @param[in] $pwd  string Le mot de passe de connexion
124   * @param[in] $dirs array ou string Le(s) dossier(s) à ajouter
125   *
126   * @retval string True ou false si il y a un problème durant la création du/des dossier(s)
127   */
128   function createDirsByFTP($host,$port,$user,$pwd,$dirs,$chmod=NULL) {
129     $cnx = connectToFTP($host,$port,$user,$pwd);
130     if (! $cnx){
131       return;
132     }
133     if (!is_array($dirs)) {
134       $dirs = array($dirs);
135     }
136     foreach($dirs as $dir) {
137       $do = $cnx -> mkdir($dir,true);
138       if ($do instanceof PEAR_Error) {
139         LSerror :: addErrorCode('FTP_02',$dir);
140         LSerror :: addErrorCode('FTP_00',$do -> getMessage());
141         return;
142       }
143       if ($chmod) {
144         $do = $cnx -> chmod($dir,$chmod);
145         if ($do instanceof PEAR_Error) {
146           LSerror :: addErrorCode('FTP_04',$dir);
147           LSerror :: addErrorCode('FTP_00',$do -> getMessage());
148         }
149       }
150     }
151     return true;
152   }
153
154  /**
155   * Suppression d'un ou plusieurs dossiers via FTP
156   * 
157   * Note : Attention : suppression récursive. Cela veut dire que les sous-dossiers
158   * lister par un LS FTP seront supprimé d'abord. Attention : Si votre serveur
159   * FTP est configuré pour caché certains fichiers ou dossiers (dont le nom
160   * commence par un '.' par exempl), ces fichiers ne seront pas supprimés et la
161   * suppression du dossier parent échoura.
162   * 
163   * Pour VsFTPd : Ajouter force_dot_files=1 dans la configuration.
164   * 
165   * @author Benjamin Renard <brenard@easter-eggs.com>
166   * 
167   * @param[in] $host string Le nom ou l'IP du serveur FTP
168   * @param[in] $port string Le port de connexion au serveur ftp
169   * @param[in] $user string Le nom d'utilidateur de connexion
170   * @param[in] $pwd  string Le mot de passe de connexion
171   * @param[in] $dirs array ou string Le(s) dossier(s) à supprimer
172   *
173   * @retval string True ou false si il y a un problème durant la suppression du/des dossier(s)
174   */
175   function removeDirsByFTP($host,$port,$user,$pwd,$dirs) {
176     $cnx = connectToFTP($host,$port,$user,$pwd);
177     if (! $cnx){
178       return;
179     }
180     if (!is_array($dirs)) {
181       $dirs = array($dirs);
182     }
183     foreach($dirs as $dir) {
184       if ($dir[strlen($dir)-1]!='/') {
185         $dir.='/';
186       }
187       $do = $cnx -> rm($dir,true);
188       if ($do instanceof PEAR_Error) {
189         LSerror :: addErrorCode('FTP_03',$dir);
190         LSerror :: addErrorCode('FTP_00',$do -> getMessage());
191         return;
192       }
193     }
194     return true;
195   }
196   
197  /**
198   * Renomage d'un dossier via FTP
199   * 
200   * @author Benjamin Renard <brenard@easter-eggs.com>
201   * 
202   * @param[in] $host string Le nom ou l'IP du serveur FTP
203   * @param[in] $port string Le port de connexion au serveur ftp
204   * @param[in] $user string Le nom d'utilidateur de connexion
205   * @param[in] $pwd  string Le mot de passe de connexion
206   * @param[in] $old  string Le dossier à renomer
207   * @param[in] $new  string Le nouveau nom du dossier à renomer
208   *
209   * @retval string True ou false si il y a un problème durant le renomage du/des dossier(s)
210   */
211   function renameDirByFTP($host,$port,$user,$pwd,$old,$new) {
212     $cnx = connectToFTP($host,$port,$user,$pwd);
213     if (! $cnx){
214       return;
215     }
216     $do = $cnx -> rename($old,$new);
217     if ($do instanceof PEAR_Error) {
218       LSerror :: addErrorCode('FTP_05',array('old' => $old,'new' => $new));
219       LSerror :: addErrorCode('FTP_00',$do -> getMessage());
220       return;
221     }
222     return true;
223   }