mysql.pm 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package Nag::mysql;
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use utf8;
  6. use strict;
  7. use English;
  8. use FindBin '$Bin';
  9. use lib "$Bin";
  10. use base 'Exporter';
  11. use vars qw(@EXPORT @ISA);
  12. use Net::Patricia;
  13. use Data::Dumper;
  14. use POSIX;
  15. use DBI;
  16. our @ISA = qw(Exporter);
  17. our @EXPORT = qw(
  18. StrToIp
  19. IpToStr
  20. do_sql
  21. init_db
  22. get_records_sql
  23. get_record_sql
  24. update_record
  25. insert_record
  26. delete_record
  27. GetNowTime
  28. GetUnixTimeByStr
  29. GetTimeStrByUnixTime
  30. );
  31. BEGIN
  32. {
  33. #mysql
  34. our $DBNAME = 'nagios';
  35. our $DBHOST = '127.0.0.1';
  36. our $DBUSER = 'nagios';
  37. our $DBPASS = 'nagios';
  38. #---------------------------------------------------------------------------------------------------------------
  39. #id
  40. #device_id
  41. #ip
  42. #changed - lsat changed unix timestamp
  43. #data_id - port number
  44. #data_type - 0 => bandwidth; 1 => crc
  45. #data_value1
  46. #data_value2
  47. #data_value3
  48. #data_value4
  49. #---------------------------------------------------------------------------------------------------------------
  50. sub StrToIp{
  51. return unpack('N',pack('C4',split(/\./,$_[0])));
  52. }
  53. #---------------------------------------------------------------------------------------------------------------
  54. sub IpToStr{
  55. my $nIP = shift;
  56. my $res = (($nIP>>24) & 255) .".". (($nIP>>16) & 255) .".". (($nIP>>8) & 255) .".". ($nIP & 255);
  57. return $res;
  58. }
  59. #---------------------------------------------------------------------------------------------------------------
  60. sub do_sql {
  61. my $db=shift;
  62. my $sql=shift;
  63. return if (!$db);
  64. return if (!$sql);
  65. my $sql_prep = $db->prepare($sql) or die "Unable to prepare $sql: " . $db->errstr;
  66. my $sql_ref;
  67. $sql_prep->execute() or die "Unable to execute $sql: " . $db->errstr;
  68. if ($sql=~/^insert/i) { $sql_ref = $sql_prep->{mysql_insertid}; }
  69. if ($sql=~/^select /i) { $sql_ref = $sql_prep->fetchall_arrayref() or die "Unable to select $sql: " . $db->errstr; };
  70. $sql_prep->finish();
  71. return $sql_ref;
  72. }
  73. #---------------------------------------------------------------------------------------------------------------
  74. sub init_db {
  75. # Create new database handle. If we can't connect, die()
  76. my $db = DBI->connect("dbi:mysql:database=$DBNAME;host=$DBHOST","$DBUSER","$DBPASS", { RaiseError => 0, AutoCommit => 1 });
  77. if ( !defined $db ) { die "Cannot connect to mySQL server: $DBI::errstr\n"; }
  78. $db->do('SET NAMES utf8mb4');
  79. $db->{'mysql_enable_utf8'} = 1;
  80. $db->{'mysql_auto_reconnect'} = 1;
  81. return $db;
  82. }
  83. #---------------------------------------------------------------------------------------------------------------
  84. sub get_records_sql {
  85. my $db = shift;
  86. my $table = shift;
  87. my @result;
  88. return @result if (!$db);
  89. return @result if (!$table);
  90. my $list = $db->prepare( $table ) or die "Unable to prepare $table:" . $db->errstr;
  91. $list->execute() or die "Unable to execute $table: " . $db->errstr;
  92. while(my $row_ref = $list->fetchrow_hashref()) { push(@result,$row_ref); }
  93. $list->finish();
  94. return @result;
  95. }
  96. #---------------------------------------------------------------------------------------------------------------
  97. sub get_record_sql {
  98. my $db = shift;
  99. my $tsql = shift;
  100. my @result;
  101. return @result if (!$db);
  102. return @result if (!$tsql);
  103. $tsql.=' LIMIT 1';
  104. my $list = $db->prepare($tsql) or die "Unable to prepare $tsql: " . $db->errstr;
  105. $list->execute() or die "Unable to execute $tsql: " . $db->errstr;
  106. my $row_ref = $list->fetchrow_hashref();
  107. $list->finish();
  108. return $row_ref;
  109. }
  110. #---------------------------------------------------------------------------------------------------------------
  111. sub update_record {
  112. my $db = shift;
  113. my $table = shift;
  114. my $record = shift;
  115. my $filter = shift;
  116. return if (!$db);
  117. return if (!$table);
  118. return if (!$filter);
  119. my $change_str='';
  120. foreach my $field (keys %$record) {
  121. if (!defined $record->{$field}) { $record->{$field}=''; }
  122. my $new_value = $record->{$field};
  123. $new_value=~s/\'//g;
  124. $new_value=~s/\"//g;
  125. $change_str = $change_str." `$field`=".$db->quote($record->{$field}).",";
  126. }
  127. $change_str=~s/\,$//;
  128. my $sSQL = "UPDATE $table SET $change_str WHERE $filter";
  129. do_sql($db,$sSQL);
  130. }
  131. #---------------------------------------------------------------------------------------------------------------
  132. sub insert_record {
  133. my $db = shift;
  134. my $table = shift;
  135. my $record = shift;
  136. return if (!$db);
  137. return if (!$table);
  138. my $fields='';
  139. my $values='';
  140. foreach my $field (keys %$record) {
  141. if (!defined $record->{$field}) { $record->{$field}=''; }
  142. my $new_value = $record->{$field};
  143. $new_value=~s/\'//g;
  144. $new_value=~s/\"//g;
  145. $fields = $fields."`$field`,";
  146. $values = $values." ".$db->quote($new_value).",";
  147. }
  148. $fields=~s/,$//;
  149. $values=~s/,$//;
  150. my $sSQL = "INSERT INTO $table($fields) VALUES($values)";
  151. my $result = do_sql($db,$sSQL);
  152. return $result;
  153. }
  154. #---------------------------------------------------------------------------------------------------------------
  155. sub delete_record {
  156. my $db = shift;
  157. my $table = shift;
  158. my $filter = shift;
  159. return if (!$db);
  160. return if (!$table);
  161. return if (!$filter);
  162. my $sSQL = "DELETE FROM ".$table." WHERE ".$filter;
  163. do_sql($db,$sSQL);
  164. }
  165. #---------------------------------------------------------------------------------------------------------------
  166. sub GetNowTime {
  167. my ($sec,$min,$hour,$day,$month,$year,$zone) = localtime(time());
  168. $month += 1;
  169. $year += 1900;
  170. my $now_str=sprintf "%04d-%02d-%02d %02d:%02d:%02d",$year,$month,$day,$hour,$min,$sec;
  171. return $now_str;
  172. }
  173. #---------------------------------------------------------------------------------------------------------------
  174. sub GetUnixTimeByStr {
  175. my $time_str = shift;
  176. $time_str =~s/\//-/g;
  177. $time_str =~s/^\s+//g;
  178. $time_str =~s/\s+$//g;
  179. my ($sec,$min,$hour,$day,$mon,$year) = (localtime())[0,1,2,3,4,5];
  180. $year+=1900;
  181. $mon++;
  182. if ($time_str =~/^([0-9]{2,4})\-([0-9]{1,2})-([0-9]{1,2})\s+/) {
  183. $year = $1; $mon = $2; $day = $3;
  184. }
  185. if ($time_str =~/([0-9]{1,2})\:([0-9]{1,2})\:([0-9]{1,2})$/) {
  186. $hour = $1; $min = $2; $sec = $3;
  187. }
  188. my $result = mktime($sec,$min,$hour,$day,$mon-1,$year-1900);
  189. return $result;
  190. }
  191. #---------------------------------------------------------------------------------------------------------------
  192. sub GetTimeStrByUnixTime {
  193. my $time = shift || time();
  194. my ($sec, $min, $hour, $mday, $mon, $year) = (localtime($time))[0,1,2,3,4,5];
  195. my $result = strftime("%Y-%m-%d %H:%M:%S",$sec, $min, $hour, $mday, $mon, $year);
  196. return $result;
  197. }
  198. #---------------------------------------------------------------------------------------------------------------
  199. 1;
  200. }