This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch cvix/2.x in repository pyhoca-gui. commit c44a152e90dc3b29c1696f047c67952b7bf2b103 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Fri Feb 7 13:38:21 2014 +0100 CVix: import CVix specific code --- CVix.py | 390 ++++++++++++++++++++++++++++++++++++++++++++ CVix/CVix_initemplate.py | 61 +++++++ CVix/icons/16x16/CVix.png | Bin 0 -> 486 bytes CVix/icons/22x22/CVix.png | Bin 0 -> 554 bytes CVix/img/CVix.png | Bin 0 -> 3956205 bytes CVix/img/cvix_about.png | Bin 0 -> 61359 bytes CVix/nsis_template_CVix.py | 220 +++++++++++++++++++++++++ CVix/pixmaps/CVix.ico | Bin 0 -> 29686 bytes setup_CVix.py | 389 +++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 1060 insertions(+) diff --git a/CVix.py b/CVix.py new file mode 100755 index 0000000..6d568cd --- /dev/null +++ b/CVix.py @@ -0,0 +1,390 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (C) 2010-2012 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> +# Copyright (C) 2010-2012 by Dick Kniep <dick.kniep@lindix.nl> +# +# PyHoca GUI 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. +# +# PyHoca GUI 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 St, Fifth Floor, Boston, MA 02110-1301, USA. + +modules ={} + +import os.path +import subprocess +import sys +import wxversion + +try: + wxversion.select('2.9') +except: pass +try: + wxversion.select('2.8') +except: pass +import wx +import argparse + +import logging, logging.handlers +import os +import ConfigParser +import getpass + +import CVix.CVix_initemplate + +from x2go import X2GOCLIENT_OS as _X2GOCLIENT_OS +from x2go import X2goSessionProfiles + +# Python X2Go modules +from x2go import CURRENT_LOCAL_USER as _CURRENT_LOCAL_USER +from x2go import X2goLogger as _X2goLogger + +# X2Go backends + +from pyhoca.wxgui import __VERSION__ as _version +from pyhoca.wxgui import messages +from pyhoca.wxgui.basepath import locale_basepath +from pyhoca.wxgui import PyHocaGUI + +if _X2GOCLIENT_OS == "Windows": + from x2go import X2GoClientXConfig as _X2GoClientXConfig + +__author__ = "Mike Gabriel, Dick Kniep" +__version__ = _version + +PROG_NAME = os.path.basename(sys.argv[0]).replace('.exe', '').replace('.py', '') +PROG_PID = os.getpid() + +# version information +VERSION=_version +VERSION_TEXT=""" +%s[%s] - an X2Go GUI client written in Python +---------------------------------------------------------------------- +developed by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> +sponsored by Dick Kniep <dick.kniep@lindix.nl> (2010-2012) + +VERSION: %s + +""" % (PROG_NAME, PROG_PID, VERSION) + + +if _X2GOCLIENT_OS == 'Windows': + import _winreg + +SESSIONDIR = '.x2goclient' + +ProgramFiles = None +if hasattr(sys, 'frozen') and sys.frozen in ("windows_exe", "console_exe"): + class Win32_Logging(object): + + softspace = 0 + _fname = os.path.join(os.environ['AppData'], PROG_NAME, '%s.log' % PROG_NAME) + _file = None + + def __init__(self, filemode='a'): + self._filemode = filemode + + def write(self, text, **kwargs): + if self._file is None: + try: + try: + os.mkdir(os.path.dirname(self._fname)) + except: + pass + self._file = open(self._fname, self._filemode) + except: + pass + else: + self._file.write(text) + self._file.flush() + + def flush(self): + if self._file is not None: + self._file.flush() + + sys.stdout = Win32_Logging(filemode='w+') + sys.stderr = Win32_Logging(filemode='a') + del Win32_Logging + + try: + OK = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,'SOFTWARE\\CVix') + except WindowsError: + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='ALREADY_RUNNING', msg='CVix niet opgeslagen in register, waarschijnlijk is de installatie niet gelukt.', title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + sys.exit(1) + + ProgramFiles, Regtype = _winreg.QueryValueEx(OK, 'Install_Dir') + +import gevent +import gevent.monkey +gevent.monkey.patch_all() +import gettext + + +if _X2GOCLIENT_OS in ('Linux', 'Mac'): + import setproctitle + setproctitle.setproctitle(PROG_NAME) + +if sys.argv[0].startswith('./') or sys.argv[0].startswith('python') or sys.argv[1] == '--debug' or (os.environ.has_key('PYHOCAGUI_DEVELOPMENT') and os.environ['PYHOCAGUI_DEVELOPMENT'] == '1'): + sys.path.insert(0, os.getcwd()) + os.environ['PYHOCAGUI_DEVELOPMENT'] = '1' + ProgramFiles = os.getcwd() + print '### PyHoca-GUI running in development mode ###' + +if not ProgramFiles: + ProgramFiles = '/Program Files/%s' % PROG_NAME + +f = open(os.path.join('CVix', 'customer'), 'r') +CUSTOMER_HOST = f.read().replace('\n', '').replace('\r', '') +f.close() +CUSTOMER_USER = CUSTOMER_HOST.split('.')[0] +CUSTOMER_KEY = 'CVix/keys/%s.key' % CUSTOMER_USER + +if _X2GOCLIENT_OS == 'Windows': + from pyhoca.wxgui.basepath import nxproxy_binary + os.environ.update({'NXPROXY_BINARY': nxproxy_binary, }) + +def check_running(): + if _X2GOCLIENT_OS in ('Linux', 'Mac'): + p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) + psA_out = p.communicate() + return psA_out[0].count(PROG_NAME) > 1 + elif _X2GOCLIENT_OS == 'Windows': + import wmi + w = wmi.WMI() + _p_names = [] + for process in w.Win32_Process(): + _p_names.append(process.Name) + return len([ _p_name for _p_name in _p_names if _p_name == PROG_NAME]) > 1 + +def configFile(ProgramFiles): + + bdir = os.path.join(os.path.normpath(os.path.expanduser('~')), SESSIONDIR) + sessionFile = os.path.join(bdir, 'sessions') + + session_profiles = X2goSessionProfiles(config_files=[sessionFile]) + + found = False + if 'CVix' in session_profiles.profile_names: + found = True + + if not found: + + profile_config = CVix.CVix_initemplate.SESSION_PROFILE_TEMPLATE + customized_config = { + 'sshproxyhost': '{hostname}'.format(hostname=CUSTOMER_HOST), + 'sshproxyport': 3389, + 'sshproxyuser': CUSTOMER_USER, + 'sshproxykeyfile': os.path.join(ProgramFiles, CUSTOMER_KEY), + 'icon': os.path.join(ProgramFiles, 'CVix', 'pixmaps', 'CVix.ico'), + 'user': getpass.getuser(), + } + profile_config['export'] = profile_config['export'].format(local_home=os.path.normpath(os.path.expanduser('~'))) + profile_config.update(customized_config) + + session_profiles.add_profile(profile_id=None, **profile_config) + + session_profiles.write_user_config = True + session_profiles.write() + + +class args: + def __init__(self, session_profile='CVix', debug=True, quiet=False, libdebug=True, libdebug_sftpxfer=True, version=False, + remember_username=True, non_interactive=True, auto_connect=False, show_profile_metatypes=False, single_session_profile=False, + tray_icon='CVix', tray_icon_connecting=None, add_to_known_hosts=True, + restricted_trayicon=False, start_on_connect=False, exit_on_disconnect=False, resume_newest_on_connect=True, resume_oldest_on_connect=False, + resume_all_on_connect=False, disconnect_on_suspend=False, disconnect_on_terminate=False, + splash_image=None, disable_splash=True, disable_options=False, + disable_printingprefs=False, disable_profilemanager=False, disable_notifications=False, display=None, logon_window_position=None, + published_applications_no_submenus=10, lang='nl', backend_controlsession=None, backend_terminalsession=None, backend_serversessioninfo=None, + backend_serversessionlist=None, backend_proxy=None, backend_sessionprofiles=None, backend_clientsettings=None, backend_clientprinting=None, + start_xserver=True, preferred_xserver=None, start_pulseaudio=False, client_rootdir=None, sessions_rootdir=None, ssh_rootdir=None,about_image='cvix_about.png'): + self.start_xserver = start_xserver + self.client_rootdir = client_rootdir + self.sessions_rootdir = sessions_rootdir + self.ssh_rootdir = ssh_rootdir + self.preferred_xserver = preferred_xserver + self.start_pulseaudio = start_pulseaudio + self.session_profile = session_profile + self.add_to_known_hosts = add_to_known_hosts + self.debug = debug + self.quiet = quiet + self.libdebug = libdebug + self.libdebug_sftpxfer = libdebug_sftpxfer + self.version = version + self.remember_username = remember_username + self.non_interactive = non_interactive + self.auto_connect = auto_connect + self.show_profile_metatypes = show_profile_metatypes + self.single_session_profile = single_session_profile + self.tray_icon = tray_icon + self.tray_icon_connecting = tray_icon_connecting + self.restricted_trayicon = restricted_trayicon + self.start_on_connect = start_on_connect + self.exit_on_disconnect = exit_on_disconnect + self.resume_newest_on_connect = resume_newest_on_connect + self.resume_oldest_on_connect = resume_oldest_on_connect + self.resume_all_on_connect = resume_all_on_connect + self.disconnect_on_suspend = disconnect_on_suspend + self.disconnect_on_terminate = disconnect_on_terminate + self.splash_image = splash_image + self.disable_splash = disable_splash + self.disable_options = disable_options + self.disable_printingprefs = disable_printingprefs + self.disable_profilemanager = disable_profilemanager + self.disable_notifications = disable_notifications + self.display = display + self.logon_window_position = logon_window_position + self.published_applications_no_submenus = published_applications_no_submenus + self.lang = lang + self.backend_controlsession = backend_controlsession + self.backend_terminalsession = backend_terminalsession + self.backend_serversessioninfo = backend_serversessioninfo + self.backend_serversessionlist = backend_serversessionlist + self.backend_proxy = backend_proxy + self.backend_sessionprofiles = backend_sessionprofiles + self.backend_clientsettings = backend_clientsettings + self.backend_clientprinting = backend_clientprinting + self.about_image = about_image + +def processArgs(debug, libdebug): + global DEBUG + global print_action_args + + a = args(debug=debug, libdebug=libdebug) + logger = _X2goLogger(tag='CVix') + liblogger = _X2goLogger() + + if a.debug: + logger.set_loglevel_debug() + + if a.libdebug: + liblogger.set_loglevel_debug() + + if a.quiet: + logger.set_loglevel_quiet() + liblogger.set_loglevel_quiet() + + if a.libdebug_sftpxfer: + liblogger.enable_debug_sftpxfer() + + if a.single_session_profile and a.session_profile is None: + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='SINGLESESSIONS', msg='The --single-session-profile option requires naming of a specific session profile!', title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + sys.exit(1) + + if a.non_interactive: + if a.session_profile is None: + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='SINGLESESSIONS', msg='In non-interactive mode you have to use the --session-profile option (or -P) to specify a certain session profile name!', title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + sys.exit(1) + a.restricted_trayicon = True + a.auto_connect = True + a.start_on_connect = True + a.resume_all_on_connect = True + a.exit_on_disconnect = True + a.disconnect_on_suspend = True + a.disconnect_on_terminate = True + a.single_session_profile = True + + if a.non_interactive and (a.resume_newest_on_connect or a.resume_oldest_on_connect): + # allow override... + a.resume_all_on_connect = False + + if _X2GOCLIENT_OS == "Windows": + _x = _X2GoClientXConfig() + _known_xservers = _x.known_xservers + _installed_xservers = _x.installed_xservers + + if _X2GOCLIENT_OS == 'Windows' and a.preferred_xserver: + if a.preferred_xserver not in _installed_xservers: + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='SINGLESESSIONS', msg='Xserver ,,%s\'\' is not installed on your Windows system' % a.preferred_xserver, title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + sys.exit(1) + a.start_xserver = a.preferred_xserver + + if _X2GOCLIENT_OS == 'Windows' and a.start_xserver and a.display: + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='SINGLESESSIONS', msg='You can tell PyHoca-GUI to handle XServer startup and then specify a DISPLAY environment variable!', title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + sys.exit(1) + + if a.display: + os.environ.update({'DISPLAY': a.display}) + else: + if _X2GOCLIENT_OS == 'Windows' and not a.start_xserver: + os.environ.update({'DISPLAY': 'localhost:0'}) + + if a.client_rootdir: + a.backend_sessionprofiles='FILE' + a.backend_clientsettings='FILE' + a.backend_clientprinting='FILE' + + return a, logger, liblogger + +def startCVix(loglevel): + """ + Deze functie zorgt er voor dat bij verschillende mensen die gebruik + maken van dezelfde computer en verschillende accounts hebben, + de directory met de juiste instellingen gekopieerd wordt naar + de nieuwe gebruiker. Tevens geeft het info indien er een probleem met + opstarten. + """ + libdbg = dbg = False + if loglevel in ('--debug', '-D'): + libdbg = dbg = True + + a, logger, liblogger = processArgs(debug=dbg, libdebug=libdbg) + + print 'Programma %s' % ProgramFiles + if ProgramFiles is None: + logger.error('CVix gevonden in register, maar de installatiedirectory niet gevonden') + sys.exit(1) + configFile(ProgramFiles) + + if _X2GOCLIENT_OS == 'Windows': + print 'Locale basepath = ' + locale_basepath + print 'languages = ' + a.lang + if a.lang: + lang = gettext.translation('pyhoca-gui', localedir=locale_basepath, languages=[a.lang], ) + else: + lang = gettext.translation('pyhoca-gui', localedir=locale_basepath, languages=['en'], ) + lang.install(unicode=True) + else: + gettext.install('pyhoca-gui', localedir=locale_basepath, unicode=True) + + if check_running(): + sys.stderr.write("\n###############################\n### %s: already running for user %s\n###############################\n" % (PROG_NAME, _CURRENT_LOCAL_USER)) + m = messages.PyHoca_MessageWindow_Ok(wx.App(), shortmsg='ALREADY_RUNNING', title=u'PyHoca-GUI (%s)...' % VERSION, icon='pyhoca-trayicon') + m.ShowModal() + + try: + thisPyHocaGUI = PyHocaGUI(a, logger, liblogger, version=VERSION, appname='CVix') + thisPyHocaGUI.MainLoop() + except KeyboardInterrupt: + thisPyHocaGUI.WakeUpIdle() + thisPyHocaGUI.ExitMainLoop() + except SystemExit: + thisPyHocaGUI.WakeUpIdle() + thisPyHocaGUI.ExitMainLoop() + +if __name__ == '__main__': +# debug options... + mainPath = os.path.normpath(os.path.dirname(sys.argv[0])) + os.chdir(mainPath) + global DEBUG + global print_action_args + ldb = None + if len(sys.argv) > 1: + ldb = sys.argv[1] + + startCVix(ldb) diff --git a/CVix/CVix_initemplate.py b/CVix/CVix_initemplate.py new file mode 100644 index 0000000..957b883 --- /dev/null +++ b/CVix/CVix_initemplate.py @@ -0,0 +1,61 @@ +# -*- coding: utf-8 -*- +SESSION_PROFILE_TEMPLATE = { + 'iconvfrom': 'UTF-8', + 'height': 600, + 'speed': 0, + 'setsessiontitle': 0, + 'sessiontitle': '', + 'width': 800, + 'krblogin': False, + 'soundsystem': 'pulse', + 'autostart': True, + 'maxdim': True, + 'type': 'auto', + 'sndport': 4713, + # gets substituted during application start + 'sshproxyuser': '{sshproxyuser}', + 'usekbd': True, + 'autologin': False, + 'sound': False, + 'rootless': True, + # gets substituted during application start + 'sshproxyhost': '{sshproxyhost}', + 'name': 'CVix', + 'iconvto': 'UTF-8', + 'sshport': 3389, + 'startsoundsystem': False, + 'pack': '16m-rgb-%%', + 'defsndport': True, + 'useiconv': False, + 'multidisp': False, + # gets substituted during application start + 'export': "{local_home}:1;", + 'fullscreen': True, + 'useexports': True, + 'quality': 9, + 'xdmcpserver': 'localhost', + 'xinerama': 0, + 'rdpoptions': '-u X2GO_USER -p X2GO_PASSWORD', + 'print': 1, + 'usesshproxy': 1, + 'sshproxytunnel': 'localhost:53000:localhost:3389', + # gets substituted during application start + 'sshproxykeyfile': '{sshproxykeyfile}', + 'fstunnel': True, + 'applications': 'TERMINAL, WWWBROWSER, MAILCLIENT, OFFICE', + 'host': 'localhost', + 'mimeboxextensions': '', + # gets substituted during application start + 'user': '{user}', + 'key': '', + # gets substituted during application start + 'icon': '{icon}', + 'mimeboxaction': 'OPEN', + 'rdpserver': '', + 'soundtunnel': 1, + 'command': 'startcvix.sh', + 'dpi': 96, + 'published': False, + 'setdpi': False, + 'usemimebox': True, +} diff --git a/CVix/__init__.py b/CVix/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/CVix/icons/16x16/CVix.png b/CVix/icons/16x16/CVix.png new file mode 100644 index 0000000..52491ef Binary files /dev/null and b/CVix/icons/16x16/CVix.png differ diff --git a/CVix/icons/22x22/CVix.png b/CVix/icons/22x22/CVix.png new file mode 100644 index 0000000..01717af Binary files /dev/null and b/CVix/icons/22x22/CVix.png differ diff --git a/CVix/img/CVix.png b/CVix/img/CVix.png new file mode 100644 index 0000000..d27b7d5 Binary files /dev/null and b/CVix/img/CVix.png differ diff --git a/CVix/img/cvix_about.png b/CVix/img/cvix_about.png new file mode 100644 index 0000000..73fb155 Binary files /dev/null and b/CVix/img/cvix_about.png differ diff --git a/CVix/nsis_template_CVix.py b/CVix/nsis_template_CVix.py new file mode 100644 index 0000000..295f0fe --- /dev/null +++ b/CVix/nsis_template_CVix.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +NSIS_SCRIPT_TEMPLATE = """ +;{program_name}.nsi +; + +!define VERSION {program_version} + +;-------------------------------- + +; The name of the installer +Name "{program_name}" + +; Sets the title bar text (although NSIS seems to append "Installer") +Caption "{program_desc}" + +!define py2exeOutputDirectory '{output_dir}' + +; The file to write +OutFile "..\\{program_name}_{schema}_${{VERSION}}_win32-setup.exe" + +; The default installation directory +InstallDir $PROGRAMFILES\\{program_name} + +; Registry key to check for directory (so if you install again, it will +; overwrite the old one automatically) +InstallDirRegKey HKLM "Software\\{program_name}" "Install_Dir" + +; Request application privileges for Windows Vista +RequestExecutionLevel admin + +;-------------------------------- + +; Installer Language Configuration + +!include LogicLib.nsh + +var LC_MESSAGES + +; i18n strings +var REQUIRED +var DESKTOP_LINKS +var STARTMENU_LINKS +var WITHOUT_PULSEAUDIO +var GSPRINT + +; First is default +LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Dutch.nlf" +LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\English.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\French.nlf" +LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\German.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Korean.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Russian.nlf" +LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Spanish.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Swedish.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\TradChinese.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\SimpChinese.nlf" +;LoadLanguageFile "${{NSISDIR}}\\Contrib\\Language files\\Slovak.nlf" + +; License data +; Not exactly translated, but it shows what's needed +LicenseLangString myLicenseData ${{LANG_DUTCH}} "LICENSE.txt" +LicenseLangString myLicenseData ${{LANG_ENGLISH}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_FRENCH}} "LICENSE.txt" +LicenseLangString myLicenseData ${{LANG_GERMAN}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_KOREAN}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_RUSSIAN}} "LICENSE.txt" +LicenseLangString myLicenseData ${{LANG_SPANISH}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_SWEDISH}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_TRADCHINESE}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_SIMPCHINESE}} "LICENSE.txt" +;LicenseLangString myLicenseData ${{LANG_SLOVAK}} "LICENSE.txt" + +LicenseData $(myLicenseData) + +; Set name using the normal interface (Name command) +LangString Name ${{LANG_DUTCH}} "Dutch" +LangString Name ${{LANG_ENGLISH}} "English" +;LangString Name ${{LANG_FRENCH}} "French" +LangString Name ${{LANG_GERMAN}} "German" +;LangString Name ${{LANG_KOREAN}} "Korean" +;LangString Name ${{LANG_RUSSIAN}} "Russian" +LangString Name ${{LANG_SPANISH}} "Spanish" +;LangString Name ${{LANG_SWEDISH}} "Swedish" +;LangString Name ${{LANG_TRADCHINESE}} "Traditional Chinese" +;LangString Name ${{LANG_SIMPCHINESE}} "Simplified Chinese" +;LangString Name ${{LANG_SLOVAK}} "Slovak" + +Function .onInit + + ;Language selection dialog + + Push "" + Push ${{LANG_DUTCH}} + Push Dutch + Push ${{LANG_ENGLISH}} + Push English +; Push ${{LANG_FRENCH}} +; Push French + Push ${{LANG_GERMAN}} + Push German +; Push ${{LANG_KOREAN}} +; Push Korean +; Push ${{LANG_RUSSIAN}} +; Push Russian + Push ${{LANG_SPANISH}} + Push Spanish +; Push ${{LANG_SWEDISH}} +; Push Swedish +; Push ${{LANG_TRADCHINESE}} +; Push "Traditional Chinese" +; Push ${{LANG_SIMPCHINESE}} +; Push "Simplified Chinese" +; Push ${{LANG_SLOVAK}} +; Push Slovak + Push A ; A means auto count languages + ; for the auto count to work the first empty push (Push "") must remain + LangDLL::LangDialog "Installer Language" "Please select the language of the installer" + + Pop $LANGUAGE + + ${{Switch}} $LANGUAGE + ${{Case}} 1031 + StrCpy $LC_MESSAGES "de" + !include "nsis_include\\de.nsi" + ${{Break}} + ${{Case}} 1033 + StrCpy $LC_MESSAGES "en" + !include "nsis_include\\en.nsi" + ${{Break}} + ${{Case}} 1043 + StrCpy $LC_MESSAGES "nl" + !include "nsis_include\\nl.nsi" + ${{Break}} + ${{Case}} 1034 + StrCpy $LC_MESSAGES "es" + !include "nsis_include\\es.nsi" + ${{Break}} + ${{EndSwitch}} + + StrCmp $LANGUAGE "cancel" 0 +2 + Abort + +FunctionEnd + +;-------------------------------- + +; Pages +Page license +Page components +Page directory +Page instfiles + +UninstPage uninstConfirm +UninstPage instfiles + +;-------------------------------- + +; The stuff to install +Section "{program_name} ($REQUIRED)" + + SectionIn RO + ; Set output path to the installation directory. + SetOutPath "$INSTDIR" + File /r /x .svn /x .git "${{py2exeOutputDirectory}}\\*.*" + + ; Write the installation path into the registry + WriteRegStr HKLM SOFTWARE\\{program_name} "Install_Dir" "$INSTDIR" + WriteRegStr HKLM SOFTWARE\\{program_name} "Path" "$INSTDIR" + + + ; Write the uninstall keys for Windows + WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{program_name}" "DisplayName" "{program_name}" + WriteRegStr HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{program_name}" "UninstallString" '"$INSTDIR\\uninstall.exe"' + WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{program_name}" "NoModify" 1 + WriteRegDWORD HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{program_name}" "NoRepair" 1 + WriteUninstaller "uninstall.exe" + +SectionEnd + +; Optional section (can be disabled by the user) +Section "$STARTMENU_LINKS" + + CreateDirectory "$SMPROGRAMS\\{program_name}" + CreateShortCut "$SMPROGRAMS\\{program_name}\\{program_name}.lnk" "$INSTDIR\\{program_name}.exe" "" "$INSTDIR\\icons\\{program_name}.ico" 0 + CreateShortCut "$SMPROGRAMS\\{program_name}\\Uninstall.lnk" "$INSTDIR\\uninstall.exe" "" "$INSTDIR\\uninstall.exe" 0 + +SectionEnd + +; Optional section (can be disabled by the user) +Section "$DESKTOP_LINKS" + + CreateShortCut "$DESKTOP\\{program_name}.lnk" "$INSTDIR\\{program_name}.exe" "" "$INSTDIR\\icons\\{program_name}.ico" 0 + +SectionEnd + +;-------------------------------- + +; Uninstaller + +Section "Uninstall" + + ; Remove registry keys + DeleteRegKey HKLM "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{program_name}" + DeleteRegKey HKLM SOFTWARE\\{program_name} + + ; Remove files and uninstaller + Delete $INSTDIR\\uninstall.exe + + ; Remove shortcuts, if any + Delete "$SMPROGRAMS\\{program_name}\\*.*" + Delete "$DESKTOP\\{program_name}.lnk" + + ; Remove directories used + RMDir "$SMPROGRAMS\\{program_name}" + RMDir /r /REBOOTOK $INSTDIR + +SectionEnd +""" diff --git a/CVix/pixmaps/CVix.ico b/CVix/pixmaps/CVix.ico new file mode 100644 index 0000000..e410de6 Binary files /dev/null and b/CVix/pixmaps/CVix.ico differ diff --git a/setup_CVix.py b/setup_CVix.py new file mode 100755 index 0000000..bec0154 --- /dev/null +++ b/setup_CVix.py @@ -0,0 +1,389 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright (C) 2010-2012 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de> +# +# PyHoca 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. +# +# PyHoca 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., +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# import the PyHoca-GUI +import sys +import os +import shutil + +### Create Global variables + +mySCHEMA = None +#SCHEMATA = None +CUSTOMER_HOST = None +CUSTOMER_USER = None +CUSTOMER_KEY = None +PROGRAM_DESC = None +PROGRAM_VERSION = '1.2' +PROGRAM_ICON = None +PROGRAM_NAME = 'CVix' +LICENSE = 'AGPLv3+' +AUTHOR = 'Mike Gabriel, Dick Kniep' +URL = 'http://www.lindix.org' +LIBRARY_ZIP = r"lib\shardlib.zip" +PROGRAM_ICON_MAP2 = '' +icon_files = [] +customer_files = [] + +### customize the SCHEMA before running the setup + +def datafilelist(installbase, sourcebase): + datafileList = [] + for root, subFolders, files in os.walk(sourcebase): + fileList = [] + for f in files: + fileList.append(os.path.join(root, f)) + datafileList.append((root.replace(sourcebase, installbase), fileList)) + return datafileList + +def _fillGlobals(schema=None): + global mySCHEMA + global SCHEMATA + global CUSTOMER_HOST + global CUSTOMER_USER + global CUSTOMER_KEY + global PROGRAM_DESC + global PROGRAM_ICON + global PROGRAM_ICON_MAP2 + global icon_files + global customer_files + if len(sys.argv) > 2 and schema is None: + mySCHEMA = sys.argv[2] + del sys.argv[2] + elif schema: + mySCHEMA = schema + else: + mySCHEMA = 'autitude' # not relevant...... + + SCHEMATA = { + 'autitude':'autitude.cvix.nl', + 'cvixcoaches':'cvixcoaches.cvix.nl', + 'comsupport':'communitysupport.cvix.nl', + 'nlwerkt':'nederland-werkt.cvix.nl', + 'amarant':'amarant.cvix.nl', + 'ambulantehulpverlening':'ambulantehulpverlening.cvix.nl', + 'deplannenmakers':'deplannenmakers.cvix.nl', + 'emobrain':'emotionalbrain.cvix.nl', + 'held':'held.cvix.nl', + 'leff':'leff.cvix.nl', + 'menea':'menea.cvix.nl', + 'meneanew':'meneanew.cvix.nl', + 'eega':'eega.cvix.nl', + 'reinaerde':'reinaerde.cvix.nl', + 'ruimbaan':'ruimbaan.cvix.nl', + 'streamcvix':'streamtrajecten.cvix.nl', + 'traject':'trajectbv.cvix.nl', + 'zorgconcept':'zorgconcept.cvix.nl', + 'zzpflevoland':'zzpflevoland.cvix.nl', + 'asscoaching':'asscoaching.cvix.nl', + 'demo':'demo.cvix.nl', + } + + PROGRAM_NAME = 'CVix' + if mySCHEMA in SCHEMATA: + CUSTOMER_HOST = SCHEMATA[mySCHEMA] + else: + CUSTOMER_HOST = mySCHEMA + '.cvix.nl' + CUSTOMER_USER = CUSTOMER_HOST.split('.')[0] + CUSTOMER_KEY = '%s.key' % CUSTOMER_HOST.split('.')[0] + f = open(os.path.join(os.getcwd(), PROGRAM_NAME, 'customer'), 'w+') + f.write(CUSTOMER_HOST) + f.close() + + PROGRAM_DESC = '%s is een terminal server programma aangepast aan het gebruik van CVix door %s' % (PROGRAM_NAME, CUSTOMER_USER) + PROGRAM_ICON = "%s/pixmaps/%s.ico" % (PROGRAM_NAME, PROGRAM_NAME) + PROGRAM_ICON_MAP2 = "%s\\pixmaps\\%s.ico" % (PROGRAM_NAME, PROGRAM_NAME) + icon_files = datafilelist('icons\\PyHoca', r'icons\\PyHoca') + datafilelist('icons\\PyHoca', r'%s\\icons' % PROGRAM_NAME) + customer_files = [(PROGRAM_NAME, [r'%s\\keys\\' % PROGRAM_NAME + CUSTOMER_KEY, r'%s\\customer' % PROGRAM_NAME])] + + +#from setuptools import setup, find_packages +from distutils.core import setup, Command +import platform + +_fillGlobals() +NSIS_COMPILE = os.path.join(os.environ['ProgramFiles'], 'NSIS', 'makensis.exe') +# from py2exe.build_exe import py2exe +from bbfreeze import Freezer +py2exe = object +import os, os.path +import subprocess +sys.path.append(os.path.normpath('../pyhoca-contrib/mswin/ms-vc-runtime')) + +from glob import glob + +exec("from %s.nsis_template_%s import NSIS_SCRIPT_TEMPLATE" % (PROGRAM_NAME, PROGRAM_NAME)) + +# +# to build .exe file, run on Windows: +# ,,python setup.py py2exe'' +# +# to update i18n .mo files (and merge .pot file into .po files) run on Linux: +# ,,python setup.py build_i18n -m'' + +cmd_class = {} +data_files = [] + +class NSISScript(object): + + def __init__(self, program_name, program_desc, program_version, dist_dir, icon_loc): + self.program_name = program_name + self.program_desc = program_desc + self.program_version = program_version + self.dist_dir = dist_dir + self.icon_loc = icon_loc + self.pathname = "setup_%s.nsi" % self.program_name + + def create(self): + contents = NSIS_SCRIPT_TEMPLATE.format( + program_name = self.program_name, + program_version = self.program_version, + program_desc = self.program_desc, + output_dir = self.dist_dir, + icon_location = os.path.join(self.dist_dir, self.icon_loc), + schema = mySCHEMA) + + with open(self.pathname, "w") as outfile: + outfile.write(contents) + + def compile(self): + subproc = subprocess.Popen( + # "/P5" uses realtime priority for the LZMA compression stage. + # This can get annoying though. + [NSIS_COMPILE, self.pathname, "/P5"], env=os.environ) + subproc.communicate() + + retcode = subproc.returncode + + if retcode: + raise RuntimeError("NSIS compilation return code: %d" % retcode) + +class build_all(Command): + user_options = [('all','A','yes')] + def initialize_options(self): + pass + def finalize_options(self): + pass + def run(self): + + logFile = file('build_all.log','ab') + + for schema, machine in SCHEMATA.items(): + print "\n\n\n* * * * * * * * * Build environment %s\n\n" % schema + _fillGlobals(schema) + sys.argv[1] = 'build_installer_bbfreeze' + startSetup() + + +class build_installer(object): + + # This class first invokes building the the exe file(s) and then creates an NSIS + # installer + def __init__(self, dist_dir): + self.dist_dir = dist_dir + + def do_build_exe(self): + # replace this method with the freezer's build_exe logic + pass + + def run(self): + + # clean up dist_dir + shutil.rmtree(self.dist_dir, ignore_errors=True) + # and recreate a clean one afterwards + os.makedirs(self.dist_dir) + + # First, build the exe file + self.do_build_exe() + + # Create the installer, using the files py2exe has created. + script = NSISScript( + PROGRAM_NAME, + PROGRAM_DESC, + PROGRAM_VERSION, + self.dist_dir, + os.path.normpath(PROGRAM_ICON) + ) + print "*** creating the NSIS setup script***" + script.create() + print "*** compiling the NSIS setup script***" + script.compile() + +class build_installer_bbfreeze(build_installer, Freezer, Command): + + user_options = [ + ('dist-dir=', 'd', + "directory to put final built distributions in (default is dist)"), + + ("excludes=", 'e', + "comma-separated list of modules to exclude"), + ("includes=", 'i', + "comma-separated list of modules to include"), + ] + + def __init__(self, *args, **kwargs): + Command.__init__(self, *args) + build_installer.__init__(self, dist_dir=self.dist_dir) + + def initialize_options(self): + self.includes = [] + self.excludes = [] + self.packages = [] + self.compressed = False + self.dist_dir = None + + def finalize_options(self): + self.includes = fancy_split(self.includes) + self.excludes = fancy_split(self.excludes) + self.compressed = False + if self.dist_dir is None: + self.dist_dir = 'dist' + self.dist_dir = os.path.abspath(os.path.join(os.getcwd(), self.dist_dir)) + if not os.path.exists(self.dist_dir): + os.makedirs(self.dist_dir) + + def do_build_exe(self): + Freezer.__init__(self, self.dist_dir, + includes=self.includes, + excludes=self.excludes, + ) + self.addScript("CVix.py", gui_only=True) + Freezer.__call__(self) + if self.distribution.has_data_files(): + print "*** copy data files ***" + install_data = self.reinitialize_command('install_data') + install_data.install_dir = self.dist_dir + install_data.ensure_finalized() + install_data.run() + +def fancy_split(strVal, sep=","): + # a split which also strips whitespace from the items + # passing a list or tuple will return it unchanged + if strVal is None: + return [] + if hasattr(strVal, "split"): + return [item.strip() for item in strVal.split(sep)] + return strVal + + + +executables = [] +if platform.system() == 'Windows': + + dll_data_files = [("Microsoft.VC90.CRT", glob(r'..\\pyhoca-contrib\\mswin\\ms-vc-runtime\\*.*'))] + nxproxy_files = [("nxproxy", glob(r'..\\pyhoca-contrib\\mswin\\nxproxy-mswin\\nxproxy-3.5.0.12\\*.*'))] + pulseaudio_files = [("pulseaudio", glob(r'..\\pyhoca-contrib\\mswin\\pulseaudio-mswin\\pulseaudio-1.1\\*.*'))] + xserver_files = datafilelist('vcxsrv', r'..\\pyhoca-contrib\\mswin\\vcxsrv-mswin\\vcxsrv-1.14.2.0') + + icon_files = datafilelist('icons\\PyHoca', r'icons\\PyHoca') + img_files = [("img", glob(r'img\\*.*'))] + i18n_files = datafilelist('mo', r'build\\mo') + + data_files.extend([ ('icons', ["pixmaps\\pyhoca-gui.ico"]), ] + + dll_data_files + + icon_files + + img_files + + nxproxy_files + + pulseaudio_files + + xserver_files + + i18n_files + ) + + cmd_class.update( + { + "build_with_bbfreeze": build_installer_bbfreeze, + } + ) + cmd_class.update({ 'build_exe': cmd_class['build_with_{freezer}'.format(freezer='bbfreeze')] }) + +elif platform.system() == 'Linux': + cmd_class.update( + { + "build" : build_extra.build_extra, + "build_i18n" : build_i18n.build_i18n, + "clean": clean_i18n.clean_i18n, + } + ) + + icon_files = datafilelist('{prefix}/share/icons/PyHoca'.format(prefix=sys.prefix), r'icons/PyHoca') + img_files = [("{prefix}/share/pyhoca/img".format(prefix=sys.prefix), glob('img/*.*'))] + desktop_files = [ + ('{prefix}/share/applications'.format(prefix=sys.prefix), glob('desktop/*')), + ('{prefix}/share/pixmaps'.format(prefix=sys.prefix), glob('pixmaps/*.svg')), + ] + manpage_files = [ + ('{prefix}/share/man/man1'.format(prefix=sys.prefix), glob('man/man1/*.1')), + ] + data_files.extend(icon_files + + img_files + + desktop_files + + manpage_files + ) + +if platform.system() == 'Windows': + cmd_options={ + 'py2exe': { + 'includes': ['greenlet', 'gevent.core', 'gevent.ares', 'gevent._semaphore', 'gevent._util', ], + 'compressed': 1, + 'optimize': 2, + }, + 'build_with_py2exe': { + 'includes': ['greenlet', 'gevent.core', 'gevent.ares', 'gevent._semaphore', 'gevent._util', ], + 'compressed': 1, + 'optimize': 2, + }, + 'build_with_bbfreeze': { + 'includes': ['greenlet', 'gevent.core', 'gevent.ares', 'gevent._semaphore', 'gevent._util', 'gevent.resolver_thread', 'gevent.resolver_ares', 'gevent.server', 'gevent.socket', 'gevent.threadpool', 'gevent.select', 'gevent.subprocess', 'distutils.version', 'Crypto', 'Crypto.Random', 'Crypto.Hash', 'Crypto.PublicKey', 'Crypto.PublicKey.DSA', 'Crypto.PublicKey.RSA', 'Crypto.Cipher', 'Crypto.Cipher.AES', 'Crypto.Cipher.ARC4', 'Crypto.Cipher.Blowfish', 'Crypto.Cipher.DES3', 'Crypt [...] + 'excludes': ['MSVCR90.dll', 'MSVCP90.dll', ], + } + } + cmd_options.update({ 'build_exe': cmd_options['build_with_{freezer}'.format(freezer='bbfreeze')] }) + +else: + cmd_options={} + +def startSetup(): + setup( + name = PROGRAM_NAME, + version = PROGRAM_VERSION, + description = PROGRAM_DESC, + license = LICENSE, + author = AUTHOR, + url = URL, + namespace_packages = [ 'pyhoca', ], + packages = [ 'pyhoca.wxgui', ], + package_dir = {'': '.'}, + install_requires = [ 'setuptools', ], + cmdclass = cmd_class, + windows = [ + { + "script": "pyhoca-gui", + "icon_resources": [(0, os.path.normpath(PROGRAM_ICON))], + "dest_base": PROGRAM_NAME, + }, + ], + data_files=data_files, + zipfile = LIBRARY_ZIP, + executables = executables, + options=cmd_options, + ) + + +startSetup() -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/pyhoca-gui.git