Compare commits

..

15 Commits

Author SHA1 Message Date
kirillius a3d9be54f7 bump javadoc plugin 2026-07-05 07:29:16 +00:00
kirillius 8d056a7cea hotfix: bump compiler target version 2026-07-05 07:20:10 +00:00
kirillius 60fe180b81 Merge pull request 'added support for !empty response' (#1) from kirillius-patch-1 into master
Reviewed-on: #1
2026-07-05 07:16:16 +00:00
kirillius 0243318870 Обновить pom.xml 2026-07-05 07:15:58 +00:00
kirillius 4939c65f57 added support for !empty response 2026-07-05 07:14:30 +00:00
Gideon Le Grange ec5f665081 Updated README 2024-09-26 14:41:43 +02:00
Gideon Le Grange e3cf6a933a Fixed NPE (Bumped to 3.0.8) 2024-09-26 14:36:54 +02:00
Gideon le Grange ed0468dbf9
Merge pull request #88 from unlimmitted/master
Fix NullPointerException
2024-09-26 14:32:03 +02:00
unlimmitted bfbe50732d Fix NullPointerException 2024-09-21 16:50:56 +03:00
Gideon Le Grange 75a140f79f Merge branch 'master' of github.com:GideonLeGrange/mikrotik-java 2021-01-18 09:31:58 +02:00
Gideon Le Grange 3424482aab Backup 2021-01-18 09:31:34 +02:00
Gideon le Grange 7a629d3b85
Merge pull request #80 from GideonLeGrange/dependabot/maven/junit-junit-4.13.1
Bump junit from 3.8.1 to 4.13.1
2020-10-13 08:06:54 +02:00
dependabot[bot] 603f34ca6e
Bump junit from 3.8.1 to 4.13.1
Bumps [junit](https://github.com/junit-team/junit4) from 3.8.1 to 4.13.1.
- [Release notes](https://github.com/junit-team/junit4/releases)
- [Changelog](https://github.com/junit-team/junit4/blob/main/doc/ReleaseNotes4.13.1.md)
- [Commits](https://github.com/junit-team/junit4/commits/r4.13.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-10-13 03:31:10 +00:00
Gideon le Grange 0f312c2232
Update README.md 2020-08-24 17:35:19 +02:00
Gideon le Grange 5bc5263aaf
Create maven.yml 2020-08-24 17:34:42 +02:00
6 changed files with 93 additions and 39 deletions

24
.github/workflows/maven.yml vendored Normal file
View File

@ -0,0 +1,24 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI with Maven
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: mvn -B package --file pom.xml

View File

@ -6,11 +6,11 @@ This project provides a Java client to manipulate Mikrotik routers using the rem
## Versions ## Versions
[![Build Status](https://travis-ci.org/GideonLeGrange/mikrotik-java.svg?branch=master)](https://travis-ci.org/GideonLeGrange/mikrotik-java) ![Java CI with Maven](https://github.com/GideonLeGrange/mikrotik-java/workflows/Java%20CI%20with%20Maven/badge.svg)
**The current stable version is 3.0.7** **The current stable version is 3.0.8**
Version 3.0.7 fixes nested expressions when constructing complex queries using `and` and `or` expressions. See [#72](https://github.com/GideonLeGrange/mikrotik-java/issues/72) for more information Version 3.0.8 fixes a null pointer error
### Changes in version 3.0: ### Changes in version 3.0:
@ -35,7 +35,7 @@ Maven users can use the artifact from Maven Central with this dependency:
<dependency> <dependency>
<groupId>me.legrange</groupId> <groupId>me.legrange</groupId>
<artifactId>mikrotik</artifactId> <artifactId>mikrotik</artifactId>
<version>3.0.7</version> <version>3.0.8</version>
</dependency> </dependency>
``` ```

10
pom.xml
View File

@ -9,7 +9,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>me.legrange</groupId> <groupId>me.legrange</groupId>
<artifactId>mikrotik</artifactId> <artifactId>mikrotik</artifactId>
<version>3.0.7</version> <version>3.0.8.1</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>Mikrotik API Java Client Library</name> <name>Mikrotik API Java Client Library</name>
<url>https://github.com/GideonLeGrange/mikrotik-java</url> <url>https://github.com/GideonLeGrange/mikrotik-java</url>
@ -33,8 +33,8 @@
<version>2.3.2</version> <version>2.3.2</version>
<configuration> <configuration>
<showDeprecation>true</showDeprecation> <showDeprecation>true</showDeprecation>
<source>1.7</source> <source>8</source>
<target>1.7</target> <target>8</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>
@ -73,7 +73,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId> <artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version> <version>3.7.0</version>
<configuration> <configuration>
<excludePackageNames>example;*.impl</excludePackageNames> <excludePackageNames>example;*.impl</excludePackageNames>
</configuration> </configuration>
@ -161,7 +161,7 @@
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
<version>3.8.1</version> <version>4.13.1</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -7,8 +7,8 @@ package examples;
*/ */
public class Config { public class Config {
public static final String HOST = "192.168.1.25"; public static final String HOST = "ce2.ter.cpt.adept.za.net";
public static final String USERNAME = "admin"; public static final String USERNAME = "adept";
public static final String PASSWORD = ""; public static final String PASSWORD = "34ffp9";
} }

View File

@ -0,0 +1,28 @@
package examples;
import me.legrange.mikrotik.MikrotikApiException;
/**
* Example 1: A very simple command: Reboot the remote router
* @author gideon
*/
public class ScriptCommand extends Example {
public static void main(String...args) throws Exception {
ScriptCommand ex = new ScriptCommand();
ex.connect();
ex.test();
ex.disconnect();
}
private void test() throws MikrotikApiException {
con.execute("/ip/hotspot/user/profile/add name=\"cahyo-cek-2\" idle-timeout=none keepalive-timeout=2m status-autorefresh=1m shared-users=1 add-mac-cookie=true mac-cookie-timeout=3d parent-queue=none rate-limit=512k/512k on-login=:put(\",re,3000,12d,3000,,Enable,\")");
}
///
/*
/ip/hotspot/user/profile/add name="cahyo-cek-2" idle-timeout=none keepalive-timeout=2m status-autorefresh=1m shared-users=1 add-mac-cookie=true mac-cookie-timeout=3d parent-queue=none rate-limit=512k/512k on-login=:put (",re,3000,12d,3000,,Enable,");
/system scheduler add name="usercahyo-cek-2-$user" interval=12:00:00 on-even="/ip hotspot active remove [find user=\"$user\"] ; /ip hotspot user set \"$user\" disable=yes ; /system scheduler remove [find name=usercahyo-cek-2-$user]"
*/
}

View File

@ -14,6 +14,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import javax.net.SocketFactory; import javax.net.SocketFactory;
import me.legrange.mikrotik.ApiConnection; import me.legrange.mikrotik.ApiConnection;
import me.legrange.mikrotik.ApiConnectionException; import me.legrange.mikrotik.ApiConnectionException;
@ -162,8 +163,7 @@ public final class ApiConnectionImpl extends ApiConnection {
} }
private synchronized String nextTag() { private synchronized String nextTag() {
_tag++; return Integer.toHexString(_tag.incrementAndGet());
return Integer.toHexString(_tag);
} }
private Socket sock = null; private Socket sock = null;
@ -173,7 +173,7 @@ public final class ApiConnectionImpl extends ApiConnection {
private Reader reader; private Reader reader;
private Processor processor; private Processor processor;
private final Map<String, ResultListener> listeners; private final Map<String, ResultListener> listeners;
private Integer _tag = 0; private final AtomicInteger _tag = new AtomicInteger(0);
private int timeout = ApiConnection.DEFAULT_COMMAND_TIMEOUT; private int timeout = ApiConnection.DEFAULT_COMMAND_TIMEOUT;
/** /**
@ -186,7 +186,7 @@ public final class ApiConnectionImpl extends ApiConnection {
} }
private String take() throws ApiConnectionException, ApiDataException { private String take() throws ApiConnectionException, ApiDataException {
Object val = null; Object val;
try { try {
val = queue.take(); val = queue.take();
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
@ -223,7 +223,7 @@ public final class ApiConnectionImpl extends ApiConnection {
private void put(Object data) { private void put(Object data) {
try { try {
queue.put(data); queue.put(data);
} catch (InterruptedException ex) { } catch (InterruptedException ignored) {
} }
} }
@ -255,6 +255,7 @@ public final class ApiConnectionImpl extends ApiConnection {
} catch (MikrotikApiException ex) { } catch (MikrotikApiException ex) {
continue; continue;
} }
if (res.getTag() != null) {
ResultListener l = listeners.get(res.getTag()); ResultListener l = listeners.get(res.getTag());
if (l != null) { if (l != null) {
if (res instanceof Result) { if (res instanceof Result) {
@ -270,13 +271,16 @@ public final class ApiConnectionImpl extends ApiConnection {
l.error(new ApiCommandException((Error) res)); l.error(new ApiCommandException((Error) res));
} }
} }
} else {
nextTag();
}
} }
} }
private void nextLine() throws ApiConnectionException, ApiDataException { private void nextLine() throws ApiConnectionException, ApiDataException {
if (lines.isEmpty()) { if (lines.isEmpty()) {
String block = reader.take(); String block = reader.take();
String parts[] = block.split("\n"); String[] parts = block.split("\n");
lines.addAll(Arrays.asList(parts)); lines.addAll(Arrays.asList(parts));
} }
line = lines.remove(0); line = lines.remove(0);
@ -289,7 +293,7 @@ public final class ApiConnectionImpl extends ApiConnection {
private String peekLine() throws ApiConnectionException, ApiDataException { private String peekLine() throws ApiConnectionException, ApiDataException {
if (lines.isEmpty()) { if (lines.isEmpty()) {
String block = reader.take(); String block = reader.take();
String parts[] = block.split("\n"); String[] parts = block.split("\n");
lines.addAll(Arrays.asList(parts)); lines.addAll(Arrays.asList(parts));
} }
return lines.get(0); return lines.get(0);
@ -302,10 +306,10 @@ public final class ApiConnectionImpl extends ApiConnection {
switch (line) { switch (line) {
case "!re": case "!re":
return unpackRe(); return unpackRe();
case "!empty":
case "!done": case "!done":
return unpackDone(); return unpackDone();
case "!trap": case "!trap":
return unpackError();
case "!halt": case "!halt":
return unpackError(); return unpackError();
case "": case "":
@ -316,12 +320,10 @@ public final class ApiConnectionImpl extends ApiConnection {
private Result unpackRe() throws ApiDataException, ApiConnectionException { private Result unpackRe() throws ApiDataException, ApiConnectionException {
nextLine(); nextLine();
int l = 0;
Result res = new Result(); Result res = new Result();
while (!line.startsWith(("!"))) { while (!line.startsWith(("!"))) {
l++;
if (line.startsWith(("="))) { if (line.startsWith(("="))) {
String parts[] = line.split("=", 3); String[] parts = line.split("=", 3);
if (parts.length == 3) { if (parts.length == 3) {
if (!parts[2].endsWith("\r")) { if (!parts[2].endsWith("\r")) {
res.put(parts[1], unpackResult(parts[2])); res.put(parts[1], unpackResult(parts[2]));
@ -338,7 +340,7 @@ public final class ApiConnectionImpl extends ApiConnection {
throw new ApiDataException(String.format("Malformed line '%s'", line)); throw new ApiDataException(String.format("Malformed line '%s'", line));
} }
} else if (line.startsWith(".tag=")) { } else if (line.startsWith(".tag=")) {
String parts[] = line.split("=", 2); String[] parts = line.split("=", 2);
if (parts.length == 2) { if (parts.length == 2) {
res.setTag(parts[1]); res.setTag(parts[1]);
} }
@ -379,12 +381,12 @@ public final class ApiConnectionImpl extends ApiConnection {
while (!line.startsWith("!")) { while (!line.startsWith("!")) {
if (line.startsWith(".tag=")) { if (line.startsWith(".tag=")) {
String parts[] = line.split("=", 2); String[] parts = line.split("=", 2);
if (parts.length == 2) { if (parts.length == 2) {
done.setTag(parts[1]); done.setTag(parts[1]);
} }
} else if (line.startsWith(("=ret"))) { } else if (line.startsWith(("=ret"))) {
String parts[] = line.split("=", 3); String[] parts = line.split("=", 3);
if (parts.length == 3) { if (parts.length == 3) {
done.setHash(parts[2]); done.setHash(parts[2]);
} else { } else {
@ -408,7 +410,7 @@ public final class ApiConnectionImpl extends ApiConnection {
if (hasNextLine()) { if (hasNextLine()) {
while (!line.startsWith("!")) { while (!line.startsWith("!")) {
if (line.startsWith(".tag=")) { if (line.startsWith(".tag=")) {
String parts[] = line.split("=", 2); String[] parts = line.split("=", 2);
if (parts.length == 2) { if (parts.length == 2) {
err.setTag(parts[1]); err.setTag(parts[1]);
} }