Subversion Repositories ALCASAR

Rev

Rev 859 | Rev 862 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 859 Rev 861
1
<?php
1
<?php
2
/* written by steweb57 & Rexy */
2
/* written by steweb57 & Rexy */
3
 
3
 
4
/***************************************
4
/********************
5
* CONSTANTES AVEC CHEMINS DES FICHIERS *
5
* TEST CONF FILES   *
6
****************************************/
6
*********************/
7
define ("ALCASAR_CHILLI", "/etc/chilli.conf");
7
define ("ALCASAR_CHILLI", "/etc/chilli.conf");
8
define ("CONF_FILE", "/usr/local/etc/alcasar.conf");
8
define ("CONF_FILE", "/usr/local/etc/alcasar.conf");
9
define ("ETHERS_FILE", "/usr/local/etc/alcasar-ethers");
9
define ("ETHERS_FILE", "/usr/local/etc/alcasar-ethers");
10
 
-
 
11
/********************
-
 
12
* TEST DES FICHIERS *
-
 
13
*********************/
-
 
14
//Test de présence et des droits en lecture des fichiers de configuration.
-
 
15
if (!file_exists(ALCASAR_CHILLI)){
10
$conf_files=array(ALCASAR_CHILLI,CONF_FILE,ETHERS_FILE);
16
	exit("Fichier de configuration ".ALCASAR_CHILLI." non présent");
-
 
17
}
-
 
18
if (!is_readable(ALCASAR_CHILLI)){
11
foreach ($conf_files as $file){
19
	exit("Vous n'avez pas les droits de lecture sur le fichier ".ALCASAR_CHILLI);
-
 
20
}
-
 
21
if (!file_exists(CONF_FILE)){
12
if (!file_exists($file)){
22
	exit("Fichier de configuration ".CONF_FILE." non présent");
13
	exit("Requested file ".$file." isn't present");}
23
}
-
 
24
if (!is_readable(CONF_FILE)){
14
if (!is_readable($file)){
25
	exit("Vous n'avez pas les droits de lecture sur le fichier ".CONF_FILE);
-
 
26
}
-
 
27
if (!file_exists(ETHERS_FILE)){
-
 
28
	exit("Fichier de configuration ".ETHERS_FILE." non présent");
-
 
29
}
-
 
30
if (!is_readable(ETHERS_FILE)){
15
	exit("Can't read the file ".$file);}
31
	exit("Vous n'avez pas les droits de lecture sur le fichier ".ETHERS_FILE);
-
 
32
}
16
}
33
 
17
 
34
# Choice of language
18
# Choice of language
35
$Language = 'en';
19
$Language = 'en';
36
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
20
if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){
37
	$Langue		= explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
21
	$Langue		= explode(",",$_SERVER['HTTP_ACCEPT_LANGUAGE']);
38
	$Language	= strtolower(substr(chop($Langue[0]),0,2)); }
22
	$Language	= strtolower(substr(chop($Langue[0]),0,2)); }
39
if($Language == 'fr'){
23
if($Language == 'fr'){
40
	$l_network_title	= "Configuration réseau";
24
	$l_network_title	= "Configuration réseau";
41
	$l_eth0_legend		= "Eth0 (Interface connectée à Internet)";
25
	$l_eth0_legend		= "Eth0 (Interface connectée à Internet)";
42
	$l_eth1_legend		= "Eth1 (Réseau de consultation)";
26
	$l_eth1_legend		= "Eth1 (Réseau de consultation)";
43
	$l_internet_legend	= "INTERNET";
27
	$l_internet_legend	= "INTERNET";
44
	$l_ip_adr		= "Adresse IP";
28
	$l_ip_adr		= "Adresse IP";
45
	$l_ip_mask		= "Masque";
29
	$l_ip_mask		= "Masque";
46
	$l_ip_router		= "Passerelle";
30
	$l_ip_router		= "Passerelle";
47
	$l_ip_public		= "Adresse IP publique";
31
	$l_ip_public		= "Adresse IP publique";
48
	$l_ip_dns1		= "DNS1";
32
	$l_ip_dns1		= "DNS1";
49
	$l_ip_dns2		= "DNS2";
33
	$l_ip_dns2		= "DNS2";
50
	$l_dhcp_title		= "Serveur DHCP";
34
	$l_dhcp_title		= "Service DHCP";
51
	$l_dhcp_on		= "Le service DHCP est actuellement activé";
35
	$l_DHCP_full		= "DHCP complet";
-
 
36
	$l_DHCP_half		= "Demi DHCP ";
-
 
37
	$l_DHCP_off		= "Sans DHCP";
52
	$l_dhcp_off		= "Le service DHCP est actuellement arrêté";
38
	$l_DHCP_full_explain	= "DHCP complet";
53
	$l_switch_on		= "Démarrer le service DHCP";
39
	$l_DHCP_half_explain	= "Demi DHCP ";
54
	$l_switch_off		= "Arrêter le service DHCP";
40
	$l_DHCP_off_explain	= "Sans DHCP";
55
	$l_static_dhcp_title	= "Réservation d'adresses IP statiques";
41
	$l_static_dhcp_title	= "Réservation d'adresses IP statiques";
56
	$l_mac_address		= "Adresse MAC";
42
	$l_mac_address		= "Adresse MAC";
57
	$l_ip_address		= "Adresse IP";
43
	$l_ip_address		= "Adresse IP";
58
	$l_mac_del		= "Supprimer de la liste";
44
	$l_mac_del		= "Supprimer de la liste";
59
	$l_add_to_list		= "Ajouter";
45
	$l_add_to_list		= "Ajouter";
60
	$l_submit		= "Appliquer";
46
	$l_apply		= "Appliquer les changements";
61
 
47
 
62
} else {
48
} else {
63
	$l_network_title	= "Network configuration";
49
	$l_network_title	= "Network configuration";
64
	$l_eth0_legend		= "Eth0 (Internet connected interface)";
50
	$l_eth0_legend		= "Eth0 (Internet connected interface)";
65
	$l_eth1_legend		= "Eth1 (Private network)";
51
	$l_eth1_legend		= "Eth1 (Private network)";
66
	$l_internet_legend	= "INTERNET";
52
	$l_internet_legend	= "INTERNET";
67
	$l_ip_adr		= "IP Address";
53
	$l_ip_adr		= "IP Address";
68
	$l_ip_mask		= "Mask";
54
	$l_ip_mask		= "Mask";
69
	$l_ip_router		= "Gateway";
55
	$l_ip_router		= "Gateway";
70
	$l_ip_public		= "Public IP address";
56
	$l_ip_public		= "Public IP address";
71
	$l_ip_dns1		= "DNS1 :";
57
	$l_ip_dns1		= "DNS1 :";
72
	$l_ip_dns2		= "DNS2";
58
	$l_ip_dns2		= "DNS2";
73
	$l_dhcp_title		= "DHCP server";
59
	$l_dhcp_title		= "DHCP service";
-
 
60
	$l_DHCP_full		= "Full DHCP";
74
	$l_dhcp_on		= "The DHCP service is enabled";
61
	$l_DHCP_half		= "Half DHCP ";
75
	$l_dhcp_off		= "The DHCP service is disabled";
62
	$l_DHCP_off		= "No DHCP";
-
 
63
	$l_DHCP_full_explain	= "Full DHCP";
76
	$l_switch_on		= "Start the DHCP service";
64
	$l_DHCP_half_explain	= "Half DHCP ";
77
	$l_switch_off		= "Stop the DHCP service";
65
	$l_DHCP_off_explain	= "No DHCP";
78
	$l_static_dhcp_title	= "Static IP addresses reservation";
66
	$l_static_dhcp_title	= "Static IP addresses reservation";
79
	$l_mac_address		= "MAC Address";
67
	$l_mac_address		= "MAC Address";
80
	$l_ip_address		= "IP Address";
68
	$l_ip_address		= "IP Address";
81
	$l_mac_del		= "Delete from list";
69
	$l_mac_del		= "Delete from list";
82
	$l_add_to_list		= "Add";
70
	$l_add_to_list		= "Add";
83
	$l_submit		= "Apply";
71
	$l_apply		= "Apply changes";
84
}
72
}
85
if (isset($_POST['choix'])){$choix=$_POST['choix'];} else {$choix="";}
73
if (isset($_POST['choix'])){$choix=$_POST['choix'];} else {$choix="";}
86
switch ($choix)
74
switch ($choix)
87
{
75
{
88
case 'DHCP_On' :
76
case 'DHCP_Full' :
89
	exec ("sudo /usr/local/sbin/alcasar-dhcp.sh -on");
77
	exec ("sudo /usr/local/sbin/alcasar-dhcp.sh -full");
90
	break;
78
	break;
91
case 'DHCP_Off' :
79
case 'DHCP_Off' :
92
	exec ("sudo /usr/local/sbin/alcasar-dhcp.sh -off");
80
	exec ("sudo /usr/local/sbin/alcasar-dhcp.sh -off");
93
	break;
81
	break;
-
 
82
case 'DHCP_Half' :
-
 
83
	exec ("sudo /usr/local/sbin/alcasar-dhcp.sh -half");
-
 
84
	break;
94
case 'new_mac' :
85
case 'new_mac' :
95
	if ((trim($_POST['add_mac']) != "") and (trim($_POST['add_ip']) != ""))
86
	if ((trim($_POST['add_mac']) != "") and (trim($_POST['add_ip']) != ""))
96
		{
87
		{
97
		$tab=file(ETHERS_FILE);
88
		$tab=file(ETHERS_FILE);
98
		$insert="True";
89
		$insert="True";
99
		if ($tab)  # le fichier n'est pas vide
90
		if ($tab)  # le fichier n'est pas vide
100
			{
91
			{
101
			foreach ($tab as $line)  # verify that MAC or IP addresses doesn't exist
92
			foreach ($tab as $line)  # verify that MAC or IP addresses doesn't exist
102
				{
93
				{
103
				$field=explode(" ", $line);
94
				$field=explode(" ", $line);
104
				$mac_addr=trim($field[0]);$ip_addr=trim($field[1]);
95
				$mac_addr=trim($field[0]);$ip_addr=trim($field[1]);
105
				if (strcasecmp(trim($_POST['add_mac']),trim($mac_addr)) == 0)
96
				if (strcasecmp(trim($_POST['add_mac']),trim($mac_addr)) == 0)
106
					{
97
					{
107
					$insert="False";
98
					$insert="False";
108
					break;
99
					break;
109
					}
100
					}
110
				if (strcasecmp(trim($_POST['add_ip']), trim($ip_addr)) == 0)
101
				if (strcasecmp(trim($_POST['add_ip']), trim($ip_addr)) == 0)
111
					{
102
					{
112
					$insert="False";
103
					$insert="False";
113
					break;
104
					break;
114
					}
105
					}
115
				}
106
				}
116
			}
107
			}
117
		if ($insert == "True") 
108
		if ($insert == "True") 
118
			{
109
			{
119
			$line = trim($_POST['add_mac']) . " " . trim($_POST['add_ip']) . "\n";
110
			$line = trim($_POST['add_mac']) . " " . trim($_POST['add_ip']) . "\n";
120
			$pointeur=fopen(ETHERS_FILE,"a");
111
			$pointeur=fopen(ETHERS_FILE,"a");
121
			fwrite ($pointeur, $line);
112
			fwrite ($pointeur, $line);
122
			fclose ($pointeur);
113
			fclose ($pointeur);
123
			exec ("sudo service chilli restart");
114
			exec ("sudo service chilli restart");
124
			}
115
			}
125
		}
116
		}
126
	break;
117
	break;
127
case 'del_mac' :
118
case 'del_mac' :
128
	$tab=file(ETHERS_FILE);
119
	$tab=file(ETHERS_FILE);
129
	if ($tab)
120
	if ($tab)
130
		{
121
		{
131
		$pointeur=fopen(ETHERS_FILE,"w+");
122
		$pointeur=fopen(ETHERS_FILE,"w+");
132
		foreach ($tab as $line)
123
		foreach ($tab as $line)
133
			{
124
			{
134
			$field=explode(" ", $line);
125
			$field=explode(" ", $line);
135
			$mac_addr=trim($field[0]);
126
			$mac_addr=trim($field[0]);
136
			$remove_line = False;
127
			$remove_line = False;
137
			foreach ($_POST as $key => $value)
128
			foreach ($_POST as $key => $value)
138
				{
129
				{
139
				if ($mac_addr == $key)
130
				if ($mac_addr == $key)
140
			       		{
131
			       		{
141
					$remove_line = True;
132
					$remove_line = True;
142
					break;
133
					break;
143
					}
134
					}
144
				}
135
				}
145
			if (! $remove_line) {fwrite($pointeur,$line);}
136
			if (! $remove_line) {fwrite($pointeur,$line);}
146
			}
137
			}
147
		fclose($pointeur);
138
		fclose($pointeur);
148
		# exec ("sudo service chilli restart");
139
		# exec ("sudo service chilli restart");
149
		}
140
		}
150
	break;
141
	break;
151
}
142
}
152
 
143
 
153
// Fonction de test de connectivité internet
144
// Fonction de test de connectivité internet
154
function internetTest(){
145
function internetTest(){
155
	$host = "www.google.fr"; # Google Test
146
	$host = "www.google.fr"; # Google Test
156
	$port = "80";
147
	$port = "80";
157
	//var $num;	//non utilisé
148
	//var $num;	//non utilisé
158
	//var $error;	//non utilisé
149
	//var $error;	//non utilisé
159
	
150
	
160
	if (! $sock = @fsockopen($host, $port, $num, $error, 5)) {
151
	if (! $sock = @fsockopen($host, $port, $num, $error, 5)) {
161
		return false;
152
		return false;
162
	} else {
153
	} else {
163
		fclose($sock);
154
		fclose($sock);
164
		return true;
155
		return true;
165
	}
156
	}
166
}
157
}
167
/********************************************************
158
/********************************************************
168
*		Lecture du fichier ALCASAR_CHILLI	*
159
*		Lecture du fichier ALCASAR_CHILLI	*
169
*********************************************************/
160
*********************************************************/
170
$ouvre=fopen(ALCASAR_CHILLI,"r");
161
$ouvre=fopen(ALCASAR_CHILLI,"r");
171
if ($ouvre){
162
if ($ouvre){
172
	while (!feof ($ouvre))
163
	while (!feof ($ouvre))
173
	{
164
	{
174
		$tampon = fgets($ouvre, 4096);
165
		$tampon = fgets($ouvre, 4096);
175
		if (strpos($tampon,"=")!==false){
166
		if (strpos($tampon,"=")!==false){
176
			$tmp = explode("=",$tampon);
167
			$tmp = explode("=",$tampon);
177
			$chilli[$tmp[0]] = $tmp[1];
168
			$chilli[$tmp[0]] = $tmp[1];
178
		}
169
		}
179
	}
170
	}
180
}else{
171
}else{
181
	exit("Erreur d'ouverture du fichier ".ALCASAR_CHILLI);
172
	exit("Erreur d'ouverture du fichier ".ALCASAR_CHILLI);
182
}
173
}
183
fclose($ouvre);
174
fclose($ouvre);
184
 
175
 
185
/****************************************************************
176
/***********************************
186
*		Lecture du fichier CONF_FILE			*
177
*	Read ALCASAR_CONF_FILE     *
187
*****************************************************************/
178
************************************/
188
$ouvre=fopen(CONF_FILE,"r");
179
$ouvre=fopen(CONF_FILE,"r");
189
if ($ouvre){
180
if ($ouvre){
190
	while (!feof ($ouvre))
181
	while (!feof ($ouvre))
191
	{
182
	{
192
		$tampon = fgets($ouvre, 4096);
183
		$tampon = fgets($ouvre, 4096);
193
		if (strpos($tampon,"=")!==false){
184
		if (strpos($tampon,"=")!==false){
194
			$tmp = explode("=",$tampon);
185
			$tmp = explode("=",$tampon);
195
			$conf[$tmp[0]] = $tmp[1];
186
			$conf[$tmp[0]] = $tmp[1];
196
		}
187
		}
197
	}
188
	}
198
}else{
189
}else{
199
	exit("Erreur d'ouverture du fichier ".CONF_FILE);
190
	exit("Erreur d'ouverture du fichier ".CONF_FILE);
200
}
191
}
201
fclose($ouvre);
192
fclose($ouvre);
202
 
193
 
203
/************************
194
/************************
204
*	TO DO		*
195
*	TO DO		*
205
*************************/
196
*************************/
206
//modification de la conf réseau  --> V3.0
197
//modification de la conf réseau  --> V3.0
207
 
198
 
208
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
199
?><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
209
<html><!-- written by steweb57 & rexy -->
200
<html><!-- written by steweb57 & rexy -->
210
<head>
201
<head>
211
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
202
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
212
<title><?php echo $l_network_title; ?></title>
203
<title><?php echo $l_network_title; ?></title>
213
<link rel="stylesheet" href="/css/style.css" type="text/css">
204
<link rel="stylesheet" href="/css/style.css" type="text/css">
214
</head>
205
</head>
215
<body>
206
<body>
216
<table width="100%" border="0" cellspacing="0" cellpadding="0">
207
<table width="100%" border="0" cellspacing="0" cellpadding="0">
217
	<tr><th><?php echo $l_network_title; ?></th></tr>
208
	<tr><th><?php echo $l_network_title; ?></th></tr>
218
	<tr bgcolor="#FFCC66"><td><img src="/images/pix.gif" width="1" height="2"></td></tr>
209
	<tr bgcolor="#FFCC66"><td><img src="/images/pix.gif" width="1" height="2"></td></tr>
219
</table>
210
</table>
220
<TABLE width="100%" border=1 cellspacing=0 cellpadding=1>
211
<TABLE width="100%" border=1 cellspacing=0 cellpadding=1>
221
	<tr><td valign="middle" align="left">
212
	<tr><td valign="middle" align="left">
222
	<fieldset>
213
	<fieldset>
223
	<legend><?php echo $l_internet_legend;
214
	<legend><?php echo $l_internet_legend;
224
 	if (InternetTest()){
215
 	if (InternetTest()){
225
		echo " <img src='/images/state_ok.gif'>";
216
		echo " <img src='/images/state_ok.gif'>";
226
		$IP_PUB = exec ("wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1");}
217
		$IP_PUB = exec ("wget http://checkip.dyndns.org/ -O - -o /dev/null | cut -d: -f 2 | cut -d\< -f 1");}
227
	else 	{
218
	else 	{
228
		echo " <img src='/images/state_error.gif'>";
219
		echo " <img src='/images/state_error.gif'>";
229
		$IP_PUB = "-.-.-.-";}
220
		$IP_PUB = "-.-.-.-";}
230
	?></legend>
221
	?></legend>
231
	<table>
222
	<table>
232
		<tr><td><?php echo $l_ip_public." : </td><td>".$IP_PUB;?></td></tr>
223
		<tr><td><?php echo $l_ip_public." : </td><td>".$IP_PUB;?></td></tr>
233
		<tr><td><?php echo $l_ip_dns1." : </td><td>".$conf["DNS1"];?></td></tr>
224
		<tr><td><?php echo $l_ip_dns1." : </td><td>".$conf["DNS1"];?></td></tr>
234
		<tr><td><?php echo $l_ip_dns2." : </td><td>".$conf["DNS2"];?></td></tr>
225
		<tr><td><?php echo $l_ip_dns2." : </td><td>".$conf["DNS2"];?></td></tr>
235
	</table>
226
	</table>
236
	</fieldset>
227
	</fieldset>
237
	</td><td>
228
	</td><td>
238
	<fieldset>
229
	<fieldset>
239
	<legend><?php echo $l_eth0_legend; ?></legend>
230
	<legend><?php echo $l_eth0_legend; ?></legend>
240
	<table>
231
	<table>
241
		<tr><td><?php echo $l_ip_adr." : </td><td>".$conf["PUBLIC_IP"];?></td></tr>
232
		<tr><td><?php echo $l_ip_adr." : </td><td>".$conf["PUBLIC_IP"];?></td></tr>
242
		<tr><td><?php echo $l_ip_router." : </td><td>".$conf["GW"];?></td></tr>
233
		<tr><td><?php echo $l_ip_router." : </td><td>".$conf["GW"];?></td></tr>
243
	</table>
234
	</table>
244
	</fieldset>
235
	</fieldset>
245
	</td><td>
236
	</td><td>
246
	<fieldset>
237
	<fieldset>
247
	<legend><?php echo $l_eth1_legend; ?></legend>
238
	<legend><?php echo $l_eth1_legend; ?></legend>
248
	<table>
239
	<table>
249
		<tr><td><?php echo $l_ip_adr." : </td><td>".$conf["PRIVATE_IP"];?></td></tr>
240
		<tr><td><?php echo $l_ip_adr." : </td><td>".$conf["PRIVATE_IP"];?></td></tr>
250
	</table>
241
	</table>
251
	</fieldset>
242
	</fieldset>
252
	</td></tr>
243
	</td></tr>
253
</table>
244
</table>
254
<table width="100%" border="0" cellspacing="0" cellpadding="0">
245
<table width="100%" border="0" cellspacing="0" cellpadding="0">
255
	<tr><th><?php echo $l_dhcp_title;?></th></tr>
246
	<tr><th><?php echo $l_dhcp_title;?></th></tr>
256
	<tr bgcolor="#FFCC66"><td><img src="/images/pix.gif" width="1" height="2"></td></tr>
247
	<tr bgcolor="#FFCC66"><td><img src="/images/pix.gif" width="1" height="2"></td></tr>
257
</table>
248
</table>
258
<table width="100%" border=1 cellspacing=0 cellpadding=0>
249
<table width="100%" border=1 cellspacing=0 cellpadding=0>
259
<tr><td valign="middle" align="left">
250
<tr><td valign="middle" align="left">
260
<?
251
<?
261
if (strncmp ($conf["DHCP"],"on",2) == 0)
252
$dhcp_state=trim($conf["DHCP"]);
262
 	{
-
 
263
	echo "<CENTER><H3>$l_dhcp_on</H3></CENTER>";
253
echo "<CENTER><H3>${"l_DHCP_".$dhcp_state}</H3></CENTER>";
264
	echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
254
echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
265
	echo "<input type=hidden name='choix' value=\"DHCP_Off\">";
255
echo "<select name='choix'>";
266
	echo "<input type=submit value=\"$l_switch_off\">";
256
echo "<option value=\"DHCP_Off\" ";if (!strcmp($dhcp_state,"off")) echo "selected";echo ">$l_DHCP_off";
267
	}
-
 
268
else
-
 
269
	{
-
 
270
	echo "<CENTER><H3>$l_dhcp_off</H3></CENTER>";
257
echo "<option value=\"DHCP_Half\" ";if (!strcmp($dhcp_state,"half")) echo "selected";echo ">$l_DHCP_half";
271
 	echo "<FORM action='$_SERVER[PHP_SELF]' method=POST>";
258
echo "<option value=\"DHCP_Full\" ";if (!strcmp($dhcp_state,"full")) echo "selected";echo ">$l_DHCP_full";
-
 
259
echo "</select>";
272
	echo "<input type=hidden name='choix' value=\"DHCP_On\">";
260
echo "<input type=submit value='$l_apply'>";
273
	echo "<input type=submit value=\"$l_switch_on\">";
261
echo "<td align='center'>";
-
 
262
echo "$l_DHCP_off : $l_DHCP_off_explain<br>$l_DHCP_half : $l_DHCP_half_explain<br>$l_DHCP_full : $l_DHCP_full_explain";
274
	}
263
echo "</td>";
275
echo "</FORM>";
264
echo "</FORM>";
276
echo "</td></tr>";
265
echo "</td></tr>";
277
echo "</TABLE>";
-
 
278
if (strncmp($conf["DHCP"],"on",2) == 0) require ('network2.php');
266
if (strncmp($conf["DHCP"],"full",2) == 0) { require ('network2.php');}
-
 
267
else { echo "</TABLE>"; }
279
?>
268
?>
280
</BODY>
-
 
281
</body>
269
</body>
282
</html>
270
</html>
283
 
271