diff options
| -rwxr-xr-x | landscape | 163 | ||||
| -rwxr-xr-x | pb/generate.py | 32 | ||||
| -rw-r--r-- | pb/lib/utils.py | 7 | ||||
| -rw-r--r-- | test.sh | 4 |
4 files changed, 188 insertions, 18 deletions
diff --git a/landscape b/landscape new file mode 100755 index 0000000..10e8ede --- /dev/null +++ b/landscape @@ -0,0 +1,163 @@ +#!/usr/bin/python2.7 +import cgi +import sys +import os +import re +import time +import string +import urllib +from subprocess import Popen, PIPE +import sha +import simplejson as json + +import mimetypes +import s3 + +import db +DB = db.db () + +import base64 +import urlparse + + +AWS_ACCESS_KEY_ID = 'AKIAIR53VPBXKJMXZIBA' +AWS_SECRET_ACCESS_KEY = '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' +BUCKET_NAME = 'i.asdf.us' +BASE_PATH = "/var/www/asdf.us/httpdocs/imlandscape" +BASE_URL = "http://i.asdf.us/" +PARAM_LIST = "heightmap texture name imgdata filename" +BIN_IDENTIFY = "/usr/bin/identify" + +print "Content-type: text/plain" +print "" +def insert_cmd (dir, newfile, name, texture, dataobj): + if texture == "": + texture = "NULL" + try: + sql = "INSERT INTO im_cmd (date,remote_addr,name,url,dir,oldfile,newfile,cmd, dataobj, tag) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s, %s)" + + args = (now(), "NULL", name, texture, dir, "NULL", newfile, "NULL", dataobj, "imlandscape") + DB.execute(sql, args) + except (): + return + +def hash_dir (s): + return sha.new(s).hexdigest()[:2] + +def bin_identify (filename): + ident = Popen([BIN_IDENTIFY, filename], stdout=PIPE).communicate()[0] + partz = ident.split(" ") + width,height = partz[2].split("x") + return width, height + +def get_params (paramlist): + paramkeys = paramlist.split() + form = cgi.FieldStorage() + params = {} + for key in paramkeys: + if key in form: + if key == 'heightmap': + params[key] = form[key].value + elif key == 'imgdata': + params[key] = form[key].value + elif key == 'texture': + params[key] = form[key].value + else: + params[key] = sanitize(form[key].value) + else: + params[key] = None + return params + +def error (e): + print "#@imlandscape" + print "ERROR\t"+e + sys.exit() + +def now (): + return int(time.mktime(time.localtime())) + +def sanitize (str): + return re.sub(r'\W+', '', str) + +def filename_from_url (url, name=""): + if "?" in url: + url = url.split("?")[0] + if "/" in url: + url = urllib.unquote(url).replace(" ","") + filename = url.split("/")[-1] + filetype = "png" + filename = sanitize(filename[:-4]) + else: + filename = "" + if name != "": + name = name+"_" + return "{}_{}{}_{}.{}".format("imlandscape", name, filename,now(), "png") + +def saveImgData(url, filename): + try: + up = urlparse.urlparse(url) + head, data = up.path.split(',', 1) + bits = head.split(';') + mime_type = bits[0] if bits[0] else 'text/plain' + charset, b64 = 'ASCII', False + for bit in bits[1]: + if bit.startswith('charset='): + charset = bit[8:] + elif bit == 'base64': + b64 = True + + # Do something smart with charset and b64 instead of assuming + plaindata = base64.b64decode(data) + + with open(filename, 'wb') as f: + f.write(plaindata) + except Exception as e: + error(str(e)); + +def file_size (file): + return os.stat(file)[6] + +def moveToS3(filename,objectname): + conn = s3.AWSAuthConnection(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) + sys.stderr.write( "Uploading %s" % filename) + filedata = open(filename, 'rb').read() + content_type = mimetypes.guess_type(filename)[0] + if not content_type: + content_type = 'text/plain' + conn.put(BUCKET_NAME, objectname, s3.S3Object(filedata), + {'x-amz-acl': 'public-read', 'Content-Type': content_type, 'x-amz-storage-class': 'REDUCED_REDUNDANCY'}) + +param = get_params(PARAM_LIST) +if param['imgdata'] is None: + error("no imgdata") +url = param['imgdata'] +if param['texture'] is None: + param['texture'] = ""; +if param['heightmap'] is None: + param['heightmap'] = ""; +if param['name'] is None: + param['name'] = ""; + +dataobj = json.dumps({ + 'texture' : param['texture'], + 'heightmap' : param['heightmap'], + 'name' : param['name'] +}) + +dir = hash_dir(param['imgdata']); + +filename = filename_from_url(param['texture'], param['name']); + +tag = "imlandscape" +objectname = "im/"+dir+"/"+filename + +saveImgData(param['imgdata'], filename); + +print "#@imlandscape" +#print ", ".join([k+"="+str(v) for k,v in param.iteritems()]) +print file_size (filename) +print bin_identify (filename) +print BASE_URL+objectname +insert_cmd(dir, filename, param['name'], param['texture'], dataobj); +moveToS3(filename, objectname); +os.remove(filename); diff --git a/pb/generate.py b/pb/generate.py index ffa0e8e..7e97ad7 100755 --- a/pb/generate.py +++ b/pb/generate.py @@ -20,6 +20,9 @@ COMPOSE_PARAMS = [ "Over", "ATop", "Dst_Over", "Dst_In", "Dst_Out", "Multiply", DISPOSE_PARAMS = ["None","Previous","Background"] DISPOSE_DEFAULT = "None" +def debuglog(s): + sys.stderr.write(str(s) + "\n"); + class Generate(): def __init__(self, **kwargs): self.params = {} @@ -63,13 +66,13 @@ class Generate(): "format", #STRINGS - "name", + "username", "callback", #}}} ] for k in self._required_keys: if k in kwargs: - if k in [ 'url', 'background' ] and utils.bool_correct(kwargs[k]): + if k in [ 'url', 'background' ] and kwargs[k] != "" and kwargs[k] != None: self.params[k] = { 'url' : kwargs[k], 'filename' : self._make_tempname(k), @@ -101,8 +104,16 @@ class Generate(): elif k == 'dispose' and self._test_enum(kwargs[k], DISPOSE_PARAMS): self.params[k] = kwargs[k] elif k in [ "fuzz", "width", "height", "brightness", "contrast", "saturation", "rotate", "hue" ]: - self.params[k] = str(int(kwargs[k])) + if kwargs[k] == '': + self.params[k] = None + else: + try: + self.params[k] = str(int(kwargs[k])) + except Exception as e: + raise Exception("Problem with param {}:\n".format(k) + str(e)) else: + + self.params[k] = utils.sanitize(kwargs[k]) if self.params.get('background'): @@ -161,21 +172,20 @@ class Generate(): cmd += ["-fuzz", "{}%".format(self.params['fuzz']) ] cmd += [ "-transparent", self.params.get('subtract', "white") ] if self.params.get('width') or self.params.get('height'): - if self.params.get('nearest'): - if self.params.get('format') == "gif": + if self.params.get('nearest') and self.params.get('format') == "gif": cmd += [ "-coalesce","+map","-interpolate","Nearest","-interpolative-resize" ] - else: - cmd.append("-resize") - cmd += [ "{}x{}".format(self.params.get('width',""), self.params.get('height',"")) ] + else: + cmd.append("-resize") + cmd += [ "{}x{}".format(self.params.get('width',"") or "", self.params.get('height',"") or "") ] if self.params.get('black') != "black" or self.params.get('white') != 'white': cmd += [ "+level-colors" , "{},{}".format(self.params.get('black','black'), self.params.get('white', 'white')) ] if self.params.get('contrast'): cmd += [ '-contrast-stretch', self.params['contrast'] ] if any( e in self.params.keys() for e in ['brightness', 'saturation', 'hue' ]): cmd += [ "-modulate", "{},{},{}".format( - self.params.get('brightness', 100), - self.params.get('contrast', 100), - self.params.get('hue', 100) + (self.params.get('brightness', 100) or 100), + (self.params.get('contrast', 100) or 100), + (self.params.get('hue', 100) or 100) )] cmd.append("-coalesce"); #why? #FIXME cmd += [ self.filepath ]; diff --git a/pb/lib/utils.py b/pb/lib/utils.py index 3630ba0..5ca5b3e 100644 --- a/pb/lib/utils.py +++ b/pb/lib/utils.py @@ -4,6 +4,7 @@ import time import urllib import urllib2 import sys +import os from subprocess import Popen,PIPE,call Request = urllib2.Request urlencode = urllib.urlencode @@ -102,10 +103,10 @@ def download(url, destination, max_size=MAX_SIZE): def file_size (filepath): try: - return os.stat(file)[6] + return os.stat(filepath)[6] except Exception as e: - sys.stderr.write("IMGRID couldn't determine file size") - sys.stderr.write(str(e)) + sys.stderr.write("Couldn't determine filesize\n") + sys.stderr.write(str(e)+"\n") raise; def gif_frames(filepath): diff --git a/test.sh b/test.sh deleted file mode 100644 index 855c655..0000000 --- a/test.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -curl --data 'width=200&height=500' localhost:8999/imgrid -echo "" -curl --data 'url=http://i.asdf.us/im/56/6005101large_1424913577_bike.gif&breaktype=RGB_WASH&breakmode=extreme' localhost:8999/breaker |
