plistだけでなく、リンククリックのURLも
urllib.quote_plus() 相当にしておかないとよろしくないようです。
iOS, Andorid のアプリを配布するCGI
iOSのほうはiDEP取って inhouseってことで。
#!/usr/bin/python import hmac import hashlib from base64 import b64encode, urlsafe_b64encode from urllib import quote_plus, urlopen sigbin = hmac.new(vkey, user, hashlib.sha256).digest() signature = urlsafe_b64encode(sigbin) s = urlsafe_b64encode(sigbin) import cgi import cgitb cgitb.enable(display=0, logdir="/tmp") #cgitb.enable() import sys form = cgi.FieldStorage() fn, isig, ukey, usig = '', '', '', '' if 'idle' in form.keys(): ukey = form['idle'].value mac = hmac.new(vkey, ukey, hashlib.sha256) sig = mac.digest() isig = urlsafe_b64encode(sig) if 'busy' in form.keys(): usig = form['busy'].value if 'fn' in form.keys(): fn = form['fn'].value f = urlsafe_b64decode(fn)[::-1] if f == '' or isig == '' or ukey == '' or usig == '' or usig != isig: print """Content-type: text/html Error """ else: fx = open("/var/uso/jordan/%s"%f, 'rb') fx.seek(0, 2) bytes = fx.tell() fx.seek(0, 0) ctype = "text/plain; charset=UTF-8" if '.apk' in f: ctype = "application/vnd.android.package-archive" elif '.ipa' in f: ctype = "application/octet-stream" print """Content-Type: %s Content-Disposition: attachment; filename="%s" Content-Length: %s """%(ctype, f, bytes) while True: data = fx.read(4096) sys.stdout.write(data) if not data: break fx.close()
みたいな?
あいかわらず雑ですが。
centos6 apache の suexec の docroot を強引に書きかえる
よいこはやってはいけません(笑)。
CentOS 6 標準の yum で取れる apache / suexec で VirtualHost なんかを /home以下で運用したいな、みたいなときの話です。
suexec.logに
command not in docroot
と出るようなときの強引な対処法です。
もう一度書きますが、よいこはやってはいけません。人におすすめすることはできないやりかたです。
# cp /usr/sbin/suexec /root/sec/suexec # cd /root/sec # cp suexec suexec.org # vi -b suexec
-bがポイントです
そしたら 、/var\/www として該当箇所を探します。
仮に /home 以下で実行させたいなら
var/
までを
home
に書きかえます。で、このあと重要。vi上で '^@' と表示されるNULLを
www
の部分に上書きします。vi的には一番はじめのwの上にカーソルがきたら、xxxxPPPP でいいんじゃないかな?もしかしたら、xxxxpppp になるのかもしれない(実際につかわないとそのへんわかんないタイプです)。
:wq! で抜けたら
# ls -l suexec* サイズが同じか見る # cmp -l suexec* 7つだけちがうか見る # cd /usr/sbin # mv suexec suexec.org # mv /root/sec/suexec . # chown root:apache suexec # chmod 4510 suexec
sleep 1 は筋悪だったので
自己満レベルですが書き換えました。
endpoint = "エンドポイント" akey = "アクセスキー" skey = "秘密キー" sigbase ="""GET %s / %s""" import hmac import hashlib from base64 import b64encode, urlsafe_b64encode from datetime import datetime, timedelta from urllib import quote_plus, urlopen from sys import exit def callAPI2XML(params, confirm=1): baseparam = dict(AWSAccessKeyId=akey, SignatureMethod = 'HmacSHA256', SignatureVersion = '2', Version = '2012-04-23', ) onesec = timedelta(0, 1) baseparam.update(params) signature, signatureS = range(2) now = datetime.utcnow() while signature != signatureS: timeStamp = now.isoformat().split('.')[0] baseparam.update(dict(Timestamp = timeStamp)) data = '&'.join(['%s=%s'%(x, quote_plus(baseparam[x])) for x in sorted(baseparam.keys())]) sigdata = sigbase%(endpoint, data) sigbin = hmac.new(skey, sigdata, hashlib.sha256).digest() signature, signatureS = b64encode(sigbin), urlsafe_b64encode(sigbin) now -= onesec uri = '%s&Signature=%s'%(data, signatureS) url = 'https://%s/?%s'%(endpoint, uri) if confirm: print "!!!!You will perform followings!!!!" for k,v in params.iteritems(): print "Param:",k, "\nValue:", v, "\n" while (not (confirm in ['y', 'n'])): confirm = raw_input("\nDo you perform this request? (y/n)") if confirm == 'n': exit(0) response = urlopen(url) xml = response.read() return xml ## main if "__name__" == "__main__": from xml.etree import ElementTree xml = callAPI2XML(dict(Action='DescribeDBSecurityGroups',DBSecurityGroupName='test')) # print xml # みづらい # ETreeでざっくり表示 root = ElementTree.fromstring(xml) for e in root.getiterator(): if not e.text:continue text = e.text.strip() if not text:continue tag = e.tag.split('}')[1] print tag, text
実際のAPI呼出し
APIはこんな感じで呼びだせます。
$ more createDBSG
#!/usr/bin/python
from libcreateURL import createURL
from sys import argv
if len(argv) != 3:
print "Usage: %s <name(id)> <desciption>"%argv[0]
exit(1)
param = dict(Action='CreateDBSecurityGroup',
DBSecurityGroupName=argv[1],
DBSecurityGroupDescription=argv[2],
)
html = createURL(param)
print html
RDB Cloudn API
NTT.comのクラウド、Cloudn のRDB にpython でAPIアクセスするときの覚えがきです。
URLベースでいくので大体以下のようなコードで大丈夫
endpoint=<RDBのエンドポイント> akey=<アクセスキー> skey=<ひみつキー> sigbase ="""GET rdb-api.jp-e1.cloudn-service.com / %s""" import hmac import hashlib from base64 import b64encode, urlsafe_b64encode from datetime import datetime, timedelta from urllib import quote_plus, urlopen from time import sleep from sys import argv, exit def createURL(params): timeback = timedelta(0, 9*3600+1) # JST to GMT baseparam = dict(AWSAccessKeyId=akey, SignatureMethod = 'HmacSHA256', SignatureVersion = '2', Version = '2012-04-23', ) baseparam.update(params) signature, signatureS = 1, 2 while signature != signatureS: if signature != 1: sleep(1) timeStamp = (datetime.now()-timeback).isoformat().split('.')[0] baseparam.update(dict(Timestamp = timeStamp)) data = '%s'%('&'.join(['%s=%s'%(x, quote_plus(baseparam[x])) for x in sorted (baseparam.keys())])) sigdata = sigbase%data sigbin = hmac.new(skey, sigdata, hashlib.sha256).digest() signature = b64encode(sigbin) signatureS = urlsafe_b64encode(sigbin) uri = '%s&Signature=%s'%(data, signatureS) url = '%s/?%s'%(endpoint, uri) print "!!!!You will perform followings!!!!" for k,v in params.iteritems(): print "Param:",k, "\nValue:", v, "\n" ans = '' while (not (ans in ['y', 'n'])): ans = raw_input("\nDo you perform this request? (y/n)") if ans == 'n': exit(0) response = urlopen(url) html = response.read() return html