[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