Artifact
352bc4af263c64b2eb52e550224be3f8232a1ae5 :
Executable file
extroot/crashreport
— part of check-in
[d3dbeea9f5]
at
2021-04-14 07:22:56
on branch trunk
— Basic error-to-ticket conversion backend.
(user:
mario
size: 3803)
0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 70 68 70 2d 63 #!/usr/bin/php-c
0010: 67 69 20 2d 64 63 67 69 2e 66 6f 72 63 65 5f 72 gi -dcgi.force_r
0020: 65 64 69 72 65 63 74 3d 30 0a 3c 3f 70 68 70 0a edirect=0.<?php.
0030: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 75 74 66 2d # encoding: utf-
0040: 38 0a 23 20 61 70 69 3a 20 63 67 69 0a 23 20 74 8.# api: cgi.# t
0050: 79 70 65 3a 20 61 70 69 0a 23 20 63 61 74 65 67 ype: api.# categ
0060: 6f 72 79 3a 20 74 69 63 6b 65 74 73 0a 23 20 74 ory: tickets.# t
0070: 69 74 6c 65 3a 20 43 72 61 73 68 72 65 70 6f 72 itle: Crashrepor
0080: 74 0a 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a t.# description:
0090: 20 52 65 63 65 69 76 65 73 20 65 72 72 6f 72 73 Receives errors
00a0: 20 28 4a 53 4f 4e 20 50 4f 53 54 29 20 61 6e 64 (JSON POST) and
00b0: 20 66 69 6c 65 73 20 74 68 65 6d 20 61 73 20 74 files them as t
00c0: 69 63 6b 65 74 73 0a 23 20 76 65 72 73 69 6f 6e ickets.# version
00d0: 3a 20 30 2e 31 0a 23 20 73 74 61 74 65 3a 20 61 : 0.1.# state: a
00e0: 6c 70 68 61 0a 23 20 63 6f 6e 66 69 67 3a 20 2d lpha.# config: -
00f0: 0a 23 0a 23 20 43 72 65 61 74 65 73 20 61 20 74 .#.# Creates a t
0100: 69 63 6b 65 74 20 66 6f 72 20 61 6e 79 20 50 4f icket for any PO
0110: 53 54 20 69 74 20 72 65 63 65 69 76 65 73 20 74 ST it receives t
0120: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c hat contains val
0130: 69 64 20 4a 53 4f 4e 2e 0a 23 20 55 6e 70 61 63 id JSON..# Unpac
0140: 6b 73 20 73 6f 6d 65 20 66 69 65 6c 64 73 20 69 ks some fields i
0150: 6e 74 6f 20 74 69 63 6b 65 74 20 70 72 6f 70 65 nto ticket prope
0160: 72 74 69 65 73 2c 20 61 6e 64 20 70 6f 73 74 73 rties, and posts
0170: 20 74 68 65 20 77 68 6f 6c 65 20 62 6c 6f 62 0a the whole blob.
0180: 23 20 61 73 20 74 69 63 6b 65 74 20 63 6f 6d 6d # as ticket comm
0190: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 70 72 6f ent. This is pro
01a0: 62 61 62 6c 79 20 6d 6f 72 65 20 73 75 69 74 61 bably more suita
01b0: 62 6c 65 20 66 6f 72 20 47 55 49 20 61 70 70 73 ble for GUI apps
01c0: 20 74 68 61 6e 0a 23 20 73 6d 61 6c 6c 65 72 20 than.# smaller
01d0: 63 6f 6e 73 6f 6c 65 20 74 6f 6f 6c 73 20 6f 72 console tools or
01e0: 20 6c 69 62 72 61 72 69 6b 65 73 2e 0a 23 20 41 librarikes..# A
01f0: 6e 64 20 69 74 20 63 6f 75 6c 64 20 70 72 6f 62 nd it could prob
0200: 61 62 6c 79 20 61 6c 73 6f 20 62 65 20 72 65 75 ably also be reu
0210: 73 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 sed for storing
0220: 66 65 61 74 75 72 65 20 72 65 71 75 65 73 74 73 feature requests
0230: 2e 0a 23 0a 23 20 4e 6f 77 20 74 68 69 73 20 68 ..#.# Now this h
0240: 61 73 20 73 6f 6d 65 20 70 72 69 76 61 63 79 20 as some privacy
0250: 69 6d 70 6c 69 63 61 74 69 6f 6e 73 2e 20 53 6f implications. So
0260: 20 63 61 72 65 20 73 68 6f 75 6c 64 20 62 65 20 care should be
0270: 74 61 6b 65 6e 20 77 68 69 63 68 0a 23 20 69 6e taken which.# in
0280: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 69 6e 63 formation is inc
0290: 6c 75 64 65 64 2c 20 74 68 65 20 66 69 6c 74 65 luded, the filte
02a0: 72 20 6f 70 74 69 6f 6e 73 20 65 78 70 61 6e 64 r options expand
02b0: 65 64 2c 20 6f 72 20 70 65 72 68 61 70 73 20 65 ed, or perhaps e
02c0: 76 65 6e 0a 23 20 74 68 65 20 74 69 63 6b 65 74 ven.# the ticket
02d0: 20 62 61 63 6b 65 6e 64 20 74 61 6b 65 6e 20 6e backend taken n
02e0: 6f 6e 2d 70 75 62 6c 69 63 2e 0a 23 0a 23 20 42 on-public..#.# B
02f0: 61 73 69 63 20 75 73 61 67 65 20 63 6f 75 6c 64 asic usage could
0300: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 be something li
0310: 6b 65 3a 0a 23 0a 23 20 20 20 20 63 61 74 63 68 ke:.#.# catch
0320: 20 45 78 63 65 70 74 69 6f 6e 20 61 73 20 65 3a Exception as e:
0330: 0a 23 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 .# import
0340: 20 72 65 71 75 65 73 74 73 2c 20 74 72 61 63 65 requests, trace
0350: 62 61 63 6b 2c 20 6a 73 6f 6e 0a 23 20 20 20 20 back, json.#
0360: 20 20 20 20 72 65 71 75 65 73 74 73 2e 70 6f 73 requests.pos
0370: 74 28 22 68 74 74 70 3a 2f 2f 66 6f 73 73 69 6c t("http://fossil
0380: 2e 65 78 61 6d 70 6c 65 2e 63 6f 6d 2f 72 65 70 .example.com/rep
0390: 6f 2f 65 78 74 2f 63 72 61 73 68 72 65 70 6f 72 o/ext/crashrepor
03a0: 74 22 2c 20 64 61 74 61 3d 6a 73 6f 6e 2e 64 75 t", data=json.du
03b0: 6d 70 73 28 7b 0a 23 20 20 20 20 20 20 20 20 20 mps({.#
03c0: 20 20 20 22 76 65 72 73 69 6f 6e 22 3a 20 22 30 "version": "0
03d0: 2e 30 2e 31 22 2c 0a 23 20 20 20 20 20 20 20 20 .0.1",.#
03e0: 20 20 20 20 22 66 69 6c 65 22 3a 20 5f 5f 66 69 "file": __fi
03f0: 6c 65 5f 5f 2c 0a 23 20 20 20 20 20 20 20 20 20 le__,.#
0400: 20 20 20 22 65 72 72 6f 72 22 3a 20 73 74 72 28 "error": str(
0410: 65 29 2c 0a 23 20 20 20 20 20 20 20 20 20 20 20 e),.#
0420: 20 22 65 78 63 65 70 74 69 6f 6e 22 3a 20 72 65 "exception": re
0430: 70 72 28 65 29 2c 0a 23 20 20 20 20 20 20 20 20 pr(e),.#
0440: 20 20 20 20 22 62 61 63 6b 74 72 61 63 65 22 3a "backtrace":
0450: 20 74 72 61 63 65 62 61 63 6b 2e 65 78 74 72 61 traceback.extra
0460: 63 74 5f 74 62 2c 0a 23 20 20 20 20 20 20 20 20 ct_tb,.#
0470: 20 20 20 20 22 6c 6f 63 61 6c 73 22 3a 20 6c 6f "locals": lo
0480: 63 61 6c 73 28 29 2c 0a 23 20 20 20 20 20 20 20 cals(),.#
0490: 20 7d 2c 20 64 65 66 61 75 6c 74 3d 6c 61 6d 62 }, default=lamb
04a0: 64 61 20 76 3a 20 72 65 70 72 28 76 29 29 29 0a da v: repr(v))).
04b0: 23 0a 23 20 4f 62 76 69 6f 75 73 6c 79 20 79 6f #.# Obviously yo
04c0: 75 20 6d 69 67 68 74 20 77 61 6e 74 20 74 6f 20 u might want to
04d0: 77 72 61 70 20 74 68 69 73 20 69 6e 20 73 6f 6d wrap this in som
04e0: 65 20 67 65 6e 65 72 61 6c 20 72 65 70 6f 72 74 e general report
04f0: 69 6e 67 20 63 61 6c 6c 2e 0a 23 20 41 6e 64 20 ing call..# And
0500: 63 65 72 74 61 69 6e 6c 79 20 63 75 73 74 6f 6d certainly custom
0510: 69 7a 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 ize the mapping
0520: 66 6f 72 20 61 63 74 75 61 6c 6c 79 20 75 73 65 for actually use
0530: 64 20 66 69 65 6c 64 73 2e 0a 0a 0a 23 2d 2d 20 d fields....#--
0540: 63 6f 6e 66 69 67 0a 0a 23 20 72 65 71 75 69 72 config..# requir
0550: 65 20 74 68 61 74 20 50 4f 53 54 20 70 61 79 6c e that POST payl
0560: 6f 61 64 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 oad contains at
0570: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 6f least one of tho
0580: 73 65 20 66 69 65 6c 64 73 20 28 74 6f 20 61 76 se fields (to av
0590: 65 72 74 20 61 72 62 69 74 72 61 72 79 20 73 70 ert arbitrary sp
05a0: 61 6d 62 6f 74 73 20 66 69 6c 69 6e 67 20 74 69 ambots filing ti
05b0: 63 6b 65 74 73 29 0a 24 72 65 71 75 69 72 65 64 ckets).$required
05c0: 5f 66 69 65 6c 64 73 20 3d 20 5b 0a 20 20 20 20 _fields = [.
05d0: 22 76 65 72 73 69 6f 6e 22 2c 0a 20 20 20 20 22 "version",. "
05e0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 22 65 78 63 error",. "exc
05f0: 65 70 74 69 6f 6e 22 2c 0a 5d 3b 0a 23 20 63 6f eption",.];.# co
0600: 6e 74 61 69 6e 65 64 20 66 69 65 6c 64 73 20 6f ntained fields o
0610: 6e 74 6f 20 74 69 63 6b 65 74 20 70 72 6f 70 65 nto ticket prope
0620: 72 74 69 65 73 0a 24 6d 61 70 5f 66 69 65 6c 64 rties.$map_field
0630: 73 20 3d 20 5b 0a 20 20 20 20 22 65 72 72 6f 72 s = [. "error
0640: 22 20 3d 3e 20 22 74 69 74 6c 65 22 2c 0a 20 20 " => "title",.
0650: 20 20 22 76 65 72 73 69 6f 6e 22 20 3d 3e 20 22 "version" => "
0660: 66 6f 75 6e 64 69 6e 22 2c 0a 20 20 20 20 22 6d foundin",. "m
0670: 6f 64 75 6c 65 22 20 3d 3e 20 22 73 75 62 73 79 odule" => "subsy
0680: 73 74 65 6d 22 2c 0a 5d 3b 0a 23 20 74 69 63 6b stem",.];.# tick
0690: 65 74 20 64 65 66 61 75 6c 74 73 0a 24 64 65 66 et defaults.$def
06a0: 61 75 6c 74 5f 66 69 65 6c 64 73 20 3d 20 5b 0a ault_fields = [.
06b0: 20 20 20 23 22 63 6f 6d 6d 65 6e 74 22 20 3d 3e #"comment" =>
06c0: 20 22 4a 53 4f 4e 22 2c 0a 20 20 20 23 22 66 6f "JSON",. #"fo
06d0: 75 6e 64 69 6e 22 20 3d 3e 20 22 30 2e 30 2e 31 undin" => "0.0.1
06e0: 22 2c 0a 20 20 20 23 22 69 63 6f 6d 6d 65 6e 74 ",. #"icomment
06f0: 22 20 3d 3e 20 22 22 2e 0a 20 20 20 23 22 6c 6f " => "".. #"lo
0700: 67 69 6e 22 20 3d 3e 20 22 65 78 74 72 6f 6f 74 gin" => "extroot
0710: 22 2c 0a 20 20 20 22 6d 69 6d 65 74 79 70 65 22 ",. "mimetype"
0720: 20 3d 3e 20 22 74 65 78 74 2f 6a 73 6f 6e 22 2c => "text/json",
0730: 0a 20 20 20 22 70 72 69 76 61 74 65 5f 63 6f 6e . "private_con
0740: 74 61 63 74 22 20 3d 3e 20 22 22 2c 0a 20 20 20 tact" => "",.
0750: 22 74 79 70 65 22 20 3d 3e 20 22 49 6e 63 69 64 "type" => "Incid
0760: 65 6e 74 22 2c 0a 20 20 20 22 73 74 61 74 75 73 ent",. "status
0770: 22 20 3d 3e 20 22 4f 70 65 6e 22 2c 0a 20 20 20 " => "Open",.
0780: 22 73 65 76 65 72 69 74 79 22 20 3d 3e 20 22 4d "severity" => "M
0790: 65 64 69 75 6d 22 2c 0a 20 20 20 22 70 72 69 6f edium",. "prio
07a0: 72 69 74 79 22 20 3d 3e 20 22 4d 65 64 69 75 6d rity" => "Medium
07b0: 22 2c 0a 20 20 20 23 22 72 65 73 6f 6c 75 74 69 ",. #"resoluti
07c0: 6f 6e 22 20 3d 3e 20 22 22 2c 0a 20 20 20 22 73 on" => "",. "s
07d0: 75 62 73 79 73 74 65 6d 22 20 3d 3e 20 22 63 6f ubsystem" => "co
07e0: 72 65 22 2c 0a 20 20 20 22 74 69 74 6c 65 22 20 re",. "title"
07f0: 3d 3e 20 22 43 72 61 73 68 72 65 70 6f 72 74 22 => "Crashreport"
0800: 2c 0a 20 20 20 22 75 73 65 72 6e 61 6d 65 22 20 ,. "username"
0810: 3d 3e 20 22 63 72 61 73 68 72 65 70 6f 72 74 22 => "crashreport"
0820: 2c 0a 5d 3b 0a 23 20 72 65 77 72 69 74 65 20 74 ,.];.# rewrite t
0830: 65 78 74 20 63 6f 6e 74 65 6e 74 73 20 69 6e 20 ext contents in
0840: 61 6e 79 20 66 69 65 6c 64 20 28 73 6f 6d 65 20 any field (some
0850: 70 72 69 76 61 63 79 20 66 69 6c 74 65 72 69 6e privacy filterin
0860: 67 29 0a 24 66 69 6c 74 65 72 5f 63 6f 6e 74 65 g).$filter_conte
0870: 6e 74 20 3d 20 5b 0a 20 20 20 20 22 7e 2f 68 6f nt = [. "~/ho
0880: 6d 65 2f 5b 5c 77 5c 2d 5c 2e 5d 2b 2f 7e 22 20 me/[\w\-\.]+/~"
0890: 3d 3e 20 22 2f 68 6f 6d 65 2f 75 73 65 72 2f 22 => "/home/user/"
08a0: 2c 20 23 20 61 76 6f 69 64 20 75 73 65 72 20 6e , # avoid user n
08b0: 61 6d 65 73 0a 20 20 20 20 22 7e 5b 5e 5c 5c 74 ames. "~[^\\t
08c0: 5c 5c 72 5c 5c 6e 5c 5c 78 32 30 2d 5c 5c 78 46 \\r\\n\\x20-\\xF
08d0: 46 5d 2f 7e 22 20 3d 3e 20 22 23 22 2c 20 20 20 F]/~" => "#",
08e0: 23 20 6e 6f 20 63 6f 6e 74 72 6f 6c 20 63 68 61 # no control cha
08f0: 72 73 0a 5d 3b 0a 0a 0a 23 2d 2d 20 69 6e 69 74 rs.];...#-- init
0900: 0a 69 66 20 28 24 5f 53 45 52 56 45 52 5b 22 43 .if ($_SERVER["C
0910: 4f 4e 54 45 4e 54 5f 4c 45 4e 47 54 48 22 5d 20 ONTENT_LENGTH"]
0920: 3e 3d 20 31 30 29 20 7b 0a 20 20 20 20 24 6a 73 >= 10) {. $js
0930: 6f 6e 20 3d 20 66 72 6f 6d 5f 69 6e 70 75 74 28 on = from_input(
0940: 29 3b 0a 20 20 20 20 69 66 20 28 21 61 72 72 61 );. if (!arra
0950: 79 5f 69 6e 74 65 72 73 65 63 74 28 61 72 72 61 y_intersect(arra
0960: 79 5f 6b 65 79 73 28 24 6a 73 6f 6e 29 2c 20 24 y_keys($json), $
0970: 72 65 71 75 69 72 65 64 5f 66 69 65 6c 64 73 29 required_fields)
0980: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 69 65 28 ) {. die(
0990: 6a 73 6f 6e 5f 65 6e 63 6f 64 65 28 5b 22 65 72 json_encode(["er
09a0: 72 6f 72 22 20 3d 3e 20 22 72 65 71 75 69 72 65 ror" => "require
09b0: 64 20 66 69 65 6c 64 73 20 6d 69 73 73 69 6e 67 d fields missing
09c0: 22 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 "]));. }.
09d0: 73 74 6f 72 65 28 24 6a 73 6f 6e 29 3b 0a 7d 0a store($json);.}.
09e0: 65 6c 73 65 20 7b 0a 20 20 20 20 68 65 61 64 65 else {. heade
09f0: 72 28 22 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a r("Content-Type:
0a00: 20 74 65 78 74 2f 78 2d 6d 61 72 6b 64 6f 77 6e text/x-markdown
0a10: 22 29 3b 0a 20 20 20 20 64 69 65 28 22 53 61 76 ");. die("Sav
0a20: 65 20 61 6e 79 20 73 74 61 63 6b 74 72 61 63 65 e any stacktrace
0a30: 73 2f 65 72 72 6f 72 73 2f 65 74 63 2e 20 61 73 s/errors/etc. as
0a40: 20 74 69 63 6b 65 74 73 2c 20 69 66 20 73 65 6e tickets, if sen
0a50: 74 20 61 73 20 4a 53 4f 4e 20 62 6c 6f 62 20 70 t as JSON blob p
0a60: 65 72 20 50 4f 53 54 2e 22 29 3b 0a 7d 0a 0a 0a er POST.");.}...
0a70: 23 20 61 73 73 75 6d 65 20 69 6e 70 75 74 20 69 # assume input i
0a80: 73 20 4a 53 4f 4e 0a 66 75 6e 63 74 69 6f 6e 20 s JSON.function
0a90: 66 72 6f 6d 5f 69 6e 70 75 74 28 29 20 7b 0a 20 from_input() {.
0aa0: 20 20 20 72 65 74 75 72 6e 20 6a 73 6f 6e 5f 64 return json_d
0ab0: 65 63 6f 64 65 28 66 69 6c 65 5f 67 65 74 5f 63 ecode(file_get_c
0ac0: 6f 6e 74 65 6e 74 73 28 22 70 68 70 3a 2f 2f 69 ontents("php://i
0ad0: 6e 70 75 74 22 29 2c 20 54 72 75 65 29 3b 0a 7d nput"), True);.}
0ae0: 0a 0a 23 20 73 74 6f 72 65 20 61 73 20 74 69 63 ..# store as tic
0af0: 6b 65 74 0a 66 75 6e 63 74 69 6f 6e 20 73 74 6f ket.function sto
0b00: 72 65 28 24 64 61 74 61 29 20 7b 0a 20 20 20 20 re($data) {.
0b10: 67 6c 6f 62 61 6c 20 24 6d 61 70 5f 66 69 65 6c global $map_fiel
0b20: 64 73 2c 20 24 64 65 66 61 75 6c 74 5f 66 69 65 ds, $default_fie
0b30: 6c 64 73 2c 20 24 66 69 6c 74 65 72 5f 63 6f 6e lds, $filter_con
0b40: 74 65 6e 74 3b 0a 0a 20 20 20 20 23 2d 2d 20 70 tent;.. #-- p
0b50: 72 65 70 61 72 65 20 66 69 65 6c 64 73 0a 20 20 repare fields.
0b60: 20 20 24 66 69 65 6c 64 73 20 3d 20 24 64 65 66 $fields = $def
0b70: 61 75 6c 74 5f 66 69 65 6c 64 73 3b 0a 20 20 20 ault_fields;.
0b80: 20 24 66 69 65 6c 64 73 5b 22 63 6f 6d 6d 65 6e $fields["commen
0b90: 74 22 5d 20 3d 20 6a 73 6f 6e 5f 65 6e 63 6f 64 t"] = json_encod
0ba0: 65 28 24 64 61 74 61 2c 20 4a 53 4f 4e 5f 50 52 e($data, JSON_PR
0bb0: 45 54 54 59 5f 50 52 49 4e 54 7c 4a 53 4f 4e 5f ETTY_PRINT|JSON_
0bc0: 55 4e 45 53 43 41 50 45 44 5f 53 4c 41 53 48 45 UNESCAPED_SLASHE
0bd0: 53 7c 4a 53 4f 4e 5f 55 4e 45 53 43 41 50 45 44 S|JSON_UNESCAPED
0be0: 5f 55 4e 49 43 4f 44 45 29 3b 0a 20 20 20 20 23 _UNICODE);. #
0bf0: 2d 2d 20 65 78 74 72 61 20 66 69 65 6c 64 73 0a -- extra fields.
0c00: 20 20 20 20 66 6f 72 65 61 63 68 20 28 24 6d 61 foreach ($ma
0c10: 70 5f 66 69 65 6c 64 73 20 61 73 20 24 66 72 6f p_fields as $fro
0c20: 6d 3d 3e 24 74 6f 29 20 7b 0a 20 20 20 20 20 20 m=>$to) {.
0c30: 20 20 69 66 20 28 69 73 73 65 74 28 24 64 61 74 if (isset($dat
0c40: 61 5b 24 66 72 6f 6d 5d 29 29 20 7b 0a 20 20 20 a[$from])) {.
0c50: 20 20 20 20 20 20 20 20 20 24 66 69 65 6c 64 73 $fields
0c60: 5b 24 74 6f 5d 20 3d 20 73 75 62 73 74 72 28 24 [$to] = substr($
0c70: 64 61 74 61 5b 24 66 72 6f 6d 5d 2c 20 30 2c 20 data[$from], 0,
0c80: 31 30 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 100);. }.
0c90: 20 20 20 20 7d 0a 0a 20 20 20 20 23 2d 2d 20 61 }.. #-- a
0ca0: 73 73 65 6d 62 6c 65 20 63 6d 64 0a 20 20 20 20 ssemble cmd.
0cb0: 24 63 6d 64 20 3d 20 22 66 6f 73 73 69 6c 20 2d $cmd = "fossil -
0cc0: 2d 6e 6f 63 67 69 20 2d 52 20 7b 24 71 28 24 5f -nocgi -R {$q($_
0cd0: 53 45 52 56 45 52 5b 27 46 4f 53 53 49 4c 5f 52 SERVER['FOSSIL_R
0ce0: 45 50 4f 53 49 54 4f 52 59 27 5d 29 7d 20 74 69 EPOSITORY'])} ti
0cf0: 63 6b 65 74 20 61 64 64 22 3b 0a 20 20 20 20 24 cket add";. $
0d00: 71 20 3d 20 27 65 73 63 61 70 65 73 68 65 6c 6c q = 'escapeshell
0d10: 61 72 67 27 3b 0a 20 20 20 20 66 6f 72 65 61 63 arg';. foreac
0d20: 68 20 28 24 66 69 65 6c 64 73 20 61 73 20 24 6e h ($fields as $n
0d30: 61 6d 65 3d 3e 24 76 61 6c 75 65 29 20 7b 0a 20 ame=>$value) {.
0d40: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 28 foreach (
0d50: 24 66 69 6c 74 65 72 5f 63 6f 6e 74 65 6e 74 20 $filter_content
0d60: 61 73 20 24 72 78 3d 3e 24 74 6f 29 20 7b 0a 20 as $rx=>$to) {.
0d70: 20 20 20 20 20 20 20 20 20 20 20 24 76 61 6c 75 $valu
0d80: 65 20 3d 20 70 72 65 67 5f 72 65 70 6c 61 63 65 e = preg_replace
0d90: 28 24 72 78 2c 20 24 74 6f 2c 20 24 76 61 6c 75 ($rx, $to, $valu
0da0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 e);. }.
0db0: 20 20 20 20 20 20 24 63 6d 64 20 2e 3d 20 22 20 $cmd .= "
0dc0: 7b 24 71 28 24 6e 61 6d 65 29 7d 20 7b 24 71 28 {$q($name)} {$q(
0dd0: 24 76 61 6c 75 65 29 7d 22 3b 0a 20 20 20 20 7d $value)}";. }
0de0: 0a 0a 20 20 20 20 23 2d 2d 20 72 75 6e 0a 20 20 .. #-- run.
0df0: 20 20 65 78 65 63 28 24 63 6d 64 2c 20 24 73 74 exec($cmd, $st
0e00: 64 6f 75 74 2c 20 24 65 72 72 6e 6f 29 3b 0a 0a dout, $errno);..
0e10: 20 20 20 20 23 2d 2d 20 4a 53 4f 4e 20 72 65 73 #-- JSON res
0e20: 70 6f 6e 73 65 0a 20 20 20 20 69 66 20 28 21 24 ponse. if (!$
0e30: 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 20 errno) {.
0e40: 20 64 69 65 28 6a 73 6f 6e 5f 65 6e 63 6f 64 65 die(json_encode
0e50: 28 5b 22 65 72 72 6f 72 22 20 3d 3e 20 24 73 74 (["error" => $st
0e60: 64 6f 75 74 2c 20 22 65 72 72 6e 6f 22 20 3d 3e dout, "errno" =>
0e70: 20 24 65 72 72 6e 6f 5d 29 29 3b 0a 20 20 20 20 $errno]));.
0e80: 7d 0a 20 20 20 20 65 6c 73 65 20 7b 0a 20 20 20 }. else {.
0e90: 20 20 20 20 20 64 69 65 28 6a 73 6f 6e 5f 65 6e die(json_en
0ea0: 63 6f 64 65 28 5b 22 73 75 63 63 65 73 73 22 20 code(["success"
0eb0: 3d 3e 20 24 73 74 64 6f 75 74 2c 20 22 65 72 72 => $stdout, "err
0ec0: 6e 6f 22 20 3d 3e 20 24 65 72 72 6e 6f 5d 29 29 no" => $errno]))
0ed0: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a ;. }.}..