From e6fbbfc249ceb3a778ba20b58550db26c649393b Mon Sep 17 00:00:00 2001 From: Joseph Henry Date: Wed, 6 Jul 2016 16:45:42 -0500 Subject: [PATCH] update to docker tests --- .../Debug/ZeroTierSDK_OSX.framework/Modules | 1 + .../Debug/ZeroTierSDK_OSX.framework/Resources | 1 + .../Versions/A/Resources/Info.plist | 46 +++++++ .../Versions/A/_CodeSignature/CodeResources | 122 ++++++++++++++++++ .../Versions/Current | 1 + build/osx_app_framework/README.md | 114 ++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 41406 -> 42939 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 22 +++- .../Base.lproj/Main.storyboard | 14 +- .../Example_OSX_App/ViewController.swift | 97 +++++++++----- tests/docker/_build_single_image.sh | 4 +- tests/docker/build_zt.sh | 2 +- .../darkhttpd-1.11.x86_64/netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- .../nodejs-0.10.36-4.fc23/netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- tests/docker/python/python/netcon_dockerfile | 2 +- .../docker/python/python/netcon_entrypoint.sh | 2 +- tests/docker/python/python3/netcon_dockerfile | 2 +- .../python/python3/netcon_entrypoint.sh | 2 +- .../netcon_dockerfile | 2 +- .../netcon_entrypoint.sh | 2 +- 34 files changed, 398 insertions(+), 70 deletions(-) create mode 120000 build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Modules create mode 120000 build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Resources create mode 100644 build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/Resources/Info.plist create mode 100644 build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/_CodeSignature/CodeResources create mode 120000 build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/Current create mode 100644 build/osx_app_framework/README.md diff --git a/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Modules b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Modules new file mode 120000 index 0000000..5736f31 --- /dev/null +++ b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Modules @@ -0,0 +1 @@ +Versions/Current/Modules \ No newline at end of file diff --git a/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Resources b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Resources new file mode 120000 index 0000000..953ee36 --- /dev/null +++ b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Resources @@ -0,0 +1 @@ +Versions/Current/Resources \ No newline at end of file diff --git a/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/Resources/Info.plist b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/Resources/Info.plist new file mode 100644 index 0000000..41ebcdc --- /dev/null +++ b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/Resources/Info.plist @@ -0,0 +1,46 @@ + + + + + BuildMachineOSBuild + 15F34 + CFBundleDevelopmentRegion + en + CFBundleExecutable + ZeroTierSDK_OSX + CFBundleIdentifier + zerotier.ZeroTierSDK-OSX + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ZeroTierSDK_OSX + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleSupportedPlatforms + + MacOSX + + CFBundleVersion + 1 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 7D175 + DTPlatformVersion + GM + DTSDKBuild + 15E60 + DTSDKName + macosx10.11 + DTXcode + 0730 + DTXcodeBuild + 7D175 + NSHumanReadableCopyright + Copyright © 2016 ZeroTier Inc. All rights reserved. + + diff --git a/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/_CodeSignature/CodeResources b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/_CodeSignature/CodeResources new file mode 100644 index 0000000..67cafc1 --- /dev/null +++ b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/A/_CodeSignature/CodeResources @@ -0,0 +1,122 @@ + + + + + files + + Resources/Info.plist + + K/BDIuWltnsAQ2lDkdc8UvZj1Qo= + + + files2 + + Resources/Info.plist + + hash + + K/BDIuWltnsAQ2lDkdc8UvZj1Qo= + + hash2 + + mUCBD6yhvUknsHAV8ejuSR3M/x/mERi1Ut2zlFmx9Zk= + + + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + diff --git a/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/Current b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/Current new file mode 120000 index 0000000..8c7e5a6 --- /dev/null +++ b/build/osx_app_framework/Debug/ZeroTierSDK_OSX.framework/Versions/Current @@ -0,0 +1 @@ +A \ No newline at end of file diff --git a/build/osx_app_framework/README.md b/build/osx_app_framework/README.md new file mode 100644 index 0000000..55010ee --- /dev/null +++ b/build/osx_app_framework/README.md @@ -0,0 +1,114 @@ +OSX + ZeroTier SDK +==== + +Welcome! + +Imagine a flat, encrypted, no-configuration LAN for all of the instances of your OSX 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 and [Shim Techniques](https://www.zerotier.com/blog) for a discussion of shims available for your app/technology. + +In this example we aim to set up a minimal XCode project which contains all of the components necessary to enable ZeroTier for your app. If you'd rather skip all of these steps and grab the code, look in the [sdk/OSX](https://github.com/zerotier/ZeroTierSDK/tree/dev/sdk/iOS) folder of the source tree. Otherwise, let's get started! + +**Step 1: Add ZeroTier source and Netcon-iOS XCode project to yours** +- Place a copy of the ZeroTierOne source in a folder at the same level as your project +- Add `ZeroTierSDK/src/tests/iOS/Netcon-iOS.xcodeproj` to your project + +**Step 2: Add ZeroTier binaries to your app** +- Add `ZeroTierSDK.frameworkiOS` to *General->Embedded Binaries* +- Add `libServiceSetup.a` and `ZeroTierSDK.framework` to *Build Phases->Link Binary With Libraries* + +**Step 3: Configure your project** +- Add `$(SRCROOT)/../ZeroTierOne/src` to *Build Settings->Header Search Paths* for your project +- Add `-D__IOS__` to *Build Settings->Other C Flags* +- Add `zerotiersdk/tests/iOS/Netcon-iOS/NetconWrapper.cpp` and `zerotiersdk/tests/iOS/Netcon-iOS/NetconWrapper.hpp` to your project: +- Add contents of `ZeroTierOne/netcon/tests/iOS/Netcon-iOS/SDK-iOS-Bridging-Header.h` to your project’s bridging header. + +*Note: You should have been prompted to create a bridging header for your project, if you haven't make sure you do this and add the native function prototypes manually from the bridging header we provide.* + +**Step 4: App Code Modifications** + +After you've linked the two projects you need to find a place in your code to set up the ZeroTier service thread: + +``` +var service_thread : NSThread! +func ztnc_start_service() { + let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true) + start_service(path[0]) +} +``` + +...and then start it. If you enabled the proxy service via `-DUSE_SOCKS_PROXY` it will start automatically and be reachable at `0.0.0.0:1337`: + +``` +dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { + self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil) + self.service_thread.start() +}); +``` + +**Step 5: Pick an API** + +**Step 6: Join a network!** + - Simply call `zt_join_network("XXXXXXXXXXXXXXXX")` + +*** +## Linking into an application on Mac OSX + +Example: + + gcc myapp.c -o myapp libztintercept.so + export ZT_NC_NETWORK=/tmp/netcon-test-home/nc_8056c2e21c000001 + +Start service + + ./zerotier-netcon-service -d -p8000 /tmp/netcon-test-home + +Run application + + ./myapp + + + +## XCode Desktop App Integration + +*NOTE: a sample OSX desktop application with ZeroTier integrated can be found [here](../integrations/Apple/Example_OSX_App)* + +**Step 1: Build `ZeroTierSDK_OSX.framework`** + - From the main repo directory, `make osx_app_framework`. This will use the XCode commandline tools to build and copy the framework into `build`. + +**Step 2: Add `ZeroTierSDK_OSX.framework` to your project** + +**Step 3: Add its path to your *Build Settings -> Framework Search Paths***: + - For example: `$(PROJECT_DIR)/../../../build/OSX_app_framework/Release` + +**Step 4: Pick an [API](# API) to use** + +**Step 5: Join a network!** + - Simply call `zt_join_network("XXXXXXXXXXXXXXXX")` + +*** +## API + +This integration allows for the following shim combinations: +- `Hook of BSD-like sockets`: Use BSD-like sockets as you normally would. +- `Proxy of NSStream`: Create NSStream. Configure stream for SOCKS5 Proxy. Use stream. +- `Changeling of BSD-like sockets`: Call `start_changeling()` and then use BSD-like sockets as you normally would. +- `Direct Call`: Consult [SDK-iOS-Bridging-Header.h](netcon/iOS/Netcon-iOS/Netcon-iOS-Bridging-Header.h). + +If functional interposition isn't available for the API or library you've chosen to use, ZeroTier offers a SOCKS5 proxy server which can allow connectivity to your virtual network as long as your client API supports the SOCKS5 protocol. This proxy service will run alongside the tap service and can be turned on by compiling with the `-DUSE_SOCKS_PROXY` flag in *Build Settings->Other C Flags*. By default, the proxy service is available at `0.0.0.0:1337`. + + +#### NSStream and SOCKS Proxy + +As an example, here's how one would configure a NSStream object to redirect all network activity to the ZeroTier SOCKS proxy server: + +``` +// BEGIN proxy configuration +let myDict:NSDictionary = [NSStreamSOCKSProxyHostKey : "0.0.0.0", + NSStreamSOCKSProxyPortKey : 1337, + NSStreamSOCKSProxyVersionKey : NSStreamSOCKSProxyVersion5] + +inputStream!.setProperty(myDict, forKey: NSStreamSOCKSProxyConfigurationKey) +outputStream!.setProperty(myDict, forKey: NSStreamSOCKSProxyConfigurationKey) +// END proxy configuration +``` diff --git a/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate b/integrations/apple/example_app/Example_OSX_App.xcodeproj/project.xcworkspace/xcuserdata/Joseph.xcuserdatad/UserInterfaceState.xcuserstate index 39c8cf1732ace1b1790986cceb7d43e88ad95c13..0956fbedf52538815712b620c02b82c5c2b45568 100644 GIT binary patch delta 18857 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

ZI2R=-1 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 a+4OPKmD77PSDq-U`P5=HpMyWAPx^muQqA-L delta 17190 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 + + + + diff --git a/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard b/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard index e5fe78e..30d14c9 100644 --- a/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard +++ b/integrations/apple/example_app/Example_OSX_App/Base.lproj/Main.storyboard @@ -760,7 +760,7 @@ - + @@ -771,7 +771,7 @@ - + @@ -877,7 +877,7 @@ - + @@ -953,14 +953,14 @@ - + - + - + - + diff --git a/integrations/apple/example_app/Example_OSX_App/ViewController.swift b/integrations/apple/example_app/Example_OSX_App/ViewController.swift index af0a4ed..f25075d 100644 --- a/integrations/apple/example_app/Example_OSX_App/ViewController.swift +++ b/integrations/apple/example_app/Example_OSX_App/ViewController.swift @@ -19,21 +19,25 @@ class ViewController: NSViewController { @IBOutlet weak var txtPort: NSTextField! @IBOutlet weak var btnConnect: NSButton! @IBOutlet weak var btnBind: NSButton! + @IBOutlet weak var txtTX: NSScrollView! @IBOutlet weak var txtRX: NSScrollView! + @IBOutlet weak var btnSend: NSButton! - var serverPort:Int32 = 4545 + var serverPort:Int32 = 8080 var serverAddr:String = "10.147.18.5" + var sock:Int32 = -1 + @IBAction func txtAddrChanged(sender: AnyObject) { - if(sender.value != nil) { - serverAddr = sender.value + if(sender.stringValue != nil) { + serverAddr = sender.stringValue } } @IBAction func txtPortChanged(sender: AnyObject) { - serverPort = sender.intValue! + serverPort = sender.intValue } // Join a ZeroTier network @@ -52,6 +56,7 @@ class ViewController: NSViewController { selectedShim = sender.intValue // 0 = BSD-style, 1 = SOCKS5 Proxy, etc } + // Select a protocol // Protocol { TCP / UDP } var selectedProtocol:Int32 = 0 @@ -59,21 +64,21 @@ class ViewController: NSViewController { switch sender.intValue { case 0: - print("Selected TCP (SOCK_STREAM)\n"); selectedProtocol = SOCK_STREAM case 1: - print("Selected UDP (SOCK_DGRAM)\n"); selectedProtocol = SOCK_DGRAM default: break; - } } + } + } // Connect to remote host on ZeroTier virtual network @IBAction func UI_Connect(sender: AnyObject) { + // TCP if(selectedProtocol == SOCK_STREAM) { - let sd = zts_socket(AF_INET, SOCK_STREAM, 0) + sock = zts_socket(AF_INET, SOCK_STREAM, 0) var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), sin_family: UInt8(AF_INET), sin_port: UInt16(serverPort).bigEndian, @@ -82,10 +87,10 @@ class ViewController: NSViewController { inet_pton(AF_INET, serverAddr, &(addr.sin_addr)); - let connect_fd = zts_connect(sd, UnsafePointer([addr]), UInt32(addr.sin_len)) - print("connect_fd = \(connect_fd),\(errno)") + let connect_err = zts_connect(sock, UnsafePointer([addr]), UInt32(addr.sin_len)) + print("connect_err = \(connect_err),\(errno)") - if connect_fd < 0 { + if connect_err < 0 { let err = errno print("Error connecting IPv4 socket \(err)") return @@ -99,32 +104,52 @@ class ViewController: NSViewController { } } + // Bind a ZeroTier socket @IBAction func UI_Bind(sender: AnyObject) { - } - - @IBAction func UI_SendData(sender: AnyObject) { - - } - - /* - // Mode { Client / Server } - @IBOutlet weak var ModeControl: UISegmentedControl! - var selectedMode:UInt16 = 0 - @IBAction func ModeControlSelected(sender: AnyObject) { - switch sender.selectedSegmentIndex + // TCP + if(selectedProtocol == SOCK_STREAM) { - case 0: - print("Selected client\n"); - selectedMode = 0 - case 1: - print("Selected server\n"); - selectedMode = 1 - default: - break; + sock = zts_socket(AF_INET, SOCK_STREAM, 0) + var addr = sockaddr_in(sin_len: UInt8(sizeof(sockaddr_in)), + sin_family: UInt8(AF_INET), + sin_port: UInt16(serverPort).bigEndian, + sin_addr: in_addr(s_addr: 0), + sin_zero: (0,0,0,0,0,0,0,0)) + + inet_pton(AF_INET, serverAddr, &(addr.sin_addr)); + + let bind_err = zts_bind(sock, UnsafePointer([addr]), UInt32(addr.sin_len)) + print("bind_err = \(bind_err),\(errno)") + + if bind_err < 0 { + let err = errno + print("Error binding IPv4 socket \(err)") + return + } + } + + // UDP + if(selectedProtocol == SOCK_DGRAM) + { + + } + } + + // Send data to a remote host + @IBAction func UI_SendData(sender: AnyObject) { + // Use ordinary read/write calls on ZeroTier socket + + // TCP + if(selectedProtocol == SOCK_STREAM) + { + write(sock, "test", 4); + } + // UDP + if(selectedProtocol == SOCK_DGRAM) + { + } } - - */ var service_thread : NSThread! @@ -140,6 +165,10 @@ class ViewController: NSViewController { override func viewDidLoad() { super.viewDidLoad() + // Set initial UI values for demo + txtAddr.stringValue = serverAddr + txtPort.intValue = serverPort + // ZeroTier Service thread dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), { self.service_thread = NSThread(target:self, selector:"ztnc_start_service", object:nil) @@ -155,7 +184,5 @@ class ViewController: NSViewController { // Update the view, if already loaded. } } - - } diff --git a/tests/docker/_build_single_image.sh b/tests/docker/_build_single_image.sh index aa4b77d..be02571 100755 --- a/tests/docker/_build_single_image.sh +++ b/tests/docker/_build_single_image.sh @@ -8,7 +8,7 @@ touch "$test_name".name cp ../../*.conf . cp ../../zerotier-one zerotier-one cp ../../zerotier-cli zerotier-cli -cp ../../zerotier-cli zerotier-netcon-service +cp ../../zerotier-cli zerotier-sdk-service cp ../../zerotier-intercept zerotier-intercept cp ../../libzerotierintercept.so libzerotierintercept.so cp ../../liblwip.so liblwip.so @@ -21,7 +21,7 @@ docker build --tag="$test_name" -f netcon_dockerfile . docker build --tag="$test_name"_monitor -f monitor_dockerfile . rm -f zerotier-cli -rm -f zerotier-netcon-service +rm -f zerotier-sdk-service rm -f zerotier-intercept rm -f *.so rm -f *.public diff --git a/tests/docker/build_zt.sh b/tests/docker/build_zt.sh index d36c407..e168c70 100755 --- a/tests/docker/build_zt.sh +++ b/tests/docker/build_zt.sh @@ -10,7 +10,7 @@ make netcon cd netcon/docker-test cp ../../zerotier-cli zerotier-cli -cp ../../zerotier-netcon-service zerotier-netcon-service +cp ../../zerotier-sdk-service zerotier-sdk-service cp ../../libzerotierintercept.so libzerotierintercept.so cp ../liblwip.so liblwip.so diff --git a/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_dockerfile b/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_dockerfile index 3c4a30d..be45428 100644 --- a/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_dockerfile +++ b/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_entrypoint.sh b/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_entrypoint.sh index 978696a..833388d 100644 --- a/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_entrypoint.sh +++ b/tests/docker/darkhttpd/darkhttpd-1.11.x86_64/netcon_entrypoint.sh @@ -20,7 +20,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_dockerfile b/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_dockerfile index 6dd89cc..3bff6c3 100644 --- a/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_dockerfile +++ b/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_entrypoint.sh b/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_entrypoint.sh index 688bd63..5633dae 100644 --- a/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_entrypoint.sh +++ b/tests/docker/httpd/httpd-2.4.16-1.fc23.x86_64/netcon_entrypoint.sh @@ -20,7 +20,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_dockerfile b/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_dockerfile index db700dd..5b66f98 100644 --- a/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_dockerfile +++ b/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_dockerfile @@ -27,7 +27,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_entrypoint.sh b/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_entrypoint.sh index 688bd63..5633dae 100644 --- a/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_entrypoint.sh +++ b/tests/docker/httpd/httpd-2.4.16-1.ub14.x86_64/netcon_entrypoint.sh @@ -20,7 +20,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_dockerfile b/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_dockerfile index 99c2733..b12c62b 100644 --- a/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_dockerfile +++ b/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_entrypoint.sh b/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_entrypoint.sh index d2ab248..6b92bfd 100644 --- a/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_entrypoint.sh +++ b/tests/docker/httpd/httpd-2.4.18-1.fc23.x86_64/netcon_entrypoint.sh @@ -21,7 +21,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_dockerfile b/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_dockerfile index c6e6ab3..f9ab870 100644 --- a/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_dockerfile +++ b/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_dockerfile @@ -29,7 +29,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_entrypoint.sh b/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_entrypoint.sh index b9b8ef7..fd21223 100644 --- a/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_entrypoint.sh +++ b/tests/docker/nginx/nginx-1.4.6-1.ub14.x86_64/netcon_entrypoint.sh @@ -21,7 +21,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_dockerfile b/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_dockerfile index 167844b..032a815 100644 --- a/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_dockerfile +++ b/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_entrypoint.sh b/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_entrypoint.sh index b9b8ef7..fd21223 100644 --- a/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_entrypoint.sh +++ b/tests/docker/nginx/nginx-1.8.0-13.fc23.x86_64/netcon_entrypoint.sh @@ -21,7 +21,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_dockerfile b/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_dockerfile index 755a404..c34b7a5 100644 --- a/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_dockerfile +++ b/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_entrypoint.sh b/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_entrypoint.sh index b9b8ef7..fd21223 100644 --- a/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_entrypoint.sh +++ b/tests/docker/nginx/nginx-1.8.0-14.fc23.x86_64/netcon_entrypoint.sh @@ -21,7 +21,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_dockerfile b/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_dockerfile index b0d16f7..6be174f 100644 --- a/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_dockerfile +++ b/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_dockerfile @@ -29,7 +29,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_entrypoint.sh b/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_entrypoint.sh index 44e409d..4d2283d 100644 --- a/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_entrypoint.sh +++ b/tests/docker/nodejs/nodejs-0.10.36-4.fc23/netcon_entrypoint.sh @@ -18,7 +18,7 @@ address_file="$file_path$test_name"_addr"$tmp_ext" # file shared between host an echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/python/python/netcon_dockerfile b/tests/docker/python/python/netcon_dockerfile index 5ff7e05..9fff880 100644 --- a/tests/docker/python/python/netcon_dockerfile +++ b/tests/docker/python/python/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/python/python/netcon_entrypoint.sh b/tests/docker/python/python/netcon_entrypoint.sh index 5e1a19b..a0f305d 100644 --- a/tests/docker/python/python/netcon_entrypoint.sh +++ b/tests/docker/python/python/netcon_entrypoint.sh @@ -20,7 +20,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/python/python3/netcon_dockerfile b/tests/docker/python/python3/netcon_dockerfile index 5852b88..a31c4fb 100644 --- a/tests/docker/python/python3/netcon_dockerfile +++ b/tests/docker/python/python3/netcon_dockerfile @@ -25,7 +25,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -ADD zerotier-netcon-service / +ADD zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/python/python3/netcon_entrypoint.sh b/tests/docker/python/python3/netcon_entrypoint.sh index c3c8b28..c375133 100644 --- a/tests/docker/python/python3/netcon_entrypoint.sh +++ b/tests/docker/python/python3/netcon_entrypoint.sh @@ -20,7 +20,7 @@ tx_md5sumfile="$file_path"tx_"$bigfile_name"_md5sum"$tmp_ext" echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2 diff --git a/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_dockerfile b/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_dockerfile index eaf8ff7..51642f9 100644 --- a/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_dockerfile +++ b/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_dockerfile @@ -26,7 +26,7 @@ RUN cp libzerotierintercept.so lib/libzerotierintercept.so RUN ln -sf /lib/libzerotierintercept.so /lib/libzerotierintercept ADD zerotier-cli / -Add zerotier-netcon-service / +Add zerotier-sdk-service / # Install test scripts ADD netcon_entrypoint.sh /netcon_entrypoint.sh diff --git a/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_entrypoint.sh b/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_entrypoint.sh index b422d17..7665f5c 100644 --- a/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_entrypoint.sh +++ b/tests/docker/redis/redis-3.0.4-1.fc23.x86_64/netcon_entrypoint.sh @@ -18,7 +18,7 @@ address_file="$file_path$test_name"_addr"$tmp_ext" # file shared between host an echo '*** ZeroTier Network Containers Test: ' "$test_name" chown -R daemon /var/lib/zerotier-one chgrp -R daemon /var/lib/zerotier-one -su daemon -s /bin/bash -c '/zerotier-netcon-service -d -U -p9993 >>/tmp/zerotier-netcon-service.out 2>&1' +su daemon -s /bin/bash -c '/zerotier-sdk-service -d -U -p9993 >>/tmp/zerotier-sdk-service.out 2>&1' virtip4="" while [ -z "$virtip4" ]; do sleep 0.2