view contrib/app_acct_tools/purge_to_file.php @ 1510:a2fb51309cd2

Add 3GPP TS 29.345 V15.1.0 (2019-09) Add AVPs: - App-Layer-User-Id, UTF8String, code 3801, section 6.3.2 - Assistance-info, Grouped, code 3802, section 6.3.3 - Assistance-Info-Validity-Timer, Unsigned32, code 3803, section 6.3.4 - Discovery-Type, Unsigned32, code 3804, section 6.3.5 - Filter-Id, OctetString, code 3805, section 6.3.9 - MAC-Address, UTF8String, code 3806, section 6.3.11 - Match-Report, Grouped, code 3807, section 6.3.12 - Operating-Channel, Unsigned32, code 3808, section 6.3.14 - P2P-Features, Unsigned32, code 3809, section 6.3.15 - ProSe-App-Code, OctetString, code 3810, section 6.3.16 - ProSe-App-Id, UTF8String, code 3811, section 6.3.17 - ProSe-App-Mask, OctetString, code 3812, section 6.3.18 - ProSe-Discovery-Filter, Grouped, code 3813, section 6.3.20 - PRR-Flags, Unsigned32, code 3814, section 6.3.21 - ProSe-Validity-Timer, Unsigned32, code 3815, section 6.3.22 - Requesting-EPUID, UTF8String, code 3816, section 6.3.23 - Targeted-EPUID, UTF8String, code 3817, section 6.3.26 - Time-Window, Unsigned32, code 3818, section 6.3.27 - WiFi-P2P-Assistance-Info, Grouped, code 3819, section 6.3.30 - WLAN-Assistance-Info, Grouped, code 3820, section 6.3.31 - WLAN-Link-Layer-Id, OctetString, code 3821, section 6.3.32 - WLAN-Link-Layer-Id-List, Grouped, code 3822, section 6.3.33 - Location-Update-Trigger, Grouped, code 3823, section 6.3.42 - Location-Update-Event-Type, Unsigned32, code 3824, section 6.3.43 - Change-Of-Area-Type, Grouped, code 3825, section 6.3.44 - Location-Update-Event-Trigger, Unsigned32, code 3826, section 6.3.45 - Report-Cardinality, Enumerated, code 3827, section 6.3.46 - Minimum-Interval-Time, Unsigned32, code 3828, section 6.3.47 - Periodic-Location-Type, Grouped, code 3829, section 6.3.48 - Location-Report-Interval-Time, Unsigned32, code 3830, section 6.3.49 - Total-Number-Of-Reports, Unsigned32, code 3831, section 6.3.50 - Validity-Time-Announce, Unsigned32, code 3832, section 6.3.36 - Validity-Time-Monitor, Unsigned32, code 3833, section 6.3.37 - Validity-Time-Communication, Unsigned32, code 3834, section 6.3.38 - ProSe-App-Code-Info, Grouped, code 3835, section 6.3.39 - MIC, OctetString, code 3836, section 6.3.40 - UTC-based-Counter, Unsigned32, code 3837, section 6.3.41 - ProSe-Match-Refresh-Timer, Unsigned32, code 3838, section 6.3.52 - ProSe-Metadata-Index-Mask, OctetString, code 3839, section 6.3.60 - App-Identifier, Grouped, code 3840, section 6.3.61 - OS-ID, OctetString, code 3841, section 6.3.62 - OS-App-ID, UTF8String, code 3842, section 6.3.63 - Requesting-RPAUID, UTF8String, code 3843, section 6.3.64 - Target-RPAUID, UTF8String, code 3844, section 6.3.65 - Target-PDUID, OctetString, code 3845, section 6.3.66 - ProSe-Restricted-Code, OctetString, code 3846, section 6.3.67 - ProSe-Restricted-Code-Suffix-Range, OctetString, code 3847, section 6.3.68 - Beginning-Suffix, OctetString, code 3848, section 6.3.69 - Ending-Suffix, OctetString, code 3849, section 6.3.70 - Discovery-Entry-ID, Unsigned32, code 3850, section 6.3.59 - Match-Timestamp, Time, code 3851, section 6.3.71 - PMR-Flags, Unsigned32, code 3852, section 6.3.57 - ProSe-Application-Metadata, UTF8String, code 3853, section 6.3.58 - Discovery-Auth-Request, Grouped, code 3854, section 6.3.53 - Discovery-Auth-Response, Grouped, code 3855, section 6.3.54 - Match-Request, Grouped, code 3856, section 6.3.55 - Match-Report-Info, Grouped, code 3857, section 6.3.56 - Banned-RPAUID, UTF8String, code 3858, section 6.3.73 - Banned-PDUID, OctetString, code 3859, section 6.3.74 - Code-Receiving-Security-Material, Grouped, code 3860, section 6.3.75 - Code-Sending-Security-Material, Grouped, code 3861, section 6.3.76 - DUSK, OctetString, code 3862, section 6.3.77 - DUIK, OctetString, code 3863, section 6.3.78 - DUCK, OctetString, code 3864, section 6.3.79 - MIC-Check-indicator, Unsigned32, code 3865, section 6.3.80 - Encrypted-Bitmask, OctetString, code 3866, section 6.3.81 - ProSe-App-Code-Suffix-Range, OctetString, code 3867, section 6.3.82 - PC5-tech, OctetString, code 3868, section 6.3.84 Note: Name conflict with 3GPP TS 29.154 Time-Window (4204). Time-Window (3818) in 3GPP TS 29.345 V12.1.0 (2014-12) predates Time-Window (4204) in 3GPP TS 29.154 V13.1.0 (2016-03).
author Luke Mewburn <luke@mewburn.net>
date Sun, 05 Apr 2020 08:27:37 +1000
parents 4cdf146f11d5
children
line wrap: on
line source

<?php
# This file may be called either from CLI or web PHP installation.

# The copyright is the same as the freeDiameter project. Licence is BSD.

/*-------------------------------------------------------*/

/* -- These parameters must match the app_acct.conf file -- */

/* The Connection String used to access the database.
  Example: "host=localhost dbname=app_acct user=freediameter password=foo" */
$CONNSTR=""; 

/* The name of the table were the records are saved by app_acct.fdx */
$TABLE="incoming";


/* -- These parameters are specific to this script -- */

/* Name of the dump file to create. It can be relative or absolute. 
   The script fails if this file already exists.
   Use for example "data-".date("Ymdhis").".sql" to avoid collisions. */
$DUMPFILE="incoming_data.sql";

/* Does the script also echoes an HTML TABLE of the data processed? */
$DISPLAY_HTML=FALSE; // it would be better to detect if we are called through Web or CLI...
/* In addition, issue a full HTML page (including headers) ? */
$HTML_HEADERS=TRUE;

/*-------------------------------------------------------*/

/* Connect to the database */
$dbconn = pg_connect($CONNSTR)
    or die('Could not connect: ' . pg_last_error() . "\n");
    
/* Check if the file exists */
$file = fopen($DUMPFILE, "xb")
    or die("The file '$DUMPFILE' already exists or cannot be created, aborting.\n");

/* First, query the table format */
$format_sql =   "SELECT ".
		"   a.attname AS field,".
		"   t.typname AS type,".
/*		"   a.attlen AS length,". */
		"   a.atttypmod AS lengthvar,".
		"   a.attnotnull AS notnull".
		" FROM".
		"   pg_class c,".
		"   pg_attribute a,".
		"   pg_type t".
		" WHERE".
		"   c.relname = '" . $TABLE . "'".
		"   AND a.attnum > 0".
		"   AND a.attrelid = c.oid".
		"   AND a.atttypid = t.oid".
		"   ORDER BY a.attnum";
$result = pg_query($dbconn, $format_sql) or die('Query failed: ' . pg_last_error() . "\n");

/* app_acct.fdx only uses a few different fields types: */
$conv_types = array(
    "timestamptz" => "timestamp with time zone", /* recorded on */
    "bytea" => "bytea",   /* octet string */
    "int4" => "integer",  /* unsigned32, integer32, float32 */
    "int8" => "bigint"    /* unsigned64, integer64, float64 */
    );
    
$fields_types=array();

fwrite($file, " -- Data purged on ".date(DATE_RFC822)."\n\n");
fwrite($file, " -- Format of the table it was extracted from:\n");
fwrite($file, " -- CREATE TABLE \"".$TABLE."\" (\n");
$i = 0;
while ($field = pg_fetch_array($result, null, PGSQL_ASSOC)) {
	if ($i++)
		fwrite($file, ",\n");
	fwrite($file, " --    \"".$field["field"]."\" ");
	if (array_key_exists($field["type"], $conv_types))
		$fields_types[$field["field"]] = $conv_types[$field["type"]];
	else
		$fields_types[$field["field"]] = $field["type"];
	fwrite($file, $fields_types[$field["field"]]);
	if ($field["lengthvar"] != "-1")
		fwrite($file, "(".$field["lengthvar"].")");
	if ($field["notnull"] == "t")
		fwrite($file, " NOT NULL");
}
fwrite($file, "\n -- );\n\n");
pg_free_result($result);

/* Now, the data */
$result = pg_query($dbconn, "SELECT * FROM \"".$TABLE."\"") or die('Query failed: ' . pg_last_error() . "\n");
if (pg_num_rows($result) > 0) {
	fwrite($file, "INSERT INTO \"".$TABLE."\"\n (\n");
	$i = pg_num_fields($result);
	if ($DISPLAY_HTML && $HTML_HEADERS) echo "<HTML>\n<HEAD><TITLE>Purge</TITLE></HEAD>\n<BODY>\n";
	if ($DISPLAY_HTML) echo "<TABLE>\n  <TR>\n";
	for ($j = 0; $j < $i; $j++) {
	      fwrite($file, ($j ? ", " : "") . "\"" . pg_escape_string(pg_field_name($result, $j)). "\"");
	      if ($DISPLAY_HTML) echo "    <TD>".htmlentities(pg_field_name($result, $j))."</TD>\n";
	}
	fwrite($file, "\n )\n VALUES \n");
	if ($DISPLAY_HTML) echo "  </TR>\n";
	$i = 0;
	while ($line = pg_fetch_array($result, null, PGSQL_ASSOC)) {
		if ($i++)
			fwrite($file, ",\n");
		fwrite($file, " ( ");
		
		if ($DISPLAY_HTML) echo "  <TR>\n";
		$j = 0;
		$sql = "";
		foreach ($line as $f => $v) {
			if (!is_null($v))
				switch ($fields_types[$f]) {
					case "bytea":
						$v = "E'".pg_escape_bytea(pg_unescape_bytea($v))."'";
						break;
					case "timestamp with time zone":
						$v = "E'".pg_escape_string($v)."'";
						break;
				}
			else
				$v = "NULL";
			
	      		if ($DISPLAY_HTML) echo "    <TD>".htmlentities(print_r($line[$f], TRUE))."</TD>\n";

			fwrite($file, ($j ? ", " : "") . $v);
			$sql .= ($j ? " AND " : "") . "\"".pg_escape_string($f)."\" ";
			if (is_null($line[$f]))
				$sql .= " IS NULL";
			else 
				$sql .= " = " . $v;
			$j++;
		}
		fwrite($file, ")");
		if ($DISPLAY_HTML) echo "  </TR>\n";
		$res = pg_query( "DELETE FROM \"".$TABLE."\" WHERE ".$sql) or die('DELETE query failed: ' . pg_last_error() . "\n");
		pg_free_result($res);
	}
	fwrite($file, "\n;\n");
	if ($DISPLAY_HTML) echo "</TABLE>\n";
	if ($DISPLAY_HTML && $HTML_HEADERS) echo "</BODY>\n</HTML>\n";
        else echo $i." records have been successfully written to '".$DUMPFILE."' and removed from database.\n";
} else {
	if ($DISPLAY_HTML) echo "<p><em>No new record in the database</em></p>\n";
        else echo "No new record in the database, the generated file is empty.\n";
}
pg_free_result($result);

/* Closing connection */
pg_close($dbconn);

/* Closing the file */
fclose($file);


?>
"Welcome to our mercurial repository"