Skip to content

Commit 464bca5

Browse files
adamierymenkojoseph-henryglimberg
authored
1.12.1 (#2112)
* Fix primary port binding issue in 1.12 (#2107) * Add test for primary port bindings to validator - See #2105 * Add delay to binding test * Remove TCP binding logic from Binder to fix #2105 * add second control plane socket for ipv6 * fix controller network post endpoint * exit if we can't bind at least one of IPV4 or IPV6 for control plane port --------- Co-authored-by: Grant Limberg <grant.limberg@zerotier.com> * Version bump, Linux version stuff, Debian dependencies from 1.12.0 rebuild, release notes. * macOS version bump in installer * Windows version bump. --------- Co-authored-by: Joseph Henry <joseph.henry@zerotier.com> Co-authored-by: Grant Limberg <grant.limberg@zerotier.com>
1 parent 0e5651f commit 464bca5

File tree

15 files changed

+274
-101
lines changed

15 files changed

+274
-101
lines changed

.github/workflows/validate-linux.sh

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ mkdir $TEST_DIR_PREFIX
2020
# How long we will wait for ZT to come online before considering it a failure
2121
MAX_WAIT_SECS=30
2222

23+
ZT_PORT_NODE_1=9996
24+
ZT_PORT_NODE_2=9997
25+
2326
################################################################################
2427
# Multi-node connectivity and performance test #
2528
################################################################################
@@ -99,14 +102,19 @@ test() {
99102
--xml=yes \
100103
--xml-file=$FILENAME_MEMORY_LOG \
101104
--leak-check=full \
102-
./zerotier-one node1 -p9996 -U >>node_1.log 2>&1 &
105+
./zerotier-one node1 -p$ZT_PORT_NODE_1 -U >>node_1.log 2>&1 &
103106

104107
# Second instance, not run in memory profiler
105108
# Don't set up internet access until _after_ zerotier is running
106109
# This has been a source of stuckness in the past.
107110
$NS2 ip addr del 192.168.1.2/24 dev veth3
108-
$NS2 sudo ./zerotier-one node2 -U -p9997 >>node_2.log 2>&1 &
109-
sleep 1;
111+
$NS2 sudo ./zerotier-one node2 -U -p$ZT_PORT_NODE_2 >>node_2.log 2>&1 &
112+
113+
sleep 10; # New HTTP control plane is a bit sluggish, so we delay here
114+
115+
check_bind_to_correct_ports $ZT_PORT_NODE_1
116+
check_bind_to_correct_ports $ZT_PORT_NODE_2
117+
110118
$NS2 ip addr add 192.168.1.2/24 dev veth3
111119
$NS2 ip route add default via 192.168.1.1
112120

@@ -458,4 +466,32 @@ check_exit_on_invalid_identity() {
458466
fi
459467
}
460468

469+
################################################################################
470+
# Check that we're binding to the primary port for TCP/TCP6/UDP #
471+
################################################################################
472+
473+
check_bind_to_correct_ports() {
474+
PORT_NUMBER=$1
475+
echo "Checking bound ports:"
476+
sudo netstat -anp | grep "$PORT_NUMBER" | grep "zerotier"
477+
if [[ $(sudo netstat -anp | grep "$PORT_NUMBER" | grep "zerotier" | grep "tcp") ]];
478+
then
479+
:
480+
else
481+
exit_test_and_generate_report $TEST_FAIL "ZeroTier did not bind to tcp/$1"
482+
fi
483+
if [[ $(sudo netstat -anp | grep "$PORT_NUMBER" | grep "zerotier" | grep "tcp6") ]];
484+
then
485+
:
486+
else
487+
exit_test_and_generate_report $TEST_FAIL "ZeroTier did not bind to tcp6/$1"
488+
fi
489+
if [[ $(sudo netstat -anp | grep "$PORT_NUMBER" | grep "zerotier" | grep "udp") ]];
490+
then
491+
:
492+
else
493+
exit_test_and_generate_report $TEST_FAIL "ZeroTier did not bind to udp/$1"
494+
fi
495+
}
496+
461497
test "$@"

RELEASE-NOTES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
ZeroTier Release Notes
22
======
33

4+
# 2023-08-25 -- Version 1.12.1
5+
6+
* Minor release to fix a port binding issue in Linux.
7+
* Update Debian dependencies.
8+
* No changes for other platforms.
9+
410
# 2023-08-23 -- Version 1.12.0
511

612
* Experimental Windows ARM64 support

controller/EmbeddedNetworkController.cpp

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -863,9 +863,17 @@ std::string EmbeddedNetworkController::networkUpdateFromPostData(uint64_t networ
863863

864864
void EmbeddedNetworkController::configureHTTPControlPlane(
865865
httplib::Server &s,
866+
httplib::Server &sv6,
866867
const std::function<void(const httplib::Request&, httplib::Response&, std::string)> setContent)
867868
{
868-
s.Get("/controller/network", [&, setContent](const httplib::Request &req, httplib::Response &res) {
869+
// Control plane Endpoints
870+
std::string networkListPath = "/controller/network";
871+
std::string networkPath = "/controller/network/([0-9a-fA-F]{16})";
872+
std::string oldAndBustedNetworkCreatePath = "/controller/network/([0-9a-fA-F]{10})______";
873+
std::string memberListPath = "/controller/network/([0-9a-fA-F]{16})/member";
874+
std::string memberPath = "/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})";
875+
876+
auto networkListGet = [&, setContent](const httplib::Request &req, httplib::Response &res) {
869877
std::set<uint64_t> networkIds;
870878
_db.networks(networkIds);
871879
char tmp[64];
@@ -877,9 +885,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
877885
}
878886

879887
setContent(req, res, out.dump());
880-
});
888+
};
889+
s.Get(networkListPath, networkListGet);
890+
sv6.Get(networkListPath, networkListGet);
881891

882-
s.Get("/controller/network/([0-9a-fA-F]{16})", [&, setContent](const httplib::Request &req, httplib::Response &res) {
892+
auto networkGet = [&, setContent](const httplib::Request &req, httplib::Response &res) {
883893
auto networkID = req.matches[1];
884894
uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
885895
json network;
@@ -889,7 +899,9 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
889899
}
890900

891901
setContent(req, res, network.dump());
892-
});
902+
};
903+
s.Get(networkPath, networkGet);
904+
sv6.Get(networkPath, networkGet);
893905

894906
auto createNewNetwork = [&, setContent](const httplib::Request &req, httplib::Response &res) {
895907
fprintf(stderr, "creating new network (new style)\n");
@@ -912,8 +924,10 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
912924

913925
setContent(req, res, networkUpdateFromPostData(nwid, req.body));
914926
};
915-
s.Put("/controller/network", createNewNetwork);
916-
s.Post("/controller/network", createNewNetwork);
927+
s.Put(networkListPath, createNewNetwork);
928+
s.Post(networkListPath, createNewNetwork);
929+
sv6.Put(networkListPath, createNewNetwork);
930+
sv6.Post(networkListPath, createNewNetwork);
917931

918932
auto createNewNetworkOldAndBusted = [&, setContent](const httplib::Request &req, httplib::Response &res) {
919933
auto inID = req.matches[1].str();
@@ -941,10 +955,24 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
941955
}
942956
setContent(req, res, networkUpdateFromPostData(nwid, req.body));
943957
};
944-
s.Put("/controller/network/([0-9a-fA-F]{10})______", createNewNetworkOldAndBusted);
945-
s.Post("/controller/network/([0-9a-fA-F]{10})______", createNewNetworkOldAndBusted);
958+
s.Put(oldAndBustedNetworkCreatePath, createNewNetworkOldAndBusted);
959+
s.Post(oldAndBustedNetworkCreatePath, createNewNetworkOldAndBusted);
960+
sv6.Put(oldAndBustedNetworkCreatePath, createNewNetworkOldAndBusted);
961+
sv6.Post(oldAndBustedNetworkCreatePath, createNewNetworkOldAndBusted);
962+
963+
auto networkPost = [&, setContent](const httplib::Request &req, httplib::Response &res) {
964+
auto networkID = req.matches[1].str();
965+
uint64_t nwid = Utils::hexStrToU64(networkID.c_str());
966+
967+
res.status = 200;
968+
setContent(req, res, networkUpdateFromPostData(nwid, req.body));
969+
};
970+
s.Put(networkPath, networkPost);
971+
s.Post(networkPath, networkPost);
972+
sv6.Put(networkPath, networkPost);
973+
sv6.Post(networkPath, networkPost);
946974

947-
s.Delete("/controller/network/([0-9a-fA-F]{16})", [&, setContent](const httplib::Request &req, httplib::Response &res) {
975+
auto networkDelete = [&, setContent](const httplib::Request &req, httplib::Response &res) {
948976
auto networkID = req.matches[1].str();
949977
uint64_t nwid = Utils::hexStrToU64(networkID.c_str());
950978

@@ -956,9 +984,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
956984

957985
_db.eraseNetwork(nwid);
958986
setContent(req, res, network.dump());
959-
});
987+
};
988+
s.Delete(networkPath, networkDelete);
989+
sv6.Delete(networkPath, networkDelete);
960990

961-
s.Get("/controller/network/([0-9a-fA-F]{16})/member", [&, setContent](const httplib::Request &req, httplib::Response &res) {
991+
auto memberListGet = [&, setContent](const httplib::Request &req, httplib::Response &res) {
962992
auto networkID = req.matches[1];
963993
uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
964994
json network;
@@ -982,9 +1012,11 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
9821012
}
9831013

9841014
setContent(req, res, out.dump());
985-
});
1015+
};
1016+
s.Get(memberListPath, memberListGet);
1017+
sv6.Get(memberListPath, memberListGet);
9861018

987-
s.Get("/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})", [&, setContent](const httplib::Request &req, httplib::Response &res) {
1019+
auto memberGet = [&, setContent](const httplib::Request &req, httplib::Response &res) {
9881020
auto networkID = req.matches[1];
9891021
auto memberID = req.matches[2];
9901022
uint64_t nwid = Utils::hexStrToU64(networkID.str().c_str());
@@ -997,7 +1029,9 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
9971029
}
9981030

9991031
setContent(req, res, member.dump());
1000-
});
1032+
};
1033+
s.Get(memberPath, memberGet);
1034+
sv6.Get(memberPath, memberGet);
10011035

10021036
auto memberPost = [&, setContent](const httplib::Request &req, httplib::Response &res) {
10031037
auto networkID = req.matches[1].str();
@@ -1102,10 +1136,12 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
11021136

11031137
setContent(req, res, member.dump());
11041138
};
1105-
s.Put("/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})", memberPost);
1106-
s.Post("/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})", memberPost);
1139+
s.Put(memberPath, memberPost);
1140+
s.Post(memberPath, memberPost);
1141+
sv6.Put(memberPath, memberPost);
1142+
sv6.Post(memberPath, memberPost);
11071143

1108-
s.Delete("/controller/network/([0-9a-fA-F]{16})/member/([0-9a-fA-F]{10})", [&, setContent](const httplib::Request &req, httplib::Response &res) {
1144+
auto memberDelete = [&, setContent](const httplib::Request &req, httplib::Response &res) {
11091145
auto networkID = req.matches[1].str();
11101146
auto memberID = req.matches[2].str();
11111147

@@ -1126,7 +1162,9 @@ void EmbeddedNetworkController::configureHTTPControlPlane(
11261162
_db.eraseMember(nwid, address);
11271163

11281164
setContent(req, res, member.dump());
1129-
});
1165+
};
1166+
s.Delete(memberPath, memberDelete);
1167+
sv6.Delete(memberPath, memberDelete);
11301168
}
11311169

11321170
void EmbeddedNetworkController::handleRemoteTrace(const ZT_RemoteTrace &rt)

controller/EmbeddedNetworkController.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ class EmbeddedNetworkController : public NetworkController,public DB::ChangeList
7070

7171
void configureHTTPControlPlane(
7272
httplib::Server &s,
73+
httplib::Server &sV6,
7374
const std::function<void(const httplib::Request&, httplib::Response&, std::string)>);
7475

7576
void handleRemoteTrace(const ZT_RemoteTrace &rt);

debian/changelog

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
zerotier-one (1.12.1) unstable; urgency=medium
2+
3+
* See RELEASE-NOTES.md for release notes.
4+
5+
-- Adam Ierymenko <adam.ierymenko@zerotier.com> Fri, 25 Aug 2023 01:00:00 -0700
6+
17
zerotier-one (1.12.0) unstable; urgency=medium
28

39
* See RELEASE-NOTES.md for release notes.

debian/control

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Homepage: https://www.zerotier.com/
1010

1111
Package: zerotier-one
1212
Architecture: any
13-
Depends: iproute2, adduser, libstdc++6 (>= 5), openssl
13+
Depends: adduser, libstdc++6 (>= 5), openssl
1414
Homepage: https://www.zerotier.com/
1515
Description: ZeroTier network virtualization service
1616
ZeroTier One lets you join ZeroTier virtual networks and

debian/control.wheezy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Homepage: https://www.zerotier.com/
1010

1111
Package: zerotier-one
1212
Architecture: any
13-
Depends: ${shlibs:Depends}, ${misc:Depends}, iproute, libstdc++6
13+
Depends: ${shlibs:Depends}, ${misc:Depends}, libstdc++6
1414
Homepage: https://www.zerotier.com/
1515
Description: ZeroTier network virtualization service
1616
ZeroTier One lets you join ZeroTier virtual networks and

debian/rules

100755100644
File mode changed.

debian/rules.wheezy

100755100644
File mode changed.

ext/installfiles/mac/ZeroTier One.pkgproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,7 @@
701701
<key>USE_HFS+_COMPRESSION</key>
702702
<false/>
703703
<key>VERSION</key>
704-
<string>1.12.0</string>
704+
<string>1.12.1</string>
705705
</dict>
706706
<key>TYPE</key>
707707
<integer>0</integer>

0 commit comments

Comments
 (0)