File: chart.cgi.in

package info (click to toggle)
moosefs 4.58.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,644 kB
  • sloc: ansic: 129,204; python: 12,419; sh: 5,874; javascript: 2,273; makefile: 838
file content (137 lines) | stat: -rw-r--r-- 3,008 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env @PYTHON@

import socket
import struct
import sys

PROTO_BASE = @PROTO_BASE@

CUTOAN_CHART = (PROTO_BASE+504)
ANTOCU_CHART = (PROTO_BASE+505)

if sys.version_info[0]<3 or ( sys.version_info[0]==3 and sys.version_info[1]<11):
	import cgi
	import cgitb

	cgitb.enable()

	fields = cgi.FieldStorage()
else:
	try:
		import urllib.parse as xurllib
	except ImportError:
		import urllib as xurllib
	import os

	class FieldStorage:
		def __init__(self):
			self.data = {}
			for k,v in xurllib.parse_qsl(os.environ["QUERY_STRING"]):
				if k in self.data:
					if type(self.data[k])==str:
						x = self.data[k]
						self.data[k] = [x]
					self.data[k].append(v)
				else:
					self.data[k] = v
		def __repr__(self):
			return repr(self.data)
		def __str__(self):
			return str(self.data)
		def __contains__(self,key):
			return key in self.data
		def __iter__(self):
			return iter(self.data.keys())
		def getvalue(self,key):
			if key in self.data:
				return self.data[key]
			return None

	fields = FieldStorage()

if "host" in fields:
	host = fields.getvalue("host")
else:
	host = ''
if "port" in fields:
	try:
		port = int(fields.getvalue("port"))
	except ValueError:
		port = 0
else:
	port = 0
if "id" in fields:
	try:
		chartid = int(fields.getvalue("id"))
	except ValueError:
		chartid = -1
else:
	chartid = -1
if "width" in fields and "height" in fields:
	try:
		width = int(fields.getvalue("width"))
		height = int(fields.getvalue("height"))
	except ValueError:
		width = 0
		height = 0
else:
	width = 0
	height = 0

def mysend(socket,msg):
	totalsent = 0
	while totalsent < len(msg):
		sent = socket.send(msg[totalsent:])
		if sent == 0:
			raise RuntimeError("socket connection broken")
		totalsent = totalsent + sent

def myrecv(socket,leng):
	msg = bytes(0)
	while len(msg) < leng:
		chunk = socket.recv(leng-len(msg))
		if len(chunk) == 0:
			raise RuntimeError("socket connection broken")
		msg = msg + chunk
	return msg

def senderr():
	print("Content-Type: image/gif\r\n\r")
	sys.stdout.flush()
	if "DOCUMENT_ROOT" in os.environ:
		filename=os.environ["DOCUMENT_ROOT"] + "/assets/err.gif"
	else:
		filename="err.gif"
	f = open(filename,'rb')
	sys.stdout.buffer.write(f.read())
	f.close()

if host=='' or port==0 or chartid<0:
	senderr()
else:
	try:
		s = socket.socket()
		s.connect((host,port))
		if width==0 and height==0:
			mysend(s,struct.pack(">LLL",CUTOAN_CHART,4,chartid))
		else:
			mysend(s,struct.pack(">LLLHH",CUTOAN_CHART,8,chartid,width,height))
		header = myrecv(s,8)
		cmd,length = struct.unpack(">LL",header)
		if cmd==ANTOCU_CHART and length>0:
			data = myrecv(s,length)
			if data[:3]=="GIF".encode("latin-1"):
				print("Content-Type: image/gif\r\n\r")
				sys.stdout.flush()
				sys.stdout.buffer.write(data)
			elif data[:8]=="\x89PNG\x0d\x0a\x1a\x0a".encode("latin-1"):
				print("Content-Type: image/png\r\n\r")
				sys.stdout.flush()
				sys.stdout.buffer.write(data)
			else:
				senderr()
		else:
			senderr()
		s.close()
	except Exception:
		senderr()