All pastes #902626 Raw Edit

ughness

public php v1 · immutable
·published 2008-02-13 17:25 UTC
rendered paste body
function c_get_current_rules() {	global $tracking, $limit, $rules;	/*	  WARNING: This function is incredibly complex. It has to process the output from iptables and convert it back into something useful.	           This can be tricky at times, SO DONT SCREW WITH THIS FUNCTION!!!	*/	/* grab the OUTPUT table */	$temp = "iptables -L OUTPUT -n";	$rules['master']['output'] = split("[\r\n\t]+", shell_exec($temp));	/* process the OUTPUT table into useable data, we only care about our stuff*/	/* this does NOT account for DROP yet!!!! */	foreach ($rules['master']['output'] as $key => $val) {		$rules['working']['output'][$key] = split("[\n\t\r ]+", $rules['master']['output'][$key]);		if ($rules['working']['output'][$key][0] == "Chain") { unset($rules['working']['output'][$key]);  continue; }		if ($rules['working']['output'][$key][0] == "target") { unset($rules['working']['output'][$key]);  continue; }		if ($rules['working']['output'][$key][0] == "") { unset($rules['working']['output'][$key]);  continue; }		if (strpos($rules['working']['output'][$key][0], "tracking_") === FALSE) { unset($rules['working']['output'][$key]);  continue; }	}	/* grab the INPUT table */	$temp = "iptables -L INPUT -n";	$rules['master']['input'] = split("[\r\n\t]+", shell_exec($temp));	/* process the INPUT table into useable data, we only care about our stuff*/	/* this does NOT account for DROP yet!!!! */	foreach ($rules['master']['input'] as $key => $val) {		$rules['working']['input'][$key] = split("[\n\t\r ]+", $rules['master']['input'][$key]);		if ($rules['working']['input'][$key][0] == "Chain") { unset($rules['working']['input'][$key]); continue; }		if ($rules['working']['input'][$key][0] == "target") { unset($rules['working']['input'][$key]);  continue; }		if ($rules['working']['input'][$key][0] == "") { unset($rules['working']['input'][$key]);  continue; }		if (strpos($rules['working']['input'][$key][0], "tracking_") === FALSE) { unset($rules['working']['input'][$key]);  continue; }	}	/* convert the OUTPUT data into named keys rather than numeric */	foreach ($rules['working']['output'] as $key => $val) {		foreach ($rules['working']['output'][$key] as $key2 => $val2) {			if (is_numeric($key2)) {				if ($key2 == 0) {					$rules['working']['output'][$key]['target'] = $val2;					unset($rules['working']['output'][$key][$key2]);				}				if ($key2 == 1) {					$rules['working']['output'][$key]['proto'] = $val2;					unset($rules['working']['output'][$key][$key2]);				}				if ($key2 == 2) {					$rules['working']['output'][$key]['option'] = $val2;					unset($rules['working']['output'][$key][$key2]);				}				if ($key2 == 3) {					$rules['working']['output'][$key]['source'] = $val2;					unset($rules['working']['output'][$key][$key2]);				}				if ($key2 == 4) {					$rules['working']['output'][$key]['dest'] = $val2;					unset($rules['working']['output'][$key][$key2]);				}				if ($key2 >= 5) {					//$rules['working']['output'][$key]['comment'] .= $val2;					unset($rules['working']['output'][$key][$key2]);				}			}		}	}	/* convert the INPUT data into named keys rather than numeric */	foreach ($rules['working']['input'] as $key => $val) {		foreach ($rules['working']['input'][$key] as $key2 => $val2) {			if (is_numeric($key2)) {				if ($key2 == 0) {					$rules['working']['input'][$key]['target'] = $val2;					unset($rules['working']['input'][$key][$key2]);				}				if ($key2 == 1) {					$rules['working']['input'][$key]['proto'] = $val2;					unset($rules['working']['input'][$key][$key2]);				}				if ($key2 == 2) {					$rules['working']['input'][$key]['option'] = $val2;					unset($rules['working']['input'][$key][$key2]);				}				if ($key2 == 3) {					$rules['working']['input'][$key]['source'] = $val2;					unset($rules['working']['input'][$key][$key2]);				}				if ($key2 == 4) {					$rules['working']['input'][$key]['dest'] = $val2;					unset($rules['working']['input'][$key][$key2]);				}				if ($key2 >= 5) {					//$rules['working']['input'][$key]['comment'] .= $val2;					unset($rules['working']['input'][$key][$key2]);				}			}		}	}	/* using the target for the OUTPUT data, grab the associated tracking table, inserting it into the master list */	foreach ($rules['working']['output'] as $key => $val) {		foreach ($rules['working']['output'][$key] as $key2 => $val2) {			if ($key2 == "target") {				$temp = "iptables -L {$rules['working']['output'][$key][$key2]} -n";				$rules['master'][$rules['working']['output'][$key][$key2]] = split("[\r\n\t]+", shell_exec($temp));			}		}	}	/* using the target for the INPUT data, grab the associated tracking table, inserting it into the master list */	/* yes this is redundant, but it insures the rules are all there */	foreach ($rules['working']['input'] as $key => $val) {		foreach ($rules['working']['input'][$key] as $key2 => $val2) {			if ($key2 == "target") {				$temp = "iptables -L {$rules['working']['input'][$key][$key2]} -n";				$rules['master'][$rules['working']['input'][$key][$key2]] = split("[\r\n\t]+", shell_exec($temp));			}		}	}	/* process the newly gathered table into useable data, we only care about our stuff*/	/* this does NOT account for DROP yet!!!! */	foreach ($rules['master'] as $key => $val) {		if ($key != "output" && $key != "input") {			foreach ($rules['master'][$key] as $key2 => $val2) {				$rules['working'][$key][$key2] = split("[\n\t\r ]+", $rules['master'][$key][$key2]);				if ($rules['working'][$key][$key2][0] == "Chain") { unset($rules['working'][$key][$key2]);  continue; }				if ($rules['working'][$key][$key2][0] == "target") { unset($rules['working'][$key][$key2]);  continue; }			}		}	}	/* convert the newly gathered data into named keys rather than numeric */	foreach ($rules['working'] as $key => $val) {		if ($key != "output" && $key != "input") {			foreach ($rules['working'][$key] as $key2 => $val2) {				foreach ($rules['working'][$key][$key2] as $key3 => $val3) {					if (is_numeric($key3)) {						if ($key3 == 0) {							$rules['working'][$key][$key2]['target'] = $val3;							unset($rules['working'][$key][$key2][$key3]);						}						if ($key3 == 1) {							$rules['working'][$key][$key2]['proto'] = $val3;							unset($rules['working'][$key][$key2][$key3]);						}						if ($key3 == 2) {							$rules['working'][$key][$key2]['option'] = $val3;							unset($rules['working'][$key][$key2][$key3]);						}						if ($key3 == 3) {							$rules['working'][$key][$key2]['source'] = $val3;							unset($rules['working'][$key][$key2][$key3]);						}						if ($key3 == 4) {							$rules['working'][$key][$key2]['dest'] = $val3;							unset($rules['working'][$key][$key2][$key3]);						}						if ($key3 >= 5) {							//$rules['working'][$key][$key2]['comment'] .= $val3;							unset($rules['working'][$key][$key2][$key3]);						}					}				}			}		}	}	/* get rid of empty indexes that are left over from the target less rules */	foreach ($rules['working'] as $key => $val) {		foreach ($rules['working'][$key] as $key2 => $val2) {			foreach ($rules['working'][$key][$key2] as $key3 => $val3) {				if ($key3 == "target") {					if ($rules['working'][$key][$key2][$key3] == "") {						if ($rules['working'][$key][$key2]['proto'] == "") {							unset($rules['working'][$key][$key2]);						}					}							}			}		}	}	if ($GLOBALS['debug']) { print_r($rules); }}