diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-14 13:56:28 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-04-14 13:56:28 -0700 |
| commit | 1cfa67bbdd4242a52484f13f3533babb4d4c07a6 (patch) | |
| tree | d772b3b7cc40371afaa494c4e623511133e0e33e /attic/ZeroTierUI/main.cpp | |
| parent | a2605561af19d7de7ed492d1faf00d7ff161c6ea (diff) | |
| download | infinitytier-1cfa67bbdd4242a52484f13f3533babb4d4c07a6.tar.gz infinitytier-1cfa67bbdd4242a52484f13f3533babb4d4c07a6.zip | |
Bunch more control plane work, and shelve old UI -- React FTW.
Diffstat (limited to 'attic/ZeroTierUI/main.cpp')
| -rw-r--r-- | attic/ZeroTierUI/main.cpp | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/attic/ZeroTierUI/main.cpp b/attic/ZeroTierUI/main.cpp new file mode 100644 index 00000000..e3d24939 --- /dev/null +++ b/attic/ZeroTierUI/main.cpp @@ -0,0 +1,194 @@ +/* + * ZeroTier One - Network Virtualization Everywhere + * Copyright (C) 2011-2015 ZeroTier, Inc. + * + * 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 3 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, see <http://www.gnu.org/licenses/>. + * + * -- + * + * ZeroTier may be used and distributed under the terms of the GPLv3, which + * are available at: http://www.gnu.org/licenses/gpl-3.0.html + * + * If you would like to embed ZeroTier into a commercial application or + * redistribute it in a modified binary form, please contact ZeroTier Networks + * LLC. Start here: http://www.zerotier.com/ + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "mainwindow.h" +#include "installdialog.h" +#include "licensedialog.h" + +#include <QApplication> +#include <QDir> +#include <QString> +#include <QFont> +#include <QMessageBox> + +#include "../node/Constants.hpp" +#include "../node/Defaults.hpp" + +// Uncomment for testing to disable making sure Windows service is running +#define DISABLE_WINDOWS_SERVICE_MANAGEMENT + +#ifdef __WINDOWS__ +#include <WinSock2.h> +#include <windows.h> +#include "../windows/ZeroTierOne/ZeroTierOneService.h" + +#ifndef DISABLE_WINDOWS_SERVICE_MANAGEMENT +// Returns true if started or already running, false if failed or not installed +static bool startWindowsService() +{ + SERVICE_STATUS ssSvcStatus; + SC_HANDLE schSCManager = NULL; + SC_HANDLE schService = NULL; + + schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT); + if (schSCManager == NULL) + return false; + + schService = OpenServiceA(schSCManager, ZT_SERVICE_NAME, SERVICE_QUERY_STATUS | SERVICE_START); + if (schService == NULL) { + CloseServiceHandle(schSCManager); + return false; + } + + int tries = 0; + bool running = true; + + for(;;) { + memset(&ssSvcStatus,0,sizeof(ssSvcStatus)); + if ((++tries > 20)||(!QueryServiceStatus(schService,&ssSvcStatus))) { + running = false; + break; + } + + if (ssSvcStatus.dwCurrentState == SERVICE_RUNNING) { + break; + } else if (ssSvcStatus.dwCurrentState == SERVICE_START_PENDING) { + Sleep(500); + continue; + } + + StartService(schService,0,NULL); + Sleep(500); + } + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return running; +} +#endif // !DISABLE_WINDOWS_SERVICE_MANAGEMENT +#endif // __WINDOWS__ + +// Globally visible settings for the app +QSettings *settings = (QSettings *)0; + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + +#ifdef __WINDOWS__ + // Start up Winsock2 + { + WSADATA wsaData; + WSAStartup(MAKEWORD(2,2),&wsaData); + } +#endif + + { + QFile qss(":css/stylesheet.css"); + qss.open(QFile::ReadOnly); + QString style(qss.readAll()); + a.setStyleSheet(style); + } + +#ifdef __APPLE__ + // If service isn't installed, download and install it + if (!QFile::exists("/Library/Application Support/ZeroTier/One/zerotier-one")) { + // InstallDialog is an alternative main window. It will re-launch the app + // when done. + InstallDialog id; + id.setStyleSheet(a.styleSheet()); + id.show(); + return a.exec(); + } + + { + // Put QSettings here because this is one of the writable directories allowed + // in Apple's app store sandbox specs. We might end up in app store someday. + QString zt1AppSupport(QDir::homePath() + "/Library/Application Support/ZeroTier/One"); + QDir::root().mkpath(zt1AppSupport); + settings = new QSettings(zt1AppSupport + "/ui.ini",QSettings::IniFormat); + } +#else // on non-Apple boxen put it in the standard place using the default format + settings = new QSettings("ZeroTier Networks","ZeroTier One"); +#endif + + if (!settings->value("acceptedLicenseV1",false).toBool()) { + LicenseDialog ld; + ld.setStyleSheet(a.styleSheet()); + ld.exec(); + } + +#if defined(__WINDOWS__) && !defined(DISABLE_WINDOWS_SERVICE_MANAGEMENT) + { + bool winSvcInstalled = false; + while (!startWindowsService()) { + if (winSvcInstalled) { + // Service was installed and subsequently failed to start again, so + // something is wrong! + QMessageBox::critical((QWidget *)0,"Service Not Available","Unable to locate or start ZeroTier One service. There may be a problem with the installation. Try installing from the .msi file again or e-mail contact@zerotier.com if you cannot install. (Error: service failed to start)",QMessageBox::Ok); + return 1; + } + +#ifdef _WIN64 + BOOL is64Bit = TRUE; +#else + BOOL is64Bit = FALSE; + IsWow64Process(GetCurrentProcess(),&is64Bit); +#endif + std::string exe(ZeroTier::ZT_DEFAULTS.defaultHomePath + "\\zerotier-one_"); + exe.append((is64Bit == TRUE) ? "x64.exe" : "x86.exe"); + + if (QFile::exists(exe.c_str())) { + STARTUPINFOA si; + PROCESS_INFORMATION pi; + memset(&si,0,sizeof(si)); + memset(&pi,0,sizeof(pi)); + if (CreateProcessA(NULL,const_cast <LPSTR>((exe + " -I").c_str()),NULL,NULL,FALSE,CREATE_NO_WINDOW|CREATE_NEW_PROCESS_GROUP,NULL,NULL,&si,&pi)) { + WaitForSingleObject(pi.hProcess,INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + winSvcInstalled = true; + } + } + + if (!winSvcInstalled) { + // Service failed to install -- installation problem like missing .exe + QMessageBox::critical((QWidget *)0,"Service Not Available","Unable to locate or start ZeroTier One service. There may be a problem with the installation. Try installing from the .msi file again or e-mail contact@zerotier.com if you cannot install. (Error: service not installed)",QMessageBox::Ok); + return 1; + } + } + } +#endif + + MainWindow w; + w.show(); + return a.exec(); +} |
