def _build_openssl(self, file_name): cc.w('skip build openssl again.') return if not self._download_openssl(file_name): return cc.n('prepare openssl source code...', end='') if not os.path.exists(self.OPENSSL_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) if not os.path.exists(self.OPENSSL_PATH_SRC): raise RuntimeError('can not prepare openssl source code.') else: cc.w('already exists, skip.') cc.n('build openssl static...', end='') out_file_lib = os.path.join(self.PATH_RELEASE, 'lib', 'libssl.a') if os.path.exists(out_file_lib): cc.w('already exists, skip.') return cc.v('') old_p = os.getcwd() os.chdir(self.OPENSSL_PATH_SRC) # os.system('./config --prefix={} --openssldir={}/openssl no-zlib no-shared'.format(self.PATH_RELEASE, self.PATH_RELEASE)) # os.system('./Configure darwin64-x86_64-cc') os.system( './Configure darwin64-x86_64-cc --prefix={} --openssldir={}/openssl -fPIC no-zlib no-shared' .format(self.PATH_RELEASE, self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p)
def _make_python_zip(self): cc.n('make python.zip...') out_file = os.path.join(self.base_path, 'python.zip') if os.path.exists(out_file): utils.remove(out_file) _tmp_ = os.path.join(self.base_path, '_tmp_') if os.path.exists(_tmp_): cc.v('clear up temp folder...') utils.remove(_tmp_) cc.v('copying Python `Lib` folder...') shutil.copytree(self.py_lib_path, _tmp_) cc.v('remove useless folders and files...') for i in self.py_lib_remove: utils.remove(_tmp_, i) cc.v('compile .py to .pyc...') makepyo.make(_tmp_) cc.v('compress into python.zip...') utils.make_zip(_tmp_, out_file, from_parent=False) utils.ensure_file_exists(out_file) cc.v('remove temp folder...') utils.remove(_tmp_)
def _prepare_python(self): cc.n('prepare python header files ...', end='') if os.path.exists( os.path.join(PATH_EXTERNAL, 'python', 'include', 'Python.h')): cc.w('already exists, skip.') return cc.v('') # if os.path.exists(os.path.join(env.path_py_inc, 'Python.h')): # cc.e('can not locate python development include path, make sure miniconda installed.') # return # cc.v('') # utils.copy_ex(env.path_py_inc, os.path.join(PATH_EXTERNAL, 'python', 'include')) _header_path = None for p in sys.path: if os.path.exists(os.path.join(p, 'include', 'Python.h')): _header_path = os.path.join(p, 'include') if _header_path is None: cc.e('\ncan not locate python development include path in:') for p in sys.path: cc.e(' ', p) raise RuntimeError() utils.copy_ex(_header_path, os.path.join(PATH_EXTERNAL, 'python', 'include'))
def _build_libuv(self, file_name): if not self._download_libuv(file_name): return if not os.path.exists(self.LIBUV_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libuv...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')): cc.w('already exists, skip.') return cc.v('') # we need following... # apt-get install autoconf aptitude libtool gcc-c++ old_p = os.getcwd() os.chdir(self.LIBUV_PATH_SRC) os.system('sh autogen.sh') os.system('./configure --prefix={} --with-pic'.format( self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p) files = os.listdir(os.path.join(self.PATH_RELEASE, 'lib')) for i in files: if i.startswith('libuv.so') or i.startswith('libuv.la'): # use os.unlink() because some file should be a link. os.unlink(os.path.join(self.PATH_RELEASE, 'lib', i)) utils.ensure_file_exists( os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a'))
def build(self): cc.n('update version...') if not os.path.exists(self.ver_in): raise RuntimeError('file `version.in` not exists.') with codecs.open(self.ver_in, 'r', 'utf-8') as f: lines = f.readlines() for l in lines: if l.startswith('TP_SERVER '): x = l.split(' ') self.VER_TP_SERVER = x[1].strip() elif l.startswith('TP_TPCORE '): x = l.split(' ') self.VER_TP_TPCORE = x[1].strip() elif l.startswith('TP_TPWEB '): x = l.split(' ') self.VER_TP_TPWEB = x[1].strip() elif l.startswith('TP_ASSIST '): x = l.split(' ') self.VER_TP_ASSIST = x[1].strip() cc.v('new version:') cc.v(' Server : ', self.VER_TP_SERVER) cc.v(' - tp_core : ', self.VER_TP_TPCORE) cc.v(' - tp_web : ', self.VER_TP_TPWEB) cc.v(' Assist : ', self.VER_TP_ASSIST) cc.v('') self.make_builder_ver() self.make_server_ver() self.make_tpcore_ver() self.make_tpweb_ver() self.make_assist_win_ver() self.make_assist_macos_ver()
def build_installer(self): cc.n('make teleport installer package...') if os.path.exists(self.base_tmp): utils.remove(self.base_tmp) self._build_web(self.base_path, 'windows', self.path_tmp_data) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('web.ini.in', 'web.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('core.ini.in', 'core.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), 'tp_ssh_server.key') out_path = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path) bin_path = os.path.join(self.path_tmp_data, 'bin') utils.copy_ex(out_path, bin_path, 'tp_web.exe') utils.copy_ex(out_path, bin_path, 'tp_core.exe') utils.copy_ex(out_path, bin_path, 'tpssh.dll') utils.copy_ex(out_path, bin_path, 'tptelnet.dll') if with_rdp: utils.copy_ex(out_path, bin_path, 'tprdp.dll') utils.copy_ex(os.path.join(env.root_path, 'out', 'pysrt'), bin_path, (ctx.dist_path, 'pysrt')) # copy scripts utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'setup.bat') utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'script') if os.path.exists(self._final_file): utils.remove(self._final_file) utils.make_zip(self.path_tmp, self._final_file)
def build(self): self.py_dll_path = self._locate_dll_path() self.py_lib_path = self._locate_lib_path() cc.v('python dll path :', self.py_dll_path) cc.v('python lib path :', self.py_lib_path) cc.n('upgrade pip ...') utils.sys_exec( '{} -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip --upgrade' .format(env.py_exec)) pip = self._get_pip() pypi_modules = [ 'ldap3', 'mako', 'Pillow', 'psutil', 'pymysql', 'qrcode', 'tornado', 'wheezy.captcha' ] for p in pypi_modules: cc.n('install {} ...'.format(p)) utils.sys_exec( '{} install -i https://pypi.tuna.tsinghua.edu.cn/simple {}'. format(pip, p), direct_output=True) self._make_base() self._make_python_zip() self._make_py_ver_file()
def _build_openssl(self, file_name): if not super()._build_openssl(file_name): return cc.n('prepare openssl source code...', end='') if not os.path.exists(self.OPENSSL_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) if not os.path.exists(self.OPENSSL_PATH_SRC): raise RuntimeError('can not prepare openssl source code.') else: cc.w('already exists, skip.') cc.n('build openssl static...', end='') out_file_lib = os.path.join(self.PATH_RELEASE, 'lib', 'libssl.a') if os.path.exists(out_file_lib): cc.w('already exists, skip.') return cc.v('') old_p = os.getcwd() os.chdir(self.OPENSSL_PATH_SRC) # os.system('./config --prefix={} --openssldir={}/openssl no-zlib no-shared'.format(self.PATH_RELEASE, self.PATH_RELEASE)) # os.system('./Configure darwin64-x86_64-cc') os.system('./Configure darwin64-x86_64-cc --prefix={} --openssldir={}/openssl -fPIC no-zlib no-shared'.format(self.PATH_RELEASE, self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p)
def _build_web(self, base_path, dist, target_path): cc.n('make Teleport Web package...') src_path = os.path.join(env.root_path, 'server', 'www') pkg_path = os.path.join(src_path, 'packages') tmp_path = os.path.join(base_path, '_tmp_web_') if os.path.exists(tmp_path): utils.remove(tmp_path) shutil.copytree(os.path.join(src_path, 'teleport'), os.path.join(tmp_path, 'teleport')) utils.remove(os.path.join(tmp_path, 'teleport', '.idea')) cc.n(' - copy packages...') utils.copy_ex(pkg_path, os.path.join(tmp_path, 'packages'), 'packages-common') utils.copy_ex( os.path.join(pkg_path, 'packages-{}'.format(dist)), os.path.join(tmp_path, 'packages', 'packages-{}'.format(dist)), ctx.bits_path) makepyo.remove_cache(tmp_path) shutil.copytree(tmp_path, os.path.join(target_path, 'www')) utils.remove(tmp_path)
def _build_openssl(self, file_name): cc.n('prepare OpenSSL pre-built package ... ', end='') if os.path.exists(self.OPENSSL_PATH_SRC): cc.w('already exists, skip.') return cc.v('') _alt_ver = '_'.join(env.ver_ossl.split('.')) file_name = 'Win32OpenSSL-{}.msi'.format(_alt_ver) installer = os.path.join(PATH_DOWNLOAD, file_name) if not os.path.exists(installer): if not utils.download_file( 'openssl installer', 'http://slproweb.com/download/{}'.format(filename), PATH_DOWNLOAD, file_name): cc.e('can not download pre-built installer of OpenSSL.') return utils.ensure_file_exists(installer) cc.w('On Windows, we use pre-built package of OpenSSL.') cc.w('The installer have been downloaded at "{}".'.format(installer)) cc.w('please install OpenSSL into "{}".'.format(self.OPENSSL_PATH_SRC)) cc.w( '\nOnce the OpenSSL installed, press Enter to continue or Q to quit...', end='') try: x = env.input() except EOFError: x = 'q' if x == 'q': return
def build_installer(self): cc.n('make teleport installer package...') if os.path.exists(self.base_tmp): utils.remove(self.base_tmp) self._build_web(self.base_path, 'windows', self.path_tmp_data) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('web.ini.in', 'web.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('core.ini.in', 'core.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), 'tp_ssh_server.key') out_path = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path) bin_path = os.path.join(self.path_tmp_data, 'bin') utils.copy_ex(out_path, bin_path, 'tp_web.exe') utils.copy_ex(out_path, bin_path, 'tp_core.exe') utils.copy_ex(out_path, bin_path, 'tpssh.dll') utils.copy_ex(out_path, bin_path, 'tptelnet.dll') if with_rdp: utils.copy_ex(out_path, bin_path, 'tprdp.dll') utils.copy_ex(os.path.join(env.root_path, 'out', 'pysrt'), bin_path, (ctx.dist_path, 'pysrt')) # 复制安装所需的脚本 utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'setup.bat') utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'script') if os.path.exists(self._final_file): utils.remove(self._final_file) utils.make_zip(self.path_tmp, self._final_file)
def _prompt_choice(message, choices): cc.v('{} ['.format(message), end='') def_choice = '' for i in range(len(choices)): if i > 0: cc.v('/', end='') msg = choices[i][0] idx = choices[i][1] if choices[i][2]: msg = msg.upper() def_choice = msg[idx].lower() cc.w(msg[:idx], end='') cc.n(msg[idx], end='') cc.w(msg[idx + 1:], end='') else: msg = msg.lower() cc.v(msg[:idx], end='') cc.n(msg[idx], end='') cc.v(msg[idx + 1:], end='') cc.v(']: ', end='') try: x = input().strip() if len(x) == 0: x = def_choice except EOFError: x = def_choice return x
def build_server(self): cc.n('build server app (tp_core/libtpssh/libtelnet/librdp/tp_web)...') out_path = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, 'bin') out_files = list() out_files.append(os.path.join(out_path, 'tp_core')) out_files.append(os.path.join(out_path, 'tp_web')) out_files.append(os.path.join(out_path, 'libtpssh.so')) out_files.append(os.path.join(out_path, 'libtptelnet.so')) if with_rdp: out_files.append(os.path.join(out_path, 'libtprdp.so')) for f in out_files: if os.path.exists(f): utils.remove(f) utils.makedirs(out_path) utils.cmake(os.path.join(env.root_path, 'cmake-build'), ctx.target_path, False) # utils.strip(out_file) for f in out_files: if os.path.exists(f): utils.ensure_file_exists(f)
def _build_libuv(self, file_name): if not self._download_libuv(file_name): return cc.n('prepare libuv source code...', end='') if not os.path.exists(self.LIBUV_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libuv...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')): cc.w('already exists, skip.') return cc.v('') # we need following... # brew install automake libtool old_p = os.getcwd() os.chdir(self.LIBUV_PATH_SRC) os.system('sh autogen.sh') os.system('./configure --prefix={} --with-pic'.format( self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p) rm = [ 'libuv.la', 'libuv.dylib', 'libuv.so.1', 'libuv.so', 'libuv.so.1.0.0' ] for i in rm: _path = os.path.join(self.PATH_RELEASE, 'lib', i) if os.path.exists(_path): utils.remove(_path)
def build(self): cc.n('update version...') if not os.path.exists(self.ver_in): raise RuntimeError('file `version.in` not exists.') with codecs.open(self.ver_in, 'r', 'utf-8') as f: lines = f.readlines() for l in lines: if l.startswith('TELEPORT_SERVER '): x = l.split(' ') self.VER_TELEPORT_SERVER = x[1].strip() elif l.startswith('TELEPORT_ASSIST '): x = l.split(' ') self.VER_TELEPORT_ASSIST = x[1].strip() elif l.startswith('TELEPORT_ASSIST_REQUIRE '): x = l.split(' ') self.VER_TELEPORT_ASSIST_REQUIRE = x[1].strip() # elif l.startswith('TELEPORT_MAKECERT '): # x = l.split(' ') # self.VER_TELEPORT_MAKECERT = x[1].strip() # cc.v('new version:') cc.v(' TELEPORT-Server : ', self.VER_TELEPORT_SERVER) cc.v(' TELEPORT-Assist : ', self.VER_TELEPORT_ASSIST) cc.v(' TELEPORT-Assist-require : ', self.VER_TELEPORT_ASSIST_REQUIRE) # cc.v(' TELEPORT-MakeCert : ', self.VER_TELEPORT_MAKECERT) cc.v('') self.make_build_ver() self.make_assist_ver() self.make_tp_core_ver() self.make_tp_web_ver() self.make_web_ver()
def _build_libuv(self, file_name): if not os.path.exists(self.LIBUV_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libuv...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')): cc.w('already exists, skip.') return cc.v('') # we need following... # apt-get install autoconf aptitude libtool gcc-c++ old_p = os.getcwd() os.chdir(self.LIBUV_PATH_SRC) os.system('sh autogen.sh') os.system('./configure --prefix={} --with-pic'.format(self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p) files = os.listdir(os.path.join(self.PATH_RELEASE, 'lib')) for i in files: if i.startswith('libuv.so') or i.startswith('libuv.la'): # use os.unlink() because some file should be a link. os.unlink(os.path.join(self.PATH_RELEASE, 'lib', i))
def _build_mbedtls(self, file_name): cc.n('prepare mbedtls source code... ', end='') if not os.path.exists(self.MBEDTLS_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename( os.path.join(PATH_EXTERNAL, 'mbedtls-mbedtls-{}'.format(env.ver_mbedtls)), self.MBEDTLS_PATH_SRC) else: cc.w('already exists, skip.') return cc.v('') # fix source file utils.ensure_file_exists( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls', 'config.h')) utils.copy_file( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls'), os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls'), 'config.h') utils.ensure_file_exists( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library', 'rsa.c')) utils.copy_file( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library'), os.path.join(self.MBEDTLS_PATH_SRC, 'library'), 'rsa.c')
def _build_libuv(self, file_name): cc.w('build libuv...skip') return if not os.path.exists(self.LIBUV_PATH_SRC): # os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, PATH_TMP)) os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libuv...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')): cc.w('already exists, skip.') return cc.v('') # we need following... # apt-get install autoconf aptitude libtool gcc-c++ old_p = os.getcwd() os.chdir(self.LIBUV_PATH_SRC) os.system('sh autogen.sh') os.system('./configure --prefix={} --with-pic'.format( self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p)
def _build_jsoncpp(self, file_name): cc.n('prepare jsoncpp source code...', end='') if not os.path.exists(self.JSONCPP_PATH_SRC): cc.v('') os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL)) os.rename(os.path.join(PATH_EXTERNAL, 'jsoncpp-{}'.format(env.ver_jsoncpp)), self.JSONCPP_PATH_SRC) else: cc.w('already exists, skip.')
def _build_mongoose(self, file_name): cc.n('prepare mongoose source code...', end='') if not os.path.exists(self.MONGOOSE_PATH_SRC): cc.v('') os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL)) os.rename(os.path.join(PATH_EXTERNAL, 'mongoose-{}'.format(env.ver_mongoose)), self.MONGOOSE_PATH_SRC) else: cc.w('already exists, skip.')
def _build_libuv(self, file_name): cc.n('prepare libuv source code... ', end='') if not os.path.exists(self.LIBUV_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) time.sleep(1) # wait for a while, otherwise rename may fail. os.rename(os.path.join(PATH_EXTERNAL, 'libuv-{}'.format(env.ver_libuv)), self.LIBUV_PATH_SRC) else: cc.w('already exists, skip.')
def _build_mbedtls(self, file_name): if not os.path.exists(self.MBEDTLS_PATH_SRC): # os.system('tar -zxvf "{}/{}" -C "{}"'.format(PATH_DOWNLOAD, file_name, PATH_TMP)) os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build mbedtls...', end='') if os.path.exists( os.path.join(self.PATH_RELEASE, 'lib', 'libmbedtls.a')): cc.w('already exists, skip.') return cc.v('') # fix the Makefile mkfile = os.path.join(self.MBEDTLS_PATH_SRC, 'Makefile') f = open(mkfile) fl = f.readlines() f.close() fixed = False for i in range(len(fl)): x = fl[i].split('=') if x[0] == 'DESTDIR': fl[i] = 'DESTDIR={}\n'.format(self.PATH_RELEASE) fixed = True break if not fixed: cc.e('can not fix Makefile of mbedtls.') return f = open(mkfile, 'w') f.writelines(fl) f.close() # fix source file utils.ensure_file_exists( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls', 'config.h')) utils.copy_file( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls'), os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls'), 'config.h') utils.ensure_file_exists( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library', 'rsa.c')) utils.copy_file( os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library'), os.path.join(self.MBEDTLS_PATH_SRC, 'library'), 'rsa.c') old_p = os.getcwd() os.chdir(self.MBEDTLS_PATH_SRC) os.system('make CFLAGS="-fPIC" lib') os.system('make install') os.chdir(old_p)
def _make_base(self): if os.path.exists(self.base_path): cc.v('an exists version found, clean up...', self.base_path) utils.remove(self.base_path) cc.v('make pysrt folder...') utils.makedirs(self.base_path) cc.n('copy python extension dll...') utils.copy_ex(self.py_dll_path, os.path.join(self.base_path, 'modules'))
def _build_libuv(self, file_name): cc.n('prepare libuv source code... ', end='') if not os.path.exists(self.LIBUV_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename( os.path.join(PATH_EXTERNAL, 'libuv-{}'.format(env.ver_libuv)), self.LIBUV_PATH_SRC) else: cc.w('already exists, skip.')
def _build_openssl(self, file_name): cc.n('prepare OpenSSL pre-built package ... ', end='') if os.path.exists(self.OPENSSL_PATH_SRC): cc.w('already exists, skip.') return cc.v('') _alt_ver = '_'.join(env.ver_ossl.split('.')) file_name = 'Win32OpenSSL-{}.msi'.format(_alt_ver) installer = os.path.join(PATH_DOWNLOAD, file_name) if not os.path.exists(installer): if not utils.download_file( 'openssl installer', 'http://slproweb.com/download/{}'.format(filename), PATH_DOWNLOAD, file_name): cc.e('can not download pre-built installer of OpenSSL.') return utils.ensure_file_exists(installer) cc.w('On Windows, we use pre-built package of OpenSSL.') cc.w('The installer have been downloaded at "{}".'.format(installer)) cc.w('please install OpenSSL into "{}".'.format(self.OPENSSL_PATH_SRC)) cc.w( '\nOnce the OpenSSL installed, press Enter to continue or Q to quit...', end='') try: x = input() except EOFError: x = 'q' if x == 'q': return _chk_output = [ os.path.join(self.OPENSSL_PATH_SRC, 'include', 'openssl', 'aes.h'), os.path.join(self.OPENSSL_PATH_SRC, 'include', 'openssl', 'opensslv.h'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'libcrypto32MT.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'libeay32MT.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'ssleay32MT.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'static', 'libcrypto32MT.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'static', 'libeay32MT.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'lib', 'VC', 'static', 'ssleay32MT.lib'), ] for f in _chk_output: if not os.path.exists(f): raise RuntimeError( 'build openssl static library from source code failed.')
def _build_mongoose(self, file_name): cc.n('prepare mongoose source code... ', end='') if not os.path.exists(self.MONGOOSE_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename( os.path.join(PATH_EXTERNAL, 'mongoose-{}'.format(env.ver_mongoose)), self.MONGOOSE_PATH_SRC) else: cc.w('already exists, skip.')
def _build_jsoncpp(self, file_name): cc.n('prepare jsoncpp source code... ', end='') if not os.path.exists(self.JSONCPP_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename( os.path.join(PATH_EXTERNAL, 'jsoncpp-{}'.format(env.ver_jsoncpp)), self.JSONCPP_PATH_SRC) else: cc.w('already exists, skip.')
def _build_libssh(self, file_name): # cc.n('skip build libssh on macOS.') # return if not self._download_libssh(file_name): return if not os.path.exists(self.LIBSSH_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libssh...', end='') # if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) and os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh_threads.a')): if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')): cc.w('already exists, skip.') return cc.v('') build_path = os.path.join(self.LIBSSH_PATH_SRC, 'build') cmake_define = ' -DCMAKE_INSTALL_PREFIX={path_release}' \ ' -DOPENSSL_INCLUDE_DIR=/usr/local/opt/openssl/include' \ ' -DOPENSSL_LIBRARIES=/usr/local/opt/openssl/lib' \ ' -DWITH_GCRYPT=OFF' \ ' -DWITH_GEX=OFF' \ ' -DWITH_SFTP=ON' \ ' -DWITH_SERVER=ON' \ ' -DWITH_GSSAPI=OFF' \ ' -DWITH_ZLIB=ON' \ ' -DWITH_PCAP=OFF' \ ' -DBUILD_SHARED_LIBS=OFF' \ ' -DUNIT_TESTING=OFF' \ ' -DWITH_EXAMPLES=OFF' \ ' -DWITH_BENCHMARKS=OFF' \ ' -DWITH_NACL=OFF' \ ''.format(path_release=self.PATH_RELEASE) # ' -DWITH_STATIC_LIB=ON' try: utils.cmake(build_path, 'Release', False, cmake_define) except: pass # because make install will fail because we can not disable ssh_shared target, # so we copy necessary files ourselves. utils.ensure_file_exists( os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'libssh.a')) # utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads', 'libssh_threads.a')) utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh.a') # utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh_threads.a') utils.copy_ex(os.path.join(self.LIBSSH_PATH_SRC, 'include'), os.path.join(self.PATH_RELEASE, 'include'), 'libssh')
def _build_zlib(self, file_name): if not self._download_zlib(file_name): return cc.n('build zlib library from source code... ', end='') if not os.path.exists(self.ZLIB_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename( os.path.join(PATH_EXTERNAL, 'zlib-{}'.format(env.ver_zlib)), self.ZLIB_PATH_SRC) if ctx.target_path == 'debug': olib = 'zlibd.lib' odll = 'zlibd.dll' else: olib = 'zlib.lib' odll = 'zlib.dll' out_file_lib = os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path, olib) out_file_dll = os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path, odll) if os.path.exists(out_file_lib) and os.path.exists(out_file_dll): cc.w('already exists, skip.') return cc.v('') cc.w( 'On Windows, when build zlib, need you use cmake-gui.exe to generate solution file' ) cc.w( 'for Visual Studio 2017. Visit https://docs.tp4a.com for more details.' ) cc.w( '\nOnce the zlib.sln generated, press Enter to continue or Q to quit...', end='') try: x = input() except EOFError: x = 'q' if x == 'q': return cc.i('build zlib...') sln_file = os.path.join(self.ZLIB_PATH_SRC, 'build', 'zlib.sln') utils.msvc_build(sln_file, 'zlib', ctx.target_path, 'win32', False) # utils.ensure_file_exists(os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path, 'zlib.lib')) # utils.ensure_file_exists(os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path, 'zlib.dll')) # utils.copy_file(os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path), os.path.join(self.ZLIB_PATH_SRC, 'lib', ctx.target_path), 'zlib.lib') # utils.copy_file(os.path.join(self.ZLIB_PATH_SRC, 'build', ctx.target_path), os.path.join(self.ZLIB_PATH_SRC, 'lib', ctx.target_path), 'zlib.dll') utils.ensure_file_exists(out_file_lib) utils.ensure_file_exists(out_file_dll)
def _build_libssh(self, file_name): if not os.path.exists(self.LIBSSH_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libssh...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')): cc.w('already exists, skip.') return cc.v('') build_path = os.path.join(self.LIBSSH_PATH_SRC, 'build') cmake_define = ' -DCMAKE_INSTALL_PREFIX={path_release}' \ ' -DOPENSSL_INCLUDE_DIR={path_release}/include' \ ' -DOPENSSL_LIBRARIES={path_release}/lib' \ ' -DWITH_SFTP=ON' \ ' -DWITH_SERVER=ON' \ ' -DWITH_STATIC_LIB=ON' \ ' -DWITH_GSSAPI=OFF' \ ' -DWITH_ZLIB=OFF' \ ' -DWITH_PCAP=OFF' \ ' -DUNIT_TESTING=OFF' \ ' -DWITH_EXAMPLES=OFF' \ ' -DWITH_BENCHMARKS=OFF' \ ' -DWITH_NACL=OFF' \ ' ..'.format(path_release=self.PATH_RELEASE) old_p = os.getcwd() try: utils.cmake(build_path, 'Release', False, cmake_define=cmake_define, cmake_pre_define='CFLAGS="-fPIC"') os.chdir(build_path) utils.sys_exec('make install') except: pass os.chdir(old_p) # utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'libssh.a')) # utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh.a') # utils.copy_ex(os.path.join(self.LIBSSH_PATH_SRC, 'include'), os.path.join(self.PATH_RELEASE, 'include'), 'libssh') utils.ensure_file_exists( os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) files = os.listdir(os.path.join(self.PATH_RELEASE, 'lib')) for i in files: if i.startswith('libssh.so'): # use os.unlink() because some file should be a link. os.unlink(os.path.join(self.PATH_RELEASE, 'lib', i))
def _copy_modules(self): cc.n('copy python extension dll...') utils.makedirs(self.modules_path) ext = utils.extension_suffixes() cc.v('extension ext:', ext) for m in self.modules: for n in ext: s = os.path.join(self.py_dll_path, m) + n if os.path.exists(s): cc.v('copy %s' % s) cc.v(' -> %s' % os.path.join(self.modules_path, m) + n) shutil.copy(s, os.path.join(self.modules_path, m) + n)
def _build_libuv(self, file_name): if not self._download_libuv(file_name): return cc.n('prepare libuv source code... ', end='') if not os.path.exists(self.LIBUV_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) time.sleep(1) # wait for a while, otherwise rename may fail. os.rename( os.path.join(PATH_EXTERNAL, 'libuv-{}'.format(env.ver_libuv)), self.LIBUV_PATH_SRC) else: cc.w('already exists, skip.')
def _build_libssh(self, file_name): if not os.path.exists(self.LIBSSH_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libssh...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')): cc.w('already exists, skip.') return cc.v('') cc.n('fix libssh source code... ', end='') s_name = 'libssh-{}'.format(env.ver_libssh) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'session.c')) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'libcrypto.c')) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'libcrypto-compat.c')) utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'session.c') utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'libcrypto.c') utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'libcrypto-compat.c') build_path = os.path.join(self.LIBSSH_PATH_SRC, 'build') cmake_define = ' -DCMAKE_INSTALL_PREFIX={path_release}' \ ' -DOPENSSL_INCLUDE_DIR={path_release}/include' \ ' -DOPENSSL_LIBRARIES={path_release}/lib' \ ' -DWITH_SFTP=ON' \ ' -DWITH_SERVER=ON' \ ' -DWITH_STATIC_LIB=ON' \ ' -DWITH_GSSAPI=OFF' \ ' -DWITH_ZLIB=OFF' \ ' -DWITH_PCAP=OFF' \ ' -DUNIT_TESTING=OFF' \ ' -DWITH_EXAMPLES=OFF' \ ' -DWITH_BENCHMARKS=OFF' \ ' -DWITH_NACL=OFF' \ ' ..'.format(path_release=self.PATH_RELEASE) old_p = os.getcwd() try: utils.cmake(build_path, 'Release', False, cmake_define=cmake_define, cmake_pre_define='CFLAGS="-fPIC"') os.chdir(build_path) utils.sys_exec('make install') except: pass os.chdir(old_p) utils.ensure_file_exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) files = os.listdir(os.path.join(self.PATH_RELEASE, 'lib')) for i in files: if i.startswith('libssh.so'): # use os.unlink() because some file should be a link. os.unlink(os.path.join(self.PATH_RELEASE, 'lib', i))
def _build_mbedtls(self, file_name): cc.n('prepare mbedtls source code... ', end='') if not os.path.exists(self.MBEDTLS_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename(os.path.join(PATH_EXTERNAL, 'mbedtls-mbedtls-{}'.format(env.ver_mbedtls)), self.MBEDTLS_PATH_SRC) else: cc.w('already exists, skip.') return cc.v('') # fix source file utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls', 'config.h')) utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls'), os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls'), 'config.h')
def _prepare_python(self): cc.n('prepare python header and lib files ...') if os.path.exists(os.path.join(self.PATH_RELEASE, 'include', 'python', 'Python.h')): cc.w(' - header file already exists, skip.') else: utils.ensure_file_exists(os.path.join(self.PATH_RELEASE, 'include', 'python{}m'.format(ctx.py_dot_ver), 'Python.h')) utils.sys_exec('ln -s "{}" "{}"'.format( os.path.join(self.PATH_RELEASE, 'include', 'python{}m'.format(ctx.py_dot_ver)), os.path.join(self.PATH_RELEASE, 'include', 'python') )) lib_file = 'libpython{}m.a'.format(env.py_ver_dot) utils.ensure_file_exists(os.path.join(self.PATH_RELEASE, 'lib', lib_file))
def _build_mongoose(self, file_name): if not self._download_mongoose(file_name): return cc.n('prepare mongoose source code...', end='') if not os.path.exists(self.MONGOOSE_PATH_SRC): cc.v('') os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL)) os.rename( os.path.join(PATH_EXTERNAL, 'mongoose-{}'.format(env.ver_mongoose)), self.MONGOOSE_PATH_SRC) else: cc.w('already exists, skip.')
def _build_jsoncpp(self, file_name): if not self._download_jsoncpp(file_name): return cc.n('prepare jsoncpp source code...', end='') if not os.path.exists(self.JSONCPP_PATH_SRC): cc.v('') os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, PATH_EXTERNAL)) os.rename( os.path.join(PATH_EXTERNAL, 'jsoncpp-{}'.format(env.ver_jsoncpp)), self.JSONCPP_PATH_SRC) else: cc.w('already exists, skip.')
def _build_libssh(self, file_name): cc.n('build libssh static library from source code... ', end='') if not os.path.exists(self.LIBSSH_PATH_SRC): cc.v('') utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename(os.path.join(PATH_EXTERNAL, 'libssh-{}'.format(env.ver_libssh)), self.LIBSSH_PATH_SRC) # cc.n('fix libssh source code... ', end='') # utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', 'src', 'sftp.c')) # utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'sftp.c') cc.n('fix libssh source code... ', end='') s_name = 'libssh-{}'.format(env.ver_libssh) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'session.c')) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'libcrypto.c')) utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src', 'libcrypto-compat.c')) utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'session.c') utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'libcrypto.c') utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'libssh', s_name, 'src'), os.path.join(self.LIBSSH_PATH_SRC, 'src'), 'libcrypto-compat.c') out_file_lib = os.path.join(self.LIBSSH_PATH_SRC, 'lib', ctx.target_path, 'ssh.lib') out_file_dll = os.path.join(self.LIBSSH_PATH_SRC, 'lib', ctx.target_path, 'ssh.dll') if os.path.exists(out_file_lib) and os.path.exists(out_file_dll): cc.w('already exists, skip.') return cc.v('') cc.w('On Windows, when build libssh, need you use cmake-gui.exe to generate solution file') cc.w('for Visual Studio 2017. Visit https://docs.tp4a.com for more details.') cc.w('\nOnce the libssh.sln generated, press Enter to continue or Q to quit...', end='') try: x = env.input() except EOFError: x = 'q' if x == 'q': return cc.i('build libssh...') sln_file = os.path.join(self.LIBSSH_PATH_SRC, 'build', 'libssh.sln') utils.msvc_build(sln_file, 'ssh_shared', ctx.target_path, 'win32', False) utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', ctx.target_path, 'ssh.lib')) utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', ctx.target_path, 'ssh.dll')) utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', ctx.target_path), os.path.join(self.LIBSSH_PATH_SRC, 'lib', ctx.target_path), 'ssh.lib') utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', ctx.target_path), os.path.join(self.LIBSSH_PATH_SRC, 'lib', ctx.target_path), 'ssh.dll') utils.ensure_file_exists(out_file_lib) utils.ensure_file_exists(out_file_dll)
def build_installer(self): cc.n('make teleport installer package...') if os.path.exists(self.base_tmp): utils.remove(self.base_tmp) self._build_web(self.base_path, 'linux', self.path_tmp_data) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('web.ini.in', 'web.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('core.ini.in', 'core.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), 'tp_ssh_server.key') # fix new line flag utils.fix_new_line_flag( os.path.join(self.path_tmp_data, 'tmp', 'etc', 'web.ini')) utils.fix_new_line_flag( os.path.join(self.path_tmp_data, 'tmp', 'etc', 'core.ini')) out_path = os.path.join(env.root_path, 'out', 'server', 'linux', 'bin') bin_path = os.path.join(self.path_tmp_data, 'bin') utils.copy_ex(out_path, bin_path, 'tp_web') utils.copy_ex(out_path, bin_path, 'tp_core') utils.copy_ex(out_path, bin_path, 'libtpssh.so') utils.copy_ex(out_path, bin_path, 'libtptelnet.so') if with_rdp: utils.copy_ex(out_path, bin_path, 'libtprdp.so') utils.copy_ex(os.path.join(env.root_path, 'out', 'pysrt'), bin_path, (ctx.dist_path, 'pysrt')) # copy scripts utils.copy_ex(self.dist_path, self.path_tmp, 'setup.sh') utils.copy_ex(self.dist_path, self.path_tmp, 'script') utils.copy_ex(self.dist_path, self.path_tmp, 'daemon') if os.path.exists(self._final_file): utils.remove(self._final_file) utils.sys_exec('chmod +x {}'.format( os.path.join(self.path_tmp, 'setup.sh'))) utils.make_targz(self.base_tmp, self.name, self._final_file)
def build_server(self): cc.n('build web server ...') # notice: now we can not build debug version of tp_web.exe if ctx.target_path == 'debug': cc.w('cannot build debug version of tp_web, skip.') else: sln_file = os.path.join(env.root_path, 'server', 'tp_web', 'src', 'tp_web.vs2017.sln') out_file = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path, 'tp_web.exe') if os.path.exists(out_file): utils.remove(out_file) utils.msvc_build(sln_file, 'tp_web', ctx.target_path, ctx.bits_path, False) utils.ensure_file_exists(out_file) cc.n('build core server ...') sln_file = os.path.join(env.root_path, 'server', 'tp_core', 'core', 'tp_core.vs2017.sln') out_file = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path, 'tp_core.exe') if os.path.exists(out_file): utils.remove(out_file) utils.msvc_build(sln_file, 'tp_core', ctx.target_path, ctx.bits_path, False) utils.ensure_file_exists(out_file) cc.n('build SSH protocol ...') sln_file = os.path.join(env.root_path, 'server', 'tp_core', 'protocol', 'ssh', 'tpssh.vs2017.sln') out_file = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path, 'tpssh.dll') if os.path.exists(out_file): utils.remove(out_file) utils.msvc_build(sln_file, 'tpssh', ctx.target_path, ctx.bits_path, False) utils.ensure_file_exists(out_file) utils.copy_file(os.path.join(env.root_path, 'external', 'libssh', 'lib', ctx.target_path), os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path), 'ssh.dll') cc.n('build TELNET protocol ...') sln_file = os.path.join(env.root_path, 'server', 'tp_core', 'protocol', 'telnet', 'tptelnet.vs2017.sln') out_file = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path, 'tptelnet.dll') if os.path.exists(out_file): utils.remove(out_file) utils.msvc_build(sln_file, 'tptelnet', ctx.target_path, ctx.bits_path, False) utils.ensure_file_exists(out_file) if with_rdp: cc.n('build RDP protocol ...') sln_file = os.path.join(env.root_path, 'server', 'tp_core', 'protocol', 'rdp', 'tprdp.vs2017.sln') out_file = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, ctx.target_path, 'tprdp.dll') if os.path.exists(out_file): utils.remove(out_file) utils.msvc_build(sln_file, 'tprdp', ctx.target_path, ctx.bits_path, False) utils.ensure_file_exists(out_file)
def _build_sqlite(self, file_name): if not os.path.exists(self.SQLITE_PATH_SRC): os.system('tar -zxvf "{}/{}" -C "{}"'.format( PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build sqlite static...', end='') if os.path.exists( os.path.join(self.PATH_RELEASE, 'lib', 'libsqlite3.a')): cc.w('already exists, skip.') return cc.v('') old_p = os.getcwd() os.chdir(self.SQLITE_PATH_SRC) os.system('./configure --prefix={}'.format(self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p)
def _build_mbedtls(self, file_name): if not os.path.exists(self.MBEDTLS_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build mbedtls...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libmbedtls.a')): cc.w('already exists, skip.') return cc.v('') # fix the Makefile mkfile = os.path.join(self.MBEDTLS_PATH_SRC, 'Makefile') f = open(mkfile) fl = f.readlines() f.close() fixed = False for i in range(len(fl)): x = fl[i].split('=') if x[0] == 'DESTDIR': fl[i] = 'DESTDIR={}\n'.format(self.PATH_RELEASE) fixed = True break if not fixed: cc.e('can not fix Makefile of mbedtls.') return f = open(mkfile, 'w') f.writelines(fl) f.close() # fix source file utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls', 'config.h')) utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'include', 'mbedtls'), os.path.join(self.MBEDTLS_PATH_SRC, 'include', 'mbedtls'), 'config.h') # utils.ensure_file_exists(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library', 'rsa.c')) # utils.copy_file(os.path.join(PATH_EXTERNAL, 'fix-external', 'mbedtls', 'library'), os.path.join(self.MBEDTLS_PATH_SRC, 'library'), 'rsa.c') old_p = os.getcwd() os.chdir(self.MBEDTLS_PATH_SRC) os.system('make CFLAGS="-fPIC" lib') os.system('make install') os.chdir(old_p)
def build(self): self.py_dll_path = self._locate_dll_path() self.py_lib_path = self._locate_lib_path() cc.v('python dll path :', self.py_dll_path) cc.v('python lib path :', self.py_lib_path) cc.n('upgrade pip ...') utils.sys_exec('{} -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip --upgrade'.format(env.py_exec)) pip = self._get_pip() pypi_modules = ['ldap3', 'mako', 'Pillow', 'psutil', 'pymysql', 'qrcode', 'tornado', 'wheezy.captcha'] for p in pypi_modules: cc.n('install {} ...'.format(p)) utils.sys_exec('{} install -i https://pypi.tuna.tsinghua.edu.cn/simple {}'.format(pip, p), direct_output=True) self._make_base() self._make_python_zip() self._make_py_ver_file()
def _prepare_python(self): cc.n('prepare python header files ...', end='') if os.path.exists(os.path.join(PATH_EXTERNAL, 'python', 'include', 'Python.h')): cc.w('already exists, skip.') return cc.v('') _header_path = None for p in sys.path: if os.path.exists(os.path.join(p, 'include', 'Python.h')): _header_path = os.path.join(p, 'include') if _header_path is None: cc.e('\ncan not locate python development include path in:') for p in sys.path: cc.e(' ', p) raise RuntimeError() utils.copy_ex(_header_path, os.path.join(PATH_EXTERNAL, 'python', 'include'))
def _build_libuv(self, file_name): cc.n('prepare libuv source code...', end='') if not os.path.exists(self.LIBUV_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libuv...', end='') if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libuv.a')): cc.w('already exists, skip.') return cc.v('') # we need following... # brew install automake libtool old_p = os.getcwd() os.chdir(self.LIBUV_PATH_SRC) os.system('sh autogen.sh') os.system('./configure --prefix={} --with-pic'.format(self.PATH_RELEASE)) os.system('make') os.system('make install') os.chdir(old_p)
def _build_web(self, base_path, dist, target_path): cc.n('make Teleport Web package...') src_path = os.path.join(env.root_path, 'server', 'www') pkg_path = os.path.join(src_path, 'packages') tmp_path = os.path.join(base_path, '_tmp_web_') if os.path.exists(tmp_path): utils.remove(tmp_path) shutil.copytree(os.path.join(src_path, 'teleport'), os.path.join(tmp_path, 'teleport')) utils.remove(os.path.join(tmp_path, 'teleport', '.idea')) cc.n(' - copy packages...') # utils.copy_ex(pkg_path, os.path.join(tmp_path, 'packages'), 'packages-common') utils.copy_ex(os.path.join(pkg_path, 'packages-{}'.format(dist)), os.path.join(tmp_path, 'packages', 'packages-{}'.format(dist)), ctx.bits_path) self._remove_py_cache(os.path.join(tmp_path, 'packages')) makepyo.remove_cache(tmp_path) shutil.copytree(tmp_path, os.path.join(target_path, 'www')) utils.remove(tmp_path)
def _make_base(self): if os.path.exists(self.base_path): cc.v('an exists version found, clean up...', self.base_path) utils.remove(self.base_path) cc.v('make pysrt folder...') utils.makedirs(self.base_path) cc.n('copy python extension dll...') utils.copy_ex(self.py_dll_path, self.modules_path) cc.v('remove useless modules...') for i in PY_MODULE_REMOVE_LINUX: utils.remove(self.modules_path, '{}.cpython-{}m-x86_64-linux-gnu.so'.format(i, ctx.py_ver)) ext = utils.extension_suffixes() files = os.listdir(self.modules_path) for i in files: for n in ext: if i.find('_failed{}'.format(n)) != -1: utils.remove(self.modules_path, i)
def _build_libssh(self, file_name): if not os.path.exists(self.LIBSSH_PATH_SRC): os.system('unzip "{}/{}" -d "{}"'.format(PATH_DOWNLOAD, file_name, self.PATH_TMP)) cc.n('build libssh...', end='') # if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')) and os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh_threads.a')): if os.path.exists(os.path.join(self.PATH_RELEASE, 'lib', 'libssh.a')): cc.w('already exists, skip.') return cc.v('') build_path = os.path.join(self.LIBSSH_PATH_SRC, 'build') cmake_define = ' -DCMAKE_INSTALL_PREFIX={path_release}' \ ' -DOPENSSL_INCLUDE_DIR={path_release}/include' \ ' -DOPENSSL_LIBRARIES={path_release}/lib' \ ' -DWITH_SFTP=ON' \ ' -DWITH_SERVER=ON' \ ' -DWITH_STATIC_LIB=ON' \ ' -DWITH_GSSAPI=OFF' \ ' -DWITH_ZLIB=OFF' \ ' -DWITH_PCAP=OFF' \ ' -DUNIT_TESTING=OFF' \ ' -DWITH_EXAMPLES=OFF' \ ' -DWITH_BENCHMARKS=OFF' \ ' -DWITH_NACL=OFF' \ ''.format(path_release=self.PATH_RELEASE) try: utils.cmake(build_path, 'Release', False, cmake_define) except: pass # because make install will fail because we can not disable ssh_shared target, # so we copy necessary files ourselves. utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'libssh.a')) # utils.ensure_file_exists(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads', 'libssh_threads.a')) utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh.a') # utils.copy_file(os.path.join(self.LIBSSH_PATH_SRC, 'build', 'src', 'threads'), os.path.join(self.PATH_RELEASE, 'lib'), 'libssh_threads.a') utils.copy_ex(os.path.join(self.LIBSSH_PATH_SRC, 'include'), os.path.join(self.PATH_RELEASE, 'include'), 'libssh')
def build(self): cc.n('update version...') if not os.path.exists(self.ver_in): raise RuntimeError('file `version.in` not exists.') with codecs.open(self.ver_in, 'r', 'utf-8') as f: lines = f.readlines() for l in lines: if l.startswith('TP_SERVER '): x = l.split(' ') self.VER_TP_SERVER = x[1].strip() # self.VER_TP_SERVER += '.0' elif l.startswith('TP_TPCORE '): x = l.split(' ') self.VER_TP_TPCORE = x[1].strip() # self.VER_TP_TPCORE += '.0' elif l.startswith('TP_TPWEB '): x = l.split(' ') self.VER_TP_TPWEB = x[1].strip() # self.VER_TP_TPWEB += '.0' elif l.startswith('TP_ASSIST '): x = l.split(' ') self.VER_TP_ASSIST = x[1].strip() # self.VER_TP_ASSIST += '.0' cc.v('new version:') cc.v(' Server : ', self.VER_TP_SERVER) cc.v(' - tp_core : ', self.VER_TP_TPCORE) cc.v(' - tp_web : ', self.VER_TP_TPWEB) cc.v(' Assist : ', self.VER_TP_ASSIST) cc.v('') self.make_builder_ver() self.make_server_ver() self.make_tpcore_ver() self.make_tpweb_ver() self.make_assist_win_ver() self.make_assist_macos_ver()
def build_installer(self): cc.n('make teleport installer package...') if os.path.exists(self.base_tmp): utils.remove(self.base_tmp) self._build_web(self.base_path, 'linux', self.path_tmp_data) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('web.ini.in', 'web.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), ('core.ini.in', 'core.ini')) utils.copy_file(os.path.join(env.root_path, 'server', 'share', 'etc'), os.path.join(self.path_tmp_data, 'tmp', 'etc'), 'tp_ssh_server.key') # fix new line flag utils.fix_new_line_flag(os.path.join(self.path_tmp_data, 'tmp', 'etc', 'web.ini')) utils.fix_new_line_flag(os.path.join(self.path_tmp_data, 'tmp', 'etc', 'core.ini')) out_path = os.path.join(env.root_path, 'out', 'server', ctx.bits_path, 'bin') bin_path = os.path.join(self.path_tmp_data, 'bin') utils.copy_ex(out_path, bin_path, 'tp_web') utils.copy_ex(out_path, bin_path, 'tp_core') utils.copy_ex(out_path, bin_path, 'libtpssh.so') utils.copy_ex(out_path, bin_path, 'libtptelnet.so') if with_rdp: utils.copy_ex(out_path, bin_path, 'libtprdp.so') utils.copy_ex(os.path.join(env.root_path, 'out', 'pysrt'), bin_path, (ctx.dist_path, 'pysrt')) # 复制安装所需的脚本 utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'setup.sh') utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'script') utils.copy_ex(os.path.join(self.dist_path), self.path_tmp, 'daemon') if os.path.exists(self._final_file): utils.remove(self._final_file) utils.make_targz(self.base_tmp, self.name, self._final_file)
def _build_openssl(self, file_name): cc.n('build openssl static library from source code... ') if not super()._build_openssl(file_name): return _chk_output = [ os.path.join(self.OPENSSL_PATH_SRC, 'out32', 'libeay32.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'out32', 'ssleay32.lib'), os.path.join(self.OPENSSL_PATH_SRC, 'inc32', 'openssl', 'opensslconf.h'), ] need_build = False for f in _chk_output: if not os.path.exists(f): need_build = True break if not need_build: cc.n('build openssl static library from source code... ', end='') cc.w('already exists, skip.') return cc.v('') cc.n('prepare openssl source code...') _alt_ver = '_'.join(env.ver_ossl.split('.')) if not os.path.exists(self.OPENSSL_PATH_SRC): utils.unzip(os.path.join(PATH_DOWNLOAD, file_name), PATH_EXTERNAL) os.rename(os.path.join(PATH_EXTERNAL, 'openssl-OpenSSL_{}'.format(_alt_ver)), self.OPENSSL_PATH_SRC) if not os.path.exists(self.OPENSSL_PATH_SRC): raise RuntimeError('can not prepare openssl source code.') else: cc.w('already exists, skip.') os.chdir(self.OPENSSL_PATH_SRC) os.system('""{}" Configure VC-WIN32"'.format(env.perl)) os.system(r'ms\do_nasm') # for vs2015 # utils.sys_exec(r'"{}\VC\bin\vcvars32.bat" && nmake -f ms\nt.mak'.format(env.visual_studio_path), direct_output=True) # for vs2017 community utils.sys_exec(r'"{}VC\Auxiliary\Build\vcvars32.bat" && nmake -f ms\nt.mak'.format(env.visual_studio_path), direct_output=True) for f in _chk_output: if not os.path.exists(f): raise RuntimeError('build openssl static library from source code failed.')