デスクトップを晒す

今使っているのはノートPCですが、本体のみでトリプルモニタが可能なので、5120x1200で使ってます(1600x1200(VGA)+本体+1600x1200(HDMI))。

f:id:nojack:20141226123328j:plain

真ん中だけ下が欠けてますが、これは本体モニタがフルHDという名の縦狭モニタで、120ピクセル足りないせいです。

これだと、80x40くらいのターミナルを6個同時に表示できますので、LB配下で一斉にtail -f とかするのに便利です。

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 のRDBpythonAPIアクセスするときの覚えがきです。

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