Une solution au problème d'upload FTP avec iWeb'09

bsr43

Membre enregistré
13 Septembre 2008
6
0
Bonjour à tous,

je repost sur les forums de macgeneration une astuce que j'ai posté sur les forums de mac4ever, juste au cas où ça intéresserait quelqu'un. J'ai bien conscience qu'il s'agit d'une bidouille que certains jugeront complexe, mais au moins, en attendant qu'Apple corrige le problème, ça me permet d'utiliser la fonction d'upload de site via FTP chez Free (je n'ai pas pu tester d'autre fournisseurs...)

Donc, suite à l'acquisition d'iLife'09, j'ai été particulièrement déçu de me rendre compte que iWeb'09 n'était pas capable d'uploader mon site sur mes pages perso Free. Cependant, je me suis dit que ça ne devait pas être un problème compliqué, dans le sens où le test qu'iWeb effectue est capable de déposer un fichier de test sur le FTP.

Après quelques investigations (à grand coup de wireshark), je me suis rendu compte que les serveurs de Free ne comprenaient tout simplement pas une des commandes envoyée par iWeb (le SITE CHMOD pour les curieux). Cette commande sert juste à modifier les droits d'accès à un fichier.

En attendant qu'Apple daigne bien vouloir corriger ce problème fort gênant, je vous propose une solution de remplacement. J'ai écris un petit script Python qui sert de proxy, et qui masque à iWeb le fait que la commande SITE CHMOD n'est pas comprise.

La première étape est de créer un fichier texte contenant ceci (attention, n'utilisez pas TextEdit, il sauvegarde du RTF par défaut je crois, utilisez plutôt Smultron par exemple, il est gratuit et bien pratique) :

Bloc de code:
#!/usr/local/bin/python
import threading
import socket
import select
import sys

class Redirect(threading.Thread):
   def setSocket(self, socket1, socket2, isCommand):
      self.socket1 = socket1
      self.socket2 = socket2
      self.isCommand = isCommand

   def run(self):
      overwriteNext = False
      while 1:
         l = [self.socket1, self.socket2]
         ready_read, ready_write, ready_err = select.select(l, [], [])
         if len(ready_err):
            self.socket1.close()
            self.socket2.close()
            return
         for s in ready_read:
            if s.fileno() == self.socket1.fileno():
               t = self.socket2
            else:
               t = self.socket1
            msg = s.recv(8192)
            if not msg:
               self.socket1.close()
               self.socket2.close()
               return
            if self.isCommand:
               if msg.startswith("227 "):
                  pOpen  = msg.find("(")
                  pClose = msg.find(")")
                  IP = msg[pOpen+1:pClose].split(",")
                  dataSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                  to = ("%d.%d.%d.%d" % (int(IP[0]), int(IP[1]), int(IP[2]), int(IP[3])), int(IP[4]) * 256 + int(IP[5]))
                  dataSocket.connect(to)
                  serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                  serversocket.bind(("localhost", 0))
                  serversocket.listen(1)
                  n = serversocket.getsockname()
                  msg = "227 Entering Passive Mode (127,0,0,1,%d,%d).\n" % (n[1] / 256, n[1] % 256)
                  t.send(msg)
                  (s, address) = serversocket.accept()
                  r = Redirect()
                  r.setSocket(s, dataSocket, False)
                  r.start()
                  msg=""
               elif msg.startswith("SITE CHMOD "):
                  overwriteNext = True
               elif msg.startswith("STOR "):
                  print "Uploading %s" % msg[5:]
            if msg:
               if msg.startswith("500 ") and overwriteNext:
                  msg = "200 CHMOD command successful.\n"
                  overwriteNext = False
               t.send(msg)

if len(sys.argv) != 2:
   print "Usage : %s url\n" % sys.argv[0]
   sys.exit(0)

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(("localhost", 21))
serversocket.listen(1)

print "Listening on ", serversocket.getsockname()

while 1:
   (s, address) = serversocket.accept()
   remotesocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   remotesocket.connect((sys.argv[1], 21))

   r = Redirect()
   r.setSocket(remotesocket, s, True)
   r.start()

(ne faite pas attention à la qualité du code, ça a été écrit à l'arrache complet ;) )
Sauvegardez le fichier sous le nom proxy.py quelque part sur votre disque, disons, sur le bureau.

Ensuite, lancer Terminal, et entrez la commande suivante :
Bloc de code:
chmod a+x ./Desktop/proxy.py

Ensuite, à chaque fois que vous souhaiterez utiliser iWeb pour publier un site, exécutez les commandes suivantes dans le terminal:
Bloc de code:
sudo -s
votre mot de passe administrateur
./Desktop/proxy.py ftpperso.free.fr

bien sûr, vous devrez remplacer le ftpperso.free.fr par l'adresse du ftp de votre choix.

Dans iWeb, remplissez tout comme si vous alliez utiliser votre serveur FTP, mais à la place de l'adresse du serveur, mettez tout simplement 127.0.0.1

Et voilà, tentez le test, et si ça marche, publiez ;)

En espérant avoir pu être utile à quelqu'un

PS : les serveurs de Free sont calamiteux: ils n'autorisent pas plus de deux connexions à la fois par IP, et il m'arrive souvent de me faire jeter pendant un upload. Ce script est ultra basique, il ne gère pas bien ce genre de déconnexion ... désolé ... M'enfin, même avec Cyberduck j'ai souvent du mal à uploader mon site ;)
 
ça sert juste à pouvoir publier son site depuis iWeb en FTP sans passer par un autre soft à côté, ce qui est tout de même plus pratique :D
Ca évite par exemple les synchronisation répertoire local/distant (souvent foireuse), ou pire encore, la recopie systématique complète du site suite à une modification...
En résumé, ça apporte la fonctionnalité d'envoi FTP de iWeb qui ne marche pas directement avec les serveur de Free...
 
Merci pour le tuyau mais je préfère continuer à faire à l'ancienne en attendant une mise à jour qui corrige ce problème. Parce que faire ça à chaque fois... :afraid:
 
Merci pour le tuyau mais je préfère continuer à faire à l'ancienne en attendant une mise à jour qui corrige ce problème. Parce que faire ça à chaque fois... :afraid:

en fait, le seul truc à faire à chaque fois c'était uniquement de taper

Bloc de code:
sudo -s
mot de passe admin
./Desktop/proxy ftpperso.free.fr

le reste c'était juste la première fois hein ;)

Sinon, j'ai une autre solution beaucoup plus rapide: celle de patcher iWeb.

Il suffit de télécharger le fichier que je joins à ce message, le décompresser n'importe où, vous double-cliquez et hop iWeb fonctionne à merveille sur les serveur de Free :D
Encore un double clic, et hop vous êtes revenu à la version officiel d'Apple qui ne marche pas...
 
en fait, le seul truc à faire à chaque fois c'était uniquement de taper

Bloc de code:
sudo -s
mot de passe admin
./Desktop/proxy ftpperso.free.fr
le reste c'était juste la première fois hein ;)

Sinon, j'ai une autre solution beaucoup plus rapide: celle de patcher iWeb.

Il suffit de télécharger le fichier que je joins à ce message, le décompresser n'importe où, vous double-cliquez et hop iWeb fonctionne à merveille sur les serveur de Free :D
Encore un double clic, et hop vous êtes revenu à la version officiel d'Apple qui ne marche pas...
J'avais bien compris. ;)

Mais tu peux envoyer ton truc à Apple. Ca les aidera à corriger le bug d'iWeb plus vite. :D
 
  • J’aime
Réactions: koeklin
Bon alors mon iweb 3 me dit que j'ai une MAJ qui devrait régler le problème d'upload sur du non mobile me. super, me dis-je. seuement voilà j'ai lancé MAJ de logiciel qui me dit 'non, tout est à jour' alors j'ai téléchargé manuellement le package 301 et je l'ai double cliqué>. il me dit "ah mais vous n'avez pas la version 09" (si si je l'ai). Donc j'ai viré l'ancienne version 08. pas mieux. J'ai redémarré. Toujours rien.

Il doit y avoir indiqué dans un coin que j'ai la version 08 installée et le remplacement par les nouvelles versions n'y a rien fait donc je suppose que je dois tripoter un dossier ou une bibliothèque caché quelque part mais je ne sais pas où. Quelqu'un a le même problème ? quelqu'un a une solution (élégante je veux dire 'impliquat pas de formatage de disque dur parce que si c'est pour me passer de cyberduck je peux vivre avec ma bidouille d'avant).

Bon bon
 
Bon, déjà ce n'est pas normal que tu aies iWeb '08 et iWeb '09 sur le même Mac. Quand tu installe iLife '09, iWeb '08 est remplacé par iWeb '09.

Ensuite pour qu'une application Apple puisse se mettre à jour il faut qu'elle soit à sa place d'origine et donc n'ait pas été déplacée. Pour ce qui est d'iWeb '09, sa place d'origine est la racine du dossier Applications. Est-ce le cas ?
 
Bah oi j'avais tout rangé dans un dossier "iLife 09" en me disant (vieille habitude de PCiste contraint) que la dernière MAJ allait être instable. Et donc en le remettant dans la racine: tout va bien.