Project

General

Profile

Download (9.13 KB) Statistics
| Branch: | Tag: | Revision:
1 ee11cc6e Scott Ullrich
<?php
2
/*
3 c5d81585 Renato Botelho
 * pkg_mgr.php
4
 *
5
 * part of pfSense (https://www.pfsense.org)
6 b8f91b7c Luiz Souza
 * Copyright (c) 2004-2018 Rubicon Communications, LLC (Netgate)
7 c5d81585 Renato Botelho
 * Copyright (c) 2013 Marcello Coutinho
8
 * All rights reserved.
9
 *
10 b12ea3fb Renato Botelho
 * Licensed under the Apache License, Version 2.0 (the "License");
11
 * you may not use this file except in compliance with the License.
12
 * You may obtain a copy of the License at
13 c5d81585 Renato Botelho
 *
14 b12ea3fb Renato Botelho
 * http://www.apache.org/licenses/LICENSE-2.0
15 c5d81585 Renato Botelho
 *
16 b12ea3fb Renato Botelho
 * Unless required by applicable law or agreed to in writing, software
17
 * distributed under the License is distributed on an "AS IS" BASIS,
18
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
19
 * See the License for the specific language governing permissions and
20
 * limitations under the License.
21 239b5161 Stephen Beaver
 */
22 ee11cc6e Scott Ullrich
23 6b07c15a Matthew Grooms
##|+PRIV
24
##|*IDENT=page-system-packagemanager
25 5230f468 jim-p
##|*NAME=System: Package Manager
26 6b07c15a Matthew Grooms
##|*DESCR=Allow access to the 'System: Package Manager' page.
27
##|*MATCH=pkg_mgr.php*
28
##|-PRIV
29
30 0089af7c Scott Ullrich
ini_set('max_execution_time', '0');
31
32 9bcf197e Scott Ullrich
require_once("globals.inc");
33 9f9dcd98 Scott Ullrich
require_once("guiconfig.inc");
34 f8e335a3 Scott Ullrich
require_once("pkg-utils.inc");
35 ee11cc6e Scott Ullrich
36 4832ed98 BBcan177
// if upgrade in progress, alert user
37 0f649c97 Phil Davis
if (is_subsystem_dirty('packagelock')) {
38
	$pgtitle = array(gettext("System"), gettext("Package Manager"));
39 edcd7535 Phil Davis
	$pglinks = array("", "@self");
40 261c7de8 jim-p
	include("head.inc");
41 3b3a95e5 Phil Davis
	print_info_box("Please wait while packages are reinstalled in the background.");
42 31f03b6c Sjon Hortensius
	include("foot.inc");
43 261c7de8 jim-p
	exit;
44
}
45 31f03b6c Sjon Hortensius
46 146dbf01 Phil Davis
// We are being called only to get the package data, not to display anything
47 875a9486 Stephen Beaver
if (($_REQUEST) && ($_REQUEST['ajax'])) {
48
	print(get_pkg_table());
49
	exit;
50
}
51 7409fde6 Stephen Beaver
52 146dbf01 Phil Davis
// The content for the table of packages is created here and fetched by Ajax. This allows us to draw the page and display
53
// any required messages while the table is being downloaded/populated. On very small/slow systems, that can take a while
54 875a9486 Stephen Beaver
function get_pkg_table() {
55 cc28e9b1 Renato Botelho
	$pkg_info = get_pkg_info('all', true, false);
56 5c22f8ef Stephen Beaver
57 875a9486 Stephen Beaver
	if (!$pkg_info) {
58
		print("error");
59
		exit;
60 0f649c97 Phil Davis
	}
61 31f03b6c Sjon Hortensius
62 875a9486 Stephen Beaver
	$pkgtbl = 	'<table id="pkgtable" class="table table-striped table-hover">' . "\n";
63
	$pkgtbl .= 		'<thead>' . "\n";
64
	$pkgtbl .= 			'<tr>' . "\n";
65
	$pkgtbl .= 				'<th>' . gettext("Name") . "</th>\n";
66
	$pkgtbl .= 				'<th>' . gettext("Version") . "</th>\n";
67
	$pkgtbl .= 				'<th>' . gettext("Description") . "</th>\n";
68
	$pkgtbl .= 				'<th></th>' . "\n";
69
	$pkgtbl .= 			'</tr>' . "\n";
70
	$pkgtbl .= 		'</thead>' . "\n";
71
	$pkgtbl .= 		'<tbody>' . "\n";
72
73
	foreach ($pkg_info as $index) {
74 5286277f Steve Beaver
		//AutoConfigBackup not to be installed >= v 2.4.4
75
		if (isset($index['installed']) || ($index['shortname'] == "AutoConfigBackup")) {
76 875a9486 Stephen Beaver
			continue;
77
		}
78
79
		$pkgtbl .= 	'<tr>' . "\n";
80
		$pkgtbl .= 	'<td>' . "\n";
81
82 7940050b lukehamburg
		if (($index['www']) && ($index['www'] != "UNKNOWN")) {
83 875a9486 Stephen Beaver
			$pkgtbl .= 	'<a title="' . gettext("Visit official website") . '" target="_blank" href="' . htmlspecialchars($index['www']) . '">' . "\n";
84 7940050b lukehamburg
			$pkgtbl .= htmlspecialchars($index['shortname']) . '</a>' . "\n";
85
		} else {
86
			$pkgtbl .= htmlspecialchars($index['shortname']);
87 875a9486 Stephen Beaver
		}
88
		$pkgtbl .= 	'</td>' . "\n";
89
		$pkgtbl .= 	'<td>' . "\n";
90
91
		if (!$g['disablepackagehistory']) {
92
			$pkgtbl .= '<a target="_blank" title="' . gettext("View changelog") . '" href="' . htmlspecialchars($index['changeloglink']) . '">' . "\n";
93
			$pkgtbl .= htmlspecialchars($index['version']) . '</a>' . "\n";
94
		} else {
95
			$pkgtbl .= htmlspecialchars($index['version']);
96
		}
97
98
		$pkgtbl .= 	'</td>' . "\n";
99
		$pkgtbl .= 	'<td>' . "\n";
100
		$pkgtbl .= 		$index['desc'];
101
102
		if (is_array($index['deps']) && count($index['deps'])) {
103 0a5fbe89 jim-p
			$pkgtbl .= 	'<br /><br />' . gettext("Package Dependencies") . ":<br/>\n";
104 875a9486 Stephen Beaver
105
			foreach ($index['deps'] as $pdep) {
106 0a5fbe89 jim-p
				$pkgtbl .= '<a target="_blank" href="https://freshports.org/' . $pdep['origin'] . '">&nbsp;<i class="fa fa-paperclip"></i> ' . basename($pdep['origin']) . '-' . $pdep['version'] . '</a>&emsp;' . "\n";
107 875a9486 Stephen Beaver
			}
108
109 0a5fbe89 jim-p
			$pkgtbl .= "\n";
110 875a9486 Stephen Beaver
		}
111
112
		$pkgtbl .= 	'</td>' . "\n";
113
		$pkgtbl .= '<td>' . "\n";
114 756ef4df Renato Botelho
		$pkgtbl .= '<a title="' . gettext("Click to install") . '" href="pkg_mgr_install.php?pkg=' . $index['name'] . '" class="btn btn-success btn-sm"><i class="fa fa-plus icon-embed-btn"></i>Install</a>' . "\n";
115 31f03b6c Sjon Hortensius
116 875a9486 Stephen Beaver
		if (!$g['disablepackageinfo'] && $index['pkginfolink'] && $index['pkginfolink'] != $index['www']) {
117
			$pkgtbl .= '<a target="_blank" title="' . gettext("View more information") . '" href="' . htmlspecialchars($index['pkginfolink']) . '" class="btn btn-default btn-sm">info</a>' . "\n";
118 31f03b6c Sjon Hortensius
		}
119 875a9486 Stephen Beaver
120
		$pkgtbl .= 	'</td>' . "\n";
121
		$pkgtbl .= 	'</tr>' . "\n";
122 f70121be Renato Botelho
	}
123 5c22f8ef Stephen Beaver
124 875a9486 Stephen Beaver
	$pkgtbl .= 	'</tbody>' . "\n";
125
	$pkgtbl .= '</table>' . "\n";
126 29840546 Renato Botelho
127 875a9486 Stephen Beaver
	return ($pkgtbl);
128
}
129 4832ed98 BBcan177
130 875a9486 Stephen Beaver
$pgtitle = array(gettext("System"), gettext("Package Manager"), gettext("Available Packages"));
131 edcd7535 Phil Davis
$pglinks = array("", "pkg_mgr_installed.php", "@self");
132 875a9486 Stephen Beaver
include("head.inc");
133 98dfca18 Stephen Beaver
134 875a9486 Stephen Beaver
$tab_array = array();
135
$tab_array[] = array(gettext("Installed Packages"), false, "pkg_mgr_installed.php");
136 3cff35f1 k-paulius
$tab_array[] = array(gettext("Available Packages"), true, "pkg_mgr.php");
137 875a9486 Stephen Beaver
display_top_tabs($tab_array);
138
?>
139
<div class="panel panel-default" id="search-panel" style="display: none;">
140 95fa5cce Phil Davis
	<div class="panel-heading">
141
		<h2 class="panel-title">
142
			<?=gettext('Search')?>
143
			<span class="widget-heading-icon pull-right">
144
				<a data-toggle="collapse" href="#search-panel_panel-body">
145
					<i class="fa fa-plus-circle"></i>
146
				</a>
147
			</span>
148
		</h2>
149 98dfca18 Stephen Beaver
	</div>
150 4832ed98 BBcan177
	<div id="search-panel_panel-body" class="panel-body collapse in">
151 98dfca18 Stephen Beaver
		<div class="form-group">
152
			<label class="col-sm-2 control-label">
153 4832ed98 BBcan177
				<?=gettext("Search term")?>
154 98dfca18 Stephen Beaver
			</label>
155
			<div class="col-sm-5"><input class="form-control" name="searchstr" id="searchstr" type="text"/></div>
156 3a28934c Stephen Beaver
			<div class="col-sm-2">
157
				<select id="where" class="form-control">
158
					<option value="0"><?=gettext("Name")?></option>
159
					<option value="1"><?=gettext("Description")?></option>
160 1da8a2e3 Stephen Beaver
					<option value="2" selected><?=gettext("Both")?></option>
161 3a28934c Stephen Beaver
				</select>
162
			</div>
163 995df6c3 Stephen Beaver
			<div class="col-sm-3">
164 5542d069 jim-p
				<a id="btnsearch" title="<?=gettext("Search")?>" class="btn btn-primary btn-sm"><i class="fa fa-search icon-embed-btn"></i><?=gettext("Search")?></a>
165
				<a id="btnclear" title="<?=gettext("Clear")?>" class="btn btn-info btn-sm"><i class="fa fa-undo icon-embed-btn"></i><?=gettext("Clear")?></a>
166 995df6c3 Stephen Beaver
			</div>
167 98dfca18 Stephen Beaver
			<div class="col-sm-10 col-sm-offset-2">
168 cadeb9fd Phil Davis
				<span class="help-block"><?=gettext('Enter a search string or *nix regular expression to search package names and descriptions.')?></span>
169 98dfca18 Stephen Beaver
			</div>
170
		</div>
171
	</div>
172
</div>
173
174
<div class="panel panel-default">
175
	<div class="panel-heading"><h2 class="panel-title"><?=gettext('Packages')?></h2></div>
176 875a9486 Stephen Beaver
	<div id="pkgtbl" class="panel-body table-responsive">
177
		<div id="waitmsg">
178 f6aebbcc NewEraCracker
			<?php print_info_box(gettext("Please wait while the list of packages is retrieved and formatted.") . '&nbsp;<i class="fa fa-cog fa-spin"></i>'); ?>
179 875a9486 Stephen Beaver
		</div>
180 0071ef19 Stephen Beaver
181 875a9486 Stephen Beaver
		<div id="errmsg" style="display: none;">
182 f6aebbcc NewEraCracker
			<?php print_info_box("<ul><li>" . gettext("Unable to retrieve package information.") . "</li></ul>", 'danger'); ?>
183 875a9486 Stephen Beaver
		</div>
184 89f64f0f Sander van Leeuwen
	</div>
185 98dfca18 Stephen Beaver
</div>
186
187 8fd9052f Colin Fleming
<script type="text/javascript">
188 98dfca18 Stephen Beaver
//<![CDATA[
189 875a9486 Stephen Beaver
190 0f649c97 Phil Davis
events.push(function() {
191 98dfca18 Stephen Beaver
192 6c36aab3 Stephen Beaver
	// Initial state & toggle icons of collapsed panel
193 0f649c97 Phil Davis
	$('.panel-heading a[data-toggle="collapse"]').each(function (idx, el) {
194 6c36aab3 Stephen Beaver
		var body = $(el).parents('.panel').children('.panel-body')
195
		var isOpen = body.hasClass('in');
196
197 1b7379f9 Jared Dillard
		$(el).children('i').toggleClass('fa-plus-circle', !isOpen);
198
		$(el).children('i').toggleClass('fa-minus-circle', isOpen);
199 6c36aab3 Stephen Beaver
200 0f649c97 Phil Davis
		body.on('shown.bs.collapse', function() {
201 1b7379f9 Jared Dillard
			$(el).children('i').toggleClass('fa-minus-circle', true);
202
			$(el).children('i').toggleClass('fa-plus-circle', false);
203 6c36aab3 Stephen Beaver
		});
204
	});
205
206 1da8a2e3 Stephen Beaver
	// Make these controls plain buttons
207 0f649c97 Phil Davis
	$("#btnsearch").prop('type', 'button');
208
	$("#btnclear").prop('type', 'button');
209 919d91f9 Phil Davis
210 1da8a2e3 Stephen Beaver
	// Search for a term in the package name and/or description
211 3a28934c Stephen Beaver
	$("#btnsearch").click(function() {
212
		var searchstr = $('#searchstr').val().toLowerCase();
213
		var table = $("table tbody");
214
		var where = $('#where').val();
215
216
		table.find('tr').each(function (i) {
217
			var $tds = $(this).find('td'),
218
				shortname = $tds.eq(0).text().trim().toLowerCase(),
219
				descr = $tds.eq(2).text().trim().toLowerCase();
220
221
			regexp = new RegExp(searchstr);
222 0f649c97 Phil Davis
			if (searchstr.length > 0) {
223
				if (!(regexp.test(shortname) && (where != 1)) && !(regexp.test(descr) && (where != 0))) {
224 3a28934c Stephen Beaver
					$(this).hide();
225
				} else {
226
					$(this).show();
227
				}
228
			} else {
229 d2364df7 Stephen Beaver
				$(this).show();	// A blank search string shows all
230 3a28934c Stephen Beaver
			}
231
		});
232
	});
233
234 1da8a2e3 Stephen Beaver
	// Clear the search term and unhide all rows (that were hidden during a previous search)
235 3a28934c Stephen Beaver
	$("#btnclear").click(function() {
236
		var table = $("table tbody");
237
238 1da8a2e3 Stephen Beaver
		$('#searchstr').val("");
239
240 3a28934c Stephen Beaver
		table.find('tr').each(function (i) {
241
			$(this).show();
242
		});
243
	});
244 919d91f9 Phil Davis
245 1da8a2e3 Stephen Beaver
	// Hitting the enter key will do the same as clicking the search button
246
	$("#searchstr").on("keyup", function (event) {
247 0f649c97 Phil Davis
	    if (event.keyCode == 13) {
248 1da8a2e3 Stephen Beaver
	        $("#btnsearch").get(0).click();
249
	    }
250
	});
251 d2364df7 Stephen Beaver
252 146dbf01 Phil Davis
	// Retrieve the table formatted package information and display it in the "Packages" panel
253 875a9486 Stephen Beaver
	// (Or display an appropriate error message)
254
	var ajaxRequest;
255
256
	$.ajax({
257
		url: "/pkg_mgr.php",
258
		type: "post",
259
		data: { ajax: "ajax"},
260
		success: function(data) {
261
			if (data == "error") {
262
				$('#waitmsg').hide();
263
				$('#errmsg').show();
264
			} else {
265
				$('#pkgtbl').html(data);
266
				$('#search-panel').show();
267
			}
268
		},
269
		error: function() {
270
			$('#waitmsg').hide();
271
			$('#errmsg').show();
272
		}
273
	});
274
275 98dfca18 Stephen Beaver
});
276
//]]>
277
</script>
278
279 6c36aab3 Stephen Beaver
<?php include("foot.inc");
280 4832ed98 BBcan177
?>