summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xlandscape163
-rwxr-xr-xpb/generate.py32
-rw-r--r--pb/lib/utils.py7
-rw-r--r--test.sh4
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