Project

General

Profile

Download (19.1 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php
2
<?php
3
/*
4
    pkg_mgr_install.php
5
    part of pfSense (http://www.pfSense.com)
6
    Copyright (C) 2004 Scott Ullrich
7
    All rights reserved.
8

    
9
    Redistribution and use in source and binary forms, with or without
10
    modification, are permitted provided that the following conditions are met:
11

    
12
    1. Redistributions of source code must retain the above copyright notice,
13
       this list of conditions and the following disclaimer.
14

    
15
    2. Redistributions in binary form must reproduce the above copyright
16
       notice, this list of conditions and the following disclaimer in the
17
       documentation and/or other materials provided with the distribution.
18

    
19
    THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
20
    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
21
    AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
    AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
23
    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28
    POSSIBILITY OF SUCH DAMAGE.
29
*/
30

    
31
require("guiconfig.inc");
32
require("xmlparse_pkg.inc");
33

    
34
/* /usr/local/pkg/ is where xml package files are stored. */
35
if(!file_exists("/usr/local/pkg/")) mwexec("mkdir -p /usr/local/pkg/");
36
/* /usr/local/pkg/pf is where custom php hook packages live to alter the rules when needed */
37
if(!file_exists("/usr/local/pkg/pf")) mwexec("mkdir -p /usr/local/pkg/pf");
38
/* /usr/local/www/ext is where package links live for the left hand pane */
39
if(!file_exists("/usr/local/www/ext/")) mwexec("mkdir -p /usr/local/www/ext");
40

    
41
$pb_percent = 1;
42

    
43
$a_out = &$pkg_config['packages'];
44

    
45
$packages_to_install = Array();
46

    
47
?>
48
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
49
<html>
50
<head>
51
<title><?=gentitle("System: Package Manager: Install Package");?></title>
52
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
53
<link href="gui.css" rel="stylesheet" type="text/css">
54
</head>
55

    
56
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
57
<?php
58
include("fbegin.inc");
59
?>
60
<p class="pgtitle">System: Package Manager: Install Package</p>
61
<form action="pkg_mgr_install.php" method="post">
62

    
63
<?php if ($savemsg) print_info_box($savemsg); ?>
64
<?php
65

    
66
if($_GET['showlog'] <> "") {
67
            echo "<table>";
68
            echo "<tr><td>";
69
            echo "<pre>";
70
            // reopen and read log in
71
            $fd = fopen("/tmp/pkg_mgr.log", "r");
72
            $tmp = "";
73
            while(!feof($fd)) {
74
                        $tmp .= fread($fd,49);
75
            }
76
            fclose($fd);
77
            echo $tmp;
78
            echo "</pre>";
79
            echo "</td></tr>";
80
            echo "</table>";
81
            exit;
82
}
83

    
84
/*
85
 *   open logging facility
86
 */
87
$fd_log = fopen("/tmp/pkg_mgr.log", "w");
88
if(!$fd_log) log_error("Warning, could not open /tmp/pkg_mgr.log for writing");
89
fwrite($fd_log, "Begin of Package Manager installation session.\n");
90

    
91
fetch_latest_pkg_config();
92

    
93
$pkg_config = parse_xml_config_pkg("{$g['tmp_path']}/pkg_config.xml", "pfsensepkgs");
94

    
95
if(!$pkg_config['packages'])
96
    print_info_box_np("Could not find any packages in pkg_config.xml");
97

    
98
?>
99
<table width="100%" border="0" cellpadding="0" cellspacing="0">  <tr><td>
100
  <ul id="tabnav">
101
    <li class="tabinact"><a href="pkg_mgr.php">Available Packages</a></li>
102
    <li class="tabact">Installed Packages</a></li>
103
  </ul>
104
  </td></tr>
105
  <tr>
106
    <td class="tabcont">
107
              <table width="100%" border="0" cellpadding="6" cellspacing="0">
108
               <tr>
109
                 <td>
110
                     <!-- progress bar -->
111
                     <center>
112
                     <table id="progholder" name="progholder" height='20' border='1' bordercolor='black' width='420' bordercolordark='#000000' bordercolorlight='#000000' style='border-collapse: collapse' colspacing='2' cellpadding='2' cellspacing='2'><tr><td><img border='0' src='progress_bar.gif' width='280' height='23' name='progressbar' id='progressbar'></td></tr></table>
113
                     <br>
114
	             <!-- status box -->
115
                     <textarea cols="60" rows="1" name="status" id="status" wrap="hard">One moment please... This will take a while!</textarea>
116
                     <!-- command output box -->
117
	             <textarea cols="60" rows="25" name="output" id="output" wrap="hard"></textarea>
118
                     </center>
119
                 </td>
120
               </tr>
121
        </table>
122
    </td>
123
  </tr>
124
</table>
125
</form>
126
<?php include("fend.inc"); ?>
127
</body>
128
</html>
129

    
130
<?php
131

    
132

    
133

    
134
if($_GET['mode'] == "reinstallall") {
135
    /*
136
     *  Loop through installed packages and if name matches
137
     *  push the package id onto array to reinstall
138
     */
139
    $counter = 0;
140
    foreach($pkg_config['packages']['package'] as $available_package) {
141
        foreach($config['installedpackages']['package'] as $package) {
142
            if($package['name'] == $available_package['name']) {
143
                array_push($packages_to_install, $counter);
144
                update_status("Adding package " . $package['name']);
145
                fwrite($fd_log, "Adding (" . $counter . ") " . $package['name'] . " to package installation array.\n" . $status);
146
            }
147
        }
148
        $counter++;
149
    }
150
} else {
151
    /*
152
     * Push the desired package id onto the install packages array
153
     */
154
    fwrite($fd_log, "Single package installation started.\n");
155
    array_push($packages_to_install, $_GET['id']);
156
}
157

    
158
/*
159
 *  Loop through packages_to_install, installing needed packages
160
 */
161
foreach ($packages_to_install as $id) {
162

    
163
    $pkg_config = parse_xml_config_pkg("{$g['tmp_path']}/pkg_config.xml", "pfsensepkgs");
164

    
165
    update_progress_bar($pb_percent);
166
    $pb_percent += 10;
167

    
168
    /*
169
     * install the package
170
     */
171

    
172
    // Ensure directories are in place for pkg_add.
173
    mwexec("mkdir /usr/local/www/ext/Services >/dev/null 2>&1");
174
    mwexec("mkdir /usr/local/www/ext/System >/dev/null 2>&1");
175
    mwexec("mkdir /usr/local/www/ext/Interfaces >/dev/null 2>&1");
176
    mwexec("mkdir /usr/local/www/ext/Firewall >/dev/null 2>&1");
177
    mwexec("mkdir /usr/local/www/ext/VPN >/dev/null 2>&1");
178
    mwexec("mkdir /usr/local/www/ext/Status >/dev/null 2>&1");
179
    mwexec("mkdir /usr/local/www/ext/Diagnostics >/dev/null 2>&1");
180
    mwexec("mkdir /usr/local/pkg >/dev/null 2>&1");
181

    
182
    update_progress_bar($pb_percent);
183
    $pb_percent += 10;
184

    
185
    $a_out = &$pkg_config['packages']['package'];
186
    $pkgent = array();
187
    $pkgent['name'] = $pkg_config['packages']['package'][$id]['name'];
188
    $pkgent['descr'] = $pkg_config['packages']['package'][$id]['descr'];
189
    $pkgent['category'] = $pkg_config['packages']['package'][$id]['category'];
190

    
191
    $pkgent['version'] = $pkg_config['packages']['package'][$id]['version'];
192

    
193
    $pkgent['depends_on_package'] = $a_out[$id]['depends_on_package'];
194
    $pkgent['depends_on_package_base_url'] = $a_out[$id]['depends_on_package_base_url'];
195
    $pkgent['pfsense_package'] = $a_out[$id]['pfsense_package'];
196
    $pkgent['pfsense_package_base_url'] = $a_out[$id]['pfsense_package_base_url'];
197
    $pkgent['configurationfile'] = $a_out[$id]['configurationfile'];
198
    if($pkg_config['packages']['package'][$id]['logging']) {
199
        // logging facilities.
200
        $pkgent['logging']['facility'] = $pkg_config['packages']['package'][$id]['logging']['facility'];
201
        $pkgent['logging']['logfile_name'] = $pkg_config['packages']['package'][$id]['logging']['logfile_name'];
202
        mwexec("/usr/sbin/clog -i -s 32768 /var/log/" . $pkgent['logging']['logfile_name']);
203
        mwexec("chmod 0600 /var/log/" . $pkgent['logging']['logfile_name']);
204
        fwrite($fd_log, "Adding text to file /etc/syslog.conf\n");
205
        add_text_to_file("/etc/syslog.conf", $pkgent['logging']['facilityname'] . "\t\t\t" . $pkgent['logging']['logfilename']);
206
        mwexec("/usr/bin/killall -HUP syslogd");
207
    }
208
    $a_out = &$config['packages']['package']; // save item to installedpkgs
209
    fwrite($fd_log, "Begining (" . $id. ") " . $pkgent['name'] . " package installation.\n" . $status);
210

    
211
    log_error("Begining (" . $id. ") " . $pkgent['name'] . " package installation.");
212

    
213
    update_progress_bar($pb_percent);
214
    $pb_percent += 10;
215

    
216
    fwrite($fd_log, "ls /var/db/pkg | grep " . $pkgent['name'] . "\n" . $status);
217
    if($status <> "") {
218
                // package is already installed!?
219
                if(!$_GET['mode'] == "reinstallall")
220
                    print_info_box_np("NOTICE! " . $pkgent['name'] . " is already installed!  Installation will be registered.");
221
    }
222

    
223
    if($pkg_config['packages']['package'][$id]['config_file'] <> "") {
224
        update_status("Downloading configuration file.");
225
        fwrite($fd_log, "Downloading configuration file " . $pkg_config['packages']['package'][$id]['config_file'] . " ... \n");
226
        update_progress_bar($pb_percent);
227
        $pb_percent += 10;
228
        mwexec("cd /usr/local/pkg/ && fetch " . $pkg_config['packages']['package'][$id]['config_file']);
229
        if(!file_exists("/usr/local/pkg/" . $pkgent['name'] . ".xml")) {
230
            fwrite($fd_log, "ERROR!  Could not fetch " . $pkg_config['packages']['package'][$id]['config_file']);
231
            update_output_window("ERROR!  Could not fetch " . $pkg_config['packages']['package'][$id]['config_file'] . "\n");
232
            exit;
233
        }
234
    }
235

    
236
    update_status("Downloading and installing " . $pkgent['name'] . " - " . $pkgent['pfsense_package'] . " and its dependencies ... This could take a moment ...");
237
    fwrite($fd_log, "Downloading and installing " . $pkgent['name'] . " - " . $pkgent['pfsense_package'] . " ... \n");
238

    
239
    update_progress_bar($pb_percent);
240
    $pb_percent += 10;
241

    
242
    if ($pkgent['pfsense_package_base_url'] <> "") {
243
        $text = exec_command_and_return_text("cd /tmp/ && /usr/sbin/pkg_add -r " . $pkgent['pfsense_package_base_url'] . "/" . $pkgent['pfsense_package']);
244
        update_output_window($text);
245
        fwrite($fd_log, "Executing: cd /tmp/ && /usr/sbin/pkg_add -r " . $pkgent['pfsense_package_base_url'] . "/" . $pkgent['pfsense_package'] . "\n" . $text);
246
    }
247

    
248
    update_progress_bar($pb_percent);
249
    $pb_percent += 10;
250

    
251
    if ($pkgent['depends_on_package_base_url'] <> "") {
252
                update_status("Downloading and installing " . $pkgent['name'] . " and its dependencies ... This could take a moment ...");
253
                $text = exec_command_and_return_text("cd /tmp/ && /usr/sbin/pkg_add -r " . $pkgent['depends_on_package_base_url'] . "/" . $pkgent['depends_on_package']);
254
                update_output_window($text);
255
                fwrite($fd_log, "cd /tmp/ && /usr/sbin/pkg_add -r " . $pkgent['depends_on_package_base_url'] . "/" . $pkgent['depends_on_package'] . "\n" . $text);;
256
    }
257

    
258
    if ($pkgent['depends_on_package_base_url'] <> "" or $pkgent['pfsense_package_base_url'] <> "") {
259
        $status = exec_command_and_return_text("ls /var/db/pkg | grep " . $pkgent['name']);
260
        fwrite($fd_log, "ls /var/db/pkg | grep " . $pkgent['name'] . "\n" . $status);
261
        if($status <> "") {
262
                    update_status("Package installed.  Lets finish up.");
263
                    fwrite($fd_log, "Package installed.  Lets finish up.\n");
264
        } else {
265
                    fwrite($fd_log, "Package WAS NOT installed properly.\n");
266
                    fclose($fd_log);
267
                    $filecontents = exec_command_and_return_text("cat " . $file);
268
                    update_progress_bar(100);
269
                    echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>";
270
                    echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>";
271
                    update_status("Package WAS NOT installed properly...Something went wrong..\n" . $filecontents);
272
                    update_output_window("Error during package installation.");
273
                    sleep(1);
274
                    die;
275
        }
276
    }
277

    
278
    update_progress_bar($pb_percent);
279
    $pb_percent += 10;
280

    
281
    $config = parse_xml_config("{$g['conf_path']}/config.xml", $g['xml_rootobj']);
282

    
283
    update_progress_bar($pb_percent);
284
    $pb_percent += 10;
285

    
286
    $config['installedpackages']['package'][] = $pkgent;
287

    
288
    if (isset($id) && $a_out[$id])
289
            $a_out[$id] = $pkgent;
290
    else
291
            $a_out[] = $pkgent;
292

    
293
    update_progress_bar($pb_percent);
294
    $pb_percent += 10;
295

    
296
    if(!$_GET['mode'] == "reinstallall") {
297
        update_output_window("Saving updated package information ...");
298
        fwrite($fd_log, "Saving updated package information ...\n");
299
        write_config();
300
    }
301

    
302
    update_progress_bar($pb_percent);
303
    $pb_percent += 10;
304

    
305
    $name = $pkgent['name'];
306

    
307
    update_progress_bar($pb_percent);
308
    $pb_percent++;
309

    
310
    /*
311
     * parse the config file for this package and install neededtext items.
312
     *
313
    */
314
    if(file_exists("/usr/local/pkg/" . $pkgent['name'] . ".xml")) {
315
                $package_conf = parse_xml_config_pkg("/usr/local/pkg/" . $pkgent['name'] . ".xml", "packagegui");
316
                if($package_conf['modify_system']['item'] <> "") {
317
                    foreach ($package_conf['modify_system']['item'] as $ms) {
318
                        update_progress_bar($pb_percent);
319
                        $pb_percent += 10;
320
                        if($ms['textneeded']) {
321
                            add_text_to_file($ms['modifyfilename'],$ms['textneeded']);
322
                        }
323
                    }
324
                }
325

    
326
                /*
327
                 * fetch additional files needed for package if defined
328
                 * and uncompress if needed.
329
                 */
330
                if ($package_conf['additional_files_needed'] <> "") {
331
                            foreach($package_conf['additional_files_needed']['item'] as $afn) {
332
                                        update_progress_bar($pb_percent);
333
                                        $pb_percent += 10;
334
                                        $filename = get_filename_from_url($afn);
335
                                        fwrite($fd_log, "Downloading additional files needed for package " . $filename . " ...\n");
336
                                        update_status("Downloading additional files needed for package " . $filename . " ...\n");
337
                                        system("cd /usr/local/pkg && /usr/bin/fetch " .  $afn . " 2>/dev/null");
338
                                        if(stristr($filename, ".tgz") <> "") {
339
                                                    update_status("Extracting tgz archive to -C for " . $filename);
340
                                                    fwrite($fd_log, "Extracting tgz archive to -C for " . $filename . " ...\n");
341
                                                    system("/usr/bin/tar xzvf /usr/local/pkg/" . $filename . " -C / >/dev/null 2>&1");
342
                                        }
343
                            }
344
                }
345

    
346
                /*
347
                 * loop through menu installation items
348
                 * installing multiple items if need be.
349
                */
350
                if(is_array($package_conf['menu']))
351
                    foreach ($package_conf['menu'] as $menu) {
352
                                // install menu item into the ext folder
353
                                fwrite($fd_log, "Adding menu option to " . $menu['section'] . "/" . $menu['name'] . "\n");
354
                                $fd = fopen("/usr/local/www/ext/" . $menu['section'] . "/" . $menu['name'] , "w");
355
                                if($menu['url'] <> "") {
356
                                            // override $myurl for script.
357
                                            $toeval = "\$myurl = \"" . getenv("HTTP_HOST") . "\"; \n";
358
                                            eval($toeval);
359
                                            // eval url so that above $myurl item can be processed if need be.
360
                                            $urltmp = $menu['url'];
361
                                            $toeval = "\$url = \"" . $urltmp . "\"; \n";
362
                                            eval($toeval);
363
                                            fwrite($fd, $url . "\n");
364
                                } else {
365
                                            $xml = "";
366
                                            if(stristr($menu['configfile'],".xml") == "") $xml = ".xml";
367
                                            fwrite($fd, "/pkg.php?xml=" . $menu['configfile'] . $xml . "\n");
368
                                }
369
                                fclose($fd);
370
                }
371
    } else {
372
                update_output_window("WARNING! /usr/local/pkg/" . $pkgent['name'] . ".xml" . " does not exist!\n");
373
                fwrite($fd_log, "WARNING! /usr/local/pkg/" . $pkgent['name'] . ".xml" . " does not exist!\n");
374
    }
375
    fwrite($fd_log, "End of Package Manager installation session.\n");
376

    
377
    update_progress_bar($pb_percent);
378
    $pb_percent += 10;
379

    
380
    // return dependency list to output later.
381
    $command = "TODELETE=`ls /var/db/pkg | grep " . $name . "` && /usr/sbin/pkg_info -r \$TODELETE | grep Dependency: | cut -d\" \" -f2";
382
    $dependencies = exec_command_and_return_text($command);
383
    if($dependencies == "")
384
        fwrite($fd_log, "Installed package " . $name);
385
    else
386
        fwrite($fd_log, "Installed package " . $name . " and the following dependencies:\n" . $dependencies);
387

    
388
    update_progress_bar($pb_percent);
389
    $pb_percent += 10;
390

    
391
    if($package_conf['custom_php_install_command']) {
392
        fwrite($fd_log, "Executing post install commands...\n");
393
        update_status("Executing post install commands...\n");
394
        $pb_percent += 50;
395
        update_progress_bar(50);
396
        eval($package_conf['custom_php_install_command']);
397
    }
398

    
399
    $pb_percent += 10;
400
    update_progress_bar($pb_percent);
401

    
402
    if ($pkgent['depends_on_package_base_url'] <> "" or $pkgent['pfsense_package_base_url'] <> "") {
403
        $status = exec_command_and_return_text("ls /var/db/pkg | grep " . $pkgent['name']);
404
        fwrite($fd_log, "ls /var/db/pkg | grep " . $pkgent['name'] . "\n" . $status);
405
        if($status <> "") {
406
                    update_status("Package installation completed.");
407
                    fwrite($fd_log, "Package installation completed.\n");
408
                    log_error("Package " . $pkgent['name'] . " installation completed okay.");
409
        } else {
410
                    update_status("Package WAS NOT installed properly.");
411
                    fwrite($fd_log, "Package WAS NOT installed properly.\n");
412
                    log_error("Package " . $pkgent['name'] . " did not install correctly.");
413
        }
414
    } else {
415
        update_status("Package installation completed.");
416
        fwrite($fd_log, "Package installation completed.\n");
417
    }
418

    
419
    update_progress_bar(100);
420

    
421
}
422

    
423
// close log
424
fclose($fd_log);
425

    
426
echo "<p><center>Installation completed.  Show <a href=\"pkg_mgr_install.php?showlog=true\">install log</a></center>";
427

    
428
echo "\n<script language=\"JavaScript\">document.progressbar.style.visibility='hidden';</script>";
429
echo "\n<script language=\"JavaScript\">document.progholder.style.visibility='hidden';</script>";
430

    
431

    
432

    
433
?>
434

    
435

    
436

    
437

    
438

    
439

    
440

    
441

    
442

    
(56-56/100)