15 type GenericJsonRequest struct {
16 Op *string `json:"op"`
17 Score *string `json:"score"`
18 Players []string `json:"players"`
19 Scope *JobScope `json:"scope"`
20 Params map[string]string `json:"params"`
21 Id *uint64 `json:"id"`
24 type JsonPlayerStatus struct {
25 Status ResponseState `json:"status"`
26 Response map[string]string `json:"response"`
29 type JsonStatusResponse struct {
30 Status JobState `json:"status"`
31 Players map[string]*JsonPlayerStatus `json:"players"`
34 func NewJsonStatusResponse() (jsr *JsonStatusResponse) {
35 jsr = new(JsonStatusResponse)
36 jsr.Players = make(map[string]*JsonPlayerStatus)
41 func NewJsonPlayerStatus() (jps *JsonPlayerStatus) {
42 jps = new(JsonPlayerStatus)
43 jps.Response = make(map[string]string)
48 func handleAudienceRequest(c net.Conn) {
54 dec := json.NewDecoder(r)
55 enc := json.NewEncoder(w)
57 outobj := new(GenericJsonRequest)
58 err := dec.Decode(outobj)
60 o.Warn("Error decoding JSON talking to audience: %s", err)
65 o.Warn("Malformed JSON message talking to audience. Missing Op")
71 o.Warn("Malformed Status message talking to audience. Missing Job ID")
74 job := JobGet(*outobj.Id)
75 jresp := new([2]interface{})
78 iresp := NewJsonStatusResponse()
79 iresp.Status = job.State
80 resnames := JobGetResultNames(*outobj.Id)
81 for i := range resnames {
82 tr := JobGetResult(*outobj.Id, resnames[i])
84 presp := NewJsonPlayerStatus()
85 presp.Status = tr.State
86 for k,v:=range(tr.Response) {
89 iresp.Players[resnames[i]] = presp
101 if nil == outobj.Score {
102 o.Warn("Malformed Queue message talking to audience. Missing Score")
103 sendQueueFailureResponse("Missing Score", enc)
106 if nil == outobj.Scope {
107 o.Warn("Malformed Queue message talking to audience. Missing Scope")
108 sendQueueFailureResponse("Missing Scope", enc)
111 if nil == outobj.Players || len(outobj.Players) < 1 {
112 o.Warn("Malformed Queue message talking to audience. Missing Players")
113 sendQueueFailureResponse("Missing Players", enc)
116 for _, player := range outobj.Players {
117 if !HostAuthorised(player) {
118 o.Warn("Malformed Queue message - unknown player %s specified.", player)
119 sendQueueFailureResponse("Invalid Player", enc)
124 job.Score = *outobj.Score
125 job.Scope = *outobj.Scope
126 job.Players = outobj.Players
127 job.Params = outobj.Params
130 sendQueueSuccessResponse(job, enc)
132 o.Warn("Unknown operation talking to audience: \"%s\"", *(outobj.Op))
139 func sendQueueSuccessResponse(job *JobRequest, enc *json.Encoder) {
140 resp := make([]interface{},2)
141 resperr := new(string)
145 // this probably looks odd, but all numbers cross through float64 when being json encoded. d'oh!
147 *jobid = uint64(job.Id)
150 err := enc.Encode(resp)
152 o.Warn("Couldn't encode response to audience: %s", err)
156 func sendQueueFailureResponse(reason string, enc *json.Encoder) {
157 resp := make([]interface{},2)
158 resperr := new(string)
164 err := enc.Encode(resp)
166 o.Warn("Couldn't encode response to audience: %s", err)
170 func AudienceListener(l net.Listener) {
174 o.Warn("Accept() failed on Audience Listenter.")
177 go handleAudienceRequest(c)
181 func UnixAudienceListener(sockaddr string) {
182 fi, err := os.Stat(sockaddr)
185 o.Warn("Removing stale socket at %s", sockaddr)
188 o.Fail("%s exists and is not a socket", sockaddr)
191 laddr, err := net.ResolveUnixAddr("unix", sockaddr)
192 o.MightFail(err, "Couldn't resolve audience socket address")
193 l, err := net.ListenUnix("unix", laddr)
194 o.MightFail(err, "Couldn't start audience unixsock listener")
195 // Fudge the permissions on the unixsock!
196 fi, err = os.Stat(sockaddr)
198 os.Chmod(sockaddr, fi.Mode | 0777)
200 o.Warn("Couldn't fudge permission on audience socket: %s", err)
203 // make sure we clean up the unix socket when we die.
205 defer os.Remove(sockaddr)
209 func StartAudienceSock() {
210 audienceSockPath := strings.TrimSpace(GetStringOpt("audience socket path"))
211 go UnixAudienceListener(audienceSockPath)