Issues (1963)

html/inc/result.inc (7 issues)

1
<?php
2
// This file is part of BOINC.
3
// http://boinc.berkeley.edu
4
// Copyright (C) 2008 University of California
5
//
6
// BOINC is free software; you can redistribute it and/or modify it
7
// under the terms of the GNU Lesser General Public License
8
// as published by the Free Software Foundation,
9
// either version 3 of the License, or (at your option) any later version.
10
//
11
// BOINC is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14
// See the GNU Lesser General Public License for more details.
15
//
16
// You should have received a copy of the GNU Lesser General Public License
17
// along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
18
19
require_once("../inc/translation.inc");
20
require_once("../inc/dir_hier.inc");
21
require_once("../inc/common_defs.inc");
22
23
// used by app_version_string(), see below
24
//
25
global $apps;
26
global $app_versions;
27
global $platforms;
28
$apps = array();
29
$app_versions = array();
30
$platforms = array();
31
32
function get_app($id) {
33
    global $apps;
34
    if (!array_key_exists($id, $apps)) {
35
        $apps[$id] = BoincApp::lookup_id($id);
36
    }
37
    return $apps[$id];
38
}
39
40
function get_app_version($id) {
41
    global $app_versions;
42
    if (!array_key_exists($id, $app_versions)) {
43
        $app_versions[$id] = BoincAppVersion::lookup_id($id);
44
    }
45
    return $app_versions[$id];
46
}
47
48
function get_platform($id) {
49
    global $platforms;
50
    if (!array_key_exists($id, $platforms)) {
51
        $platforms[$id] = BoincPlatform::lookup_id($id);
52
    }
53
    return $platforms[$id];
54
}
55
56
function anon_platform_string($result, $rsc_name=null) {
57
    $app = get_app($result->appid);
58
    $n = $app->user_friendly_name."<br>".  tra("Anonymous platform");
59
    if ($rsc_name) {
60
        $n .= " ($rsc_name)";
61
    }
62
    return $n;
63
}
64
65
function app_version_string($result) {
66
    global $apps, $app_versions;
67
68
    $id = $result->app_version_id;
69
    switch ($id) {
70
    case 0: return "---";
71
    case ANON_PLATFORM_UNKNOWN:
72
        return anon_platform_string($result);
73
    case ANON_PLATFORM_CPU:
74
        return anon_platform_string($result, tra("CPU"));
75
    case ANON_PLATFORM_NVIDIA:
76
        return anon_platform_string($result, tra("NVIDIA GPU"));
77
    case ANON_PLATFORM_ATI:
78
        return anon_platform_string($result, tra("AMD GPU"));
79
    case ANON_PLATFORM_INTEL_GPU:
80
        return anon_platform_string($result, tra("Intel GPU"));
81
    case ANON_PLATFORM_APPLE_GPU:
82
        return anon_platform_string($result, tra("Apple GPU"));
83
    }
84
    $av = get_app_version($id);
85
    if (!$av) {
86
        return "missing app version $id";
87
    }
88
    $app = get_app($av->appid);
89
    $platform = get_platform($av->platformid);
90
    $n = $app->user_friendly_name;
91
    $v = sprintf("%d.%02d", $av->version_num/100, $av->version_num%100);
92
    if ($av->plan_class) {
93
        $c = "($av->plan_class)";
94
    } else {
95
        $c = "";
96
    }
97
    return "$n v$v $c<br>$platform->name";
98
}
99
100
function result_granted_credit_string($result, $string_to_show) {
101
    if ($result->server_state == RESULT_SERVER_STATE_IN_PROGRESS && $result->granted_credit > 0) {
102
        return $string_to_show;
103
    }
104
    if ($result->server_state <> RESULT_SERVER_STATE_OVER) return "---";
105
    switch($result->outcome) {
106
    case RESULT_OUTCOME_SUCCESS:
107
        switch ($result->validate_state) {
108
        case VALIDATE_STATE_INIT:
109
        case VALIDATE_STATE_INCONCLUSIVE:
110
            return tra("pending");
111
        }
112
        return $string_to_show;
113
    default:
0 ignored issues
show
DEFAULT keyword must be indented 4 spaces from SWITCH keyword
Loading history...
114
        if ($result->granted_credit > 0) {
115
            return $string_to_show;
116
        }
117
        return "---";
118
    }
119
}
120
121
// various result states that users can filter on
122
123
define("STATE_ALL", 0);
124
define("STATE_IN_PROGRESS", 1);
125
define("STATE_PENDING", 2);
126
define("STATE_INCONCLUSIVE", 3);
127
define("STATE_VALID", 4);
128
define("STATE_INVALID", 5);
129
define("STATE_ERROR", 6);
130
define("NSTATES", 7);
131
132
$state_name = array(
133
    tra("All"),
134
    tra("In progress"),
135
    tra("Validation pending"),
136
    tra("Validation inconclusive"),
137
    tra("Valid"),
138
    tra("Invalid"),
139
    tra("Error"),
140
);
141
142
$state_clause = array(
143
    "",
144
    sprintf(
145
        ' and server_state=%d ',
146
        RESULT_SERVER_STATE_IN_PROGRESS
147
    ),
148
    sprintf(
149
        ' and server_state=%d and outcome=%d and validate_state=%d ',
150
        RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_SUCCESS, VALIDATE_STATE_INIT
151
    ),
152
    sprintf(
153
        ' and server_state=%d and outcome=%d and validate_state=%d ',
154
        RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_SUCCESS,
155
        VALIDATE_STATE_INCONCLUSIVE
156
    ),
157
    sprintf(
158
        ' and server_state=%d and outcome=%d and validate_state=%d ',
159
        RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_SUCCESS, VALIDATE_STATE_VALID
160
    ),
161
    sprintf(
162
        ' and server_state=%d and (outcome=%d or (outcome=%d and (validate_state=%d or validate_state=%d or validate_state=%d))) ',
163
        RESULT_SERVER_STATE_OVER,
164
        RESULT_OUTCOME_VALIDATE_ERROR, RESULT_OUTCOME_SUCCESS,
165
        VALIDATE_STATE_INVALID, VALIDATE_STATE_NO_CHECK,
166
        VALIDATE_STATE_TOO_LATE
167
    ),
168
    sprintf(
169
        ' and server_state=%d and (outcome=%d or outcome=%d or outcome=%d) ',
170
        RESULT_SERVER_STATE_OVER, RESULT_OUTCOME_CLIENT_ERROR,
171
        RESULT_OUTCOME_NO_REPLY, RESULT_OUTCOME_CLIENT_DETACHED
172
    )
0 ignored issues
show
There should be a trailing comma after the last value of an array declaration.
Loading history...
173
);
174
175
function state_num($result) {
176
    if ($result->server_state == RESULT_SERVER_STATE_IN_PROGRESS) return 1;
177
    if ($result->server_state == RESULT_SERVER_STATE_OVER && $result->outcome == RESULT_OUTCOME_SUCCESS) {
178
        if ($result->validate_state == VALIDATE_STATE_INIT) {
179
            return STATE_PENDING;
180
        }
181
        if ($result->validate_state == VALIDATE_STATE_INCONCLUSIVE) {
182
            return STATE_INCONCLUSIVE;
183
        }
184
    }
185
    if ($result->server_state == RESULT_SERVER_STATE_OVER
186
        && $result->outcome == RESULT_OUTCOME_SUCCESS
187
        && $result->validate_state == VALIDATE_STATE_VALID
188
    ) {
189
        return STATE_VALID;
190
    }
191
    if ($result->server_state == RESULT_SERVER_STATE_OVER
192
        && ($result->outcome == RESULT_OUTCOME_VALIDATE_ERROR
193
            || ($result->outcome == RESULT_OUTCOME_SUCCESS
194
                && ($result->validate_state == VALIDATE_STATE_INVALID
195
                    || $result->validate_state == VALIDATE_STATE_NO_CHECK
196
                    || $result->validate_state == VALIDATE_STATE_TOO_LATE
197
                )
198
            )
199
        )
200
    ) {
201
        return STATE_INVALID;
202
    }
203
    if ($result->server_state == RESULT_SERVER_STATE_OVER
204
        && ($result->outcome == RESULT_OUTCOME_CLIENT_ERROR
205
            || $result->outcome == RESULT_OUTCOME_NO_REPLY
206
            || $result->outcome == RESULT_OUTCOME_CLIENT_DETACHED
207
        )
208
    ) {
209
        return STATE_ERROR;
210
    }
211
    return 0;
212
}
213
214
function state_string($result) {
215
    switch ($result->server_state) {
216
    case RESULT_SERVER_STATE_INACTIVE: return tra("Inactive");
217
    case RESULT_SERVER_STATE_UNSENT: return tra("Unsent");
218
    case RESULT_SERVER_STATE_IN_PROGRESS: return tra("In progress");
219
    case RESULT_SERVER_STATE_OVER:
220
        switch ($result->outcome) {
221
        case RESULT_OUTCOME_SUCCESS:
222
            switch ($result->validate_state) {
223
            case VALIDATE_STATE_INIT: return tra("Completed, waiting for validation");
224
            case VALIDATE_STATE_VALID: return tra("Completed and validated");
225
            case VALIDATE_STATE_INVALID: return tra("Completed, marked as invalid");
226
            case VALIDATE_STATE_NO_CHECK: return tra("Completed, can't validate");
227
            case VALIDATE_STATE_INCONCLUSIVE: return tra("Completed, validation inconclusive");
228
            case VALIDATE_STATE_TOO_LATE: return tra("Completed, too late to validate");
229
            }
230
            return tra("Completed");
231
        case RESULT_OUTCOME_COULDNT_SEND: return tra("Couldn't send");
232
        case RESULT_OUTCOME_CLIENT_ERROR:
233
            if ($result->exit_status == -221
234
                || $result->exit_status == 202
235
            ) {
236
                return tra("Cancelled by server");
237
            }
238
            if ($result->exit_status == -233
239
                || $result->exit_status == 200
240
            ) {
241
                return tra("Not started by deadline - canceled");
242
            }
243
            switch($result->client_state) {
244
            case RESULT_FILES_DOWNLOADING: return tra("Error while downloading");
245
            case RESULT_FILES_DOWNLOADED:
246
            case RESULT_COMPUTE_ERROR: return tra("Error while computing");
247
            case RESULT_FILES_UPLOADING: return tra("Error while uploading");
248
            case RESULT_ABORTED: return tra("Aborted");
249
            case RESULT_UPLOAD_FAILED: return tra("Upload failed");
250
            }
251
            return tra("Error");
252
        case RESULT_OUTCOME_NO_REPLY: return tra("Timed out - no response");
253
        case RESULT_OUTCOME_DIDNT_NEED: return tra("Didn't need");
254
        case RESULT_OUTCOME_VALIDATE_ERROR: return tra("Validate error");
255
        case RESULT_OUTCOME_CLIENT_DETACHED: return tra("Abandoned");
256
        }
257
    }
258
    return tra("Unknown");
259
}
260
261
function result_server_state_string($result) {
262
    switch($result->server_state) {
263
    case RESULT_SERVER_STATE_INACTIVE: return tra("Inactive");
264
    case RESULT_SERVER_STATE_UNSENT: return tra("Unsent");
265
    case RESULT_SERVER_STATE_IN_PROGRESS: return tra("In progress");
266
    case RESULT_SERVER_STATE_OVER: return tra("Over");
267
    }
268
    return tra("Unknown");
269
}
270
271
function result_outcome_string($result) {
272
    switch($result->outcome) {
273
    case RESULT_OUTCOME_INIT: return "---";
274
    case RESULT_OUTCOME_SUCCESS: return tra("Success");
275
    case RESULT_OUTCOME_COULDNT_SEND: return tra("Couldn't send");
276
    case RESULT_OUTCOME_CLIENT_ERROR:
277
        if ($result->exit_status <> -221) {
278
            return tra("Computation error");
279
        }
280
        return tra("Redundant result");
281
    case RESULT_OUTCOME_NO_REPLY: return tra("No reply");
282
    case RESULT_OUTCOME_DIDNT_NEED: return tra("Didn't need");
283
    case RESULT_OUTCOME_VALIDATE_ERROR: return tra("Validate error");
284
    case RESULT_OUTCOME_CLIENT_DETACHED: return tra("Abandoned");
285
    }
286
    return tra("Unknown");
287
}
288
289
function result_client_state_string($result) {
290
    switch($result->client_state) {
291
    case RESULT_NEW: return tra("New");
292
    case RESULT_FILES_DOWNLOADING: return tra("Downloading");
293
    case RESULT_FILES_DOWNLOADED: return tra("Processing");
294
    case RESULT_COMPUTE_ERROR: return tra("Compute error");
295
    case RESULT_FILES_UPLOADING: return tra("Uploading");
296
    case RESULT_FILES_UPLOADED: return tra("Done");
297
    case RESULT_ABORTED:
298
        if ($result->exit_status == -221 || $result->exit_status == 202) {
299
            return tra("Cancelled by server");
300
        }
301
        return tra("Aborted by user");
302
    case RESULT_UPLOAD_FAILED: return tra("Upload failed");
303
    }
304
    return tra("Unknown");
305
}
306
307
function validate_state_str($result) {
308
    switch($result->validate_state) {
309
    case VALIDATE_STATE_INIT: return tra("Initial");
310
    case VALIDATE_STATE_VALID: return tra("Valid");
311
    case VALIDATE_STATE_INVALID:
312
        if ($result->exit_status <> -221) {
313
            return tra("Invalid");
314
        }
315
        return tra("Not necessary");
316
    case VALIDATE_STATE_NO_CHECK: return tra("Workunit error - check skipped");
317
    case VALIDATE_STATE_INCONCLUSIVE: return tra("Checked, but no consensus yet");
318
    case VALIDATE_STATE_TOO_LATE: return tra("Task was reported too late to validate");
319
    }
320
    return tra("Unknown");
321
}
322
323
function assimilate_state_str($s) {
324
    switch($s) {
325
    case ASSIMILATE_INIT: return "Initial";
326
    case ASSIMILATE_READY: return "Ready to assimilate";
327
    case ASSIMILATE_DONE: return "Assimilated";
328
    }
329
    return "Unknown";
330
}
331
332
function file_delete_state_str($s) {
333
    switch($s) {
334
    case FILE_DELETE_INIT: return "Initial";
335
    case FILE_DELETE_READY: return "Ready to delete";
336
    case FILE_DELETE_DONE: return "Deleted";
337
    case FILE_DELETE_ERROR: return "Delete Error";
338
    }
339
    return "Unknown";
340
}
341
342
// convert WU error bitmask to str.
343
// If $color, add HTML red color
344
//
345
function wu_error_mask_str($s, $color=false) {
346
    $x = "";
347
    if ($s & WU_ERROR_COULDNT_SEND_RESULT) {
348
        $x = $x." ".tra("Couldn't send result");
349
        $s -= WU_ERROR_COULDNT_SEND_RESULT;
350
    }
351
    if ($s & WU_ERROR_TOO_MANY_ERROR_RESULTS) {
352
        $x = $x." ".tra("Too many errors (may have bug)");
353
        $s -= WU_ERROR_TOO_MANY_ERROR_RESULTS;
354
    }
355
    if ($s & WU_ERROR_TOO_MANY_SUCCESS_RESULTS) {
356
        $x = $x." ".tra("Too many results (may be nondeterministic)");
357
        $s -= WU_ERROR_TOO_MANY_SUCCESS_RESULTS;
358
    }
359
    if ($s & WU_ERROR_TOO_MANY_TOTAL_RESULTS) {
360
        $x = $x." ".tra("Too many total results");
361
        $s -= WU_ERROR_TOO_MANY_TOTAL_RESULTS;
362
    }
363
    if ($s & WU_ERROR_CANCELLED) {
364
        $x = $x." ".tra("WU cancelled");
365
        $s -= WU_ERROR_CANCELLED;
366
    }
367
    if ($s & WU_ERROR_NO_CANONICAL_RESULT) {
368
        $x = $x." ".tra("Canonical result is missing");
369
        $s -= WU_ERROR_NO_CANONICAL_RESULT;
370
    }
371
    if ($s) {
372
        $x = $x." ".tra("Unrecognized Error: %1", $s);
373
    }
374
    if ($color) {
375
        return sprintf('<font color="#ff3333">%s</font>', $x);
376
    }
377
    return $x;
378
}
379
380
function result_page_url($info) {
381
    $c = $info->clause;
382
    $o = $info->offset;
383
    $sn = $info->show_names;
384
    $st = $info->state;
385
    $appid = $info->appid;
386
    return "results.php?$c&amp;offset=$o&amp;show_names=$sn&amp;state=$st&amp;appid=$appid";
387
}
388
389
function result_table_start($show_wu_link, $show_host_link, $info) {
390
    start_table('table-striped');
391
    $x = array();
392
    $a = array(null);
393
394
    if ($info) {
395
        if ($info->show_names) {
396
            $i2 = clone $info;
397
            $i2->show_names = 0;
398
            $url = result_page_url($i2);
399
            $x[] = tra("Task name")."<br><small>".tra("click for details")."<br><a href=$url>".tra("Show IDs")."</a></small>";
400
        } else {
401
            $i2 = clone $info;
402
            $i2->show_names = 1;
403
            $url = result_page_url($i2);
404
            $x[] = "Task<br><small>".tra("click for details")."<br><a href=$url>".tra("Show names")."</a></small>";
405
        }
406
    } else {
407
        $x[] = tra("Task")."<br><small>".tra("click for details")."</small>";
408
    }
409
    if ($show_wu_link) {
410
        $x[] = tra("Work unit")."<br><small>".tra("click for details")."</small>";
411
        $a[] = null;
412
        if (function_exists('project_result_info_heading')) {
413
            $y = project_result_info_heading();
414
            if ($y) {
415
                $x[] = $y;
416
                $a[] = null;
417
            }
418
        }
419
    }
420
    if ($show_host_link) {
421
        $x[] = tra("Computer");
422
        $a[] = null;
423
    }
424
    $x[] = tra("Sent");
425
    $x[] = tra("Time reported<br />or deadline")."
426
        <br><small><a href=\"explain_state.php?field=result_time\">".tra("explain")."</a></small>";
427
    $x[] = tra("Status");
428
    $a[] = null;
429
    $a[] = null;
430
    $a[] = null;
431
    $x[] = tra("Run time<br />(sec)");
432
    $x[] = tra("CPU time<br />(sec)");
433
    $x[] = tra("Credit");
434
    $a[] = ALIGN_RIGHT;
435
    $a[] = ALIGN_RIGHT;
436
    $a[] = ALIGN_RIGHT;
437
    $x[] = tra("Application");
438
    $a[] = null;
439
    row_heading_array($x, $a);
440
}
441
442
// was result invalid or timed out?
443
//
444
function bad_result($result) {
445
    if ($result->validate_state == 2) return true;
446
    if (!$result->received_time && ($result->report_deadline < time())) return true;
447
    return false;
448
}
449
450
function show_result_row($result, $show_wu_link, $show_host_link, $show_name) {
451
    $s = time_str($result->sent_time);
452
    // if result has been reported, show the received time,
453
    // else show the reporting deadline in green if in the future
454
    // and in red if in the past.
455
    //
456
    if ($result->received_time) {
457
        $r = time_str($result->received_time);
458
    } else if ($result->report_deadline) {
459
        if ($result->report_deadline>time()) {
460
            $r = "<font color='#33cc33'>" . time_str($result->report_deadline) . "</font>";
461
        } else {
462
            $r = "<font color='#ff3333'>" . time_str($result->report_deadline) . "</font>";
463
        }
464
    } else {
465
        $r = "---";
466
    }
467
    $ss = state_string($result);
468
    $result_granted_credit = format_credit($result->granted_credit);
469
    $result_granted_credit = result_granted_credit_string($result, $result_granted_credit);
470
    echo "<tr>";
471
    if ($show_name) {
472
        $x = $result->name;
473
    } else {
474
        $x = $result->id;
475
    }
476
    echo "<td><a href=\"result.php?resultid=$result->id\">$x</a></td>\n";
477
    if ($show_wu_link) {
478
        echo "<td><a href=\"workunit.php?wuid=$result->workunitid\">$result->workunitid</a></td>\n";
479
        if (function_exists('project_result_info_link')) {
480
            $x = project_result_info_link($result);
481
            if ($x) {
482
                echo "<td>$x</td>\n";
483
            }
484
        }
485
    }
486
    if ($show_host_link) {
487
        echo "<td>", host_link($result->hostid), "</td>\n";
488
    }
489
    if ($result->server_state <> 5) {
490
        $cpu_time = "---";
491
        $elapsed_time = "---";
492
    } else {
493
        $cpu_time = number_format($result->cpu_time, 2);
494
        $elapsed_time = number_format($result->elapsed_time, 2);
495
    }
496
    $v = app_version_string($result);
497
    echo "
498
        <td>$s</td>
499
        <td>$r</td>
500
        <td>$ss</td>
501
        <td align=right>$elapsed_time</td>
502
        <td align=right>$cpu_time</td>
503
        <td align=right>$result_granted_credit</td>
504
        <td>$v</td>
505
        </tr>
506
    ";
507
}
508
509
function version_string($version_num) {
510
    if (!$version_num) {
511
        return '---';
512
    } else {
513
        return sprintf("%.2f", $version_num/100);
514
    }
515
}
516
517
// transform a 4byte integer to an 8 character hex representation
518
//
519
// @return String The hex representation (uppercased) starting with 0x. Length is always 10 characters!
520
// @param Integer $dec A signed integer
521
//
522
function int2hex($dec) {
523
    return "0x".strtoupper(substr(sprintf("%08x",$dec), -8));
524
}
525
526
// Decode a windows error number into semi-human-readable,
527
// taken from ntstatus.h for selected codes
528
// They need to be uppercase after 0x!
529
//
530
// @return String A human readable error message
531
// @param Integer $x An error number
532
//
533
function windows_error_code_str($x){
534
    $h=int2hex($x);
535
    switch($h){
536
    case "0xC0000005": return "STATUS_ACCESS_VIOLATION";
537
    case "0xC000001D": return "STATUS_ILLEGAL_INSTRUCTION";
538
    case "0xC0000094": return "STATUS_INTEGER_DIVIDE_BY_ZERO";
539
    case "0xC00000FD": return "STATUS_STACK_OVERFLOW";
540
    case "0xC0000135": return "STATUS_DLL_NOT_FOUND";
541
    case "0xC0000139": return "STATUS_ENTRYPOINT_NOT_FOUND";
542
    case "0xC0000142": return "STATUS_DLL_INIT_FAILED";
543
    case "0xC000026B": return "STATUS_DLL_INIT_FAILED_LOGOFF";
544
    case "0xC0000409": return "STATUS_STACK_BUFFER_OVERRUN";
545
    //case "": return "";
546
    default: return "Unknown error code";
0 ignored issues
show
DEFAULT keyword must be indented 4 spaces from SWITCH keyword
Loading history...
Blank lines are not allowed after DEFAULT statements
Loading history...
547
    }
548
}
549
550
// Decode ErrorNumber into semi-human-readable,
551
// taken from lib/error_numbers.h keep this up to date
552
//
553
// @return String A human readable error message
554
// @param Integer $x An error number
555
//
556
function error_code_str($x){
557
    // severe Windows error numbers are always large negative integers
558
    if ($x<-400) return windows_error_code_str($x);
559
    switch($x){
560
    case 0: return "";
561
    case 192: return "EXIT_STATEFILE_WRITE";
562
    case 193: return "EXIT_SIGNAL";
563
    case 194: return "EXIT_ABORTED_BY_CLIENT";
564
    case 195: return "EXIT_CHILD_FAILED";
565
    case 196: return "EXIT_DISK_LIMIT_EXCEEDED";
566
    case 197: return "EXIT_TIME_LIMIT_EXCEEDED";
567
    case 198: return "EXIT_MEM_LIMIT_EXCEEDED";
568
    case 199: return "EXIT_CLIENT_EXITING";
569
    case 200: return "EXIT_UNSTARTED_LATE";
570
    case 201: return "EXIT_MISSING_COPROC";
571
    case 202: return "EXIT_ABORTED_BY_PROJECT";
572
    case 203: return "EXIT_ABORTED_VIA_GUI";
573
    case 204: return "EXIT_UNKNOWN";
574
    case 205: return "EXIT_OUT_OF_MEMORY";
575
    case 206: return "EXIT_INIT_FAILURE";
576
    case 207: return "EXIT_NO_SUB_TASKS";
577
    case 208: return "EXIT_SUB_TASK_FAILURE";
578
    case -100: return "ERR_SELECT";
579
    case -102: return "ERR_READ";
580
    case -103: return "ERR_WRITE";
581
    case -104: return "ERR_FREAD";
582
    case -105: return "ERR_FWRITE";
583
    case -106: return "ERR_IO";
584
    case -107: return "ERR_CONNECT";
585
    case -108: return "ERR_FOPEN";
586
    case -109: return "ERR_RENAME";
587
    case -110: return "ERR_UNLINK";
588
    case -111: return "ERR_OPENDIR";
589
    case -112: return "ERR_XML_PARSE";
590
    case -113: return "ERR_GETHOSTBYNAME";
591
    case -114: return "ERR_GIVEUP_DOWNLOAD";
592
    case -115: return "ERR_GIVEUP_UPLOAD";
593
    case -116: return "ERR_NULL";
594
    case -117: return "ERR_NEG";
595
    case -118: return "ERR_BUFFER_OVERFLOW";
596
    case -119: return "ERR_MD5_FAILED";
597
    case -120: return "ERR_RSA_FAILED";
598
    case -121: return "ERR_OPEN";
599
    case -122: return "ERR_DUP2";
600
    case -123: return "ERR_NO_SIGNATURE";
601
    case -124: return "ERR_THREAD";
602
    case -125: return "ERR_SIGNAL_CATCH";
603
    case -126: return "ERR_QUIT_REQUEST";
604
    case -127: return "ERR_UPLOAD_TRANSIENT";
605
    case -128: return "ERR_UPLOAD_PERMANENT";
606
    case -129: return "ERR_IDLE_PERIOD";
607
    case -130: return "ERR_ALREADY_ATTACHED";
608
    case -131: return "ERR_FILE_TOO_BIG";
609
    case -132: return "ERR_GETRUSAGE";
610
    case -133: return "ERR_BENCHMARK_FAILED";
611
    case -134: return "ERR_BAD_HEX_FORMAT";
612
    case -135: return "ERR_USER_REJECTED";
613
    case -136: return "ERR_DB_NOT_FOUND";
614
    case -137: return "ERR_DB_NOT_UNIQUE";
615
    case -138: return "ERR_DB_CANT_CONNECT";
616
    case -139: return "ERR_GETS";
617
    case -140: return "ERR_SCANF";
618
    case -141: return "ERR_STRCHR";
619
    case -142: return "ERR_STRSTR";
620
    case -143: return "ERR_READDIR";
621
    case -144: return "ERR_SHMGET";
622
    case -145: return "ERR_SHMCTL";
623
    case -146: return "ERR_SHMAT";
624
    case -147: return "ERR_FORK";
625
    case -148: return "ERR_EXEC";
626
    case -149: return "ERR_NOT_EXITED";
627
    case -150: return "ERR_NOT_IMPLEMENTED";
628
    case -151: return "ERR_GETHOSTNAME";
629
    case -152: return "ERR_NETOPEN";
630
    case -153: return "ERR_SOCKET";
631
    case -154: return "ERR_FCNTL";
632
    case -155: return "ERR_AUTHENTICATOR";
633
    case -156: return "ERR_SCHED_SHMEM";
634
    case -157: return "ERR_ASYNCSELECT";
635
    case -158: return "ERR_BAD_RESULT_STATE";
636
    case -159: return "ERR_DB_CANT_INIT";
637
    case -160: return "ERR_NOT_UNIQUE";
638
    case -161: return "ERR_NOT_FOUND";
639
    case -162: return "ERR_NO_EXIT_STATUS";
640
    case -163: return "ERR_FILE_MISSING";
641
    case -164: return "ERR_NESTED_UNHANDLED_EXCEPTION_DETECTED";
642
    case -165: return "ERR_SEMGET";
643
    case -166: return "ERR_SEMCTL";
644
    case -167: return "ERR_SEMOP";
645
    case -168: return "ERR_FTOK";
646
    case -169: return "ERR_SOCKS_UNKNOWN_FAILURE";
647
    case -170: return "ERR_SOCKS_REQUEST_FAILED";
648
    case -171: return "ERR_SOCKS_BAD_USER_PASS";
649
    case -172: return "ERR_SOCKS_UNKNOWN_SERVER_VERSION";
650
    case -173: return "ERR_SOCKS_UNSUPPORTED";
651
    case -174: return "ERR_SOCKS_CANT_REACH_HOST";
652
    case -175: return "ERR_SOCKS_CONN_REFUSED";
653
    case -176: return "ERR_TIMER_INIT";
654
    case -177: return "ERR_RSC_LIMIT_EXCEEDED";
655
    case -178: return "ERR_INVALID_PARAM";
656
    case -179: return "ERR_SIGNAL_OP";
657
    case -180: return "ERR_BIND";
658
    case -181: return "ERR_LISTEN";
659
    case -182: return "ERR_TIMEOUT";
660
    case -183: return "ERR_PROJECT_DOWN";
661
    case -184: return "ERR_HTTP_ERROR";
662
    case -185: return "ERR_RESULT_START";
663
    case -186: return "ERR_RESULT_DOWNLOAD";
664
    case -187: return "ERR_RESULT_UPLOAD";
665
    case -189: return "ERR_INVALID_URL";
666
    case -190: return "ERR_MAJOR_VERSION";
667
    case -191: return "ERR_NO_OPTION";
668
    case -192: return "ERR_MKDIR";
669
    case -193: return "ERR_INVALID_EVENT";
670
    case -194: return "ERR_ALREADY_RUNNING";
671
    case -195: return "ERR_NO_APP_VERSION";
672
    case -196: return "ERR_WU_USER_RULE";
673
    case -197: return "ERR_ABORTED_VIA_GUI";
674
    case -198: return "ERR_INSUFFICIENT_RESOURCE";
675
    case -199: return "ERR_RETRY";
676
    case -200: return "ERR_WRONG_SIZE";
677
    case -201: return "ERR_USER_PERMISSION";
678
    case -202: return "ERR_SHMEM_NAME";
679
    case -203: return "ERR_NO_NETWORK_CONNECTION";
680
    case -204: return "ERR_IN_PROGRESS";
681
    case -205: return "ERR_BAD_EMAIL_ADDR";
682
    case -206: return "ERR_BAD_PASSWD";
683
    case -207: return "ERR_NONUNIQUE_EMAIL";
684
    case -208: return "ERR_ACCT_CREATION_DISABLED";
685
    case -209: return "ERR_ATTACH_FAIL_INIT";
686
    case -210: return "ERR_ATTACH_FAIL_DOWNLOAD";
687
    case -211: return "ERR_ATTACH_FAIL_PARSE";
688
    case -212: return "ERR_ATTACH_FAIL_BAD_KEY";
689
    case -213: return "ERR_ATTACH_FAIL_FILE_WRITE";
690
    case -214: return "ERR_ATTACH_FAIL_SERVER_ERROR";
691
    case -215: return "ERR_SIGNING_KEY";
692
    case -216: return "ERR_FFLUSH";
693
    case -217: return "ERR_FSYNC";
694
    case -218: return "ERR_TRUNCATE";
695
    case -219: return "ERR_WRONG_URL";
696
    case -220: return "ERR_DUP_NAME";
697
    case -221: return "ERR_ABORTED_BY_PROJECT";
698
    case -222: return "ERR_GETGRNAM";
699
    case -223: return "ERR_CHOWN";
700
    case -224: return "ERR_FILE_NOT_FOUND";
701
    case -225: return "ERR_BAD_FILENAME";
702
    case -226: return "ERR_TOO_MANY_EXITS";
703
    case -227: return "ERR_RMDIR";
704
    case -228: return "ERR_CHILD_FAILED";
705
    case -229: return "ERR_SYMLINK";
706
    case -230: return "ERR_DB_CONN_LOST";
707
    case -231: return "ERR_CRYPTO";
708
    case -232: return "ERR_ABORTED_ON_EXIT";
709
    case -233: return "ERR_UNSTARTED_LATE";
710
    case -234: return "ERR_MISSING_COPROC";
711
    case -235: return "ERR_PROC_PARSE";
712
    default: return "Unknown error code";
0 ignored issues
show
DEFAULT keyword must be indented 4 spaces from SWITCH keyword
Loading history...
Blank lines are not allowed after DEFAULT statements
Loading history...
713
    }
714
}
715
716
function exit_status_string($x) {
717
    return $x." (".int2hex($x).") ".error_code_str($x);
718
}
719
720
function show_result($result, $show_outfile_links=false) {
721
    start_table();
722
    row2(tra("Name"), $result->name);
723
    row2(tra("Workunit"), "<a href=\"workunit.php?wuid=$result->workunitid\">$result->workunitid</a>");
724
    row2(tra("Created"), time_str($result->create_time));
725
    row2(tra("Sent"), time_str($result->sent_time));
726
    row2(tra("Report deadline"), time_str($result->report_deadline));
727
    row2(tra("Received"), time_str($result->received_time));
728
    row2(tra("Server state"), result_server_state_string($result));
729
    row2(tra("Outcome"), result_outcome_string($result));
730
    row2(tra("Client state"), result_client_state_string($result));
731
    row2(tra("Exit status"), exit_status_string($result->exit_status));
732
    row2(tra("Computer ID"), host_link($result->hostid));
733
    row2(tra("Run time"), time_diff($result->elapsed_time));
734
    row2(tra("CPU time"), time_diff($result->cpu_time));
735
    row2(tra("Validate state"), validate_state_str($result));
736
    row2(tra("Credit"), number_format($result->granted_credit, 2));
737
    row2(tra("Device peak FLOPS"), number_format($result->flops_estimate/1e9, 2)." GFLOPS");
738
    row2(tra("Application version"), app_version_string($result));
739
    if ($result->peak_working_set_size) {
740
        row2("Peak working set size",
741
            size_string($result->peak_working_set_size)
742
        );
743
    }
744
    if ($result->peak_swap_size) {
745
        row2("Peak swap size", size_string($result->peak_swap_size));
746
    }
747
    if ($result->peak_disk_usage) {
748
        row2("Peak disk usage", size_string($result->peak_disk_usage));
749
    }
750
    if ($show_outfile_links && $result->outcome == 1) {
751
        $fanout = parse_config(get_config(), "<uldl_dir_fanout>");
752
        $names = get_outfile_phys_names($result);
753
        $i = 0;
754
        $x = "";
755
        foreach ($names as $name) {
756
            if ($i) $x .= " &middot; ";
757
            $url = dir_hier_url($name, "upload", $fanout);
758
            echo $name;
759
            $x .= " <a href=$url>$i</a> ";
760
            $i++;
761
        }
762
        row2(tra("Output files"), $x);
763
    }
764
    if (function_exists('project_result')) {
765
        project_result($result);
766
    }
767
    end_table();
768
    if ($result->server_state == RESULT_SERVER_STATE_OVER) {
769
        echo "<h3>".tra("Stderr output")."</h3> <pre>"
770
            .htmlspecialchars(
771
                $result->stderr_out,
772
                ENT_QUOTES | (defined('ENT_SUBSTITUTE')?ENT_SUBSTITUTE:0),
773
                'utf-8'
774
            )
775
            ."</pre>"
776
        ;
0 ignored issues
show
Space found before semicolon; expected ""</pre>";" but found ""</pre>"
;"
Loading history...
777
    }
778
}
779
780
function result_navigation($info, $where_clause) {
781
    global $state_name;
782
    $state_count = array();
783
    $app_count = array();
784
    $x = "";
785
786
    $apps = BoincApp::enum('deprecated=0 ORDER BY user_friendly_name');
787
788
    for ($i=0; $i<NSTATES; $i++) {
789
        $state_count[$i] = 0;
790
    }
791
    foreach ($apps as $app) {
792
        $app_count[$app->id] = 0;
793
    }
794
    $app_count[0] = 0;
795
796
    $results = BoincResult::enum_fields(
797
        "appid, server_state, outcome, validate_state, count(*) AS cnt",
798
        $where_clause." group by appid, server_state, outcome, validate_state", null
799
    );
800
    foreach ($results as $r) {
801
        $cnt = $r->cnt;
802
        if (array_key_exists($r->appid, $app_count)) {
803
            $app_count[$r->appid] += $cnt;
804
        }
805
        $app_count[0] += $cnt;
806
        if (!$info->appid || ($r->appid == $info->appid)) {
807
            $state_count[state_num($r)] += $cnt;
808
            $state_count[0] += $cnt;
809
        }
810
    }
811
812
    $x .= "<br><center>";
813
    $show_prev = ($info->offset >= $info->results_per_page);
814
    $show_next = ($info->number_of_results > $info->results_per_page);
815
    if ($show_prev) {
816
        $i2 = clone $info;
817
        $i2->offset = $info->offset - $info->results_per_page;
818
        $url = result_page_url($i2);
819
        $x .= "<a href=$url>".tra("Previous")." ".$info->results_per_page."</a>";
820
    }
821
    if ($show_prev && $show_next) {
822
        $x .= "&nbsp;&middot;&nbsp;";
823
    }
824
    if ($show_next) {
825
        $i2 = clone $info;
826
        $i2->offset = $info->offset + $info->results_per_page;
827
        $url = result_page_url($i2);
828
        $x .= "<a href=$url>".tra("Next")." ".$info->results_per_page."</a>";
829
    }
830
    $x .= "<br>".tra("State").": ";
831
    for ($i=0; $i<NSTATES; $i++) {
832
        if ($i) $x .= " &middot; ";
833
        if ($info->state == $i) {
834
            $x .= $state_name[$i];
835
        } else {
836
            $i2 = clone $info;
837
            $i2->state = $i;
838
            $i2->offset = 0;
839
            $url = result_page_url($i2);
840
            $x .= "<a href=$url>".$state_name[$i]."</a>";
841
        }
842
        $x .= " (".$state_count[$i].") ";
843
    }
844
845
    if (count($apps) > 1) {
846
        $i2 = clone $info;
847
        $i2->offset = 0;
848
        $x .= "<br>".tra("Application").": ";
849
        if ($info->appid) {
850
            $i2->appid = 0;
851
            $url = result_page_url($i2);
852
            $x .= '<a href="'.$url.'">All</a>';
853
        } else {
854
            $x .= 'All';
855
        }
856
        $x .= " (".$app_count[0].") ";
857
858
        foreach ($apps as $app) {
859
            $i2->appid = $app->id;
860
            $url = result_page_url($i2);
861
            $x .= ' &middot; ';
862
            if ($info->appid == $app->id) {
863
                $x .= $app->user_friendly_name;
864
            } else {
865
                $x .= '<a href="'.$url.'">'.$app->user_friendly_name.'</a>';
866
            }
867
            $x .= " (".$app_count[$app->id].") ";
868
        }
869
    }
870
871
    $x .= '<form action="result.php">'.tra("Task name:").' <input "size=40" name="result_name"> <input class="btn btn-primary" type="submit" value="OK"></form>';
872
    $x .= "</center><br>";
873
    return $x;
874
}
875
876
877
?>
878