diff --git a/hyde/ext/publishers/ssh.py b/hyde/ext/publishers/ssh.py new file mode 100644 index 0000000..11cb3b6 --- /dev/null +++ b/hyde/ext/publishers/ssh.py @@ -0,0 +1,58 @@ +""" +SSH publisher +============= +Contains classes and utilities that help publishing a hyde website +via ssh/rsync. + +Usage +----- +In site.yaml, add the following lines + + publisher: + ssh: + type: hyde.ext.publishers.ssh.SSH + username: username + server: ssh.server.com + target: /www/username/mysite/ + command: rsync + opts: -r -e ssh + +Note that the final two settings (command and opts) are optional, and the +values shown are the default. With this set, generate and publish the site +as follows: + + >$ hyde gen + >$ hyde publish -p ssh + +For the above options, this will lead to execution of the following command, +assuming the specified deploy directory is ``deploy/``: + + rsync -r -e ssh [deploy/] username@ssh.server.com:/www/username/mysite/ + +""" +from hyde.publisher import Publisher + +from subprocess import Popen, PIPE + +class SSH(Publisher): + def initialize(self, settings): + self.settings = settings + self.username = settings.username + self.server = settings.server + self.target = settings.target + self.command = getattr(settings, 'command', 'rsync') + self.opts = getattr(settings, 'opts', '-r -e ssh') + + def publish(self): + command = "{command} {opts} ./ {username}@{server}:{target}".format( + command=self.command, + opts=self.opts, + username=self.username, + server=self.server, + target=self.target) + deploy_path = self.site.config.deploy_root_path.path + + cmd = Popen(command, cwd=unicode(deploy_path), stdout=PIPE, shell=True) + cmdresult = cmd.communicate()[0] + if cmd.returncode: + raise Exception(cmdresult)