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 <k...@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@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