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