Mercurial > piecrust2
annotate piecrust/publishing/sftp.py @ 767:3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
author | Ludovic Chabant <ludovic@chabant.com> |
---|---|
date | Sat, 02 Jul 2016 01:27:56 -0700 |
parents | dd03385adb62 |
children | 13e8b50a2113 |
rev | line source |
---|---|
759
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
1 import os |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
2 import os.path |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
3 import socket |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
4 import urllib.parse |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
5 import getpass |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
6 import logging |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
7 import paramiko |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
8 from piecrust.publishing.base import Publisher, PublisherConfigurationError |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
9 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
10 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
11 logger = logging.getLogger(__name__) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
12 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
13 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
14 class SftpPublisher(Publisher): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
15 PUBLISHER_NAME = 'sftp' |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
16 PUBLISHER_SCHEME = 'sftp' |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
17 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
18 def setupPublishParser(self, parser, app): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
19 parser.add_argument( |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
20 '--force', |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
21 action='store_true', |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
22 help=("Upload the entire bake directory instead of only " |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
23 "the files changed by the last bake.")) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
24 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
25 def run(self, ctx): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
26 remote = self.config |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
27 if not self.has_url_config: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
28 host = self.getConfigValue('host') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
29 if not host: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
30 raise PublisherConfigurationError( |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
31 "Publish target '%s' doesn't specify a 'host'." % |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
32 self.target) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
33 remote = urllib.parse.urlparse(host) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
34 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
35 hostname = remote.hostname |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
36 port = remote.port or 22 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
37 path = remote.path |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
38 if not hostname: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
39 hostname = path |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
40 path = '' |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
41 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
42 username = remote.username |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
43 pkey_path = None |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
44 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
45 if not self.has_url_config: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
46 if not username: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
47 username = self.getConfigValue('username') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
48 if not path: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
49 path = self.getConfigValue('path') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
50 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
51 pkey_path = self.getConfigValue('key') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
52 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
53 password = None |
767
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
54 if username and not ctx.preview: |
759
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
55 password = getpass.getpass("Password for '%s': " % username) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
56 |
767
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
57 if ctx.preview: |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
58 logger.info("Would connect to %s:%s..." % (hostname, port)) |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
59 self._previewUpload(ctx, path) |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
60 return |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
61 |
759
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
62 logger.debug("Connecting to %s:%s..." % (hostname, port)) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
63 lfk = (not username and not pkey_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
64 sshc = paramiko.SSHClient() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
65 sshc.load_system_host_keys() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
66 sshc.set_missing_host_key_policy(paramiko.WarningPolicy()) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
67 sshc.connect( |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
68 hostname, port=port, |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
69 username=username, password=password, |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
70 key_filename=pkey_path, |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
71 look_for_keys=lfk) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
72 try: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
73 logger.info("Connected as %s" % |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
74 sshc.get_transport().get_username()) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
75 client = sshc.open_sftp() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
76 try: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
77 self._upload(sshc, client, ctx, path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
78 finally: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
79 client.close() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
80 finally: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
81 sshc.close() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
82 |
767
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
83 def _previewUpload(self, ctx, dest_dir): |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
84 if not ctx.args.force: |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
85 logger.info("Would upload new/changed files...") |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
86 else: |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
87 logger.info("Would upload entire website...") |
3b33d9fb007c
publish: Add support for `--preview` for the SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
759
diff
changeset
|
88 |
759
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
89 def _upload(self, session, client, ctx, dest_dir): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
90 if dest_dir: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
91 if dest_dir.startswith('~/'): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
92 _, out_chan, _ = session.exec_command("echo $HOME") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
93 home_dir = out_chan.read().decode('utf8').strip() |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
94 dest_dir = home_dir + dest_dir[1:] |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
95 logger.debug("CHDIR %s" % dest_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
96 try: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
97 client.chdir(dest_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
98 except IOError: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
99 client.mkdir(dest_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
100 client.chdir(dest_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
101 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
102 known_dirs = {} |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
103 if ctx.was_baked and not ctx.args.force: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
104 to_upload = list(self.getBakedFiles(ctx)) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
105 to_delete = list(self.getDeletedFiles(ctx)) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
106 if to_upload or to_delete: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
107 logger.info("Uploading new/changed files...") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
108 for path in self.getBakedFiles(ctx): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
109 rel_path = os.path.relpath(path, ctx.bake_out_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
110 logger.info(rel_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
111 if not ctx.preview: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
112 self._putFile(client, path, rel_path, known_dirs) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
113 logger.info("Deleting removed files...") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
114 for path in self.getDeletedFiles(ctx): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
115 rel_path = os.path.relpath(path, ctx.bake_out_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
116 logger.info("%s [DELETE]" % rel_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
117 if not ctx.preview: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
118 try: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
119 client.remove(rel_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
120 except OSError: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
121 pass |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
122 else: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
123 logger.info("Nothing to upload or delete on the remote server.") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
124 logger.info("If you want to force uploading the entire website, " |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
125 "use the `--force` flag.") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
126 else: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
127 logger.info("Uploading entire website...") |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
128 for dirpath, dirnames, filenames in os.walk(ctx.bake_out_dir): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
129 for f in filenames: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
130 abs_f = os.path.join(dirpath, f) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
131 rel_f = os.path.relpath(abs_f, ctx.bake_out_dir) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
132 logger.info(rel_f) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
133 if not ctx.preview: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
134 self._putFile(client, abs_f, rel_f, known_dirs) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
135 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
136 def _putFile(self, client, local_path, remote_path, known_dirs): |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
137 # Split the remote path in bits. |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
138 remote_path = os.path.normpath(remote_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
139 if os.sep != '/': |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
140 remote_path = remote_path.sub(os.sep, '/') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
141 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
142 # Make sure each directory in the remote path exists... to prevent |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
143 # testing the same directories several times, we keep a cache of |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
144 # `known_dirs` which we know exist. |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
145 remote_bits = remote_path.split('/') |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
146 cur = '' |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
147 for b in remote_bits[:-1]: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
148 cur = os.path.join(cur, b) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
149 if cur not in known_dirs: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
150 try: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
151 info = client.stat(cur) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
152 except FileNotFoundError: |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
153 logger.debug("Creating remote dir: %s" % cur) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
154 client.mkdir(cur) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
155 known_dirs[cur] = True |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
156 |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
157 # Should be all good! Upload the file. |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
158 client.put(local_path, remote_path) |
dd03385adb62
publish: Add SFTP publisher.
Ludovic Chabant <ludovic@chabant.com>
parents:
diff
changeset
|
159 |