Browse Source

add module for rest api mikrotik
clear ip arp at mikrotik device for changed dhcp leases

rajven 3 năm trước cách đây
mục cha
commit
0aa0024900
3 tập tin đã thay đổi với 166 bổ sung1 xóa
  1. 1 1
      docs/logrotate/scripts
  2. 156 0
      scripts/Rstat/rest_api.pm
  3. 9 0
      scripts/sync_mikrotik.pl

+ 1 - 1
docs/logrotate/scripts

@@ -1,4 +1,4 @@
-/var/log/scripts/*.log {
+/opt/Eye/scripts/log/*.log {
         rotate 7
         missingok
         notifempty

+ 156 - 0
scripts/Rstat/rest_api.pm

@@ -0,0 +1,156 @@
+package Rstat::rest_api;
+
+#
+# Copyright (C) Roman Dmitiriev, rnd@rajven.ru
+#
+
+use utf8;
+use strict;
+use English;
+use FindBin qw($Bin);
+use lib "$Bin";
+use base 'Exporter';
+use vars qw(@EXPORT @ISA);
+use HTTP::Request::Common;
+use HTTP::Request;
+use LWP;
+use URI::Encode;
+use Rstat::main;
+use Data::Dumper;
+use IO::Socket::SSL;
+use JSON;
+
+#libwww-perl
+#libhttp-message-perl
+#libhttp-request-params-perl
+#liburi-encode-perl
+#libjson-perl
+
+our @ISA = qw(Exporter);
+our @EXPORT = qw(
+rest_get_request
+rest_patch_request
+rest_put_request
+rest_delete_request
+);
+
+BEGIN
+{
+
+#search data
+
+sub rest_get_request {
+my $uri = shift;
+my $login = shift;
+my $pass = shift;
+#disable check cert
+my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], ssl_opts=> { SSL_verify_mode => SSL_VERIFY_NONE(), verify_hostname =>0 } );
+#get request
+my $req = HTTP::Request->new('GET', $uri);
+#basic authorize
+$req->authorization_basic($login,$pass);
+#send request
+log_info("Send request: ".$uri);
+my $resp = $ua->request($req);
+my $ret = $resp->is_success;
+if ($ret) {
+    my $result = decode_json($resp->decoded_content);
+    log_debug("Received reply: ".Dumper($result));
+    return $result;
+    } else {
+    log_error("HTTP GET error code: ".$resp->code);
+    log_error("HTTP GET error message: ".$resp->message);
+    return;
+    }
+}
+
+#change data
+
+sub rest_patch_request {
+my $uri = shift;
+my $data = shift;
+my $login = shift;
+my $pass = shift;
+#disable check cert
+my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], ssl_opts=> { SSL_verify_mode => SSL_VERIFY_NONE(), verify_hostname =>0 } );
+#header
+my $hr = [ 'Content-Type' => 'application/json' ];
+#encode
+my $encoded_data = encode_json($data);
+#patch request
+my $req = HTTP::Request->new('PATCH','$uri', $hr, $encoded_data);
+#basic authorize
+$req->authorization_basic($login,$pass);
+#run patch
+my $resp = $ua->request($req,$uri);
+my $ret = $resp->is_success;
+if ($ret) {
+    my $result = decode_json($resp->decoded_content);
+    log_debug("Received reply: ".Dumper($result));
+    return $result;
+    } else {
+    log_error("HTTP PATCH error code: ".$resp->code);
+    log_error("HTTP PATCH error message: ".$resp->message);
+    return;
+    }
+}
+
+#add new data
+
+sub rest_put_request {
+my $uri = shift;
+my $data = shift;
+my $login = shift;
+my $pass = shift;
+#disable check cert
+my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], ssl_opts=> { SSL_verify_mode => SSL_VERIFY_NONE(), verify_hostname =>0 } );
+#header
+my $hr = [ 'Content-Type' => 'application/json' ];
+#encode
+my $encoded_data = encode_json($data);
+#patch request
+my $req = HTTP::Request->new('PUT','$uri', $hr, $encoded_data);
+#basic authorize
+$req->authorization_basic($login,$pass);
+#put
+my $resp = $ua->request($req,$uri);
+my $ret = $resp->is_success;
+if ($ret) {
+    my $result = decode_json($resp->decoded_content);
+    log_debug("Received reply: ".Dumper($result));
+    return $result;
+    } else {
+    log_error("HTTP PUT error code: ".$resp->code);
+    log_error("HTTP PUT error message: ".$resp->message);
+    return;
+    }
+}
+
+#delete data
+
+sub rest_delete_request {
+my $uri = shift;
+my $login = shift;
+my $pass = shift;
+#disable check cert
+my $ua = LWP::UserAgent->new(protocols_allowed => ['http', 'https'], ssl_opts=> { SSL_verify_mode => SSL_VERIFY_NONE(), verify_hostname =>0 } );
+#delete request
+my $req = HTTP::Request->new('DELETE','$uri');
+#basic authorize
+$req->authorization_basic($login,$pass);
+#delete
+my $resp = $ua->request($req,$uri);
+my $ret = $resp->is_success;
+if ($ret) {
+    my $result = decode_json($resp->decoded_content);
+    log_debug("Received reply: ".Dumper($result));
+    return $result;
+    } else {
+    log_error("HTTP DELETE error code: ".$resp->code);
+    log_error("HTTP DELETE error message: ".$resp->message);
+    return;
+    }
+}
+
+1;
+}

+ 9 - 0
scripts/sync_mikrotik.pl

@@ -213,12 +213,14 @@ if (!exists $leases{$ip}) {
     db_log_verbose($dbh,"Address $ip not found in stat. Remove from router.");
     push(@cmd_list,':foreach i in [/ip dhcp-server lease find where address='.$ip.' ] do={/ip dhcp-server lease remove $i};');
     push(@cmd_list,'/ip dhcp-server lease remove [find address='.$ip.']');
+    push(@cmd_list,'/ip arp remove [find address='.$ip.']');
     next;
     }
 if ($leases{$ip}{mac}!~/$active_leases{$ip}{mac}/i) {
     db_log_verbose($dbh,"Mac-address mismatch for ip $ip. stat: $leases{$ip}{mac} active: $active_leases{$ip}{mac}. Remove lease from router.");
     push(@cmd_list,':foreach i in [/ip dhcp-server lease find where address='.$ip.' ] do={/ip dhcp-server lease remove $i};');
     push(@cmd_list,'/ip dhcp-server lease remove [find address='.$ip.']');
+    push(@cmd_list,'/ip arp remove [find address='.$ip.']');
     next;
     }
 next if (!$leases{$ip}{acl} and !$active_leases{$ip}{acl});
@@ -226,6 +228,7 @@ if ($leases{$ip}{acl}!~/$active_leases{$ip}{acl}/) {
     db_log_error($dbh,"Acl mismatch for ip $ip. stat: $leases{$ip}{acl} active: $active_leases{$ip}{acl}. Remove lease from router.");
     push(@cmd_list,':foreach i in [/ip dhcp-server lease find where address='.$ip.' ] do={/ip dhcp-server lease remove $i};');
     push(@cmd_list,'/ip dhcp-server lease remove [find address='.$ip.']');
+    push(@cmd_list,'/ip arp remove [find address='.$ip.']');
     next;
     }
 }
@@ -253,6 +256,8 @@ if (!exists $active_leases{$ip}) {
     push(@cmd_list,'/ip dhcp-server lease remove [find address='.$ip.']');
     #add new bind
     push(@cmd_list,'/ip dhcp-server lease add address='.$ip.' mac-address='.$leases{$ip}{mac}.' '.$acl.' server=dhcp-'.$int.' '.$comment);
+    #clear arp record
+    push(@cmd_list,'/ip arp remove [find mac-address='.uc($leases{$ip}{mac}).']');
     next;
     }
 if ($leases{$ip}{mac}!~/$active_leases{$ip}{mac}/i) {
@@ -265,6 +270,8 @@ if ($leases{$ip}{mac}!~/$active_leases{$ip}{mac}/i) {
     push(@cmd_list,'/ip dhcp-server lease remove [find address='.$ip.']');
     #add new bind
     push(@cmd_list,'/ip dhcp-server lease add address='.$ip.' mac-address='.$leases{$ip}{mac}.' '.$acl.' server=dhcp-'.$int.' '.$comment);
+    #clear arp record
+    push(@cmd_list,'/ip arp remove [find mac-address='.uc($leases{$ip}{mac}).']');
     next;
     }
 next if (!$leases{$ip}{acl} and !$active_leases{$ip}{acl});
@@ -273,6 +280,8 @@ if ($leases{$ip}{acl}!~/$active_leases{$ip}{acl}/) {
     push(@cmd_list,':foreach i in [/ip dhcp-server lease find where mac-address='.uc($leases{$ip}{mac}).' ] do={/ip dhcp-server lease remove $i};');
     push(@cmd_list,'/ip dhcp-server lease remove [find mac-address='.uc($leases{$ip}{mac}).']');
     push(@cmd_list,'/ip dhcp-server lease add address='.$ip.' mac-address='.$leases{$ip}{mac}.' '.$acl.' server=dhcp-'.$int.' '.$comment);
+    #clear arp record
+    push(@cmd_list,'/ip arp remove [find mac-address='.uc($leases{$ip}{mac}).']');
     next;
     }
 }