Bonjour,
Je viens de tomber sur ce topic, j'ai justement fait un paquet pour le ZCO très récemment, en me basant sur celui du store TIS.
Mon paquet est multi-architecture et intègre les deux versions, 32bits et 64bits.
La raison est simple, sur un poste 64bits avec un Outlook 32bits d'installé, le paquet en 64bits sera en erreur car le ZCO ne voudra pas s'installer.
Mon paquet détecte la présence d'un Outlook 32bits et installe le ZCO qui correspond (il y a très certainement plus propre à faire au niveau de la détection du Office).
De plus, je définis quelques paramètres du ZCO via le registre (les mêmes paramètres que l'on peut utiliser pour personnaliser le MSI, mais je n'avais pas envie de devoir le refaire à chaque fois
) : la désactivation des mises à jour, l'adresse et le port du serveur, l'utilisation de SSL, la désactivation des alias dans la GAL et la désactivation de la synchronisation des signatures.
A adapter en fonction des besoins (il y a d'autres paramètres personnalisables dans cette clé de registre).
Pour palier le fait que l'uninstallkey change en fonction de la langue, j'utilise une fonction uninstall() qui récupère l'uninstallkey du ZCO installé pour le désinstaller. Je n'utilise pas la fonction install_msi_if_needed() du coup.
Pour finir, la seule contrainte est que la version du paquet correspond à la version du ZCO 64bits. S'ils sortent des numéros de versions différents sur les deux architectures, alors ça pourrait poser problème (mais il y a peu de chance que ça arrive je pense).
Voici le code du setup.py :
Code : Tout sélectionner
# -*- coding: utf-8 -*-
from setuphelpers import *
from setupdevhelpers import *
def install():
# Check architecture and if Office is 32bits on 64bits system
if is32() or isdir(makepath(programfiles32, r'Microsoft Office', r'root')):
print(r'INFO: x86 installation detected')
bin_name = 'ZimbraConnectorOLK_x86.msi'
else:
bin_name = 'ZimbraConnectorOLK_x64.msi'
installed_zco = installed_softwares('Zimbra Connector for Microsoft Outlook')
if not installed_zco or installed_zco[0]['version'] < Version(control.get_software_version(), 4) or WAPT.options.force :
try:
# Installing the software
run(r'msiexec /qn /norestart /i %s' % bin_name, timeout=600)
except Exception as e:
if e.returncode == 1603:
print(f'INFO: Microsoft Outlook needs to be installed.')
error(e)
else:
error(e)
else:
print('%s version %s is already installed, skipping...' % (control.name, installed_zco[0]['version']))
# Customize installation
with reg_openkey_noredir(HKEY_LOCAL_MACHINE, r'SOFTWARE\Zimbra', sam=KEY_WRITE, create_if_missing=True) as key:
reg_setvalue(key, 'SkipVersionUpgrade', '65535', REG_SZ) # disable auto-update
reg_setvalue(key, 'ZimbraServerName', 'smtp.mydomain.tld', REG_SZ) # Zimbra server name
reg_setvalue(key, 'ZimbraServerPort', 443, REG_DWORD) # Zimbra server port
reg_setvalue(key, 'ZimbraConnectionMethod', 1, REG_DWORD) # use SSL
reg_setvalue(key, 'GalSyncDisableAliases', 1, REG_DWORD) # disable alias in GAL
reg_setvalue(key, 'SigSyncEnabled', 0, REG_DWORD) # disable signature sync
def uninstall():
if installed_softwares('Zimbra Connector for Microsoft Outlook'):
key = installed_softwares('Zimbra Connector for Microsoft Outlook')[0]['key']
run('msiexec /qn /norestart /X %s' % key)
def update_package():
# Declaring local variables
package_updated = False
proxies = get_proxies()
if not proxies:
proxies = get_proxies_from_wapt_console()
url = 'https://www.zimbra.com/product/addons/zimbra-connector-for-outlook-download/'
# Getting latest version from official sources
print('URL used is: %s' % url)
for arch in 'x86', 'x64':
print('Processing %s version...' % arch)
for bs_search in bs_find_all(url, 'a', 'rel', 'noopener', proxies=proxies):
if '_%s.msi' % arch in bs_search.get('href', ''):
download_url = bs_search['href']
latest_bin = download_url.split('/')[-1]
version = latest_bin.split('_')[1]
break
print('Latest %s %s version is: %s' % (control.name, arch, version))
print('Download URL for %s is: %s' % (arch, download_url))
# Downloading latest binaries
print('Downloading: %s' % latest_bin)
latest_bin = '%s_%s' % (latest_bin.split('_')[0], latest_bin.split('_')[2])
wget(download_url, latest_bin, proxies=proxies)
# Checking version from file
version_from_file = get_version_from_binary(latest_bin)
if Version(version_from_file, 4) == Version(version, 4):
print(f'INFO: Binary file version ({version_from_file}) corresponds to online version ({version})')
else:
error(f'ERROR: Binary file version ({version_from_file}) do NOT corresponds to online version ({version})')
# Changing version of the package
if Version(version, 4) > Version(control.get_software_version(), 4):
print('Software version updated (from: %s to: %s)' % (control.get_software_version(), Version(version)))
control.set_software_version(version)
control.save_control_to_wapt()
package_updated = True
else:
print('Software version up-to-date (%s)' % Version(version))
# Validating or not update-package-sources
return package_updated