|
Rozmiar: 7354
Komentarz: *** KREACJA ***
|
← Wersja 6 z 2019-12-07 10:44:42 ⇥
Rozmiar: 12948
Komentarz: + pg_db_size
|
| Usunięcia zostały oznaczone w ten sposób. | Dodatki zostały oznaczone w ten sposób. |
| Linia 4: | Linia 4: |
| === Łatka dla coolection.modified.cgi === {{{#!diff numbers=off |
=== Łatanie collection.modified.cgi === /!\ Stan na dzień '''07.12.2019''' (dodanie pg_db_size): {{{#!highlight diff numbers=off |
| Linia 8: | Linia 9: |
| +++ collection.modified.cgi 2016-03-01 10:26:15.949841521 +0100 | +++ collection.modified.cgi 2019-12-07 11:40:28.656518000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env perl +#!/usr/local/bin/perl # Collectd-web - collection.modified.cgi # Copyright (C) 2006-2010 Florian "octo" Forster # Copyright (C) 2009-2010 Kenneth Belitzky |
| Linia 103: | Linia 110: |
| @@ -3215,13 +3261,28 @@ sub load_graph_definitions { | @@ -1356,6 +1402,34 @@ sub load_graph_definitions { 'GPRINT:inc_max:MAX:%6.2lf Max,', 'GPRINT:inc_avg:LAST:%6.2lf Last\l' ], + disk_io_time => [ + '-v', + 'Seconds/s', + 'DEF:out_min_raw={file}:io_time:MIN', + 'DEF:out_avg_raw={file}:io_time:AVERAGE', + 'DEF:out_max_raw={file}:io_time:MAX', + 'DEF:inc_min_raw={file}:weighted_io_time:MIN', + 'DEF:inc_avg_raw={file}:weighted_io_time:AVERAGE', + 'DEF:inc_max_raw={file}:weighted_io_time:MAX', + 'CDEF:out_min=out_min_raw,1000,/', + 'CDEF:out_avg=out_avg_raw,1000,/', + 'CDEF:out_max=out_max_raw,1000,/', + 'CDEF:inc_min=inc_min_raw,1000,/', + 'CDEF:inc_avg=inc_avg_raw,1000,/', + 'CDEF:inc_max=inc_max_raw,1000,/', + 'CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF', + "AREA:out_avg#$HalfGreen", + "AREA:inc_avg#$HalfBlue", + "AREA:overlap#$HalfBlueGreen", + "LINE1:out_avg#$FullGreen:IO time", + 'GPRINT:out_avg:AVERAGE:%5.1lf%ss Avg,', + 'GPRINT:out_max:MAX:%5.1lf%ss Max,', + 'GPRINT:out_avg:LAST:%5.1lf%ss Last\l', + "LINE1:inc_avg#$FullBlue:Weighted IO time ", + 'GPRINT:inc_avg:AVERAGE:%5.1lf%ss Avg,', + 'GPRINT:inc_max:MAX:%5.1lf%ss Max,', + 'GPRINT:inc_avg:LAST:%5.1lf%ss Last\l' + ], disk_time => [ '-v', 'Seconds/s', @@ -3176,6 +3250,18 @@ sub load_graph_definitions { 'GPRINT:max:MAX:%6.2lf Max,', 'GPRINT:avg:LAST:%6.2lf Last' ], + mysql_slow_queries => [ + 'DEF:min={file}:value:MIN', + 'DEF:avg={file}:value:AVERAGE', + 'DEF:max={file}:value:MAX', + "AREA:max#$HalfBlue", + "AREA:min#$Canvas", + "LINE1:avg#$FullBlue:Queries/s", + 'GPRINT:min:MIN:%6.2lf Min,', + 'GPRINT:avg:AVERAGE:%6.2lf Avg,', + 'GPRINT:max:MAX:%6.2lf Max,', + 'GPRINT:avg:LAST:%6.2lf Last' + ], # jaf-19aug11 END # jaf-18aug11 additional Varnish graphs threads => [ @@ -3215,13 +3301,30 @@ sub load_graph_definitions { |
| Linia 131: | Linia 192: |
| + $GraphDefs->{'mysql_sort_merge_passes'} = $GraphDefs->{'mysql_slow_queries'}; + $GraphDefs->{'mysql_sort_rows'} = $GraphDefs->{'mysql_slow_queries'}; |
|
| Linia 134: | Linia 197: |
| @@ -3234,6 +3295,14 @@ sub load_graph_definitions { | @@ -3234,6 +3337,26 @@ sub load_graph_definitions { |
| Linia 142: | Linia 205: |
| + $GraphDefs->{'memory_throttle_count'} = $GraphDefs->{'cache_result'}; | |
| Linia 143: | Linia 207: |
| + $GraphDefs->{'operations'} = $GraphDefs->{'derive'}; + $GraphDefs->{'queue_length'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'total_values'} = $GraphDefs->{'gauge'}; |
+ $GraphDefs->{'operations'} = $GraphDefs->{'derive'}; + $GraphDefs->{'queue_length'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'records'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'total_values'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'total_events'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'current_connections'} = $GraphDefs->{'connections'}; + $GraphDefs->{'total_connections'} = $GraphDefs->{'connections'}; + $GraphDefs->{'blocked_clients'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'evicted_keys'} = $GraphDefs->{'derive'}; + $GraphDefs->{'expired_keys'} = $GraphDefs->{'derive'}; + $GraphDefs->{'memory_lua'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'operations_per_second'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'volatile_changes'} = $GraphDefs->{'gauge'}; + $GraphDefs->{'pending_operations'} = $GraphDefs->{'derive'}; |
| Linia 149: | Linia 224: |
| @@ -3246,6 +3315,8 @@ sub load_graph_definitions { | @@ -3241,11 +3364,15 @@ sub load_graph_definitions { $MetaGraphDefs->{'if_rx_errors'} = \&meta_graph_if_rx_errors; $MetaGraphDefs->{'if_tx_errors'} = \&meta_graph_if_rx_errors; $MetaGraphDefs->{'memory'} = \&meta_graph_memory; + $MetaGraphDefs->{'pubsub'} = \&meta_graph_memory; $MetaGraphDefs->{'nfs_procedure'} = \&meta_graph_nfs_procedure; + $MetaGraphDefs->{'pg_db_size'} = \&meta_graph_pg_db_size; $MetaGraphDefs->{'ps_state'} = \&meta_graph_ps_state; |
| Linia 158: | Linia 240: |
| @@ -3468,7 +3539,7 @@ sub meta_graph_dns | @@ -3468,7 +3595,7 @@ sub meta_graph_dns |
| Linia 167: | Linia 249: |
| @@ -3657,6 +3784,45 @@ sub meta_graph_nfs_procedure { } # for (@$type_instances) return ( meta_graph_generic_stack( $opts, $sources ) ); } # meta_graph_nfs_procedure + +sub meta_graph_pg_db_size { + confess("Wrong number of arguments") if ( @_ != 5 ); + my $host = shift; + my $plugin = shift; + my $plugin_instance = shift; + my $type = shift; + my $type_instances = shift; + my $opts = {}; + my $sources = []; + $opts->{'title'} = + "$host/$plugin" + . ( defined($plugin_instance) ? "-$plugin_instance" : '' ) + . "/$type"; + $opts->{'number_format'} = '%5.1lf%s'; + $opts->{'rrd_opts'} = [ '-b', '1024', '-v', 'Bytes' ]; + my @files = (); + + for ( sort @$type_instances ) { + my $inst = $_; + my $file = ''; + my $title = $opts->{'title'}; + for (@DataDirs) { + if ( -e "$_/$title-$inst.rrd" ) { + $file = "$_/$title-$inst.rrd"; + last; + } + } + confess("No file found for $title") if ( $file eq '' ); + push( + @$sources, + { + name => $inst, + file => $file + } + ); + } # for (@$type_instances) + return ( meta_graph_generic_stack( $opts, $sources ) ); +} # meta_graph_pg_db_size sub meta_graph_ps_state { confess("Wrong number of arguments") if ( @_ != 5 ); |
Łatanie collection.modified.cgi
Stan na dzień 07.12.2019 (dodanie pg_db_size):
--- collection.modified.cgi.orig 2012-12-31 01:51:09.000000000 +0100
+++ collection.modified.cgi 2019-12-07 11:40:28.656518000 +0100
@@ -1,4 +1,4 @@
-#!/usr/bin/env perl
+#!/usr/local/bin/perl
# Collectd-web - collection.modified.cgi
# Copyright (C) 2006-2010 Florian "octo" Forster
# Copyright (C) 2009-2010 Kenneth Belitzky
@@ -27,7 +27,7 @@ use URI::Escape ('uri_escape');
use RRDs ();
use Data::Dumper ();
use JSON ('to_json');
-our $Config = "/etc/collectd/collection.conf";
+our $Config = "/usr/local/etc/collectd-web.conf";
our @DataDirs = ();
our $LibDir;
our $make_transparent = 1;
@@ -39,6 +39,9 @@ our $ValidTimespan = {
year => 366 * 86400
};
+# --- wy/l/aczenie logowania b/l/ed/ow w logacha serwera www. U/zywa/c z rozs/adkiem - s/lu/zy do poprawek
+#
+##$CGI::LIST_CONTEXT_WARN = 0;
our @RRDDefaultArgs = (
'--rigid', '-w', '500', '-h', '160', '--alt-autoscale-max', '--alt-y-grid',
@@ -191,7 +194,9 @@ sub _get_menu_buttons {
sub _get_param_host {
my %all_hosts = map { $_ => 1 } ( _find_hosts() );
my @selected_hosts = ();
- for ( param('host') ) {
+ my @loc_hosts = ();
+ push @loc_hosts, scalar param('host');
+ for ( @loc_hosts ) {
if ( defined( $all_hosts{$_} ) ) {
push( @selected_hosts, "$_" );
}
@@ -619,7 +624,7 @@ sub action_show_plugin_json {
$plugins_per_host->{ $hosts[$i] } = _find_files_for_host( $hosts[$i] );
_files_union( $all_plugins, $plugins_per_host->{ $hosts[$i] } );
}
- for ( param('plugin') ) {
+ for ( scalar param('plugin') ) {
if ( defined( $all_plugins->{$_} ) ) {
$selected_plugins->{$_} = 1;
}
@@ -1059,6 +1064,35 @@ sub load_graph_definitions {
'GPRINT:max:MAX:%6.2lf Max,',
'GPRINT:avg:LAST:%6.2lf Last'
],
+ io_octets => [
+ 'DEF:out_min={file}:tx:MIN',
+ 'DEF:out_avg={file}:tx:AVERAGE',
+ 'DEF:out_max={file}:tx:MAX',
+ 'DEF:inc_min={file}:rx:MIN',
+ 'DEF:inc_avg={file}:rx:AVERAGE',
+ 'DEF:inc_max={file}:rx:MAX',
+ 'CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF',
+ 'CDEF:mytime=out_avg,TIME,TIME,IF',
+ 'CDEF:sample_len_raw=mytime,PREV(mytime),-',
+ 'CDEF:sample_len=sample_len_raw,UN,0,sample_len_raw,IF',
+ 'CDEF:out_avg_sample=out_avg,UN,0,out_avg,IF,sample_len,*',
+ 'CDEF:out_avg_sum=PREV,UN,0,PREV,IF,out_avg_sample,+',
+ 'CDEF:inc_avg_sample=inc_avg,UN,0,inc_avg,IF,sample_len,*',
+ 'CDEF:inc_avg_sum=PREV,UN,0,PREV,IF,inc_avg_sample,+',
+ "AREA:out_avg#$HalfGreen",
+ "AREA:inc_avg#$HalfBlue",
+ "AREA:overlap#$HalfBlueGreen",
+ "LINE1:out_avg#$FullGreen:Written",
+ 'GPRINT:out_avg:AVERAGE:%5.1lf%s Avg,',
+ 'GPRINT:out_max:MAX:%5.1lf%s Max,',
+ 'GPRINT:out_avg:LAST:%5.1lf%s Last',
+ 'GPRINT:out_avg_sum:LAST:(ca. %5.1lf%sB Total)\l',
+ "LINE1:inc_avg#$FullBlue:Read ",
+ 'GPRINT:inc_avg:AVERAGE:%5.1lf%s Avg,',
+ 'GPRINT:inc_max:MAX:%5.1lf%s Max,',
+ 'GPRINT:inc_avg:LAST:%5.1lf%s Last',
+ 'GPRINT:inc_avg_sum:LAST:(ca. %5.1lf%sB Total)\l'
+ ],
cache_result => [
'DEF:min={file}:value:MIN',
'DEF:avg={file}:value:AVERAGE',
@@ -1071,6 +1105,18 @@ sub load_graph_definitions {
'GPRINT:max:MAX:%6.2lf Max,',
'GPRINT:avg:LAST:%6.2lf Last'
],
+ cache_size => [
+ 'DEF:min={file}:value:MIN',
+ 'DEF:avg={file}:value:AVERAGE',
+ 'DEF:max={file}:value:MAX',
+ "AREA:max#$HalfBlue",
+ "AREA:min#$Canvas",
+ "LINE1:avg#$FullBlue:ARC cache size (Bytes)",
+ 'GPRINT:min:MIN:%6.2lf%s Min,',
+ 'GPRINT:avg:AVERAGE:%6.2lf%s Avg,',
+ 'GPRINT:max:MAX:%6.2lf%s Max,',
+ 'GPRINT:avg:LAST:%6.2lf%s Last'
+ ],
apache_scoreboard => [
'DEF:min={file}:value:MIN',
'DEF:avg={file}:value:AVERAGE',
@@ -1356,6 +1402,34 @@ sub load_graph_definitions {
'GPRINT:inc_max:MAX:%6.2lf Max,',
'GPRINT:inc_avg:LAST:%6.2lf Last\l'
],
+ disk_io_time => [
+ '-v',
+ 'Seconds/s',
+ 'DEF:out_min_raw={file}:io_time:MIN',
+ 'DEF:out_avg_raw={file}:io_time:AVERAGE',
+ 'DEF:out_max_raw={file}:io_time:MAX',
+ 'DEF:inc_min_raw={file}:weighted_io_time:MIN',
+ 'DEF:inc_avg_raw={file}:weighted_io_time:AVERAGE',
+ 'DEF:inc_max_raw={file}:weighted_io_time:MAX',
+ 'CDEF:out_min=out_min_raw,1000,/',
+ 'CDEF:out_avg=out_avg_raw,1000,/',
+ 'CDEF:out_max=out_max_raw,1000,/',
+ 'CDEF:inc_min=inc_min_raw,1000,/',
+ 'CDEF:inc_avg=inc_avg_raw,1000,/',
+ 'CDEF:inc_max=inc_max_raw,1000,/',
+ 'CDEF:overlap=out_avg,inc_avg,GT,inc_avg,out_avg,IF',
+ "AREA:out_avg#$HalfGreen",
+ "AREA:inc_avg#$HalfBlue",
+ "AREA:overlap#$HalfBlueGreen",
+ "LINE1:out_avg#$FullGreen:IO time",
+ 'GPRINT:out_avg:AVERAGE:%5.1lf%ss Avg,',
+ 'GPRINT:out_max:MAX:%5.1lf%ss Max,',
+ 'GPRINT:out_avg:LAST:%5.1lf%ss Last\l',
+ "LINE1:inc_avg#$FullBlue:Weighted IO time ",
+ 'GPRINT:inc_avg:AVERAGE:%5.1lf%ss Avg,',
+ 'GPRINT:inc_max:MAX:%5.1lf%ss Max,',
+ 'GPRINT:inc_avg:LAST:%5.1lf%ss Last\l'
+ ],
disk_time => [
'-v',
'Seconds/s',
@@ -3176,6 +3250,18 @@ sub load_graph_definitions {
'GPRINT:max:MAX:%6.2lf Max,',
'GPRINT:avg:LAST:%6.2lf Last'
],
+ mysql_slow_queries => [
+ 'DEF:min={file}:value:MIN',
+ 'DEF:avg={file}:value:AVERAGE',
+ 'DEF:max={file}:value:MAX',
+ "AREA:max#$HalfBlue",
+ "AREA:min#$Canvas",
+ "LINE1:avg#$FullBlue:Queries/s",
+ 'GPRINT:min:MIN:%6.2lf Min,',
+ 'GPRINT:avg:AVERAGE:%6.2lf Avg,',
+ 'GPRINT:max:MAX:%6.2lf Max,',
+ 'GPRINT:avg:LAST:%6.2lf Last'
+ ],
# jaf-19aug11 END
# jaf-18aug11 additional Varnish graphs
threads => [
@@ -3215,13 +3301,30 @@ sub load_graph_definitions {
'GPRINT:avg:LAST:%6.2lf Last'
],
# jaf-18aug11 END
-
-
+ bytes => ['-v', 'Bytes',
+ 'DEF:avg={file}:value:AVERAGE',
+ 'DEF:min={file}:value:MIN',
+ 'DEF:max={file}:value:MAX',
+ "AREA:max#$HalfGreen",
+ "AREA:min#$Canvas",
+ "LINE1:avg#$FullGreen:Bytes",
+ 'GPRINT:min:MIN:%4.1lf Min,',
+ 'GPRINT:avg:AVERAGE:%4.1lf Avg,',
+ 'GPRINT:max:MAX:%4.1lf Max,',
+ 'GPRINT:avg:LAST:%4.1lf Last\l'
+ ],
};
+ $GraphDefs->{'ps_code'} = $GraphDefs->{'ps_state'};
+ $GraphDefs->{'ps_data'} = $GraphDefs->{'ps_state'};
+ $GraphDefs->{'ps_stacksize'} = $GraphDefs->{'ps_state'};
+ $GraphDefs->{'ps_vm'} = $GraphDefs->{'ps_state'};
$GraphDefs->{'if_multicast'} = $GraphDefs->{'ipt_packets'};
$GraphDefs->{'if_tx_errors'} = $GraphDefs->{'if_rx_errors'};
$GraphDefs->{'dns_qtype'} = $GraphDefs->{'dns_opcode'};
$GraphDefs->{'dns_rcode'} = $GraphDefs->{'dns_opcode'};
+ $GraphDefs->{'full_join'} = $GraphDefs->{'mysql_qcache'};
+ $GraphDefs->{'mysql_sort_merge_passes'} = $GraphDefs->{'mysql_slow_queries'};
+ $GraphDefs->{'mysql_sort_rows'} = $GraphDefs->{'mysql_slow_queries'};
# jaf-18aug11 additional Varnish graphs
$GraphDefs->{'memcached_command'} = $GraphDefs->{'total_operations'};
$GraphDefs->{'memcached_connections'} = $GraphDefs->{'apache_connections'};
@@ -3234,6 +3337,26 @@ sub load_graph_definitions {
# jaf-18aug11 END
$GraphDefs->{'vmpage_io-memory'} = $GraphDefs->{'vmpage_io'};
$GraphDefs->{'vmpage_io-swap'} = $GraphDefs->{'vmpage_io'};
+ $GraphDefs->{'cache_ratio'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'cache_eviction'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'cache_operation'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'mutex_operations'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'memory_throttle_count'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'hash_collisions'} = $GraphDefs->{'cache_result'};
+ $GraphDefs->{'operations'} = $GraphDefs->{'derive'};
+ $GraphDefs->{'queue_length'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'records'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'total_values'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'total_events'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'current_connections'} = $GraphDefs->{'connections'};
+ $GraphDefs->{'total_connections'} = $GraphDefs->{'connections'};
+ $GraphDefs->{'blocked_clients'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'evicted_keys'} = $GraphDefs->{'derive'};
+ $GraphDefs->{'expired_keys'} = $GraphDefs->{'derive'};
+ $GraphDefs->{'memory_lua'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'operations_per_second'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'volatile_changes'} = $GraphDefs->{'gauge'};
+ $GraphDefs->{'pending_operations'} = $GraphDefs->{'derive'};
$MetaGraphDefs->{'cpu'} = \&meta_graph_cpu;
$MetaGraphDefs->{'df_complex'} = \&meta_graph_df_complex;
$MetaGraphDefs->{'dns_qtype'} = \&meta_graph_dns;
@@ -3241,11 +3364,15 @@ sub load_graph_definitions {
$MetaGraphDefs->{'if_rx_errors'} = \&meta_graph_if_rx_errors;
$MetaGraphDefs->{'if_tx_errors'} = \&meta_graph_if_rx_errors;
$MetaGraphDefs->{'memory'} = \&meta_graph_memory;
+ $MetaGraphDefs->{'pubsub'} = \&meta_graph_memory;
$MetaGraphDefs->{'nfs_procedure'} = \&meta_graph_nfs_procedure;
+ $MetaGraphDefs->{'pg_db_size'} = \&meta_graph_pg_db_size;
$MetaGraphDefs->{'ps_state'} = \&meta_graph_ps_state;
$MetaGraphDefs->{'swap'} = \&meta_graph_swap;
$MetaGraphDefs->{'mysql_commands'} = \&meta_graph_mysql_commands;
$MetaGraphDefs->{'mysql_handler'} = \&meta_graph_mysql_commands;
+ $MetaGraphDefs->{'mysql_select'} = \&meta_graph_mysql_commands;
+ $MetaGraphDefs->{'mysql_sort'} = \&meta_graph_mysql_commands;
$MetaGraphDefs->{'tcp_connections'} = \&meta_graph_tcp_connections;
$MetaGraphDefs->{'vmpage_number'} = \&meta_graph_vmpage_number;
$MetaGraphDefs->{'vmpage_action'} = \&meta_graph_vmpage_action;
@@ -3468,7 +3595,7 @@ sub meta_graph_dns
@$type_instances = sort @$type_instances;
- $opts->{'colors'} = _get_n_colors ($type_instances);
+ ###$opts->{'colors'} = _get_n_colors ($type_instances);
for (@$type_instances)
{
@@ -3657,6 +3784,45 @@ sub meta_graph_nfs_procedure {
} # for (@$type_instances)
return ( meta_graph_generic_stack( $opts, $sources ) );
} # meta_graph_nfs_procedure
+
+sub meta_graph_pg_db_size {
+ confess("Wrong number of arguments") if ( @_ != 5 );
+ my $host = shift;
+ my $plugin = shift;
+ my $plugin_instance = shift;
+ my $type = shift;
+ my $type_instances = shift;
+ my $opts = {};
+ my $sources = [];
+ $opts->{'title'} =
+ "$host/$plugin"
+ . ( defined($plugin_instance) ? "-$plugin_instance" : '' )
+ . "/$type";
+ $opts->{'number_format'} = '%5.1lf%s';
+ $opts->{'rrd_opts'} = [ '-b', '1024', '-v', 'Bytes' ];
+ my @files = ();
+
+ for ( sort @$type_instances ) {
+ my $inst = $_;
+ my $file = '';
+ my $title = $opts->{'title'};
+ for (@DataDirs) {
+ if ( -e "$_/$title-$inst.rrd" ) {
+ $file = "$_/$title-$inst.rrd";
+ last;
+ }
+ }
+ confess("No file found for $title") if ( $file eq '' );
+ push(
+ @$sources,
+ {
+ name => $inst,
+ file => $file
+ }
+ );
+ } # for (@$type_instances)
+ return ( meta_graph_generic_stack( $opts, $sources ) );
+} # meta_graph_pg_db_size
sub meta_graph_ps_state {
confess("Wrong number of arguments") if ( @_ != 5 );
(c) 2004 - 2026 BSD Serwis Krzysztof Stryjek. W przypadku błędów, poprawek proszę kontaktować się z administratorem wiki.
