[ANN] pyKook 0.7.1 - task automation tool for Python, similar to Rake or Ant
Makoto Kuwata
kwa at kuwata-lab.com
Thu Nov 10 16:54:02 EST 2011
I have released pyKook
0.7.1.http://pypi.python.org/pypi/Kook/http://www.kuwata-lab.com/kook/http://www.kuwata-lab.com/kook/pykook-users-guide.html
pyKook is a task automation tool for Python, similar to Rake or Ant.
Bugfix in this release----------------------
* Fixed to include 'kook/books/*.py' into .egg file
--regads,makoto kuwata
On Sat, Nov 5, 2011 at 3:06 PM, Makoto Kuwata <kwa at kuwata-lab.com> wrote:
> Hi,
>
> I have released pyKook 0.7.0.
> http://pypi.python.org/pypi/Kook/
> http://www.kuwata-lab.com/kook/
> http://www.kuwata-lab.com/kook/pykook-users-guide.html
>
> In this release, you can run commands on remote machines using ssh.
> This is very useful to deploy your application.
>
>
> pyKook Overview
> ---------------
>
> pyKook is a task automation tool for Python, similar to Rake or Ant.
>
> (Kookbook.py):
>
> kookbook.default = 'build'
>
> ## task
> @recipe(None, ['hello'])
> def build(c):
> """build all"""
> pass
>
> ## file
> @recipe('hello', ['hello.o'])
> def file_hello(c):
> """build 'hello' from 'hello.o'"""
> system(c%'gcc -o $(product) $(ingred)')
>
> ## rule
> @recipe('*.o', ['$(1).c', '$(1).h'])
> def file_o(c):
> system(c%'gcc -c $(ingred)')
>
>
> Command-line:
>
> bash> kk # or pykook
> $ gcc -c hello.c
> ### *** hello.o (recipe=file_o)
> $ gcc -c hello.c
> ### ** hello (recipe=file_hello)
> $ gcc -o hello hello.o
> ### * build (recipe=build)
>
> See http://www.kuwata-lab.com/kook/pykook-users-guide.html for details.
>
>
> Enhancements in this release
> ----------------------------
>
> * (EXPERIMENTAL!!) Remote command execution (ssh and sftp) is available.
> This is very useful to deploy your application into servers.
>
> Ex (Kookbook.py)::
>
> from kook.remote import Remote
> remote = Remote(
> hosts = ['www1', 'www2', 'user3 at www3:10022'],
> port = 22,
> user = 'user1',
> #password = None, # for login, '~/.ssh/id_rsa' and sudo
> passphrase = None, # only for '~/.ssh/id_rsa'
> sudo_password = 'xxx', # only for sudo command
> )
>
> @recipe
> @remotes(remote)
> def hostinfo(c):
> """show hostname"""
> ssh = c.ssh
> ssh('hostname') # run command with ssh
> ssh('whomai') # run command with ssh
> ssh.sudo('whoami') # run command with sudo
>
> @recipe
> @remotes(remote)
> def exchange(c):
> """upload and download files"""
> ssh = c.ssh
> with ssh.pushd('work/apps'):
> ssh.get('file.remote') # download a file
> ssh.put('file.local') # upload a file
> ssh.mget('remote.*') # download files
> ssh.mput('local.*') # upload files
>
> Notice that you must configure ssh at first and confirm that
> you can log into servers without typing password::
>
> bash> ssh user1 at www1
> bash> ssh user1 at www2
> bash> ssh -p 10022 user3 at www3
> bash> kk hostinfo
> ### * showinfo (recipe=showinfo)
> [user1 at www1]$ hostame
> www1
> [user1 at www1]$ whoami
> user1
> [user1 at www1]$ sudo whoami
> root
> [user2 at www2]$ hostame
> www2
> [user2 at www2]$ whoami
> user2
> [user2 at www2]$ sudo whoami
> root
> [user3 at www3]$ hostame
> www3
> [user3 at www3]$ whami
> user3
> [user3 at www3]$ sudo whoami
> root
>
> Currently commands are executed sequencially (not in parallel).
>
> * (EXPERIMENTAL!!) Password object supported.
> Password object asks you to enter password in prompt when necessary.
>
> Ex (Kookbook.py)::
>
> from kook.remote import Remote, Password
> remote = Remote(
> hosts = ['user1 at www1:22'],
> #password = Password('login'),
> passphrase = Password('~/.ssh/id_rsa'),
> sudo_password = Password('sudo command')
> )
> #
> @recipe
> @remotes(remote)
> def remote_test(c):
> ssh = c.ssh
> ssh.sudo('whoami')
>
> Output example::
>
> bash> kk remote_test
> ### * remote_test (recipe=remote_test)
> Password for ~/.ssh/id_rsa:
> Password for sudo command:
> [user1 at www1]$ sudo whoami
> root
>
> It is easy to share password object.
>
> Ex (Kookbook.py)::
>
> from kook.remote import Remote, Password
> passwd = Password()
> remote = Remote(
> hosts = ['user1 at www1:22'],
> password = passwd,
> passphrase = passwd,
> sudo_password = passwd,
> )
>
>
> Changes in this release
> -----------------------
>
> * Category class is changed to convers all instance methods into staticmethods.
>
> Ex (Kookbook.py):
>
> class apache(Category):
> @recipe
> def start(c):
> system('apachectl start')
>
> ## start() is converted into staticmethod
> assert type(apache.__dict__['start']) == staticmethod
> from types import FunctionType
> assert type(apache.start) == FuntionType
>
> This makes execution of other recipes in category easier::
>
> class apache(Category):
> @recipe
> def start(c):
> ...
> @recipe
> def stop(c):
> ...
> @recipe
> def restart(c):
> apache.start(c) # execute other recipe
> apache.stop(c) # execute other recipe
>
> * (internal) kook.config.stdout and kook.config.stderr are removed.
>
>
>
> See http://www.kuwata-lab.com/kook/pykook-CHANGES.txt for details.
>
>
> Have fun!
>
> --
> regards,
> makoto kuwata
>
More information about the Python-list
mailing list