Passed
Push — master ( 31517f...dc3597 )
by Vitalii
01:28 queued 22s
created

handle_query_job()   C

Complexity

Conditions 10
Paths 24

Size

Total Lines 100
Code Lines 71

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 10
eloc 71
c 0
b 0
f 0
nc 24
nop 1
dl 0
loc 100
rs 6.766

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
// This file is part of BOINC.
4
// http://boinc.berkeley.edu
5
// Copyright (C) 2024 University of California
6
//
7
// BOINC is free software; you can redistribute it and/or modify it
8
// under the terms of the GNU Lesser General Public License
9
// as published by the Free Software Foundation,
10
// either version 3 of the License, or (at your option) any later version.
11
//
12
// BOINC is distributed in the hope that it will be useful,
13
// but WITHOUT ANY WARRANTY; without even the implied warranty of
14
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15
// See the GNU Lesser General Public License for more details.
16
//
17
// You should have received a copy of the GNU Lesser General Public License
18
// along with BOINC.  If not, see <http://www.gnu.org/licenses/>.
19
20
// web interface for remote job submission:
21
// - links to job-submission pages
22
// - Admin (if privileged user)
23
// - manage batches
24
//      view status, get output files, abort, retire
25
// - toggle 'use only my computers'
26
27
require_once("../inc/submit_db.inc");
28
require_once("../inc/util.inc");
29
require_once("../inc/result.inc");
30
require_once("../inc/submit_util.inc");
31
require_once("../project/project.inc");
32
33
display_errors();
34
35
define("PAGE_SIZE", 20);
36
37
function return_link() {
38
    echo "<p><a href=submit.php>Return to job submission page</a>\n";
39
}
40
41
function state_count($batches, $state) {
42
    $n = 0;
43
    foreach ($batches as $batch) {
44
        if ($batch->state == $state) $n++;
45
    }
46
    return $n;
47
}
48
49
function show_all_link($batches, $state, $limit, $user, $app) {
50
    $n = state_count($batches, $state);
51
    if ($n > $limit) {
52
        if ($user) $userid = $user->id;
53
        else $userid = 0;
54
        if ($app) $appid = $app->id;
55
        else $appid = 0;
56
57
        echo "Showing the most recent $limit of $n batches.
58
            <a href=submit.php?action=show_all&state=$state&userid=$userid&appid=$appid>Show all $n</a>
59
            <p>
60
        ";
61
    }
62
}
63
64
function show_in_progress($batches, $limit, $user, $app) {
65
    echo "<h3>Batches in progress</h3>\n";
66
    $first = true;
67
    $n = 0;
68
    foreach ($batches as $batch) {
69
        if ($batch->state != BATCH_STATE_IN_PROGRESS) continue;
70
        if ($limit && $n == $limit) break;
71
        $n++;
72
        if ($first) {
73
            $first = false;
74
            if ($limit) {
75
                show_all_link($batches, BATCH_STATE_IN_PROGRESS, $limit, $user, $app);
76
            }
77
            start_table();
78
            table_header(
79
                "Name",
80
                "ID",
81
                "User",
82
                "App",
83
                "# jobs",
84
                "Progress",
85
                "Submitted",
86
                "Logical end time<br><small>Determines priority</small>"
87
            );
88
        }
89
        $pct_done = (int)($batch->fraction_done*100);
90
        table_row(
91
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->name</a>",
92
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->id</a>",
93
            $batch->user_name,
94
            $batch->app_name,
95
            $batch->njobs,
96
            "$pct_done%",
97
            local_time_str($batch->create_time),
98
            local_time_str($batch->logical_end_time)
99
        );
100
    }
101
    if ($first) {
102
        echo "<p>None.\n";
103
    } else {
104
        end_table();
105
    }
106
}
107
108
function show_complete($batches, $limit, $user, $app) {
109
    $first = true;
110
    $n = 0;
111
    foreach ($batches as $batch) {
112
        if ($batch->state != BATCH_STATE_COMPLETE) continue;
113
        if ($limit && $n == $limit) break;
114
        $n++;
115
        if ($first) {
116
            $first = false;
117
            echo "<h3>Completed batches</h3>\n";
118
            if ($limit) {
119
                show_all_link($batches, BATCH_STATE_COMPLETE, $limit, $user, $app);
120
            }
121
            start_table();
122
            table_header("name", "ID", "user", "app", "# jobs", "submitted");
123
        }
124
        table_row(
125
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->name</a>",
126
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->id</a>",
127
            $batch->user_name,
128
            $batch->app_name,
129
            $batch->njobs,
130
            local_time_str($batch->create_time)
131
        );
132
    }
133
    if ($first) {
134
        echo "<p>No completed batches.\n";
135
    } else {
136
        end_table();
137
    }
138
}
139
140
function show_aborted($batches, $limit, $user, $app) {
141
    $first = true;
142
    $n = 0;
143
    foreach ($batches as $batch) {
144
        if ($batch->state != BATCH_STATE_ABORTED) continue;
145
        if ($limit && $n == $limit) break;
146
        $n++;
147
        if ($first) {
148
            $first = false;
149
            echo "<h2>Aborted batches</h2>\n";
150
            if ($limit) {
151
                show_all_link($batches, BATCH_STATE_ABORTED, $limit, $user, $app);
152
            }
153
            start_table();
154
            table_header("name", "ID", "user", "app", "# jobs", "submitted");
155
        }
156
        table_row(
157
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->name</a>",
158
            "<a href=submit.php?action=query_batch&batch_id=$batch->id>$batch->id</a>",
159
            $batch->user_name,
160
            $batch->app_name,
161
            $batch->njobs,
162
            local_time_str($batch->create_time)
163
        );
164
    }
165
    if (!$first) {
166
        end_table();
167
    }
168
}
169
170
// fill in the app and user names in list of batches
171
//
172
function fill_in_app_and_user_names(&$batches) {
173
    foreach ($batches as $batch) {
174
        $app = BoincApp::lookup_id($batch->app_id);
175
        if ($app) {
176
            $batch->app_name = $app->name;
177
        } else {
178
            $batch->app_name = "unknown";
179
        }
180
        $user = BoincUser::lookup_id($batch->user_id);
181
        if ($user) {
182
            $batch->user_name = $user->name;
183
        } else {
184
            $batch->user_name = "missing user $batch->user_id";
185
        }
186
    }
187
}
188
189
// show a set of batches
190
//
191
function show_batches($batches, $limit, $user, $app) {
192
    fill_in_app_and_user_names($batches);
193
    show_in_progress($batches, $limit, $user, $app);
194
    show_complete($batches, $limit, $user, $app);
195
    show_aborted($batches, $limit, $user, $app);
196
}
197
198
// the job submission "home page":
199
// show the user's in-progress and completed batches,
200
// and a button for creating a new batch
201
//
202
function handle_main($user) {
203
    global $web_apps;
204
    $user_submit = BoincUserSubmit::lookup_userid($user->id);
205
    if (!$user_submit) {
206
        error_page("Ask the project admins for permission to submit jobs");
207
    }
208
209
    page_head("Job submission");
210
211
    if (isset($web_apps) && $web_apps) {
212
        // show links to per-app job submission pages
213
        //
214
        echo "<h3>Submit jobs</h3>
215
            <ul>
216
        ";
217
        foreach ($web_apps as $appname => $web_app) {
218
            $appname = BoincDb::escape_string($appname);
219
            $app = BoincApp::lookup("name='$appname'");
220
            if (!$app) error_page("bad web app name: $appname");
221
            $usa = BoincUserSubmitApp::lookup("user_id=$user->id and app_id=$app->id");
222
            if ($usa || $user_submit->submit_all) {
223
                echo "<li> <a href=$web_app->submit_url> $app->user_friendly_name </a>";
224
            }
225
        }
226
        echo "</ul>\n";
227
    }
228
229
    echo '<h3>Where your jobs run</h3>';
230
    if ($user->seti_id) {
231
        echo "<p>
232
            Jobs you submit can run only on your computers.
233
            <p>
234
        ";
235
        show_button(
236
            'submit.php?action=toggle_loc',
237
            'Allow them to run on any computer.'
238
        );
239
    } else {
240
        echo "<p>
241
            Jobs you submit can run on any computer.
242
            <p>
243
        ";
244
        show_button(
245
            'submit.php?action=toggle_loc',
246
            'Allow them to run only on your computers.'
247
        );
248
    }
249
250
    // show links to admin pages if relevant
251
    //
252
    $usas = BoincUserSubmitApp::enum("user_id=$user->id");
253
    $app_admin = false;
254
    foreach ($usas as $usa) {
255
        if ($usa->manage) {
256
            $app_admin = true;
257
            break;
258
        }
259
    }
260
    if ($user_submit->manage_all || $app_admin) {
261
        echo "<h3>Administer job submission</h3>\n";
262
        show_button('submit.php?action=admin', 'Administer');
263
    }
264
265
    $batches = BoincBatch::enum("user_id = $user->id order by id desc");
266
    show_batches($batches, PAGE_SIZE, $user, null);
267
268
    page_tail();
269
}
270
271
function handle_toggle_loc($user) {
272
    if ($user->seti_id) {
273
        $user->update('seti_id=0');
274
    } else {
275
        $user->update('seti_id=1');
276
    }
277
    handle_main($user);
278
}
279
280
// show links for everything the user has admin access to
281
//
282
function handle_admin($user) {
283
    $user_submit = BoincUserSubmit::lookup_userid($user->id);
284
    if (!$user_submit) error_page('no access');
285
    page_head("Administer job submission");
286
    if ($user_submit->manage_all) {
287
        echo "<li>All applications<br>
288
            <ul>
289
            <li> <a href=submit.php?action=admin_all>View all batches</a>
290
            <li> <a href=manage_project.php>Manage user permissions</a>
291
            </ul>
292
        ";
293
        $apps = BoincApp::enum("deprecated=0");
294
        foreach ($apps as $app) {
295
            echo "
296
                <li>$app->user_friendly_name<br>
297
                <ul>
298
                <li><a href=submit.php?action=admin_app&app_id=$app->id>View batches</a>
299
                <li> <a href=manage_app.php?app_id=$app->id&amp;action=app_version_form>Manage app versions</a>
300
                <li> <a href=manage_app.php?app_id=$app->id&amp;action=permissions_form>Manage user permissions</a>
301
                <li> <a href=manage_app.php?app_id=$app->id&amp;action=batches_form>Manage batches</a>
302
                </ul>
303
            ";
304
        }
305
    } else {
306
        foreach ($usas as $usa) {
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $usas seems to be never defined.
Loading history...
307
            $app = BoincApp::lookup_id($usa->app_id);
308
            echo "<li>$app->user_friendly_name<br>
309
                <a href=submit.php?action=admin_app&app_id=$app->id>Batches</a>
310
            ";
311
            if ($usa->manage) {
312
                echo "&middot;
313
                    <a href=manage_app.php?app_id=$app->id&action=app_version_form>Versions</a>
314
                ";
315
            }
316
        }
317
    }
318
    echo "</ul>\n";
319
    page_tail();
320
}
321
322
function handle_admin_app($user) {
323
    $app_id = get_int("app_id");
324
    $app = BoincApp::lookup_id($app_id);
325
    if (!$app) error_page("no such app");
326
    if (!has_admin_access($user, $app_id)) {
327
        error_page('no access');
328
    }
329
330
    page_head("Administer batches for $app->user_friendly_name");
331
    $batches = BoincBatch::enum("app_id = $app_id order by id desc");
332
    show_batches($batches, PAGE_SIZE, null, $app);
333
    page_tail();
334
}
335
function handle_admin_all($user) {
336
    page_head("Administer batches (all apps)");
337
    $batches = BoincBatch::enum("true order by id desc");
338
    show_batches($batches, PAGE_SIZE, null, null);
339
    page_tail();
340
}
341
342
343
// show the statics of mem/disk usage of jobs in a batch
344
//
345
function handle_batch_stats($user) {
346
    $batch_id = get_int('batch_id');
347
    $batch = BoincBatch::lookup_id($batch_id);
348
    $results = BoincResult::enum("batch = $batch->id");
349
    page_head("Statistics for batch $batch_id");
350
    $n = 0;
351
    $wss_sum = 0;
352
    $swap_sum = 0;
353
    $disk_sum = 0;
354
    $wss_max = 0;
355
    $swap_max = 0;
356
    $disk_max = 0;
357
    foreach ($results as $r) {
358
        if ($r->outcome != RESULT_OUTCOME_SUCCESS) {
359
            continue;
360
        }
361
        // pre-7.3.16 clients don't report usage info
362
        //
363
        if ($r->peak_working_set_size == 0) {
364
            continue;
365
        }
366
        $n++;
367
        $wss_sum += $r->peak_working_set_size;
368
        if ($r->peak_working_set_size > $wss_max) {
369
            $wss_max = $r->peak_working_set_size;
370
        }
371
        $swap_sum += $r->peak_swap_size;
372
        if ($r->peak_swap_size > $swap_max) {
373
            $swap_max = $r->peak_swap_size;
374
        }
375
        $disk_sum += $r->peak_disk_usage;
376
        if ($r->peak_disk_usage > $disk_max) {
377
            $disk_max = $r->peak_disk_usage;
378
        }
379
    }
380
    if ($n == 0) {
381
        echo "No qualifying results.";
382
        page_tail();
383
        return;
384
    }
385
    text_start(800);
386
    start_table('table-striped');
387
    row2("qualifying results", $n);
388
    row2("mean WSS", size_string($wss_sum/$n));
389
    row2("max WSS", size_string($wss_max));
390
    row2("mean swap", size_string($swap_sum/$n));
391
    row2("max swap", size_string($swap_max));
392
    row2("mean disk usage", size_string($disk_sum/$n));
393
    row2("max disk usage", size_string($disk_max));
394
    end_table();
395
    text_end();
396
    page_tail();
397
}
398
399
// return HTML for a color-coded batch progress bar
400
// green: successfully completed jobs
401
// red: failed
402
// light green: in progress
403
// light gray: unsent
404
//
405
function progress_bar($batch, $wus, $width) {
406
    $nsuccess = $batch->njobs_success;
407
    $nerror = $batch->nerror_jobs;
408
    $nin_prog = $batch->njobs_in_prog;
409
    $nunsent = $batch->njobs - $nsuccess - $nerror - $nin_prog;
410
    $w_success = $width*$nsuccess/$batch->njobs;
411
    $w_fail = $width*$nerror/$batch->njobs;
412
    $w_prog = $width*$nin_prog/$batch->njobs;
413
    $w_unsent = $width*$nunsent/$batch->njobs;
414
    $x = '<table height=20><tr>';
415
    if ($w_fail) {
416
        $x .= "<td width=$w_fail bgcolor=red></td>";
417
    }
418
    if ($w_success) {
419
        $x .= "<td width=$w_success bgcolor=green></td>";
420
    }
421
    if ($w_prog) {
422
        $x .= "<td width=$w_prog bgcolor=lightgreen></td>";
423
    }
424
    if ($w_unsent) {
425
        $x .= "<td width=$w_unsent bgcolor=lightgray></td>";
426
    }
427
    $x .= "</tr></table>
428
        <strong>
429
        <font color=red>$nerror fail</font> &middot;
430
        <font color=green>$nsuccess success</font> &middot;
431
        <font color=lightgreen>$nin_prog in progress</font> &middot;
432
        <font color=lightgray>$nunsent unsent</font>
433
        </strong>
434
    ";
435
    return $x;
436
}
437
438
// show the details of an existing batch
439
//
440
function handle_query_batch($user) {
441
    $batch_id = get_int('batch_id');
442
    $batch = BoincBatch::lookup_id($batch_id);
443
    $app = BoincApp::lookup_id($batch->app_id);
444
    $wus = BoincWorkunit::enum("batch = $batch->id");
445
    $batch = get_batch_params($batch, $wus);
446
    if ($batch->user_id == $user->id) {
447
        $owner = $user;
448
    } else {
449
        $owner = BoincUser::lookup_id($batch->user_id);
450
    }
451
452
    $web_app = get_web_app($app);
453
454
    page_head("Batch $batch_id");
455
    text_start(800);
456
    start_table();
457
    row2("name", $batch->name);
458
    if ($batch->description) {
459
        row2('description', $batch->description);
460
    }
461
    if ($owner) {
462
        row2('submitter', $owner->name);
463
    }
464
    row2("application", $app?$app->name:'---');
465
    row2("state", batch_state_string($batch->state));
466
    //row2("# jobs", $batch->njobs);
467
    //row2("# error jobs", $batch->nerror_jobs);
468
    //row2("logical end time", time_str($batch->logical_end_time));
469
    if ($batch->expire_time) {
470
        row2("expiration time", time_str($batch->expire_time));
471
    }
472
    if ($batch->njobs) {
473
        row2("progress", progress_bar($batch, $wus, 600));
474
    }
475
    if ($batch->completion_time) {
476
        row2("completed", local_time_str($batch->completion_time));
477
    }
478
    row2("GFLOP/hours, estimated", number_format(credit_to_gflop_hours($batch->credit_estimate), 2));
479
    row2("GFLOP/hours, actual", number_format(credit_to_gflop_hours($batch->credit_canonical), 2));
480
    if (!$web_app->assim_move) {
481
        row2("Total size of output files",
482
            size_string(batch_output_file_size($batch->id))
483
        );
484
    }
485
    end_table();
486
    echo "<p>";
487
488
    if ($web_app->assim_move) {
489
        $url = "get_output3.php?action=get_batch&batch_id=$batch->id";
490
    } else {
491
        $url = "get_output2.php?cmd=batch&batch_id=$batch->id";
492
    }
493
    echo "<p>";
494
    show_button($url, "Get zipped output files");
495
    echo "<p>";
496
    switch ($batch->state) {
497
    case BATCH_STATE_IN_PROGRESS:
498
        show_button(
499
            "submit.php?action=abort_batch_confirm&batch_id=$batch_id",
500
            "Abort batch"
501
        );
502
        break;
503
    case BATCH_STATE_COMPLETE:
504
    case BATCH_STATE_ABORTED:
505
        show_button(
506
            "submit.php?action=retire_batch_confirm&batch_id=$batch_id",
507
            "Retire batch"
508
        );
509
        break;
510
    }
511
    echo "<p>";
512
    show_button("submit.php?action=batch_stats&batch_id=$batch_id",
513
        "Show memory/disk usage statistics"
514
    );
515
516
    echo "<h2>Jobs</h2>\n";
517
    start_table();
518
    $x = [
519
        "Name <br><small>click for details</small>",
520
        "status"
0 ignored issues
show
Coding Style introduced by
There should be a trailing comma after the last value of an array declaration.
Loading history...
521
    ];
522
    if (!$web_app->assim_move) {
523
        $x[] = "Download Results";
524
    }
525
    row_heading_array($x);
526
    foreach($wus as $wu) {
527
        $resultid = $wu->canonical_resultid;
528
        if ($resultid) {
529
            $y = '<font color="green">completed</font>';
530
            $text = "<a href=get_output2.php?cmd=workunit&wu_id=$wu->id>Download output files</a>";
531
        } else {
532
            $text = "---";
533
            if ($batch->state == BATCH_STATE_COMPLETE) {
534
                $y = '<font color="red">failed</font>';
535
            }   else {
536
                $y = "in progress";
537
            }
538
        }
539
        $x = [
540
            "<a href=submit.php?action=query_job&wuid=$wu->id>$wu->name</a>",
541
            $y,
542
        ];
543
        if (!$web_app->assim_move) {
544
            $x[] = $text;
545
        }
546
        row_array($x);
547
    }
548
    end_table();
549
    return_link();
550
    text_end();
551
    page_tail();
552
}
553
554
// get the 'web app' structure (from project.inc) for the given app.
555
// This says what output file scheme it uses and what the submit page URL is.
556
// If not listed, return a default structure
557
//
558
function get_web_app($app) {
559
    global $web_apps;
560
    if (isset($web_apps) && array_key_exists($app->name, $web_apps)) {
561
        return $web_apps[$app->name];
562
    }
563
    $x = new StdClass;
564
    $x->submit_url = null;
565
    $x->assim_move = false;
566
    return $x;
567
}
568
569
// show the details of a job, including links to see the output files
570
//
571
function handle_query_job($user) {
572
    $wuid = get_int('wuid');
573
    $wu = BoincWorkunit::lookup_id($wuid);
574
    if (!$wu) error_page("no such job");
575
576
    $app = BoincApp::lookup_id($wu->appid);
577
    $web_app = get_web_app($app);
578
579
    page_head("Job '$wu->name'");
580
    text_start(800);
581
582
    echo "
583
        <li><a href=workunit.php?wuid=$wuid>Workunit details</a>
584
        <p>
585
        <li><a href=submit.php?action=query_batch&batch_id=$wu->batch>Batch details</a>
586
    ";
587
588
    echo "<h2>Instances</h2>\n";
589
    start_table('table-striped');
590
    table_header(
591
        "ID<br><small>click for result page</small>",
592
        "State",
593
        "Output files"
594
    );
595
    $results = BoincResult::enum("workunitid=$wuid");
596
    $upload_dir = parse_config(get_config(), "<upload_dir>");
597
    $fanout = parse_config(get_config(), "<uldl_dir_fanout>");
598
    foreach($results as $result) {
599
        $x = [
600
            "<a href=result.php?resultid=$result->id>$result->id</a>",
601
            state_string($result)
0 ignored issues
show
Coding Style introduced by
There should be a trailing comma after the last value of an array declaration.
Loading history...
602
        ];
603
        $i = 0;
604
        if ($result->server_state == RESULT_SERVER_STATE_OVER) {
605
            $phys_names = get_outfile_phys_names($result);
606
            $log_names = get_outfile_log_names($result);
607
            for ($i=0; $i<count($phys_names); $i++) {
0 ignored issues
show
Coding Style Performance introduced by
The use of count() inside a loop condition is not allowed; assign the return value to a variable and use the variable in the loop condition instead
Loading history...
Performance Best Practice introduced by
It seems like you are calling the size function count() as part of the test condition. You might want to compute the size beforehand, and not on each iteration.

If the size of the collection does not change during the iteration, it is generally a good practice to compute it beforehand, and not on each iteration:

for ($i=0; $i<count($array); $i++) { // calls count() on each iteration
}

// Better
for ($i=0, $c=count($array); $i<$c; $i++) { // calls count() just once
}
Loading history...
608
                if ($web_app->assim_move) {
609
                    // file is in
610
                    // project/results/<batchid>/<wu_name>__file_<log_name>
611
                    $path = sprintf('results/%s/%s__file_%s',
612
                        $wu->batch, $wu->name, $log_names[$i]
613
                    );
614
                    $x[] = "<a href=get_output3.php?action=get_file&path=$path>view</a> &middot; <a href=get_output3.php?action=get_file&path=$path&download=1>download</a>";
615
                } else {
616
                    $path = dir_hier_path(
617
                        $phys_names[$i], $upload_dir, $fanout
618
                    );
619
                    if (file_exists($path)) {
620
                        $url = sprintf(
621
                            'get_output2.php?cmd=result&result_id=%d&file_num=%d',
622
                            $result->id, $i
623
                        );
624
                        $s = stat($path);
625
                        $size = $s['size'];
626
                        $x[] = sprintf('<a href=%s>%s</a> (%s bytes)<br/>',
627
                            $url,
628
                            $log_names[$i],
629
                            number_format($size)
630
                        );
631
                    } else {
632
                        $x[] = sprintf("file '%s' is missing", $log_names[$i]);
633
                    }
634
                }
635
            }
636
        } else {
637
            $x[] = '---';
638
        }
639
        row_array($x);
640
    }
641
    end_table();
642
643
    // show input files
644
    //
645
    echo "<h2>Input files</h2>\n";
646
    $x = "<in>".$wu->xml_doc."</in>";
647
    $x = simplexml_load_string($x);
648
    start_table('table-striped');
649
    table_header("Name<br><small>(click to view)</small>",
650
        "Size (bytes)", "MD5"
651
    );
652
    foreach ($x->workunit->file_ref as $fr) {
653
        $pname = (string)$fr->file_name;
654
        $lname = (string)$fr->open_name;
655
        foreach ($x->file_info as $fi) {
656
            if ((string)$fi->name == $pname) {
657
                table_row(
658
                    "<a href=$fi->url>$lname</a>",
659
                    $fi->nbytes,
660
                    $fi->md5_cksum
661
                );
662
                break;
663
            }
664
        }
665
    }
666
667
    end_table();
668
    text_end();
669
    return_link();
670
    page_tail();
671
}
672
673
function handle_abort_batch_confirm() {
674
    $batch_id = get_int('batch_id');
675
    page_head("Confirm abort batch");
676
    echo "
677
        Aborting a batch will cancel all unstarted jobs.
678
        Are you sure you want to do this?
679
        <p>
680
    ";
681
    show_button(
682
        "submit.php?action=abort_batch&batch_id=$batch_id",
683
        "Yes - abort batch"
684
    );
685
    return_link();
686
    page_tail();
687
}
688
689
function check_access($user, $batch) {
690
    if ($user->id == $batch->user_id) return;
691
    $user_submit = BoincUserSubmit::lookup_userid($user->id);
692
    if ($user_submit->manage_all) return;
693
    $usa = BoincUserSubmitApp::lookup("user_id=$user->id and app_id=$batch->app_id");
694
    if ($usa->manage) return;
695
    error_page("no access");
696
}
697
698
function handle_abort_batch($user) {
699
    $batch_id = get_int('batch_id');
700
    $batch = BoincBatch::lookup_id($batch_id);
701
    if (!$batch) error_page("no such batch");
702
    check_access($user, $batch);
703
    abort_batch($batch);
704
    page_head("Batch aborted");
705
    return_link();
706
    page_tail();
707
}
708
709
function handle_retire_batch_confirm() {
710
    $batch_id = get_int('batch_id');
711
    page_head("Confirm retire batch");
712
    echo "
713
        Retiring a batch will remove all of its output files.
714
        Are you sure you want to do this?
715
        <p>
716
    ";
717
    show_button(
718
        "submit.php?action=retire_batch&batch_id=$batch_id",
719
        "Yes - retire batch"
720
    );
721
    return_link();
722
    page_tail();
723
}
724
725
function handle_retire_batch($user) {
726
    $batch_id = get_int('batch_id');
727
    $batch = BoincBatch::lookup_id($batch_id);
728
    if (!$batch) error_page("no such batch");
729
    check_access($user, $batch);
730
    retire_batch($batch);
731
    page_head("Batch retired");
732
    return_link();
733
    page_tail();
734
}
735
736
function show_batches_in_state($batches, $state) {
737
    switch ($state) {
738
    case BATCH_STATE_IN_PROGRESS:
739
        page_head("Batches in progress");
740
        show_in_progress($batches, 0, null, null);
741
        break;
742
    case BATCH_STATE_COMPLETE:
743
        page_head("Completed batches");
744
        show_complete($batches, 0, null, null);
745
        break;
746
    case BATCH_STATE_ABORTED:
747
        page_head("Aborted batches");
748
        show_aborted($batches, 0, null, null);
749
        break;
750
    }
751
    page_tail();
752
}
753
754
function handle_show_all($user) {
755
    $userid = get_int("userid");
756
    $appid = get_int("appid");
757
    $state = get_int("state");
758
    if ($userid) {
759
        // user looking at their own batches
760
        //
761
        if ($userid != $user->id) error_page("wrong user");
762
        $batches = BoincBatch::enum("user_id = $user->id and state=$state order by id desc");
763
        fill_in_app_and_user_names($batches);
764
        show_batches_in_state($batches, $state);
765
    } else {
766
        // admin looking at batches
767
        //
768
        if (!has_admin_access($user, $appid)) {
769
            error_page('no access');
770
        }
771
        if ($appid) {
772
            $app = BoincApp::lookup_id($appid);
773
            if (!$app) error_page("no such app");
774
            $batches = BoincBatch::enum("app_id = $appid and state=$state order by id desc");
775
        } else {
776
            $batches = BoincBatch::enum("state=$state order by id desc");
777
        }
778
        fill_in_app_and_user_names($batches);
779
        show_batches_in_state($batches, $state);
780
    }
781
}
782
783
$user = get_logged_in_user();
0 ignored issues
show
Bug introduced by
Are you sure the assignment to $user is correct as get_logged_in_user() seems to always return null.

This check looks for function or method calls that always return null and whose return value is assigned to a variable.

class A
{
    function getObject()
    {
        return null;
    }

}

$a = new A();
$object = $a->getObject();

The method getObject() can return nothing but null, so it makes no sense to assign that value to a variable.

The reason is most likely that a function or method is imcomplete or has been reduced for debug purposes.

Loading history...
784
785
$action = get_str('action', true);
786
787
switch ($action) {
788
case '': handle_main($user); break;
789
case 'abort_batch': handle_abort_batch($user); break;
790
case 'abort_batch_confirm': handle_abort_batch_confirm(); break;
791
case 'admin': handle_admin($user); break;
792
case 'admin_app': handle_admin_app($user); break;
793
case 'admin_all': handle_admin_all($user); break;
794
case 'batch_stats': handle_batch_stats($user); break;
795
case 'query_batch': handle_query_batch($user); break;
796
case 'query_job': handle_query_job($user); break;
797
case 'retire_batch': handle_retire_batch($user); break;
798
case 'retire_batch_confirm': handle_retire_batch_confirm(); break;
799
case 'show_all': handle_show_all($user); break;
800
case 'toggle_loc': handle_toggle_loc($user); break;
801
default:
0 ignored issues
show
Coding Style introduced by
DEFAULT keyword must be indented 4 spaces from SWITCH keyword
Loading history...
Coding Style introduced by
DEFAULT case must have a breaking statement
Loading history...
802
    error_page("no such action $action");
803
}
804
805
?>
806