Project

General

Profile

« Previous | Next » 

Revision fcaa56b1

Added by Seth Mos about 12 years ago

Install Plan B for upgrading the RRD files to the newer format to add IPv6 fields.
We now perform a search and replace on the XML contents to add fields instead of reading the XML into a PHP array.
A conversion with a 2.0 config on a 128MB VM without swap is succesful, needs more testing.
Ticket #2950

View differences:

etc/inc/upgrade_config.inc
2664 2664
	$databases = return_dir_as_array($rrddbpath, '/-(traffic|packets)\.rrd$/');
2665 2665
	rsort($databases);
2666 2666
	foreach($databases as $database) {
2667
		$databasetmp = "{$database}.tmp";
2668 2667
		$xmldump = "{$database}.old.xml";
2669
		$xmldumptmp = "{$database}.tmp.xml";
2670 2668
		$xmldumpnew = "{$database}.new.xml";
2671 2669

  
2672 2670
		if ($g['booting'])
......
2675 2673
		/* dump contents to xml and move database out of the way */
2676 2674
		dump_rrd_to_xml("{$rrddbpath}/{$database}", "{$g['tmp_path']}/{$xmldump}");
2677 2675

  
2678
		/* create new rrd database file */
2679
		$rrdcreate = "$rrdtool create {$g['tmp_path']}/{$databasetmp} --step $rrdinterval ";
2680
		$rrdcreate .= "DS:inpass:COUNTER:$valid:0:$downstream ";
2681
		$rrdcreate .= "DS:outpass:COUNTER:$valid:0:$upstream ";
2682
		$rrdcreate .= "DS:inblock:COUNTER:$valid:0:$downstream ";
2683
		$rrdcreate .= "DS:outblock:COUNTER:$valid:0:$upstream ";
2684
		$rrdcreate .= "DS:inpass6:COUNTER:$valid:0:$downstream ";
2685
		$rrdcreate .= "DS:outpass6:COUNTER:$valid:0:$upstream ";
2686
		$rrdcreate .= "DS:inblock6:COUNTER:$valid:0:$downstream ";
2687
		$rrdcreate .= "DS:outblock6:COUNTER:$valid:0:$upstream ";
2688
		$rrdcreate .= "RRA:AVERAGE:0.5:1:1000 ";
2689
		$rrdcreate .= "RRA:AVERAGE:0.5:5:1000 ";
2690
		$rrdcreate .= "RRA:AVERAGE:0.5:60:1000 ";
2691
		$rrdcreate .= "RRA:AVERAGE:0.5:720:3000 ";
2692

  
2693
		create_new_rrd("$rrdcreate");
2694
		/* create temporary xml from new RRD */
2695
		dump_rrd_to_xml("{$g['tmp_path']}/{$databasetmp}", "{$g['tmp_path']}/{$xmldumptmp}");
2696

  
2697
		$rrdold = xml2array(file_get_contents("{$g['tmp_path']}/{$xmldump}"), 1, "tag");
2698
		$rrdolder = $rrdold['rrd'];
2699
		unset($rrdold);
2700

  
2701
		$rrdnew = xml2array(file_get_contents("{$g['tmp_path']}/{$xmldumptmp}"), 1, "tag");
2702
		$rrdnewer = $rrdnew['rrd'];
2703
		unset($rrdnew);
2704

  
2705
		/* remove any MAX RRA's. Not needed for traffic. */
2706
		if (is_array($rrdolder)) {
2707
			$i = 0;
2708
			foreach ($rrdolder['rra'] as $rra) {
2709
				if(trim($rra['cf']) == "MAX") {
2710
					unset($rrdolder['rra'][$i]);
2711
				}
2712
				$i++;
2713
			}
2676
		/* search and replace tags to add data sources */
2677
		$ds_search = "<!-- Round Robin Archives -->";
2678
		$ds_arr = array();
2679
		$ds_arr[] = "	<ds>
2680
				<name> inpass6 </name>
2681
				<type> COUNTER </type>
2682
				<minimal_heartbeat> {$valid} </minimal_heartbeat>
2683
				<min> 0.0000000000e+00 </min>
2684
				<max> 1.2500000000e+08 </max>
2685

  
2686
				<!-- PDP Status -->
2687
				<last_ds> 0 </last_ds>
2688
				<value> NaN </value>
2689
				<unknown_sec> 3 </unknown_sec>
2690
			</ds>
2691
			";
2692
		$ds_arr[] = "	<ds>
2693
				<name> outpass6 </name>
2694
				<type> COUNTER </type>
2695
				<minimal_heartbeat> {$valid} </minimal_heartbeat>
2696
				<min> 0.0000000000e+00 </min>
2697
				<max> 1.2500000000e+08 </max>
2698

  
2699
				<!-- PDP Status -->
2700
				<last_ds> 0 </last_ds>
2701
				<value> NaN </value>
2702
				<unknown_sec> 3 </unknown_sec>
2703
			</ds>
2704
			";
2705
		$ds_arr[] = "	<ds>
2706
				<name> inblock6 </name>
2707
				<type> COUNTER </type>
2708
				<minimal_heartbeat> {$valid} </minimal_heartbeat>
2709
				<min> 0.0000000000e+00 </min>
2710
				<max> 1.2500000000e+08 </max>
2711

  
2712
				<!-- PDP Status -->
2713
				<last_ds> 0 </last_ds>
2714
				<value> NaN </value>
2715
				<unknown_sec> 3 </unknown_sec>
2716
			</ds>
2717
			";
2718
		$ds_arr[] = "	<ds>
2719
				<name> outblock6 </name>
2720
				<type> COUNTER </type>
2721
				<minimal_heartbeat> {$valid} </minimal_heartbeat>
2722
				<min> 0.0000000000e+00 </min>
2723
				<max> 1.2500000000e+08 </max>
2724

  
2725
				<!-- PDP Status -->
2726
				<last_ds> 0 </last_ds>
2727
				<value> NaN </value>
2728
				<unknown_sec> 3 </unknown_sec>
2729
			</ds>
2730
			";
2731

  
2732
		$cdp_search = "<\/cdp_prep>";
2733
		$cdp_replace = "</cdp_prep>";
2734
		$cdp_arr = array();
2735
		$cdp_arr[] = "			<ds>
2736
					<primary_value> NaN </primary_value>
2737
					<secondary_value> 0.0000000000e+00 </secondary_value>
2738
					<value> NaN </value>
2739
					<unknown_datapoints> 0 </unknown_datapoints>
2740
					</ds>
2741
		";
2742
		$cdp_arr[] = "			<ds>
2743
					<primary_value> NaN </primary_value>
2744
					<secondary_value> 0.0000000000e+00 </secondary_value>
2745
					<value> NaN </value>
2746
					<unknown_datapoints> 0 </unknown_datapoints>
2747
					</ds>
2748
		";
2749
		$cdp_arr[] = "			<ds>
2750
					<primary_value> NaN </primary_value>
2751
					<secondary_value> 0.0000000000e+00 </secondary_value>
2752
					<value> NaN </value>
2753
					<unknown_datapoints> 0 </unknown_datapoints>
2754
					</ds>
2755
		";
2756
		$cdp_arr[] = "			<ds>
2757
					<primary_value> NaN </primary_value>
2758
					<secondary_value> 0.0000000000e+00 </secondary_value>
2759
					<value> NaN </value>
2760
					<unknown_datapoints> 0 </unknown_datapoints>
2761
					</ds>
2762
		";
2763

  
2764
		$value_search = "<\/row>";
2765
		$value_replace = "</row>";
2766
		$value = "<v> NaN </v>";
2767

  
2768
		$xml = file_get_contents("{$g['tmp_path']}/{$xmldump}");
2769
		foreach($ds_arr as $ds) {
2770
			$xml = preg_replace("/$ds_search/s", "$ds{$ds_search}", $xml);
2771
		}
2772
		foreach($cdp_arr as $cdp) {
2773
			$xml = preg_replace("/$cdp_search/s", "$cdp{$cdp_replace}", $xml);
2774
		}
2775
		foreach($ds_arr as $ds) {
2776
			$xml = preg_replace("/$value_search/s", "$value{$value_replace}", $xml);
2777
		}
2778
		
2779
		file_put_contents("{$g['tmp_path']}/{$xmldumpnew}", $xml);
2780
		mwexec("$rrdtool restore -f {$g['tmp_path']}/{$xmldumpnew} {$rrddbpath}/{$database} 2>&1");
2781
		unset($xml);
2714 2782

  
2715
			file_put_contents("{$g['tmp_path']}/{$xmldumpnew}", dump_xml_config_raw(migrate_rrd_format($rrdolder, $rrdnewer), "rrd"));
2716
			mwexec("$rrdtool restore -f {$g['tmp_path']}/{$xmldumpnew} {$rrddbpath}/{$database} 2>&1");
2717
			unset($rrdolder, $rrdnewer);
2718
		}
2719 2783
	}
2720 2784
	enable_rrd_graphing();
2721 2785
	if ($g['booting'])

Also available in: Unified diff