13
13
package org .openhab .binding .snmp .internal ;
14
14
15
15
import java .io .IOException ;
16
+ import java .net .InetAddress ;
16
17
import java .util .ArrayList ;
18
+ import java .util .HashMap ;
17
19
import java .util .HashSet ;
18
20
import java .util .List ;
19
21
import java .util .Map ;
22
+ import java .util .Objects ;
20
23
import java .util .Set ;
21
24
22
25
import org .eclipse .jdt .annotation .NonNullByDefault ;
23
26
import org .eclipse .jdt .annotation .Nullable ;
24
27
import org .openhab .binding .snmp .internal .config .SnmpServiceConfiguration ;
25
28
import org .openhab .core .config .core .Configuration ;
29
+ import org .openhab .core .net .CidrAddress ;
30
+ import org .openhab .core .net .NetworkAddressChangeListener ;
31
+ import org .openhab .core .net .NetworkAddressService ;
26
32
import org .osgi .service .component .annotations .Activate ;
27
33
import org .osgi .service .component .annotations .Component ;
28
34
import org .osgi .service .component .annotations .Deactivate ;
29
35
import org .osgi .service .component .annotations .Modified ;
36
+ import org .osgi .service .component .annotations .Reference ;
30
37
import org .slf4j .Logger ;
31
38
import org .slf4j .LoggerFactory ;
32
39
import org .snmp4j .CommandResponder ;
64
71
65
72
@ NonNullByDefault
66
73
@ Component (configurationPid = "binding.snmp" , service = SnmpService .class )
67
- public class SnmpServiceImpl implements SnmpService {
74
+ public class SnmpServiceImpl implements SnmpService , NetworkAddressChangeListener {
68
75
private final Logger logger = LoggerFactory .getLogger (SnmpServiceImpl .class );
69
76
70
77
private @ Nullable Snmp snmp ;
71
78
private @ Nullable DefaultUdpTransportMapping transport ;
79
+ private final NetworkAddressService networkAddressService ;
72
80
73
81
private final List <CommandResponder > listeners = new ArrayList <>();
74
82
private final Set <UserEntry > userEntries = new HashSet <>();
83
+ private Map <String , Object > config = new HashMap <>();
75
84
76
85
@ Activate
77
- public SnmpServiceImpl (Map <String , Object > config ) {
86
+ public SnmpServiceImpl (Map <String , Object > config , @ Reference NetworkAddressService networkAddressService ) {
78
87
addProtocols ();
79
88
OctetString localEngineId = new OctetString (MPv3 .createLocalEngineID ());
80
89
USM usm = new USM (SecurityProtocols .getInstance (), localEngineId , 0 );
81
90
SecurityModels .getInstance ().addSecurityModel (usm );
82
-
91
+ this .networkAddressService = networkAddressService ;
92
+ networkAddressService .addNetworkAddressChangeListener (this );
83
93
modified (config );
84
94
}
85
95
86
96
@ Modified
87
97
protected void modified (Map <String , Object > config ) {
98
+ this .config = config ;
88
99
SnmpServiceConfiguration snmpCfg = new Configuration (config ).as (SnmpServiceConfiguration .class );
89
100
try {
90
101
shutdownSnmp ();
91
102
92
103
final DefaultUdpTransportMapping transport ;
93
104
94
105
if (snmpCfg .port > 0 ) {
95
- transport = new DefaultUdpTransportMapping (new UdpAddress (snmpCfg .port ), true );
106
+ InetAddress inetAddress = Objects .requireNonNullElse (
107
+ InetAddress .getByName (networkAddressService .getPrimaryIpv4HostAddress ()),
108
+ InetAddress .getLocalHost ());
109
+ transport = new DefaultUdpTransportMapping (new UdpAddress (inetAddress , snmpCfg .port ), true );
96
110
} else {
97
111
transport = new DefaultUdpTransportMapping ();
98
112
}
@@ -109,7 +123,7 @@ protected void modified(Map<String, Object> config) {
109
123
this .snmp = snmp ;
110
124
this .transport = transport ;
111
125
112
- logger .debug ( "initialized SNMP at {}" , transport .getAddress ());
126
+ logger .info ( "Initialized SNMP service at {}" , transport .getAddress ());
113
127
} catch (IOException e ) {
114
128
logger .warn ("could not open SNMP instance on port {}: {}" , snmpCfg .port , e .getMessage ());
115
129
}
@@ -121,7 +135,7 @@ public void deactivate() {
121
135
try {
122
136
shutdownSnmp ();
123
137
} catch (IOException e ) {
124
- logger .info ( "could not end SNMP: {}" , e .getMessage ());
138
+ logger .warn ( "Could not end SNMP service : {}" , e .getMessage ());
125
139
}
126
140
}
127
141
@@ -222,4 +236,10 @@ public UserEntry(UsmUser user, OctetString engineId) {
222
236
this .user = user ;
223
237
}
224
238
}
239
+
240
+ @ Override
241
+ public void onChanged (List <CidrAddress > added , List <CidrAddress > removed ) {
242
+ logger .trace ("SNMP reacting on network interface changes." );
243
+ modified (this .config );
244
+ }
225
245
}
0 commit comments