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