mirror of
https://github.com/zerotier/libzt.git
synced 2026-09-22 15:29:08 -07:00
removed all contents
This commit is contained in:
@@ -1,17 +0,0 @@
|
||||
ZeroTier One, an endpoint server for the ZeroTier virtual network layer.
|
||||
Copyright © 2011–2016 ZeroTier, Inc.
|
||||
|
||||
ZeroTier One is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or (at
|
||||
your option) any later version.
|
||||
|
||||
See the file ‘LICENSE.GPL-3’ for the text of the GNU GPL version 3.
|
||||
If that file is not present, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
..
|
||||
Local variables:
|
||||
coding: utf-8
|
||||
mode: text
|
||||
End:
|
||||
vim: fileencoding=utf-8 filetype=text :
|
||||
Vendored
-382
@@ -1,382 +0,0 @@
|
||||
#!/usr/bin/env groovy
|
||||
|
||||
def changelog = getChangeLog currentBuild
|
||||
slackSend "Building ${env.JOB_NAME} #${env.BUILD_NUMBER} \n Change Log: \n ${changelog}"
|
||||
|
||||
parallel 'centos7': {
|
||||
node('centos7') {
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// --------------------------- Network Stacks (Linux) ---------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux lwIP IPv4') {
|
||||
sh 'make clean; make lwip SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux lwIP IPv6') {
|
||||
sh 'make clean; make lwip SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux picoTCP IPv4') {
|
||||
sh 'make clean; make pico SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux picoTCP IPv6') {
|
||||
sh 'make clean; make pico SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ------------------------ SDK Service Library (Linux) -------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux_sdk_service (lwIP IPv4)') {
|
||||
sh 'make clean; make linux_sdk_service SDK_LWIP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux_sdk_service (lwIP IPv6)') {
|
||||
sh 'make clean; make linux_sdk_service SDK_LWIP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux_sdk_service (picoTCP IPv4)') {
|
||||
sh 'make clean; make linux_sdk_service SDK_PICOTCP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux_sdk_service (picoTCP IPv6)') {
|
||||
sh 'make clean; make linux_sdk_service SDK_PICOTCP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ---------------------------- static library (Linux) --------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS shared lib') {
|
||||
sh 'make linux_static_lib SDK_PICOTCP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS shared lib') {
|
||||
sh 'make linux_static_lib SDK_PICOTCP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// --------------------------- Intercept Library (Linux) ------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux_intercept') {
|
||||
sh 'make clean; make linux_intercept'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ------------------------------ Unit tests (linux) ----------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('linux tests') {
|
||||
sh 'make tests'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on centos7 (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
}
|
||||
}, 'macOS': {
|
||||
node('macOS') {
|
||||
|
||||
unlockKeychainMac "~/Library/Keychains/login.keychain-db"
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// --------------------------- Network Stacks (macOS) ---------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS lwIP IPv4') {
|
||||
sh 'make clean; make lwip SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS lwIP IPv6') {
|
||||
sh 'make clean; make lwip SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS picoTCP IPv4') {
|
||||
sh 'make clean; make pico SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS picoTCP IPv6') {
|
||||
sh 'make clean; make pico SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// -------------------------- Intercept Library (macOS) -------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('osx_intercept') {
|
||||
sh 'make osx_intercept'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// -------------------------- SDK Service Library (macOS) -----------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('osx_service_and_intercept (lwIP IPv4)') {
|
||||
sh 'make osx_service_and_intercept SDK_LWIP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('osx_service_and_intercept (lwIP IPv6)') {
|
||||
sh 'make osx_service_and_intercept SDK_LWIP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('osx_service_and_intercept (picoTCP IPv4)') {
|
||||
sh 'make osx_service_and_intercept SDK_PICOTCP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('osx_service_and_intercept (lwIP IPv4)') {
|
||||
sh 'make osx_service_and_intercept SDK_PICOTCP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ---------------------------- App Frameworks (macOS) --------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS App Framework') {
|
||||
sh 'make osx_app_framework'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
try {
|
||||
checkout scm
|
||||
stage('iOS App Framework') {
|
||||
sh 'make ios_app_framework'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on iOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
// ------------------------------------------------------------------------------
|
||||
// ----------------------------- static library (macOS) -------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS shared lib') {
|
||||
sh 'make osx_static_lib SDK_PICOTCP=1 SDK_IPV4=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS shared lib') {
|
||||
sh 'make osx_static_lib SDK_PICOTCP=1 SDK_IPV6=1'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// --------------------------- Android JNI Lib (macOS) --------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
//try {
|
||||
// checkout scm
|
||||
// stage('macOS android_jni_lib') {
|
||||
// sh 'make android_jni_lib SDK_LWIP=1 SDK_IPV4=1'
|
||||
// }
|
||||
//}
|
||||
//catch (err) {
|
||||
// currentBuild.result = "FAILURE"
|
||||
// slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
// throw err
|
||||
//}
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// ------------------------------ Unit tests (macOS) ----------------------------
|
||||
// ------------------------------------------------------------------------------
|
||||
|
||||
try {
|
||||
checkout scm
|
||||
stage('macOS tests') {
|
||||
sh 'make tests'
|
||||
}
|
||||
}
|
||||
catch (err) {
|
||||
currentBuild.result = "FAILURE"
|
||||
slackSend color: '#ff0000', message: "${env.JOB_NAME} broken on macOS (<${env.BUILD_URL}|Open>)"
|
||||
throw err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
slackSend color: "#00ff00", message: "${env.JOB_NAME} #${env.BUILD_NUMBER} Complete (<${env.BUILD_URL}|Show More...>)"
|
||||
-339
@@ -1,339 +0,0 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
||||
-674
File diff suppressed because it is too large
Load Diff
@@ -1,22 +0,0 @@
|
||||
# Common makefile -- loads make rules for each platform
|
||||
|
||||
BUILD=build
|
||||
INT=integrations
|
||||
ZT1=zto
|
||||
|
||||
OSTYPE=$(shell uname -s)
|
||||
|
||||
ifeq ($(OSTYPE),Darwin)
|
||||
include make-mac.mk
|
||||
endif
|
||||
|
||||
ifeq ($(OSTYPE),Linux)
|
||||
include make-linux.mk
|
||||
endif
|
||||
|
||||
ifeq ($(OSTYPE),FreeBSD)
|
||||
include make-freebsd.mk
|
||||
endif
|
||||
ifeq ($(OSTYPE),OpenBSD)
|
||||
include make-freebsd.mk
|
||||
endif
|
||||
@@ -1,108 +0,0 @@
|
||||
ZeroTier SDK
|
||||
======
|
||||
|
||||
ZeroTier-enabled apps, devices, and services.
|
||||
|
||||
- For a convenient BSD socket-style API, follow the rest of this document.
|
||||
- For information on the core ZT API, see [ZeroTierOne.h](zerotierone/include/ZeroTierOne.h)
|
||||
|
||||
Secure virtual network access embedded directly into applications, games, and devices. Imagine starting an instance of your application or game and having it automatically be a member of your virtual network without having to rewrite your networking layer. Check out our [Integrations](integrations/) to learn how to integrate this into your application, device, or ecosystem.
|
||||
|
||||
The general idea is this:
|
||||
|
||||
- Your application starts.
|
||||
- The API and ZeroTier service initializes inside a separate thread of your app.
|
||||
- Your app can now reach anything on your flat virtual network via normal network calls.
|
||||
|
||||
It's as simple as that!
|
||||
|
||||
To build everything for your platform, you can start with:
|
||||
|
||||
- On Linux: `make linux SDK_PICOTCP=1 SDK_IPV4=1 SDK_DEBUG=1; make -s check; ls -lG build`
|
||||
- On macOS: `make apple SDK_PICOTCP=1 SDK_IPV4=1 SDK_DEBUG=1; make -s check; ls -lG build`
|
||||
|
||||
***
|
||||
|
||||
The SDK couples the ZeroTier core Ethernet virtualization engine with a user-space TCP/IP stack and a carefully-crafted API which intercepts and re-directs network API calls to our service. This allows servers and applications to be used without modification or recompilation. It can be used to run services on virtual networks without elevated privileges, special configuration of the physical host, kernel support, or any other application specific configuration. It's ideal for [containerized applications](integrations/docker/), [games](integrations/Unity3D/), and [desktop/mobile apps](integrations/).
|
||||
|
||||
Combine this functionality with the network/device management capabilities of [ZeroTier Central](https://my.zerotier.com) and its associated [API](https://my.zerotier.com/help/api) and we've hopefully created a simple and reliable way for you to flatten and reduce the complexity of your app's networking layer.
|
||||
|
||||
The ZeroTier SDK now works on both *x64* and *ARM* architectures. We've tested a beta version for *iOS*, *Android*, *Linux*, and *macOS*.
|
||||
|
||||
## How do I use it?
|
||||
|
||||
There are generally two ways one might want to use the service.
|
||||
|
||||
- The first approach is a *compile-time static linking* of our service library directly into your application. With this option you can bundle our entire functionality right into your app with no need to communicate with a service externally, it'll all be handled automatically. This is most typical for mobile applications, games, etc.
|
||||
|
||||
- The second is a service-oriented approach where our smaller intercept library is *dynamically-linked* into your app upon startup and will communicate to a single ZeroTier service on the host which will relay traffic to and from the ZeroTier virtual network. This can be useful if you don't have access to the app's source code and can't perform a static linking.
|
||||
|
||||

|
||||
|
||||
## How does it work?
|
||||
|
||||
We've designed a background tap service that pairs the ZeroTier protocol with swappable user-space network stacks. We've provided drivers for [Lightweight IP (lwIP)](http://savannah.nongnu.org/projects/lwip/) and [picoTCP](http://www.picotcp.com/). The aim is to give you a new way to bring your applications onto your virtual network. For a more in-depth explanation of how it works take a look at our [Technical discussion](docs/technical.md)
|
||||
|
||||
## APIs
|
||||
|
||||
**Hook/Intercept**
|
||||
- Uses dynamic loading of our library to allow function interposition or "hooking" to re-implement traditional socket API functions like `socket()`, `connect()`, `bind()`, etc.
|
||||
|
||||
**Direct Call**
|
||||
- Directly call the `zts_*` API specified in [src/sdk.h](src/sdk.h). For this to work, just use one of the provided headers that specify the interface for your system/architecture and then either dynamically-load our library into your app or statically-link it at compile-time.
|
||||
|
||||
|
||||
***
|
||||
## Important Build Flags
|
||||
|
||||
- `SDK_IPV4=1` - Enable IPv4 support
|
||||
- `SDK_IPV6=1` - Enable IPv6 support
|
||||
|
||||
- `SDK_DEBUG=1` - Enables SDK debugging
|
||||
|
||||
- `SDK_PICOTCP=1` - Enable the use of `picoTCP` (recommended)
|
||||
- `SDK_PICOTCP_DEBUG=1` - Enables debug output for the `picoTCP` network stack
|
||||
|
||||
- `SDK_LWIP=1` - Enable the use of `lwIP` (deprecated)
|
||||
- `SDK_LWIP_DEBUG=1` - Enables debug output for the `lwIP` library.
|
||||
|
||||
***
|
||||
|
||||
### Apple
|
||||
- For everything: `make apple <flags>`
|
||||
|
||||
##### iOS
|
||||
- [Embedding within an app](integrations/apple/example_app/iOS) `make ios_app_framework` -> `build/ios_app_framework/*`
|
||||
- Unity3D plugin `make ios_unity3d_bundle` -> `build/ios_unity3d_bundle/*`
|
||||
|
||||
##### OSX
|
||||
- [Linking into an app at compiletime](docs/osx_zt_sdk.md) `make osx_static_lib` -> `build/libzt.a`
|
||||
- [Embedding within an app with Xcode](integrations/apple/example_app/OSX) `make osx_app_framework` -> `build/osx_app_framework/*`
|
||||
- [Dynamic-linking into an app/service at runtime](docs/osx.md) `make osx_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Intercept library](docs/osx.md) `make osx_sdk_service` -> `build/zerotier-sdk-service`
|
||||
- [SDK Service](docs/osx.md) `make osx_intercept` -> `build/libztintercept.so`
|
||||
- [Unity3D plugin](integrations/apple/ZeroTierSDK_Apple) `make osx_unity3d_bundle`
|
||||
|
||||
***
|
||||
### Linux
|
||||
- For everything: `make linux <flags>`
|
||||
- [Dynamic-linking into an app/service at runtime](docs/linux.md) `make linux_shared_lib`
|
||||
- Service and Intercept `make linux_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Using the SDK with Docker](integrations/docker)
|
||||
|
||||
### Android
|
||||
- For everything: `make android`
|
||||
|
||||
- [Embedding within an app](integrations/android) `make android_jni_lib` -> `build/android_jni_lib/YOUR_ARCH/libZeroTierOneJNI.so`
|
||||
|
||||
***
|
||||
### Windows
|
||||
- Not yet.
|
||||
|
||||
|
||||
***
|
||||

|
||||
|
||||
|
||||
More discussion can be found in our [original blog announcement](https://www.zerotier.com/blog/?p=490) and [the SDK product page](https://www.zerotier.com/product-netcon.shtml).
|
||||
If you have any feature or support requests, be sure to let us know [here](https://www.zerotier.com/community/)!
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
red=`tput setaf 1`
|
||||
green=`tput setaf 2`
|
||||
reset=`tput sgr0`
|
||||
|
||||
FILE="$1"
|
||||
|
||||
if ([ -f "$FILE" ] && [ -s "$FILE" ]) || ([ -d "$FILE" ] && [ "$(ls -A "$FILE")" ]);
|
||||
then
|
||||
echo "${green}[OK ]${reset} $FILE"
|
||||
exit 0
|
||||
else
|
||||
echo "${red}[FAIL]${reset} $FILE" >&2
|
||||
exit 1
|
||||
fi
|
||||
@@ -1,65 +0,0 @@
|
||||
Android + ZeroTier SDK
|
||||
====
|
||||
|
||||
Welcome!
|
||||
|
||||
Imagine a flat, encrypted, no-configuration LAN for all of the instances of your Android app. This short tutorial will show you how to enable ZeroTier functionality for your Android app with little to no code modification. Check out our [ZeroTier SDK](https://www.zerotier.com/blog) page for more info on how the integration works. In this example we aim to set up a minimal [Android Studio](https://developer.android.com/studio/index.html) project which contains all of the components necessary to enable ZeroTier for your app.
|
||||
|
||||
*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) the [Android NDK](https://developer.android.com/ndk/index.html). Currently only Android NDK r10e is supported and can be found [here for OSX](http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip) and [here for Linux](http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip). You'll need to tell our project where you put it by putting the path in [this file](android_jni_lib/proj/local.properties), you'll need to install the Android Build-Tools (this can typically be done through the editor the first time you start it up), and finally you should probably upgrade your Gradle plugin if it asks you to. If you don't have these things installed and configured we will detect that and just skip those builds automatically.*
|
||||
|
||||
If you want to skip the following steps and just take a look at the project, go [here](example_app).
|
||||
|
||||
***
|
||||
|
||||
**Step 1: App Code Modifications**
|
||||
- In your project, create a new package called `ZeroTier` and class file within called `ZTSDK.java` and copy contents from `src/wrappers/java/JavaWrapper.java`
|
||||
|
||||
- Start the service
|
||||
|
||||
```
|
||||
String nwid = "8056c2e21c000001";
|
||||
// Set up service
|
||||
final ZTSDK zt = new ZTSDK();
|
||||
final String homeDir = getApplicationContext().getFilesDir() + "/zerotier";
|
||||
new Thread(new Runnable() {
|
||||
public void run() {
|
||||
// Calls to JNI code
|
||||
zt.start_service(homeDir);
|
||||
}
|
||||
}).start();
|
||||
while(!zt.running()) { }
|
||||
```
|
||||
|
||||
- Join network and start doing network stuff!
|
||||
|
||||
```
|
||||
zt.join_network(nwid);
|
||||
int sock = zt.socket(zt.AF_INET, zt.SOCK_STREAM, 0);
|
||||
int err = zt.connect(sock, "10.9.9.203", 8080, nwid);
|
||||
// zt.recvfrom(), zt.write(), etc...
|
||||
```
|
||||
|
||||
**Step 2: App permissions**
|
||||
|
||||
- In order for your application to write the auth keys and network files to the internal storage you'll need to set a few permissions in your `AndroidManifest.xml` file at the same scope level as `<application>`:
|
||||
|
||||
```
|
||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
|
||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
|
||||
```
|
||||
|
||||
**Step 3: Set NDK/SDK paths**
|
||||
- Specify your SDK/NDK path in `android_jni_lib/proj/local.properties`. For example:
|
||||
|
||||
```
|
||||
sdk.dir=/Users/Name/Library/Android/sdk
|
||||
ndk.dir=/Users/Name/Library/Android/ndk-r10e
|
||||
```
|
||||
|
||||
**Step 4: Select build targets**
|
||||
- Specify the target architectures you want to build in [Application.mk](android_jni_lib/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`. For each architecture you wish to support a different shared library will need to be built. This is all taken care of automatically by the build script.
|
||||
|
||||
**Step 4: Build Shared Library**
|
||||
- `make android_jni_lib`
|
||||
- The resultant `build/android_jni_lib/ARCH/libZeroTierOneJNI.so` is what you want to import into your own project to provide our API implementation to your app. Select your architecture and copy the shared library `libZeroTierOneJNI.so` into your project's JNI directory, possibly `/src/main/jniLibs/ARCH/libZeroTierOneJNI.so`.
|
||||
- Selecting only the architectures you need will *significantly* reduce overall build time.
|
||||
@@ -1,94 +0,0 @@
|
||||
Docker + ZeroTier SDK
|
||||
====
|
||||
|
||||
Welcome!
|
||||
|
||||
Imagine a flat, encrypted, no-configuration LAN for all of your Docker containers.
|
||||
|
||||
This short tutorial will show you how to enable ZeroTier functionality for your Docker container. In this example we aim to build a Docker container with ZeroTier’s Network Container service bundled right in so that it’s effortless to hook any number of your services in the container up to your virtual network. Alternatively, you can check out a docker project directory [here](docker_demo).
|
||||
|
||||
|
||||
**Step 1: Build ZeroTier shared library**
|
||||
|
||||
`make linux_service_and_intercept`
|
||||
- For debug output from the SDK, use `SDK_DEBUG=1`, or `ZT_DEBUG=1` to see debug output from the ZeroTier service.
|
||||
|
||||
**Step 2: Build your Docker image**
|
||||
|
||||
`docker build --tag=redis_test .`
|
||||
|
||||
The example dockerfile below incorperates a few important elements:
|
||||
|
||||
1) The ZeroTier service binaries
|
||||
2) Whatever ZeroTier identity keys you plan on using (if you don't already have keys you wish to use, fret not! A new identity will be generated automatically).
|
||||
3) The service we've chosen to use. In this case, redis.
|
||||
```
|
||||
FROM fedora:23
|
||||
# Install apps
|
||||
RUN yum -y update
|
||||
RUN yum -y install redis-3.0.4-1.fc23.x86_64
|
||||
RUN yum clean all
|
||||
# Add ZT files
|
||||
RUN mkdir -p /var/lib/zerotier-one/networks.d
|
||||
ADD sdk_identity.public /var/lib/zerotier-one/identity.public
|
||||
ADD sdk_identity.secret /var/lib/zerotier-one/identity.secret
|
||||
ADD *.conf /var/lib/zerotier-one/networks.d/
|
||||
ADD *.conf /
|
||||
ADD *.name /
|
||||
EXPOSE 9993/udp 6379/udp
|
||||
# Install LWIP library used by service
|
||||
ADD liblwip.so /var/lib/zerotier-one/liblwip.so
|
||||
# Install syscall intercept library
|
||||
ADD libztintercept.so /
|
||||
RUN cp libztintercept.so lib/libztintercept.so
|
||||
RUN ln -sf /lib/libztintercept.so /lib/libztintercept
|
||||
ADD zerotier-cli /
|
||||
Add zerotier-sdk-service /
|
||||
# Install test scripts
|
||||
ADD sdk_entrypoint.sh /sdk_entrypoint.sh
|
||||
RUN chmod -v +x /sdk_entrypoint.sh
|
||||
# Start ZeroTier-One
|
||||
CMD ["./sdk_entrypoint.sh"]
|
||||
```
|
||||
|
||||
**Step 3: Start container**
|
||||
|
||||
`docker run -d -it redis_test /bin/bash`
|
||||
|
||||
**Step 4: From container, set up environment variables**
|
||||
|
||||
Set our application pre-load with `export LD_PRELOAD=./libztintercept.so`. This dynamically loads our intercept library into your application which allows us to re-direct its network calls to our virtual network.
|
||||
|
||||
Tell the ZeroTier Network Containers service which network to connect to with `export ZT_NC_NETWORK=/var/lib/zerotier-one/nc_XXXXXXXXXXXXXXXX`.
|
||||
|
||||
**Step 5: Run your new ZeroTier-enabled service**
|
||||
|
||||
At this point, simply run your application as you normally would. It will be automatically intercepted and linked to the ZeroTier service (and hence your virtual networks!)
|
||||
|
||||
`/usr/bin/redis-server --port 6379`
|
||||
|
||||
***
|
||||
**Additional info**
|
||||
If you'd like to know the IP address your service can be reached at on this particular virtual network, use the following:
|
||||
`zerotier-cli -D/var/lib/zerotier-one/nc_XXXXXXXXXXXXXXXX listnetworks`
|
||||
|
||||
## Installing in a Docker container (or any other container engine)
|
||||
|
||||
If it's not immediately obvious, installation into a Docker container is easy. Just install `zerotier-sdk-service`, `libztintercept.so`, and `liblwip.so` into the container at an appropriate locations. We suggest putting it all in `/var/lib/zerotier-one` since this is the default ZeroTier home and will eliminate the need to supply a path to any of ZeroTier's services or utilities. Then, in your Docker container entry point script launch the service with *-d* to run it in the background, set the appropriate environment variables as described above, and launch your container's main application.
|
||||
|
||||
The only bit of complexity is configuring which virtual network to join. ZeroTier's service automatically joins networks that have `.conf` files in `ZTHOME/networks.d` even if the `.conf` file is empty. So one way of doing this very easily is to add the following commands to your Dockerfile or container entry point script:
|
||||
|
||||
mkdir -p /var/lib/zerotier-one/networks.d
|
||||
touch /var/lib/zerotier-one/networks.d/8056c2e21c000001.conf
|
||||
|
||||
Replace 8056c2e21c000001 with the network ID of the network you want your container to automatically join. It's also a good idea in your container's entry point script to add a small loop to wait until the container's instance of ZeroTier generates an identity and comes online. This could be something like:
|
||||
|
||||
/var/lib/zerotier-one/zerotier-sdk-service -d
|
||||
while [ ! -f /var/lib/zerotier-one/identity.secret ]; do
|
||||
sleep 0.1
|
||||
done
|
||||
# zerotier-sdk-service is now running and has generated an identity
|
||||
|
||||
(Be sure you don't bundle the identity into the container, otherwise every container will try to be the same device and they will "fight" over the device's address.)
|
||||
|
||||
Now each new instance of your container will automatically join the specified network on startup. Authorizing the container on a private network still requires a manual authorization step either via the ZeroTier Central web UI or the API. We're working on some ideas to automate this via bearer token auth or similar since doing this manually or with scripts for large deployments is tedious.
|
||||
-89
@@ -1,89 +0,0 @@
|
||||
Frequently Asked Questions
|
||||
======
|
||||
|
||||
|
||||
#### Why would I integrate ZeroTier into my app?
|
||||
|
||||
The ZeroTier SDK is designed specifically for the developer that doesn't want to work with or deal with the headaches of writing a networking layer for their app. Integrating ZeroTier into your application will prevent you from having to figure out how to do the complex networking that your app might require. It will provide you with a secure, easy-to-use, P2P connectivity solution.
|
||||
|
||||
##### Use in Mobile Apps
|
||||
If you're writing a game and you'd like to give it the ability talk to other instances in a secure and fast manner, you can embed our library into your app and choose from a couple different APIs. If you're developing for iOS, you'll want to add our [iOS Framework](https://github.com/zerotier/ZeroTierSDK/tree/master/integrations/apple/example_app/iOS) to your project. If you're developing for Android, you'll need to add our [JNI library](https://github.com/zerotier/ZeroTierSDK/tree/master/integrations/android) to your project. Once your app starts up, a separate thread will start which contains the ZeroTier service and a network stack dedicated entirely to your app. Each of these integrations give your app two main options for talking over a ZeroTier network. The first is a "direct call" which is means you'll call functions such as `zt_socket(), zt_connect(), ...` which are reimplementations of the traditional [socket API](https://en.wikipedia.org/wiki/Berkeley_sockets). Alternatively we provide a SOCKS5 proxy server in a separate thread which you can turn on via `zt_start_proxy_server(...)`. And if you've already implemented your networking layer using the traditional socket API and you aren't using third-party libraries that need to make network calls, you can `zt_start_intercept()`. The intercept will essentially hijack your network calls and route them to our reimplementations. This has the advantage that you literally don't have to change a single line of your networking code to use ZeroTier. (NOTE, the intercept is *not* available on Android).
|
||||
|
||||
##### Use in Desktop Apps
|
||||
Desktop apps are a bit easier than mobile apps to integrate with ZeroTier and you'll have even more API options. The exact details vary slightly among the various [platforms/OSes we support](https://github.com/zerotier/ZeroTierSDK/tree/master/integrations), but generally you can either link the ZeroTier library into your application (same as mobile), you can use the built-in SOCKS5 proxy (same as mobile), you can use the intercept (so far tested on OSX, Linux), or you can use `LD_PRELOAD` to dynamically load just the intercept into each of your apps and all will talk to a single `zerotier-sdk-service` running on the local host. This last option is a good option if you don't have access to the source code of the application and thus cannot use the direct call or SOCKS5 proxy APIs.
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### I want technical details on how this all works under the hood.
|
||||
- Cool. Read [this](technical.md) and let us know [here](zerotier.com/community/) if you have any questions.
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### I don't have access to my an app's source but I still want to embed ZeroTier into it. Is this possible?
|
||||
- Yes! Since you can't build your app with our library you'll have to use the **Intercept** mode. This means that you will dynamically-load our library at runtime and it'll connect to the locally-running ZeroTier service and function just the same.
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### How do switch network stacks?
|
||||
|
||||
We currently provide a driver for [picoTCP](http://www.picotcp.com/) and [lwIP](http://savannah.nongnu.org/projects/lwip/), and we recommend their useage in that order. Each one has its own pros and cons, if you experience strange behavior it might be worth it to test your app on a different stack. Use `SDK_PICOTCP=1` or `SDK_LWIP=1`. For more info, see: [Network Stacks](network_stacks.md)
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### Suitable for games?
|
||||
|
||||
Yes. We think this solution is well suited for low-latency multiplayer games where reliability and ease of use are important.
|
||||
|
||||
The ZeroTier protocol is inherently P2P and only falls back to a relay in the event that your direct link is interrupted. It's in our best interest to automatically find the quickest route for your data and to *not* handle your data. This has the obvious benefits of reduced latency for your game, but also provides you better security and control of your data and reduces our costs. It seems non-sensical to do it any other way. ZeroTier is not a "cloud" that you send all of your data to.
|
||||
|
||||
We've just begun work on a native [Unity 3D](https://unity3d.com/) plugin to enable your Unity game to communicate over ZeroTier networks. You can check it out [here](../integrations/Unity3D)
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### Embedded Applications / IoT
|
||||
|
||||
We foresee the largest application of the ZeroTier SDK to be embedded devices that require lightweight, efficient and reliable networking layers that are also secure and effortless to provision. We've specifically engineered the core service and the API library to be as lightweight and portable as possible. We'd like to see people retake control of their data and security by skipping the the "cloud" without adding complexity.
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#### Controlling traffic?
|
||||
|
||||
The SDK's interception of network calls is currently all or nothing. If engaged, the intercept library intercepts all network I/O calls and redirects them through the new path. A network-containerized application cannot communicate over the regular network connection of its host or container or with anything else except other hosts on its ZeroTier virtual LAN. Support for optional "fall-through" to the host IP stack for outgoing connections outside the virtual network and for gateway routes within the virtual network is planned. (It will be optional since in some cases total network isolation might be considered a nice security feature.)
|
||||
|
||||
***
|
||||
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 406 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 52 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 278 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 97 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 194 KiB |
@@ -1,59 +0,0 @@
|
||||
ZeroTier Integrations
|
||||
====
|
||||
|
||||
If you want everything built at once, type `make all` and go play outside for a few minutes, we'll copy all of the targets into the `build` directory for you along with specific instructions contained in a `README.md` on how to use each binary. You can then use `make -s check` to check the build status of each binary target.
|
||||
|
||||
*NOTE for Apple platforms: In order to build iOS/OSX Frameworks and Bundles you will need XCode command line tools `xcode-select --install`*
|
||||
|
||||
*NOTE: For Android JNI libraries to build you'll need to install [Android Studio](https://developer.android.com/studio/index.html) the [Android NDK](https://developer.android.com/ndk/index.html). Currently only Android NDK r10e is supported and can be found [here for OSX](http://dl.google.com/android/repository/android-ndk-r10e-darwin-x86_64.zip) and [here for Linux](http://dl.google.com/android/repository/android-ndk-r10e-linux-x86_64.zip). You'll need to tell our project where you put it by putting the path in [this file](android/proj/local.properties), you'll need to install the Android Build-Tools (this can typically be done through the editor the first time you start it up), and finally you should probably upgrade your Gradle plugin if it asks you to. If you don't have these things installed and configured we will detect that and just skip those builds automatically. Additionally, you can specify the target architectures you wish to build for by editing [Application.mk](android/android_jni_lib/java/jni/Application.mk). By default it will build `arm64-v8a`, `armeabi`, `armeabi-v7a`, `mips`, `mips64`, `x86`, and `x86_64`*
|
||||
|
||||
Below are the specific instructions for each integration requiring *little to no modification to your code*. Remember, with a full build we'll put a copy of the appropriate integration instructions in the resultant binary's folder for you anyway.
|
||||
|
||||
For more support on these integrations, or if you'd like help creating a new integration, stop by our [community section](https://www.zerotier.com/community/)!
|
||||
|
||||
***
|
||||
## Important Build Flags
|
||||
|
||||
- `SDK_IPV4=1` - Enable IPv4 support
|
||||
- `SDK_IPV6=1` - Enable IPv6 support
|
||||
|
||||
- `SDK_DEBUG=1` - Enables SDK debugging
|
||||
|
||||
- `SDK_PICOTCP=1` - Enable the use of `picoTCP` (recommended)
|
||||
- `SDK_PICO_DEBUG=1` - Enables debug output for the `picoTCP` network stack
|
||||
|
||||
- `SDK_LWIP=1` - Enable the use of `lwIP` (deprecated)
|
||||
- `SDK_LWIP_DEBUG=1` - Enables debug output for the `lwIP` library.
|
||||
|
||||
***
|
||||
|
||||
### Apple
|
||||
- For everything: `make apple <flags>`
|
||||
|
||||
##### iOS
|
||||
- [Embedding within an app](apple/example_app/iOS) `make ios_app_framework` -> `build/ios_app_framework/*`
|
||||
- Unity3D plugin `make ios_unity3d_bundle` -> `build/ios_unity3d_bundle/*`
|
||||
|
||||
##### OSX
|
||||
- [Linking into an app at compiletime](../docs/osx.md) `make osx_static_lib` -> `build/libzt.a`
|
||||
- [Embedding within an app with Xcode](apple/example_app/OSX) `make osx_app_framework` -> `build/osx_app_framework/*`
|
||||
- [Dynamic-linking into an app/service at runtime](../docs/osx.md) `make osx_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Intercept library](../docs/osx.md) `make osx_sdk_service` -> `build/zerotier-sdk-service`
|
||||
- [SDK Service](../docs/osx.md) `make osx_intercept` -> `build/libztintercept.so`
|
||||
- [Unity3D plugin](apple/ZeroTierSDK_Apple) `make osx_unity3d_bundle`
|
||||
|
||||
***
|
||||
### Linux
|
||||
- For everything: `make linux <flags>`
|
||||
- [Dynamic-linking into an app/service at runtime](../docs/linux.md) `make linux_shared_lib`
|
||||
- Service and Intercept `make linux_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Using the SDK with Docker](docker)
|
||||
|
||||
### Android
|
||||
- For everything: `make android`
|
||||
|
||||
- [Embedding within an app](android) `make android_jni_lib` -> `build/android_jni_lib/YOUR_ARCH/libZeroTierOneJNI.so`
|
||||
|
||||
***
|
||||
### Windows
|
||||
- Not yet.
|
||||
-105
@@ -1,105 +0,0 @@
|
||||
ZeroTier SDK
|
||||
======
|
||||
|
||||
ZeroTier-enabled apps, devices, and services.
|
||||
|
||||
Secure virtual network access embedded directly into applications, games, and devices. Imagine starting an instance of your application or game and having it automatically be a member of your virtual network without having to rewrite your networking layer. Check out our [Integrations](integrations/) to learn how to integrate this into your application, device, or ecosystem.
|
||||
|
||||
The general idea is this:
|
||||
|
||||
- Your application starts.
|
||||
- The API and ZeroTier service initializes inside a separate thread of your app.
|
||||
- Your app can now reach anything on your flat virtual network via normal network calls.
|
||||
|
||||
It's as simple as that!
|
||||
|
||||
To build everything for your platform, you can start with:
|
||||
|
||||
- On Linux: `make linux SDK_PICOTCP=1 SDK_IPV4=1 SDK_DEBUG=1; make -s check; ls -lG build`
|
||||
- On macOS: `make apple SDK_PICOTCP=1 SDK_IPV4=1 SDK_DEBUG=1; make -s check; ls -lG build`
|
||||
|
||||
***
|
||||
|
||||
The SDK couples the ZeroTier core Ethernet virtualization engine with a user-space TCP/IP stack and a carefully-crafted API which intercepts and re-directs network API calls to our service. This allows servers and applications to be used without modification or recompilation. It can be used to run services on virtual networks without elevated privileges, special configuration of the physical host, kernel support, or any other application specific configuration. It's ideal for [containerized applications](integrations/docker/), [games](integrations/Unity3D/), and [desktop/mobile apps](integrations/).
|
||||
|
||||
Combine this functionality with the network/device management capabilities of [ZeroTier Central](https://my.zerotier.com) and its associated [API](https://my.zerotier.com/help/api) and we've hopefully created a simple and reliable way for you to flatten and reduce the complexity of your app's networking layer.
|
||||
|
||||
The ZeroTier SDK now works on both *x64* and *ARM* architectures. We've tested a beta version for *iOS*, *Android*, *Linux*, and *macOS*.
|
||||
|
||||
## How do I use it?
|
||||
|
||||
There are generally two ways one might want to use the service.
|
||||
|
||||
- The first approach is a *compile-time static linking* of our service library directly into your application. With this option you can bundle our entire functionality right into your app with no need to communicate with a service externally, it'll all be handled automatically. This is most typical for mobile applications, games, etc.
|
||||
|
||||
- The second is a service-oriented approach where our smaller intercept library is *dynamically-linked* into your app upon startup and will communicate to a single ZeroTier service on the host which will relay traffic to and from the ZeroTier virtual network. This can be useful if you don't have access to the app's source code and can't perform a static linking.
|
||||
|
||||

|
||||
|
||||
## How does it work?
|
||||
|
||||
We've designed a background tap service that pairs the ZeroTier protocol with swappable user-space network stacks. We've provided drivers for [Lightweight IP (lwIP)](http://savannah.nongnu.org/projects/lwip/) and [picoTCP](http://www.picotcp.com/). The aim is to give you a new way to bring your applications onto your virtual network. For a more in-depth explanation of how it works take a look at our [Technical discussion](docs/technical.md)
|
||||
|
||||
## APIs
|
||||
|
||||
**Hook/Intercept**
|
||||
- Uses dynamic loading of our library to allow function interposition or "hooking" to re-implement traditional socket API functions like `socket()`, `connect()`, `bind()`, etc.
|
||||
|
||||
**Direct Call**
|
||||
- Directly call the `zts_*` API specified in [src/sdk.h](src/sdk.h). For this to work, just use one of the provided headers that specify the interface for your system/architecture and then either dynamically-load our library into your app or statically-link it at compile-time.
|
||||
|
||||
|
||||
***
|
||||
## Important Build Flags
|
||||
|
||||
- `SDK_IPV4=1` - Enable IPv4 support
|
||||
- `SDK_IPV6=1` - Enable IPv6 support
|
||||
|
||||
- `SDK_DEBUG=1` - Enables SDK debugging
|
||||
|
||||
- `SDK_PICOTCP=1` - Enable the use of `picoTCP` (recommended)
|
||||
- `SDK_PICOTCP_DEBUG=1` - Enables debug output for the `picoTCP` network stack
|
||||
|
||||
- `SDK_LWIP=1` - Enable the use of `lwIP` (deprecated)
|
||||
- `SDK_LWIP_DEBUG=1` - Enables debug output for the `lwIP` library.
|
||||
|
||||
***
|
||||
|
||||
### Apple
|
||||
- For everything: `make apple <flags>`
|
||||
|
||||
##### iOS
|
||||
- [Embedding within an app](integrations/apple/example_app/iOS) `make ios_app_framework` -> `build/ios_app_framework/*`
|
||||
- Unity3D plugin `make ios_unity3d_bundle` -> `build/ios_unity3d_bundle/*`
|
||||
|
||||
##### OSX
|
||||
- [Linking into an app at compiletime](docs/osx_zt_sdk.md) `make osx_static_lib` -> `build/libzt.a`
|
||||
- [Embedding within an app with Xcode](integrations/apple/example_app/OSX) `make osx_app_framework` -> `build/osx_app_framework/*`
|
||||
- [Dynamic-linking into an app/service at runtime](docs/osx.md) `make osx_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Intercept library](docs/osx.md) `make osx_sdk_service` -> `build/zerotier-sdk-service`
|
||||
- [SDK Service](docs/osx.md) `make osx_intercept` -> `build/libztintercept.so`
|
||||
- [Unity3D plugin](integrations/apple/ZeroTierSDK_Apple) `make osx_unity3d_bundle`
|
||||
|
||||
***
|
||||
### Linux
|
||||
- For everything: `make linux <flags>`
|
||||
- [Dynamic-linking into an app/service at runtime](docs/linux.md) `make linux_shared_lib`
|
||||
- Service and Intercept `make linux_service_and_intercept` -> { `build/zerotier-sdk-service` + `build/libztintercept.so` }
|
||||
- [Using the SDK with Docker](integrations/docker)
|
||||
|
||||
### Android
|
||||
- For everything: `make android`
|
||||
|
||||
- [Embedding within an app](integrations/android) `make android_jni_lib` -> `build/android_jni_lib/YOUR_ARCH/libZeroTierOneJNI.so`
|
||||
|
||||
***
|
||||
### Windows
|
||||
- Not yet.
|
||||
|
||||
|
||||
***
|
||||

|
||||
|
||||
|
||||
More discussion can be found in our [original blog announcement](https://www.zerotier.com/blog/?p=490) and [the SDK product page](https://www.zerotier.com/product-netcon.shtml).
|
||||
If you have any feature or support requests, be sure to let us know [here](https://www.zerotier.com/community/)!
|
||||
-54
@@ -1,54 +0,0 @@
|
||||
iOS + ZeroTier SDK
|
||||
====
|
||||
|
||||
Welcome!
|
||||
|
||||
Imagine a flat, encrypted, no-configuration LAN for all of the instances of your iOS app.
|
||||
|
||||
This short tutorial will show you how to enable ZeroTier functionality for your iOS app with little to no code modification. Check out our [ZeroTier SDK](https://www.zerotier.com/blog) page for more info on how the integration works.
|
||||
|
||||
***
|
||||
**Step 1: Build iOS framework**
|
||||
|
||||
- `make ios_app_framework`
|
||||
- This will output to `build/ios_app_framework/Release-iphoneos/ZeroTierSDK_iOS.framework`
|
||||
|
||||
**Step 2: Integrate SDK into project**
|
||||
|
||||
- Add the resultant framework package to your project
|
||||
- Add `src` directory to *Build Settings -> Header Search Paths*
|
||||
- Add `build/ios_app_framework/Release-iphoneos/` to *Build Settings -> Framework Search Paths*
|
||||
- Add `ZeroTierSDK.frameworkiOS` to *General->Embedded Binaries*
|
||||
- Add `src/wrappers/swift/ZTSDK.swift`, `src/wrappers/swift/XcodeWrapper.cpp` and `src/wrappers/swift/XcodeWrapper.hpp` to your project:
|
||||
- Set `src/wrappers/swift/Apple-Bridging-Header.h` as your bridging-header in *Build Settings -> Objective-C Bridging-header*
|
||||
|
||||
**Step 3: Start the ZeroTier service**
|
||||
|
||||
Start the service:
|
||||
|
||||
```
|
||||
zt.start_service(nil);
|
||||
zt.join_network(nwid);
|
||||
```
|
||||
|
||||
Listen for incoming connections:
|
||||
|
||||
```
|
||||
let sock: Int32 = zt.socket(AF_INET, SOCK_STREAM, 0)
|
||||
let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, Int16(serverPort))
|
||||
let bind_err = zt.bind(sock, ztaddr)
|
||||
zt_listen(sock, 1);
|
||||
let accepted_sock: Int32 = zt.accept(sock, ztaddr)
|
||||
```
|
||||
|
||||
Or, establish a connection:
|
||||
|
||||
```
|
||||
let sock: Int32 = zt.socket(AF_INET, SOCK_STREAM, 0)
|
||||
let ztaddr: ZTAddress = ZTAddress(AF_INET, serverAddr, Int16(serverPort))
|
||||
let connect_err: Int32 = zt.connect(sock, ztaddr)
|
||||
```
|
||||
|
||||
**Alternative APIs**
|
||||
|
||||
CLick [here](../../../../docs/api_discussion.md) to learn more about alternative APIs such as the Intercept and SOCKS5 Proxy.
|
||||
@@ -1,98 +0,0 @@
|
||||
Unity3D iOS + ZeroTier SDK
|
||||
====
|
||||
|
||||
Welcome!
|
||||
|
||||
We want your Unity apps to talk *directly* over a flat, secure, no-config virtual network without sending everything into the "cloud". Thus, we introduce the ZeroTier-Unity3D integration!
|
||||
|
||||
Our implementation currently intends to be the bare minimum required to get your Unity application to talk over ZeroTier virtual networks. As a result, we've created an API that is very similar to the classic BSD-style sockets API. With this basic API it is possible to construct more abstracted network layers much like Unity's LLAPI and HLAPI.
|
||||
|
||||
*NOTE: Although the API and Unity project structure is identical for iOS/OSX, if you're targeting iOS you'll need to generate an iOS unity project and integrate it with your Xcode project, instructions can be found [here](https://unity3d.com/learn/tutorials/topics/mobile-touch/building-your-unity-game-ios-device-testing).*
|
||||
|
||||
***
|
||||
## API
|
||||
|
||||
- `Join(nwid)`: Joins a ZeroTier virtual network
|
||||
- `Leave(nwid)`: Leaves a ZeroTier virtual network
|
||||
- `Socket(family, type, protocol)`: Creates a ZeroTier-administered socket (returns an `fd`)
|
||||
- `Bind(fd, addr, port)`: Binds to that socket on the address and port given
|
||||
- `Listen(fd, backlog)`: Puts a socket into a listening state
|
||||
- `Accept(fd)`: Accepts an incoming connection
|
||||
- `Connect(fd, addr, port)`: Connects to an endpoint associated with the given `fd`
|
||||
- `Write(fd, buf, len)`: Sends data to the endpoint associated with the given `fd`
|
||||
- `Read(fd, buf, len)`: Receives data from an endpoint associated with the given `fd`
|
||||
- `SendTo(fd, buf, len, flags, addr, port)`: Sends data to a given address
|
||||
- `RecvFrom(fd, ref buf, len, flags, addr, port)`: Receives data
|
||||
- `Close(fd)`: Closes a connection to an endpoint
|
||||
|
||||
***
|
||||
## Adding ZeroTier to your Unity app
|
||||
|
||||
**Step 1: Create virtual ZeroTier [virtual network](https://my.zerotier.com/)**
|
||||
|
||||
**Step 2: Add plugin to Unity project**
|
||||
- Create folder `Assets/Plugins`
|
||||
- Place `ZeroTierSDK_Unity3D_iOS.bundle` in folder
|
||||
|
||||
**Step 3: Include wrapper class source**
|
||||
- Drag `ZTSDK.cs` into your `Assets` folder.
|
||||
|
||||
**Step 4: Create and use a `ZTSDK` object**
|
||||
- See examples below for how to use it!
|
||||
|
||||
***
|
||||
|
||||
## Listening for a connection
|
||||
```
|
||||
public class Example
|
||||
{
|
||||
public ZTSDK zt;
|
||||
|
||||
public void example_server()
|
||||
{
|
||||
Thread connectThread = new Thread(() => {
|
||||
// Create ZeroTier-administered socket
|
||||
int sock = zt.Socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
zt.Bind(sock, "0.0.0.0", 8000);
|
||||
zt.Listen(sock, 1);
|
||||
|
||||
// Accept() client connection
|
||||
int accept_sock = -1;
|
||||
while(accept_res < 0) {
|
||||
accept_sock = zt.Accept(sock);
|
||||
}
|
||||
|
||||
// Read data from client
|
||||
char[] msg = new char[1024];
|
||||
int bytes_read = 0;
|
||||
while(bytes_read >= 0) {
|
||||
bytes_read = zt.Read(accept_sock, ref msg, 80);
|
||||
string msgstr = new string(msg);
|
||||
Debug.Log("MSG (" + bytes_read + "):" + msgstr);
|
||||
}
|
||||
});
|
||||
connectThread.IsBackground = true;
|
||||
connectThread.Start();
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Establishing a connection
|
||||
```
|
||||
public class Example
|
||||
{
|
||||
public ZTSDK zt;
|
||||
|
||||
public void example_client()
|
||||
{
|
||||
Thread connectThread = new Thread(() => {
|
||||
// Create ZeroTier-administered socket
|
||||
int sock = zt.Socket ((int)AddressFamily.InterNetwork, (int)SocketType.Stream, (int)ProtocolType.Unspecified);
|
||||
zt.Connect (sock, "0.0.0.0",8000);
|
||||
zt.Write(sock, "Welcome to the machine!", 24);
|
||||
});
|
||||
connectThread.IsBackground = true;
|
||||
connectThread.Start();
|
||||
}
|
||||
}
|
||||
```
|
||||
-164
@@ -1,164 +0,0 @@
|
||||
Linux + ZeroTier SDK
|
||||
====
|
||||
|
||||
Welcome!
|
||||
|
||||
Imagine a flat, encrypted, no-configuration LAN for all of your Linux applications.
|
||||
|
||||
This short tutorial will show you how to inject ZeroTier functionality into your application by dynamic linking via `LD_PRELOAD`.
|
||||
|
||||
## Use with Docker
|
||||
|
||||
See [doc/docker_linux_zt_sdk.md](doc/docker_linux_zt_sdk.md)
|
||||
|
||||
## Short and sweet example
|
||||
|
||||
**Step 1: Make library and copy key files**
|
||||
|
||||
```
|
||||
make linux_shared_lib
|
||||
mkdir /tmp/sdk-test-home
|
||||
cp -f build/lwip/liblwip.so /tmp/sdk-test-home
|
||||
```
|
||||
|
||||
**Step 2: Start service and join network**
|
||||
|
||||
```
|
||||
./build/zerotier-sdk-service -d -p8000 /tmp/sdk-test-home
|
||||
./build/zerotier-cli -D/tmp/sdk-test-home join 8056c2e21c000001
|
||||
```
|
||||
|
||||
**Step 3: Get new IP address assigned to app**
|
||||
|
||||
```
|
||||
./build/zerotier-cli -D/tmp/sdk-test-home listnetworks
|
||||
```
|
||||
|
||||
**Step 4: Set environment variables**
|
||||
|
||||
```
|
||||
export LD_PRELOAD=`pwd`/build/linux_shared_lib/libztintercept.so
|
||||
export ZT_NC_NETWORK=/tmp/sdk-test-home/nc_8056c2e21c000001
|
||||
```
|
||||
|
||||
**Step 5: Start application**
|
||||
|
||||
```
|
||||
node tests/httpserver.js
|
||||
```
|
||||
**Step 6: Test it!**
|
||||
|
||||
From another system on the same virtual network `curl http://APP.SPECIFIC.IP.ADDR/`
|
||||
|
||||
*For a more in-depth explanation of what's happening here, see the section below:*
|
||||
|
||||
|
||||
## Dynamic Linking
|
||||
|
||||
Build the library:
|
||||
|
||||
`make linux_shared_lib`
|
||||
|
||||
This will build a binary called `zerotier-sdk-service` and a library called `libztintercept.so`. It will also build the IP stack as `build/lwip/liblwip.so`.
|
||||
|
||||
The `zerotier-sdk-service` binary is almost the same as a regular ZeroTier One build except instead of creating virtual network ports using Linux's `/dev/net/tun` interface, it creates instances of a user-space TCP/IP stack for each virtual network and provides RPC access to this stack via a Unix domain socket. The latter is a library that can be loaded with the Linux `LD_PRELOAD` environment variable or by placement into `/etc/ld.so.preload` on a Linux system or container. Additional magic involving nameless Unix domain socket pairs and interprocess socket handoff is used to emulate TCP sockets with extremely low overhead and in a way that's compatible with select, poll, epoll, and other I/O event mechanisms.
|
||||
|
||||
The intercept library does nothing unless the `ZT_NC_NETWORK` environment variable is set. If on program launch (or fork) it detects the presence of this environment variable, it will attempt to connect to a running `zerotier-sdk-service` at the specified Unix domain socket path.
|
||||
|
||||
Unlike `zerotier-one`, `zerotier-sdk-service` does not need to be run with root privileges and will not modify the host's network configuration in any way. It can be run alongside `zerotier-one` on the same host with no ill effect, though this can be confusing since you'll have to remember the difference between "real" host interfaces (tun/tap) and network containerized endpoints. The latter are completely unknown to the kernel and will not show up in `ifconfig`.
|
||||
|
||||
|
||||
#### Starting the SDK Service
|
||||
|
||||
A simple test can be performed in user space (no root) in your own home directory.
|
||||
|
||||
First, build the SDK service and intercept library as described above. Then create a directory to act as a temporary ZeroTier home for your test SDK service instance. You'll need to move the `liblwip.so` binary that was built with `make linux_shared_lib` into there, since the service must be able to find it there and load it.
|
||||
|
||||
mkdir /tmp/sdk-test-home
|
||||
cp -f build/lwip/liblwip.so /tmp/sdk-test-home
|
||||
|
||||
Now you can run the service (no sudo needed, and `-d` tells it to run in the background):
|
||||
|
||||
./build/zerotier-sdk-service -d -p8000 /tmp/sdk-test-home
|
||||
|
||||
As with ZeroTier One in its normal incarnation, you'll need to join a network for anything interesting to happen:
|
||||
|
||||
./build/zerotier-cli -D/tmp/sdk-test-home join 8056c2e21c000001
|
||||
|
||||
If you don't want to use [Earth](https://www.zerotier.com/public.shtml) for this test, replace 8056c2e21c000001 with a different network ID. The `-D` option tells `zerotier-cli` not to look in `/var/lib/zerotier-one` for information about a running instance of the ZeroTier system service but instead to look in `/tmp/sdk-test-home`.
|
||||
|
||||
Now type:
|
||||
|
||||
./build/zerotier-cli -D/tmp/sdk-test-home listnetworks
|
||||
|
||||
Try it a few times until you see that you've successfully joined the network and have an IP address. Instead of a *zt#* device, a path to a Unix domain socket will be listed for the network's port.
|
||||
|
||||
Now you will want to have ZeroTier One (the normal `zerotier-one` build, not the SDK) running somewhere else, such as on another Linux system or VM. Technically you could run it on the *same* Linux system and it wouldn't matter at all, but many people find this intensely confusing until they grasp just what exactly is happening here.
|
||||
|
||||
On the other Linux system, join the same network if you haven't already (8056c2e21c000001 if you're using Earth) and wait until you have an IP address. Then try pinging the IP address your SDK service instance received. You should see ping replies.
|
||||
|
||||
Back on the host that's running `zerotier-sdk-service`, type `ip addr list` or `ifconfig` (ifconfig is technically deprecated so some Linux systems might not have it). Notice that the IP address of the network containers endpoint is not listed and no network device is listed for it either. That's because as far as the Linux kernel is concerned it doesn't exist.
|
||||
|
||||
What are you pinging? What is happening here?
|
||||
|
||||
The `zerotier-sdk-service` binary has joined a *virtual* network and is running a *virtual* TCP/IP stack entirely in user space. As far as your system is concerned it's just another program exchanging UDP packets with a few other hosts on the Internet and nothing out of the ordinary is happening at all. That's why you never had to type *sudo*. It didn't change anything on the host.
|
||||
|
||||
Now you can run an application .
|
||||
|
||||
export LD_PRELOAD=`pwd`/build/linux_shared_lib/libztintercept.so
|
||||
export ZT_NC_NETWORK=/tmp/sdk-test-home/nc_8056c2e21c000001
|
||||
node tests/httpserver.js
|
||||
|
||||
Also note that the "pwd" in `LD_PRELOAD` assumes you are in the ZeroTier source root and have built the SDK there. If not, substitute the full path to `libztintercept.so`. If you want to remove those environment variables later, use `unset LD_PRELOAD` and `unset ZT_NC_NETWORK`.
|
||||
|
||||
If you don't have node.js installed, an alternative test using python would be:
|
||||
|
||||
python -m SimpleHTTPServer 80
|
||||
|
||||
If you are running Python 3, use `-m http.server`.
|
||||
|
||||
If all went well a small static HTTP server is now serving up the current directory, but only inside the network container. Going to port 80 on your machine won't work. To reach it, go to the other system where you joined the same network with a conventional ZeroTier instance and try:
|
||||
|
||||
curl http://APP.SPECIFIC.IP.ADDR/
|
||||
|
||||
Replace `APP.SPECIFIC.IP.ADDR` with the IP address that `zerotier-sdk-service` was assigned on the virtual network. (This is the same IP you pinged in your first test.) If everything works, you should get back a copy of ZeroTier One's main README.md file.
|
||||
|
||||
|
||||
***
|
||||
#### Dynamic linking compatibility test results
|
||||
|
||||
The following applications have been tested and confirmed to work for the beta release:
|
||||
|
||||
Fedora 23:
|
||||
|
||||
httpstub.c
|
||||
nginx 1.8.0
|
||||
http 2.4.16, 2.4.17
|
||||
darkhttpd 1.11
|
||||
python 2.7.10 (python -m SimpleHTTPServer)
|
||||
python 3.4.3 (python -m http.server)
|
||||
redis 3.0.4
|
||||
node 6.0.0-pre
|
||||
sshd
|
||||
|
||||
CentOS 7:
|
||||
|
||||
httpstub.c
|
||||
nginx 1.6.3
|
||||
httpd 2.4.6 (debug mode -X)
|
||||
darkhttpd 1.11
|
||||
node 4.2.2
|
||||
redis 2.8.19
|
||||
sshd
|
||||
|
||||
Ubuntu 14.04.3:
|
||||
|
||||
httpstub.c
|
||||
nginx 1.4.6
|
||||
python 2.7.6 (python -m SimpleHTTPServer)
|
||||
python 3.4.0 (python -m http.server)
|
||||
node 5.2.0
|
||||
redis 2.8.4
|
||||
sshd
|
||||
|
||||
It is *likely* to work with other things but there are no guarantees.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user