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@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@www1
        bash> ssh user1@www2
        bash> ssh -p 10022 user3@www3
        bash> kk hostinfo
        ### * showinfo (recipe=showinfo)
        [user1@www1]$ hostame
        www1
        [user1@www1]$ whoami
        user1
        [user1@www1]$ sudo whoami
        root
        [user2@www2]$ hostame
        www2
        [user2@www2]$ whoami
        user2
        [user2@www2]$ sudo whoami
        root
        [user3@www3]$ hostame
        www3
        [user3@www3]$ whami
        user3
        [user3@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@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@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@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
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to