From df3c29f0d90c1c6afa11de4b948ec038745fe1e0 Mon Sep 17 00:00:00 2001 From: Mario Fetka Date: Mon, 9 Sep 2013 05:06:01 +0200 Subject: [PATCH] remove opsi and change to 7z create --- bin/{opsi-builder.sh => aio-builder.sh} | 0 conf/{opsi-builder.cfg => aio-builder.cfg} | 75 +-- lib/builder-targets.sh | 214 +++--- lib/builder-utils.sh | 240 ++----- libexec/ShowVer.exe | Bin 0 -> 86077 bytes libexec/ShowVer/ShowVer.cpp | 531 +++++++++++++++ libexec/ShowVer/ShowVer.dsp | 112 ++++ libexec/ShowVer/ShowVer.rc | 110 +++ libexec/UnRAR.exe | Bin 0 -> 297984 bytes libexec/UnRAR/license.txt | 34 + libexec/gitlog-to-deblog.rb | 92 --- libexec/inifile.exe | Bin 0 -> 8704 bytes libexec/inifile/GetOutput.txt | 42 ++ libexec/inifile/inifile.txt | 121 ++++ libexec/innounp.exe | Bin 0 -> 539648 bytes libexec/innounp/innounp.htm | 626 ++++++++++++++++++ .../license/CLIENT_DATA/delsub32.ins | 115 ---- .../installer/license/CLIENT_DATA/login.ins | 24 - .../installer/license/CLIENT_DATA/opsi-PN.ini | 5 - .../installer/license/CLIENT_DATA/setup32.ins | 231 ------- .../license/CLIENT_DATA/uninstall32.ins | 73 -- .../installer/license/OPSI/changelog.txt | 2 - sample/32bit/installer/license/OPSI/control | 30 - sample/32bit/installer/license/OPSI/postinst | 9 - sample/32bit/installer/license/OPSI/preinst | 9 - .../installer/license/builder-product.cfg | 150 ----- .../nolicense/CLIENT_DATA/delsub32.ins | 115 ---- .../installer/nolicense/CLIENT_DATA/login.ins | 24 - .../nolicense/CLIENT_DATA/opsi-PN.ini | 5 - .../nolicense/CLIENT_DATA/setup32.ins | 183 ----- .../nolicense/CLIENT_DATA/uninstall32.ins | 50 -- .../installer/nolicense/OPSI/changelog.txt | 2 - sample/32bit/installer/nolicense/OPSI/control | 30 - .../32bit/installer/nolicense/OPSI/postinst | 9 - sample/32bit/installer/nolicense/OPSI/preinst | 9 - sample/32bit/installer/nolicense/Testing.txt | 28 - .../installer/nolicense/builder-product.cfg | 150 ----- .../installer/nolicense/builder-targets-cb.sh | 25 - .../msi/license/CLIENT_DATA/delsub32.ins | 95 --- .../32bit/msi/license/CLIENT_DATA/login.ins | 24 - .../32bit/msi/license/CLIENT_DATA/opsi-PN.ini | 11 - .../32bit/msi/license/CLIENT_DATA/setup32.ins | 230 ------- .../msi/license/CLIENT_DATA/uninstall32.ins | 72 -- sample/32bit/msi/license/OPSI/changelog.txt | 2 - sample/32bit/msi/license/OPSI/control | 30 - sample/32bit/msi/license/OPSI/postinst | 9 - sample/32bit/msi/license/OPSI/preinst | 9 - sample/32bit/msi/license/Testing.txt | 28 - sample/32bit/msi/license/builder-product.cfg | 150 ----- .../32bit/msi/license/builder-targets-cb.sh | 25 - .../msi/nolicense/CLIENT_DATA/delsub32.ins | 95 --- .../32bit/msi/nolicense/CLIENT_DATA/login.ins | 24 - .../msi/nolicense/CLIENT_DATA/opsi-PN.ini | 11 - .../msi/nolicense/CLIENT_DATA/setup32.ins | 182 ----- .../msi/nolicense/CLIENT_DATA/uninstall32.ins | 49 -- sample/32bit/msi/nolicense/OPSI/changelog.txt | 2 - sample/32bit/msi/nolicense/OPSI/control | 30 - sample/32bit/msi/nolicense/OPSI/postinst | 9 - sample/32bit/msi/nolicense/OPSI/preinst | 9 - sample/32bit/msi/nolicense/Testing.txt | 28 - .../32bit/msi/nolicense/builder-product.cfg | 150 ----- .../32bit/msi/nolicense/builder-targets-cb.sh | 25 - .../license/CLIENT_DATA/delsub3264.ins | 179 ----- .../installer/license/CLIENT_DATA/login.ins | 24 - .../installer/license/CLIENT_DATA/opsi-PN.ini | 11 - .../license/CLIENT_DATA/setup3264.ins | 284 -------- .../license/CLIENT_DATA/uninstall3264.ins | 84 --- .../installer/license/OPSI/changelog.txt | 2 - sample/32bit64/installer/license/OPSI/control | 39 -- .../32bit64/installer/license/OPSI/postinst | 9 - sample/32bit64/installer/license/OPSI/preinst | 9 - sample/32bit64/installer/license/Testing.txt | 28 - .../installer/license/builder-product.cfg | 150 ----- .../installer/license/builder-targets-cb.sh | 25 - .../nolicense/CLIENT_DATA/delsub3264.ins | 173 ----- .../installer/nolicense/CLIENT_DATA/login.ins | 24 - .../nolicense/CLIENT_DATA/opsi-PN.ini | 11 - .../nolicense/CLIENT_DATA/setup3264.ins | 242 ------- .../nolicense/CLIENT_DATA/uninstall3264.ins | 62 -- .../installer/nolicense/OPSI/changelog.txt | 2 - .../32bit64/installer/nolicense/OPSI/control | 39 -- .../32bit64/installer/nolicense/OPSI/postinst | 9 - .../32bit64/installer/nolicense/OPSI/preinst | 9 - .../32bit64/installer/nolicense/Testing.txt | 28 - .../installer/nolicense/builder-product.cfg | 150 ----- .../installer/nolicense/builder-targets-cb.sh | 25 - .../msi/license/CLIENT_DATA/delsub3264.ins | 137 ---- .../32bit64/msi/license/CLIENT_DATA/login.ins | 24 - .../msi/license/CLIENT_DATA/opsi-PN.ini | 11 - .../msi/license/CLIENT_DATA/setup3264.ins | 282 -------- .../msi/license/CLIENT_DATA/uninstall3264.ins | 82 --- sample/32bit64/msi/license/OPSI/changelog.txt | 2 - sample/32bit64/msi/license/OPSI/control | 39 -- sample/32bit64/msi/license/OPSI/postinst | 9 - sample/32bit64/msi/license/OPSI/preinst | 9 - sample/32bit64/msi/license/Testing.txt | 28 - .../32bit64/msi/license/builder-product.cfg | 150 ----- .../32bit64/msi/license/builder-targets-cb.sh | 25 - .../msi/nolicense/CLIENT_DATA/delsub3264.ins | 137 ---- .../msi/nolicense/CLIENT_DATA/login.ins | 24 - .../msi/nolicense/CLIENT_DATA/opsi-PN.ini | 11 - .../msi/nolicense/CLIENT_DATA/setup3264.ins | 240 ------- .../nolicense/CLIENT_DATA/uninstall3264.ins | 58 -- .../32bit64/msi/nolicense/OPSI/changelog.txt | 2 - sample/32bit64/msi/nolicense/OPSI/control | 39 -- sample/32bit64/msi/nolicense/OPSI/postinst | 9 - sample/32bit64/msi/nolicense/OPSI/preinst | 9 - sample/32bit64/msi/nolicense/Testing.txt | 28 - .../32bit64/msi/nolicense/builder-product.cfg | 150 ----- .../msi/nolicense/builder-targets-cb.sh | 25 - .../license/CLIENT_DATA/delsub64.ins | 114 ---- .../installer/license/CLIENT_DATA/login.ins | 24 - .../installer/license/CLIENT_DATA/opsi-PN.ini | 11 - .../installer/license/CLIENT_DATA/setup64.ins | 231 ------- .../license/CLIENT_DATA/uninstall64.ins | 74 --- .../installer/license/OPSI/changelog.txt | 2 - sample/64bit/installer/license/OPSI/control | 30 - sample/64bit/installer/license/OPSI/postinst | 9 - sample/64bit/installer/license/OPSI/preinst | 9 - sample/64bit/installer/license/Testing.txt | 28 - .../installer/license/builder-product.cfg | 150 ----- .../installer/license/builder-targets-cb.sh | 25 - .../nolicense/CLIENT_DATA/delsub64.ins | 114 ---- .../installer/nolicense/CLIENT_DATA/login.ins | 24 - .../nolicense/CLIENT_DATA/opsi-PN.ini | 11 - .../nolicense/CLIENT_DATA/setup64.ins | 183 ----- .../nolicense/CLIENT_DATA/uninstall64.ins | 50 -- .../installer/nolicense/OPSI/changelog.txt | 2 - sample/64bit/installer/nolicense/OPSI/control | 30 - .../64bit/installer/nolicense/OPSI/postinst | 9 - sample/64bit/installer/nolicense/OPSI/preinst | 9 - sample/64bit/installer/nolicense/Testing.txt | 28 - .../installer/nolicense/builder-product.cfg | 150 ----- .../installer/nolicense/builder-targets-cb.sh | 25 - .../msi/license/CLIENT_DATA/delsub64.ins | 95 --- .../64bit/msi/license/CLIENT_DATA/login.ins | 24 - .../64bit/msi/license/CLIENT_DATA/opsi-PN.ini | 11 - .../64bit/msi/license/CLIENT_DATA/setup64.ins | 230 ------- .../msi/license/CLIENT_DATA/uninstall64.ins | 73 -- sample/64bit/msi/license/OPSI/changelog.txt | 2 - sample/64bit/msi/license/OPSI/control | 30 - sample/64bit/msi/license/OPSI/postinst | 9 - sample/64bit/msi/license/OPSI/preinst | 9 - sample/64bit/msi/license/Testing.txt | 28 - sample/64bit/msi/license/builder-product.cfg | 150 ----- .../64bit/msi/license/builder-targets-cb.sh | 25 - .../msi/nolicense/CLIENT_DATA/delsub64.ins | 95 --- .../64bit/msi/nolicense/CLIENT_DATA/login.ins | 24 - .../msi/nolicense/CLIENT_DATA/opsi-PN.ini | 11 - .../msi/nolicense/CLIENT_DATA/setup64.ins | 182 ----- .../msi/nolicense/CLIENT_DATA/uninstall64.ins | 51 -- sample/64bit/msi/nolicense/OPSI/changelog.txt | 2 - sample/64bit/msi/nolicense/OPSI/control | 30 - sample/64bit/msi/nolicense/OPSI/postinst | 9 - sample/64bit/msi/nolicense/OPSI/preinst | 9 - sample/64bit/msi/nolicense/Testing.txt | 28 - .../64bit/msi/nolicense/builder-product.cfg | 150 ----- .../64bit/msi/nolicense/builder-targets-cb.sh | 25 - sample/All/CLIENT_DATA/delsub32.ins | 135 ---- sample/All/CLIENT_DATA/delsub3264.ins | 216 ------ sample/All/CLIENT_DATA/delsub64.ins | 134 ---- sample/All/CLIENT_DATA/login.ins | 24 - sample/All/CLIENT_DATA/opsi-PN.ini | 11 - sample/All/CLIENT_DATA/setup32.ins | 232 ------- sample/All/CLIENT_DATA/setup3264.ins | 286 -------- sample/All/CLIENT_DATA/setup64.ins | 232 ------- sample/All/CLIENT_DATA/uninstall32.ins | 74 --- sample/All/CLIENT_DATA/uninstall3264.ins | 86 --- sample/All/CLIENT_DATA/uninstall64.ins | 75 --- sample/All/OPSI/changelog.txt | 2 - sample/All/OPSI/control | 39 -- sample/All/OPSI/postinst | 9 - sample/All/OPSI/preinst | 9 - sample/All/Testing.txt | 28 - sample/All/builder-product.cfg | 150 ----- sample/All/builder-targets-cb.sh | 25 - .../{32bit/installer/license => }/Testing.txt | 0 sample/builder-product.cfg | 152 ++++- .../license => }/builder-targets-cb.sh | 0 sample/control | 23 - sample/old/CLIENT_DATA/delsub32.ins | 106 --- sample/old/CLIENT_DATA/delsub3264.ins | 163 ----- sample/old/CLIENT_DATA/delsub64.ins | 106 --- sample/old/CLIENT_DATA/opsi-PN.ini | 11 - sample/old/CLIENT_DATA/setup32.ins | 236 ------- sample/old/CLIENT_DATA/setup3264.ins | 278 -------- sample/old/CLIENT_DATA/setup64.ins | 234 ------- sample/old/CLIENT_DATA/uninstall32.ins | 71 -- sample/old/CLIENT_DATA/uninstall3264.ins | 84 --- sample/old/CLIENT_DATA/uninstall64.ins | 72 -- sample/old/OPSI/changelog.txt | 2 - sample/old/OPSI/control | 37 -- sample/old/OPSI/postinst | 9 - sample/old/OPSI/preinst | 9 - sample/old/Testing.txt | 28 - sample/old/builder-product.cfg | 153 ----- sample/old/builder-targets-cb.sh | 25 - .../CLIENT_DATA/localsetup/Thumbs.db | Bin 5120 -> 0 bytes .../CLIENT_DATA/localsetup/delsub.ins | 94 --- .../CLIENT_DATA/localsetup/opsi-template.png | Bin 77186 -> 0 bytes .../CLIENT_DATA/localsetup/setup32.ins | 207 ------ .../CLIENT_DATA/localsetup/uninstall.ins | 74 --- .../CLIENT_DATA/opsi-template-with-admin.png | Bin 77186 -> 0 bytes .../CLIENT_DATA/opsi.bmp | Bin 76854 -> 0 bytes .../CLIENT_DATA/setup.ins | 299 --------- .../opsi-template-with-admin/OPSI/control | 122 ---- .../opsi-template-with-admin/OPSI/postinst | 26 - .../opsi-template-with-admin/OPSI/preinst | 28 - .../opsi-template/CLIENT_DATA/delsub32.ins | 97 --- .../opsi-template/CLIENT_DATA/delsub3264.ins | 143 ---- .../opsi-template/CLIENT_DATA/delsub64.ins | 97 --- .../CLIENT_DATA/delsub_short32.opsiscript | 67 -- .../4.0.2/opsi-template/CLIENT_DATA/login.ins | 24 - .../CLIENT_DATA/opsi-template.png | Bin 16993 -> 0 bytes .../opsi-template/CLIENT_DATA/setup32.ins | 212 ------ .../opsi-template/CLIENT_DATA/setup3264.ins | 262 -------- .../opsi-template/CLIENT_DATA/setup64.ins | 212 ------ .../CLIENT_DATA/setup_short32.opsiscript | 147 ---- .../opsi-template/CLIENT_DATA/uninstall32.ins | 58 -- .../CLIENT_DATA/uninstall3264.ins | 69 -- .../opsi-template/CLIENT_DATA/uninstall64.ins | 59 -- .../CLIENT_DATA/uninstall_short32.opsiscript | 58 -- .../source/4.0.2/opsi-template/OPSI/control | 196 ------ .../source/4.0.2/opsi-template/OPSI/postinst | 9 - .../source/4.0.2/opsi-template/OPSI/preinst | 9 - 225 files changed, 1886 insertions(+), 14815 deletions(-) rename bin/{opsi-builder.sh => aio-builder.sh} (100%) rename conf/{opsi-builder.cfg => aio-builder.cfg} (58%) create mode 100644 libexec/ShowVer.exe create mode 100644 libexec/ShowVer/ShowVer.cpp create mode 100644 libexec/ShowVer/ShowVer.dsp create mode 100644 libexec/ShowVer/ShowVer.rc create mode 100644 libexec/UnRAR.exe create mode 100644 libexec/UnRAR/license.txt delete mode 100755 libexec/gitlog-to-deblog.rb create mode 100644 libexec/inifile.exe create mode 100644 libexec/inifile/GetOutput.txt create mode 100644 libexec/inifile/inifile.txt create mode 100644 libexec/innounp.exe create mode 100644 libexec/innounp/innounp.htm delete mode 100644 sample/32bit/installer/license/CLIENT_DATA/delsub32.ins delete mode 100644 sample/32bit/installer/license/CLIENT_DATA/login.ins delete mode 100644 sample/32bit/installer/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit/installer/license/CLIENT_DATA/setup32.ins delete mode 100644 sample/32bit/installer/license/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/32bit/installer/license/OPSI/changelog.txt delete mode 100644 sample/32bit/installer/license/OPSI/control delete mode 100644 sample/32bit/installer/license/OPSI/postinst delete mode 100644 sample/32bit/installer/license/OPSI/preinst delete mode 100644 sample/32bit/installer/license/builder-product.cfg delete mode 100644 sample/32bit/installer/nolicense/CLIENT_DATA/delsub32.ins delete mode 100644 sample/32bit/installer/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/32bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit/installer/nolicense/CLIENT_DATA/setup32.ins delete mode 100644 sample/32bit/installer/nolicense/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/32bit/installer/nolicense/OPSI/changelog.txt delete mode 100644 sample/32bit/installer/nolicense/OPSI/control delete mode 100644 sample/32bit/installer/nolicense/OPSI/postinst delete mode 100644 sample/32bit/installer/nolicense/OPSI/preinst delete mode 100644 sample/32bit/installer/nolicense/Testing.txt delete mode 100644 sample/32bit/installer/nolicense/builder-product.cfg delete mode 100644 sample/32bit/installer/nolicense/builder-targets-cb.sh delete mode 100644 sample/32bit/msi/license/CLIENT_DATA/delsub32.ins delete mode 100644 sample/32bit/msi/license/CLIENT_DATA/login.ins delete mode 100644 sample/32bit/msi/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit/msi/license/CLIENT_DATA/setup32.ins delete mode 100644 sample/32bit/msi/license/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/32bit/msi/license/OPSI/changelog.txt delete mode 100644 sample/32bit/msi/license/OPSI/control delete mode 100644 sample/32bit/msi/license/OPSI/postinst delete mode 100644 sample/32bit/msi/license/OPSI/preinst delete mode 100644 sample/32bit/msi/license/Testing.txt delete mode 100644 sample/32bit/msi/license/builder-product.cfg delete mode 100644 sample/32bit/msi/license/builder-targets-cb.sh delete mode 100644 sample/32bit/msi/nolicense/CLIENT_DATA/delsub32.ins delete mode 100644 sample/32bit/msi/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/32bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit/msi/nolicense/CLIENT_DATA/setup32.ins delete mode 100644 sample/32bit/msi/nolicense/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/32bit/msi/nolicense/OPSI/changelog.txt delete mode 100644 sample/32bit/msi/nolicense/OPSI/control delete mode 100644 sample/32bit/msi/nolicense/OPSI/postinst delete mode 100644 sample/32bit/msi/nolicense/OPSI/preinst delete mode 100644 sample/32bit/msi/nolicense/Testing.txt delete mode 100644 sample/32bit/msi/nolicense/builder-product.cfg delete mode 100644 sample/32bit/msi/nolicense/builder-targets-cb.sh delete mode 100644 sample/32bit64/installer/license/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/32bit64/installer/license/CLIENT_DATA/login.ins delete mode 100644 sample/32bit64/installer/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit64/installer/license/CLIENT_DATA/setup3264.ins delete mode 100644 sample/32bit64/installer/license/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/32bit64/installer/license/OPSI/changelog.txt delete mode 100644 sample/32bit64/installer/license/OPSI/control delete mode 100644 sample/32bit64/installer/license/OPSI/postinst delete mode 100644 sample/32bit64/installer/license/OPSI/preinst delete mode 100644 sample/32bit64/installer/license/Testing.txt delete mode 100644 sample/32bit64/installer/license/builder-product.cfg delete mode 100644 sample/32bit64/installer/license/builder-targets-cb.sh delete mode 100644 sample/32bit64/installer/nolicense/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/32bit64/installer/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/32bit64/installer/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit64/installer/nolicense/CLIENT_DATA/setup3264.ins delete mode 100644 sample/32bit64/installer/nolicense/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/32bit64/installer/nolicense/OPSI/changelog.txt delete mode 100644 sample/32bit64/installer/nolicense/OPSI/control delete mode 100644 sample/32bit64/installer/nolicense/OPSI/postinst delete mode 100644 sample/32bit64/installer/nolicense/OPSI/preinst delete mode 100644 sample/32bit64/installer/nolicense/Testing.txt delete mode 100644 sample/32bit64/installer/nolicense/builder-product.cfg delete mode 100644 sample/32bit64/installer/nolicense/builder-targets-cb.sh delete mode 100644 sample/32bit64/msi/license/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/32bit64/msi/license/CLIENT_DATA/login.ins delete mode 100644 sample/32bit64/msi/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit64/msi/license/CLIENT_DATA/setup3264.ins delete mode 100644 sample/32bit64/msi/license/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/32bit64/msi/license/OPSI/changelog.txt delete mode 100644 sample/32bit64/msi/license/OPSI/control delete mode 100644 sample/32bit64/msi/license/OPSI/postinst delete mode 100644 sample/32bit64/msi/license/OPSI/preinst delete mode 100644 sample/32bit64/msi/license/Testing.txt delete mode 100644 sample/32bit64/msi/license/builder-product.cfg delete mode 100644 sample/32bit64/msi/license/builder-targets-cb.sh delete mode 100644 sample/32bit64/msi/nolicense/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/32bit64/msi/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/32bit64/msi/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/32bit64/msi/nolicense/CLIENT_DATA/setup3264.ins delete mode 100644 sample/32bit64/msi/nolicense/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/32bit64/msi/nolicense/OPSI/changelog.txt delete mode 100644 sample/32bit64/msi/nolicense/OPSI/control delete mode 100644 sample/32bit64/msi/nolicense/OPSI/postinst delete mode 100644 sample/32bit64/msi/nolicense/OPSI/preinst delete mode 100644 sample/32bit64/msi/nolicense/Testing.txt delete mode 100644 sample/32bit64/msi/nolicense/builder-product.cfg delete mode 100644 sample/32bit64/msi/nolicense/builder-targets-cb.sh delete mode 100644 sample/64bit/installer/license/CLIENT_DATA/delsub64.ins delete mode 100644 sample/64bit/installer/license/CLIENT_DATA/login.ins delete mode 100644 sample/64bit/installer/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/64bit/installer/license/CLIENT_DATA/setup64.ins delete mode 100644 sample/64bit/installer/license/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/64bit/installer/license/OPSI/changelog.txt delete mode 100644 sample/64bit/installer/license/OPSI/control delete mode 100644 sample/64bit/installer/license/OPSI/postinst delete mode 100644 sample/64bit/installer/license/OPSI/preinst delete mode 100644 sample/64bit/installer/license/Testing.txt delete mode 100644 sample/64bit/installer/license/builder-product.cfg delete mode 100644 sample/64bit/installer/license/builder-targets-cb.sh delete mode 100644 sample/64bit/installer/nolicense/CLIENT_DATA/delsub64.ins delete mode 100644 sample/64bit/installer/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/64bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/64bit/installer/nolicense/CLIENT_DATA/setup64.ins delete mode 100644 sample/64bit/installer/nolicense/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/64bit/installer/nolicense/OPSI/changelog.txt delete mode 100644 sample/64bit/installer/nolicense/OPSI/control delete mode 100644 sample/64bit/installer/nolicense/OPSI/postinst delete mode 100644 sample/64bit/installer/nolicense/OPSI/preinst delete mode 100644 sample/64bit/installer/nolicense/Testing.txt delete mode 100644 sample/64bit/installer/nolicense/builder-product.cfg delete mode 100644 sample/64bit/installer/nolicense/builder-targets-cb.sh delete mode 100644 sample/64bit/msi/license/CLIENT_DATA/delsub64.ins delete mode 100644 sample/64bit/msi/license/CLIENT_DATA/login.ins delete mode 100644 sample/64bit/msi/license/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/64bit/msi/license/CLIENT_DATA/setup64.ins delete mode 100644 sample/64bit/msi/license/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/64bit/msi/license/OPSI/changelog.txt delete mode 100644 sample/64bit/msi/license/OPSI/control delete mode 100644 sample/64bit/msi/license/OPSI/postinst delete mode 100644 sample/64bit/msi/license/OPSI/preinst delete mode 100644 sample/64bit/msi/license/Testing.txt delete mode 100644 sample/64bit/msi/license/builder-product.cfg delete mode 100644 sample/64bit/msi/license/builder-targets-cb.sh delete mode 100644 sample/64bit/msi/nolicense/CLIENT_DATA/delsub64.ins delete mode 100644 sample/64bit/msi/nolicense/CLIENT_DATA/login.ins delete mode 100644 sample/64bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/64bit/msi/nolicense/CLIENT_DATA/setup64.ins delete mode 100644 sample/64bit/msi/nolicense/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/64bit/msi/nolicense/OPSI/changelog.txt delete mode 100644 sample/64bit/msi/nolicense/OPSI/control delete mode 100644 sample/64bit/msi/nolicense/OPSI/postinst delete mode 100644 sample/64bit/msi/nolicense/OPSI/preinst delete mode 100644 sample/64bit/msi/nolicense/Testing.txt delete mode 100644 sample/64bit/msi/nolicense/builder-product.cfg delete mode 100644 sample/64bit/msi/nolicense/builder-targets-cb.sh delete mode 100644 sample/All/CLIENT_DATA/delsub32.ins delete mode 100644 sample/All/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/All/CLIENT_DATA/delsub64.ins delete mode 100644 sample/All/CLIENT_DATA/login.ins delete mode 100644 sample/All/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/All/CLIENT_DATA/setup32.ins delete mode 100644 sample/All/CLIENT_DATA/setup3264.ins delete mode 100644 sample/All/CLIENT_DATA/setup64.ins delete mode 100644 sample/All/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/All/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/All/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/All/OPSI/changelog.txt delete mode 100644 sample/All/OPSI/control delete mode 100644 sample/All/OPSI/postinst delete mode 100644 sample/All/OPSI/preinst delete mode 100644 sample/All/Testing.txt delete mode 100644 sample/All/builder-product.cfg delete mode 100644 sample/All/builder-targets-cb.sh rename sample/{32bit/installer/license => }/Testing.txt (100%) rename sample/{32bit/installer/license => }/builder-targets-cb.sh (100%) delete mode 100644 sample/control delete mode 100644 sample/old/CLIENT_DATA/delsub32.ins delete mode 100644 sample/old/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/old/CLIENT_DATA/delsub64.ins delete mode 100644 sample/old/CLIENT_DATA/opsi-PN.ini delete mode 100644 sample/old/CLIENT_DATA/setup32.ins delete mode 100644 sample/old/CLIENT_DATA/setup3264.ins delete mode 100644 sample/old/CLIENT_DATA/setup64.ins delete mode 100644 sample/old/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/old/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/old/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/old/OPSI/changelog.txt delete mode 100644 sample/old/OPSI/control delete mode 100644 sample/old/OPSI/postinst delete mode 100644 sample/old/OPSI/preinst delete mode 100644 sample/old/Testing.txt delete mode 100644 sample/old/builder-product.cfg delete mode 100644 sample/old/builder-targets-cb.sh delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/Thumbs.db delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/delsub.ins delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/opsi-template.png delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/setup32.ins delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/uninstall.ins delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi-template-with-admin.png delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi.bmp delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/setup.ins delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/OPSI/control delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/OPSI/postinst delete mode 100644 sample/source/4.0.2/opsi-template-with-admin/OPSI/preinst delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub32.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub3264.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub64.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub_short32.opsiscript delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/login.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/opsi-template.png delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/setup32.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/setup3264.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/setup64.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/setup_short32.opsiscript delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall32.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall3264.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall64.ins delete mode 100644 sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall_short32.opsiscript delete mode 100644 sample/source/4.0.2/opsi-template/OPSI/control delete mode 100644 sample/source/4.0.2/opsi-template/OPSI/postinst delete mode 100644 sample/source/4.0.2/opsi-template/OPSI/preinst diff --git a/bin/opsi-builder.sh b/bin/aio-builder.sh similarity index 100% rename from bin/opsi-builder.sh rename to bin/aio-builder.sh diff --git a/conf/opsi-builder.cfg b/conf/aio-builder.cfg similarity index 58% rename from conf/opsi-builder.cfg rename to conf/aio-builder.cfg index 8633aed..fe5a111 100644 --- a/conf/opsi-builder.cfg +++ b/conf/aio-builder.cfg @@ -1,17 +1,17 @@ ################################################### -# opsi-builder.cfg -# Default values for opsi-builder system +# aio-builder.cfg +# Default values for aio-builder system #################################################### # # Define your local, private, individual, not-project dependent build setup -# in the file ~/.opsi-builder.cfg OR by using the environment variable OPSI_BUILDER +# in the file ~/.aio-builder.cfg OR by using the environment variable AIO_BUILDER # pointing the the configuration. -# export OPSI_BUILDER=/home/dschwager/work/opsi-builder.cfg +# export AIO_BUILDER=/home/dschwager/work/aio-builder.cfg # If no files are availble, the default values will be use -# from /conf/opsi-builder.cfg +# from /conf/aio-builder.cfg # -# cp /conf/opsi-builder.cfg $HOME/.opsi-builder.cfg -# vi $HOME/.opsi-builder.cfg +# cp /conf/aio-builder.cfg $HOME/.aio-builder.cfg +# vi $HOME/.aio-builder.cfg # may you will change some locations ################################################### @@ -38,7 +38,7 @@ STATUS="integration" # STATUS_INTEGRATION_RELEASE - automatically created release number, # if STATUS is set to "integration". Valid values: anything, default value: "`date +%Y%m%d%H%M`" # Samples: -# "func:inc1" - build-in function "inc1": search the opsi-repository for the latested release and increment 1 +# "func:inc1" - build-in function "inc1": search the aio-repository for the latested release and increment 1 # "`date +%Y%m%d%H%M`" - command output, e.g. the date format YYMMDD-HHMM # "$BUILD_NUMBER" - Environment variables, jenkins https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project#Buildingasoftwareproject-JenkinsSetEnvironmentVariables STATUS_INTEGRATION_RELEASE="func:inc1" @@ -53,8 +53,8 @@ CHECKSUM_AUTOCREATE=false ############################### # CREATOR ############################### -# Part of the published OPSI-package name -# Limitation: max 3 chars (beause OPSI limites REVISION to 16 chars) +# Part of the published AIO-package name +# Limitation: max 3 chars (beause AIO limites REVISION to 16 chars) CREATOR_TAG=xx # Additonal information from the person creating the packages @@ -63,57 +63,52 @@ CREATOR_EMAIL="your-email@domain.de" ################################## -# OPSI repository settings +# AIO repository settings ################################# -# Basedirectory storing OPSI-packages after building -OPSI_REPOS_BASE_DIR=$HOME/opsi-repository +# Basedirectory storing AIO-packages after building +AIO_REPOS_BASE_DIR=$HOME/aio-repository # Directory- and filename pattern -OPSI_REPOS_PRODUCT_DIR=${OPSI_REPOS_BASE_DIR}/${STATUS}/${VENDOR}/${PN}/${VERSION}-${CREATOR_TAG}${RELEASE} +AIO_REPOS_PRODUCT_DIR=${AIO_REPOS_BASE_DIR}/${STATUS}/${VENDOR}/${PN}/${VERSION}-${CREATOR_TAG}${RELEASE} -# OPSI-package filepattern -OPSI_REPOS_FILE_PATTERN=${PN}_${VERSION}-${CREATOR_TAG}${RELEASE} +# AIO-package filepattern +AIO_REPOS_FILE_PATTERN=${PN}_${VERSION}-${CREATOR_TAG}${RELEASE} -# Force alway upload to opsi repos +# Force alway upload to aio repos # Target: publish, Valid values: true|false, Default: false -# OPSI_REPOS_FORCE_UPLOAD=true +# AIO_REPOS_FORCE_UPLOAD=true -# define the artifacts uploading to the repository (OPSI_REPOS_FORCE_UPLOAD must be "true") -# OPSI_REPOS_UPLOAD_SOURCE product directory -# OPSI_REPOS_UPLOAD_OPSI : opsi package -# OPSI_REPOS_UPLOAD_BIN : File used by opsi package creation -# OPSI_REPOS_UPLOAD_OPSI_ZSYNC : Additional files (*.md5, *.zsync) to sync opsi package using opsi-product-updater -# OPSI_REPOS_OPSIMANAGER_INSTALL : Install the created opsi packet automatically after building -# It equal to the command "opsi-package-manager -i" -# Note: the OPSI_REPOS_BASE_DIR must be RW for the user pcpatch. -# You must be member of the unix group pcpatch&opsiadmin -OPSI_REPOS_UPLOAD_OPSI=true -OPSI_REPOS_UPLOAD_OPSI_ZSYNC=false -OPSI_REPOS_UPLOAD_SOURCE=false -OPSI_REPOS_UPLOAD_BIN=false -OPSI_REPOS_OPSIMANAGER_INSTALL=false +# define the artifacts uploading to the repository (AIO_REPOS_FORCE_UPLOAD must be "true") +# AIO_REPOS_UPLOAD_SOURCE product directory +# AIO_REPOS_UPLOAD_AIO : aio package +# AIO_REPOS_UPLOAD_BIN : File used by aio package creation +# AIO_REPOS_UPLOAD_AIO : Additional files (*.md5) +AIO_REPOS_UPLOAD_AIO=true +AIO_REPOS_UPLOAD_AIO=false +AIO_REPOS_UPLOAD_SOURCE=false +AIO_REPOS_UPLOAD_BIN=false ## # Limiting instances of published version # Valid values: true|false -OPSI_REPOS_PURGE=false +AIO_REPOS_PURGE=false # Only purge projects using the defined STATUS # ValidValues: integration|testing|release # Defaut: integration -OPSI_REPOS_PURGE_STATUS=integration +AIO_REPOS_PURGE_STATUS=integration # defines the max. instances of published versions per product # Valid values: 0...n, 0: disable autocleanup -OPSI_REPOS_PURGE_LIMIT=3 +AIO_REPOS_PURGE_LIMIT=3 # defines limits for special products # Valid values: 0...n, 0: disable autocleanup -OPSI_REPOS_PURGE_LIMIT_productname1=2 -OPSI_REPOS_PURGE_LIMIT_productname2=6 +AIO_REPOS_PURGE_LIMIT_productname1=2 +AIO_REPOS_PURGE_LIMIT_productname2=6 # create an gpg signfile -OPSI_REPOS_UPLOAD_OPSI_GPG=false +AIO_REPOS_UPLOAD_AIO_GPG=false GPG_PASSPHRASE="" ############################### @@ -121,12 +116,12 @@ GPG_PASSPHRASE="" ############################### # Directory downloading/cacheing the artifacts like MSI package or icons from the vendor webside -DIST_CACHE_DIR=$HOME/.opsi-dist-cache/${PN}-${VERSION} +DIST_CACHE_DIR=$HOME/.aio-dist-cache/${PN}-${VERSION} # private dist repository. You can use all variables from release.cfg insde the URL # this optinal URL will be the FIRST url to check for downloading vendor stuff. # To copy a local file, the repos should start with file:// -DIST_PRIVATE_REPOS=file://$HOME/opsi-dist.private/$VENDOR/$PN/$VERSION +DIST_PRIVATE_REPOS=file://$HOME/aio-dist.private/$VENDOR/$PN/$VERSION # Force always downloading dist files # DIST_FORCE_DOWNLOAD=1 diff --git a/lib/builder-targets.sh b/lib/builder-targets.sh index 35946de..ab38ac5 100644 --- a/lib/builder-targets.sh +++ b/lib/builder-targets.sh @@ -11,21 +11,18 @@ builder_config() { # Define commands - CMD_7z="`which 7z`" ; builder_check_error "Command '7z' not installed" - CMD_unzip="`which unzip`" ; builder_check_error "Command 'unzip' not installed" - CMD_unrar="`which unrar`" ; builder_check_error "Command 'unrar' not installed" - CMD_zip="`which zip`" ; builder_check_error "Command 'zip' not installed" - CMD_lha="`which lha`" ; builder_check_error "Command 'lha' not installed" - CMD_tar="`which tar`" ; builder_check_error "Command 'tar' not installed" - CMD_cabextract="`which cabextract`" ; builder_check_error "Command 'cabextract' not installed" - CMD_unix2dos="`which unix2dos`" ; builder_check_error "Command 'unix2dos' not installed" - CMD_identify="`which identify`" ; builder_check_error "Command 'identify' (ImageMagick) not installed" - CMD_zsyncmake="`which zsyncmake`" ; builder_check_error "Command 'zsyncmake' not installed" - CMD_comm="`which comm`" ; builder_check_error "Command 'comm' not installed" - CMD_sha1sum="`which sha1sum`" ; builder_check_error "Command 'sha1sum' not installed" - CMD_iniset="`which ini-set`" ; builder_check_error "Command 'ini-set' (martINI a pypi project) not installed" - CMD_ruby="`which ruby`" ; builder_check_error "Command 'ruby' not installed" - CMD_gpg="`which gpg`" ; builder_check_error "Command 'gpg' not installed" + CMD_7z="`which 7z.exe`" ; builder_check_error "Command '7z' not installed" + CMD_unzip="`which unzip.exe`" ; builder_check_error "Command 'unzip' not installed" + CMD_unrar="`which UnRAR.exe`" ; builder_check_error "Command 'UnRAR' not installed" + CMD_zip="`which zip.exe`" ; builder_check_error "Command 'zip' not installed" + CMD_lha="`which lha.exe`" ; builder_check_error "Command 'lha' not installed" + CMD_tar="`which tar.exe`" ; builder_check_error "Command 'tar' not installed" + CMD_cabextract="`which cabextract.exe`" ; builder_check_error "Command 'cabextract' not installed" + CMD_unix2dos="`which unix2dos.exe`" ; builder_check_error "Command 'unix2dos' not installed" + CMD_sha1sum="`which sha1sum.exe`" ; builder_check_error "Command 'sha1sum' not installed" + CMD_inifile="`which inifile.exe`" ; builder_check_error "Command 'inifile' not installed (http://www.horstmuc.de/wbat32d.htm#inifile)" + CMD_showver="`which ShowVer.exe`" ; builder_check_error "Command 'ShowVer' not installed (http://www.codeproject.com/Articles/2457/ShowVer-exe-command-line-VERSIONINFO-display-progr)" + CMD_tidy="`which tidy.exe`" ; builder_check_error "Command 'tidy' not installed" # Check temp dir test -d ${TMP_DIR} @@ -37,14 +34,14 @@ builder_config() { . ${config} # set default build configuration and source the user dependent file - local config=$BASEDIR/conf/opsi-builder.cfg + local config=$BASEDIR/conf/aio-builder.cfg . ${config} # Source local build configuration (must be done AFTER sourcing the builder-product.cfg.cfg) - if [ -f "$OPSI_BUILDER" ] ; then - config=$OPSI_BUILDER + if [ -f "$AIO_BUILDER" ] ; then + config=$AIO_BUILDER else - test -f $HOME/.opsi-builder.cfg && config=$HOME/.opsi-builder.cfg + test -f $HOME/.aio-builder.cfg && config=$HOME/.aio-builder.cfg fi # Read ONLY the STATUS variable from the build configuration file @@ -57,7 +54,7 @@ builder_config() { . ${config} calc_release else - # OPSI/control:RELEASE is limited to max 16 chars - take care in regards to the CREATOR_TAG + # AIO/control:RELEASE is limited to max 16 chars - take care in regards to the CREATOR_TAG RELEASE="${STATUS_INTEGRATION_RELEASE}" fi fi @@ -67,8 +64,8 @@ builder_config() { echo "Loaded builder configuration: $config" # Check variables - if [ -z ${OPSI_REPOS_BASE_DIR} ] || [ ! -d ${OPSI_REPOS_BASE_DIR} ] ; then - echo "configuration error: OPSI_REPOS_BASE_DIR directory does not exist: $OPSI_REPOS_BASE_DIR" + if [ -z ${AIO_REPOS_BASE_DIR} ] || [ ! -d ${AIO_REPOS_BASE_DIR} ] ; then + echo "configuration error: AIO_REPOS_BASE_DIR directory does not exist: $AIO_REPOS_BASE_DIR" exit 2 fi @@ -77,8 +74,8 @@ builder_config() { fi # Check, if variable is numeric - if [ ! `expr ${OPSI_REPOS_PURGE_LIMIT} + 1 2> /dev/null` ] ; then - fatal_error "OPSI_REPOS_PURGE_LIMIT must be numeric" + if [ ! `expr ${AIO_REPOS_PURGE_LIMIT} + 1 2> /dev/null` ] ; then + fatal_error "AIO_REPOS_PURGE_LIMIT must be numeric" fi } @@ -89,8 +86,8 @@ builder_config() { builder_prepare() { echo "builder_prepare: " # Check if the package is still build - if [ "$OPSI_REPOS_FORCE_UPLOAD" != "true" ] && [ -f "${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" ] ; then - echo "File ${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi already exists." + if [ "$AIO_REPOS_FORCE_UPLOAD" != "true" ] && [ -f "${AIO_REPOS_PRODUCT_DIR}/${AIO_REPOS_FILE_PATTERN}.7z" ] ; then + echo "File ${AIO_REPOS_PRODUCT_DIR}/${AIO_REPOS_FILE_PATTERN}.7z already exists." exit 1 fi @@ -98,7 +95,7 @@ builder_prepare() { log_debug "Distribution directory: $DIST_CACHE_DIR" # setup work directory - OUTPUT_DIR="$TMP_DIR/opsi-builder.`date +%Y%m%d-%H%M%S`.$$" + OUTPUT_DIR="$TMP_DIR/aio-builder.`date +%Y%m%d-%H%M%S`.$$" mkdir -p ${OUTPUT_DIR} builder_check_error "Cannot create temp directory ${OUTPUT_DIR}" @@ -190,17 +187,11 @@ builder_retrieve() { builder_create() { # Copy files and convert text files to dos format - cp -Rv ${PRODUCT_DIR}/OPSI $INST_DIR - cp -Rv ${PRODUCT_DIR}/CLIENT_DATA $INST_DIR - if [ -d "${PRODUCT_DIR}/SERVER_DATA" ] ; then - cp -Rv ${PRODUCT_DIR}/SERVER_DATA $INST_DIR - fi - - # converting icon file - local iconfile_src=${DL_DIST_FILE[$ICON_DL_INDEX]} - ICONFILE=$OUTPUT_DIR/$PN.png - convert_image $iconfile_src $ICONFILE - cp -a $ICONFILE $INST_DIR/CLIENT_DATA +# cp -Rv ${PRODUCT_DIR}/AIO $INST_DIR + # cp -Rv ${PRODUCT_DIR}/CLIENT_DATA $INST_DIR + # if [ -d "${PRODUCT_DIR}/SERVER_DATA" ] ; then +# cp -Rv ${PRODUCT_DIR}/SERVER_DATA $INST_DIR + # fi # copy binaries for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do @@ -214,58 +205,26 @@ builder_create() { process_file $format ${DL_DIST_FILE[$i]} ${DL_EXTRACT_PATH[$i]} $option done - # create winst variables - local var_file=${OUTPUT_DIR}/variable.ins - create_winst_varfile $var_file - # write ini file - local ini_file=${INST_DIR}/CLIENT_DATA/opsi-$PN.ini - write_ini_file $ini_file $var_file - - echo ";Hardcoded opsi vars" >>$var_file - echo "Set \$ProductId\$ = \"$PN\"" >>$var_file - - # add the new vaiables to all *.ins winst files - for inst_file in `find ${INST_DIR}/CLIENT_DATA -type f -name "*.ins"` ; do - sed -i -e "/@@BUILDER_VARIABLES@@/ { - r "$var_file" - d - }" $inst_file + local ini_file=${INST_DIR}/aio-$PN.ini + + for var in VENDOR PN VERSION RELEASE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do + write_ini_file $ini_file "COMMON" ${var}="${!var}" done # convert to dos file linefeed - find $INST_DIR/CLIENT_DATA -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null + find $INST_DIR -type f | xargs -n1 -iREP sh -c 'file -i $0 | grep -v "utf-16" | grep "text/plain" && '$CMD_unix2dos' $0 ' REP >/dev/null # set exec bit on executeables - find $INST_DIR/CLIENT_DATA -type f -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.msi" -o -iname "*.msp" | xargs chmod +x -v + find $INST_DIR -type f -iname "*.exe" -o -iname "*.bat" -o -iname "*.cmd" -o -iname "*.msi" -o -iname "*.msp" | xargs chmod +x -v - # replace variables from file OPSI/control - local release_new=${CREATOR_TAG}${RELEASE} - # sed -e "s!VERSION!$VERSION!g" -e "s!RELEASE!${release_new}!g" -e "s!PRIORITY!$PRIORITY!g" -e "s!ADVICE!$ADVICE!g" ${PRODUCT_DIR}/OPSI/control >$INST_DIR/OPSI/control - write_control_file $INST_DIR/OPSI/control "Package" "version" "${release_new}" - write_control_file $INST_DIR/OPSI/control "Product" "id" "$PN" - write_control_file $INST_DIR/OPSI/control "Product" "name" "$NAME" - write_control_file $INST_DIR/OPSI/control "Product" "description" "$DESCRIPTION" - write_control_file $INST_DIR/OPSI/control "Product" "advice" "$ADVICE" - write_control_file $INST_DIR/OPSI/control "Product" "version" "$VERSION" - write_control_file $INST_DIR/OPSI/control "Product" "priority" "$PRIORITY" - # Create changelog based on git - if available if [ -d "${PRODUCT_DIR}/.git" ] ; then # new changelog format - echo "" >> $INST_DIR/OPSI/control - echo "[Changelog]" >> $INST_DIR/OPSI/control - $CMD_ruby $BASEDIR/libexec/gitlog-to-deblog.rb >> $INST_DIR/OPSI/control - echo "" >> $INST_DIR/OPSI/control - rm -f $INST_DIR/OPSI/changelog.txt - - #old changelog format - #git log --date-order --date=short | \ - #sed -e '/^commit.*$/d' | \ - #awk '/^Author/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' | \ - #sed -e 's/^Author: //g' | \ - #sed -e 's/>Date: \([0-9]*-[0-9]*-[0-9]*\)/>\t\1/g' | \ - #sed -e 's/^\(.*\) \(\)\t\(.*\)/\3 \1 \2/g' > $INST_DIR/OPSI/changelog.txt + echo "" >> $INST_DIR/changelog.txt + echo "[Changelog]" >> $INST_DIR/changelog.txt + #$CMD_ruby $BASEDIR/libexec/gitlog-to-deblog.rb >> $INST_DIR/AIO/changelog.txt + echo "" >> $INST_DIR/changelog.txt else echo "No git repository present." fi @@ -273,30 +232,30 @@ builder_create() { } ##################### -# build opsi package +# build aio package ##################### builder_package() { # creating package local release_new=${CREATOR_TAG}${RELEASE} - local opsi_file=${PN}_${VERSION}-${release_new}.opsi + local aio_file=${PN}_${VERSION}-${release_new}.7z pushd ${OUTPUT_DIR} - rm -f ${opsi_file} ${OPSI_REPOS_FILE_PATTERN}.opsi - LANG="C" opsi-makeproductfile -v $INST_DIR - builder_check_error "Building OPSI-package" + rm -f ${aio_file} ${AIO_REPOS_FILE_PATTERN}.7z + 7z a ${AIO_REPOS_FILE_PATTERN}.7z -v $INST_DIR/* + builder_check_error "Building AIO-package" popd - # rename opsi package file - if [ "${opsi_file}" != "${OPSI_REPOS_FILE_PATTERN}.opsi" ]; then - mv ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi - builder_check_error "can't move file ${OUTPUT_DIR}/${opsi_file} ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.opsi" + # rename aio package file + if [ "${aio_file}" != "${AIO_REPOS_FILE_PATTERN}.7z" ]; then + mv ${OUTPUT_DIR}/${aio_file} ${OUTPUT_DIR}/${AIO_REPOS_FILE_PATTERN}.7z + builder_check_error "can't move file ${OUTPUT_DIR}/${aio_file} ${OUTPUT_DIR}/${AIO_REPOS_FILE_PATTERN}.7z" fi # --exclude \*/.git\* # create source- and binary package package - test "${OPSI_REPOS_UPLOAD_BIN}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}.zip $INST_DIR - test "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN}-src.zip ${PRODUCT_DIR} + test "${AIO_REPOS_UPLOAD_BIN}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${AIO_REPOS_FILE_PATTERN}.zip $INST_DIR + test "${AIO_REPOS_UPLOAD_SOURCE}" = "true" && $CMD_zip --exclude \*/.git\* @ -r ${OUTPUT_DIR}/${AIO_REPOS_FILE_PATTERN}-src.zip ${PRODUCT_DIR} } @@ -306,55 +265,52 @@ builder_package() { builder_publish() { # Upload file to repository - mkdir -p ${OPSI_REPOS_PRODUCT_DIR} + mkdir -p ${AIO_REPOS_PRODUCT_DIR} - echo "Publishing opsi-package to ${OPSI_REPOS_PRODUCT_DIR}" - local src=${OUTPUT_DIR}/${OPSI_REPOS_FILE_PATTERN} - local dst=${OPSI_REPOS_PRODUCT_DIR}/${OPSI_REPOS_FILE_PATTERN} + echo "Publishing aio-package to ${AIO_REPOS_PRODUCT_DIR}" + local src=${OUTPUT_DIR}/${AIO_REPOS_FILE_PATTERN} + local dst=${AIO_REPOS_PRODUCT_DIR}/${AIO_REPOS_FILE_PATTERN} # Link dir - if [ "${OPSI_REPOS_LINK_NEWBUILDS}" = "true" ] ; then - mkdir -p ${OPSI_REPOS_BASE_DIR}/.new_builds - ln -sf ${OPSI_REPOS_PRODUCT_DIR} ${OPSI_REPOS_BASE_DIR}/.new_builds/${OPSI_REPOS_FILE_PATTERN} - builder_check_error "Can't Link file $dst.opsi --> $dst.opsi" + if [ "${AIO_REPOS_LINK_NEWBUILDS}" = "true" ] ; then + mkdir -p ${AIO_REPOS_BASE_DIR}/.new_builds + ln -sf ${AIO_REPOS_PRODUCT_DIR} ${AIO_REPOS_BASE_DIR}/.new_builds/${AIO_REPOS_FILE_PATTERN} + builder_check_error "Can't Link file $dst.7z --> $dst.7z" fi # copy files - if [ "${OPSI_REPOS_UPLOAD_OPSI}" = "true" ] ; then - cp ${src}.opsi ${dst}.opsi - builder_check_error "Can't upload file $dst.opsi --> $dst.opsi" + if [ "${AIO_REPOS_UPLOAD_AIO}" = "true" ] ; then + cp ${src}.7z ${dst}.7z + builder_check_error "Can't upload file $dst.7z --> $dst.7z" fi - if [ "${OPSI_REPOS_UPLOAD_BIN}" = "true" ] ; then + if [ "${AIO_REPOS_UPLOAD_BIN}" = "true" ] ; then cp ${src}.zip ${dst}.zip builder_check_error "Can't upload file $dst.zip --> $dst.zip" fi - if [ "${OPSI_REPOS_UPLOAD_SOURCE}" = "true" ] ; then + if [ "${AIO_REPOS_UPLOAD_SOURCE}" = "true" ] ; then cp ${src}-src.zip ${dst}-src.zip builder_check_error "Can't upload file ${dst}-src.zip --> ${dst}-src.zip" fi - if [ "${OPSI_REPOS_OPSIMANAGER_INSTALL}" = "true" ] ; then - opsi-package-manager -i -v ${src}.opsi - builder_check_error "Can't install ${src}.opsi" + if [ "${AIO_REPOS_AIOMANAGER_INSTALL}" = "true" ] ; then + aio-package-manager -i -v ${src}.7z + builder_check_error "Can't install ${src}.7z" fi - if [ "${OPSI_REPOS_UPLOAD_OPSI_ZSYNC}" = "true" ] ; then - md5sum "${src}.opsi" | sed 's/ .*//' > ${dst}.opsi.md5 + if [ "${AIO_REPOS_UPLOAD_AIO}" = "true" ] ; then + md5sum "${src}.7z" | sed 's/ .*//' > ${dst}.7z.md5 builder_check_error "Can't create md5 file" - - ${CMD_zsyncmake} -u ${OPSI_REPOS_FILE_PATTERN}.opsi -o "${dst}.opsi.zsync" "${src}.opsi" - builder_check_error "Can't create zsync file" fi - if [ "${OPSI_REPOS_UPLOAD_OPSI_GPG}" = "true" ] ; then - ${CMD_gpg} --batch --passphrase ${GPG_PASSPHRASE} --output "${dst}.opsi.gpg" --detach-sig "${src}.opsi" + if [ "${AIO_REPOS_UPLOAD_AIO_GPG}" = "true" ] ; then + ${CMD_gpg} --batch --passphrase ${GPG_PASSPHRASE} --output "${dst}.7z.gpg" --detach-sig "${src}.7z" builder_check_error "Can't create gpg file" fi # Create revision file for this - local rev_file=${OPSI_REPOS_PRODUCT_DIR}/${PN}-${VERSION}-${CREATOR_TAG}${RELEASE}.cfg + local rev_file=${AIO_REPOS_PRODUCT_DIR}/${PN}-${VERSION}-${CREATOR_TAG}${RELEASE}.cfg cat > $rev_file < 0 ] && [ "${STATUS}" = "${OPSI_REPOS_PURGE_STATUS}" ] ; then + # Purge old product versions - defined by limit AIO_REPOS_PURGE_LIMIT + if [ "${AIO_REPOS_PURGE}" = "true" ] && [ ! -z "${AIO_REPOS_PURGE_LIMIT}" ] && [ "${AIO_REPOS_PURGE_LIMIT}" > 0 ] && [ "${STATUS}" = "${AIO_REPOS_PURGE_STATUS}" ] ; then echo "Autopurging enabled" # determinte max version to delete local limit local pn_limit=`echo ${PN} | sed "s/[\.\-]/_/g"` - eval "`echo limit=\\$\\{OPSI_REPOS_PURGE_LIMIT_${pn_limit}\\}`" + eval "`echo limit=\\$\\{AIO_REPOS_PURGE_LIMIT_${pn_limit}\\}`" if [ -z "$limit" ] || [ ! `expr $limit + 1 2>/dev/null` ] ; then - limit=${OPSI_REPOS_PURGE_LIMIT} + limit=${AIO_REPOS_PURGE_LIMIT} fi echo " Purging, max. number of versions: $limit" @@ -391,7 +347,7 @@ EOF rm -f ${file_list} # first uniq sort all cfg based on version - for cfg_file in `find ${OPSI_REPOS_PRODUCT_DIR} -name "${PN}-*.cfg" -print ` ; do + for cfg_file in `find ${AIO_REPOS_PRODUCT_DIR} -name "${PN}-*.cfg" -print ` ; do . ${cfg_file} echo $REV_VERSION >> ${file_list} done @@ -399,7 +355,7 @@ EOF # second uniq sort all versions based in release for pkg_version in `cat ${file_sort_list_version}` ; do - for cfg_file_ver in ${OPSI_REPOS_PRODUCT_DIR}/${PN}-${pkg_version}-*.cfg ; do + for cfg_file_ver in ${AIO_REPOS_PRODUCT_DIR}/${PN}-${pkg_version}-*.cfg ; do . ${cfg_file_ver} echo ${pkg_version}-$REV_CREATOR_TAG$REV_RELEASE >> ${file_sort_list_release} done @@ -408,8 +364,8 @@ EOF # third create versionrelease for release_file_list in `cat ${file_sort_list_final}` ; do - . ${OPSI_REPOS_PRODUCT_DIR}/${PN}-${release_file_list}.cfg - echo "${OPSI_REPOS_PRODUCT_DIR}/${PN}-${release_file_list}.cfg" >> ${file_sort_list} + . ${AIO_REPOS_PRODUCT_DIR}/${PN}-${release_file_list}.cfg + echo "${AIO_REPOS_PRODUCT_DIR}/${PN}-${release_file_list}.cfg" >> ${file_sort_list} done # Delete the oldest files @@ -417,14 +373,14 @@ EOF for cfg_sort_file in `head -n-${limit} ${file_sort_list}` ; do . ${cfg_sort_file} - if [ "${REV_STATUS}" != "${OPSI_REPOS_PURGE_STATUS}" ] ; then continue; fi + if [ "${REV_STATUS}" != "${AIO_REPOS_PURGE_STATUS}" ] ; then continue; fi dir_base=`dirname ${cfg_file}` - product_file="${dir_base}/${REV_OPSI_REPOS_FILE_PATTERN}" + product_file="${dir_base}/${REV_AIO_REPOS_FILE_PATTERN}" echo " Purging product version: $product_file*" # Paranoid ... check the files to delete first - if [ ! -z "${dir_base}" ] && [ -d "${OPSI_REPOS_BASE_DIR}" ] && [ ! -z "$product_file" ] ; then + if [ ! -z "${dir_base}" ] && [ -d "${AIO_REPOS_BASE_DIR}" ] && [ ! -z "$product_file" ] ; then rm -f ${product_file}* ${cfg_sort_file} # remove directory - if it's empty @@ -448,11 +404,11 @@ builder_commit() { ##################### -# build opsi package +# build aio package ##################### builder_cleanup() { # Paranoia - if [ -d "$OUTPUT_DIR" ] && [[ $OUTPUT_DIR == $TMP_DIR/opsi-builder.* ]] ; then + if [ -d "$OUTPUT_DIR" ] && [[ $OUTPUT_DIR == $TMP_DIR/aio-builder.* ]] ; then rm -rf $OUTPUT_DIR fi } diff --git a/lib/builder-utils.sh b/lib/builder-utils.sh index cb87ef8..88b5e77 100644 --- a/lib/builder-utils.sh +++ b/lib/builder-utils.sh @@ -138,159 +138,6 @@ log_info() { fi } -################### -# Convert image -################### -convert_image() { - local src=$1 - local dst=$2 - - local hight=`${CMD_identify} -format "%h" $src` - local wight=`${CMD_identify} -format "%w" $src` - ${CMD_identify} -format "%wx%h" $src - - # Add a white border to the image so that the convert to transparent can go around an image - convert -bordercolor White -border 3x3 $src $OUTPUT_DIR/bigger.png - - # first resize the image to the new aspect ratio and add white borders - if [ $wight -lt $hight ] ; then - # Its higher so force x166 and let imagemagic decide the right wight - # then add white to the rest of the image to fit 166x166 - log_debug "Icon Wight: $wight < Hight: $hight" - convert $OUTPUT_DIR/bigger.png -colorspace RGB -resize x166 \ - -size 166x166 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - elif [ $wight -gt $hight ] ; then - # Its wider so force 166x and let imagemagic decide the right hight - # then add white to the rest of the image to fit 166x166 - log_debug "Icon Wight: $wight > Hight: $hight" - convert $OUTPUT_DIR/bigger.png -colorspace RGB -resize 166x \ - -size 166x166 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - elif [ $wight -eq $hight ] ; then - # Its scare so force 166x166 - log_debug "Icon Wight: $wight = Hight: $hight" - convert $OUTPUT_DIR/bigger.png -colorspace RGB -resize 166x166 \ - -size 166x166 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - else - # Imagemagic is unable to detect the aspect ratio so just force 166x166 - # this could result in streched images - log_debug "Icon Wight: $wight unknown Hight: $hight" - convert $OUTPUT_DIR/bigger.png -colorspace RGB -resize 166x166 \ - -size 166x166 xc:white +swap -gravity center -composite \ - -modulate 110 -colors 256 png8:$OUTPUT_DIR/resize.png - builder_check_error "converting image" - fi - - # create a diffence image from the source - convert $OUTPUT_DIR/resize.png \( +clone -fx 'p{0,0}' \) -compose Difference -composite \ - -modulate 100,0 +matte $OUTPUT_DIR/difference.png - - # remove the black, replace with transparency - convert $OUTPUT_DIR/difference.png -bordercolor white -border 1x1 -matte \ - -fill none -fuzz 7% -draw 'matte 1,1 floodfill' -shave 1x1 \ - $OUTPUT_DIR/removed_black.png - - # create the matte - if [ `convert | grep Version | awk '{print $3}' | sed "s/-.*//" | sed "s/\.//g"` -le 670 ] ; then - convert $OUTPUT_DIR/removed_black.png -channel matte -separate +matte \ - $OUTPUT_DIR/matte.png - else - convert $OUTPUT_DIR/removed_black.png -channel matte -negate -separate +matte \ - $OUTPUT_DIR/matte.png - fi - - # negate the colors - convert $OUTPUT_DIR/matte.png -negate -blur 0x1 \ - $OUTPUT_DIR/matte-negated.png - - # you are going for: white interior, black exterior - composite -compose CopyOpacity $OUTPUT_DIR/matte-negated.png $OUTPUT_DIR/resize.png \ - $OUTPUT_DIR/smaller.png - - # now remove the added border that was added eaerlier - # Chop 3 pixels from the top and left side of - convert -chop 3x3 -rotate 180 $OUTPUT_DIR/smaller.png $OUTPUT_DIR/rotate.png - - # Chop 3 pixels from the bottom and right side - convert -chop 3x3 -rotate 180 $OUTPUT_DIR/rotate.png $dst - - # New size - # identify -format "%wx%h" $dst - hight=`${CMD_identify} -format "%h" $dst` - wight=`${CMD_identify} -format "%w" $dst` - log_debug "Opsi Icon Wight: $wight Hight: $hight" - -} - - -################### -# Create variable file -# -# Create a file containing all important winst variables -# (declaration and setings) -# -# Parameter -# file: file to create -# -################### -create_winst_varfile() { - local var_file=$1 - - echo -n >$var_file - echo "; Opsi Builder Variables" >>$var_file - - # make the scriptpath for the binarys configurable - echo "DefVar \$PackagePath\$" >>$var_file - echo "Set \$PackagePath\$ = \"%ScriptPath%\"" >>$var_file - - echo >>$var_file - for (( i = 0 ; i < ${#DL_SOURCE[@]} ; i++ )) ; do - if [ -z ${DL_WINST_NAME[$i]} ] ; then continue ; fi - - if [ ! -z "${DL_ARCH[$i]}" ] ; then arch_str="${DL_ARCH[$i]}\\" ; fi - echo "DefVar \$${DL_WINST_NAME[$i]}\$" >>$var_file - echo "Set \$${DL_WINST_NAME[$i]}\$ = \$PackagePath\$ + \"\\${arch_str}${DL_FILE[$i]}\"" >>$var_file - done - - # publish some other variables - for var in VENDOR PN VERSION RELEASE PRIORITY NAME ADVICE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do - echo "DefVar \$${var}\$" >>$var_file - echo "Set \$${var}\$ = \"${!var}\"" >>$var_file - done - - # copy image and create variable - echo "DefVar \$IconFile\$" >>$var_file - echo "Set \$IconFile\$ = \"%ScriptPath%\\`basename $ICONFILE`\"" >>$var_file - - # publish custom variables - for (( i = 0 ; i < ${#WINST_NAME[@]} ; i++ )) ; do - - # replace DL_EXTRACT_WINST_PATH - local index=`echo ${WINST_VALUE[$i]} | sed -e "s#.*@DL_EXTRACT_WINST_PATH\[\([0-9]\)\]@.*#\1#"` - log_debug "calculated (DL_EXTRACT_WINST_PATH), Index: $index" - if [ "$index" != "${WINST_VALUE[$i]}" ] ; then - if [ ! -z "${DL_ARCH[$index]}" ] ; then arch_part="\\\\${DL_ARCH[$index]}" ; fi - if [ ! -z "${DL_EXTRACT_WINST_PATH[$index]}" ] ; then extr_part="\\\\${DL_EXTRACT_WINST_PATH[$index]}" ; fi - local new_val="\$PackagePath\$ + $arch_part$extr_part" - WINST_VALUE[$i]=`echo ${WINST_VALUE[$i]} | sed -e "s#@DL_EXTRACT_WINST_PATH\[[0-9]\]@#$new_val#"` - log_debug "calculated (DL_EXTRACT_WINST_PATH) WINST_VALUE: ${WINST_VALUE[$i]}" - fi - - echo "DefVar \$${WINST_NAME[$i]}\$" >>$var_file - echo "Set \$${WINST_NAME[$i]}\$ = \"${WINST_VALUE[$i]}\"" >>$var_file - done - - # correct me im a hack - sed -e 's#"\$PackagePath\$ +#\$PackagePath\$ + "#' -i $var_file - sed -e 's#\$PackagePath\$ + " #\$PackagePath\$ + "#' -i $var_file - echo >>$var_file -} - ##################### # void calc_release() # @@ -304,8 +151,8 @@ create_winst_varfile() { function calc_release() { # Find all revision files and sort them - local file_list=`mktemp /tmp/opsi-builder.calc_release.XXXXXXXXXXX` - for cfg_file in `find ${OPSI_REPOS_BASE_DIR} -name "${PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do + local file_list=`mktemp /tmp/aio-builder.calc_release.XXXXXXXXXXX` + for cfg_file in `find ${AIO_REPOS_BASE_DIR} -name "${PN}-${VERSION}-${CREATOR_TAG}*.cfg" -print ` ; do . ${cfg_file} printf "%08d;$cfg_file\n" $REV_RELEASE >> ${file_list} done @@ -335,43 +182,70 @@ function calc_release() { ################### write_ini_file() { local ini_file=$1 - local var_file=$2 - - # create file if not exist + local ini_section=$2 + local ini_option=$3 + local ini_value=$4 + touch $ini_file - - # publish some other variables - for var in VENDOR PN VERSION RELEASE TYPE CREATOR_TAG CREATOR_NAME CREATOR_EMAIL ; do - $CMD_iniset $ini_file --COMMON ${var}="${!var}" - done - - echo "; Opsi INI File Variables" >>$var_file - echo >>$var_file - # publish custom variables - for (( i = 0 ; i < ${#OPSI_INI_OPTION[@]} ; i++ )) ; do - $CMD_iniset $ini_file --${OPSI_INI_SECTION[$i]} ${OPSI_INI_OPTION[$i]}="${OPSI_INI_VALUE[$i]}" - echo "DefVar \$${OPSI_INI_OPTION[$i]}\$" >>$var_file - echo "Set \$${OPSI_INI_OPTION[$i]}\$ = \"${OPSI_INI_VALUE[$i]}\"" >>$var_file - done - - echo >>$var_file + $CMD_inifile $(cygpath -pw "$ini_file") [$ini_section] $ini_option=$ini_value } + ################### -# Write control file +# Get Verison of File # -# Create a ini file containing needed information for package uninstall +# Copy file only if it is newer # # Parameter -# file: file to create / modify +# File: to process +# Var: # ################### -write_control_file() { - local control_file=$1 - local control_section=$2 - local control_option=$3 - local control_value=$4 +get_file_version() { + local getver_file=$1 + local getver_var=$2 - sed -i -e "/^\[$control_section\]/,/^\[.*\]/ s|^\($control_option[ \t]*:[ \t]*\).*$|\1$control_value|" "$control_file" + if [ -f "$getver_file" ] ; then + $CMD_showver $getver_file | grep FileVersion: | rev | cut -d: -f1 | rev | tr -d ' ' > $getver_ver + echo "file $getver_file has version $getver_ver" + else + echo "$getver_file not found" + fi +} + +################### +# Copy Verison +# +# Copy file only if it is newer +# +# Parameter +# source: sourcefiel +# target: Targetfile +# +################### +copyver() { + local source_file=$1 + local target_file=$2 + local source_ver + local target_ver + + get_file_version $source_file $source_ver +} + +################### +# Tidy xml +# +# Tidy XML files (mainly Sereby package.xml) +# +# Parameter +# source: sourcefiel +# target: Targetfile +# +################### +tidy_xml() { + local source_file=$1 + local target_file=$2 + + cat $source_file | $CMD_tidy -utf8 -xml -w 255 -i -c -q -asxml | sed -e 's!>!>!g' -e 's!<! $target_file } diff --git a/libexec/ShowVer.exe b/libexec/ShowVer.exe new file mode 100644 index 0000000000000000000000000000000000000000..6984bd3fcf01a2b8f262762a334e085adb1157a2 GIT binary patch literal 86077 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 L + * Permission is given by the author to freely redistribute and include + * this code in any program as long as this credit is given where due. + * + * THIS CODE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTY + * OF ANY KIND, EITHER EXPRESSED OR IMPLIED. IN PARTICULAR, NO WARRANTY IS MADE + * THAT THE CODE IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE + * OR NON-INFRINGING. IN NO EVENT WILL THE AUTHOR BE LIABLE FOR ANY COSTS OR DAMAGES + * ARISING FROM ANY USE OF THIS CODE. NO USE OF THIS CODE IS AUTHORIZED EXCEPT UNDER + * THIS DISCLAIMER. + * + * Use at your own risk! + */ +// ---------------------------------------------------------------------------- + +#include +#include + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include + +typedef unsigned char byte; + +#ifndef _DEBUG +# define ASSERT(s) +#else +# include // for _ASSERTE() +# define ASSERT _ASSERTE +#endif + +#define HDUMP 0 +// ---------------------------------------------------------------------------- +#if HDUMP + +#define CHARPRINT(a) \ + { unsigned char tchar; \ + switch (a) { \ + case 0x0D: /* CR */ \ + tchar = 0x11; \ + break; \ + case 0x0A: /* LF */ \ + tchar = 0x19; \ + break; \ + case 0x07: /* BEL */ \ + tchar = 0x0F; \ + break; \ + case '\t': /* TAB */ \ + tchar = 0x1D; \ + break; \ + case '\0': /* NUL */ \ + tchar = 0xF8; \ + break; \ + case 0x08: /* BACKTAB? */ \ + tchar = 0xAE; \ + break; \ + case 0x1A: /* BACKTAB? */ \ + tchar = 0xAE; \ + break; \ + case 0x1B: /* BACKSPACE */ \ + tchar = 0xAE; \ + break; \ + case ' ': /* SPACE */ \ + tchar = 0xC4; \ + break; \ + default: \ + tchar = buf[i]; \ + break; \ + } \ + printf ("%c", tchar); \ + } +// ---------------------------------------------------------------------------- + +int hdump(byte* pBuf, size_t size, size_t start, size_t len) +{ + int ch; + int i, firsti, lasti, tlasti; + unsigned char buf[16]; + unsigned long offs, end; + firsti = (int)(start & 0xFL); + offs = start & ~0xFL; + + byte* pEnd = pBuf+size; + + if (pBuf == NULL) { + return 0; + } + + end = (len!=0) ? start+len : ~len; + lasti = 16; + tlasti = 8; + + for ( ; offs < end; offs += 16) { + unsigned long rmdr = end - offs; + if (rmdr < 16) { + lasti = rmdr; + if (rmdr < 8) { + tlasti = rmdr; + } + } + for (i = firsti; i < lasti; i++) { + ch = (pBuf < pEnd) ? *(pBuf++) : EOF; + buf[i] = (unsigned char) ch; + if (ch == EOF) { + lasti = i; + if (i < 8) tlasti = i; + break; + } + } + /* Print address */ + printf("% 8lx: ", offs); + + /* Print 2 groups of 8 chars in hex format */ + for (i = 0; i < firsti && i < 8; i++) { + printf(" "); // only could happen first time around + } + for ( ; i < tlasti; i++) { + printf("%2.2x ", buf[i]); + } + for ( ; i < 8; i++) { + printf(" "); + } + printf(" "); + for ( ; i < firsti; i++) { + printf(" "); // only could happen first time around + } + for ( ; i < lasti; i++) { + printf("%2.2x ", (unsigned) buf[i]); + } + for ( ; i < 16; i++) { + printf(" "); + } + printf("| "); + + /* Print 2 groups of 8 chars in char format */ + for (i = 0; i < firsti && i < 8; i++) { + printf(" "); + } + for ( ; i < tlasti; i++) { + CHARPRINT(buf[i]) + } + for ( ; i < 8; i++) { + printf(" "); + } + printf(" "); + + for ( ; i < firsti; i++) { + printf(" "); + } + for ( ; i < lasti; i++) { + CHARPRINT(buf[i]) + } + for ( ; i < 16; i++) { + printf(" "); + } + + printf("\n"); + + if (ch == EOF) break; + + firsti = 0; + } + return 1; +} +#endif // HDUMP +// ---------------------------------------------------------------------------- +int usage() +{ + printf("ShowVer \n"); + return 0; +} +// ---------------------------------------------------------------------------- + +int error(wchar_t* sfnName) +{ + DWORD dwErrCode = GetLastError(); + wchar_t* sMsg; + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + dwErrCode, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (wchar_t*) &sMsg, + 0, + NULL); + // Process any inserts in sMsg. + // ... + printf("Unable to access file \"%S\" : %S", sfnName, sMsg); + LocalFree(sMsg); + return 0; +} +// ---------------------------------------------------------------------------- + +/* ----- VS_VERSION.dwFileFlags ----- */ +#define S_VS_FFI_SIGNATURE "VS_FFI_SIGNATURE" +#define S_VS_FFI_STRUCVERSION "VS_FFI_STRUCVERSION" +#define S_VS_FFI_FILEFLAGSMASK "VS_FFI_FILEFLAGSMASK" + +/* ----- VS_VERSION.dwFileFlags ----- */ +#define S_VS_FF_DEBUG "VS_FF_DEBUG" +#define S_VS_FF_PRERELEASE "VS_FF_PRERELEASE" +#define S_VS_FF_PATCHED "VS_FF_PATCHED" +#define S_VS_FF_PRIVATEBUILD "VS_FF_PRIVATEBUILD" +#define S_VS_FF_INFOINFERRED "VS_FF_INFOINFERRED" +#define S_VS_FF_SPECIALBUILD "VS_FF_SPECIALBUILD" + +// ---------------------------------------------------------------------------- +char* showFileFlags(DWORD dwFileFlags) +{ +#define MAXFLAGSSTR 200 + static char s[MAXFLAGSSTR]; + int pos = 0; + s[pos] = '\0'; +#define VS_FF_KNOWNFLAGS (VS_FF_DEBUG \ + | VS_FF_PRERELEASE \ + | VS_FF_PATCHED \ + | VS_FF_PRIVATEBUILD \ + | VS_FF_INFOINFERRED \ + | VS_FF_SPECIALBUILD \ + ) + if (dwFileFlags & ~VS_FF_KNOWNFLAGS) pos += sprintf(&s[pos], "0x%x", dwFileFlags & ~VS_FF_KNOWNFLAGS); + + if (dwFileFlags & VS_FF_DEBUG) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_DEBUG, sizeof(S_VS_FF_DEBUG)); pos += sizeof(S_VS_FF_DEBUG) - 1; } + if (dwFileFlags & VS_FF_PRERELEASE) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PRERELEASE, sizeof(S_VS_FF_PRERELEASE)); pos += sizeof(S_VS_FF_PRERELEASE) - 1; } + if (dwFileFlags & VS_FF_PATCHED) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PATCHED, sizeof(S_VS_FF_PATCHED)); pos += sizeof(S_VS_FF_PATCHED) - 1; } + if (dwFileFlags & VS_FF_PRIVATEBUILD) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_PRIVATEBUILD, sizeof(S_VS_FF_PRIVATEBUILD)); pos += sizeof(S_VS_FF_PRIVATEBUILD) - 1; } + if (dwFileFlags & VS_FF_INFOINFERRED) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_INFOINFERRED, sizeof(S_VS_FF_INFOINFERRED)); pos += sizeof(S_VS_FF_INFOINFERRED) - 1; } + if (dwFileFlags & VS_FF_SPECIALBUILD) { if (pos) { memcpy(&s[pos], " | ", 3); pos += 3; } ; memcpy(&s[pos], S_VS_FF_SPECIALBUILD, sizeof(S_VS_FF_SPECIALBUILD)); pos += sizeof(S_VS_FF_SPECIALBUILD) - 1; } + + if (!pos) memcpy(s, "0", 2); + return s; +} +/* ----- VS_VERSION.dwFileOS ----- */ +#define S_VOS_UNKNOWN "VOS_UNKNOWN" +#define S_VOS_DOS "VOS_DOS" +#define S_VOS_OS216 "VOS_OS216" +#define S_VOS_OS232 "VOS_OS232" +#define S_VOS_NT "VOS_NT" + +#define S_VOS__BASE "VOS__BASE" +#define S_VOS__WINDOWS16 "VOS__WINDOWS16" +#define S_VOS__PM16 "VOS__PM16" +#define S_VOS__PM32 "VOS__PM32" +#define S_VOS__WINDOWS32 "VOS__WINDOWS32" + +#define S_VOS_DOS_WINDOWS16 "VOS_DOS_WINDOWS16" +#define S_VOS_DOS_WINDOWS32 "VOS_DOS_WINDOWS32" +#define S_VOS_OS216_PM16 "VOS_OS216_PM16" +#define S_VOS_OS232_PM32 "VOS_OS232_PM32" +#define S_VOS_NT_WINDOWS32 "VOS_NT_WINDOWS32" + +char* showFileOS(DWORD dwFileOS) +{ + switch(dwFileOS) { + case VOS_UNKNOWN: return S_VOS_UNKNOWN; + case VOS_DOS: return S_VOS_DOS; + case VOS_OS216: return S_VOS_OS216; + case VOS_OS232: return S_VOS_OS232; + case VOS_NT: return S_VOS_NT; + +// case VOS__BASE: return S_VOS__BASE; + case VOS__WINDOWS16:return S_VOS__WINDOWS16; + case VOS__PM16: return S_VOS__PM16; + case VOS__PM32: return S_VOS__PM32; + case VOS__WINDOWS32:return S_VOS__WINDOWS32; + + case VOS_DOS_WINDOWS16: return S_VOS_DOS_WINDOWS16; + case VOS_DOS_WINDOWS32: return S_VOS_DOS_WINDOWS32; + case VOS_OS216_PM16: return S_VOS_OS216_PM16; + case VOS_OS232_PM32: return S_VOS_OS232_PM32; + case VOS_NT_WINDOWS32: return S_VOS_NT_WINDOWS32; + + default: return "Unknown FileOS"; + } +} +/* ----- VS_VERSION.dwFileType ----- */ +#define S_VFT_UNKNOWN "VFT_UNKNOWN" +#define S_VFT_APP "VFT_APP" +#define S_VFT_DLL "VFT_DLL" +#define S_VFT_DRV "VFT_DRV" +#define S_VFT_FONT "VFT_FONT" +#define S_VFT_VXD "VFT_VXD" +#define S_VFT_STATIC_LIB "VFT_STATIC_LIB" + +char* showFileType(DWORD dwFileType) +{ + switch(dwFileType) { + case VFT_UNKNOWN: return S_VFT_UNKNOWN; + case VFT_APP: return S_VFT_APP; + case VFT_DLL: return S_VFT_DLL; + case VFT_DRV: return S_VFT_DRV; + case VFT_FONT: return S_VFT_FONT; + case VFT_VXD: return S_VFT_VXD; + case VFT_STATIC_LIB:return S_VFT_STATIC_LIB; + default: return "Unknown FileType"; + } +} +/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_DRV ----- */ +#define S_VFT2_UNKNOWN "VFT2_UNKNOWN" +#define S_VFT2_DRV_PRINTER "VFT2_DRV_PRINTER" +#define S_VFT2_DRV_KEYBOARD "VFT2_DRV_KEYBOARD" +#define S_VFT2_DRV_LANGUAGE "VFT2_DRV_LANGUAGE" +#define S_VFT2_DRV_DISPLAY "VFT2_DRV_DISPLAY" +#define S_VFT2_DRV_MOUSE "VFT2_DRV_MOUSE" +#define S_VFT2_DRV_NETWORK "VFT2_DRV_NETWORK" +#define S_VFT2_DRV_SYSTEM "VFT2_DRV_SYSTEM" +#define S_VFT2_DRV_INSTALLABLE "VFT2_DRV_INSTALLABLE" +#define S_VFT2_DRV_SOUND "VFT2_DRV_SOUND" +#define S_VFT2_DRV_COMM "VFT2_DRV_COMM" +#define S_VFT2_DRV_INPUTMETHOD "VFT2_DRV_INPUTMETHOD" + +/* ----- VS_VERSION.dwFileSubtype for VFT_WINDOWS_FONT ----- */ +#define S_VFT2_FONT_RASTER "VFT2_FONT_RASTER" +#define S_VFT2_FONT_VECTOR "VFT2_FONT_VECTOR" +#define S_VFT2_FONT_TRUETYPE "VFT2_FONT_TRUETYPE" + +char* showFileSubtype(DWORD dwFileType, DWORD dwFileSubtype) +{ + static char s[50]; + switch(dwFileType) { + case VFT_DRV: + switch(dwFileSubtype) { + case VFT2_UNKNOWN: return "FileSubtype: " S_VFT2_UNKNOWN; + case VFT2_DRV_PRINTER: return "FileSubtype: " S_VFT2_DRV_PRINTER; + case VFT2_DRV_KEYBOARD: return "FileSubtype: " S_VFT2_DRV_KEYBOARD; + case VFT2_DRV_LANGUAGE: return "FileSubtype: " S_VFT2_DRV_LANGUAGE; + case VFT2_DRV_DISPLAY: return "FileSubtype: " S_VFT2_DRV_DISPLAY; + case VFT2_DRV_MOUSE: return "FileSubtype: " S_VFT2_DRV_MOUSE; + case VFT2_DRV_NETWORK: return "FileSubtype: " S_VFT2_DRV_NETWORK; + case VFT2_DRV_SYSTEM: return "FileSubtype: " S_VFT2_DRV_SYSTEM; + case VFT2_DRV_INSTALLABLE:return "FileSubtype: " S_VFT2_DRV_INSTALLABLE; + case VFT2_DRV_SOUND: return "FileSubtype: " S_VFT2_DRV_SOUND; + case VFT2_DRV_COMM: return "FileSubtype: " S_VFT2_DRV_COMM; + case VFT2_DRV_INPUTMETHOD:return "FileSubtype: " S_VFT2_DRV_INPUTMETHOD; + default: s[0] = '\0'; sprintf(s, "Unknown FileSubtype: %x", dwFileSubtype); return s; + } + break; + + case VFT_FONT: + switch(dwFileSubtype) { + case VFT2_FONT_RASTER: return "FileSubtype: " S_VFT2_FONT_RASTER; + case VFT2_FONT_VECTOR: return "FileSubtype: " S_VFT2_FONT_VECTOR; + case VFT2_FONT_TRUETYPE:return "FileSubtype: " S_VFT2_FONT_TRUETYPE; + default: s[0] = '\0'; sprintf(s, "Unknown FileSubtype: %x", dwFileSubtype); return s; + } + break; + + default: s[0] = '\0'; if (dwFileSubtype) sprintf(s, ", FileSubtype: %x", dwFileSubtype); return s; + } +} +// ---------------------------------------------------------------------------- + +void showFIXEDFILEINFO(VS_FIXEDFILEINFO* pValue) +{ + ASSERT(VS_FFI_SIGNATURE == pValue->dwSignature); + ASSERT(VS_FFI_STRUCVERSION == pValue->dwStrucVersion); + + // dump the VS_FIXEDFILEINFO numbers + printf(" Signature: %08x\n" + , pValue->dwSignature +// , (VS_FFI_SIGNATURE == pValue->dwSignature) ? "" : " (expected " S_VS_FFI_SIGNATURE + ); + printf(" StrucVersion: %d.%d\n" + , pValue->dwStrucVersion >> 16, pValue->dwStrucVersion & 0xFFFF); + printf(" FileVersion: %d.%d.%d.%d\n" + , pValue->dwFileVersionMS >> 16, pValue->dwFileVersionMS & 0xFFFF + , pValue->dwFileVersionLS >> 16, pValue->dwFileVersionLS & 0xFFFF); + printf(" ProductVersion: %d.%d.%d.%d\n" + , pValue->dwProductVersionMS >> 16, pValue->dwProductVersionMS & 0xFFFF + , pValue->dwProductVersionLS >> 16, pValue->dwProductVersionLS & 0xFFFF); + printf(" FileFlagsMask: %s%x\n" + , pValue->dwFileFlagsMask ? "0x" : "" + , pValue->dwFileFlagsMask); + if (pValue->dwFileFlags) + printf(" FileFlags: 0x%x (%s)\n" + , pValue->dwFileFlags + , showFileFlags(pValue->dwFileFlags)); + else + printf(" FileFlags: 0\n"); + printf(" FileOS: %s\n" + , showFileOS(pValue->dwFileOS)); + printf(" FileType: %s%s\n" //FileSubtype + , showFileType(pValue->dwFileType) + , showFileSubtype(pValue->dwFileType, pValue->dwFileSubtype)); + printf(" FileDate: %x.%x\n" + , pValue->dwFileDateMS, pValue->dwFileDateLS); +} +// ---------------------------------------------------------------------------- + +struct VS_VERSIONINFO { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding1[1]; + VS_FIXEDFILEINFO Value; + WORD Padding2[1]; + WORD Children[1]; +}; + +struct String { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding[1]; + WORD Value[1]; +}; + +struct StringTable { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding[1]; + String Children[1]; +}; + +struct StringFileInfo { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding[1]; + StringTable Children[1]; +}; + +struct Var { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding[1]; + DWORD Value[1]; +}; + +struct VarFileInfo { + WORD wLength; + WORD wValueLength; + WORD wType; + WCHAR szKey[1]; + WORD Padding[1]; + Var Children[1]; +}; + +// ---------------------------------------------------------------------------- + +int showVer(void* pVer, DWORD size) +{ + // Interpret the VS_VERSIONINFO header pseudo-struct + VS_VERSIONINFO* pVS = (VS_VERSIONINFO*)pVer; +#define roundoffs(a,b,r) (((byte*)(b) - (byte*)(a) + ((r)-1)) & ~((r)-1)) +#define roundpos(b, a, r) (((byte*)(a))+roundoffs(a,b,r)) +// byte* nEndRaw = roundpos((((byte*)pVer) + size), pVer, 4); +// byte* nEndNamed = roundpos((((byte*) pVS) + pVS->wLength), pVS, 4); +// ASSERT(nEndRaw == nEndNamed); // size reported from GetFileVersionInfoSize is much padded for some reason... + + ASSERT(!wcscmp(pVS->szKey, L"VS_VERSION_INFO")); + printf(" (type:%d)\n", pVS->wType); + byte* pVt = (byte*) &pVS->szKey[wcslen(pVS->szKey)+1]; + VS_FIXEDFILEINFO* pValue = (VS_FIXEDFILEINFO*) roundpos(pVt, pVS, 4); + if (pVS->wValueLength) { + showFIXEDFILEINFO(pValue); // Show the 'Value' element + } + // Iterate over the 'Children' elements of VS_VERSIONINFO (either StringFileInfo or VarFileInfo) + StringFileInfo* pSFI = (StringFileInfo*) roundpos(((byte*)pValue) + pVS->wValueLength, pValue, 4); + for ( ; ((byte*) pSFI) < (((byte*) pVS) + pVS->wLength); pSFI = (StringFileInfo*)roundpos((((byte*) pSFI) + pSFI->wLength), pSFI, 4)) { // StringFileInfo / VarFileInfo + if (!wcscmp(pSFI->szKey, L"StringFileInfo")) { + // The current child is a StringFileInfo element + ASSERT(1 == pSFI->wType); + ASSERT(!pSFI->wValueLength); + // Iterate through the StringTable elements of StringFileInfo + StringTable* pST = (StringTable*) roundpos(&pSFI->szKey[wcslen(pSFI->szKey)+1], pSFI, 4); + for ( ; ((byte*) pST) < (((byte*) pSFI) + pSFI->wLength); pST = (StringTable*)roundpos((((byte*) pST) + pST->wLength), pST, 4)) { + printf(" LangID: %S\n", pST->szKey); + ASSERT(!pST->wValueLength); + // Iterate through the String elements of StringTable + String* pS = (String*) roundpos(&pST->szKey[wcslen(pST->szKey)+1], pST, 4); + for ( ; ((byte*) pS) < (((byte*) pST) + pST->wLength); pS = (String*) roundpos((((byte*) pS) + pS->wLength), pS, 4)) { + wchar_t* psVal = (wchar_t*) roundpos(&pS->szKey[wcslen(pS->szKey)+1], pS, 4); + printf(" %-18S: %.*S\n", pS->szKey, pS->wValueLength, psVal); // print : + } + } + } + else { + // The current child is a VarFileInfo element + ASSERT(1 == pSFI->wType); // ?? it just seems to be this way... + VarFileInfo* pVFI = (VarFileInfo*) pSFI; + ASSERT(!wcscmp(pVFI->szKey, L"VarFileInfo")); + ASSERT(!pVFI->wValueLength); + // Iterate through the Var elements of VarFileInfo (there should be only one, but just in case...) + Var* pV = (Var*) roundpos(&pVFI->szKey[wcslen(pVFI->szKey)+1], pVFI, 4); + for ( ; ((byte*) pV) < (((byte*) pVFI) + pVFI->wLength); pV = (Var*)roundpos((((byte*) pV) + pV->wLength), pV, 4)) { + printf(" %S: ", pV->szKey); + // Iterate through the array of pairs of 16-bit language ID values that make up the standard 'Translation' VarFileInfo element. + WORD* pwV = (WORD*) roundpos(&pV->szKey[wcslen(pV->szKey)+1], pV, 4); + for (WORD* wpos = pwV ; ((byte*) wpos) < (((byte*) pwV) + pV->wValueLength); wpos+=2) { + printf("%04x%04x ", (int)*wpos++, (int)(*(wpos+1))); + } + printf("\n"); + } + } + } + ASSERT((byte*) pSFI == roundpos((((byte*) pVS) + pVS->wLength), pVS, 4)); + return pValue->dwFileVersionMS; // !!! return major version number +} +// ---------------------------------------------------------------------------- + +int wmain(int argc, wchar_t *argv[], wchar_t *envp[]) +// Prints out the version info of the file named in argv[1], and returns the major version number as the exit code +{ + if (argc <= 1) return usage(); + + wchar_t* sfnFile = argv[1]; + DWORD dummy; + DWORD size = GetFileVersionInfoSizeW(sfnFile, &dummy); + if (!size) return error(sfnFile); + void* pVer = _alloca(size); memset(pVer, 0, size); + if (0 == GetFileVersionInfoW(sfnFile, 0, size, pVer)) return error(sfnFile); +#if HDUMP + printf("VERSIONINFO dump for file \"%S\":\n", sfnFile); + hdump((byte*) pVer, size, 0, 0); +#endif // HDUMP + printf("VERSIONINFO for file \"%S\": ", sfnFile); + return showVer(pVer, size); +} +// ---------------------------------------------------------------------------- + diff --git a/libexec/ShowVer/ShowVer.dsp b/libexec/ShowVer/ShowVer.dsp new file mode 100644 index 0000000..444a0f9 --- /dev/null +++ b/libexec/ShowVer/ShowVer.dsp @@ -0,0 +1,112 @@ +# Microsoft Developer Studio Project File - Name="ShowVer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=ShowVer - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "ShowVer.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "ShowVer.mak" CFG="ShowVer - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ShowVer - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ShowVer - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ShowVer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 Version.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "ShowVer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" /FR /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 Version.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "ShowVer - Win32 Release" +# Name "ShowVer - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ShowVer.cpp +# End Source File +# Begin Source File + +SOURCE=.\ShowVer.rc +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/libexec/ShowVer/ShowVer.rc b/libexec/ShowVer/ShowVer.rc new file mode 100644 index 0000000..1d68c8b --- /dev/null +++ b/libexec/ShowVer/ShowVer.rc @@ -0,0 +1,110 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,0,0,1 + PRODUCTVERSION 1,0,0,1 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "AuthorName", "Ted Peck\0" + VALUE "Comments", "\0" + VALUE "CompanyName", "\0" + VALUE "FileDescription", "ShowVer console app for VersionInfo display\0" + VALUE "FileVersion", "1, 0, 0, 1\0" + VALUE "InternalName", "ShowVer\0" + VALUE "LegalCopyright", "Copyright © 2002\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "ShowVer.exe\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "ShowVer\0" + VALUE "ProductVersion", "1, 0, 0, 1\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/libexec/UnRAR.exe b/libexec/UnRAR.exe new file mode 100644 index 0000000000000000000000000000000000000000..46c0fdf0b3beb0dc19536e53fd0ecf06767fc4df GIT binary patch literal 297984 zcmeFadtekrwg=qvNHV}c4-hb5gs3A%gBqFW1`~A95O6QTBq0-aK~TgvW?jTE!^;R0 zdtRMR2iQ#l?s`#I-K*;h6#^*4gkTaLLI598)WyfHH4G|IHS0_xs%uiy9A z7wGPKo;r2v)TvWdr)qBb?MlHQ2!at$G%5(2@TEUHfB);(QA7_I`N{xceV;cj+@zcQ z#)Z>dcP~hrUw-dh<+uMn?T*{$&AZo~Hs{W?a?iZ9yXU3lO)X0M{k?PVyt04)zSbD% zhYI!o{J?h4hWK+^#iz8t)BIa_ z_Z=>R^;4KTCJ4f0U4roXZ~t5nPjg7n>-y>X2*OfOqEyd=bKk|+0_RGij$LyjD1pcJ zd<9FQMm&TY1bZb4)?-1ZQ3Hbfg-<9q=7rPPp@)FdC@S?g>qxbqt16Eg-&%ND!yC8h!Km^sj5Z`4) zgPuP-2y&&COfb&V3Bpmtry#!L2kDxwEMHK52cmdgQD{piGdC$E_XuS;a zpn-5XzH`n-&@Ko!BJ}_N`voab7IhUbzDbz-7{PQDI3Iho>n6dr-J#}L&2t~8K;@Y1 zwwlzM+pZFXwmfSxwH@=Db%I*+{l$XNiXc7naQ_-G0r_?8PVS#%*8Bqd#~MLUr`Rcf z6o2e3_?5{hLhesx{AQN4-O{off66qg$<`#D(v{zbc%yf0p~oeiGL{ebF40Z!Bzu?W zmw5(wml$SwOq;-Y!Zwp2ok}XtL-g&Q>k(b<$wu^ro-y7f#^IjP-X#f1o>5gdC;E0E z2XzqS@SfDcLlxm3y(eK4aT+|kl~oTv57cyu-BczNDy!DOR~YT!xDkHd&Ceo4Q1Yxs zcdF9y?fx63k43{aY4f89Hh2=HCd)RXAT^orru0S1OsmORqEuLuLDFQ0a;&6Ctw}Ed z4Vx$F1YeW8FJL9lo;3rdmlP>`SlKZ_(7f^d=3?a@tC<5yEm4jY6~_Rq%O?Pyz9mJ) z$T#RX<-2vpHZw1nGUHD=Vsa|SP_)qz%T;CP#rCHv5Vb*iQw#EMJ0b|&t!0e86`jAy zo#bGiKk0?vfC`ig0Co9BWr{IpifQ4UO1>FMF3f3Pc!9&!@rRoPm*u%Ufh~Ae5Txzq z&D=BeX^<@6q_j7O^+n1oqnf8nE6M3xq*pqXL^b*RLI?W`3Q)R$i$Ch=tK~ZMlpx60 z&z5JIX3UC_^M~cn`HAw6KhvxHdO-TA@`n}`vP*tg_#Hn|IA{Wj8P)M=rHZLEr>`fy z)W5?$q*R%tFU|S2-ZM;UGD_Qw2=shtYqIU|H;J{)Rn5Tt{3fY0+B+alWY7|PZjuLp z^& zrwVIInNFQ-O=0I#(Qts!$%@;WrB2j^W)6(z4PJ zT0TQmqUzA2X{9E#=Pu7T8Qb=C^)5L2eXQV~dfd92*JGUyg;?X#jJlz;J(YMC^jr4t z$X8pF9H5qx16KY{=kL*Yt2LSA2AXW|Me7k+F&GLT?AoR%h6@W+a8I-b$&vG2fnsDN471AiXsjZ|Q& zRH^wW$tlHdEGPt|4u$zY7i%6u;R>;8syBCRp=uoK`L*&^#yf=$kn7r$(J1=d*lvtG z*Z8B$u9m(_ePFb7dgQW8!9b}QEmBjeH@na?$h%lq+?N{-o=LL?xcx1rz@U_ zj8%q~394~q8Q6j-=umDnaRg!&)w>g{jPmg|UsP7z^E2CBVns z8X9i_m;{}pfSL`Nx~`#2o;SUX8;FgnW?Cn^O}>MoFMy(y8lEvxspnZ~*w$Lf+qj-m zyGObzs46z9iaKRP0qdhxg#b(d0B_@mz*VTKe;=Pv{a=yEoi8u6N3OL-66mIX1Ht!T9m)DjKqd9|Kj3AYUSrR<>=BdS3Xq{-7DDL=|0vWPwm zR6-<4eZq>bpah7X)IN(gr~mOLK@F^d7%WvRr8xsVBTD`IX}E%r%PG)%L>jJ|Fw-o__Utl;kBZKU!A_i#0T zM8;9I{xE#vMpLP5)|1%A(0hyvna`a+$+CV~57Lz?Wf9!1bu zLegh7U8ECYa&n6`1s>&?w~n9h(HSc&Ye8N2v~jTcpCKKI zP%ChF)Lo>el2xuA%9 zsO!u{)413PfFnQ!h&APaLUr@>$d0iA18lX`j3D4fEv;vVzXr61da4d)1hH7O>16aP zP|kr5{UQBaa=0_7p+Sc@iswPqgF0) zi;k6#*K-_WL=srRSJ5btPC=oRf|`qc@J%#|7P|&y=hF+sk1pUuSTGfAN;*`YHNDW` zhz`kyY7S4bJ!c}RQWK5JUI)A4Yp&72ga4wT$pPufT&tjpPeVsdQYKropu`tKb$a|m zz)R}UkI>OH{iqkTzaNi5JGU->wVzWL|FLLPT5beI#nmlgCzwIL$2uBMCY~%j+2Y1~ ztjWcwN+vS_NpR~->u3x(#bDT2+Zbq^<6X=>ySS(<%3ix)5Wejw9jg)gzcfN$=Zy<~ z%R)|Q|3P=3BKCyJheO^IXq@jEbI$D!ooH2cg045&PM|5Eflj31k1#An#W{X?*36=! z*1VLc5FL_B1Q&}7ir8Hr#Av5PW7_49QSY%hPz^zYhF~|9A~t0Ndk(8j&@gV|YJiIb zJi1FeSPbL11p<>z2Cbl|8DG{#^kWVdQ|qGRFYmYEi)d;HBQO5?LQ-2hN%fq{YN!B@LFggV}4Q+>Snd8)TvdPxtgdoo2NZB49MT z=M*UCwpxJm6*NgM8}4MEDAY72OcW9`TK9D+U9L=2lvUnG&1WoevegR&A?LWekCT1K zlNwRQw4OSU?j4^XLEdlf!MC93ENqkG$}eQMh24jSwjES!xB`wjOj}|W6?Qdy0?SIN5^2(;w6hPBF}1;9DsyF|%3BBO zmf1u3sZu+NX@XELDrn~rw3ZaE&{|TYfnBx^}Uk=K%5Ag?7wMGgoQ8!+;>32$~0 z__r)et*7NqOtA-Zc1|JOvq26ykjvk8{?6m?N&HQ6RSu9?l>^i8E|mi`#>;El`MZO^ z-{kL3{(hgo5ApY>c!$=u@;Bpe(!luaDETY~p;a21|AIe^OS}2`r`Nxfz?#+C`WI1F z)0%IWH4ze+4qZnJnxX~8xMAv5#0@dl!K&DbBg75FUue{1f$jCvI0q$1TNJzPeRzL- z8b_$|Kg`zIBuM@fn5XNg2V8?rie3?4F#vNJomgdJ21pakmooT_?L9LZ#5|^3Au)i+_#1gh? zK6Ol}v}^>r(CjfylxLleFJTbAn?69jYKUcWb}qlDqOVdzOqA2UXsD*V=j^PwYI$Ex zfzRn!c(Kbg0Kgw4;C${eox?Yk>9l2`o9lpTynj1gOMwXrDWc?D$GI$)+`yB!28erg zY_OI~tDoynC;^#9beHkPc4;}r3tDt z%{{Z^H7I$Qzlt06rBc^Sk2sdEU_xP^jqu1-2)r)txd@)C+~@Ih!!-Chw?)g~Hf@@T z45hMO+6GA137+T9s&EkqR-!a+foL-DIjQZSHfHNFZ4KYdA+>MBrh}0p4Ec>oYB*tE03gO656BN zTjA@ye&w@fBP2cwkoK6&E}wvgtS4^O)OB0b)|AsBZ?W2uR9x{gYFjZt32+u}7K4w& zkJ&fnTsfY)J4sEXSPHuYQ#Uv)?4BDnhq$qe+2OYBH#8Ecs`kOWOz%fJ zZ9Y`h(RA40{a6>O;o`fVM0r&^Lc{uw!$^gwCT6tii4LG$0a^WRWzy`#ylLM0}MU*Op6mlR02`4vJxsA74Lqc&zu?tU%K3X5ZmvrU!kjx=^46 zXl(+rf>_rSs-a1#QbTop{QPyxc6zBoLuCPDe>4P|R~3?2ZFx%Lg5o5AP7K zaiQ@_x6qIgC{hM-U|~UIjqnjPCyb`v_b2k2V+BsQmyre*rp7YF%d$22FlYJ z0a95VTH6-&Zsp4;=!>;TA^O%*Wz}`4mQqI@78^&+NrT&RI>c%TQ5aMFS~p#|NbwVu zy_?bs5P{M6Je?;aAcElPftfZCDT$wUUI$6^crwm*5Wo08VgJHdEmR zkP#b5A0XBJ_A2loR=l}1No6-;0ckAOCEX8m*0NnsosD`=id^?7x^=669p2DSk&Z&e zhNEl%Pt+v)pF&hK8(`&Y>LH$z9YaENSK0q8BIONF;EmPU1^IjgWrG*c_&EV<1Ys8q zg{HFD`03Zi&jTu`z-uY`MnVB`usPm%P1g=Uj#gDVV_I}g)VjfvV;9=|1fRr2Z&a#B z0UE&dX*3Es%G-J{X9U?#9ItR3)Jajfj&xM%V&HU?r_c@!Z-;yfdl;CIyHxhSiPUU2{8ef@oDf7Im1MWV zy~@63O`g}0BqtwAL-uYOM*}KcLGePj(9$&&C|bh>{cqmW2Ch@zF;2m zlOm5DqJ8^V^I?;f28HIZkxKT{LQ$xWtN1FZ_~DLz)ZTirwk0&vdV{)w#sJ?zPolbk zrYFRJO-BLDPrM~3###hBBz2q$PLrbX4Yr6>Vmx_@1v_e0P7}&h+V_R2(E1QqIaDL# zt#n|s@36i(+!ygYPT_GY@%9~b_j?K&%Vy3VdfSdr%^@D_IXhVCsQma4xWjwuP^jiG zQee&$sv#}Mx5I6;?T?7Gp_m|jl=KR*+JTSBYd~SmtY4_+W2DpgU#|ZY?oi+pyjez$ z)?jjeG8-9p=UKDaOV?=;q5PD#z->s%N5t=Ap>kj@<^DYG#bPY;cIOzz+;ET1Bu)tB z4`%`R;+=Jx)y^8=_cjs*1UWwy11VhYNn*p4VN&yP>16*!W5AQ2YCQQS^_~Ewi1i-s zj`beyHUJE*t5X^y+*MP6G1vNtSSJncLEe)ISad#_xL}aX)j>*42?(OxcoZ%q^IS{> z7LH!#5VWg-EmTioWjfk}Dq>$j zyeLzWZ3oMAMTX|0!3Rp@z$C=W^^@^t2M~>c5iK`(pB!-Th-r9d*ANi*z)g@*%VQA% ziop7eUHPu^yXZ(7xnHACiCSx|Hep2tSf{Z{YNQJ54Oq&{4IvZ*%&T~Rn{OgkaNmJM zli270#&w^S;#G%EiB_5Huq-&4u}xh@J4)F(EuJB+XcEDOq(>?T8~X+(?N@V+z+RHk zS)^7QYY|a^!q?zSh0kPPV=5Ri0|+L_08=U_X(~juwHi23S^`$cDmLge<$@0-wTQ!h zs0rE$sTyWysiElW9C=JB2v=XexQT76W&SUTHgz%hY&Hz26NE%fSOyo955tIL* zSVQ`)T9XEX6|s?B7}@H%TO-jdG^;C5TXp*C5X}cg--F1Y@V!g1VNyS_!O<7i56vH$ z3_Ic0i46jG)2kgT{wl2#D0TF95n0>(v}8bkib^i*-=18i7i2$AH$jl=D3mtkFybma zH`c#+CM-%0Sg%7;T5gC}V-UvZ`c=SQL-@ID)D?Xd#t)eYWVg2Jcv84U9}V#!ehPc% zT0Sz8E~}D0sMgKL8*A~Cuv$FXwja9!UP`Ny3DqWyAQb07+%!CPs6BZ-`!5gkq)J8Y zq^kAV7|pZJmp(CI zdXBd=uq|^_*iN)^_gaMOA(#tQ>-1>mC4nUpm5G~ux$WH zRmV!MU1G)?rLOPe*orHP(K|46%~tBEOX=$Pa2cSEHPBCEWfd2np=zx%wfsXAO=Zvg ziqmRrBI=buy;YlK$Fzj!z{co9=V2d^jJ--+%V?coV;Sid(6g9&8|fD2@J)#Pk+HUp zmWE>Et)CW%VneRVmx=25GLfH_iK=)AjVmgx5h>go9|$q(82DI7@&01Ohw7a4R!i{4 zN~6fBcp*09WIru8dACvoIO19K1RnP~*73Nm#MhzxwDc5Sfk2fv_J@+gT6pp7A!aB5BX_>fnCw&E6N`S-w&^1gyQ{3wPQ zMI~)OsUz)7;hLDNZb77`d&zZ8_}d8c%H_mTI8 zZts5bu7nqA6rACUsc^1}oK5RmM8;{ohTJh)KMc3*f0W+p6L@o4+hgFN4kL)|gHZs5 zhy2fy_v4rs^?jcFgOD1+qi#JsTzJU-brfEPHbC9s)N!p++{n`p+)DkV`B0ySG+Cty zs&E-(+7GFwZkP@RgOLx{S!E}*Do!+*+)U9_NvDOa0zz65T7%t#ELth-+8$izBa|h= zAM%&O32Z1NfwqIBt^_d%;}>YQ{;x^1-TF1K-kb#1KK>-9$QM_4x3>lMQS3wbH`8zr zA`C)6=~$J*%gwKlY%G=Q$XA-v+!H{lP$q>tR5ckNTHr`yd7z%Sv5uk(Re$oc6iwly zc{qpK>bs26$CI`CE~jKd7y<>TCO>yJs!|M9*`J9R=7v}HXTcdx;_0)`Nng~Rej26! zG&A1V)5-f*xA!;X9mS!|gfqMuD5zU+gR?iG61t&PQ2P4r>|XK)ySd!kW4<0XKotHJB;XSM`mpbBXunieN;oKYoX{{#~lftyS!UT918APG`XJ47Qc(Z z02ACBG00+Tjpo)mSh;uvi6xZ@(tEIjbei~-_hnrpaT9b5>+4*SVvkAsLg)Dca3;mF zVm}@5pf~27GlN{UJT^ACFIPP8Tjr7-tKFbzI#nHsth612VFPSMv7LCTaAWma;=yQ1$jMl{>!Id6$8j>A=f z4L^u4xC~?lk&X%JRLVFnIb&W5c0n=AL@+n4@OWr#U_R_t?osxHCXQgEC}HP`7M(i- z*-~QVxko@FN>*gz6+=5XBU$kh9}V6nPfe32T2Hj--IpRgyF$Ycwt|%YA)dZdsf?wa zoheVuLQER=$T5L-_kned=+6M6e3ecNroma>M>?4#28Y0@j)x>p6oY->h9q7y-cG9v z5(@D*EgYmyO)CJf6juHjwDf<_IJbwDBC@JuAH!VPsza4lzX(k%6nq75HheTBLqn4s zd>=lkD`jDS!cv`>=3rL=M43fhLHaH&n!g4x@UMOhepsrp7vT54MzEmUJcc*Mw-;W5 zm+XcAK#5_AYfUAKH6MKF#G?z?pB|%euo#P)S%qxeUlHuHK8(C1&oc|yL4*+gN-Yn~ z+3CJkYXwGQyWQq-Miw&=5Z1ao~8>+3eJSR5fS%+sddxnS&wbn;s0p}wHtzslL zca4C@k+Io$ez(h;>WKX+X}ZPVXnWP@Z-0Q+n(+@4-665O#hBs*B34 z(B=mlF;^SJ@)1}V4_ksTY_|m{jig}rqXHYB;51SCn1MOeW%STx$?1gwf zI}m2a8gxSVQw$629fVVHJh(5ihTlLi)dLd*UJsr4;45&V9yurmpDcXH`0ELTIxstY z6xDZ4#>}knm1IsfTI|rV2LOy%7jjjb4ElIVEI-oHbOHPCr%~8#8sv|F1yY0W6+bK+VF=yB7){uNkMU2`= zo8_1dzXf8`hD#dz4yT%wz)U2eUJ6qdSg;Vv^v9;`MK3t$DIL3ZH(*s&D%p;SM0F0Fn+MP@1Ex4@wSiran+Zd1*y?6a=eMPd;S=+1u=8pP~)D zjRv40xQn$N;Mit@`vq^KiHGBmOdmL~xw1p8x4~7Y)?ZE^rGA>`8%Cc3ZQnr&7~zA# z6`=nU)m3UbQJ(rdy)5`hTt}-0jejNq@e%pVgueIt z6%Jw^b4)K}UJvSovCO|i^xXxse>U=C42ieGb#4=t4%fq=ATmsAQCBy>>p4JJB`eid z&eUh?cf|VWSiZZcW2L}DCw$KSL;v}%SN~~B1H#$ph&_A8)IZPZKW`$a_oi_w`(_le z2j86nYrT(n`V)Og#O|8aC*O{v9V*jc>?e!Wv@1({bJ`A-7nBycBm|(e~yVzNP)OV)Ke4%8$Zob z0pfcL0t(eYDx$mhq!QFd+LPj(x%*z?nq))^P}>8e2}~^qvl(!Oj1FbAB`000-0s)HKCslW5Hh z;~T!}^k?0L6-xx zh{3)`=}JA{Z3@uF26l?Ay0Om_A|Z|-_KD?2zTs0(yHU^<&clk)V$gim2hg_8HY#Z> zrxkMdZ@EbfpU>+33B$8rz|q& zw3QD6=I^|(O^k9{!nbpnw$C-FdN*yar?7v5gcy$xD*>uGjakV%u&0K7XW~w6ui4Nt z_zi8pS>dFV`K~i|*U;c%a3z#AY^YUFv4gyP(TFEfYWVIEHv&`YIavcn@DMDQQIK3? zf?KXP6ITHbIbeZ{O$Rnml`Ukg4^(aj_Tk3?pQDgahnHLo^{o|Al{NuH`LIh9!07oeTep>0K0wbOEGFKZK}9Z_K;ZCi44lelFG?NPP{Xy*|h z+FH~>ogT;=XD#5#0a`7k9VhzIU)*-zA~o`$AD#-(Sht^#6CEby2Gm8PV+oNqjhb@~ z?9alNAx3SatxKATC8~|IcgY2nf$Gl%ikzg>@D4r|b>{3>V$v8}o@jeNK?j@)4}j_l` z8Ik%M(-G z=W*)J9}$~&@Ttm6e}hTHK`oI{euU;g?qQTpn-5{&!TK?B$U&MU@e&^4s{Kg>YRY#~ zRg3rIBy0vFSEyuoXyP#TJ|ekyBKGqrA@9J=;Y4DN6%3H7rb4W?1&_cRKB)&p;9QaslSV1$zZ{IzChxAc`y!umk3SQybOd6|39b0{=9fT|2w^L{1;G)mk3BQ9adl3}Sm=nX2CKKEPO331e z^W>f{aDIqt;tK3-G(7C!^&5FhgMGl zw1I#|u(YMOJPnSmNvXDSed%n~jI=7KX5m{&HKPTj7A4wrvt4-k*VHdRo(5&ubG)}|_ z1dSM5E{$29aw{rM8-9E&r=G?;PMgQy!T{Jbi_Sdv{v%CLIc7V^?w}pCE^O2w0th4@*v1ox#kooHF^Nnn;op_n{RT7>%oAn;f-a_nK3$1-|$!M@7YGy|4WFo2|k z+hmap19jyjOGFxw@eb@+Ta*==RZN0=nuJaJamoR8#Tw#-Kcl5_PUq^ja(b zx(_G2%IRcRvvv^q1WtDCz{##1(z{U{RZhl0F`UrY%N~a=g0o(a*_!CExn>NFiWVzJ zq)(4ZN2VzgOva{mHDO; zB^##wDa!QZQgPlsJn!N80?)SyPE)3vOU30FK;cPOrW;GeIfwBa2lNXBK!^LAQt?bH zp6!6xj&Q&z-v<=RzryRworrlCAm&;f@O=U>Ss)WizxPcf`5J|m??(||!Z+^|#H8UH z!8aY>#Jc1fp7kiKLS>^G987^|6~eYJH{d)6UACl>;ZgJ@jZxdb_^XLKJQ)i_CF$f6TkwMc?@4F?khwb9E;bdpa?JQXis6h7;wnXss<`H z&uz`bn`|Xe65vq<;?1X30>u2!Dgj*Q;h-Yk5kj5n^ldNnL3fa2POnM;4Ycc7RiVb< z&GNst2>5Q^i5T*|TH!xKJx+f@p6E~P21Mt9je4~Kq27yDKZUr)9{+-!I*}q1(7W(O zeYIZxOI3whfmjK&=2am&9fhA7oC-wq^0v{~>R(mq-|ZblFzTlyu#QnFsLDBP^&huN z5B2A@pcr(!vnoZEq)Jhj|0SwIEkkWjRRW+Wku^1<%P}stUdP3o%zO8WA`1R-*>#kzF)AK)#&SXZ~FVqiRq~$B9KO9sQ-M z5^oLS;4mI=E^+YxttEgkSoNGygsMU9+$~_>Cnh82LijJkT=AA68d0-ThvbZfdj4`< zKF(Ow_S9df3RD#c{$HjV@m4{n>uCv2Ibwu3%bh}T;If|-%0Gv}sQsyBs8(E30cZU1d<2}b34c?=P5y6PHNijYcYk6v&-s0sy*1qDBKh9#D z1;8CEG_3CJ z1n2zh84DFabR+Ji>VRIHZoE3+zW=KT=;``lYHwc1Zs>*r3wsIN5B z&KkaPnt{ds%~m<5`%~8kqE;Y@7UpwGnoe?+fX^xaj#7wVxk^Y|FQCpp@9=DDq**iY zK9{TicdnV$T?v1VCrf$eU1_A23~iRuc4O+WHxA9vl2&G>2`0VfzIu{LX`nJI_X=s)x%$j< z^)fTIQ_nhYTY1Eb6nvGc3#*ics@v+c?Z|jXotT*MEo{TYhQ+7FhUwooe`Yd#2gi4D z$ElbjMXsoJAeAm25sf>}#2rQ?nT8|@@c={Ip^rOEa;_dJ`o#T7aYrI|$hnEMLe*rE zPFlnVU9=*$-dYR9wVLAgAFLkX-n+#{n5?J3`X5UoSgc8bFBQvAiaiyp7dRbBjf1Fk zB?XsrT|-1AV|?tQ5~xfHBT`nLAPQF=rxrl`J~Vtst3}vQO}3pvAIxgrYcjlJ`wAeDbY(>hWb>XRI@|$t(+%&S4px+&V)#mV z8>LLrpnnJG*?|5)9Qt0f;qL}o5*v*SDK-*A+0A=QhPQ2}03AtJE<;ixh~lnwH1DMn z(vbm;V0fFF0-o!H!D6X-BI-65HNEJHnf8AY_oCClzp~bn#TwuIVVpN8r$| zpbrruh1wUT_+zDLO$~0Rb~tSNrg=}iS+kHM#dZo!s=R}YX@``B)|Xg(6A2aD8&`{( zP*s)~ZNzOA$g;#34>Q4^f+t&EVv2{E;ZMbrD=#s}!z{K_2(imcEU}ORqOf%~ky$QC zjt8btpzUqBAVu*~@yeuB8;m|@;gxr*JSlZX<#sQE&lcX0-`ahuphdF(gc#U}B*i6> zzOl{<`KCw$iT6K}ASY?Mm7ruWLr2ax3zrn*bkV_I>jm92Jdwm@yI@x|$9A)nZ9jj< zx9{pE8KrS6ZSk=MR3UkS#s(Hz9{6Sq`d1?7GRI% zeq-es+JG(pmBy>O3K0RY2q;eyQ&v!nVkonhIM_~HT3Y!91yr{2H_x_U2ey5HGx~^; z{SVk6*3+aT_fQve(>B+ugkmG*$@rE86*jx>9J}5c0$-HRgz)ge;e>(bNUCH3s|1UH zIh2U{Dg|IbO##{hkSJyofP~a$uY8@?4n0Qa`AoN-L%2+XNXe0!Uj6pKp3SQg>QO4RoG*n6y&g%wKI-BBtFqi1LHCy9oK zd0EhgQgLj5K_M)+Ejrj}P+erFNuFhtuU|MEb@C!W2~9>hP8U!Y*fSwm1k?8BgV->O zQWcxq{qhpDvy|vzsFjQ>WngoVkjdS zAJPShX4tR8VOpgNG)PgOq85rI;{H;^C|+vloR)>jxRSKXzA#~v9Vj}AOIQtL4*L!6 zMMZt3*X>eknpW$|?}#hPx1rLON@%@cX+V7yUsz>3OPG^nRcjiZO8k;!H5)>At5&1g zwL7Y@^ZVruwDU{IpJkMX?OwIUf`(@wSHTjYCWV~uaAz7hcf*Ohj=Fbcfxpq=at=UL z0Zzd<*o;fieYO){7?XgGc8|}ADe-%JHd!)})OllX3qLc0iqLi`_!8f5v5tnTOei6y zXYaiMQZn?=U8OLw;`o#-j~&8QF~X3I=Cze%nJ4;i+LSDXk_*}P9msW5+?eQK!*&XS zcZ)S0FmZ7xjLDL0J4)pNkz6h1aKLx)^nl?10Er?OA<+mGW3beArc{}zm)dZ#Ws~RY z$5Lvc&?FJn0WgyTya_lY7qDq>^7A;?luBDTjyTP&Sz*^&Q!OxdC}H}KIA>%b7a3(! zDB0Ge7DnzUMR!QPT=~XxleiJ4Fb-A3>;Fb#V`*)9WRy;btxjX9F$7I&CM= zfbKlHZ>hb2eYOgx4NZO;1^q2M+BPMB&C1Q~F zq=_55nV=EePf(%jJdO-&@zmm3f#)GSf5jstBbexl*XBH&DMBS+N1 z=B*@8d#QACy4!;H1b1J&9d6u19?`GEg}2RM0KwglI%#Wwdk{a_ort&7Gq6-@d=@3# zNH^qC4Ry0xq$94l@Wth#-pv#&cxHJwj|Z-Tr`S6#4Mq)uXL6a*wFgqRHG%v(_5{w` zz!0}AL4^Qzr2=2aD`Sv@?ec>+wx_s0fb>GwHWs*cBO7y5dbTW$gqssv6BeY<=w=l^CmEO7{fZhII$-zZjpm!`Zg#|aqp%1xRjk6Eaa$Uv=x zY6;8XR0xOEV%)byeSoO53~DpUyT5`KagwA`VkGJ&$#1kozDgugC9?G+gWTf~kud(g zSGg(GpXhOUmze~2fSKw0~zQBY<7${g=d`FNSzf5=A)2M%HCIX zfXk+#TPR0iG&BNK#o-wzd+;?bpwCnG-o&nr#dnGq6!n#nZ@P)gX-KwsQg zL!zs|l}muj+tVZW`4|b^aYv3s4nM>GxZ}A>!X6Z|`!zmV+`ga0(`eV`} zGD8l?$e`3r$D1z4#sHW?R|YqsO_**X#9_5{G2A$2@g_3r*l8#Z2=h|>G0jaTk?bGj z&a=8`q+U+}?x{p`&!uW3iAx9u7hM`L0EMCq7nQ-2-NKW({|^7Uo^k~C%_KB8x-KxL zf*~TvzU({)`)}OXjJ_T*gG;#}esy8Dyp)<=mAVEmnkF`QcQ2$N3Wjrb+_7A3ecu6; z3Q)rz`K4qj*PlZw z3Qmm?TXY)@B7hhNQm+A*9m8Z0o)(OOV}Q|oJd5!NdYrY>>vh@(P91I_jk@;q@Z(S4 z@5wL`j|~}69g}&J+KIZn@3taH$1=H}Bp3PhERFk#YUDRC3-{B=Mt&m`;Kyafa3`?! zbd^f0^1s~fiSxG>%z{`07_z6wm=Odm9!sQYa6zXmall6KFES|+%~IF-VzAXr*7yG1 zK0C%~T=J;Tz*R}(K{UQJ|bOSxU>MBqq2?qO9@N54@dn9Ihcph z>bfwEJFUT6IQZ+}2DFSWb#~ENm zNnKaCM@wCk-6>L6vFQH{BV=2UF3{5vUY*@uJ$ZM~up6Ah3*QQN4B|_0YGj#C5Lv!^ zl*IJzArk8+`s;X}2Y4QtyX(070q(Bn?)x}^e7!nL?_kLss|ol`0u(8AIoy|*N;w(I zUe6E=uTJ(B?&-#L(XA6ry6{-!D`G7ak`x}T0l~pyn;0BPo`z6}w~6Y;r!6>*%A#uM z5vh53t&aDNdkqx(X}8x%-nZaw4L$@aqW*BB&U#Ss0YtV2r*iaPLU649L87Qb^v^;x z&}|J~RDeQDrR$MpP6B2xukma1ME^46scfU0>q|utSG32y)zH|auIU6MkB6>{SR~?WCEk5 zb5xTk%F3gvwJ5PIXpIvljHxV&Oy%(pYw^9yOX*df?+z;OE-LROWOG?~reB=}l+&{o zvEoL9gXN$CQdgd*l(P*O_f;al5)pm(A<0UxZvi`x(lnu84Ony)^!X0nesx>$ksl#6 zBg0yQqz~#Mme$~n+>z88w3A~(sgyepzwt58vmu;D7@0UmPx|-}>+g@C)}YM$BK<<0 zxG^8hrqKti+I6GoKa7#BHCRi)!XI*X6PjHY-Ve9dV-}-&9KC^J@OEGi6u;I`JcJKG zk_w31U9a$1)!=qy=4+Xn{@5lEIix1D6xMmZ3O@j#7@S3)8xH#Y4%-e~ljFeJ0@(wn zsK3#vcbnMi-|?wXx|6+uqQ#AT+a;BGwcvroby6$IBOc)S5}bCOXRKDY8CoLTTda4o znx5<_Z2Y;|Gh^BLEc=h3n8d~-8;x1Nf@n(*aM5PMXKNBF5xGc-L`K*?j||@mKF7hv ztzd0jy0sOOP>3XKrHTR+2$4YwKgcl{(0Ft6u!L7Bg7=ps#qM54`A_z|SnyyzuDn9j6mUL$!c;cX568O^H;d$_xbce=Z|n-o7?_}1<$#4F(` zJnBz8%Z=O};>oUs8?DDBtnV4<=}vV8NmcgTM4+95Sgq$aLJgF}ip%hub6C&DZRcgz6|v;e zG3In%j#1vhHY52s1`u*^CGu#AvyfO>P5wgG4n9;kJO@ji4}v72Bq9iSrGQ;`7Z)xm z(uzE!#t?HiFMbj{;ST{-+&H+9`MpFqrx@H#Aq`%8khga#K3YCq_$9=&1qlZIg&&7k zi!z2+!_D<5;}v3Evub_=9YpBE%M0J%oz4`#7j9}5uwNnjODSK=^8FTpPL>P=!3Z zG@kV|$C>_o#LUH0B;i#ZFhqY!#2B0C87MzOJw$#a1@G_p4G0rA z7K7L`IPjZrd2NbUACuHHt$gLRPs8k|U?21$Ay9Qyz!U9W^aJU@*^=kxqUV(>zs z1Wsz=lvdZ^(-!oCx`bJH0@7<I#~@v-2RI!WSWi`mwr#X6Vd7VFS9u zcsdai*zhR;?3M02DB0nEB8-UpDi{T1=*ldgk9XFhGI3+)i#jQi$;G+eb`XctDCP=x z8QvN0xirz74c3CZKbcu>#ye|KqPX#0p5^2f9%R8io`vk1Wz_4&Q?JuQ>12IHKU5!3 zxEe!q7#t~#*%A4Z{K!i3PUkVT6@s{)21(_V+AJmPsypMCPcrw*7@*2q zgB65e8N(HZ-`E=Q-!A2A#0bEO%}T$|F6>)m7e2$Y z67I(q+lAwJZdigaJQQ{Y-)T!V_Y3!H-w*MvSY{VK!n1U_U08$X7@nuSb|L3MyYL4I zZagEApVD2A??gQP0Q)>V7vq_QXC1=I@Lh3cRkLUMzhT-Am{hTYlzzaX}r#Be2P~s2mFKJ}}{I(QN!-KfX3(rhEzr$05 zXDObYczz~r`}EOq;+_4{bJ9|nF`pEyCSx3I z`E5u5Wdb{fSh?l;^f|x3q+OBTA*y)7|}O=mdVN5v@h@TaA)1 zu2*g+F5-*ol}C&iqkDLX&xF8BX0GC$#Y;>1GzqgLGp-&2o*!XV$+Z|%cd~$oFA&hS z4ek--K?}4X%&U`ust(&NxAAaA3r{A^<`Me+ofWj^P{0fZ&_(Z>&J&etiMZOj6p8Q) zg4I?NP~ug{yO63tc=zlJ#QO-hw8R3u64vI++U{Qf^nqqEIiqb~7luBiQ#GECHKNNg zk2{K05-hu4jg1U88_DI6~jbKFseEu3G53j*gDzW8cIBg+X%)<;!Gb=cnIO?>4U6BHX9f7WBl%I zw1D;4fA9B%T@`2<_PZ;9Y8S2u-;UiKw*yyh^dKHP4^t0`wE{%cotfvKka3Ow_ zV&jN-bzMD6>U`@EX^gxlJ6!45m}HY@^!~NC-Mb5jyRgz%jx`9WDb2yglLI=Lz-IFx zyMtW`hca$5n2#d9iN2#;;UG>t>WsdnTriEo@tdH7K@N+<89mUNa79WU-Wo{oY-{YT?{mi>x%90lQW|4kTn z1YbfHd>%_5{$(G7P>*LKgmn_h+B5o-XVZaO=2*TBH=jyWwl%Yn_%Zpegk>gd;||Hf zF9@E)kLd4YyM(*zV09$=Ai4#*GJsQ`$W!)>auh`3REMn(Cpk7Wti*fK17MKkf|BR~ z<$^r4N|_$iD>INk&zcr9*O-L8!03=k)P67yq1C3z#k6(An~nqm&yV!B{l%s7vP`+)}t=i`7tXpY!nKo%*{{*d}XFM^% zr}(T~l~9gpBM9*m>@(1T*fSZN4RVfp`ox&Ta{;U8f%crEqW>=-Q;Z`-UmZN)eQdBL zV-FCM3|Dq0+Af2OzvNg58c++q5sPWAZ0^M?IwTW~hua$IR|>#*0AAZHHGf?Y9YP&t zGbL2-)2*x;INrD4bCQ>0F3i|dz(L^WI&+a~mV!|T6~eAp({LJtsII6sA%$HfM=zx6 zxj;*1J2A#kfmEBivkC<2Dz1l621?DaCfe`$rcB7#gSwdt_nkzkh(@V)YWHd@l|xq& z{FtNG{RS` zJZnwHmn`e(Tg?6mJpvv4)*{Xj{&PTHOft5(2-ba-W!wiWdo#DX4lw|23y<#~iMp>~dl0>2=z z2Va8a)Rr4A90gHwlwFR67=R*)5?4q~`00rvCrDPy>r=?PqZ!>1`^K*9+aM#7aHk}9 zxi$f7Hj1N^8Ux&U317#cf~k}JV<;yld|+hgN2NXb#-?28&FraRy=Pz92%EnXqM`B6S#La=~i?d-@)v>B{+Tx!CJRwA@;q zslb9_XK3d2QC5IOPyk2|#bDolH`WM!yc{qpDQe@L?DP;WRwCCb_}RJ&YjN<3ndK_o^Q58) zNkL8(H_pu0+mWAiXcX)Tq9}v|PztDMEt@S*es;9f>L{Fm8d=%RkeHB!w6%3Hn#gv- z|G8Kb045MCgQe5PWl5W8H#lP6bcn=g!lq7qpi5B~nz?>7dZqv1vQcVoL-S`wbxSVQ zfovyT9n?v5NCn_9b|t&v&y>9N>8iOwHMSd?)LJ7hyhK``k@6HeTuqc?FD#|ZHLmlkDX}Nxf8BQ zlQw<+6n>(0ALGu5ejodP&np|N##f#skuN^D1eEAT(v=;8IC3Ir6Uob!N+{b00no4y zCm3wzI*P@eo$$+{EVz3@wV>)B2Ce*IQ0)(c*7Obn?1#@O6hV*X3EX;4eDE%y7aPRE zc_wft%v14`%q6gizu-i3k{fp;4#bZ>;$#*x*^C_PDdYVo7JY()65@j^L3!m&QS+CE z;+0B)(WX=0YmQjNhJ#A#e`lixWcjWfZvH&Qmiio3SlNkciVb1%qBaVPMFD5}1u^90 zQ9zlz@svOp$R&#n`)#Rp*{CuuWw)jJv!4J3zc5M7Ch1F^(xUB`-Z}%ArxJht1mX;b zHtG1!Zt#!Uw!^=F;YIOUn@dW?hTN-54PB-C+Qy3;+j4f6f6kMaQj&9q+%fz4Pr-&( zoq>5sXw_-{{vPkD#Ot=XFDa^eh$4ha3d*dcXnki#OMZw4QyR|)GkX6(EsPvX)WDHM z5-w>NwP3+$R@yM{j?GWIfA7jsf*)KbeGXQ@0+f+vW`T+De)#n8!A>}lf9lC_rz#1v z*&O8^n$I@0mnvIor~tK^e^A?|Qd?K))s2+2RJmDSYG^Oj@%&Xc>TZPK+Szl&wXO2g z1PnH)QY)_$K2)is)=H}9EiK&U8|y1qf>tJ89;b}JDO1JY!YWQ5{!X_{u|syfOGe;a zf#K%jN;6$O`wR+!`7`)1(kE7XCAv9l5RlY`sLJ9-{=u*B9j^R1iqzu9+LctZ(yLc; zA}DK!2xrHCLGhQZ)a;q~$F{FjUPL>kl){NP_3dADzSJ2Z1Cm(;rhWXHRUnH!qe(?xMBsOGr`;T(}d|h|I z*IIzSJD>{zbf@oOoo54Q6X++;^ynuAz0?qBi*YMXj1}}#W>}R_vAgB^6jE8)iy!pR_naPzghmts{7TWmn}#(HjKs64T9sY=DRsI{InXz>czO8(#9K4)@4`~2Vc|9_tsKACgQzOKFY+H0@9_S$PV z{wE*S)xKoo*Y&b4sCtr(b5s_W@tKdg&c_Dx5pq5@nvZ$ThZ>b^T;P0cHXjR}k9+yJ zEdE+%vhjK+-~q)NP@QhaeKR4I$;Ktb+hfkA@8@TOTooA#$An!j^W#Iehy*LwwA%1P z`*#D(5J(sRL-yZ-=5t+8bywIg@d@x-pg3m*w|pQgYFr~=pPwejZ;08mdNgjmt+vdU z9DO#BiB*ejiU^mq0mVsrYc3LHbmPxFqoAK?Wk=a9X8d+-M5EoO-!oWnFN$ zso6OyS!quoSbZ-39n)qZ8N4uu)m%f z)z1q3tn?alk-5QD6&!=xE;>(`o}XiA-7u@w!J_wmY^f&JQcbJ`wGxw)i9-G+a2-Y- zU=$P|+F;Gdml^y`7}R{9RHo%TK%ZHdSgcOL+Kk|W5J$d0PhCzO&Z-cl75otI5E>K9NLaGRvLP)VD;Nu0${}6x68@=6Hou3!qhM?$t;V7d-(DHZlB&bwjtd!6@0unCAmb}OHBh5Eo<T96 zjJE__qo@C3d~w8ZGmkvbxQ-_sa2F5tqn_$V&7Me-l&*xJFqgCn)Vdf<7UGYffZ#m; zZKZ@ZVG)SqiNb})!HQ&^xuM% zJ;WELHeRg6R&GXVAe!wmtUp1txn*nGR}mw4G%v=F`AAF~a3BbGp1 zy*ksET9%oblTp0CiM)5f_?!KU^09SZ=qt+n*gD?*nWN7W-JetSdD8jJ z{8)6n)2I2l4T3&%`ESignHsV$8Ve*0yv3+Q#z9USK{MJkDh09gG|?5NC%R|BhslO; z;88Z_WKugvM!%ma`W3-KzwE;mq<$#uRM{`)lgnFIV47*Y$2eS21qPlVn0f=LhkNj4 zI6>;+9&D`+f|QN}ntb>NRohMKN%stL$1{8=!u^N*I`Zc3{lb5L-XttS=n-Krq%Xo{ zKP%(vf$%CoR!opV(Pb|~a|r_eozNOTq66u97A~3Zmh@h{AbY+Q&Z)MHu#bZc)|b|| zCFmE2e8oSLJYPdtu2|X=w5cmK`y|w8ZCsCCxOQEfaY~^VE8;SIDw3vkyV&+r+;wQPaS!%`rmxOa~ zd4T1&f9pf%DS6+LTHnYX^n#Y>*?r1f^M+G{lSN>>pr5_C6fwxq_)g94qFJfUrdjN( z(WJKGOzUm2b?a#B+W`*VL(~4PTZWj19c=9ch|Plx%&%t;dJne&o!M(%cM`ebG~+!` zlt+8|0OU6ANi}XKEGR!S1N_oF8fP6mrA>Y7Iba>^QxpyPM7@I!e4=?)yIS{<(`id- zlH0O<^)=2cPi=w5p9@Q8mWnuBjWQp~N z8MW^wm-%qSt^thLxHySxtZ!=+>ub?<$xzO<@!cxb*Wu;*%V*<9CZs28%Au^H|Bf{T zPGJr7bB-lfNI{O+@+ia;7iH&LWjQrQ2$~lx;(O{7W76}1^<=8%B+prs`)?6KDwLtf0upa{$F4p-A#i@{2S)~ zKgmA&_FnuS|3mCU%aZ^Dkrrm8d54bHXg|7}dldXT?vdMvdB8eYE)<6BJ=mEcVU)Ow zfa;GhG2cDG-9d;SDeU1VL7j%5$~HP~z~Z0f<9(2`cn!gWMn#_w^!h4PM{>rHed0R@sA3Y-_McD>*AlyjE+T04^-9_z}IW) z3aad_7@?*`-hf&76*+6yYfh-~g=uZD*^m8SljkJ7g^Tz}OK^7C5caOuOFffb)!1(z zlZ^l&c%N)|_7bmb(ve*J$23Io{r&R3`FeBICRB{>|ZGjBl;mRL~q&Gb^h( z1UzF)ndT5ViC~|awNeL;%cLAeFv%ez8*gDFxincp>dyeqN$L-+I9-N1xf@bBla%Lo z+Cys#l)kt8Z9J8k+~iaVAzf5zbWTIjo+xI+i@z=NbnZnfDo4p3cW`X@M=7L7URRzryR@kwrti!N0a;*N$B5Y?(YLi4XvqWk> zjB5+)qxO2uJU2Dnf1tfyQ|7T@U;S)*y=Ke{e>5W6Ua#5mtasjgfR*ky5XJtFJWko$;;RLelR9RC*dW5VCO1Yeq2llrlr;POtooR8GIl-=hyD zFtyG|ujopL`?sFnn2+yEUdv1gvl>rVo~T@H<%4gCFr$>pmnYmEJHg{$C$}BipI!Xn zE`KDSCGAuG(t|69kKZLb$NV67_St(4apsur8s+Xtq~=ZKCL+$ey_fE=w^$MhyUvoR z@k1|5BK3hYpw}Fc8m^~5jD{{@6l^TK9wtt`^8in?$^9TNv1YBr(8rvh@oU(Yjz0Nh3_0wKoxh526g? zq-ZlSF0(xE1EE(aWyQH^YnkVM{vP4)3I1N@&uT5+(>TYMoRgiLlarkDiT#GS>~|S? zd28o;stth^w}`(MLKV62%i+`5clS3GQG?Mp(uxVCJN@yC2#DX5?THRqn>(qo!Z)kE zT-GftXezj|tzZ13OzzU=8^1z61`C^Pxsz&>xwFe=b?hgYZ_4I3XVP{xwATOY1GSk? za}s|xWSUE=hulK3zbS7x14ZTK=hY_jXPabiw%p*$h?i%dEET@K^#V&<2URx)v?-Z8TOEdV0V+v( zF`7|xvM1n8NbVSaW12YM!C#tp=@~wf1L=PF2DF9A>+^?XT9Dn#;H=4qve53wDC-$h z9)hI3%;AX zK8{*Yq|_2gEN40EZ{qFL|L}y0UWl4gYJmL3~aKjvui90BH9qHjRNlwrA;6DCm3+pu5gi z|E8hWcMwQ>zBT@njD25QS+=)v&Va@_0~_ZI>LH*Chrl+y?hx2l|7ZxzX+=zdPAlrU zTg?Hm3GzT5$i81-Bz?g&z*sb&+Y66r2&AtHA7C(uws5)fI0K{iet$&`!ikR}T}nlo zOeFY{6+4VKr^3i3(0LOAUiokwcppY=q_ z>IT=?c}G!|apWPJP4=O6191(~6A;PP$Q%hHsR=Kos~BHjepMz8cs0w@kfF9xmsj-^|c%n1yCqbiQZP@t-2f2`VDEv2pv*%R@ocj#r z<%D-5f7n|TX#a}tog>07gJzA-I{TaARCGZo9MLFV=Vo5wW;W!!Qh`n*R#Tlr2(+S! zY1O4z!Rn9%qMtpc8)yS>wLPL6-ckx+i@^~E0a_O(u6gx0UTRp=`d8quu(Mql4nuVG zhSPxe4yyrgfnv7-*=j&`FH$!ocS`@*LP(Rc(z_d+@}R;7X~#{|HY?6)+I^7e|9<~W zVYeww>^wiso)cCmL(o*h7;yrLl=eA>uq*BBV2&_ajHzX*36y__Oq{L_Xxyv|P9Sf5 zchKIaMb^5Y_%lp(@>_PU*al;W6sbJ)}v z-d*hpm>{JJN0M(|>k)`$rI()7ZPP z_D%B~(_YN0-S+;#O&oO+tFb@FqLRm#$V6ki9kIE!n);l9M*9}I*+0`=*95XTjk`>7 zPUB|p`~N~&2eY6oV^75RxzbG0K3Q$4FRMb;)%MYqW+5jN1CC4-8P4e6v@3BaI-xrJ zm_~E+pB!A=2_=CG$F4Yuonzeq=ly0HyLJ~ASjHHPHlokh#;-3_S1{!eVgQ9Q`{g)X z_ZnvFe8ZJ7Io6_*QL85h62zMWPO3tB+~=G^GK3Aica6w(;&L2$1WQ@YG-~dzB!DPj zK#d5t*}quYvwzXFWI2Z>3L*6#>E?QZPO(2;MNqf>aU&nG9b0|{NUS8*@gWZNqrRcEkuB6W2jZk9XKTQEvsaq+``$0J<*QT#$bd`YuES#&IxqEx|wVpqzs|Joc|21SW4? z2B`wq^ZoS&v?H~e-2Sbb)X~+Ld~Df98{K*+;Bh`FU@s4k{q~;?2-(W~oom<@u1}CF zGSTg}kV9f~Sc5twHg>N|V$Nvuf55_UfI&~>BGcSuPGe%GnV#>N(uEFcRG7zpQKGQ&I*0EF-&$rWT%^WBRuxNmh8T#`8Erki)}Jm* zmK#u1MR&FHFD8s`#2#L7KuBG7Ibof_s_>;6Moa#fZsWzjciQN6+Bp7wGfSBv+1J`# z1DAE#pHoNt2Ii?O7eYN4SR|K+NV5Z_*{Z8P>&&VXDHtAc5)&4tcPUzC*#+xw5Vg)!ZVunJzhUNCQW_o!f7;rMKiw4q`bMmLdic{uf;bZA282NU zgM_&333}o~es@@(HSrq3V=}JMqLV(!Pwp)OI+vfAVJyc<4-pvZ9Ad_-oF9r9n$>eOX{}vu{C!5xjv*Bd6#4HmqKxAZlGdh zWaCuu0rn1j6a;AQp2_CDQ13gO_aePN!n-k^%jJ;xyh>QA*h3ysY4%WUkNK>jHFK6@ z%>^!pc%aCsO2;@LIH5)V?0`emXHu~;R2VlM)=kF2YmOUek0%lDs|(05nGzx4hbh48 z3=pA6gl*3w$_$W=K^?THr1upLMrZJ;hKjdUFdexAL~w_y?WLD?7w?wLp?hcS3MRl+ zZDxF&NidXSdb^wQbqYun0pZ{Lx+v)ZK6;5z(9_Ucy7%jwUIEW`2_vM3o(>Xp%6xZ} zpl*Wl(D&%Sd_0N|m5j+^Sr$Df{2-H(J(<~^Msv*7N2oU(Q{X59+p?6*TXK)4$;cV= z!zCKi8(yHv@wTzmcI`9isZk5-wGG$62rdC>zX5a4<0VV~t*B&wl*w@daoC-?Fv){e~=5eRKHN7w{F^+K) zXV|aaPjJIrBCB-pX98-#xlHY{5S?fL;YZ!9ecfc*vJv`oO7?HPQ-D^%+KV`@D%LI- z08Y1^bNFX24?FjdhNu(D+f)T-Z&*mC$QNAHME{UR%~enL88_3>+;K8|K#hIiRq4rn z6n})`DfhVAK4Bx}f*c4%--b}KXEF^eZR!t=myA)*M6#OveAI;Ica6w~KbP)`{$hUk zGwPFn;iSRoll^;4#SWK!l1+>{Z^tUin;*Vd2@iB9{F#%m&Sl8o!??+!L#RD%cr4Wu zL82_^@{PlyOPdeq5_&ATshb|-M*_WB8IqnucEyK4d_Zy)f9Cu<{Z%BvF&DilVMX@q zQPG}15jU;uO_g^u3x0ws69l?c`ANiBFm0sVsTCaGHV8s~oK)=~=n(2ehoe36R4)WQ zK)<9ha2K9^EI2%#y*Z0Mp61d|lv&V&52Vk0Gb(9+b+7R_rwG(O_*(DrID?>5#^XYQ z9K^&f=|_Khn3$Fk29J;MK$DY?y;ojzv@-(lVu}pg8jI_BYs*p=T*+12{xXKu6Y}8f zi5AD6c)vg|=NBKU3deY>^HymTdCEY-45%c2oI?WJ8GH!nlA$|?v#ZlJVgawxqTEMJ z@u6^Dt}{C6lpueF{7o<&GzBU&bHVqge%d*^5<*EtR+=OwN`Z&!a< z`V8lHedBkgwgeZF$$Ea@@$f6Or~$iLOuEdZ2_E$qsjMwge=`N*(D8D0$U zC3&U2A)P8Zx@jSe(;Wv3$WAF=&|^!mR>@zo+Qz?V&a?E$%fRrC093M5M~59e9Q zqhyz&Q+L;|fQSlGxrM2@!*XhqSNog;BUfiLX2r~FlhyrF3nzL~w*;(x?fsDW@2yQP z8aVzV|F)s1aJkgp99(`U6X9ak5Vz|1u8h>YuMM-FB5BU}eW%Ft9Y3W_@e>(n2Tyn- zc@`tcp~4^k$xz{xmJUpzWhL&y75H!A$`xEJtzEdx`s4o%w2^7h-1SPI^+xgjl6k?? z{2O;Bs{?4i^QC9=6lBz8YW*f+Yk?(+*s!rfZoF8rye=7bxw1s+O(357AI_tno#$`d_Bf^g>#ZWgz$8M#_b{O3& zY!0Uvt9#isw6FwOU^dh2t5IcehyX=kz*WLI{_;i2M$=O;KlR&@1zI%N?~atC z(@Q;(QPuWOD8s)Eed5Qwuzv2(T{GjpOlNJE+i6eaT=9~|G)Fq=(=1{`yABi8Y02nO}!_`Hf^u*^>Fvi7(Ja)K{nGAVfiP7xsQ7Im3OqXt7)Tdm# zkWY(s14(o~{>hg#>hy(#P+|Ou#C90piBi=^E;O_l{^DS2y83A-#a^((FtBjGf=U$> zp2}#j%bf7*u7R>+I}BTp?-Wd+Q;*nJQRnURXgkcZfG|_9V@2-oG^0r2PVa&IOd2$28rU^HY3RDzUI9CX8BhGyLnKO~U zDF|_*+P;SxTu7|joXT4{cpG8?cYq32d30KJc##^ie2?l}{dljoEmn}zwk3pvh&&i~ zTkK65x%{ds zniFfP5Hom!^5 zF#@6RNa5zac2nWAhK6#&cWK7_ixbx5(AA<|1*C`Hvz$j3NTng)%E0n|)_~IN8@o44 zi(5XS-j@G|Ej{wDtOI(fGU#7-+4+vyoqPh@^VFhjoOXQqPKHyn2B|q{SwNFmzrVw* zwZ~lABl337VM2UCm{!AIwFqnY1Hbk~|Imnhlec#nYY68o?Q%(1kU_@{tio|i^tbrw z%-~QwHlfLey=1c18Yj>vvN@7NM|-%l(U>UZ^%3f&QtrluUT9xOPy7Cx^P^U?YC*Z3 z$H4cn)fm9CV^IS)Z`hYPK&IBKy=E-gGmp~#tFx8dEb-31$f3<1VB*eMPwvlyW^?S| zc{Bkomb_zW9$4C+jE8w9?>H!|-0=#(ZSlkWde^Rz@B7C1-@qUzs!!+K*dqlYYTK^b zF|BY86E0q4J=1u{V#;W|L&Kph{;F~}-tiib#yei;*Dk}z|Jq)<2jN5eWzB!p_^B~& z8FJUOsoZLu_1TAq88=9^W-5*~3j$AcfivXtqWZW>(n3vmp$N3{NeI+_yvfLDx$uG5 zW2<36Qbs&Ji1;Zceu8NAc$Y3t$cT)ST>^I*sbsIY3Me zVKdF<@q*}EE?bZOwVE?5&Jf2Bv_^WGL5sy!SSfK<1mLqmY)?ac)s^$@8}l_|`s<&i z=o0*1;4_=I>eS+~RZeTZgLPS&b@ls;{MdP}bFyqAVYpHQdI)(!RrZ^YI!xA-&0ZlU zK~p(wBMvr~JbM0BEcAB6@lOHOsuy(TbS7EP!dHbUreeOmcQgPofs7$MzcRdBHE!Nz zYK)p11DF^Mb-{fd?us*$jJ3Pu1u7RDE;iSqZQHBaP`zN}Gse^Zia$LTq8?8`^Y$k_ z=Kbt5&eS1VLU5ZJsZZHrK~Hu?E-P*+-L*RB)_&O9lq{FS zkP@cR=j>(QVW1vb9k{hWRv{%^M0p-D@k1JCc@;|Vc~c;J`;QhMa+Ee>X$|~_6sP*( zGp#fH;+$K%^&yTwoV)h-ramnOPSFSS@`tl7xQuv2oTYjsf?+*2o0T@Csikm5wY;+w z*y9kRG+EnUfs%^fns1!jBp)(K?M;TdqPX30h-m~4IpKw9TEo9lH@?tHH`ds{+9tvY zgtsWH)d~Ba3CmW|D512@H5}^3arlgG>G+mt&+VFgEPM4=z+aHRLVL)C=qH>^Ub}TD z$~uG<@SRs$~a^W|6;UlGAmMlPmqyieCM(p`1Fi_x0|Nbp)N#9}f`ZOk60$ALm0IvW2IA zTeG+X{nEl0tfNVfKQg%m(L>yICX8csupl}ywq2YR$wHpbuF7UCC7v|Aad=wCG!?5S z(D_d|p;ez>gG_Opdj;+xQ~dbK=((}&Mn>@`c9USuE=`BPXkUuf9lGp41?77)G2(|k zY47Tjw$e#^=mOGy$E3~j*GGAY?U;9)fQtcKd>7_?_M5u}oIkOcp0?^Y{tB2<8}y4O zy-HjsVutu!*Zz*VWNwQaz~apdZlH|lXshAy{b)bqnt_%Nj&0X0f@ppwC7HY8&J3ke zT7hw!7&G5_9{bumsN*%? zzfKL?C1L24^@5=Y{`R}sEO)ln{~SDoYHI8+eH|dy1w+JD)Y!j6l0nuOU1R^^e6#Wy z%7mi+Z_Dt~t-&17yj@eNCtAqdFmr6Ex-G76uRZFwZU)YgD}z@V-ebmdpx79kr|N6$ z<aDi}WpS(uhH(GOPWTw?1Pw1GrMXH?k&Xq$c3H=Zq)~aNzw4Yr-H?CL0 zEAX^*Hn5~)enU*>>EPz{8Pcyths2we%)3Hy=6-H$g+1)IMx?Ln=WwvhgBmbuog?UI89r>SDbUdt`V-$Am`37u4H$LhgF*t9 z!Oz&kQEh;x(>yFgW$rb^1wt_5{>XqDYySKV>aqc`=8#?@%aDZ&dd>LPyA)t&t%bhT zJ?bnN=_VFNG-gUFWfoH;TSCqDr75GjJ`YF53;9NuP?e6l1D!>prL(_VXBvVXyF{ar zQeaolJFwsOq3NLfAF5k8E_MUsZsW$ zBm{~HUI3gpQr%hzL7{iu)C$9YsGR!w*ElzLMq-aYk>ni*pZ-LQ7Z5m-F{8z>+zA$h z94BJ#J(T|X!=$MJh%p}fj&lu0O2~4$Cpz8QWY(PZMgsA;XsWdCl6 zZn&xHbgEiUiKbN@7H?4Nf0i4R>K4I~xFmEtC=}6^30LSAE5tKnK+Tqnm`mg|Z(NIp zZmftHY9R&}1#Xkg9CtecPe(1>#wk4CO@aeB^8AJ!2kDN;WCCn>gKWbl*bHZ z4SLuN12@*4&f8uFUeheKzbmd)fZFd*)Te7hYI8{_d_8=-^9BQh>h?yT?%bKaI<$Y& zJaTkq;>R>@&(u{!v$%dF`>itF&vyJsnRuQEvBD@UI!AXGTBkyD(m*fa%Z@z?#P-^U z1aNk&xeV;HPz|q=E+b+>eW~AeuR>B7jmxbGa&ch@T19Tq6zjE5u>BI-@st?{*(t82 zrXnrnHswO5snmOX%i?3RpsGxz{;2PeRll1jg6ee6dwi2Qi`7>d(_G9MP_&zCJ^v%N zqk~kQ$Remg%r~{^?|fTF&5Do>gDX7N)Qr-i=-{|<8^SUD8{h7{z_kvF7KS&|H}>64 zB3ZGhum8$4wQi8ZqOLz+Mqs`di6_XB^mq)enT#jQZ=?BL$FFs#R-!Ods;*2~;mN|9 z^flIc6R}AVw9LAf#P&ZgR9c7SirFSFF9diE-ca(Y3G->@fCd&P^y}KW!P6Qqzo7A| zDX_*>tSR!N%S-CDV;imOU4lClf2X17f1q_x>)}DAPp_WM1;cGC%Io*9KI_(Od|STy zLDq834!?jrOE;yv9o{k>@g#??mJl*v3Yw$0_#z5yc((~;D z7pNcVCs1Q(egz}lCK{+lc_Q;=5pgf^OkgHC&_qWv2An+3h_xG;nmWhPD+&#{^@u=7 zIGxtWOX*)>#58g=lSClC!x*Wc?olOC!8%qff(lRLG1?Oe82j`_BWrcEQ+;uZ`vFsc zrX4}1{+Ied!badyOJh46-O%Y)y7Gj#7KeJk{04focgt-vEX!76Z%do zWwLBimI^n<{`~pSw*fXYa$anQ^ilqm1@Y}-H{KP2Gz;wius2la?>ucviypY6t5+rd zttn+db~N?auRTgF&)HXt2LDRoyfl084t!jDYnB=8VqQQOC90q zEOZ+fIU~M9(0W#nymdf)hd}nM7zAb!_>|HMPEHf`i~=#Q5y|&h=8~73SD_0|rTO|A z)+fyGUCd+85W*WQw3Roh*84XtgL8Ebbo8?KZvkVBYnQJ*D%XwCtVgdW39I^f;&B^( zDt3_5VK}}!kxxytoB=KuiHwVFH_eHj-pxywihEv01%`w>PwVEn)rvUJM9d#sX?Ok1 zR8W^`_>IWMYj-{m@eK}77XW?(fKQDwpla~>>nB5kE|mm%rI8DCjda&cf4vMci8_Pp z$>TdT zNK-~f+T42!tUerp`q%Hj4Wi|{Yp1r zy@iD@IzkE>>waBk`4ii2q-1}6kl_XfM|z@T+#!N1)937pAU!1!;WUX*q%pg9X06$G z9lNgFtYdF}LhIPge6U+}`x|AR7=Pd3?`QmZGQ0nIdCTC>C@xv=Ztu0;ZA4RQ=k4sh z-c1m6%6fM*L9U_}pD}#MsUnVS3dsDQ#fVDxXlYdZmV{RYqGfnc1>XvJGS_@QEu$}f z)`(RPk_1dWKoTQX%|R=`{LPfDdiu6i(6DCzcC*^Lkq;EGbh2Cd+b|0%IKL{KqmgjN zBkK6`9x$_RI04C5*}u5jjO0eFTUJsVlJ<4K_rQJXZ*;ysr?1Fj!YlL^ozLREk~h)a z=D*PYRkn6Bp@O^k!dUfXG!iWBWTUAN&KnzDN+e&#q9#Y`_QMYVjkn88F2-yYORCL5 zRpn1)K}=?k_xn_b#$cVVt$;Uy8TBTs(|odJb_{^;A8ySJhd)sy@-*RIM|QK&GlI>`i7B9R0TUS9c+_483PFzo1l>n8#png?hk1T@l48GGLkwt_c5Ha>SChCF#$2`|#cOYLvR4*VQo#s!>{n*f~ zOj+#7t4*dn`y5`(@=gjjweopNsIY&1onm0n`8PJa+|L5hdS>w z^q$4LBQG@@EeR6Mk8U;#vCkSj6#_TQ;Pr(DL8EAUkZj)dYB01{$j8t-)oxQr4cWhB zvPWA}mKjW2KI#=W+r;@3r%~#fU1s-UZZO|I`XYs)0C=>Fb{MZn`Q|KqZU{6cs6zj0 ze{3ITm*1pGv9)gfQ;Q582E0!8K+r@!sbi!zyyuI`zpXl`3X{J*n#m*VQL6P%g&8D}b!^20>=1%ZW=q z?2iCAYD&v>RG`FEP(}sr8B*K^%(s`!A+NTl^FFPF)WVsVd=$4-;Xkd$dT;y(^Y@*U z#=0Q9j!CA%+)B$KTr}LTWJoQY2jj&h;;%=Vo}99#tL!qr=f?7?*)^!)S&^G;A?GsN zpSwAXA^FWFNA!7@AIocKE>=Db?@O!g9@h@g0&N}BivQZys}+VHzzIrYJ^KrVA+S|~ zgSQ?=5G1HCBPb!HdwQS4hcl8B!IA=v+O82x94oBEBao@%;yV5lUY%r!XGJhSl3nj6 zlk-wH*{!@n-%}~5()P?0j+u_8k|AWjGlS2gvQqIUYDmXbX}91DPPT?~^jTy7o)jVb zD^6g2F@ZAYn;M`8KXj)sF1(C>)nOX2ES)Z?uot{X?(l>33{@+L`%_htgYS#I>Y*Hg zK~%^dh+K)NpQC+cC#*BO7FMm;c-uGEoD47?SAUm^{E3Gd2tAdRsj|*@-JmK}Mo^_~ ztDP4v1RLo}0Ifu+yIw?c_!@*0un%OQ3WIgb2vH{grW~?kNX|?=L+S>|P&vZw`LjU6tG`(UnsAP@(kyC4S~3uW=t3N8E7H{D5&IjqM)gK zIAhJ(5ADb3=%E<1ADRe??ks2P&TNZL;9JHvL7p`be?Uk4@wVq{qy5#i=V2sZt*)=6 z%jIx2lWP$46dhK~ktKwM#LA?_zV~bG*j8GNWT4ewB^U$PgwvrGoi;in}`K zS26fNtZDTPy!z{p@*D3$DexvQ?5Pikcln$x(`qi*h`@5VV1vD|em_-DFZ-S&7`6;z zP`rl?ALl>Cin#OHTuo=TSlU(O@l1c>Y4hUqC-#|_tmu;PD)F$#Ovc@J8&>HI0ZCc* zupby$6KGqsmy4^@z-6X;@=9By!_#fDTCwtIzZ`kxJaDOI>hNYhZT%6A>CBBE?-%WT z&qU5H?d;YLGnlMzK5007E@qY+%|QeIrk(Mf1FVlQ>X}_5E#!2_3TnQXp1;QJ3-%8> zKPR-c$0mR_u_Gv4G@_ zbMhNQ!y7}njdMn{m*okvT}`4gy8)`~p+6PPfYhEbXjIKwpI9eix8@t)m+iNyH2sSX z_;9C>OEdO#W;}w|{C%CV*Kvl@dF)T4-&*qq@hxkfT! za=Sl46PDu=WGwM9a&*xe8{OT$P6*x7*f+LF8Qd*aShp^;&;qwN4>{K~9 zm^QK0adAfmleS8xU7*U_3sv^DZyBrz1;s7#TYVUQUPr}3&fJGjoh{SnnwziFBI7HPc{ci_%%*NAhLeP)NS|L;eIq(__ujt$9J?4nxMgqqv^VT-r51Im=hm zIguOg%qL&-YdXiGw0|Hd%5(g)U^vlxy{NWooG3wLR&f`emcGo%)Ama|WjYntq=$u9 zJ;Yk|B#y^JDc@=4prG*^0s>mV@dey+M9R{CF5lTX2GTAfAz5UBP<3izf4!lkTXK;T zP_=jj0{2Pt<_te;q;=f7j8o`cdyy_?jSXR(6SVK|@61Yh*5A8E1euF5@~~wNvb=0% zziCTxmQ-T&U8r{*tGGamA5(1yr5wa!y1 zYca3_T9(pYV__d1>);3ia0)2up|&$sz>FY>{78U6f&0HZyW0v$$oKS^xGfBYu;wtKF;FCNeU16Jsq9yJ;8) zpgMLTI&>`Jr*~@Er!m&W5AVRJ9APUx^n5K0JrL;Y2LerhbbNbz&oTcrxX&{4Snuo* zry-rfw^E7O5rEpy!m5}PdpH_DaO~yL z`z3CjwHF{O<^6+P!Ly#O0AL-x1a0x%d9L-9vA=5kR`>cS&Uv)nSC7rWZ0mly1_h_p z&kE&8{lVZpZoQ1%j=4!p!P%O_G_IkS5~U`IQfpKbY+L=RU_k{WM75OA2P_ei>cb~_e;m%tj(RojsLA` zw5jhnA~{k+$*iFfzX7mozY){HDx_JULk%0~?C0%s8LSSwm@Y2U-XM8O@?c~_?3SUP z=oCX*!+Lm6+oNXi?CfDCQ<){LcF_`hyHFN)v~^Kg0rSJ(VbGP?+X135BumwG}Jo~IJ>t>RVEZ3};qtVSJ z7`IMd&Ba_do+t8#^PMg2j^FA}7j^B=JUIMa)UQMBcWJcyA(Q635RM-qo%~8hOQ`k4 z8T38Zv5Awyj)5l7%}M)BX;}r&l#0(}#2q?IT(R||GoXP$ zs1in?a#iZUbg9wP;Rn#HSS1L%3?}6eSr=Rwgu3-mW)6kOM+ua~nH-G|DSqH(!%JrM z5hu#%r5;ZlP63X5ch1jGmG7)XP|Liu4Cdp4(K9cRHZV76Mwl;n)?UP~RR-*g$XHB1 zBBvXry`)2gtAC&o=yu9wrS&X^U)u+I$Mr>6lLSfo&Y$&$M-o2phzP6G02KgG0Y)_R zP)?<;KPx~5pk6!nvZg=71A-O6NVnygVLM_qu+sZeL0L9#)&eWfXHip)KH(SWmN;pV z**g41*`lgC8ZgNKDR7v#2-X|NH6Y~u_ORY@eHuXFhKuJs7>InDA-v*SZJb$n-SxH6 zU;X64-tBed>oGClWm)sMS?K5zTeHSE!@+=fWsTiD!-&Ol`H)l5b)Yi?6ZLgQE_d90 z*8R9wCm1-L{{GA->zi*)OsGN@@LE`@UbVP}TZ@^XjMta5(p7Wuw0*f#wO^`<+zKa= zG3NyU3ELW!V9|b{8v;YKjz5O2Kkd`r0)EURa;JW0~+5V7b2`ngl7k1&N6oX{L)Gg`=YOf&QeyGy~ zvUnS!Z;(Bq(*CX!IMfNur5G-e_!fbZa)wFr8QLS*7*ChS4pv|rfs9pE^yw!|rjqx6FDN&wJG*=hkHogl}qH+v;#G zCk^`LZ}!qJ&toXr2O;mC-VG5{RqcMuUCH$XxKb6z*!keRdfDribv4VSr9>w-m)tQ0Y_T)M~H8l`7cS2+#J}*8@L5w8F`*rHamLnQk;EGA9yt-iT{d? z>!QFeN|6n$Kk)%?RrB$z^$)~Yquh{$71(zY12B{|{WJJ`P?z&sAGptb1Q3kRDHH!Lg0!aw=pT9#>RSH7C7_~r(e*;n&k{9*AS+B=WPOX#v&qXVXKB7`rFnm=w{JgbM?+8^OF zz?!;A4`V>?(;@8wV?u7u2gp+v8#Lbd0WPnJANCjT8Ppn`{$avk10z6E7s34|gqYe) z1FNd-ufg=tbo`XP*HHKslm_;{))<`FQ!!IO8H}pALu-gcKqJUtl{qFOeh|@VPKzzqQLc3ub9DYi5$4uQiZ^W8~ zNn%}4c(%ojlKrGzU^RU@)y z*vbb?3m{^Ad{2~~@~wxtCu7~3MnY?L$- z6*;ZW>o8o`qZ#*wO+d#v+yu%9BtnKtJO3p!fy}Xs-$ZEG5?n=IU2w1BB8wSo>j;2b z4Nti)(CCJ__MJ8>^I>uhrTIDKgRqP?ut$N8}tZu7ZVd`(n&ZIN?zY z?}o|F^Lki?W%&#g6Ieq>7}gPPDM5+CUy1!p*GZk!Ds z=5hO8CFR&v$~W2ZdTZc%SssSkqAznZHgT9C`zANenCzo)t()@sE8s845Zyqj6fQ`) z+=VSMcHO}#*Gj%*ePCypMW??Wk=hf316v>a6Ibyrtyl4$*k=b@$0CJm`%NDh8OO{v z7S?aTpBx=nGRup2)(;)Ztk|W4qX+fcilajoG;>PZm*=j{j-4ooWW`Plh-R~Y zK-i5(bn7lKPzGgfG-ZvQJ}x@ST<4p<)eMW`lCE*ltj4(|U9;gQYC}d8Mu%j?ss6rc z%UBi`tO$%}kboL??B4$PB$t!JO0|t+ZVi`t>?+$-x!F`XCHC2~qhcx_{nwe4F zImjK`vX{Z-`m%11>hJNDSDX1>DnDaiCzfpS4i08dT^xP6_`}+17x@zxLLLku^&O|N z;*iKcA{R+~z`$!@WFlMak-}~|;TX>G$=~GJe$XrV(l3K=1{;iAU``=oaQF#e$MpQ$a-KE@1Gy#fImh}If~XruqqzSFkGl-si-*ffu=XZu44sYjv-5v2XV>v@`6 z6_)ZM0W!=J86$d=HE}LAvyKUbs=8iqeErmK1n+62ErHvy&G&Y(5qrB=?+Rx1?&u=_ zqesRaD*b;>{P?g)eB-zl>D8%Q|n** z%YQO$$*oAOmwL*cuWuv^hf83!luU<3CNzI&45Svd{ zN8=CG`r2vNA=%4dLgTk)e#sBi2u!EDY(FHItXE5L@?xGL`=1b=7J`Z2k;A%OO{z%# zP&L~gW-jZy3aM6GZ$T8?3l zsI|V4QCqq^BZ@05U8P81^v}3N${M{V{>QG;XChM{JxbPYk3ppeln48+(hB9_`o&iA z93W2%d0OHJyYO^(daq{Ik6~!A;GJSNNO*bJdy2yXt!HwCp`4mFLr@-jz!*c6{TFLz zJO^C_nEAj_Nk=-}L1i_l*<5QQMChOWo^BmlZ_v}&V36TG0x}we4A&KbMj#3ScHgnK zoRy6$lW=B?th-VePwI_@WpY-I-Lz5MKfslYtT5e8W#>cw+PNZNpjDm|vR`?~>q&3B zIfI*D>4nXH@7UNaq&zod|BhskXigkA7_)M;zo=p%;OykpJ)iUVtnU8oF78=tpSD&9 zWaF%~{RX@HS7fvv&K}gJpH}B!)Rn$P2kf)ESU2us{|+s`xh^WxJ2ZZ{f6`pJ z&|RSTPtuD*UKcQAMEkdwBkG7@Wk!eNisB~cBG~4Cy>mHtT7R0q?4i~5`~61tr{}V* zek>moKU4`Hd85A4otOZ9lo1_Kx)Uj-9QRtKvwVyE8yzJEmxx5aLCjZEmyJnPi+HRq z>jJ28Ox#Z2RJDDO*Yt+J%g>Yjw8t?3(*j|$GhevXm!^i!A;Ru})GW4TC(eaRMGVLBb7HPu zNHz$FZZGV{-xWZ_FJ-oZZ$yXrw_znv6|%?OA`|VWaB~;GG$X3Z*=wqhmv4q;u#tIb zX0$BctfIUtFg{faJkde+$Fw17+T*m!TCXHE$p*D6xqbn^Rq?iL{JR1e+QhV4wwqqk z_tz_1&kUsExklV-wX&;|1LGy$nrJ_ZTWPNJ#Y>PDcs;hye6X7eU#Wz3=A@QoKl%dm zONz0s>tet2IZ%P|HANX+$)xq4W^x*zmO;_wzGHiLvHdK6=E0N?>3#`_1(6e^nUpx? ztFZ68gCJR{=+mwe-`pKMwL!&L8J6cJ%kvt`^Bc>@G?tG|mKP+;gURy3Wch?-c~P=_ zYO=f}Sw7vN3-zyTOiInP;&A^JgT}L~ZnwUNu$syE!l7eo{q^vf#zg`9`%-q^qxmIy zkC|)CERnoNtUq~=W}4(ZnqnI7X*9n{^Sf5zi}I8AtTUgM`Q2cCA2Gj=@teHo74v@B z{K{uu@}9q%cia5_-Tc00eqT4g9sDNmIcnZND1gkaWjuBFtzOm~$wMgY>DgSZAO`2Z z%kJ2TuIL5AHLD_@g1bg+U{;551%wnZot-oZ@1KL^adN~Aemk@7(+6T}bS(TSGfRPV zva&NbUbRkhqbl6h9oXc}f(2jD6VnI0XX71k>v#Q$OUQ&c8#$97e|;-oP4n))+%taf zDGnMJ?XsR)^Qz}4hUq6fWz4Im^Sqa5|3@b>Bs%?%E#<*AA)VQeE-`OIti5Yq^Du57 z%#P$7dwJCU*lYic?OfG4(0M;6wsWE>5`Ei)Wu*Ays6DY){~2pl3iEzWtaW0QbYiJ9MT(E3Lh;*Ep89Uz+6jYgfj1PBcLU-9a-I zE6yom8P90Ca;!rGtFkL1(9f0M1P{G93hPCdgn9+{9lUPL$Jv5odb} z2-!KwsL3niheyX-CWXQ|09I|iWS1DAf`)}QZ5&GXk7Ne!p}`FVA?@GGL;F+@nK%3_ zrF1MaHLIY;`iLc>lyiZ|U~6w>c=zVZJso#raKvgZdNqb!S8{ykL9$2k!%b*&?1t4a zbaN?;ZG9beTnQOEM}@a4uC6EU>xw)0eN;nV<_&#mTYs{n#LU%K=$;)qf(4h@5Id%SX6O|XadD#t z;wwNcRO=dd@}#MG;fKf>dJOHq$G-f4X+u?2-4t4w5ctjFk}^2C4T8W|T4D&S0KSq_ z8GcMXv-iK$Yj;tG{lZsGe{5&|@Jw6eGe&IDny_(7nOb!liGTa{Nz^@&n((vAy2)gH zT(4`*YfPow?v&yzf;g4M_`$gUiu;U?RkyHJbktKpaZ5>qxGVc?sf0&CF@ zUqWHldNEYCzlyKm0Q$;_UBT4!^UFQqok}<=ERQg#wc7N^2|uMrR`_WiwxpvbTGL@swCjr9=D3FZb@RfJzunk#zJTsvhFfoRvE3Ux^dR_p9W{{ z0H_SVqWJrI;(y}APrFC6aC@1}Wtv1>DjhqZnQNh;u;B9vMu zKLQnjnbE4ca;nOQK)5G`Ti_d%He{Ez!g0Eb&h1n5zrJURKEeZX*OW)uroRU|Wh30N zAAo#hHE2xZMR*qbQ~jG>AxG!9roDQMF8yb;Xzi@L=>u;(&%brA<=a%i#9SLMVOk4? zUsIzWTG@@1N9qhxtOm&hk3CBPmq>Z#3?UwE;fb%TtVf%8sq}BHJ{>Er zS)(wD2_II0*O~&C5oup<3e1l+AErR#bwzRsPSnGHR>})Z$^}aK8Iuy95+)_LrahH3bJNxsxQdPH)o z>}O39UEO5g;3i>C$%>USGGomjQk+4=F}*|vhqF~yiAm^lqa(T2`s3s1@9@8v80^vM zikvLD)}8+%veJn>88)qUu7`TZeE2%hQqoho9TjK;aCR?@xm(O=mYvBV{@TEb_)g3O zUQrcIWJImk1gcoJN`(e*$dyz)uOhr#Deg2yYg$@W8Q!9hgi|w#zhE_p%C%w{X*rY~ zen3fXaFTRR)AHq9|JL+>A*DK~6f__jbHxlUmg zM|1(xaXmNvTM`E)0Io?#brQ&)-P?wBOxpf8rHR#@cqGx3qAOpi}lI zjuOr0MMo3S3nSUcQ8<9Gt>6%9+f=8c#vaIJ7S7aB?(9VND@e6EOwXr_eZugNS(E5i?H5Usk=41;^< zmYZuufH~oxDExX8{(xxz%Y<7r3xSK_qqS}SCJz}p{m@C%`#-o`cO2L}7?-3EzrriW zT`6R|QzG))5i)xs;|woo*2HahEmy?{(;4ipFPqxgCOEFND<)ZOvz}0Neap(MCrrUV z7hvtmS7R!%pCJ#tvk0iE<1JH19VOVjWk#p4p;5nQ#b8s3{Xrp`&!#Y7Zod8L zd=D$%>)+^Uthrs?BSTY}F@DjS0rtS_aTYrXE$B!wEQhx}To=AyHK^f6W6zo!qp@XZI z0W@OG29OtiN)-Rt6mr-%KBb`%V7#$sy^zNU+|h(vND!8&Xb)FDXU5O_lIa=ws!WT`>`bq>#p zaDt}UpEDrkbrw3yq)Yjf8#f_G)_*gUBfL;4&oU`L`7_7hZ=ugZol#G44aUxrMF z&I``y92EY@(Er!SYQJ@Z+V5jZx&baYBRFGF!xG;7iEpdPj|T@B8ps8cqS~zJ&4g_> zJ$R#k+j_BNV@L<}%&W8?zR`Fgyr#GdI|~S4o_+H0Nq8x*b3egK&w9hK()#Tf_{5vv ze}HYv8_zJPkLE#Ze-6A-n77M_hErNi%MNq$ATLfe@djvdL8ov&a@n-a$^1&Xc zHv1C>%geZ+;4U)Po%jr`o%fynVF{5|$CJMW@AwmYNQ&Xz=ur$!n5_3P*aT?lx7 z>YEwSLA;@UPTWUe-K6>U_ixg^K(f>8NuMqn?|e?5bxa$VUrkYrwzFw+wtQjDX?elOtK`37k}QR8dF#W3TJWi_w)& zK|e>iq)g7Lon;u}CpJWPNasY&S=3Ca*zm~wLy?Tue0vG%U+IRi?D*J20mR2Y_OUzh zF)oxg6GG{E74{F1OVAn!$Ut>v2QX5oFLDm|shOB)exFi@IHj^PWiEn|qcjYYjIKjh z)}T-6eK`cK4?;#7PZ+o)kQY?gU;B=Om|+Y;(-z<@2-(HY2tWS%tC*W=?D+_EATm&4 z9k;LGy{;d3;e`t&vJG?+CdQEv1Vl#|1RLu4I*K4^lFG~-5m=4a*qaGrVCT`7kcuqC z+g4~Ki!30IXRE{a!ZfXSbR??dy`Q{Qmy4{EKU?lnXojDLRLiA51#YQ~(CJv>(F86BB~7+w;x?OO~dQ9mC$ z*ptx3n9^%xVU^0jGECPnq;x{g?fdtYK$6M+i@Ud3%=tcZEz21WZ_G>0^3`1&vKK`R*mN7mcg(il zwtm+06cU+*Z%g<&A3x0~xMEfF6sv z#}*44$&slU7iDl2D$AZ*;JKGx93A+m6EmdqZ2vaQT#g%K7iOK2?9>^s*;$<&?JmH% z55^O%U(B_b|HU>8q^F-1Pg%MaBE8ob_OBeA?vbXizt>d7)|01)YPfclVv#?tJAhBWHXkHoVh3 z(F50#E<=_K;tb9|gHPHSvfursrrwr#3pdCd=LQ*d@5P_Mzvz!0`_fQxm)(X|9~*vM z)*cy^x;mr69)i%!gdX6qVex(%Gg25a6{Zo>jgLI=G1{oQMu>Scix<{l6!J$y{W+bZ zNtmMuk`1ikR8iGVDO$C?*UxIJ?^@Acb~R2V|Ze6WE88Ro8GF8U(Auo+W3EET%5Yh7vaVqNG>(wvW)b=a`ENZ zch7>@d-gMYOiJ+JfF22Bm7dHAvTsGdALn-A$V~sXeMm~~eO^ziW{y2i#z-T+>g1#- z22mxGqC@@L=45n7Wu{hfjnJHvsPxIKD~j9H_5Ot9Nkat31T8k;(ah9JAB4LwI!QgY zFnTUq?{y0+?dO)I2jmD!saqJbw|9qRf*(5F8J}Ds)Z*W^H~x{p`e<@A3;OI7;ZKU@ z^ctJ5lpc%VI+UAGPx|X`V!#0gU<-&zQNiN#L^I>#0xNxd!TTggWSw>8n3LcAJU2=ZUNBv&DCr!^sX89lvi8rr0^KabL$X5A~T6M4wQ( z_$mIDn9l1ah3qkwL4~@~iH}SU+56o{j}r-{w^cUxF^nZ+|nJ|B1@89 z?2PG})Uqx+NkQY=xhU%B@|+s`n|xVE#~;Iik$7)jjoojxYB&CGd@Fm8J&_dWNvpXW z8ZLq5O8^T>mNvf1;yrbvFySA%QMjq z$RJM}z`BjfXJuE0tnyrrNHWUJEXVmv8T26P1S;yhoHqzZs9M5fjFAa^+CpX(3(ONF z;Lx1^hqQNrkFvNL|97)XSYTlnS!AsdBCZ-u)WD{`!3{J(2vHF?7m}b6Xlv6*ty0(x zv4)tiNysv6iY=wuTC{g3kGc#w-oH=vm%o#2{pnY!6;aA;C+Cr9QoO-fILVA=#k9J;ldj^*p|9DwfexT|w z-lNaw_C1>^_!2yzuBslu9b$;!8^a#y5$QOt7n=)JK4BI933cd-7WHZMdmOs?Ut2v# z=ao`={~#c z-Ra23jD!<^&>6c3oT~R5HD?gB(k+F?+h(MTl!4C{|5JvrSRfP|VW?6@Ucv1NCX^iL zP#p{P?9abKPGl9?I zrpM$+M{=Q&ZwBP4j>>M5v84UtnsBj(CsR&nbi9i0%I;j~L*|*&k|y-7uG9L-W-(e8 zS@#f#QLm@(jL%>F?xQ@Dotge0Ol(wylPf3WCxx()Ta7ZVk8HujCtPQgG(hA)El`~) z>6v3tA3N9fgEIBwCY_7$3i?AEYtDn`YbwSRylS29$-g|U*Aa8gW%f5J!cfOO%#RhZ z>CBHoYwL$GRcDqzg#;oT$U{7Sm3SR$_dZ;Xgk7!7}dlYYvn_hJRH_yR=?ZT=p>xC zC9cNPL_yKRq3Dy6<(Z8^9vu-A#NHc0v z+kW?uP3omx2R{4Lh^>{M{YfU{z*~!x)LYCLsj=EI-5p$dH%McIZJpuM(cfxRX(YOu z+8NtSb3P;b7qBQVPduq#GGvP<%~(n>FjL|TX+)V(&kY5_^d4j1OEV;yOIP`xJ_inS zBz#qwF_#4Eg_TuK$Yh6B^!)Us#Jirsl3!LqBC9j29qNiZpNuv7o+BQ8+HdG-MBZW4 zzTgFRo`h>5CdxLzjP#>-T@*Qe@*YvaW?WZfR8mv_R(6hl+SbtaeR|vW2`1e~*8RkH z?T?RsYV*L@*~p5RL#+D?naL z1Q!{vYniE_n8XhyLb1prbh>y()^I=6mHV>*DDmAor3di)ga?hEO85$&0YUb_{s%Ed z#@)oQOnxzwEBuZyE`t1(@K?@X1%LDSyOqBx{%+@Q0e_)N&YuZwhQ3Rcx_Tqs_qZbEq!J~l z9`IN2Ar*8rj?uwP-9K61Q^DWd8n2+M(EwVUAH2nDyuNBnEbCeu{vfhyVpZ1V?%c-R z;V)FlieUQY^i9_(Bg!lHC5J9Qp4AQF5Kc<^sQzC#zpavAR(FS>H(hK8N9a8 z_{C$?BetscIVx6UoO(z%N*XN!&9(i;zg*IKY@MB~>;!rF^Vs%w-PH8a5^trlu>n>q z*`~`pVZL@vvi+yhwP8k94T$_wd4D0cB9xwMo_x9}27f06sZ!GS%9C+rja120rcxvr5%PbI^hL%y4>BC(U~!r8 zch0iO9*{%?jSeE>wc+d;OSGwOVujD0}B&x(A?Nwx`xYWe@FK0xw~$!7y_@@O1Dcyrg)Y-Y`%4i@$ZPFt%lHFFzVSs2KE zsJF;C{Y#5wCY6v{NhOTu$xf5=$R*paqG*4UGz4W6#BzWY^Q-d&3DRzs2IhJB-+#Mr z`!Ny{*?}X(9^Men1P7v;X1|59^%ACcebUpPTKjJ#WVt~i%OP2Zt_~WV5UMiH-|3KHg+^VqQh zzpPge&h*n%vCMHc`IAkB?~+6GAFigG^;>|qLf#^qlY5{}?hCaVsO!8GAVMtzF|vsp zx%)}A=_gcstZbO6f9n@Rc}Hms9mJwUMtS$h?0aQ}?rIc%smH%-*>2t5wZz2fv3e_awSHwU8DT8E^6(dC_aO*s0fBXO!RdLvw6vy~^l=$SBlBc;%PJ(*qi( z(v7hhY4*Sy)f0O#yO46om|~806A5R-FOH0jN9eR3N4KKnif=UBGDql6lwXO#hv2K% zquMhf&D0#TkyRz@tZ#p43P<;flAlQd0SSiU63i`=q)~?)PC)eeCPVZDTqMC?%1mCe z8(uO}A9QMqj#4|%O0SXj)9OT}`fBcDo`3*b>AQOP8-ka8a9scV$(IgDtdq?&qm&`m z%TMeC2|tkyHW^Ct6u%BAxoEOz>5$dL!_0l6ZPBzs4|`1?|Jv~o`Z2lV2M$y{-t5j* z+Q|mPJAiHm)x!B_WP^vNg6Sf0GehpH&D@KwRE<6##S6Fa;)mq<`{fV-?7>OkT;UGS zRA_w~pY&4TROmgmO6Mpl>)OdSdkPVj>g_UVPP24%$bL$4um84n1&3&T`P{y(&m*X> zPdA(k5E9>OdCqq`A5^M}N8ng!gp9E>Mi*Rg0kI-xyF93zrzbY>hI@5JI(S=4jfI+Uu*uR+vo`Ua9A*FMW3U|Bn4}Sc={>0#Ds7LgWjP#s8sk0Vs16_%#(^5 zxw|yPI3?*COw=_9N4u_IVwNd^$^Q!z9|IF}ehVic$sdPi9N(#}Z9KGJg3(NM8~=Wh z-UG!7tPz&j8-r00A_M~=UU`!cVhJC8*aiB6ABeX2qOy4V@uOFV*TQ*WD|*W4ExPm6 zQF@l0a8W?kuTOPK<3#_*DZ6{C_@ZPxI?L$oyhjVT)=Ct;@qZlcG47*^Dj%qWfr?E# z$s#YJC6*1wS7u8Q_Sj7CoC6C=ySrg{$RW5V=134$v_=Jam&0qLlUnla(K(Lj9Or~N z?l8O6>}MLc&CfNEy<}-Meu|$1=E2=ZYKE zc6`vfZLbt^>G!)_$0k1h>(;B}`gH==67q6vfYNQHZuJsnuy&v6H5Sh$A#o{NY?f8&^YRvl`Ur~FFr$;h^YQ3kJCss63kW7(Fcn;YV zx=ZOsr>~J(bCEJ`N$wd9peN6@SZ?ueosj2q-i%G_Tuw{s;z<#Bhu(V!nzrd;i}BiG zd^$qVCos}a;EVTI-E(StR7Xdfr2)ndghg%)zi`XViI(uz(X7W)ylL8h=j>koU)aad z6vMmEhPqSw(RB;XlJ-fJqibYTMc0(*-*Ww1!LJ@B9ni8hI>#Ly-7+UWhK#FP0{l6YRI26|-&{V;yVffJ%ca&;UbhYLS%~e#VWz7P9&pyyf zFwK%&xeg9&iME4wW#jUAnDH=%x+13(Ku7Az$n$btu+7ypfzPT8bSg<(k&09@r{5x>^RcYT3e!$4Pa0U->fcGCqnq ztu6uZ0kfa1R6W;$Ps-j=xwB^s=c|^JrC6KYFBj0e8XKXm*viWpg+;NIetD>sCFa+8 z@)$6P-(W+VSXLCyA5bhEI&6*{ZWIQ>fkyo+loQodWin3AF}Q-p&q_?b_oZHk@I7kC70m&!Um4S>s>#2*qtTe$8-*>f}+Ky=yq8Nnxi|2MyOj z9nC^6RCK z$(uD5w+jBaMhVd;+AKJg>O@-w&t|2TGNh>#K2y$8sYI9d_NS|{p2l(T4gmg*wpIZ- zqFKNNnss*u=)6|x&c);CuBTwhh&Pvfb%up+ERJWW-jSf0OX@dB7qX+KG*G1ha`1%N z({TUMbT`j_;c6+@jKnsTcR2iGQj4;{!G((!+XGt`eqU|SRo#aV?_(pjF(|#Z)lxmx zK4NpAZSf5Y?Sa=9Pgko2sp+dVhEO@j(=Zv7VbvBZ)vKR0rk&^n>jud__m<&nq@9JD0TKPq;rUi$%}*fzN4P;famn&f7*y2& z2&a4GLoBY?g25N#1H1*-=W-O;m^c-loCQx_pCX^zbNRfF)^$ufWQm4P8dDfJXrh>P zZZJBgowNqF=hTp_UYQGK*}G zq&B&7peyMK>#xtFrpsF;W6RL5@ebhEM(Cp6Iafc*A^lRL)*N1)(^wz^ZOI{yXc$9( z%;9dgWV+$=UOsR$S39+`xC#Be`}dms=Wkt-bB zRd$P=s}i}(MtUdT9ftyqJD_8HT9^hHT0D2ctJ;C04qt59NRc~Sjm(%Fhs$Na+%!LF zqNSb}zp+Eo>@e=rN$0!Oj<$chjc3ik2oDJwa@cs7*SV$x5aR(e_B-)db=X+m8+)|F zl0y%UYWp~8{;-Davi32)*BjmTaq|4Z4gc<@Dn?0f@cd*WpD)$H@w~Y>(i3C0p7z5= z>|u7?h~C$hPkFsnjGLe%*H3w&$SQvgeiJ)OOI( zu#I%xYSZ$PNlDAMjGZyb+GaS~x*UUF8Y&TEckrhh08mzQuCQn480Cv&4hVq6x^tyN~WfU~gFU=~Q-bCp@x}XQ(F9 zCe~&J3qKIfV(eout9(zaz#5(DiFxX2pM7Vnz!@#@thWI%THuWqIAXyR|JF_mD*#J0 z=$kOpQ8c(Fgr{7beHNMG_O=*Fdp4xp#0vqe!TIz|}>tpsdDSX1*MER6Fr_+*V7Hn2VfF%f4=r!_TUTjLY zj9g9?E&B|-7SAfJ(RC+jyE zaq&!)YQR*CbyvVt_$dRrUrM#$_8EtZxco$pir&qFEGWJ=OMKmeZFw3pabl?b2;fMIB~6*2J2=RiwMPejnjb+S1gU4Fsb?S5{K2|aac+mNs*1V zKu7JzeGpjcQ*|D&7qg$MQN}?<(3S?!tmtY%8@yci*_+Uh_&Ew3(^S^Fjqk3(_(KBG zLJaip7G5ckS_gvj&@l<&+`-DV90TCUEj~Oxh zxWs$#2<;f-YHAdcVdc$6e8`ur`L3GLm>t-*$c|^M!<~7J*`%=0aRV3rJC={9v;m8Y zVKr&68tAC}aP72i26ops$W?j@t8|GT_=cn;SNC&tq? zL_XY0?8Jx>VG4e=GI>wM5IzG8q_|edUazV2nv8{ZrtZlV*AUoC5vkvrY>~g!{5}8e z$(GZ%PPWYAsVXO1?&I%w{QZT$7x;UbKRrjsea3CbtyyAKoyr|Ker{+;>yeFV zGrK-kg_&`g;0kq{TWx};*euGP7HD6TGPCJOT`G(_vdJE^cSZ{{yIw$}P-J}jxL8ZZ z9kB6Yx@0r=W7zvUP!?O19b4jA&z=>Yzto}>b`Vl!2HYSINbx9Zq^VwYgS!-^fH3bu zpDsAf6 z(buO(K5*HN3D92%&}5nOhTArm1=SS0=!|Tyl%W@u(VAjJuY=bJjqQ|U{uk}BmU>XU ziL7F4za^UQQSIgzQizk8`d?+nbb*=gv6*1wK&|;6ohdOBn@=qdySa?4J9I&rF-$VT z;q!b>+psbkc!AkKYn|j38+~o_(&``9*k1wttc+1pX9s$zH{+0>DwYFk>5_U^uX?Lx? zDFLHB0Rs?fFD6d=;>C9&O($~JCUTy&baIk!qv?ba0W;rfnG3nK&l$1nW)?c;eLu2@ z@stGK6*xN*4O&Tx=IylV`GQv2z(c4x*b=kZ3`QN9@+(^2i~q8p8j@m%yT7I zk{ORr)q&Q!Y;DQz(aEuc^ATsZt`gC>+UvgvdYJ3>K3-4>R;M|Uzx*~&Rn z;MV!=i|t&1)h?M%lF2TaighMwuw8tt;-gRBR~Zeu*|O1crYBmE@+EkJsTOO?WM_1; zxN+;4oW{pxEt4;AX(;uwVs0qYzvcWU{JVK^@z&Dt;x!Vxncrwby~H*&>fajuTdRK; z=--h3t?H$8vve@j|qe%=*?^YXx zqJ~qgE{Aj&9pqKdidJ8G+`JAQu0DM+<-U;nO_@OVhEoD-gkbS*W4hdra&i>j!j=r7 zawx5Lb^h|pg<=SVN?kfxXv13;8pyt!h?Zc+3xlH?fgOu)SNR!`>{Y7uR-mZW^Y|@P zEi2i{u(iq*UIBB_>vP*WWa2#&R3?nPPD*^MQ>6&xow3?+=uwb~Klh+Dd?24`^OG*6^X7S+&=;MCMrWN2%6$GFbJk z@$&16{fb7-DpMOW_)?Fh@XI|xAJtu?TAjSxUg~nhr=yk2hud1Y{m;@;Vt2CwtUZMG zp3kzNShm43wi`c3g=IpLyN2qnIpaRk)skFo5EwD%QZ;<}43FFO_;K3?DJi$bImXNz z=&b$w)Oht)-~tJeSgqjBJTX6Evw!k6+BS&K{_IiT?}*)oIL|FpZ-fS@@1=Fw)c3Mb z2Ygh01?!_?5bkw7{<^I=h0&-tm)T@3bux>gQR1qT<7|pd51d-~Y9FbsmnR870)4&u zr}Wx7TAmaX)m(fp4)bdlW5dWSI{h+XQO`NW;s*+ z^gXghC(Xq)K&zi1XS;DJ-5#IG;D4hdefVElysPC*d162H3&xximIraru}75i84e9P z*ot(|w|4K&M+^p!3k|i*jqW07JW@{wy?|sadYwUK#$Yxg(V0?m&*tgeo>R$`U(l!g zGj^Z6iQOkwUmiphF(~j!EsS?WQ9jdMXuQUYe;-Z8EnoE*E=M_6IY;%a-_(Xq!A@X~ zec?Z2b8??gCA$hxHI%EyTa%zYqb;Co7->(5d}IypXFy`lE?nShOh33}u^>Cq0&lMp zTSOvvyY#1WAV=E|w87M6Kke?`_L$OHU!11&YY{6s_3(WWO5!Rf)z)S>0|wHO!A{?z z0b0f5->uq?{)cYf6WMRIy{X!d?#x9;Yunp!Ld+%?4fvZpG+WFF9C9`9r*)Bz+#VnO z0yyx6D5e9caHh;i zxGu9$U6-bcd~EWX>2=jjeNR?2-+?ho4yGtE`xyL5N9)||JPnQA&^-Y+Avn_2&E%KG zM*8b$_#oC(*6I=J+U!{V$zauj&}95?*HMWQegmif5CjS06~v1SUJGow&@^y>vGq`}m~(Z|GkR=sRPrLeU_4Li8?s z^e#vAF6TOMYG-VC1IHE(PVWpFS3MB-$g8j0;PB(ensA)P5tXq_)wmlmzdh_VFF&t0EN1)~d2MzbRuQ&8)L zKQq2hMXDeeb}+ILD~y7145KYacTJAG=Yk|`TcY{i=**O_t|j%`+grcLhdGI<0rkrn zgEtr__1jT9idlgjFAr|Gd@fhcbnlKFbGw@U1>?|OsQp_L>y;8`PT<}=cF0^!oy3Y~ zZgi@+<^C6IEZ_BV8QOJnE!wqm4_ZOnKOMHc^7DrLycwH%eByERo33SwysoviKGb+K zeEE`gnqdZCHGLf*s8!_*2`hwg z$Soqx7Q<*S=Kbi-K&Puoe87+*#h8LEeGY!Bgc<69LISWtmiK7BPsb}}>1Q^A<(U~~ zaGH^>Q|(2Z5j&N@URUG=dTpXCUR=wb=2gR*Mk)s7t)lYvgsKtNkUZq-&lHg)I|FqY zi_W{PTlk#Xq0WtF49{(7(_AkGW}wzm1^W(DVFgUY>&8o_f*zq9`kK?&Gas!p9vO&#Ao?LeW{tl03F=2_jlPov z#fj|!pYx9c#lX|eBeu$S?An2%4fcZEwDg_k{UA{%np5+N1T_Txc%2!S&3!MaIJK>w~E2n3kUg zp8g8qsBh9-&JT7cEjed;mkZz*Sq?NqA%xVru@;Sk4ScfruU&GF@+hkYcCnfLf|XS8 zI28;WmSeFq<;ZKH;V?^je_bOrOvg2mm|&Y%cyI&)h!x8RSd87jU@2lEKrXYIM;IoN z4$vb1jL#$*Z;snYIvqC3yCLrZ^Zl^AU&T9%uSVbBpB;cnDCU{~F&_D)XvkcRj{;_8 zF`>@o$rj_=ztb)TcalVD@K3sOxaeVMoKu+keb+N9>{2EtXzbFH@s2ex3KfWP_{P6}uWKiW zi9V`hjNL!Snv(dGmuS=PeoK6u7UE%XWTAD(e-YJU^9mfj!AZhjd*?1+c<-?#kO@_4Wt3x=cR9n znF-@qJHwXPFEp^_kJPdjJ$|ik1|&EZf1UT6v_k>X2``f%-kCPzS&3WWTS=HP?1!3g z?vwW<^Zg-tKXMmh75HrY`2Y)ADQe)#Y{56+yf(=mDic04q zSU*PL@;WO1O6Gb%6;iwNt;V_yVkqcpWECv_0^^bX-GMe&^Ob~28zWy_i6gMc7jwhb zDZObBM)u1lU(-O6$!HT6A&}8e15`}cU5(;-3H4MS$M3pV%4lZL;qU1-ZSg%Mwjx6^ z1U^~xeylX9$oL!5TQu*vAUts3M3}avF6k-jblAee7jY@wbhQ9O_pdm^7jq75_(GDn zel$jc5s5@l4Qz2WZ8E>J_4f`}lbom$fd^D&L-T_Yvm+DA3cHlA>3w!Dy;u2Q$%c*T z+?4Ec=r0)n0|ZfW!V+n1-VddT2hjV)aoc#Bg#c(CYYBU+RtX`$HAW=(56%$+whJv- z69}qW07V(E=okkm*F0tz5b0*AkaV!{m^hu-jUU%zz@RTmC#H%RBezLYj?U>5dOxhT zM-B{B$LCujZ?Z;Dq{G0pJ67Q?ig|~aw4_%pCCO=wTOI82_M@d?{K}aXp?aJC#Nw(R4Qm()5>IjJ3FZ3fF&&{ ztSTJ}Dt3<+RQzMOpd!)WI8tp!6UBAi5-+?b^iDz#3fD%K;$iz@wjt7XpbqG{E_4$~W zQ~ctc(j)v6Vmj(-{5fbVt*Vm#9I6{J%4~$hA^&0Y3I)*qlLZ4o3{DUjG+c_xkw1N+ z^VnSjElnS}TDL)iE2|D~0L-6A(Vwo8q4)37k~CQce3y+V+#AdWAIG3c;bBtoqN-b^ z4$%uh2(iA2J1;z&y}uKTH`3SpJ7T%p-+{u%yXX?8h@R)NhpYwp42tfy-A1PNeKEfqQ|q@f5{d4;9M zenl^>oQ@f^Yf+T)5A>aHh~GD z$=p*|wNUzPmrk-zCvgHn%9CLuNrJ{jjWnxam7)uSX+ zp;|6lfvVI+C_dcZNAWShh;nF>(UPHdn4QAbeoE~!fO%DmBsR*wCp>Wi1_`d#8<}mW z2#WDU|72ek6Ylu%`=6QzI5;`Cen%-$L`g$p%(f8YIR)Z^i5AlHVq&$zTR>INK_{mMxy#8dg zw@4#}2)VwiZe#+V&SS(g3MU7))PBO%E0=#Y)G=hH1XlAtz zr0N?&_4>H~4WY7%X8AqgBGH3?&PN{`x`ZxDo~*|=^;wTU5u`50#eLV~j}mmodi+I# z;_GqNj(os>QbF5ZUSq3#8#A%h*oh&-NB!30fmih6RbmT`7yk+g9g8Op9Iw8pXZ-c&(y_&uaztNz$%*dO|nAuI@b#9pfsRW&` z7b8ge#_v~vKr^>Yg3pnLW!ugmjeSX?R`}`(GR81Kd2f;T5$5|!c^}BT=#oN0UmFPl zaH`QjugJ<~JaUxr_gfj|T9%p%_F&H<-9s2J2ib8!mhwOssUl0AzZx3ZORT3WS)X0< z#BlKuR4@T+iIVty`I{$9KeXUWj~@Bw1{4*t!D;7riDY)Se|@!wFMY zCdH!^3%pZ3DKN)TJq%NrPI#2D{NIS`w&)y8G8g%wsD`aQa6@fZC zhA9M@$~fC3Q!**>g`%#GWpX&(QiOqMnej9&L{!9cix8a9j8O=siFm&gslopd+~6NU zlCya9BGz-cGN$L2GE=O-no~I3|1v;NX%Z*PUULO^zK*(BM{zS;^p30vcVxJlp8*uz z>`{|!)O*5JuErk{61&qr%an3Iw`-OiUoNSEta&($&qQ>O{xMfgIn1*|SfbFtw7`!9 zZ}@R-SvH&(lsT8rG8azwb0#Nf{04vk3C!^=9Ijl(-|qkxb9|>v7)TR@FLF<~Dm1A6 z1<8(U#_s&A2B==TVQOGbhHGgdIi&TfG^@xI-oBwBUn^D3=V}2*U~{5aI-wWG$`yFUC2rE$3fE0^HDQEnF}8glhH|Hf z5|}dLtt{Ru_GI|hmx70CF7ei8gRf!H<$#+NWY3JfrN?ADwZqGKMzv8 zam#mQjD$0@^L%5%LuVx<@n+7vh>m}ZSg3>W)>pH^min+YWG~=JVUfzz!~U($BH~$&?su(hJNm{D zJST-H9a@E5iDhnvaR6g^m7l3*rm0eH<&uMQB_LELW1Df3NEy45y2Ts|#+D29G$+G@ zi(+JW7{5a$gYxo5Vea{~8A>r{Y#q4~nZ3q=TSzp==l@8?Lf|b|Gal%0kYMt6 z-Nefv`|vsSIp=Ygk!qV-pJTIxzEJH`P0nmfW)~Od8=>>-*O|yVhce-@MRsjh6y($_ zMiZRB2#pjLFAGa2a%rJ)&jseX0uG0~&94~HFtK_`lRDp0Ry0c{gxUMq;0Q2am);4v z$x&oi;~r25vb1UQgnVChNIG20`|&O*)QnTqEgtnFywNHRn#<(n&!e@v&3#H zORP*z6jO>UB~t6xnNp*d1yNe)9PXo$bxolAwD4J4n?@p!tZFh@(_|e8nd1GNjA|4_ zY~46zj1MrbXXy28iDxYQx2n!8HSW!#FVRvI8O!7ii*Z2KZ|Enb?nYS%StaJBF!yrx zlTd#>L`MIkW-1}4xO9Vji&F6{?6xoxzrbFLi~Yq@5h@W+f9@6W^f^8f;wkdz@TT7V zp_e-#&T=G`-u8}k@1HWvg;t8_6F&2O@@VL*h1hvKi*T>Sr&eP}YgYi4+#NIi$tqEBL=FgDDUiopLHqXz#P z4SEk@5ErM{uVp}#n8Fb-K9oBAvz9tIsO{eYB{G3j#fTBgUA^H;*&zLe)JUyz?j(V^ zMH+VZZjb)^Z#JUiH8Q>fpNyPH3Qr;6Wg-mEd(ffT2;A}$x|dLTNbq1an%~!rk(A5# z5-QEH81KG?6EH*;vfnigrV;+x}BAQfnneLfwAdHLG9st zrPhGs0y&Hy^*Z;&FfQ!s&KVo}hWLph(>b`AbB4}~`*^LH;RY#`Oh8FHd=5aZ3RutK_SzN0YanNnnoFbnUgEbAvp)6d@Lwy&`F z8Ih*N5|g;r`eZWUyxH08ePW(p3MC+mO#)qKnETX{vyZtC_RgOuoToRBBxSXO@oQSN zRP)WpoOV`j>VTXp<#;L9R#&SVEDGPy%KlW$BTk(?^Kr3kT$8C8EBG6|#I8y?Z>Sp^4(No;-H$;-nR)YqN5JUnXtkl4)ARnM^|EHv)C zI?-nn*If>9{G*)=U(E06@ECZ#FS6;~!0~%L^M_PDMEX*rRO|S~dAMVGe&AHyAG(G} zZLPKw%q=p5`b4$uJ1Ors5mz%&Nv)QArqLPv=S;h)gBtS%iz%!h?Q8_Z2L9Y#G^k{ z>}rIBEo!P=4e79Brde!Pwkbt8;@|cyf`{Nh@*J}WPIuTR%0Z3l0SM!e=m^twrE^N` zHs^%9?bWv{-1d5Erpw(y^D1#OAD-fRCaWgW@pj~N(c(PU+O-wGm~83x{WXurv#i@J z)4Q&GcC3D0A{WK-Jz8HfJH6}NX9wwTn9uQ{a-GES!5lDol`9eoCI{}eGsoM+>8ht7 zdc8gNLyij`3+$*Hhj+*cx7VDG*=xdItDKM)8W~&U(B~mHu(lPW(_zuthLbdLdgP!Z zaJ+VhvZ?DGRr6L)w){r3qN&dLcIEXJ!2-}sh z1>5xx7q(l#hYaEFs-I7`%;T?yzXkl&^S7Em%Ygr{|Eyoim_&$efc@olDXEP3)g$_j zcrQU}mCwgR-w%|=OR0JT_m`yIJYxO3 z1avvq|3e-F*6-yp-ztVYRmdo8^>&AHs>FCM*67O+7Exy0I8T42Nnp^b^#jWtxs6-H zU!-r6DOr-Svy-Otn|V1dS2W8wS2Ch)XHvYBG?F_$pY+L(EY1ZIU8hcCIV9u3TlF$k zDm1Sr{_RaPf>kL7HbpE?zQbuLc$gcY9&|s(fG^}bG(T43nUCMjdtGtX6>^9pX!hO) zY>C#k+pWKbX$Y2~Mi7WDvvaQWY3+Cuj+h|xRKQ;(8E--#^c>>^A zapLRXehWF)eGms}UtXY6igbzCw?aHeh6(XVH;UPv>EE#fg6ieqf@JzhP(ZhCDW%g5y+xdkb4#$)L`YS-5hH#LWJeXhCxhdEv?N^?Ypkl2BypJFAq%58axAuB7UHdX}35pjI zS!(RTE<&gzwb0mdoyHRWH|N|gvq{KV3|*u^uy+tczd8%eOA0`rj2%q-LExOB(l3IZ zge)ccTx_?$9(*Owl3y0p&&X-VLIk&Uy$)* zIepB921A`BsFF*Rpr`IVLZ@n^qc;pEfO;{nQAmC%1LeR&A_FW^9eI1(2Hv=_#~X!4}*#J;1S z|H`gm8vR_eY>Er|t11ifpqEi+Fg*=^Al^qX1cnm3E4zw}FgiQ>#4ZNP4nz>LucRfS zBTNck!dT-D(*cVIh0iC%X|48%VFdXFB7OHLNxO!{D+bv-%y-kq-v~~y}WEasuf&*`8=Qf zF7gpeZe~TX*}pMxjq67rP_Mw|CI6$kxnX>XAIr-|Pb_PFOT}M2@;;LHSk_-!=8TlD zb6e(|E6-86lLMPu=8UR+iA-VJbPgA9u6TUx|* zxv_9}Lf_z8Ti%^n&arE6W;y4v%dMH^19&85mSZqyk9=$mzjZ(sR+4Rltf2mj3}Q%{ z>RMZ`>kC%p`@-Jui{*Q4@AoD0eNpfCrIdBCE=%Oe|GR#=TY~ZVByi0=H_$U*|Nq-B z&(JTe3s4cjKCjh`Ls(Su(tt~_|w`yhiE7J9|Pmf=9U->TmdP-hj)vqVz^$q=+)WX3KGSOpZrrr$J zo($*prcWk41XMWi%jpO7q@Qi?%`lh@UNQ{%a)v>@865Ep9PGA};e6K$Kg)ZWGvW9i zu6Pm=zEn<@VcYA#(tUcQ%^m4*2f)jUW1tl$r%VUh!|AJ7j6`1an3GoIL$54m;HVj@ z%&zWqus$2s_MY8eGS2J2eOyYcVw^_}@w?PLPXFCbipf;(;K&3K95Oqha-J{$7fVkr zO9V;#{5iiYe~-^M+q%5+{+6Kd4S732D4VX)Y@JZ&lZ50;BvfwzHVy-juC;F_^1T_Y zu~R=^+aa%%2he^gC1c;h-$Koo>RQ|7&-t?yE0wKrv>hZ#qPniNyZt#om72C4p!k?s zPxi>=oh;EBry6!G4%+d40ZFM{ZTs!9+VLsZ(rQsDden`_RM|-yMa%7GRaUTw+n>^dx|BYsN5Q`P7`a;5l$E$tT_eqjklP}o=60hTg`e%|Mi3=spC*X&nJWPc+ZDDPD#C~2lU`E z5e7M>wv;FL!VuGZLKwAXMQA-l+^-&k;)K=*hOec3aDNztFp%RgoN)}A#1{{S_*%+` zF8{G^Z*UkCxIC)g3tXzyGtSLvu5kr+Rhlv`=-?>bxB`9JKJud1oJu+W#;lNFfsH;3 zU&a2d>x2oG!oStd`u+8;4ZB+!opQL0$3WzwmKk=(WOFY=TX>SXA8cwl26qxDTTx*B3VX!;qJjcJywzcPP zm)h3$g=74-`cJ;y(xT^7XVdJD=v`-1x%s&H6Z6Y_-25N?byNKDh5nk&Bg7=Uiy}Sr z!z#~(R7r|!@ig5mU_4DXNq$e$Y{}?pDklf`)RSkcuBL143J(*A-qWDyo6MqT$BQ-# zyO}($wTENQ|A0P=f4lhakY9%UamV;w^`8z1`Oh9nH&T#)SL9QsZ)(_sl;!7jC5_+L za-Z}mwi!VH^H^`C8<6GQ>xGClj<`vdECq(YVpKwdPP5G@6r#MmI%E0 z4Gq#2Z{8};j$V|=D3|Oeu$xR^vrS+!*GYC0*i9y|*=GVf(hF?12~0SSz%+r~WCELQ z0+UHoV4A>gIun=(Y>Cb?f!$;Rn{5IUUcvPYq!J(|$eT=%vrUkC{#_w%s*x)lP`O@2 zoM#ouQiec$%~d~9C``od@Brf-F+}a}Pp!Ya2~*CxqF#myC&b4_jNA|!>)i0gv4Ygj zWVQ?~U8C1~d2}XYtpS8HvHq`kvJj;+!1l~9 z23!>C->j|#Mv5wR2q?~)Mh8Z3v;#_Zd@=zo9(%H)(;d+poyZ`OPMH(jRucQdt4ShT zU~*JDHTpgKEzx2*z??cadcAW_wAkJDu3Zq8M%%AIgAjQ!gVmyd(~C&|Mq^Y@Xkxuq z7H5CDKcXv|Wsf#$Z?$bS&EE%non1J~WYf~U_MO;Z?6NiB5owx=7UGVxldMxW@K@Ntqf#orMyv(>&F&3nK{9yty)!lG-Vi>dt$ zG&{l)av`pB)po;+QWYq*e!T)51f+I`P!Qv+rpwU7QybXDmOXuzEfmQ=p@$B9--MvL!t#ZX6a6*PhA?a+C=WBlDy zM3|xQa;3>5H}<5|R|Xa*I&Ezb#;`dL724(d)z7w8`%W|SRtpFSy;?|eq?jf6nxoq zIsyl4f8VXEh7C>1)IOM6A-7P*8ht*fN-k+hD~jnp3>v={=B)FWW6AZS&!``as`ylBi;tfK0`J%3Cl32* zJ$^Fn#Z3*DNn-(}&_n558#ZhX%8q!cak42YCtvZ(K zfp1g^m~F;n+S+gJE*Y74W&iI9bW*q{VAD%pN>huBHS&^=&he)@io57n@WMK^pLKXoc;^F^*Q4$;p^*juE9s<%IWe9ec|8DtUX@j{ZIWz zzg)2Eaamc;PO)u@W<`KMC9sp0GNE-7KAnJk%Ha;_g%62mEl}6fsgVy;wL6V`r|a>2 z&zFsP{=lHclHZKBZM1DDh$ct$4C**so{qg$Gr2bY*Xjq&d<;oYA zq0I#THrtjd+jmm4VcEZpPY4Jm5uGsvA2N}cBYMre8Rfs$mwm^9xLD0ME%6qD%c zRB3;{Q`LdxHrpntjmpU$m*XWB*3k?9$y#bkea>J@_$A;;MpxrBO4GF$1kFs5Jhm+= z=U!Voa!VScA(hz!*A9t}T!%l4oQI+E)CeAMs2)5RBDz)`NHUX#RG%;X^rDo)B!g-;=K+ z)7&mK&BNvhxDpqO7!3UgY2jg)t7#d}$i$W3n8v*VD}KlaB<*^9n$tGTp$bzNhRU;4 zO;A}s5$u5B3M5_8*1WV*jj+9@JU>H+mWn4|9=RM6iH8Kuka?iNtoT8N159 zk~&F(RrY$`G^!+x$C8^!Q)16F6FfwM+(y9>cgSXOkC$Hb! zvJU%19KH5JDd*q8$wzGwRg;gwZ z{|!0Fl72dt?@oUkEvL4}A&X9ar)QuFyZLgC=cldGweKaK`+4rEbbWUl@4JAx(?P&? zUUu1ed7YQP6Y|{`iGGj28NMLDdx`3h#H6{?;E%yj>B_d?)(ly&sDy9ojuz^_2MB9#Y0|=hXfCkkjl(^g8-7< zqXTGT6%{zNlK`&WOO0iDBb!nKpSYSofl33r7EOcdo!}yU+qJt6q#vCevyXzH5=vpN zwofL3SCpU5r z-Q;1@B|6g`ccBb0G2r+Sh2ojE$oLNXYI3tlzB6bH`k26(6yt@bb4kEVC%mlG%gVIH zDNb)~rFs_n5Dut0=x`!6gT%s9v&>H=5k8p%n--nRt2$Av4l{~k)8dpelaO#-vjCmXl2ml!A-yPVpcrg;^A`JcR)N}iKr+Ko|9xJqG z&vf7}3kLIezO#?DX#Phsm*e;xEE#Vf!wmX1kTloy@=rU@NIt4>^0_3Br<5yOWU+)S z&HdW?`U|b)_Ms?nmd&@!GWIi*vBM3*wI?qy?kSrUEEbnf-$mpU%l8MRar?qIPpI>S zF4t1ZF?P1ln020MVeu-m{cUOVw!Gu1e+kN#!_Cnwk59__`vuLzi1i9x}N#bSh5rvQ+}uehF3;jfDvQsI8cjrBEy#!w=9$T z8k3eVehy&Ta{xuhSMAE{f=z z?NB=W^k~D!Qs-T#V?P^B^`g(DX0k9@CMb}99OKwC=ZsxiXzu2?1ZCPAlz!58Hj}Kf z|1XHI4{#OU0hhky55vX3N>QaoHH}xt0;j7lrg4?g>8HC#*0bljzJdZPquf4!tUEOL z5t)rbwho)6Y6cs?rN&!W89;RGcVCcg3zeyubPZ#TGa~b?n07qD9U!1|06DrQP;e+q zHx|j?Q&egct<+n@+{-vmjO7=-%l zU0D{ZH_DXu`P9^1JEnA{%K96M4mX1+sa$ShIC5AIXHMeX^**sID`T){23*N`?!-q;F zr`giN7OkskoX84@6NSc8oQGS!m(Vfd7U4Z|xz_3dAp%elj_nuTq?tgYsL}pn&DKWJ z<_VwdH8OBQ&g=(=@^m%*o)k}7DQSZyl5ld%n$eliJ8WE=Gy7&Bzk#}tezD}<3yT@;h=eXx`)hwk%jwOXafZQl=3!PiP zK}HoNXCm>jJK$=(l$WQh2k6D-U6R>3{BGw%UM|0hSoMPU?VNt~MsoL!d+;zFZ(M|^CB zPElxdzz9rwQO@SrD!qy?GUfqWI)p1rq!ZL?DWXt0SC<)IFEeL|ATq}C2L%~IUqBZN zsZpZS{fs$8GMl-?hzTntfs(VD6^8hFd#{9xQH)pP6PTvfxVF*ym~M;?su?cS8y->+ z)t`9#KNRo7B{<3rC3iOqTh^@cKv1ZgmB;*wS;p)Ehy|wWJ(K7}8S|yP8%?wYT7~Z~ z@x@jP$15^EU~G{5a@JRx(+w6mNG@968a{-|!NgBxbl_QRv83p?anWe<(ZF?b=_L;8H7|LF!;6C6v*AlG4_}pQGvn>+XWyeXW9D0_ z`rjeE6Rf4hYLeutZEtE3VF&>0A*Jxf(RfLA!y|OIa~$+E%BqCtH-T3KBEF zGQ)E*Hb9z!Ogg6x!=la7?RZHzPfNgv^^Dsx;|-3+iG=y&aXF0w^VjURzoDiuX~f{= zAINOr;{!#H^km`u3iWDHRU`8gb4fQ>a-zYh`t?wT-#KrZ6U;#!=+Kvicl`=+0S9AL z!?I+MCgQn3(oUL7HNKerHJ=X;VZ=Ph<^ zN7Iq;dG&wO95m#Z@Qjd8=vfg|1Tfb~hd(28sRk7Obs~Ju%{^tCVtdc88d~3-XDNm9 zXJ!wr2LkOJcV)gYWn6ImzAST%T+HWM!uOzPOzIaF@A117h0RqOV z*Kn^z_Pa3T-h?9EZ3#_c?w(B-zy{sH?p@65cT{{M~;zoe{ro z=q}#%^;JWq5MYdi4RX{qSfpWGUiA;^(DiKh$Z~F8M(jUQJ!<(*%5c#{e@<&Z>(qvw3K;*F?8P)#r`!^Z;LbJe z6voMzj%Hn|G1|~jwV!v@X@*+AJfd_J&H*Ue3f;Cts>U9B;PU(LS}MA@^0sYB>Y#f4Y#G&E4*#i(PWy4ui3+N%eSqyv zjxdO?$nA0`>0Qp)b7M3ZY)3bnvVU0&-2)!~p!wrIp_;G%+B1OX|)GBp@rACflsKL*;Hn$wDhT*><_`18B8Fj#8=X{HWemz%GH9Dufh&BC;>A9DOae*|DTJF`gtZ= z7qoq*%2Q)ckJmNY@l`c~m(wO`5z?stR4;bQZ6{(6=;qKekmCE_sK$hH+Ru}EnRT$8 zP~~Yr6@_obe}S12jhS+Cq=K1}Ud*`rVn&D;x(TWU8E3}~<-3IlHT?wRSP7ba1x7Lx zWFjQxlcouc#?kZ@y;cjE)+7kW)eD$7C&V zcO*f>K~<9j{$65K_Jbw#GDPZ70u-qO9bazi;zJ19V><;zckF=#v~r-SL+Uv3;sVso zGec0zGjCTX<>W=P0T$E*B*TG-psm7}r>j=d3#h^bB=nI2ASpdl>cX=?11d1BCd)M> zX&y1aQ=4nda2yO7aUaYU6Q z;P}XwO=@YB)TzXuov4ws7x89|+&wj_=&g~UT-PWK2suEKn#jrapufhR0Oi&=KShil z8;OPqu7B0_#vR1=!F4V`q*>VjDaRHu0YnaDgKJ_m>q!6+Jja0uo@sT35=={%38r%} zUQB@SnoT+rgdjK$q91~#vw|ef)rhWfYuuIyUNw$uQu^aI4x$IQsqtEr`=u!*{u)oB z9;rR`&?7U^6hUhoNDo@2gQOl6pwq;vHvz>56gV;o{tv8jyqiR+8m~1eXP`ChzelT# z1fNDL_MkPXiF#xR8fZgLqbhpHwjWkC7D0sWo-|FgH3AMw0ks;Ja2K!}t;qydIplgK zN54?_V#P z*?X`1de-wi>silw*0Y@Mi~U^+m>IA{-NTEg2C#Se6!Na(O=sshZ=x!|pI*3`w*VIw zLJtQX<@TnrcVP;PCMMym;8Z=<1LVd|bc z^oGtsRU{3#y(zr8cK11?N8hQ%?sE!a4S7Tt0A4WirMkT~%3!DNIS5#2UVKN&nB;X*r$@TBRJf=7KaxsDO z6XpeM5($QcbJS7-C9hKP@=2P{vtx(N!OjDc@nA$~;BwA*2$*QGSMeszI7bsm{CP}e zR69n3YP!mRao%M0W!GQ#Onp+fn?`lccytG?Tna9|9QlAh@t+G<1<){V!9?ceT=+l< zkTEGIW>kVz8r4gqik7FubGes*mBQYgfe5suI6ll9;N|t&AoWH8H5({SCG~f)cjEzT zc8;>pETMQ)&kb?S&I=v_b5T%?7Xo67qUBUvR4KM2@a6sCrD&Rdq4?rZq zMS(aPfFyr@6#&r$oqK|C0YEVdz%N4&M9l02If9>+BU%)GUxXgD9L@3yZzD0m5Y()r z*{IHQ!bNwfQVxUk5%A4;HwrY6GQo{HX>@)J_-Gjd@TKVBvws!%$Rcy80X*Sd8i3K@ z^O9-*Qny_PpW~l_k7)a=z?X*B6WpBfVT?bG8eyXjJV1fCb+K@opnyRois#gApdCh^ zgOLcFa0Ub(iuoceN2B3b>>+wbZ2+Kwe?;R3{*4Bp^S=Y2K81Ue|2Y74w9{Dt&~OX@ z2_HE8fWRF8Qoam8eaQegfFTeR4eBMxpe!O{;syrt5eDnbgwvJ*Nq}X9h7;Z1G!8Z^ z=0BZ-q_A`G=z4z_@-8RlH-mT(u;Lsid``mbnvOrj=un}J*c4hHe-WdA^58)Wcx~8iFgwsaXQSofI5GzSIqbYQOEChxdJr_Il1~bJRHyNx-{w?~o_MWpbdx#& zR>T3h9CXYlT=WKI^A3@4T znsBZG5Z85{kG|7n%*Tp)WC!%AeKa4^i0~o942)@)BoZ#6EO)=lq3A`wNIr-{>$E-# z>tceFdc~)G9XW=nl17F|5~~Z0*Aeguy`gBPn=arj=B>n>Xutwu00AS3B!YCFi-u~r zdq`az?T{fSV2r58z%HlJn^7Z{>_$0uf;Rd_5`x|rU_>Gx5yCkK#|V;K0B@uslH#j+ zqo;hX$9V8@209RB@s{ahMIwkDQUgf^z#EPcgg98=^0C+F+2T?2tbq}Hp4Cx;W?4eq z5iq0}gEVSh1eT47 zmBb66g$OX}U;2(m*8_1eXcIlUJa8Pm##vZqZ=lm02qaaOy(Im z-wkDo%I^=I4`o`f|Mit;LYcO@;#u}krv1YEN4xbK702o_Nv}v-5&A9jIGx41RNFhG zki><+Lce_S-ZFU5g^3ZYXPoR{aPSs$fm3xj<*WDBt%Q!zQSw?Q61y&!p`B@oOSIPp zpv%PZ2q?k})zZWzYVLAu)8B_StKYxZ6NWoT+5%0YO(ob)&kPy~QjkF22Xo>~PnZs4 zt-yw71b!vSrLM#EUXgHxipN!7pGQ4x7T^Q_Wj|!|Wp3V}}Du+*Zle@)DS`jJA~=`AArx#4z$+}Y z+9=vV_MDDZrMQL8usFy9(Sc*?HDNfjLB(F}`yX+~HZZ9v)c%#;GYN{?QhIfiYF>I; z%d~v{M3yA4HV5ytEnAfdN5MVI;qL-|&jBNVE}0Mos_cEQQ;1XF`-tMpcmF=F3i#5p z?Yn;lzSLZNbPn+4p3fHl3iz^qNkU;L)3LEK<|m;{=kJfp(?gkwQx2V6rsO9n`N?CD zsOd~Hx=Yp{sd&Pe=(egPw9E>7c=!R0?hvHHJq$i!1x~3^0Gpq}?9u_Q7t0r={jgX| zWnL=}Nn`mo9)f94Pm|8_9XwL$aASiHGE~{A3=oka<&hh?nK3@(^%} zG#;{)<>-hHq{24E@R%;nU#GK>`A~;%p-B`q2Ou3 z{Rz&^bxG_>Ff_saR&a2z)5=;qniP`sOjv@VRM^G_yAn_k>U|?PD7gDEW3Ig{TvygQ;5<-Xot%c7lHlyfhB=wNiEpgHf(IuA zyT-fUW^c|ohxr&UP!qV{oI$$eHz+HZsDrQ3ox(8|qMC<-J#p?H(sahsW9Ur?XDQ&) zB-|#?IPd-pHbdDqx}G6LXj(`uiMGIp7WkllAsr0G_OXk>!xKpE8}A;%18N4+l{(zl zAf!5HgrUu*tV6;DgpxK4EODgoU+DR83r=$wWZUL&2sC*|w_pqmI0Ue9F@dJj@$LbF zh6NAQkyNKJSv*cIpQB871*JqSwFwV|VcTnhB~Z^A%4 z+m;Dv0tm&_go}I-u%&`94uWXciR#=#sv`yGxzXK!3I&1zj@b(rsHX&srYp3yB|Y&G z_UTx2aymYkRX7Z*?|e}>2uEWq-zppeB7=g3BTBxF<=ce=y!w1QXqdmJz$+Qcck=ht za?DF0<(0yL6}atpgg*>#dFlKG`*OryqHLxFXQim}GWNqH`J;QykI;EPn_QF(Z_9Nh zrQw8;`!B%qdGseRGFVrDBvc!m_wXvnju08*Ino2 zNT%Of4a+9m9a2-_)rpy|s^*z~lr#9v>jlC^L(tT49;*TxWo`-P)0B7$J z?=j(an{@w2tUIVV14t}AAGQYnW@QIK^rxMH;=8}W_DRnNt+@M|_45}VdgthGyd&W^ zhvW6{G~@fEm0E}U5KlW%M{v+yio|!Ju33SFce^zwwPjCoHoAk$g*wMhsjLr&LYZR= zO|5)BO^0PwQq9{OU`gIkET3s|^_eDDpJ{USnI>1CX>#?MCRd+na`lCHsz0z8_U~+>aRt?9uEYIT#ti~f;@03BF2&XMNvK} z$ydhJ#mGTi_$CL_P!2vi>7z3Zr_*i(%Sx8_UH80EYYo_L&I*V(XUWji!>3U+=CfK- zyCuQ=!f(oj9Rhyy;KS8fvtU<45D9HItYHvvi`{|JHXFqfWzf^0PKHZ?Co1|vnl z63A&i+24tfopCva9<8y`b0qicuSfIW_Qm|2x|~Nw7sU zqTSU6n=7vwGX4#&Ues^9uMiS@B2Fxl42hnNZ4LQ1sveQISEGov$mN3-%bw(B0Lgu+ z2;?vxuEu6i8NoCR0!;J|u)f^*eoP^D|4Db}GMMOmQ(cHNQ}@CCYa$$?<-z90;_0dR zn5;j7^3j^ z(%?y3On_{ZXnAJkW@PYPm~aD{j6rX|j-x7L2hu2)EbFb@E&i1xSdm^C=a0cD(ePOc zB74DDELYGxLTd-004#GKodtIi{t42~kLBx0z5@CBINyD^8SPg8?G+h|EdHBe9yw9H zpN?*f-+e1!2AnI)qC#(iRodpxFwn(kQ)?rhH)~^f9O|+lo~rvb;!q`kR7U4D_EFtq zAi&4l-HA?R#7fPbD4w69)~z)He$M?QU(yN@CcId~lC?S9x=je$DoZpIDy;=S6L*9ddO zk;_~iO2g8TbMkx)ZR}%Q=p6GJH}whe3!uM(eu#E(AI@Pd+tmN3iIq!#&TwXd5$oFm5J<`4k&qOlD zI!eY^F!uBmk}*~%4u`=Q>nJzIO5ny=;kd#g%?66Yd>EiMn9)#RF-|(d`ZotwOD#@i zk-aTDIc|l189K(5`?G})Tbn}eY(>bHR=-1@`+r1!C>D*<^Lj z0v1v$N5coy^BYEQG~p;=?oy+hxl37gD^5u9 zZmxXbi{$&d-k&!~z!sAq=;rh7FE@gl8Drcycj|v-LjfUGMt~iKQV$(RSM(`1S8gl2NGsLJ7F!X%>NIvWQ|O+BNR1qgJE(JX@^Tba;}$1 zQy-ow7Ca-997tA)x5laokx3~KT;#omqb-95E1OYZWYTkbCAU>p;}eyV^(ZQZt2xM4 zL&vA?Z+f4I3u3z%IXMb_F~8WO?tY~IC{;0eDY3XqgsyZdwGrm8T=rXXTk9LQOGGygHeO*H<#Se-wWsU6SZyDT#4bri%}H{yeB?g=0X zu-~RkWX(Mr@qzokSvy7In(OIh3V)4E>O&rWdToST>HN7hfTS*7ntXD)(%MW_u4Jvx zAQ+84Np^M%Qd z!U*K*vdDnUAsO*cU|XnM)TUAT$QvloP7~LAU^8Hw2eE>U9+KzyLgRs3@27kCn85K+ zDXBNxDHt5js%$>Yhn$ZaANY-Y*x43JktLs+uJE^&uy#hYsND_l8bnU?21YQ8P1p<) z@C5xS^4w?eW~!Sme}i7k{>f+qW|{=;A=Fx`ZT>T#u#HKM^3&NrC6+MV8j4K#!P zr&Xr>GD;q&fHfewD0zI)gNw@uDIUQ*@hIK?;eaFB(#oVy=MjfAqt3{rUKC1KLHScE zpBbjJXZ3<~-n|FKM2p;ncV(UF7sMO@BdZsLM(kp~3^NA2mm{yg9 zGe`l9!!K#LFqqcpo#LP;9CiH4;9q=IT7&PhAYlY97r9SVXhI*&`#C>0BL+w&Di&qI zmtu$g`xDkxnPN;&*>_YnZh6Ke_gk>$h@cagF5u1yD;Fylj0s;j&YG1%5neNCb*B^!|5 zgl{YmXG=R_?LY#4Z;Aex<;PaWmYi!ruoiiO{)HEaPHv90%9Bi&V(X zc(G$Ckvt7?4mz&j#9>++McoQ;;TRLtrWBk+yKwNbu!KJD)T;(<+{5a~OTSg-EMwa&(o8bjiG0eqYZVZ{^F#U8ueFk5M^!jk`A?!XLA{8V}^b z@IxOqdReB|Li!B&uET`lgH_~loYU*2!NebVj-w3`=+A<>zW1yG22wTox? zWIR)jh_!H=hfCx0{?V^x%9mqn9c*DUXlJsT-E32Bin?$?pJL4$bp=WXVFa3GN7s^2 zNjjd1c+SR?DoqPv`-E5lra|(gl8WyX{(ThR=nerMNSTbdWH>oObS6^cet3WoD=OL@ zHiRtjJ1U$G9J^1jE6}=~r5*o@45zP@_D7|i>1EpOdSAw=;tti9*B72yru_wbvQQ7o zoqOcV(i-^24AlRFE@epJ; z4AxB6pITk=5 zOUMiGV%gRW%^cjmK?O%jKT@RtvLs(b^HW}TXQ9{oN8nE^mPupt#u@6jXl_GaheK$Q zI@)%z@{*(-mVj6w?Z`3*vJ1==G8`OP=RrTW-3GVXXC0r0Mx3l*4>v{PSkyi z5WbAmEr!3O3Tejz^Q*KCQz31K-;o`6R0xNlCA!IHg?BlN=VHw}D@IyF^0kljS73bg z$&ST9U;XYabkkl$p?Rerfv5f~h!#`9v znXrur2N+mwt+^dY{%6x)(H74@&CP#~yvN_x*ki^ajkNP<@Z@-*i%KPVh>Ei4McEn; zoDAQJ&?Hl>TRtzWy^|`qq4B_lz(jhpHJ-Y6UgLpA{VR6(EBW4ew#I;Yo_<%5)N(K6 z%4Ov^y=CZ$?BzIaHCAU?X!yn;v}=o9L|{nlA>9L=0DTBxly>yxHeGE*hil{5fx%OF zVO{dclXE-q=1*>mZR>4(zq9d5qtrqqDRuOM=gRNj8$1;oe;{}84@UY6b5BzGdq=1L z2SVCbn%fRW3m`{u;LB8oQGnDj5PUxt+&%sP;1vEYRegEx1*DT&UZv~_(Y)K~E7v^I znynPD(lS!IO1U}`P_%q1jyF&0=!=#vb#&9~$$R5_|ek_TheL(#c^iPUHuV$HsGA_fm7%0>d!c9}1y_O{4Nh^G@S2!}_h^ z@_9UR_jt>SO1{`q^bC#tvj0j>e^{R;Ls#-u3g&2h(m#oh+(t3c-h-YAgE6_pLFl=J zeVVkIZxxl`nX$$N3I>-OFKcPfmKMT?*=g-OkVZHr?aZ^>cp77a9mCHkOYISOMPqNW z;Aq96QN?YOAysLb*kePR}W>M$zE=v2xV5evYEe)_Xbsub!K;E^?9=wEvW)ic8c~Sr7O~+3H0t z!f|;o3_=9ewnQyfP0AL67Wd_&Y%4~*vh76#C|j4~ovW2tS72d+z)!?pnn&|NU?Dm0 zh5Gukwf^EfNb~C^7(oI)c+l5}gRs;0_4DN2iQ2wQtY@7LZAB$7k#Bw=E|Rc23q-8t3L|OW2_HyB?u?F z3JaMjVDN3kaV&x=Ku@EE5OfJhWcH0K)yjX*hv&-_$LCjMl6EXln@Q~e(%d!Ea|{<_ z0u#9qfW0g}EZ|)Cu$z?4{6iJ*qm2}Y0Ec?s639n1UK_X4@B!q?BHUliKUT1iKK+7B z?Ou2bg1=)3WzkUZFT!p+YxTy`++%NRp0#=$ylb>RI-b4@EpP?SLvVS6P^La+VfSJB z9tUUNcRhmnIQT(~FraQOybKn}+E<~B;FX)@_mc$p5pVw z(#}439SdHKb9KpDV})Yo%Rh4~wV*uEN;QME1L>8mlznUtBoFa|NP&u|pf(=zq!;7Z z*18%wmG-45Ce&JtUmzyHa8m$a!I!(UT;Y%!UBxKw@%roBI-sYCiZM3@DGyyt`uE@P zVFA*>J1`_d|9$+px6AS`ENDru{=1z2*7M&+`kl8H-RJt`(pRt$GhxRX_`e(3F-fJphEtWMiWx%{@t;&EY20svW z%!TOiv)TAH0c|r_)8)UDmmy#*j5`af*-Lc)5_{YA&WvMiqB|f?ra+!3Yw?UerLY=0 zs<$wLOR9$-O?Mp`&}cpo#N9;g!`7RSx96=QmTW756CY)HQ*mV8D)w+Sd+JlP zpU-s;y>o1z^1y1Nhpz6XuE=@ZyZBfo8}f8X@=0_X*P6@6@MKR>S78kGhHzeaxZ3kx z?Gia+t@(cNyujBxJFEdl<_N-QAJglFfs~VF=!xs0tHdF@tiBUr{_o!^(E^ z!F-^4Mqiubo`7RIdkg@hn7o1+S2LBzs#`9td7H!8N{--JK{d%SnrZTmY|)btLsXuSu3w10otY$6jD&#(|R9eRSJA7yV(|sb@d{H z&l1Y&F(H&ml+mcA=f_RJyjLI$sTnYUumOa zX7iXtBPM-R%pAlR!I=o|Hr}&U(PO;kgMQ$5%GE@TGr|@!{v||P;cXkZqjag%(FL!J z3Xi&!TRdG^xfD(S0d|&~LR;jxuo_mMp1xY>=hVe!R+^?Xq~a5b%H6b+hMVD)hBPC9 zw%b@~y3#P)2*8*jV2;v|ZUn^efJ~(UuBLezu{t~08DWRSg17Q z8v&RbO-jSUj9hPR%x*Aw6Yknm8oaOyk~aJepONI2>IqpU7As%AAZ>(wxGBF}iCwv( zts4ss?5HE$E~(f;FlCMj&xP!Q4F92L$Q4I&PzP*qw6;-c5o%wTMrlWf+9~bLl-52fEkf<<#7qQ&mW}>w+F;8v{S1FQ@z;;P zF#gN{z)kr32L9&b?*aTpCrM8KYk|>_d0m$uiy^;}-E(OoZb-uYv+xmYFB5_=Uz^W2 z0BoUL8b*M8Emk^L;3AW6Y`TsRt-rNIJA~_1TRIyAbM9JJuvQ+N22(TKJ^JIWa;2cY zt!riXSJsD(A(ZLrGjD0c^Q&s#$93BOx7rtvshxFDX>f%t2T!4P>^b2RcU;4fPw`C= z&w+XiJAiQae%``hd0PiaLl65uHZ>~ zd`NyjZb0LcxeG$0d>}G#x_sq~F0M0*!kV7c|1HH}m8_L!V^1Gzr@6U|b$Ibu@8On& z-*O!(n%YIPsuKqtF0*&)t?Nb4V4VdjNT?oJLXlVd*YZfjyp1xgST?bPO5{^N=0qs* zn79)QmT_Kf+E0lOin*{fszHOmf6w3$1obM}eFCb!g)lz5B(*{`HslfcT9PD#PncYv z>Ag7!zxX{vA4BVChe9UPw8l!(JH2@zm((PdYCi?9B~NQu<@;wtEq6M`^$Eq*erU+* z(D)^3hkL-JZLed0f%JVSBZ&lcZ2(tq;|}jKt>|Yc1);(@WzI9o3(qvtVC}Wd_pDA% zshy1mrwl%XRfOkU?d_wBT{B!PnO6)KTaRLChQmGxNnIoVP=#2E%^htSG7hgEM$+&B z_q;^4*IJob;KqBe(9EMYHRIQlRwHGR^~%+xnv0B^)-drYSN2o&dQy~cD`6?F)v!0N zhc9ob^;zVC6X)pu>$8pc#;pMkwr>Wy3n@F6-6dQI->g^i60an-W@;90M9?d_3p&0; zc8}*;?L;&v6n3%MPq}=k@Iv@+qgtlh?|IT|zB#IWZIc6}M8_22I zbE3crf5--EI#E`l#r%@vKD&(bFS8-_ z4ksCfKu+!3d!u-XF(CwUa=i3lWej|FQ==de(M6(mZT-hEH|98ueU~NLO-NIswx^>3 z+Vj|A=xL=Un2nbBA1)!h{^4^RkI{xqzM{@(r%u5={PW2u88d4&+e#s>;QeYz1fWTp z(Kq9mE?~8Z!n}ZZkB4We`HLQ?6Lt>J3M8lS?kgNni^`R4B(^Pss%fvy5Y*)}*(5)E zIn6IGtIEX15$I!?S8;16f5MxFix`ILrbpX@Q)SW)n^k^aieztes0%m3g?UenraHd8 zM3nxCj%4i^}7@tiCx>Oy-ji&45o4h8e>ADNgI&0H)T>lKmyi`x9mFSw}lQ7Za@=zmvbMfYaZoBelq%{qE z;Er&ThHC#`)olThOt=v4(#=~!11HsmTSSk!W`caxUTejgD$8T8y%^a19X^4ITlCZi z1~egiOEw(oKUAAg!8YbnGb^Bk2y@%e9Gn=~XYpLC`K8Vxvq#NReEtKEWcJbuRt>2j zLrJe-k6}j?zEUQZS13Oa$E+~X8S>X{hTG->(NkcpdjzsFQ1ok_-nv`7m3>f7>efTu zzajGogWxNE1%sDdE9)%^4q6~;<9wSr$#WU!FCcNNj`hM(`VXs%Gh09+$7DG9J>eg( zGmATrS81@8E7RbwZwzlI1_MXsk_Cer1>Ju)q6K;qb1>Qf&O%dj2D_bS;%^{HJ* z@!HoZJ+_!Kxc-1ySc-Cox*9}SNnTDIN+sRs;81d`uafE?^FH>zQ?QYAXN6K}K}P@U zaHE$?3*FtAm>j6e?&-r#*g8Lxc4k>rF;f+v=%DNs8EO7ZX=k-X+WELe7=rE>9DLoK ztlA3yaSDv3szqEOiQ%kZnU)H37Seq&zps-mq4STZ#s7rtPP0)o^%4YsD zs-Z1#1Z^D3wRMwiQe(&OkQ6c>IMyE{{@Vgu>07%Cnxw2J>qv>f6e}^r+UO==b`V*8x zRpJ(Obl-hKZ6y^U#OuAA0jQ3RAb%7AkEyEwQP%npVF%RQF}rArk@rVjy-Ir}0@()Y zoo55}6embJKUH`@I4R?2G@kHxyn&to)YJ3~V-NR;b^(fCr8OJbmDYvy3lE6A3f8U% zE=S-i)UXPePV$8O-nI%Q-%{B~#U0UB6Vhzq$+JW~4b)9+3pGk8M66XV5eb`E@Pzo>Lj2e<)qY3*5O_6FNOFiKfOd{yQ zsKG|Q!AwjCr8(=LhqRI_{83n;E_`jgemwgXnhyg@BLKqZJtmPvak%R|hcj?f>W^cD zF%;;azEc6z^*L8vItpDy=nm z76w}D@X)sX8^;Hjb42BXKy&PBOyjWY5b7`T3my4=%&-(WvTiE)3)HxQ%{+-;%wtEg z^h+P>H5}dELW=z=xHVmhQY$-Awc7du1>taX4zI{r-qV_e_Qs7&bY%YwdCp0DL@-r~ zBT(hjP%xPW+mk1PAo8!Wnaob}H#j$Y7?XD;CU2U%Wi3`7j72K{J8ZGoIM0l;TzM8z z+PT=Gt^xBMghJEo;=j1Y=tqQrSiB1d`mY4?&6osm7AApooZ^-t)k+3sx zM_2#nxP~0pl22K$5sqc{W9i=P{1b?pZI-hkwktO&d-w}wQ~pR0gchiREcrapytbFFhm(#b3HFGn2aM~DFXAP&|2bVjT zeYl2?3WL1Rc0;-yuGd$=UZXQM-R{4FxjomCvDV^GP;k&`pGXDzLt%kcTQHS6JeohD z95T&{roGeRm`K8ZJr0sd5EP z#^9M1iZ>R*fimC1E+EY$vPAL>`k%xVU?bhb$LQYb`V!C@+rVK>f(n^j0aLMh$Gy^S z*nUi}{eRe#oR9v%iv5jZ8l5&^v+r&KmeV(tpyc#lY4e)z@m{O3sg+ktyxLQ^^_1-c z*)(3MtxawWT8PBtTni3*wH46#HR8S_?7H;_yymb-<;kxRLBa*Mx5|vZzDOH~Pg1j# zc^39GZ(o*0*}&(L4b&cNy0@fS_(X9d3^#f<&^}mHG1ASRr11?*iEN;!{zV+!^Q4CF z+5;fOX*kyN9nbMK4%*^BqJ4*EtZamK`d)xozJZz(@y}vUQ-6WDkR?`?VJa+naOri8LlqZKJFS4$(*>vsQF)jp3=@~@-?$> z<)v=3e>z>pda!>Gg!d#Tyn}FM4l$VwmnK6bAS*g-MjC!fJO`%kpQk#0N(kdQJ@sf- z#f$?L!hY2;)$;~9`KS=^2`*J&31ef~D3R`;rQ$*~wH862=*9GIZr6qg9>R!nc35|?tWFg!P6~0-KlR1D_i&;^^Q(6-;KuN zMc>s9l!4mjS)gRAZ$PVlNp~lWY;LdA%|6&xYCDMFCvqqjQo?u)l(eJVTmp<01{Qhx z*53f(#`jHx#UX_-0BQPMw8lJh8A-TXXvbT_T{IC$phmIA_CCsLP8+?yukUyB93#8j z*b-Ox=661J$tUBL`4PxR($BhKenfYrGj{Be6Y-vF5ZP^PJyvS>O3!tucEkGGg&s(^M=27%V zdJaMP!T}sNZCAy1Y>Y}f-x@gW-tW5FauipuR4D1f0i~Ug0GAs?Pxh%znW#3@M8RMk zCLS?r3dYQfB@wB>Uru)7t&AO)c6wYL)L3F%aE(6&Y(xhsn2;R~Q6PKJM9lr2NIRCs z5;x!MCNTRh;2WnOO~OH%WU(fG&&*r&MKp$9V>AkPa1WSexC((x>|PX(p1d9mEVcyl1QKU(3(^^IbW{$s9IhNiI`m?ct-5)Kwl zZ$g?PKE~A`R(3oy7>;TDz)X`9n6U5Gxm;lqk7eKsloG*|x)e&2R68k6!V~1zXm&99 zYDt-KDVQ0}LrRvlV@n65DUUL~RDF_6V6^me+-DL;WBKpXv3X*LhRRoWlCIBiMN6K- zHjw7m8`{8YLS@>EAOv|YNr1$Vtfrh2V@mn;aq>KIM0@lixq8ar6CqMzmZW5(;X(Q( zzWQTZXi_f2QS8<`X$J535TBkS(uO2_6>)80MaC4!fb&F8S6zZ9v}Sy%whaeM>1_G3 za=8~r*h;nkIsx#s6SgsKw*!YB+p*0?-DI3Ey85K;{mK?fA#-CNQ^~6YT&V?Dc$r|o zz^#JxBA`-p_u=*xP*%+(_&qu{TpIxAOe1%FL#u_`oc5)=-{%IKLOtx0QIPb@Bah*`cD0?;kN=hA8hmKEhD_bd9Q1u&U=w<;ixlT z&Q;hW0bmE^bx9`wEwHT3#8Rdn%TaoR-Jz0`r0wQdZI{E9sj#|OPy14;ocfQ34+sggw1Kx&*`**7^0#v1r3Ro9A@R6v=Mrum>p zWg*xEb+W?`@2Aj0{d{pM1|_28I5jtKg$>GiuRFrtjn03}?-YjQ4z8#5yDCjK0R|+0 zMSjyf5Tr%X8)0Z{qblT&+OJ2NLR1UwRP6!(a7K@a{%u|N_dvIB7VH#Rf@iIA z2icR|R=b2nAlTw+pLVi4lY>Gyj@f?NcnKDbj-O`Y!7ol7xa@vosIR5ZC(IAS@t1Q~tGkVc}q=nJkTr=i;{|)lB@%{<&4gwOcEu{uxWDrwl&h%^} zqrDn)CM#H_tZpx6rK_^MZ~<6?YD-rsxs}SJtF_RvXvZK2A-T}aUC+3J?8rz@6(02} z8L?;;Xa;)o5jTMAB(Wi5?u(z!H?5H}b28?%&}-di6kI}E3zd`_AE1YEOl)}pv4r`q z%lhukp@H+lod4=WsBS$Z?QCv%u)t(mOtuS9tZe3AxJ##DIYO}u#lO*?OeLFlNba^| z6`@anIqwsP=0(`x>aZ9+-H^R8A-LR17K|`ErHA`$nX-)#eJ(WkraF87HZp7s@wiPi z#;s%&Nk^TJP@lBQF#6L@Ve*y7Yn-FUo`(H6YGzt^iF_p!ku-{Y5UVT{xkr!u7FV5N zD_pCxhrjk)A|wBeq|eBKChgF`si7_k@_nr4n7zDW_>YNJs){q|P)Llc3+>@e)80Hy zkz}rk^9m{GLqa9Nvyuj)Dkgj@LNT8pw4Oqj>!G&F6#5eB3;2InOG4YwK^tqOlE5Ww zFil2HR#%t8gK*9P;86DzJm|%oEbW}mx^Lql8`B;vffNP{!oKUB^8;qwF_x*zZ)z*W zc=13MswDgdEn26ugL+|Y&391(bt8X_0pr<$(7T7auY@t>v(wu}je7yc{ zf^a~zR_0 zNzE_d7sdb+nyy8#ZCw}h8i8W5=Ze$0vLguH2Z;qw#stIhRWa;P{4s4Nf}1`f<@(Tj zQzJv~$swVPT0apvbqdGo1Jz-p8{T>#+u^`fg+HBAaMLBQ3SZ!|EPd9`>?_ND5b>>lROVL zshfEKhxZt62YcnxG7fm`_~^`l81jGqU5EWQ2Wb3x-AmAToc4r*ujv$rMf-BVpl#!< z2TMVnoB2c9ah!Js68EAKbsNQODnUPxm-;a=+K>NTS-w3h(4&=93hxn~)FU3SGV1nW zxL33d;J&0jNdVyX%R74*6i-bitP+O$GO^1IG5a=dT&_F?^BR#)NaKqEY@P3q-oad&hFCS%6Ujx|C_5-W(5pV2wY9 zQlnkM#@0ZX5Rl3bhHZ@>NP*=J2b!5BU%e4ct$(@dMzuA24$US|?~yk9$F}vNU~VI! zH|XGirf#Lm;L8dNuk7E8wRc9v6%AS*X8^=36j72D0$@pG0i74mhh@q z$l^y`WcD1Wy;)t(M8jT9s2M*`?iM`!X_(TUe$<1CN#Q0peQZTt>dhg)zqQwl7clae<`_YT5D#s57H{zS9TEA5zv z2^t*+h4%d1%zfXz9j5+BPT^J*8`Xt?fJzYoqAd(Pg{4Rwjs_jd^ft7^1Ik^qtgujasu6EGC@qKQ1cS^bVs~64S3#mY% zWl*1jH%zV><_+L4@E4K~1K*g8{I$}?Qz%E?#VME;x>B=-*04=Pv#e5l_$aj%>|^+-7A{i1u$9dF z1cRP$qW-~)5$;n3J%6m)?!*nZ=-qkVyK4ZDYx9eQ zC3+7JqlcScJce)2CJHq=>P>{W)^ue8n&FQ(I{DHSUA`GTz0i5z!7}yLKC}SyPX`;z?8irgt5cgxE^4m1-bj)gUMG*_1`H4 zitAnpzeiHN(d6q~$05hoDqywDS2-eqOZA|=nu+UcWE?n+j-u0KbUK zr)0!J4R32m(q{GXY4j$3Up*xQt(<<8XoX7XW{a)ZSb9H>=<=g?AXpyOUc`ehwS2SH zr}un_7MH0{5+p+#2nfh!(w3hlpo0R95}z3|(x+bN;4y%(93?XTnaw|vH(RJjeg z)eW5}6g!=3en8N+0mz57M^GtAt8P4lnhoY#hov3Iv|@b9*Cc-yqMT!+GVlrWKO8wv zbxPseu)1wI(QuQY@3>$7+)+E8qD(n0C)QtB6cz)^Q=K^ou79@5p>C&nqXY~osSqQ4 z4kEJq1oZrN*nq)+6=MfwH!E8!pN`3xj4ASn7Cx*`kP+G)5z}{IV1Owrhx3S1J~8HbuGYfZ z_Ej?O9G?e8n&&Dfptmq*VM62#<~x+P0In%r**`YOhg*97INOs$ghSI{4w-slOOGE8 znTE;G(YEns8U|x3OiZ0m-5;dR%a?Cphu7h(jNLy``{fDX1eT8zu$-t8!jkrHM!+~Z z6kkPZ^Oq0+$gje&kcSpGUE2%*t^3!u;zU=V*eJCnvi|SkY!p`d#lmvFSlB8mEYfgO zw4j@NvJ+EHylp6DP%mEExPmq)X^3F6vbJY~kI=F~#C+qgBqLk(N#Ysge+Ldc-@9B%xs+f+SuwQGI&#G<_cW3BpOi^&W*Ms!vAep%)NN<%AI46e6hY zegx%X9!kCVs|tN4>O>l2CfbNdgSrfArS%0izifb3(c6G0Btu9M{g5I^$ef&s0R;LL zV7I!?T>`f;@alb7n~9V#Sz$*8PRb!GoZ91rQ73F;N%VvC5r+*%Y)|;#C|_Y%^bJ>r z7rnkln0K(_ekYp`Y0sV!+mN9B=ylExVz|*-yEj~ zOsEpr;Xs^r0AFo!(4dQRM3i_~Q+Raz^-iom4+rvWJbmN6F>v*IxF^phXq8BiS!Jif z>>9%dG8OYo2}JUNJcs7Tr@r|)cDn=mC%PLYzla@gvzACZ`U!js%M@R7l6*B*+HfCc zn@IAHpUJ}!t{)M5ZMA5X7H!o|B<`eJf_J5nj zvIAIvVqMVE`Pc-Zw`Kp@Nu;kchi&R_@Pw%RnCJ>Bu~a0Tw+PV{(Vi>yyV0g3T1%6s z95`M^H2VovF9$zIT?^F5BEj<(7FKi3d4C9}doBJ{GMtijI3ddm2l2z+35G4MgV-L7 z2nR_rvj*}b@SGlSVi%r_*7WVdz1#{XT8&Iq1T|8cd(nboxid^MW-H+!?CYi>W@*@o5Br7siHNa>$lLN)l6F&#@#fA(ix3;!eUO1Ue5#8x`{a3 zJx}y%FTDOa?az9F2(aukyN{xHx)|DvRch<^^Z_iM1;-Dyllgk}4%^*%0h>j510I7e z(!ga=V$T~jZ;e#Q)?zZoB@sI6rRu0hzOJ03(Qg)N*3oY=3k@AZF^M67hv11eBt`e< zPzc;KB0`dXj3{guC!xKGtj~pdx$}$#L#MEeU)q0K7^KFe5JZLgJZZ-|EFE$_XGdJU zAn_oM-m(ksPh6jHY`}&;miLQ3cVBe{U03y-2;o zi7Jz23=xhdoCqY&%!K9@CXgv+v^3Sd0Z1_CZdTX+f6$w-3+1&d)Lx=VqBw@q7?*-^HH~ ze@*yn$KOxzNApf0KaJ0&U?=<7bIoUu9vY7`j({7-pQL75L%6QZ=%6!6B%?~LWN==B zE9ilEWJSCSo41}RH8V1~MLW*ZVSEy4d^}qzs&)q3LObljKsb{%w^ER++Y_pd1r!p) zCs1T!_znHsQTrZ5a{Td3k)CKr5z#Ww>t!&0Lee;Md71HZllsZa^%*#FIauok`X;&# zO%2h3OMcw)I6rQgP_#t53t~mvLbJV4*NT%iv@CP#-^GUq-9t{rHTQ!_VTo zt_cUrNRHn=5)+jPXg`Nc9=P#BC8@2zwwg?l@+FYij!~j*~*u}_$%6lZ-Zet6u*^a)vL>=MPM6dVckkreOrHd zC;XG0GB4{Kj9VEfu?H4Se9>&=ib76*Hl6tkkaT3d)kiFn!6k|;h*R8K9euikQnrQhmyKl_$rv#t0{P7@a z%GjuT@M$c65~c7oefeV_UiT!9UiT#Obc48W>CLDvm0tJj&>FhoXq#nJ}`Hc}U zywV9F04tp;EKn-2K%uqly66za^R*9O^gINX@2sR#g{4^0rqj|Uk(3uWOF*hEQn6Jb zl15vkaJ$-m>=s?c_B({r(&h|UMpbH4&)!rjq&b;vq$&Mh5Dp`-6~OFc2;!Qy7go~x zhUj7BfS}B6v`xO7SQBwHZ>VY5`soiy4v+L>|H)@&(}A8jjq6j12POJ%SM$=mY8m{s z=84{(yi~KMaDyFxLeGXiXll&m^4{4nfrEyGEymu$8d2yaBwhK1=&~gC6sVW-9u3u1!sRiWCj2zo=-~$F{$W){It8(>3LeVP(Vi*-^#a zA+Bsl--YA?_83Og@OSFUhCK3zA709p4LP3EwUgC_+h?-~sT*=g-Ef+#8{W{>4P5^| z%}_T?b7eoBHcILKw9k{5W~dwTc43CW)alUo@1b=g;F#-fmw))F$^SKJ=lz#)wTV!B z6MQoES19*i4rIeV>q$y9_%OuFz51 z-OD(ucc)kAZu%ST8V#J~%WdI+c{MaA*a=FYWefP=G?e5tV_LDRHs>e}5C-PwP%`j= zL9>#fPuI(aLPpmEHE&Nsg4$HQCS!D-M-a3*xR*;11_->9jlp^TMhwnF!-F$L-N>{5 zv+)^3UhK0Vvk+G9bTvPnh=NCksQKxK@a@?^q0xbQek!p+u@?6im zrT80d z_b}YR0Dy_mJg>ePDl2(7ueqbSv-+4H#r- z&@jN902r0B>8tViOYpKH?Pz!{#J6Vyg+}4E=?=Y~@Yex>Ut)27yt*PQe0w~cm_zLYYz|uD6I!F>_hs;E_ z29XqlNZ{mt42^WLr`KYGXVj1beGKAw`ZDI9C~*K2peIeQM`G+be3>}v?*eiB>#IO! zQx>lEN>n%U?7F-U{*^`i>kZDoP80t^8AKnaIeiQ$lU>c*KSg!J_$4%NPe)yz4HOz3 z@A?d)4=b()Lm%l%9ROmm2U`xbL2SV$-~zc89IaczrlI@TL3Q$u8@q{o z`}9%$e0g-QMKf^iHqLA`MptR&3qjR(#}~RwmGhbxqUN3r0~jqcE?+R_L`<#N@4~Iv zbZsKGcZ#r~1I^D5xMF(D_D;Ta)`@}B*j$430{EL@J{9u^^Sto*;OT@vnr|H-%_Qyb zn5#uVs~INsT`RH2(|jVZiPWsie8Q|w*u4!tj(zo!Ii2s_&mqe-uNH(I05(xrZmRzM zQuN!QfB!=N9(KBT`T;#X_o-qO34fy8!jhHx;0nXlHKUbQQtth9Zrw>!cSieP5FoXZ zWjvkN-qMFpQq8c`iHLWAWi<}~6C2mra4|y1y@yXV~{~;B{R*38^7Zp~I%Ru`* zeUkh<#UsS?md{y63$EMY*Ml5!@C>dHduv9}b4=Q>9qHgkYX&Xrpt!1;g>K!cd+X4b zXLR>)$g8%mMLks}?IE1-#{eej%elfOMPZnZk$VzK1+M};opukUT4ZNiI;nMY+E`wi z9CFC}AiHMP&GzIZsVkh&q2V6ZgI?`>f96UIeB>pv#ZGpktYv!TU?z5%GM8xIe~^WiR%6P!T`wm*6+)N$ zgs0nQ^J*U!^TATeol1G4Ql7+G3GjrUY+W&1v6Q8narioep zr^r$cZ+Ts!sV?8x)+=!;Iit4zXwz?P3@RME>G$IX60>unn|`H8QG%513IE-wRS&mj zQ6ejG(w^a`A=wup}zCmv{$ zoSAIS6KZM;B_pXEpr&ihu@u3G<{2Y;3YJGSPNktu9weeO$5S?4~Sw>e@lw{zY$;7yyLEH?9Sb5PLFhrg?gznvKCPDlQ0m_sqTdevdyW2GriFAWneW+3CDy#87pFI5NwgtUgTkv+w)Ns2 z`pa!ZHg$zKuc6b+oM*?>e^azRqyD()w^9EP)S?*bGA(boekzdaC-N&_rnjI^Po`|6 zKxNx8{!0m0u86MtJ~;>X7K~!`m=qi{g6u6~_aykXoRC^?z>~9m_0eQB z+u>PZt&^b6&Jo!mpu?Xyi@>Zx4D5R*%nOyktyQe`QvkvhGSr{QnB?`{TBf^)D$$;Q znWHW#t&?zdny?S&e-RWeGu&$)DJ;=`4&bA)V6`-90F_ghc!fiST7VCVGwd?TF7iob zQNL3QsgN7=83zvdO0;D>G40DFd$H_2to=Kk!YRlmy6F+e!!8I$=j1@{R-AVkCPbW{ ziV`A}M=4(>Msm=Q2o1Hql7a?W*lQecvQHp1IjVurb|A zWH$+SKLwqh()^l1!U1ds0571H2OiX|RUgg935!U}(YkcZ-GDzllpv0~5P1uyO79_u zF^_X^F^|J}j7@pmhJ66#aXZU&C|Pt{Mk32GHO>*N{uolzC&H@Ci6+(j7mB=@<>tG( zJUO&Er4M8FPPAQ6azr>1yAdXWU@0iV!P$y)kmCp(mg<8#7wTkFP0TKOP&%&B7J@TE zN^2Sh$`iz;v!y;yzi$$B{rxjSGv0!8%5ki~r?gYNu5?fQe`$Lg_^66=@qahF2@5Rj zf@rV`i~NJu5YR;6ibZ4A4BR|1JA!5oeYv|6>T7xjm2?QO61 z_Id?tiwVI5kRpgL6s?U{suLC!3x%M8{ePc1yGcN_?eFIwKG}0-&b&S|^UO2P+t@1v zdz>d%&2-%Im>@^)c^znt z89{YZH4~;FjWtZ746CR&vaDB|+LUM$8!jFGCX7p!Loz|>8o}Ac^@53Yl&onxsyh)S zh{le3&5nw!d5S0oFD*qSJ$EW*lQa@eRx>ykU_SK@Z4QmG9`GE1;ncZGhou|$+a)0L zZrUuIBfH!cb}VeC6I^KYSNp^UCBAjW5i|jC}y8@( zFpDObMH9`UNoLU$vuLVWlxr5{nMFlrQKngRn^`nIf%wj#XB$@(#l`~ix@6TY2dCK~ zQJ3Z<7uXR>&Dt?elbV4d_tHVyD;)M8+gpl8F}qx-vvuT+Tk|x4u5rqp=|QhG1&uCz zKXS#TpogGvw=&_jBaBja31Sf$tE>QVN|e{8T`8MWP$a{r(?XN{)2yRYhjiEIF%^+av0oniw$GiwjG$YMEKJ z+|(L)=K2=qjk*3_{kx7|@Hgf+yyy}C?Jr_6-R>)^wX)GF(bp&qwyX~UIpx-?1VxO_ zRifD>Cs=cRt$aBTLvMSm1p@3>f|5(EhvZ~zHOQ%Y9$+ksxDDI_$+o2(x&-#sjbR~c z=%q7J682}dw-1z(L;aM|1 z*6amV*?e>MP1fwW=Ir@)wK5~h7Dy(u4D+vA>$_+--sQIN)6m!^PPSpD8e$R}*yA() z#xuU3wYhelulpqrg zCbyK}Uptu6Qi7Z`IH;vW``2#6xwZ#gm_Gm7*6SSc@m_X0x}D~CL}$jZ)8G$Cp`*KM z4EH{5=W+2e=t@?`&N^^`@vTxOH9h7Dn zu@v8`HVNjYv`kOweuh`6>Pen)>O(ufhV~h^ZMAnq3nzRT3pt76NqtW)AZd;*-QQhL z29e}8Um6EK_H3{)M@D9?nroHxnj^A08SduRrGL};g|;wnpX=KQ3#g#_(4}A_qUKdShnU`M(L`+K45NVKN1tM}D z_$+wbNFpSn%i^#|_>;0%_CK0F(dn>q!&AWot7p1bm->x%FaC8>S;V{vHNEXE(lC*fvbo#S??L;FqcReSb)ohyRU-27>L<;$9mn^Dp*eN<0RQar#9R*K?I-S zFGXe|zPUcFBvR@|p42fD0nRpfOc-$Z7Iqj~f+ZwVTfo&X zsYzJsTlZ*OeUG+iT6+T5T;S@p8dtBiarIw`6R!7H;Cg=vZXOqOXkMJ~Jhxc)JxC zsctBDg}I5WI}#OP7pG(4Gp8lE=XPNdgSa3o@4kVeoclt7nQ>7L6?qZ&eJp%vZm0vm z_sA)vCDjuvtnF@Q^)`NN3ub=GcGI}!48crlwEFCV8JGo2ilI)*V3fv%GFmNNbkPrr zaG+l`uT<0Q}5z`msC6GEPTFNtFfC&e^OSSD*e$^+INhszr1 z&cD(^naO>uVEE2yS}22BEo6YzhHjWEMZgabWiFT{=q_31{_bBfl?Q+{BMwq2`fMQ0I2%YaY>=KI&ACrYbBqDf zoS7ock-7yccKuPbSJkdx#sQT2vUmY(VUtB$ZWi@s_<`HGV8s zO}=K)TeH4jExhJ6B$2up!!2lw4jf0Yg$$z1Vj+Du$S@@aafj zLL$BTg^r-6r*z@p8d&(c&mPC_9HGD%#%JXiqPJ0@PaYKTYFgDQtVQ!ux+|DaCzw&3 zJ8q94M!M7d{?eDb>&e@=MI?aMZ4b_k! zhL)cX75Sj?vAsXC{y%qrY`U*sR7lOPru($0&=?>poS6_6CUZex^t;wJu@LM|x)%B1 z-Y(gIwN)vG^ufeV(xGugu>b^ zJvOJ|6YC%&lqQo=Y#eju)cOptlEZpLFPu5Gu6EQ@7uLG=n+pZ8WGpU`#ecg^pQ5tf zGDe(OwN%i)`AIDmoX6(7S}LH4=et`fIFHRwZmHlrHb14Mg7et?K`j-D^B6dSvzFX< zM1dDjApB=Md18hpo<8mKn4Jbky}nhGaBkg)KQ5C%KmJJ5!9M&kSO@#?$HzF>S*?$U zhTxB=4))=XHzjD}k3GB!{&$IrCccSTP>?^7mdwd+y_T$5{mE12cpB!}~$b4O!I3gG0eGgH62``p}!{P~jcb`MB{CVwAzF?Vs zebYr{wT8MdVft(Q#MbcZrVwGy!=u;@vr@AQ8b2OR_QgZtWQw7W`Vq$i+xG#ET6d}H z&9PXwC`UWjOEc~qM%>e_C;@1f0@fXIL(8YZ3pD*TF)%6F8!Lgx(V~j3BRc(@%+MrvD`}NrJK8P4cK~f88>3Q^~ zpWmZ>vm3i&4bKY`k&AY%!jM^58=b;9`b+UA!@PM(mHpTT*0(uBFot3mmd!AT>9n{r zb8gflw^5JW^Sb(ZzI(Iy!iYStht79*IzhD8Pz1H78fO;c;DvFG(7!)qmv%gv(I^ZF zxhVKZM;nm66qxKbi=iF%WY?PDv0l11#yKpnz$vgeeLMmzHH+)#+oymj5Mb< z`#c=JvJvsm9-j|ijm>|kzUlAQr&4~Y}UtJA>jNd?1J=~IP(c{E^_?4lI*PXM`r zqyvGxRkCVh!UT{#m?r?QM~{n#uI4V_HG`Wvu8Tuz!rAxv0g!4>KVs_uvRv6sj&tNb>ru$q*O5|_-6FEW{5 zYtAj!SI~dtK9mBl@wUsFyLPT7#iq+amg`OXPUGlnz4_(SMuAzK(AQePm&7R86xoz6 zqFB_QBFGB6t`L2#=YSsiT6?v=mSj)h2U}ljub%JwWxi7e_(jNL0;2w!h3`H0ETE1tVIK)seBD;BTrwN0BTtvN&4dC}?9WIwE*PQiO|DnvCe@|fBDzApXFzS21`YU>4#i`t9GxiZ}g z+@;!@d`5)5$=)1%Ymae|U~h`=4aR$Nu6RjZ16Jd)Y>jOxA`Ca=gZujBgT|o@abz&S zW8b8NjF2wOn&xO=kJ&6TIRx3K-#4-Xc_m-1HNWSpSQE}dH~H$XkzT7IiSP#ghWa(0 z4N%a^YY1hOtCt8^3W^>@P%gaPr9OCz9rv7KiGdCGz+tIqF3O(=tyQ9*5Kv3!1hhiL z(!zkkCbOp2R)}cf#vzq533RIkl0&U+YJ-TOdysQM6#1HjPmNDDknfU9&F;hJ{hV+Pn=YjD&oq2cn(jbSeh>Xi>TZtq62~wx?-Tb~k=E}x>t>Cg8 zt)jFfFQT;|q_zo-*1oL$=7b;H$`{7eMw+{u7DT*_VdsqImsg~8GM^A1+v-hq;#nIM z8&0*8>0aGTgG3ph#=k;VoSDs&bAOsS^=`{GPt0_$cpJmqxtV#^zGGW*Ln)2zLhg&i z@I_miX!?$A$q1#-Qyvlm#Uk-X|3H^O!o6BDMn%+B6j*hDsKq!PluwqsQGCxyQcV~gw$8Y9yT@30;c>45YAL}ff?`U;7 zV1k%)ZaTKb9}+JI`Ts8FE`zZne^CxA>Q=&=rMEJ*}NTAO|4`pRp*n8B3TP?E`7%DVXFr^d`(aD6h9>6k)_Mu z1pX%SH%Xm$|H&9EgINwjQXCfFVGf1$Z+fWvMsd;}Ncc>JW(MWoFWosUn<2OnrG!JqEgB0Yop9PtDMdW2I4Q zwH@6(f{-qcYedU4xnk2S9B&omV(BaWX*_WX`SH>VBXgz()uQ{bqMS>$1yij#Q>j&j zu9UKIL@_aU@t4pmiYyf^E!34J*rj)-03D=)HDZ;8bK3%sx=0FHIw4XhhPdhUeiqFw z(nkiSn%$`k?p%8IEd==lwT&{vgHvN}S70t?ltjw#GxSIGASuviMDc*YY61*A-zLbn zy9j2t3QF;q1ryDJNoK(mvtX*P2@N>pns~R-Sj%UO#O$L~Es)#@N?Yly@19el>#%ZS zq&PQlg4^!UEU{kAdfgCR$D4mh>uI+&#puk z{OrXR_tokI!Ggfw>t4Y?>k(3%c778Ki@H+7W_=vsnh?=7aE7m^s)<4MRu={CQiY&$ zq5a!r8>{-K82mtjWoM#L;1exHYh3-JmSSk*+b?QkGuT^b?uvWuW{o7VrIlCCI0tHZ_0=GOt4KX@KfPb2Wgx5MkmFnX zHpdTSAllJMK>K_1-SbD{;^6Z&KO_Q?a<7F$^fM?uuCdaT-ullZsMmj*pq}_Cf_k($ zheOE21p^4`2<~-uK67X;Jz2}A#aG(%Dh{Zl zM7cnp{RUZI)l;~s;3)DC*S>DNUG>R9n8z0~kENJ6KlL-Fv-n3FD~EEfy^-mB8#x9} z=cfn5bqM1PAm30FwS~M6EMC@oGVhhF042wjW{!18L_{o3t=qLkWGd<61C5@c<{sLESui)4&`IrSVKn8w8EMyS zTXdoawSO=_LtjM(Gw1fXi_5iSLsU$(*yM{C&+cMM)5Yc`iq-VPXAExlg`^U&UoX;< zPwA`tBiN4;IZ68|scF`Fw`0C%}l$8{-56yKo%S z=ZW!*LwP?3>dAqJ@;JKDhw_0Ih6%i^59QxX2wXulX^~&AkpfN^wu%eJv!mwzBRMT_ zH9eq@}T)FQ0>Px=p^zqeB-+?{L0l>?hYx>=QJ zR*g5SCYV(d&8kUe)fBU8s#%rWr{if>1*;pVE~52)G5x3=hd)V)DK$Q9C|BPkXlzY0 z*Ncv@xjyv~`AyfqY5ex-7N;kx4m?Ise?t2>BSq!W4s*Tm1WauzVXhZT2y^{T{VRuW zbG@9S&Gp(!Vf~x>T_1+m%lX$_FBTl;`a}G(3Nt%6S`0B$%=MavTR#OjwXByjLCgAU z_3w53b`}Ud>QEc2Il9QXD%GsYFstZ-2;@xd1VsG@DAZgpzUN7y?+ZZjl#sbzJfxfJ ztM%_K{B~;p$_~6$_q)xuy{rq6Y=6u0hCZy$BT^G{{c`==Aiq`1R4-bvRtNiRYCq3} z;gy@~^f{;T(0H0GOeE`s`taXL+>|+$7_s?x&{C^B9XCwdT`z|&<#rzA!G&qAEiDi2 zxsIMcBr-58p{Bc98@I@934v{Oe<6XjR=27s&3aHyB}Qu+mt$FLwYqMR$9nKyX){{K zYvrth+A-#45zVXCD#bx#%fuTXCUVtNdIETvOcQV=2)zN@Xf%K4Mu+vEmpJrWb22uG z?tRt^M%Q82A31aT)GeI2DP$tY>U(>WAf$wCmF8Quzj)V2R4VRRC7N%Jj)GMFCWvpQiCikFi^s0AVMVH=RhH>0OKU_`MFz#S ze>!?5?b6d_DGe*eQ~ESvtSwJv=n%$j^WE)%B@s;~@3~F^vo%NSJafs`M_h#Wa>!YL z=U0yROBPuj-)WUHfn_Gp9giQ_DY7~kLDz0xGOQOF1Q=o?0*4nTSsnB<-HEwec!>Cx z@NcG?;U(6b)ar(tW;oRDo0(s*V4N^ZTpt9eq3*Xrf=Vt&Tz_*;sv7exaZHi}N?Ec9 z|1gZt-y1edZ*ij{`WqE^@}2H)+Swz9!+_HEh-c;A{R+2Q=iv*9$m& z&2JJlv+)HzgQ=zNVL*H?@mqtI zplIH~L+r%oq}d~A&Gn?Y+RO(Vq>orKtZkB)V21giEK>{Xg|)Iwt>Ad0b)vm4$v-t{ zJ}8S;jmi+*>=o0M#;t-uz$eYemj7r4lP9Ch)dmOZN_fd6frsQLhdx`dO{8^SM~nJd zEbK3v`uCUkZHfc7nDL1%Mu3Za@frMAiECz*5g>p>jdH+IOFT2fm($MMaIhu*yFD`dm=xu-FO$m>@s45!qY_XD89C*dMMVGVxfTX9^S&`NAkz@FFboclzS6wzyF=0 z-4MMBP2TWKu9QM}z*XFof)`NN7WC1%V9$etzoBRMKW?=8ZMOgkr{EX~!iG%OJEriS z7qGJMuB`4`c@hs$n!}4${))u?*;d)I>vGE6Fj;n~oBmBEet1x%Fc#Ri{H`-Rq1);t zG=%#BJwtaVx-xU`L2jsMnVW@Gh`?t+YXW}(GRyy6XqobPVhpzy)9%&#FykFOPaOr_ zz^q&?CY0m*_Y&d1XSCZ%_Si`@i~dtd;zRz=j`yF`j3@N%8kjw!%e`G@&|%}v0{5D-*|NaD>`soLmd>oV$?cvKWpa>1zOx+EexDmeu#yTS~gGE*0;ag51_rH z{~>^$vXgusfbh>Hn=yt+ALUFtl$-Aem(j4)?DrG;Q||u^_RPdOYQ+?+4fQo&d*6wy zeS(zpO4L`*qrYCAf<|TtesKRm@vYF+j+4f)*sG-C1L~Z*jd7M-f}#0!5O2D0EQjJ3 zl!tqnja2^%m#gWG(BOv6AxIeZ9lo^y5J9-x`6idGXzLcshkZ+6_HykaXJ&Rj!b7V5vz#nV(HsYx~c26PvGQ?<08s^IFTD+3W$8>B;gA`NgK7 zX}^AP>1?<4SM z^tn!=&!tbw>%NHd2>M(Uc!4hP^Ozs+0INRc$7>SkXMS|*U?1~ilMePVKYpo$efpq3 z(ZN3Ehb2Lq`5~qha^P9U^Itmf6p{gNnZ9PZ-@vafKJ1{Zk4r znx*q8A;>?+ZAbkey7O*7alSE6~53YLnyiaI-k zJzW^=tHfQr+)`2GTCe@b>xk|tvR-ZG`&rzf{X^z^Txs~9V!oetCyB_9gzx?t6Y~F> z;f_lde|V(b#ZKKt(Tj=Bb?q}(Nw=fd$wV0>G^Qpm&milNPuLTL5qx3q!MJF__UeO! zAFXHQbM5cr*{4I@3Ew^g&Ohb}nmu2Kc|ySgYc__xH)*~+@3rvc#b+&idE28+W4l;$ zijn6*E>AXoP9p;^`i%8F?H$Les>MFxMbwC^M2$Ed-F9Jx2_GATm9WqHLh#`ul&K4U zz%KkVvEdTFi@I;c@qZB;jwgeyI3={gFP^bC{gF}(`mP%X(h9a0EJ-#In=qjbqQXSn zrKX>rOtdke8)W+0tn#gKULz2;MH;7xGaeNHv!ycy&a$Q34Dbhq_bl7N7XsC5DNXM( zxrt(h-}71g@AF9{%luRyt8t*c=0D;$ZX?$;frT$J4~|UoN!i#IteP8{yK1f=5NjJN z-*0VMH-H_!@`y}EmcA{jEVtc>ohEww0$Je$?;|=t&I$(}Uo1BqrOHWA^XxcjJn&Sg zwFT{M<}>sv2dwwc(iZgD76EKARS9WXdlm$zO~=?v7;AtHGQ6rM4AcC2epT`cfMqXdr*iVJ74^8!Wm!TE zknJELs*8jfh~*2Avqaq zJt@>hq$CM()#}voEvc8U&KvJ+$-CUy{SwASc25%a_>z=?ikpLfhOF)(vh}g&<;*Ro z6tu&@4#pqu6<%0GKe)%{o?jCRc8cDPLtTx&1*dkcJ~w?KdU5!2RGvGHrxn!9A{fBr>>HGe(H|;>|tqn6A8~NMH-yZ%x;m_ed?VnRZNji#O*J;h$ zxhXw^Zl(+!=#x2(C|uk8I&%Uq;+0vR)~a6IPzis`T9poSyqs6|URT(QE3kX`g8o`` z1X>%n@GeZhKXLX84{vzR6!sP8wUN%Sut-NbV0PTf;cTQMRAp>_6!wEFAX zUkyhIBv`KA`w$hht$xgd;F9l(iBJ3tj)q<4_ie7#yf6z?%=)1qw_sq7EYOxi$LA`|L6N8g_Mej-)##{OJ|apE$9J>H(Df33l(ggh zQt6hj`53*|`$2YVK!v#ErkYOX@dOx^+#v zh?6W0zgzxIUVY7f;1?12_@LeEdwQhTA4LcBI;5j+KOFD%y=0(S2nj?;e*6ZzTpuSt zu3^obnt{7oqi1f&%kTV93cvZ`jO^_a=lfAxdF0-~4vr%w>Ox)Wc)KDNDfitjKPfze zkqm0+JG3$V2KZTcl=@b7tA;0+e7Oa5i_BSWShIS3qtVqewl`ECl_A@4T+g8m?@Q~w zHCW~EQe`v{zFj6WN-X|!JzUSoaK(0C+1kCIuBcJJAoXTh7hF|BhQHRMO}FMDW=+GJkKbhf53wv7d{LIX`aP>M_b}c`WkhQLecXM8b zwQiPv$uuL&WI9Eb%U48O)(;*scx%uLEEr#5KMbA1W3_c}=6KpCjB4(?`WQA)<5oc# zTl`#JKhHW;*}W1>sb9IeAm3}WqOsb0i**5wMIABDea`n-m0s(6z1GdWv924pgU04p z+~dxSb=et95R2YoA*Z8J;oi>to`X-!V0y&D-dGrJk4KGviNf-|R<7IVI%ySq5sBPl zP199W_L_lPOkEwCcv3X25-wm_c`q#iaRh_0aBnP}8Vmb%i5}Gz5UieI=J$}r%I~rM zTG_5!Qr2tXw0gEDo4X$AD)(~6mZZj(FbgE}67qZ020Jq@*>o1;(3H}~de1nPad_mW z%l-r0PWznMt-0M#(Lm$YeaN-mEG1rZEW-}VcvSw{9cdk%F4{&7s=megR?V#8?^xt^n-U=q943l{qAZa8XAZ;^IwVN z@5C9RCpIxQ@0E%QzBg8zrhilQuMIN&s-gD1t2D@oFqUO<=Nyn^ zFjOyWq#EFC|BvMN2CD^<>M`NiY{lbPuS}eq)2;7j#JZ@hzj+8;>oG1v-Y64}3+ulO z$2y#>_U6*o;@;U-$9G#(vGFYS=M=f?lLJMb70HrfaIDyCReHF^z`&hl{SGTXwZNPx z!;uzP=w0d#99fdA)<_|`fc##WRW?j$e3=#Ym?=uMp{<681lk2|bu}ULDG6B}iD{uO z?@JOLVtE3^p3o5B2lMoAxs~nNt%(VzoRTi=3F!Pdy#Ht_VeI@{q&!MfT@s<|Vx)@P zfsaBytIb&Ec7#8ws_Z^+jh(#69ep`IAJgK!R~o0W*R+P1d`hCK?E9ZovZ-aR6hud@D` z7K^NT-sqr3INlnOn=3n~Y?+I4{2_Mj%Jv#>b=M!kSm(?pN7&PREEG1Ty;+>^aD`{q zxK;8@oZ8D|FH>KZR~Ci%AS(;1*%GYi%qdbO<>=nlA3}%UGI| zoAUD=u~DHP2wy*ZuKK++?r?0>BqD<9HbQ1fg?hc1Tl#AJ)s9`XrkMbFUg4{ECLz5$?{y?}Wa6FuneXPI?dyNjC@$O+>%E}WUSWb`aGBeIB zbAyx_3wNnw)1|P~1Yp0S0o&yWUqQc}1^tDV_Ct0V#bR4BQjlY%hfarqX+^tLe*iy0 z&CgRp&a|$Ad`D^qau*%9s58K4KeY@u$%{NKrLT@58KS1sE<66%H<(^{DVj!<&<8d`^ni1D$z z?h3gE#uf5r?P(cgbUH<@bPPsQ7i>{^_<8KW|2`(~p_C)PqTnHRI!wWjvCDfFw)5+@ zQBr01!@^^hm1rFDMu*7;_4q6sFg^*~g!Z^V>D}$^$C8gu&v!UCD}KXcjA1$itulCS zELQ!9$*R~tlEh_^;-hNvO~iS3&U8fbj|SD6a~*i@vn$EKqg_sAYB)p919O$izfK3= z@jw{V6AN?5?iUDyD!t%nKX({q29A*ak~7lZ(w|;*biqqZa|i%shPxUWuGlq826yIT zcNAL*_se|^6FUaMpWg+FVmlAU=6N9UF^&lw3C-g!ni;X;1Ivb3`CTn(vHUL1BKcjx zQgyRTiwcBBp^N4FApJe@v7ql`GN>`?%Wlo7Jg~^jTXD+w@2y2e{ixrrvX6qO{>TZq z4(d$`-@x@QI&HgXl>uTt_=j%e*Nc%CLv{RZsHM{5Z|l3}J;!gsR#$GF_Z)xQwf9Co z4Lp%CklY@}IxF_e{?=ygadiYvE%9)#+ue_Yacnm!bz>7V>)i4(<2~?zFL0`AVc5f! zs@*4Ul$*I(?vC&%CJ|G~IN_=L(vhEW(O=$w&v2}>I)5i$jc#|H7vBo5Z5&GH|5nbX zk-74n=RSh#s`@-G)Q(DL(;A>0YSK$-Ukn#Lw@R!D)pFa6}^$=Ilb{g$m}14VJDCLte1Mbo~D-A@jn6S zb-YqmVoXlhW0ECfa)7pwLK3e#%6l3wx%{mzaE;s3Qs^>1(9ru(L+`f(ik7y;)AWzk z2T8_Y|@F%5^fMJH~_^iw1iuI4~<;*LBWhd8EU%VG16cmG)?wmW15gAj&Pd#+c%&V zE>yV{sA$GWp;iqSy!4n*LPn1>JRHKvZFNL3gUk&^HDhIHnJNYLVDIp`1NP>AisyA} z9|X)-YP?nPU2&9P{GSz2Fc{xQgSzjc0QKvygH|W1pXtX!tNq4kYMELg$28gc<2b-^Q1O&O5iDz_)R@rt^g2^OG?AXSx0E#yD9^ z5g2`S6nKRoyIEa;F&(Ng77ks9TSe8FAzQ-(!+P9#j?hSJSSruvqT28v_0Y|-8>0~v zNangkN9bHsZ2G@@ly`xYgVK@bSZ-}nIMpbsO`;N~P}r25iy0m;tg3{!7vHVYO3Q%> zbg;SwNN`rN>b=?nf08*R@JTpJt^3;Po7hX&>P>7)(U_br4LBWg(wtd`LW$sU!LoUZ6UlfK&b9i^|krzoj#V z&rPHk7RmhZpu$4k5OyP!55uYEydG;`nc66+MQ!5pn(6Zw1v-{WQ@*ieaHQZ7vW;1K zMf}CLv16&rP#H$+_CS8>;`3;>C#SNv?(%SQAirnH#f05Pz26be0DeLre-b;ubn-(Ll=7&-Y6aviViZKyx$=o=>v ziwhG+HIDs#n{`fd+I3JogQ^|Ld5)+vsJcXVVQXq)t`__4v*hvS?V&3;%lI~OISHVg zF=G+cxvmX=z=yPJL!;yZ=-qhX`(OXiEql6;{OX+Ti;nzCUodN<0Atz#q4vtG$!RmF z&<)G!=5ki<`8ks_hzOOc%b6MU`Z_xWOFq}A_c%gV$-2E8?oS0&_GR4XEw6!2F1kr+ zm^x)zc!W&ipqfFneTeXJnXZ*WNqhC3lkHYYByWl{dX(c$t{}Fb=gQd}ugqZ&&Oo#6AJBobL^%1Z&*E=-_I=;b6_dvGb@U6bory z*}kb2hC%ydj;ee|SxqXdS3pm~XiA`?evs9%LB5b*-BV3NDmL`8en@m-jl0a8EZ@}a zr+rASId6Vdd-luEO1aVG$0WV*>Dw}J(b;$+_mi29C(scRc1)6a1=(>lIPnCTcP-3rt!h_up^qD;O=Qt>c2lp>hS+4O zOML}_)qo9O_b+g`?&8K%8PvV>JZo2$jGxiwFHv7&R2ye|W%g7=hZr3hWwB8^*Uc2B zj^3U0%t)<27nRnaItk2~a*aiHdXfk)H6v(e>Cd5i9%!o@J55)Z)_9XQwvvmc+vun+ zX#Yg2t8BOP?xwm#-eQk&LU?oa=fv~qM*iwEl9!Z}NAi29z5z0(#wq+cxTxv^gn?Pf z4gg~n_nbe<%}aKy+|^d?zs%t{=XI>xt^HcSJe>PW(KO@Ej{;A*b#+z`S3XWC=Thx!K;{)e<^H}* zId7m74a)*A-m-jfip>HTQ^ss>2HwCHlF?Y?hQ5$n-s3=#YCzC~%akymE23X5Q^F{a zJvo^L936Wc5+;{wA(&p{pdD1psHfuizKZi(MJUBk)}V|pI3pXjux1XK^>5ZV)t3dX zu!XpJI@}e|bJ-U$s6@}%i2JFWDWNLMaV*zsgv#g!{CpN~_RBNOdA&M`<$lU4@*Zn5 zLSN09=LwGps_Ud>GIcMEvBt;b)O*6I$J&y_DZy9cpTe%e`EOFI5~`sf+JqWxxJwro zoAgwfI-)DV+`{ImjU*BK56s&G?BV%us;8lR+iCm*Foi0FbN7Vwtb$m*l?a@MNlnqq zWR)KSAc?)d_o%dUb`nFa5>*b|$V z8hzi&KSY7F4Yo^u7svL-DK{_vURP)+>~tE=YI(C={rF3~+^P~iIzn+AsA;*9(jU>K z3w`gE%gXcpPLOfDwxO3Z!|bXK!)0J@!GW;hBEVBm*hOic-FpwVTU)YUZg_j_UImXg`(@ctJTK9bQIv*tL4Fr>jNPk1zQ6t)ndQ6a zEmBk%(lV@n?ac4`R9n)eEvbwZY&zNk_XAFd#y2p!HVPUm`OROS|iqmaBWdM@$dlia^ieqD>;%K+CSDZofEwu#D{n zfboRY_dZU6x-{~Ss$NbIl>QW@3x<=bcE^)Saoc2V>-w8O`a5ep>f2cw5qMM+FzMU( z4oA5&mjaTgtHT`#d+H7+_B27Lkd!{Air*Rz-JBHLqtkfn4kgkU(~dH-Tw+o!Pjzq^ zMN`@kU9&`0s0`w&@BiUUNA)s()ML^xnSL{>UztkyN(OsV5nnppnITDlAymwm)+5DM zgwC&)7xlw(PCetYUjhQ(YOkp?jHNC(pF)x_J z`|5oE{}DPsghjsQetbJ1n+aMy>Pa4EO6>J`p-<@8cws*!z*q{`KRGAAD>PintluZdP-?L1_eCG6 zew^-adPrcfP*y&fzrl0C`*oR<4xT~`u$(y>3|Ho$l&O^KFV>YxOzxF zw5wl0&f9Co-uykPof7*e7qL#s{-23hn@Ui49+FhxdWlfjk?NooD^ucxMwa;zAkWTy zm;7D^ZYxun`rW60k27#(YTZ)#opuQmA>4tn+eq>nTQfJvY_GE0#iA9ewYD)$s zl}`PAv-~54MRe>~zQ-9FRHoJ_pgEAYAkuVm| zTn{^3=p5fhr<^H=E(#=tQ>IU!F(ayo@@*WF)fQiemED=tl%Nl--HR+wZmw`zjx9p2 zTvQa;5=vf_;|c$rA6vjSkbAsy=NG^~ewJ1AS^VRs?VrIverTKKRo*Y(;aR51^9kZ! z;jf3kKA!OB@sFi+_=|mM&(1&AZTL+7alDMXD5{#joA{g0Uy#2d{&M-7!XG@xFMxk6 zm02T9xXllLiop0nH8JJ?-c%u_*)<` ziLv>A;U5oJa+tT=*dDhn6MGd~23TtCL!O6h&~tnXo46x1YV{Cfi}R`%LoYRL50%)F z;potPY|)$4;GEfxzc@_KQd-P8c7>jKi_)m$EzLX#2Lq>1+(AUm}mt zUU@jfp2l}6x*@!^YT=F9TqQfB_p0{L*Kj`a;Z^U1E^9gvdaq6Si5f-Jn?$7$^-A=C zs)cr&XCN@5=`&8+k6wA~+&O@r{n?hiUG3KH>{g*?|JSBxkph-kf5U&(XqZ>$lv=UX zW3W(4o82-ZcRIA%M>kgWQN}iqG$t#t=5c8234FZdc92-aJ){)$TxRP#hkLF4f#XXr zj>E9DEH=+?Z1teNoMgQPT^u;RBuXYq;L^j+z+Xb+pen{iFHCDk3B?fcDf*Adx;_y_044EIrj8RcgyZ2v~Q2{{iYMgnmy&E91(1o00+PIlGUzI&We?t z5xe^v`+>KXUMWR)gvK!xyRI|m9riuLK+GE|7bv7+WHE1O3zZ+vMKths z;8ge?>yxPAqM%cY)9vy`^_K@#bgJ%rT|eL8;|2~d@eTNVQ1pP{W$&;~Wxbfy6F9Lv zE6~A3UBySurpPjOY4hobgU58U_$Y2^b1dLn?+4J`Kcd^j=%f$ZN$>AZ+Oc@J1s{#1 z;hydqlJaWhA2pN{T^V1CIP|yfZ*t!@1BG`>n&>0r@DCsYGZ;=8~UzGzeM2 zPZ;BJ;}dsXIC57nlSQUHSZB50Xm#U=xasB44Of-)hKpARPx3zXs*;o8udfcC;{DRA zN=}6@S{;n>?!O8xoS{a3uREu{w{A=H8l2mshJ9@e8NoBTr+7ORoyyxu-cClZ}5O(b%BLKgwCzNMv z@Pw}NZQPU9PH7?qI^VZ(ggmo+8`BXEy_~f_?3q4&QBJxi{MSWB4q_aUJd74f<>l~; zQVrxxXS8SM&hoNSm=JlHsY6@qQwza}{^R?O?>F{|CUGh{xd;O@(-Ys)`oE>~Ep2FP zST3m*2Lh?un}UeV{diT_8=a0YUA~}&Dsg+Fd;YZN;GTU$-v}QSuL}s-v4P-A+VOW? zd+LS2;JxQf%>JsQ#;^oK0*#?JfGFLTOyuur*;2= zm(xWR?cI+Ohjx{*$u9E>v(nR6@9{{{%oc5eA5`nY5TtTA8o4^(Q zG<}!(jO5YxOny%Y8`|O%+7Up!nZ<{VZ`Phn98isEB0+J;()2`%9x+agSvtaK?SlEG zkD*&w3Kj4i1<{JuLwWOd+jP9FluH#unW@J+WE14pVt;sOTQ|3iH4}_pwi@1mGob?$ z%3_=Ps+}_YSKOj^CxyRhyyFU;)1QnKUpJ!8@cT04j9R-*riRW<6yj@oh?3*P>p{Da zko}Qt$8M}5Bl)-xnr$A&+i>29=FN@sS}8TVRmv4NuITni9pPhi!q>c1kVw4M12?2Tcx|K{ zAmk~tTVEO)v0Ai)=yFcHKOb6ybaUg4rFgrk$|~$7*+p#cX}`1^%Y(MQWPIq14nyi6 zy>DL!|yV zBK5`*DVIOQmBBSdg_c|Apxqp&<&w?Nr9t(}LT2{if-?2WTY@Jr-4%ou%SOlZsUkr~ z-l*I7w%gHJC>(w?VMLE0A;O0sF7|Xfba{h~n>_eCa#!j@J6o?!!F|-3qCd~XAue>I zHPc-lx`HYYq<%%J?kOx+6?WAHQgvEvvAaB|CdKO>EK&h%p$pt1%GEU+cX}M1PAN1r zICh6yO?j1uw_DRiUX;9PAMrK=0v!j1)lMIi;5+;JnFR4UCiL{Vef;5%;SaZcJXQ$m zo_1cWEpbl9v^;oBNywUZOp%rAQKR8o+KM8TT$v%*6_$Cmu&s8$>DyHN4NMqvk{ym* zM|jF(Q+YIQl0Z<<^kvTu1(1t!uyEn?7-Lh2=kO)|?Cm)%idRf1%;Ez89n}{&@~@3z zlc8sxnsjwLy{S;ojL>3gPmNzy>WI8s7$?Xa)dWD%ck|SoukPTc?~2%{d*PyN=n{t8 zcNRMw8>Z3^^>|%8l}BAKsnq$k@rc3dDv6-hkL1Z{3<|2tVogYH+WGN$UK(96gW1> z6Z)HIsyLo-O2`>H@Pv*|3cZ1H5SAGBoMA7v9F}8R@tm1mp|oit8$qAtx2P2vkFH}K zq4UZxs>dW^la5&7Rre7}mOu9>l$i(Ud=+ z7W8G)(;yH|4c*GPtVj+lbuUj=3#kZEf0qkC)vj&U6>vU*wJc`iPK4#7%*CE+7r|1# z$3jlGT15t#Pto&Y;X~@nGRI`xB+70EVk_#6K9JyFj-f26HCY|;v)?ZEC{Kp4Co4S` z&HKZ!fqnc9p?DwLEr%^N3QsYX`CZ{Ft)kS%6B)_(jR|q#+(q*AG@iJaXLz)+EFI~J zx`W)=+ozjc)kUY;IQF*Jc&eWgCa;?vJB4TN>JUgR_gf`y>spUB=}OBxoEv`I5`&F$ zFWSpP)ZfXf9_L5fh+O07$d5Tzl!D~NIwRf6^;&6>T6gmsE3z?bY3p)}&Of}zJJPL` zAg1mv(dJ#qq-901;)h%hz0>^0$~U8K3UbDTb=ngcwEVxSZd{!o+m43YroA|qQVZ^& z*7;rm^8E~i$i#2cZ2%(#TSTFhhrs07>~+u zBPdLzag8h74FqHj%#k%P$75Cbja$2**Si7*-otLcyDCdP~yO zx1?C+E7mvuGIa?60AJR4tAjE&b?Hp}m(6*IT>WBavcuOjpEWzB#N%t4!wa@RfgNG* zap^*XuSvX8fPY}0v@Ua_@#^Jlj1-~t2@h`A>OHZgY3j!B+sMt=^f&U9mZ|IdBHk7d z6sDo6w8 zQEL)OFDGAPB9JcqTr45#@f{oFw)NGRf(N3>s*u&tx9J>+4rgxa8TSq|4)cV34se28 zY6bj9&ZD*YejB`@WKQI0HRA1Yo;R{!gjTO(a+V>#@B-a(Rlu&rBr6JyEecPX7+c2! zszDHcot^khwfC};5%9R=<_@;q(_D!{)P(+8+zd`oo3<_m6Uahyj zaj|eFZ5gPcU#7lE!>}I{I~0ootok%#rPqOZ*weC##EPINDAr~)E2CWf5?}uKyUXtd zN1*Ar_{P$}*OwQvx2@#fQLi<}4<^Mbqv$B8KcxZUkZYRfA3o;F4PQ*%d zhMCrKcVHWv?8k$p<(}td;pbfKYyKSwOP2q0vhsb+;`SdrfOLAKjRb~jB;ae71FEq? zoM`=>H}!)Q0jppXhp*{>C_}9z#?sgn9RziUgc<~!);JM!`_+%WYcCjpx0EL2Tphkt zW1S4Uw$oA0P^pQO#iUf1>ZZ6`Z}H#s_$hjMe<(> zs{Kgs27;>v_(;2b%_}|&Qn$(nd#3nSJr4vT`3IOKhgoze&oWOMnXya}nJR|^`3HQ) zgCt_h%o*fc+sJF6(7kdwHi@$97DBQrxY)N@1+p(k=DS6YIuqb&Kq}maeOZ=^fh13T1hP89@(&M)!j1HrSV0E`ZIW;pY-^M*%Q|u;S4B<1)}{B z4iioz+BKz)PKF!0Labj}mYcdEMv^rd06JrQ<@18j-L+Fpz7|Xyhx`4)yWh1VeFGOYN zhMb)6mByWZSKWl1iqs{SStaS#4IbF37x^0EqMUOp1gy@Qm<}@WAW3R<_^TA^^^f1e#mu*h} z*-WgP1P@7qj;i)Ph@1;V=1R(d zq(p^fn7}Ibm_SJ&Hk__MOeSNPhFkZQ>^#s&+hmiTeU8I%2ISBU__{P-w7Q`53Kr!4 zdM1j1h31M>fSG9n)4D)(Zen}QRRaBL>7{5P5EhV_D{4DdZDV51>{xX@;hCKU)rU`^ zb~#MFOXXTQCAOqGHtJEDmDsmY;iXyX1xbLC7dj7S!EJJie@yHuc#kc)O}#yluZbKS z^BrmrN`LJ%kG4|$f3lQ>0#uLd7leCgA&J>+Y_b3a1(hGj+T5)nJi9uT?SiBG{;A*# z^vMvKT?L#q_$CJhq)JFiJ<-yzomVfAxdI-+;{wjv?if~|s1P1(CpP;SHDv-6VY)Dl z%hXCL()9@2A@vQ?$QQ_?!vgtN15i|tUZ9lF&H<=LTfJ5*$cuC+r8rpZuBB~v5aHK6Wm zjLC?F29>L!k~jhLa(k4|O zm+cG!eZ`>(VE#9k+*YU&z(H1k9=;Di!YoAIz3PAMcSi8j6ZC;U2_R6J^)<<5_SR&X zjn&o6!t&T_)eGdgp@{J#5Yz!#Nd$^?Kt?w9nlVjMkXIJe23bI%bB$?|&=DGDOp`f|MHdBO ze^z<*WZPN&a1`Y!x$dN5gX9{>`xX`@JE(EUU0R~m%^_JpB%XQfzhZy-yXiju#kRS5Y&(4S^9BFk$!wRkH^Dnlb7+p=x)Pp`sv;P-pT@{0??IT04_((O=_kj?CtLWO?jyYy`|^aq%4+ zwMi!JQzQbxCDEq}Q5k%i$m$TQ0HsM@jcJm=!FqG5w-~L8YAHK5Y6{DVUE|jz>2np~ z!8eQhkB@>yL+4C4PJFrUqe#*F#)%P2ht~|7&&KWki* zR?pwV>UdHP*6h9Y2RKPwAYH`ta_L3vS{JGp;KSJ*^`XMfuK;aECg}#}T!`sqXY}@( zH1)g5bPP?EPr^PG2KgpzBcmlXLsSJ5UJP$?E(}l5z$jO%Z?FLo9$l_R(xVD>O<+nh`3tm-pD$ z&afgGww1AaY#Tq{-Ja^&79D}AOjgh483 zRMwq1lIU&wkUO})v)#>_j@;|aW0Nq84_m{p#g6Y-8)WcaK9ok%udvQB=N+}mdd0GE z-chsCdu)p{9BTX6eVy^~HA`GI*L=ge-W|B!6P_UmyutW5WAPYk$KGgUR+9Vp-isD& z$~!eUJdOrjG$xuJxvs14%fp+tl7WwKggh5jxZ!_Tr5@`>HztKH^gO=7Ria*t-y1w; zsfT89FYdrvD|?K0oMz=wU-MeZ$wC37vZw76cg;2U$GE;K@YWL1CMxc+bCEsp8Zoa0 z_G5$r5B3gs;0{kXuvxeHlZ?fqtrz!xaQwB4LbR8YX!s&&)D_Y5BG-56_^0jG$|v34 zJ7^}Qc&uyPV%(}rz9*i{Ub`KU68}4Gsn+Uc)9P{{^kMRAmeR%MYt#_X^aM(U3lr^~(R8j57 z#q0aqK39?VIY$HYpd|L1{at5?mpwS>(LoHv?2pFdEi$Bbxx}6-nrSB}@;BT$(-9tQ z+~hu`V~k~-F>Wmd;nsR%uj!~*t)Jik$1avV&83Y@b8D2$_pEJ^StAaWM2b>Ng386B z1~G7yj_IU8rO+2j6%SjTbX;vjC%sP-hLSu?&!q zEKEqpt@?|YERDpqR9`hAqN6`GW_x1h)#eI!ELj@HJqw11i)f%K^e$Uc!VIvcFTxYdWLXGhh!&+tn1}r`gvj% z*O}XUSb{-!XM^HJ0?D%BTpNDTn#V-zNtUxuWR4dJt~uQkxsDePj=YRp*5_%Y{rmMY zUse~)T)pj7TT?4T)iQe~7ER0CdWx|m4<3K{qM*lW??3$`7tw&gT-^%$QP1;QuV(XeCfpt*crTz?82@vRN;2I^@$ z;RXlx7$>e-l2UU`1+UgZcVHn`SJ?Os!=LkHHTFbiIW>Y?CkXCRK^J49V~sWtT>r<1 z*GUHl;5Y;e3*9Ejj{6H&ddxd9Nb+axau)ZByDs0FpOM<)XjklQi@E1u@!D(P69pu@ z5N1#${S&j&4}z5Zm436rV_xqTjB>q)-#~>YT)ukNAh5_ef<*?ojabIw^oDx8{SCKX z8h{_hMDo_8%ftT2Y^QmBZ)8C>KGytgr`)sIJ%}()=`K|r<8Dy3F$%e9vZ6lPDfcNnJ4Q008Q1q8i0hc4dpP-JZ z+tXKJ@zIF)BkN89rFoZz@Adq8;yW8)O-Uf<6t_Wx0INpMyM$-hu=hhj&N&*ay9BI! zqw`$@KHlk$#KAgy09bM4<}&lra9Jn3oj4)MjV_OA1W@b|sZ+9`8l!Er@%CXhXl7^W zwZ@5zvhw<&#;(}j4~*iT7#crqUB-@B_OZPOWt$$R@!p@H3rhb#;@$;3%Ia$Ton$6q zfPon#V7O`2sAy250VNFRKrUP)I2cKY$fYe}j8^$z2C$M4oQ%!nWt3L!U;VU|0xeeC z+EyS~!GvG}hzfW^r5anR?>JOri6ls5&TsAaok@az-|2atbDk5}@9fLkYu|5cuf3K{ zb6+&4^P)5T-}CniG^N3E=037acOUVu(MAd4{{iNGVBYu7i#h`LL;CKH*+$H(&6s_A zg}uM5jTl4pXV|r(FH{NI65hzZvW?Iu$iYdw(G^P4@?3%OG2cH!qf{pIT$+n1C-6#9Zy@mKL4U3$@823%hb`^=#SI#wcL1F1`3J&XEjtl{FTwqWVZS4$e+1BKPPt4 z8<6J=#2~H6SjfD&Z)$KK^JY=IcFQT7)-Q{F&sS#uW4Ko_+!pX~u0}L9YBOx^8Fv3| zj3qUKDlgIAlmU*km+|z*(EQ^U-Bz0)!klsXbF`x4Ec_SrkB(vV7+~wvl4w9*Fzk$z z82+tlPDL;ro(8*TauB+&xOxS*n}8mfB4C z`vfi)FPTg44ar>9sJ$Jllgkgt?4xx#m6y0TiK-6}zLS0lvnRd48a9V$Hg z7W1^svIb?|5LpM8YTM!v_x9|?7lIYO>)G*hu39aHtCLBn1a5|$aU#R6R7;hs7C5qL zRZIAO7ft8UkP@=LhL9Z5fLAy~pUhuX{X`}m?YD`vy%L0>*a}i?kWt7XW{>Ws8 z!yX%FG$#jwilm!kL&P68a@G_5Ml!>ZKX2#SovN416Qz>d-lOxks9oH+D9BHUQc zlOnS$c2I07OoN7?M1w>jG)@F!u@*-9EOCC>(5=#YiE|A;Yo@y7lOdmM`FP~xmCqvi zEDgU>O_fdeACx5(&V1u6q)4asC$!F-Z?X^&;FKRYEhY;6<51x5YdG#8@aCMX{cJIp zQwFI&Na1tZA>S8R3tU;dY2lm(t+JEBdE$43MX&7mIMCt>Rkn#YIc^hg9wrdWW!;-~ z@MeU^>QxGtFov7i;Rw6x5bYL)8X@!C66fef^IdZEBH?oqUY`_;g@=-p;2S_N37jd^ zkz6PXtARN#gs$HE2{uGwx(KbkBO9tXiB{cF*8gR8NRfNg@U8M6?-;cDP3?3mQYXx;)KFS z<@?wX`9A%&e77Ey@6H2!m#llNQ~iVyWsU3Uz3L~pNBwMWP(QzanV+W~4z}^571+W> zwicC=5amKaxf=+D+a+vzS15c8ON+|Xxk8^)nU$^=3Lc{X20gCAq8%}aaAB2kxs>8` zM2pI!9T?*Exi`_Q<$|FX6^5sjAbn^RGI@s6E_VG_ioUZ$RO2pjH~Lco17TT+rN%Gbw6-WWfV2`1y&XDW zvB34QGBEI3c+IDA3f#%54iD#(Htl`b*VnLxx|&8zN{wbaw_9UH@Eo?N=^!spBKy<1hESDsCX?M_?@zF+pn%CT{%J9{1TyQf7{{I`~-N(iBMt;%!bW9NxkvD-=8^ z-=~kscW1r&cB=2&>f5fqN7Z+a`X1q{=R$DK-6>K1Ir_b1rj$S9IaH}Gk{-ANuip70 z;ao3k!56TIoGcmGdtk3{clh=>w-3$P7uqQoxS^fL)%RujKBn_s;(pIrvlhsTm&uXR9xqY{DS9Qa4tXr*4nRcAJY8qQ{R`hA?w3UT|n~39X zbpG^fh-yg8yK?|{Zw-O46pYe8!%rxvN)}Wl4yv*SRUHJStdWyp4Xm;1+X zuWvMiHm{4(MPTqlXZVH$7F&n%j9h__rt*4MLqF&C{o#E3!H{xC&Jp0vQZh>uuZlEQaR_mu`Z%YB7`&bxi-fzFlA;3k5MLWw|# z$YXq#1g^i^f3CH|^yX-9v{{7VVpftXa(BX>5rJD9^dg$vGd`pII1{n8u$h}i=7XT z0LoVt&?oy`bdEBNJ*x$6sI16=-5D*atEuTr^>Cxhcmg|BbA`8dfn5nc3Taq7poy<%r zGiOp^VN7K|SB>k{2P09YqJT~{caVQ7rRGucn$_s6ImuKZm9!rKraJP5;Np1pwo28T zQ&aFM?7k_r!2|q;gEDn_HTBaRd>w}+_QLbv46AT&I4ITW)t{L~x_ewuy_}(~GRP4^ z9a3Qigi*%ORw-kokUVIT1tUocG65z>w&poTtx7L8 z;~OoVHuz`4jOwUv3ChGs9xT2enB#-WjLy+=5?R)tERtJHXH7OuW7Z-H61e>$<`S;f z?S?g!+M=dB>5Y*_$+_w(9wP~6SF;~kswJb(0j60Y4WM;6@)-{QIm}ph_}r4{7uX+`#2 zy6;|qGzA)Hn2mcs?$FMod?N(_nVpqb5Gw_JV!ZoC8hAZMUHMX-ujF+_ZO-j^T~9>M zHN&W8pY;hA(!&On>Fpa4JiO-I)f^U=58_4SVN1sc-6b}YTu*y_pmq9_b3Qa{w$jm~ zj|>l}3A;nha=rVD*3!SppL&5>d&65#GY*X9D5jR_V8fbJf$&|SsWI@x&0bX5e|;nU zwlOdZ`i~-BzVqRV~*JoE6;}4ho{I=0Y=jj22^7HQL7~Q&k`Bjq2QN->jG# z)SCJ>CuMu0*Q$B&mc%@$soAi5z(@Puv?MSdIg}m`XTcL$D)>;Rkw9Rl%r(@%Vi#1C zEk~Iw-r~{gY!z2T2XczBRb)j|dA5;Okr8iIwz$Lt$fBvWUQ?Yp>!Ylv#ouTNhyUEz z)`K|1YE%~^8tD;(KQOjcpft5BGXle5=_~q^gd36Vh`upwHvc)L#TD5GoIcyY5ZHMH zc#Gd3JX!T$+D@70LR)13#KQ9JHSNad+ouTNsnoU8X$?ee2c;?CV7x50RYHul)L2UO zmtlgl?i2uHSXs)}{02F;VVRv`(ZNRTmzY`lC%|Rq#&30onQ7m5%Km=<6` zHF$r|F4mYtIY2C2AV&y0Y3*x*u#=sVXF123XUWHGzy{VX4P$}*$fl6`j0-;g};o>H|)|BG4W+7hpF7fcW$IEBMB0g11 z3Ah8lHTUATW+i@W)+`NgtEMP%lEy~$;JurwF)~!yPBu6s%Qb4#6FlH6u;=X0+8_AD zDL=i*9oix2!80I*Yi|TTSraPKQ86(%>nl-Pa4Bs^0}z{M&McNIxoLpdZ+$E45Yz(e zk*xPa^V>B4ajg>ihJIobfYD<2oBnZ#xNmgv$ShtH#|SI3Tk#;adSZ|TZ!K!wXC_jJ z4vzyvdExc%iOq!{C8i12fxef4LNmE6{rKLF~Wm*A8ks*7HbLu7KcJP#+ zW_l{ocXK6XU_j73YH7T1mKiuo^cwhjJmhiWit#1-N*sYN+}7p_>yEDJ1(tFfNV4{_ z4ZBH=MBywPlylO^#@CQg$Oe=8$#M&D%${4P#S=2KddPr*dXWU-gjX@xB1Qu z=mUI?X^P%eZ(~2xRDX{8+E{p->IaEk7+18ma-q?4_AMOAob{t$3Ky1h`(CY)ThvgM zJyhjr{KVD2F_W(7g7#;1_^42gM_U z7u#2cpZ*dL6pA^wS>1bA4$W%xc*BnlknoC(oAqa&R--Sk&YA}Y{1Gn1S2)<(5{1;f zq%445C1vX?Di#5>_~XmMSeghfB~r1T4An2NC*K5Mf6@(L$OjOhzl{~3OsTbX1(FP` zAHIRrGgC*o>ei(Q+UOt=I5|YTGQ_^Xe?*n zWy-ESCO+YsffCDlFnnu9;PkMSj_R2MN##)W?u@82@XfH5Bs-8a4po1iQR|9Yn=O{f z?l+h1mU&sG<^O{A$on)$`QwM6nQs4#8NU7<*(PjI(!{4O^^FRwxf_*7+RAd6gY7J& zjZn~GDb?QuxCv%X?Wn9lP+9@ut)Y9I5;=Y?Os&J=i%#%$o-z13OY|I)*Ty2sz8Jf6dkYl0x5=XP|C{jbU&jP9)5S8%~?|_&5*&8q`$^OQzlvjoHd1b?x-bi3iOqqF zL|u?w7tQkWBD0kS49aA!`FX7gGrBoK25E)mlZ-Lq)t%(1EVQ7!SeqoHBKF?N!lj7& z_?&1bQ)Fav#s4=Pj1I^9fU4n_XWQsNyoi=(-{?}mj*V&jin!EcsF<&GEzxG?ALUKt@v~Ggi9HFtxSm$rAQyOpVw?wg;<`oXB{| zW0LVvGN_AV@5MQCsUk}>o6H8^Be*GgF%*1%#@f?Haf|f~iKQ348{b;WlloTf)mrt6 ze=x}eCbe-n!il=#TfKy~D{Dy+4{}A}jEOER z$Aa8+|E=1CyzUp*xwzm8{OzN3rfm{SA6!TimT3>Z*bCsnZh+sD1=y6g2|oRvZvP)) zm52>S#C$M&vOl0eRBU^oy2n#_GxF7v_{TQ!iL>{9_K0qx6P7#zqb!SJiA?)@60wilPSpI*@ z7B}K8$c}{p_d2qlQ=(-uVlp=QKA>nqu@C$<0-=#^%Q|ivoaa`S_=}_ zc?9n$KXQm^=0*-u`b^$aYi-6_Tey^cS`};UNPV1mFTLAbaJ|n;>}GudG31TOa29Aa z;=_e^YwFp9ekX}C%6pBsMnH$WEm8f)j6t%5V+Ca1?B#vxf#(7S$Asm`p=t=|+4Gxr zxVW9s4lQx-b_O1mS!@wq%WyyNbKHU5{Rms$2ly<+Z0>054ql!JUiQh3C4Cdolw@HQ zZP~sZpLYA_b;JK@#}a61W-?jb{!i>s&$d-|9vIy1zjntG_JcVV6LyHQP!s2GdxQ;=FfWt48K(6J`dT!i5EAB5M*C5>(c!s<*Je@f-<)z{3 z1`Tv8Bv`a%sbd@sN=+P3TLOo53 z6a5%dKIgEW@X}q^L}XD#vb68@l3n6bB)N+8^~VnTm-w56$HR38Q*s> zfit&8uce6Mhq0F@(IBwP!UKcsdj*i;Zt}Z&rj9ltXQ1JX;brV76KrLiB~WN;;1}KT z;7`c!vUN0a_<|>;E-BC``=?okhhHu`*ph9^?D3-|^^!@|n2<>|S!7aOgG{Q-XUQqV z8-7sjoE&{UJXw_5+Ois(!jsP=Y~LnqU8XI5&POc;>Xb63z_p98$Uf+8xLq6NU_zDi zFRw65N_a?z+=^!3Ez;-{8Q!vC>B1wAFn_1Ff=B8C#q4)2orJBY$hej3jLJbMpz%@7 zU3zhtIfoRGt0jr}H^>_vHqmnLe^LOh5rAl$$`-^7HuNQ>?$_v1l@7!wj?fF3{VIko z2xS|3K!TsB{y-~aLt8-uo~?FR^aD-ws3lJ+L@uZGCjSW@8n|kQ>HQ??g=HaLvPK(K zy5{&$IyP1~Nv;|xdwo2U-35+i?L2t6rMy#S)RAekD z(XXV$+R?kF7DUtxdi9< zX3tnlpuwXJka%kwB?gZP4lK#7e8XAOk724692DFPVv9DOH_l<3oB4c~0z9)iSv%8W zh_jE*ll=}6) zWPR7Yd)Z+&?75SqK&zjQrfSM2n=sTv{8)4c$QycJiLh(TuCqdzy>W}(-+y*&h?kn8 zJ51F4tx8Fap=ia*%Rx{{L`x{O&RSb&Qx84Dg$}R&%M2s)&YFGFm62>v(3%%0IEIAA z*42;Xe5jp3Rf~0;LXaxF9{q)-E46x-tvb4_xzM&2s&h)k$+^gNXqqPS=K~F2(`JgS z(#aK`FOL=a298T+-o}QmSG*shM_sUZqJ0DCTeo4gcjwA(=E`>+Ig0iZxRz8#bSy7$ z+Ui_)2ez1M@Ys+elo{srK_=Ib*-_}<`d^R4Ifjgm?S8GKboD&<0IApI#hNG=(Y^}v zkWwnAk6BmEFu5f8#t8#wcATCwD(f|$Yr4-q-9NavqCILauJ}4?Ev`5j8`4VRM0KQc z#zc5w`fIXj?n_1L8CXNMhszFX9Aev-sZJcJrA#n{Z5BXm5vw@-m5II z#j8^KjZ~DCVk-3_f0IlY3%SsQ<>0zxJ;`^Lae;GbZi&wDaM@!M%0tcmF}{F{kG~ZJZxM}7m;3FVOaR(KE02yTj{r>-G^zR*L69p~Xk_Zt z=r7N1&}+zuXo*Qfev8?j^~Z)YNi44Ay{0g#n*2@e`S{y{FuXEu7LCi#0Rt6?*bHcjpmRKn+rgyF+8m;b#pV5KRkFkv~@J- zYoET9Z}n-!u~nZ=@@KP2>^KCG)PIRSj}*vJwtmA|NmUt1Me;~TaRm+%Z4}bC(4cdf z+S!Tqa2B;FG_t3YY0=b^`F(8F&KhA5(LZjW(|GPidf&9PaBw6!a6ZaDJvBDAPbi#$ zGdAQFwVF9=76A{O^7YwkAnSPXp$%m6eOlF)LI9y8IFXq280UjiWS9l>an=Q;d?NVc z4%YU%{+cQ^0>Dr8Vgtyl zzu5yO42;~JRHUG#cs85;uppWZXMog;89O#ac84NMz*%z}5xA*PrS+Cb9<`t}rDmb} zjGGFn^~(U$RMJ{lI+C?9cdJxTC@7uFxo!yIft^x*2$QeVg%UXBz|oDgxuAVOFT@9# zX#zV1Rg!bvn>b=Y!5>q2BLOf?~d3{-z&C6jfWzmH{54V{jW|Sk~?o zBr)W1a4B%az>>ukNjNwLe=nU!@EW6}yP2n`{0c;psw;PsbKL~xCrM|ilAxH$`G8zY zMubFa3=D?6GkA!Cl>;lyk?g&Seuj7crm_|z}jq-U<=dUvR86WmXwsw z8NlH&+!kfLhQoq4s}VMZ`${n47&q7FlZiP7`%xy=~ZM(K?Kt=hOBbr8LQG{O>+0cD%#*h8UF@ z*es)vz92)UH~zp*@w52v4(wDgzAGwH7UZfC3McP1Ox@;=a{|^-cJu~w^j?p%EPAy$ zF4TPQ;iZP^fz{)Ot5>F(`oCY1_#>$b{Tr--42$eo9h%BWmg+$Bpbe``Q^Q9OF|Ll1^QzEKo-0|0VkZlrTRNOf*w(_|>8?4M9h`HEM6v0Zi#ys)sIRLUubcGDTI>=Z1p)E|ou)zcG6=ou=} z@6%J6Ng>qs?u=j+WonO0+4iy{Hp@0xe-omL`M7{G{Z7i%Q@Q4F{SOHMW6S%mLq=f^ z{*RhA2iio_X0uoS?1U5s-UBpkrgGM~T2|_L;>o_IoP7)wJ|vQKx$x9&!xTx^s>Iz(|` zk_d3H`p2V_`Y%+cv_P?bRN0VO+2ZT3E$<3^(U&_d9&Y&)1lNnHE>5q07iyBt$JV-9 zIw9NsmP{ZiNM5ILooUlWlW$qm$;paC9vOJP%-D3>s{Y!b+GN%?uGbtWbA?6W->(BF z8$zD$rot<4?#f~P8_a$QIrhRTzcof9Tpu$z3EVJ&ON*Zb)!P#_B7xd{(vw-u_Kj*n{>b~zn)%r328Y7xSx4A- z=poNEY9ITOZ_Qz6&H3af59TnOmeAAkpu@SYKYn$)$7D>LyK)drnB6@1IVX{HfAYJ0 z_>U4z`0#(v8y1>PRHF=4kw4E}lXPm1K=zgEFi)2Snw39#fyI`(SCh2LT`+F4uEa=cv1_N>ApGD-<13EtG|H(zxo>(@PCBAQ68a+MQ#x=_uc-Xd8Q}yU!%1mxda*c zcSWv9*fSy*V6U@Iyw*Re`u?P`{&VxX|<5KXVkoH40#}RAy`q4W@cRy#~yqxMzX?yzNw2Tv?s&^akLmL0eGjevz4(#HskD26NJH}|2UpK+9`yyJJ{c^J4jRG0dgdwlcbL6H3p!I zc1rZ0&`wF)I1Is;(SL)%r7E6UP`)i{`jJ9J*2tkm81FwIPn7jOVY3!$7sF_X@i4Lxt+EuFnTNIpl8WDM^MZCy3 zIXa253!@BB-Q6NS_zmA!qj=JN6=%Ib`_j~wuSX%;I3E}tB=S$JCTqRGdi8rhqoYI& z7J69gPm{K@<{x|m!dm|_;DJt9>&Kp9cJ0kt{|sR#RV!5+*(MW;wO;zSh3bN}{<=h- z^&24B$uaP%Z-kjvU@{bIy>v~JwO&o2u-3~wCUp?`ja0Cja6Cp5%$e+>C2~ijrCPH3 zEPz@ct<)B1u}9v);U82DZ~g5?cM>eovRu`*gtuP0*xH@)-AG8)4VvngYn$f-SfXeA zivgl0ZQ-p4h<1V_S1KyBReGv+M0o4t(Q{5po4{RPD?!NE4z9yu4$7FClNEQpz#9$6 z8CuYURgB^|cm2>m&;)ST@04;0cl~FSj7P@Cpb@tDO$49?)nKmw?Dq;BS))5;l*3z3 zC+-2Hc*iJTP_|lD< zIoZggK<6t{6+8XZt|!>YOhqh`C(cT*whrPR;eK}wZ1m`+>Sm*l7tS0E>*)~*HhQUi zi?Gp)MRf<*=v4kDg!{45zI^m(t z=x8-z8PAIZhcRJA`%JHfT$CcPUmLJSLV=wP08!(&QFK`FallA_jloFY*J!FMqUl`P zn2xMye^}}V86g=)^GU5~YSqqqT8f_awA7E$4HP%MT4RDTdWD;Q>DSVW9WdGBq3!Gr z42Pv>=qm^}A{*TFlBonYy&%!AG%y5q?!`s6B~c%2=T$${RK=Og#`e@$SSsCHkt+0| zaPV;)h2BDaRW_|6ua^9ybCstrBeqond7&%cqIUf&4g-Om5*v1mt-?evA&QA!sug77 z*7wVq!Q8m5hVx(L)hC?)879O7f=Kbt3ogY!FA?utiuY!jLty?=>pVAIYE|aS7Eb*~ z3DH!it~(g{gz|pRPF7QSNU)-Pa<3dd*FP~f&+_Cod6xZ{(K&e*A7%~aRm=&(;M1)? z-jHY6B_GiU*u31S^`WPUD&ZCzTHwA?oVF$P?E)pA{|yRpP2ufx**(L4{O>Iks)aY9 zse#z&Wjbh-2A243t*J2uTAPxDHhH48aqW1eE#=Fc!=}EJY3a^KcWb+Q=?606!-X(y zqIIux`{cCZ66f~+O3gW3%G1pB;K>yuMCQ;mhx^pBzS>+n!h=pP>o+CPFxvg@G8om= zm6oXrraM0sXUdNphAmvlzSuwyws-@_k>wN@c+rW#3vTuo%Q|2|@�Kv6Wja9*cfC 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 WPr#pmKLLLN{sjC9_!Ia)C-5gJ^ci>n literal 0 HcmV?d00001 diff --git a/libexec/UnRAR/license.txt b/libexec/UnRAR/license.txt new file mode 100644 index 0000000..afbdc87 --- /dev/null +++ b/libexec/UnRAR/license.txt @@ -0,0 +1,34 @@ + ****** ***** ****** UnRAR - free utility for RAR archives + ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ****** ******* ****** License for use and distribution of + ** ** ** ** ** ** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ** ** ** ** ** ** FREEWARE version + ~~~~~~~~~~~~~~~~ + + The UnRAR utility is freeware. This means: + + 1. All copyrights to RAR and the utility UnRAR are exclusively + owned by the author - Alexander Roshal. + + 2. The UnRAR utility may be freely distributed. It is allowed + to distribute UnRAR inside of other software packages. + + 3. THE RAR ARCHIVER AND THE UnRAR UTILITY ARE DISTRIBUTED "AS IS". + NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. YOU USE AT + YOUR OWN RISK. THE AUTHOR WILL NOT BE LIABLE FOR DATA LOSS, + DAMAGES, LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING + OR MISUSING THIS SOFTWARE. + + 4. Neither RAR binary code, WinRAR binary code, UnRAR source or UnRAR + binary code may be used or reverse engineered to re-create the RAR + compression algorithm, which is proprietary, without written + permission of the author. + + 5. If you don't agree with terms of the license you must remove + UnRAR files from your storage devices and cease to use the + utility. + + Thank you for your interest in RAR and UnRAR. + + + Alexander L. Roshal \ No newline at end of file diff --git a/libexec/gitlog-to-deblog.rb b/libexec/gitlog-to-deblog.rb deleted file mode 100755 index c404462..0000000 --- a/libexec/gitlog-to-deblog.rb +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/ruby -require 'erb' - -# Determines package name from the origin url on github. It's hackish, but it -# works (mostly). -def pkgname - # originurl = `basename $(git config --get remote.origin.url)`.strip - pkgname = `basename $(git config --get remote.origin.url) .git | tr '\n' ' '` - # _, pkgname = originurl.match(/\/([a-z0-9\-_]+).git/i).to_a - pkgname -end - -# Accepts a hash of git log data and returns a properly formatted debian -# changelog entry. -def debchangelog(logdata) - template = <<-EOF -<%=PKGNAME%> (<%=logdata[:tag]%>) unstable; urgency=low - - * <%=logdata[:subj]%> - - -- <%=logdata[:name]%> <%=logdata[:date]%> - -EOF - ERB.new(template).result(binding) -end - -# Checks to see if the repository has any tags already. -def repo_has_tag? - `git describe --tags 2>&1` - return ($? == 0)? true : false -end - -# If the repository has no tags, we need to make one so we can get some kind -# of versioning number for the changelog. -def make_temporary_tag - firstcommit = `git log --format=%H | tail -1`.strip - `git tag #{TEMPTAG} #{firstcommit}` -end - -# Removes the tag we added if the repo had no tags. -def cleanup_temporary_tag - `git tag -d #{TEMPTAG}` -end - -# Removes jenkins build tags (if they exist) -def remove_jenkins_tags - IO.popen("git tag -l 'jenkins-*'").readlines.each do |tag| - `git tag -d #{tag}` - end -end - -# Get the name of this repository -PKGNAME = pkgname - -# Name for the temporary tag (only used if the repository has no tags) -TEMPTAG = 'GOPSI' -#TEMPTAG = pkgname - -remove_jenkins_tags - -if repo_has_tag? - dotagcleanup = false -else - dotagcleanup = true - make_temporary_tag -end - -# Loop through the git log output and grab four lines at a time to parse. -gitlogcmd = %{git log --pretty=format:'hash: %H%nname: %aN <%aE>%ndate: %cD%nsubj: %s'} -IO.popen(gitlogcmd).readlines.each_slice(4) do |chunk| - - temphash = {} - - # split each line on the first colon and use what's on the left as the - # symbols within the hash - chunk.map { |line| line.split(/: /,2) }.each do |type, data| - temphash[type.to_sym] = data.strip - end - - # dig up the most recent tag which contains the commit - temphash[:tag] = `git describe --tags #{temphash[:hash]} 2>/dev/null`.strip - if $? != 0 - dotagcleanup = true - make_temporary_tag - temphash[:tag] = `git describe --tags #{temphash[:hash]}`.strip - end - - puts debchangelog(temphash) -end - -# If we added a temporary tag, let's remove it -cleanup_temporary_tag \ No newline at end of file diff --git a/libexec/inifile.exe b/libexec/inifile.exe new file mode 100644 index 0000000000000000000000000000000000000000..d9cb91198ad087325d131d355178889f4975a442 GIT binary patch literal 8704 zcmeHMeQ;CPmA{fDBWwvPUUs$QHIR{;Fa>B6)4ek)8;2 zF%c^(6Z=J7rn@sq+x)Q{i8G8Y5RtI-?`_W`#T@^ocpeD&Hm#ohcRYB(=^6T<4sS6=s&xQV|vlb z!A0z)g>Mv}Htl+&cyAyWm3kuKMlBqyG#~#<3QYMX^9FV+IC%!wi8r-%G_KHTvu-zW$bRv7&>I8tO9;|B zS}fkPFJdybov|%C^*ilf1#bK^5KG$;2+SW{h>q+cKWCi)jYneaE2WBjNCEv$zRqBF zyceNmJrc=9I{b>CF%lCoLTuRQXfXFwAaJF+7_;Sq4+f+6aIk}4{x%q?d!EIjR1LhqdC0UF=<>mMb1#TE=Mh2qA32W?S~gSLo2l(n7?((&7|UPLtDgs@@4OMp1phgFHK z)U$%Vw;-!)rRW<9jhDKDgdX-9i+z-JH>JfFgilXFY(F2xq5Mezl`{ajFzjZ4pJP$V z@w5PV60}xMv=NjT_ENFy=FygBzFa_APW#8Tf>k~a)JjgR}yrK%N8 zBO&x!9WTt%WGlW@(3b;-p)J7HFvia!B~p&#Vgsx&?gWu1{~BGE2cnXQC;XUo<|BNr z4KS^oruh=&$V{|f!L05FO6Y~fD51zaKS#kb{CpLp?&tSGecaEt%%AP2x`MPDLAe(m znT9L-vv@{6tp<2O-$RfC#lqMMtD5x zUY9dvckwY?S=2%oT>J4YKu!L|T=@hn2r>^)Y3y>@_wyGaDtJJ$dkD_MFMx*=c@N-h z#*y+0aIgTUTQ4S4RW1w3+C6hi`M32|w`Hw5HoNM}n1n?JS`hqwIaWFxGK)mq^}z^y zz0bv8z_g~gZ2SZWeCmcQtlkTCg|nU(yxi<6EWQ-8j{hSS%RTh{DtNhtot7}%G#s;O zR$^t|7lJcf>v&?GbivEOg!Fn{T9;j=BRFZa3@YY*q^u)Vu4St-Uz#UcBt*s65@13^ z$}AV#YWRB?TV?n={te)tAmjQiF5U2WFOG_pb54+1%YbCbg$Z0R-0Y+l4h69i>TUp6Hb~>iGJdot*K?m#_ADm=WMh^VlAV@>REtj z?{zJwRN(Cx7zzS(G3JX=qIy>C!_@o|B|s0zCCb|E#MLZ*C*b(9-l zqk~?7_M}eO_z@6^b53D4Rl!UVoWrFAbfK{I6}q8_8vxEothb2P6+@_=A#qBep2@ErusCV!~LND!I1#fBLb3y{`C?m70{Q zTB*hIQ#)CLo8lWWul~5?^;FeuTFywx#Y|pVTBWzSOsn_teyaYxu4Q#zmGf6INM2DV z6kEMG&D5!+)}j&_j<~kgCIr82B$o+7w^Z-z)yuW8Ic9^&@8RriP%rW| zq+m*Q+dW?1O!%65vA<g52|jPT0cEttB7A`N^$)948ZT!ng5Jm|BuHfG06OC#LR#RTh#X{7X&?$!;GO}RIR$pWosy#OpYNs zmV&-P#EhItrVILB1RdXmbNxF+Yy|NfhJ{%@a~)0OC}P-rsI^~$qTVv1I`D26kDaf-giN{HNIsL zQ}PFDO~Bn)xJbzmcy52Q%b8i27&T!Fv2viGZ!C6}OlxXuX>A;`v$hs>L=a%8LxM6G zSpoOfH~7>eu0kJ=&oacQHs_Qn_OD@>=9A zZLhK&%h z|C}^jQKu+@KA?$-^Q>LTN_=8Nj16fI4Pnn*W7|88QD@Dmm$}QkLwO}BZ zB9bxnrDGW{za0jRED-tT)C&UfwInYn_ozb+sUDN64cHQC6C!sF`|PC6c9x8koCVKQ zTgUg{d)*3Wu*hD=e+6qWnCH%UDla4-xibkHoruvH96G49DP>VZr{v=srZo+pxttrq z5G2|>0Iabj)5@(Wk13ObdYiSUWC$O|vNXDR@}0N{;d|4`v?4kbPM&gCu;DC;Y?{~< zZ;`*3e9B^V7;3UKi0v+f$+@uNG|j`G#cG2daZfY;HH;JIoQWxO>S^mWh$z;?R8DMb{I%;CJP^AN zGqEN5iU3=OADP^bC5?>+h*rcZD;P4U;K?|YWe$y)*v|N-X60HcdHT1|I4frna+*>) zDJGnXt@B13Y|a#_sf&fF~_X@XCFWnB}HQE!iox9Y;(1u zLcles<;(EuoYda#{PoH2VhxC^C;veZftTo2PJ@%@i7Z-9vZlbDchEq>KrMHn54@$z zbMY!mSF{der?BO{wxkxb{xBDD>|`mo4ZH53T`ymQRgE5>RxWVgPNwzg*a{!N3@_C3 zyXOn&(@<>z)XXXz8SqGCDxD0S=2j)&%fCzOC#oB(Q`II9!Xd87T9K2irBi1+YX0-c z*5i;%RekYBz$SM27=}oUj6;ll{4tCh8ykEaKU0}+4rd*3=sSelCq6l3*R)5A*)`lQ zMWnPM@-3N;E%khSio6;VrHsWhC22BBl2upWw;o;F=^3?JFs6(C2_ih5Ce=X_wYn=O z>6+X!SG5Z-#H@qg#MUkxi&@VQF|ca;fN9&tb1}Q^7qJh;|6U~1!|T)NP?yl3xNPsQ zznbX1%9L`|ebvJw_|zxPS^C{ms`#N^tJY7|@l|GA$=uVbd&;BMTm^5sj=u;V?&xGg zj<9$HF@HbH9K!e1C3olDpbX1|p6GG1v8*_9$uw@%?A3T80j~Vc+2~k-M@x(@^tkA8R117)08-)<;bWh`3 zF>9^Zk6Ll*Epgi^+BLr;^YlHM3({4g+%9hMS?VeNFnqK4^%W^r#edP{h%DGtV|(0* zxe_r4t1}i{;Lj9Q3=k>zajx~#*@zMZ#eWB+ok`~{setcr-wN!m_Q;)ZFPD(&au_! zME|p?*u4?CJA6=PJ9qCq z5bTmm=Dy=WQUs}_?R@$&`-Tn8V+jO_IBOHk;lD9qJmk%6}BSS9u6t~Lk~FeBuUyC3RW8i&Cnjd5|Emry2=)*$B#cg%8DF`I`TZT^aEHcN!78C zFigh^DsuPMs1gZ=9+f12G#Y#~ByWE5S_g*Qg z_+dEIuZgael(6L8TeYWtF9jA)-klX}%XXcnzPgez`n%=6ES{^1v5Q&bIcfae6!IG| zzXh!t&4acdjh;Hp9Y9mioSFAg>C3WG6Yhw0$vga^jxKo{ zyf^QV{XLb~PDN&{ha@V)-QAep6%0Y(Ig2lX4D&>S2O;5!gsCRHA~Ui2b~EHZW$rry zxk^SFhYvHW$$cmY(QvyQjWQcXJ<#C}9SlaoAxZ-sGrEnvOEy%;y1J-(cB5dRXW7T~ z> temp.bat + call temp.bat + + INIfile.exe outputs the statement: SET Name=John Doe + which is redirected and written into "temp.bat", + which is CALLed to run the SET statement. + + Note that this method produces a temporary file that you have + to delete later. + + ++++ Example with FOR construct (asssuming in a batch file): + + for /f "delims=" %%a in ('INIfile.exe My.ini [Profile] Name') do %%a + + This will capture and run the output line(s) from the command + which is enclosed in single(!) quote marks. + Double quote marks may be used within the command, if necessary. + For details see FOR /? at the command prompt. + + +In any case the variable %Name% will hold the string that was assigend +in the INI file. Note that the variable may be empty. + +*** + + + diff --git a/libexec/inifile/inifile.txt b/libexec/inifile/inifile.txt new file mode 100644 index 0000000..7fde9b5 --- /dev/null +++ b/libexec/inifile/inifile.txt @@ -0,0 +1,121 @@ +INIFILE - 32 bit tool, Ver 1.6 (c) 2006-2009, Horst Schaeffer +------------------------------------------------------------- + +This tool handles Windows type INI files with section names in square brackets, +and assignments of the form: item=string (case ignored for section and item names). +The INI file must exist! +This program uses the functions supplied by the Microsoft Windows API. + +++++ Change or add an assignment + +Syntax: INIFILE inifileName [section] item=string + +Example: INIFILE c:\some\where\program.ini [Profile] Name=John + + The string is taken up to the end of the line. + Optionally, the (entire!) assignment may be enclosed in (double) quote marks + (in case there are redirection symbols in it). + In any case the item name as well as the string will be taken without leading + and trailing spaces. + + Example: INIFILE c:\some\where\program.ini [Profile] "Name = John" + + If the item is not found, a new line will be added. + If the section is not found it will be generated. + + +++++ Remove assignment + +To remove an item: omit the string (the equal sign is mandatory) + +Syntax: INIFILE inifileName [section] item= + +Example: INIFILE c:\some\where\program.ini [Profile] Name= + + The complete item (not just the assigned string) is removed. + If there are no items left, the section will NOT be removed. + No error will be reported (Errorlevel), if the item does not exist. + +++++ Clear assignment + +If you want to produce an empty assignment without removing it, +use two equal signs. + +Syntax: INIFILE inifileName [section] item== + + +++++ Remove entire section + +To remove a section the security option /REMOVE (case ignored) +is required. No error reported, if the section does not exist. + +Syntax: INIFILE inifileName [section] /remove + + +++++ Get an assignment + +Syntax: INIFILE inifileName [section] item + + (Note that an additional equal sign would remove the item!!!) + + The program will generate a SET statement, and send it to STDOUT. + If you want to produce an environmental variable, redirect the output + to a temporary batch file, and execute it (see also: GetOutput.txt) + Note: Character set is ANSI (Windows), not OEM (DOS). + + Example: + INIfile c:\some\where\program.ini [Profile] Name > temp.bat + call temp.bat + + If the assignment could not be found for any reason, + the SET statement will be empty (set var=), which clears the variable. + + Note: This method cannot be used when equal signs or redirection + symbols are expected in the assigned string. + +++++ Get all assignments of a section + +Syntax: INIFILE inifileName [section] + + SET statements will be generated for all items in the section. + + +++++ Errorlevels + + Errorlevel > 0 indicates an error (message to STDERR) + 0 done + 1 INI file does not exist + 2 Section name in square brackets was not given + 255 No INI file specified or help requested (/?) + +The INI file operations are done through the Windows API which handles spaces, +upper/lower case etc.. There may be a size limit or a problem with long file +names in older Windows versions. Please test. + +Note: In case you have used my old DOS program "INIFILE.COM" make sure that this new +version is found through your PATH assignment (or use the command "inifile.exe"). + +++++ History + +version 1.6, 27 May 2009: Compiled with PB 4.30 +version 1.5, 29 Sep 2006: Equal signs allowed in assigned string (though not recommended) +version 1.4, 02 Aug 2006: Added function: clear assignment without removing +version 1.1, 12 Feb 2006: Added: read all items of section +version 1.0, 05 Feb 2006 + +++++ Disclaimer, Copyright + + This program is distributed as "freeware", copyright reserved by the + author. There are no warranties of any kind, nor any liability by + the author. Users accept full responsibility for the use they make + of the software and for any damage caused thereby. + + Source available: http://www.horstmuc.de/source/inifile16.zip + + Contact the author: + + mailto:horst.schaeffer@gmx.net + http://www.horstmuc.de/ + + +*** 27 May 2009 \ No newline at end of file diff --git a/libexec/innounp.exe b/libexec/innounp.exe new file mode 100644 index 0000000000000000000000000000000000000000..1a21fbeacdba5e97d11747aea59a932d3418680c GIT binary patch literal 539648 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 O?Kd#2A^gAm?|%TE>+ClG literal 0 HcmV?d00001 diff --git a/libexec/innounp/innounp.htm b/libexec/innounp/innounp.htm new file mode 100644 index 0000000..9039460 --- /dev/null +++ b/libexec/innounp/innounp.htm @@ -0,0 +1,626 @@ + + +innounp, the Inno Setup Unpacker + + + + + +

innounp, the Inno Setup Unpacker
+Version 0.39
+Supports Inno Setup versions 2.0.8 through 5.5.3

+
+
    +
  • Innounp is open source and based on IS source. Therefore, it is more likely +to support future IS versions.
  • +
  • It recovers portions of the installation script (.iss file), including the registry +changes and the compiled Innerfuse/RemObjects Pascal Script, if available.
  • +
+

If you want to report a bug, request a feature, or discuss anything else related +to the program, please write to the forum.

+ +

Both the source and the executable packages are compressed with +WinRar. While the full-featured packer is shareware, +the UnRar utility that can only extract files is free. And there are lots of free +third-party programs that unpack rar just fine, e.g. 7-Zip.

+

As a bonus, a simple unpacker for Setup +Factory installations is available on the download page. It is ripped from +the SynCE project.

+

Usage

+

Innounp is a console application, and it uses command-line options to find out +what to do. For a more human-friendly interface utilizing FAR or Total Commander as +a front-end see the MultiArc section below. Windows Explorer fans: +nullz has made +some .reg scripts to add innounp into the right-click menu and Richard Santaella crafted a +graphical wrapper for innounp (get it on the download page).

+
innounp [command] [options] <setup.exe or setup.0> [@filelist] [filemask ...]
+Commands:
+  (no)   display general installation info
+  -v     verbosely list the files (with sizes and timestamps)
+  -x     extract the files from the installation (to the current directory, also see -d)
+  -e     extract files without paths
+  -t     test files for integrity
+Options:
+  -b     batch (non-interactive) mode - will not prompt for password or disk changes
+  -q     do not indicate progress while extracting
+  -m     process internal embedded files (such as license and uninstall.exe)
+  -pPASS decrypt the installation with a password
+  -dDIR  extract the files into DIR (can be absolute or relative path)
+  -cDIR  specifies that DIR is the current directory in the installation
+  -n     don't attempt to unpack new versions
+  -fFILE same as -p but reads the password from FILE
+  -a     process all copies of duplicate files
+  -y     assume Yes on all queries (e.g. overwrite files)  
+
+

If an installation has setup.0 (it is made without using SetupLdr), run +innounp on setup.0 instead of setup.exe.

+

To extract all files from a specific directory, use dirname\*.*, not +just dirname.

+

By default all files are extracted to the current directory. Use -d to +override this behaviour. For example, -dUnpacked will create a directory named +Unpacked inside the current directory and put the extracted files there.

+

The -c option is a little more tricky to explain. Suppose you opened an installation +in a file manager and browsed to {app}\subdir\program.exe. Now if you copied +program.exe to another location, the entire directory tree ({app}\subdir\) +would be created and program.exe would be extracted there. -c notifies innounp +that you are only interested in paths from the current directory and below, so that your +file, program.exe, is extracted right where you intended to copy it, not several +directory levels deeper. Note that in order to avoid confusion, files must still be +specified by their full path names inside the installation.

+

Note that an installation can contain several identical files (possibly under different names). Inno Setup +stores only one copy of such files, and by default innounp will also unpack one file. If you want to have +all files that could ever be installed anywhere, regardless of how many identical files this may get you, +-a option will do it.

+

If -m is specified, the file listing includes embedded\CompiledCode.bin +which is the code made by the RemObjects Pascal Script compiler. It is possible to disassemble +it using the ifps3_disasm.rar package on the download page. The result is not very +readable though since it uses the basic 'disassembler' from IFPS3. Anyone wants to write a +decompiler?

+ +

How to report bugs

+

OK, I know innounp is far from being perfect, but it is my intention to make +the program usable. User feedback is a great way to achieve this. Here's what you should +do if you find a bug and want it fixed.

+

Tell me what's wrong with innounp. If you encountered incorrect behaviour, +say what you think it should do and what it actually does. If it crashed or gave +an error message, say what did that - innounp, Windows, FAR, etc, and include +the details.

+

Describe the exact steps necessary to reproduce the bug. Say what are the +preconditions. Is the bug specific to some system settings? To a setup file you +have? (include the problem part of the installation script or a link to the compiled +setup, if it is small enough) To an IS version? To something else? Or does the +bug occur regardless of these things?

+

Once you have the bug report ready, post it to the forum. Remember, if I can't +reproduce the bug using the description you gave, the chances that it will be +fixed fall dramatically.

+

If the above guidelines were not obvious for you, I suggest that you read the +following articles.

+

How to Ask +Questions the Smart Way by Eric Raymond
+How to Report +Bugs Effectively by Simon Tatham

+ +

What's new / History

+

0.39 (2013.07.12)

+
    +
  • Fixed CRC32 calculation during unpacking (regression bug).
  • +
+

0.38 (2013.02.01)

+
    +
  • Added InstallDelete and UninstallDelete sections to reconstructed script.
  • +
  • Added some more values to Setup section of reconstructed script.
  • +
  • Several minor reconstructed script improvements.
  • +
+

0.37 (2012.06.02)

+
    +
  • Added support for IS 5.5.0.
  • +
  • Fixed problem with reading of large files.
  • +
  • Added some more values to reconstructed script.
  • +
  • Improved FAR MultiArc settings.
  • +
+

0.36 (2011.06.01)

+
    +
  • Fixed support for IS 5.4.2.
  • +
  • Fixed issue with '{' symbol in file names.
  • +
+

0.35 (2010.10.01)

+
    +
  • Added support for IS 5.2.5 (wasn't released, but such installers can be found).
  • +
  • Added command to test files for integrity.
  • +
+

0.34 (2010.09.16)

+
    +
  • Less technical text in some error messages.
  • +
  • Added dump of password hash to reconstructed script.
  • +
  • Added some more values to reconstructed script.
  • +
+

0.33 (2010.07.05)

+
    +
  • Fixed encoding for custom messages in reconstructed script.
  • +
  • Fixed several parameters in [LangOptions] section.
  • +
  • Fixed language names in *.isl files for Unicode-based installers.
  • +
  • Added support for legacy IS versions 2.0.8 - 2.0.10.
  • +
+

0.32 (2010.06.14)

+
    +
  • Added support for IS versions 5.3.10 (both ANSI and Unicode).
  • +
  • Added support for INI section in reconstructed script.
  • +
+

0.31 (2010.04.19)

+
    +
  • Fixed issue with endless decompression loop on incompatible files.
  • +
+

0.30 (2010.04.12)

+
    +
  • Fixed issue with password processing for Unicode versions.
  • +
  • Added support for IS versions 5.3.9 (both ANSI and Unicode).
  • +
  • Added support for LZMA2 compression, introduced in 5.3.9.
  • +
+

0.29 (2010.02.19)

+
    +
  • Added support for IS versions 5.3.8 (both ANSI and Unicode).
  • +
+

0.28 (2010.01.14)

+
    +
  • Added support for IS versions 5.3.7 (both ANSI and Unicode).
  • +
  • Added support for legacy IS versions 2.0.11 - 2.0.17.
  • +
  • Fixed renaming of duplicate files. If we do not use -a then don't append numbers to names
    +(this switch does not affect different files with same name, only duplicates with same content).
  • +
+

0.27 (2009.12.04)

+
    +
  • Yet another tuning for file mask processing.
  • +
  • Added overwrite prompt for files extraction (and option for auto-overwrite).
  • +
  • Several tweaks to reconstructed script.
  • +
+

0.26 (2009.11.30)

+
    +
  • Added manifest resource to resolve Vista/Win7 UAC issue.
  • +
  • Added restored %n formatter to custom messages.
  • +
  • Added default OutputBaseFilename value if one from header is empty.
  • +
+

0.25 (2009.11.26)

+
    +
  • Added support fro [Dirs] section in reconstructed script.
  • +
  • Moved version parameter in script to comment (since it is not original IS parameter).
  • +
  • Fixed ArchitecturesInstallIn64BitMode and ArchitecturesAllowed flags in script.
  • +
  • Fixed file mask processing in some cases.
  • +
+

0.24 (2009.11.20)

+
    +
  • Added support for IS versions 5.3.6 (both ANSI and Unicode).
  • +
  • Added version information resource.
  • +
  • Fixed extraction of multiple files with same name.
  • +
+

0.23 (2009.09.25)

+
    +
  • Added support for IS versions 5.3.5 (both ANSI and Unicode).
  • +
  • Added Inno Setup version info to reconstructed install script.
  • +
+

0.22 (2009.08.24)

+
    +
  • Added support for Unicode versions.
  • +
  • Added support for IS versions 5.3.0 - 5.3.4 (both ANSI and Unicode).
  • +
  • Fixed rare issue with double backslashes in file path.
  • +
+

0.21 (2009.04.24)

+
    +
  • Supports legacy IS versions 2.0.18 - 2.0.19
  • +
+

0.20 (2008.05.23)

+
    +
  • Supports IS up to version 5.2.3
  • +
  • Several bugs fixed.
  • +
+

0.19 (2007.02.23)

+
    +
  • Supports IS up to version 5.1.10
  • +
  • Fixed wrong representation of Unicode characters in LanguageName.
  • +
  • Another fix to the handling of duplicate file names.
  • +
  • New option -a to extract all copies of duplicate files.
  • +
+

0.18 (2006.11.23)

+
    +
  • The reconstructed script now includes the [Types], [CustomMessages], and [Languages] sections.
  • +
  • ROPS disassembler updated to support the latest build of ROPS.
  • +
  • New option -f to read the password from file. This way it can include any special characters.
    +Be sure to save the file in the correct character encoding as no translations are applied.
  • +
  • Fixed the bug that caused the file timestamps to be inconsistently reported and applied (UTC vs. local).
  • +
  • Updated the decompression libraries: zlib to version 1.2.3, bzip2 to version 1.03, and LZMA to version 4.43 +(optimized for speed).
  • +
+

0.17 (2005.08.31)

+
    +
  • Supports IS up to version 5.1.5.
  • +
  • Supports Martijn Laan's My Inno Setup Extensions 3.0.6.1 (by request).
  • +
  • The Types parameter is now space-separated, as required by the IS script specification.
  • +
+

0.16 (2005.04.30)

+
    +
  • Supports IS up to 5.1.2-beta.
  • +
  • Innounp will try to unpack new versions of IS to handle the cases when the +binary format is compatible with one of the previous versions. Use -n +to disable this attempt.
  • +
+

0.15 (2005.03.08)

+
    +
  • Supports IS up to 5.1.0-beta.
  • +
  • The old bug that prevented innounp from working properly with {reg:...} constants and +the like has got another fix.
  • +
  • Preliminary support for the 64-bit extensions that appeared in IS 5.1.0.
  • +
+

0.14 (2004.10.14)

+
    +
  • Supports IS up to 5.0.4-beta.
  • +
  • It is now possible to specify the destination directory to extract files into using +the -d option. This directory will be created if necessary.
  • +
  • New option -c specifies the current directory inside an installation and +prevents the creation of the upper-level directories. MultiArc settings are updated +accordingly.
  • +
  • The old -c command is removed. To get the compiled Pascal script, use +-m and extract it like a normal file.
  • +
+

0.13 (2004.08.26)

+
    +
  • Supports IS up to 5.0.3-beta.
  • +
  • Supports the Components and Tasks sections.
  • +
+

0.12 (2004.07.28)

+
    +
  • Supports IS up to 5.0.0-beta.
  • +
  • Improved processing of big installations with many files.
  • +
  • Innounp now supports a certain level of user interaction - it prompts the user +for password and disk changes as necessary. To switch this functionality off (e.g. in +batch mode), use the -b option.
  • +
  • If no command is specified, innounp displays a brief summary of the specified +installation. The old -i command is removed. To get the setup script, extract it +like a normal file.
  • +
+

0.11 (2004.05.04)

+
    +
  • Supports IS 4.2.2.
  • +
  • Supports ArcFour encryption. Use the -p switch to specify a password +if files are encrypted
  • +
+

0.10 (2004.04.26)

+
    +
  • Fixed (again): filenames containing invalid characters could not be specified +on the command line or in a list file.
  • +
+

0.09 (2004.04.22)

+
    +
  • Fixed (again): invalid characters in filenames (such as ':' and '|') made innounp crash.
  • +
  • Updated TC MultiArc settings.
  • +
+

0.08 (2004.04.14)

+
    +
  • Added support for IS versions up to 4.2.1.
  • +
  • Added MultiArc settings for Total Commander (thanks to Gnozal).
  • +
  • Fixed a bug in MultiArc settings that prevented shells from displaying file +dates and times (thanks to Maxim Ryazanov).
  • +
  • The reconstructed setup script (.iss) is now included together with the 'normal' files. +Using -m option it's possible to view/extract other internal files in the same way.
  • +
+

0.07 (2004.03.16)

+
    +
  • Multiple files with the same name are not overwritten now, instead they are appended +with numbers.
  • +
  • -c command extracts the compiled Innerfuse Pascal Script code to a file. +It can then be 'disassembled' with a separate tool. Get one on the download page.
  • +
  • The output of -i command now looks more like .iss script. +More data is included.
  • +
+

0.06 (2004.03.11)

+
    +
  • Added support for IS versions 3.0.0 - 4.0.0.
  • +
  • Supports installations that were not packaged into a single exe using SetupLdr (these +can be identified by the presence of setup.0 which is appended to +setup.exe in packaged installations).
  • +
  • -i command displays registry changes made by an installation.
  • +
  • Supports (displays and reads from filelists) filenames with national +characters (single-byte character encodings only, Unicode/MBCS was not tested). The correct +code page must be set in Windows for this function to work properly.
  • +
  • [fix] File dates and times were not set during extraction.
  • +
+

0.05 (2004.03.09)

+
    +
  • Improved batch processing. Now it's possible to browse and extract IS installations +in FAR using the supplied settings for the standard MultiArc plug-in.
  • +
  • Removed isbunzip.dll. Bzip2 library is linked statically.
  • +
+

0.04 (2004.02.27)

+
    +
  • Initial release. Supports IS versions 4.0.1 - 4.1.8.
  • +
+ +

MultiArc settings

+

Unless you are a die-hard fan of command line, you may like the idea of working +with IS installations like with conventional archives in a file manager. Right now +two programs support this: FAR and Total Commander. Below are the instructions +how to integrate innounp into each.

+

FAR

+

Copy innounp.exe to a directory in your PATH and edit your +FAR\Plugins\MultiArc\Formats\Custom.ini file. There are two alternate +settings differing in several aspects and each having its own pros and cons. Try +the recommended setting first, if it does not work well for you, try the other +setting or even combine them.

+

Co-operation with InstallExplorer

+

If you have InstallExplorer installed (or another plug-in that handles IS, +but you will need to adjust the settings accordingly), you might want to let it +process all the other types of installations but keep IS installations for innounp. +FAR does not provide a means of customizing the plug-in call order; however, an +empirical study has shown that it loads plug-ins and applies them to files in +lexical order. So the solution is to rename InstallExplorer's dll file from 6InstExpl.dll +to e.g. zInstExpl.dll (and restart FAR).

+

FAR: recommended setting

+
[InnoSetup5]
+TypeName=InnoSetup5
+ID=49 6E 6E 6F 20 53 65 74 75 70 20 53 65 74 75 70 20 44 61 74 61 20 28 35 2E
+IDOnly=1
+List=innounp -v -m
+Errorlevel=1
+Start="^---------"
+End="^---------"
+Format0="/^\s+(?P<size>\d+)\s+(?P<mYear>\d+)\.(?P<mMonth>\d+)\.(?P<mDay>\d+)\s+(?P<mHour>\d+):(?P<mMin>\d+)\s+(?P<name>.*)$/i"
+Extract=innounp -x -m {-c%%R} %%A {@%%LMQ}
+ExtractWithoutPath=innounp -e -m {-c%%R} %%A {@%%LMQ}
+Test=innounp -t -m %%A
+AllFilesMask="*.*"
+
+[InnoSetup4]
+TypeName=InnoSetup4
+ID=49 6E 6E 6F 20 53 65 74 75 70 20 53 65 74 75 70 20 44 61 74 61 20 28 34 2E
+IDOnly=1
+List="innounp -v -m"
+Errorlevel=1
+Start="^---------"
+End="^---------"
+Format0="/^\s+(?P<size>\d+)\s+(?P<mYear>\d+)\.(?P<mMonth>\d+)\.(?P<mDay>\d+)\s+(?P<mHour>\d+):(?P<mMin>\d+)\s+(?P<name>.*)$/i"
+Extract=innounp -x -m {-c%%R} %%A {@%%LMQ}
+ExtractWithoutPath=innounp -e -m {-c%%R} %%A {@%%LMQ}
+Test=innounp -t -m %%A
+AllFilesMask="*.*"
+
+[InnoSetup3]
+TypeName=InnoSetup3
+ID=49 6E 6E 6F 20 53 65 74 75 70 20 53 65 74 75 70 20 44 61 74 61 20 28 33 2E
+IDOnly=1
+List="innounp -v -m"
+Errorlevel=1
+Start="^---------"
+End="^---------"
+Format0="/^\s+(?P<size>\d+)\s+(?P<mYear>\d+)\.(?P<mMonth>\d+)\.(?P<mDay>\d+)\s+(?P<mHour>\d+):(?P<mMin>\d+)\s+(?P<name>.*)$/i"
+Extract=innounp -x -m {-c%%R} %%A {@%%LMQ}
+ExtractWithoutPath=innounp -e -m {-c%%R} %%A {@%%LMQ}
+Test=innounp -t -m %%A
+AllFilesMask="*.*"
+
+[InnoSetup2]
+TypeName=InnoSetup2
+ID=49 6E 6E 6F 20 53 65 74 75 70 20 53 65 74 75 70 20 44 61 74 61 20 28 32 2E
+IDOnly=1
+List="innounp -v -m"
+Errorlevel=1
+Start="^---------"
+End="^---------"
+Format0="/^\s+(?P<size>\d+)\s+(?P<mYear>\d+)\.(?P<mMonth>\d+)\.(?P<mDay>\d+)\s+(?P<mHour>\d+):(?P<mMin>\d+)\s+(?P<name>.*)$/i"
+Extract=innounp -x -m {-c%%R} %%A {@%%LMQ}
+ExtractWithoutPath=innounp -e -m {-c%%R} %%A {@%%LMQ}
+Test=innounp -t -m %%A
+AllFilesMask="*.*"
+
+

FAR: alternate setting

+Will not work for IS 5.1.5 and up because new versions no longer have this signature. +
+[InnoSetup]
+TypeName=InnoSetup
+ID=49 6E 6E 6F
+IDPos=48
+Extension=exe
+List="innounp -v -m"
+Errorlevel=1
+Start="^---------"
+End="^---------"
+Format0="zzzzzzzzzz  yyyy tt dd hh:mm  nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
+Extract=innounp -x -m {-c%%R} %%A {@%%LMQ}
+ExtractWithoutPath=innounp -e -m {-c%%R} %%A {@%%LMQ}
+AllFilesMask="*.*"
+

Total Commander

+

Will not work for IS 5.1.5 and up because new versions no longer have this signature. I guess the +version-specific settings from above have to be cloned.

+

Configuration made up by Gnozal and Maxwish and posted on +TC forum. Change the path below +to where you have innounp installed and add this to your MultiArc.ini. Note that +MultiArc is not included in the default TC installation, instead it is available as a +separate download from Siarzhuk Zharski's web site. +Refer to the help file for information on any additional configuration necessary.

+
[InnoSetup]
+Description="InnoSetup"
+Archiver=C:\PROGRAM FILES\WINCMD\WCXPlugin\MultiArc\innounp.exe
+Extension=exe
+ID=49 6E 6E 6F
+IDPos=48
+Start="^--------------------------------------"
+End="^--------------------------------------"
+Format0="zzzzzzzzzz  yyyy.tt.dd hh:mm  nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"
+List=%P -v -m %AQ
+Extract=%P -e -m -c%R %AQ @%LQ
+ExtractWithPath=%P -x -m -c%R %AQ @%LQ
+IgnoreErrors=0
+SkipEmpty=0
+SkipDirsInFileList=0
+SearchForUglyDirs=0
+BatchUnpack=1
+UnixPath=0
+AskMode=0
+SkipLIST=1
+Debug=0
+ +

Copyrights and licensing

+

Copyright © 2004-2013 QuickeneR, 2009-2013 Ariman
+This program is licensed under the terms of the +GNU General Public License (GPL). A copy of the license is included with the source files.
+If you distribute innounp on the WWW, please put a link to its home page, +http://innounp.sourceforge.net

+

Over 90% of code is ripped from Inno Setup which is Copyright © 1997-2010 Jordan +Russell. All rights reserved.
+Portions Copyright © 2000-2006 Martijn Laan. All rights reserved.
+See http://www.jrsoftware.org for details.

+

Contains zlib code, Copyright © 1995-2005 Jean-loup Gailly and Mark Adler.

+

Contains bzip2 code, Copyright © 1996-2009 Julian R Seward. All rights reserved.

+

Contains LZMA code, Copyright © 1999-2009 Igor Pavlov.

+
+

Innerfuse Pascal Script is Copyright © 2000-2004 by Carlo Kok, Innerfuse.

+

StripReloc is Copyright © 1999-2005 Jordan Russell, www.jrsoftware.org

+
+SourceForge.net + + \ No newline at end of file diff --git a/sample/32bit/installer/license/CLIENT_DATA/delsub32.ins b/sample/32bit/installer/license/CLIENT_DATA/delsub32.ins deleted file mode 100644 index b83987c..0000000 --- a/sample/32bit/installer/license/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,115 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\" + $UninstallProg$ -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " " + $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + "\" + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/installer/license/CLIENT_DATA/login.ins b/sample/32bit/installer/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit/installer/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit/installer/license/CLIENT_DATA/opsi-PN.ini b/sample/32bit/installer/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 41585d5..0000000 --- a/sample/32bit/installer/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,5 +0,0 @@ -[X86] - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit/installer/license/CLIENT_DATA/setup32.ins b/sample/32bit/installer/license/CLIENT_DATA/setup32.ins deleted file mode 100644 index dc4f738..0000000 --- a/sample/32bit/installer/license/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,231 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/installer/license/CLIENT_DATA/uninstall32.ins b/sample/32bit/installer/license/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index b012f35..0000000 --- a/sample/32bit/installer/license/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,73 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/32bit/installer/license/OPSI/changelog.txt b/sample/32bit/installer/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit/installer/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit/installer/license/OPSI/control b/sample/32bit/installer/license/OPSI/control deleted file mode 100644 index 12ec9ba..0000000 --- a/sample/32bit/installer/license/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: true -productClasses: -setupScript: setup32.ins -uninstallScript: uninstall32.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit/installer/license/OPSI/postinst b/sample/32bit/installer/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit/installer/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit/installer/license/OPSI/preinst b/sample/32bit/installer/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit/installer/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit/installer/license/builder-product.cfg b/sample/32bit/installer/license/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/32bit/installer/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit/installer/nolicense/CLIENT_DATA/delsub32.ins b/sample/32bit/installer/nolicense/CLIENT_DATA/delsub32.ins deleted file mode 100644 index b83987c..0000000 --- a/sample/32bit/installer/nolicense/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,115 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\" + $UninstallProg$ -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " " + $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + "\" + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/installer/nolicense/CLIENT_DATA/login.ins b/sample/32bit/installer/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit/installer/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/32bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 41585d5..0000000 --- a/sample/32bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,5 +0,0 @@ -[X86] - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit/installer/nolicense/CLIENT_DATA/setup32.ins b/sample/32bit/installer/nolicense/CLIENT_DATA/setup32.ins deleted file mode 100644 index df49a0b..0000000 --- a/sample/32bit/installer/nolicense/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,183 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " ..." - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/installer/nolicense/CLIENT_DATA/uninstall32.ins b/sample/32bit/installer/nolicense/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index c66d114..0000000 --- a/sample/32bit/installer/nolicense/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,50 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles32Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - diff --git a/sample/32bit/installer/nolicense/OPSI/changelog.txt b/sample/32bit/installer/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit/installer/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit/installer/nolicense/OPSI/control b/sample/32bit/installer/nolicense/OPSI/control deleted file mode 100644 index 48b5f43..0000000 --- a/sample/32bit/installer/nolicense/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup32.ins -uninstallScript: uninstall32.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit/installer/nolicense/OPSI/postinst b/sample/32bit/installer/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit/installer/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit/installer/nolicense/OPSI/preinst b/sample/32bit/installer/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit/installer/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit/installer/nolicense/Testing.txt b/sample/32bit/installer/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit/installer/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit/installer/nolicense/builder-product.cfg b/sample/32bit/installer/nolicense/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/32bit/installer/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit/installer/nolicense/builder-targets-cb.sh b/sample/32bit/installer/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit/installer/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit/msi/license/CLIENT_DATA/delsub32.ins b/sample/32bit/msi/license/CLIENT_DATA/delsub32.ins deleted file mode 100644 index 6f1e92a..0000000 --- a/sample/32bit/msi/license/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,95 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " " + $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/msi/license/CLIENT_DATA/login.ins b/sample/32bit/msi/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit/msi/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit/msi/license/CLIENT_DATA/opsi-PN.ini b/sample/32bit/msi/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit/msi/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit/msi/license/CLIENT_DATA/setup32.ins b/sample/32bit/msi/license/CLIENT_DATA/setup32.ins deleted file mode 100644 index 7bc742e..0000000 --- a/sample/32bit/msi/license/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,230 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/msi/license/CLIENT_DATA/uninstall32.ins b/sample/32bit/msi/license/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index 9ed754e..0000000 --- a/sample/32bit/msi/license/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,72 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/32bit/msi/license/OPSI/changelog.txt b/sample/32bit/msi/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit/msi/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit/msi/license/OPSI/control b/sample/32bit/msi/license/OPSI/control deleted file mode 100644 index 09da3a0..0000000 --- a/sample/32bit/msi/license/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: True -productClasses: -setupScript: setup32.ins -uninstallScript: uninstall32.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit/msi/license/OPSI/postinst b/sample/32bit/msi/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit/msi/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit/msi/license/OPSI/preinst b/sample/32bit/msi/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit/msi/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit/msi/license/Testing.txt b/sample/32bit/msi/license/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit/msi/license/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit/msi/license/builder-product.cfg b/sample/32bit/msi/license/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/32bit/msi/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit/msi/license/builder-targets-cb.sh b/sample/32bit/msi/license/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit/msi/license/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit/msi/nolicense/CLIENT_DATA/delsub32.ins b/sample/32bit/msi/nolicense/CLIENT_DATA/delsub32.ins deleted file mode 100644 index 6f1e92a..0000000 --- a/sample/32bit/msi/nolicense/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,95 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " " + $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/msi/nolicense/CLIENT_DATA/login.ins b/sample/32bit/msi/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit/msi/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/32bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit/msi/nolicense/CLIENT_DATA/setup32.ins b/sample/32bit/msi/nolicense/CLIENT_DATA/setup32.ins deleted file mode 100644 index 7f7d6e3..0000000 --- a/sample/32bit/msi/nolicense/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,182 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " ..." - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit/msi/nolicense/CLIENT_DATA/uninstall32.ins b/sample/32bit/msi/nolicense/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index 1adeaf6..0000000 --- a/sample/32bit/msi/nolicense/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,49 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles32Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - diff --git a/sample/32bit/msi/nolicense/OPSI/changelog.txt b/sample/32bit/msi/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit/msi/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit/msi/nolicense/OPSI/control b/sample/32bit/msi/nolicense/OPSI/control deleted file mode 100644 index 48b5f43..0000000 --- a/sample/32bit/msi/nolicense/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup32.ins -uninstallScript: uninstall32.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit/msi/nolicense/OPSI/postinst b/sample/32bit/msi/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit/msi/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit/msi/nolicense/OPSI/preinst b/sample/32bit/msi/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit/msi/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit/msi/nolicense/Testing.txt b/sample/32bit/msi/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit/msi/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit/msi/nolicense/builder-product.cfg b/sample/32bit/msi/nolicense/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/32bit/msi/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit/msi/nolicense/builder-targets-cb.sh b/sample/32bit/msi/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit/msi/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit64/installer/license/CLIENT_DATA/delsub3264.ins b/sample/32bit64/installer/license/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index 036ddbf..0000000 --- a/sample/32bit64/installer/license/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,179 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram32$ = $InstallDir32$ + "\" + $UninstallProg32$ -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" - -Set $UninstallProgram64$ = $InstallDir64$ + "\" + $UninstallProg64$ -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - if FileExists($IniFile32$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile32$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile32$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile32$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $UninstallProg32$ = GetValueFromInifile($IniFile32$,"X86","UninstallProg32","XXXXXXXX.exe") - Set $UninstallProgramOld32$ = $InstallDir32$ + "\" + $UninstallProg32$ - if FileExists($UninstallProgramOld32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_32 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - if FileExists($IniFile64$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile64$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile64$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile64$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $UninstallProgr64$ = GetValueFromInifile($IniFile64$,"X86_64","UninstallProg64","XXXXXXXX.exe") - Set $UninstallProgramOld64$ = $InstallDir64$ + "\" + $UninstallProg64$ - if FileExists($UninstallProgramOld64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_64 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_old_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_msi_old_64] -msiexec /x $MsiIdOld64$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/installer/license/CLIENT_DATA/login.ins b/sample/32bit64/installer/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit64/installer/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit64/installer/license/CLIENT_DATA/opsi-PN.ini b/sample/32bit64/installer/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit64/installer/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit64/installer/license/CLIENT_DATA/setup3264.ins b/sample/32bit64/installer/license/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 0c8ce73..0000000 --- a/sample/32bit64/installer/license/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,284 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -comment "License management is enabled and will be used" - -comment "Trying to get a license key" -Set $LicenseKey$ = demandLicenseKey ($LicensePool$) -; If there is an assignment of exactly one licensepool to the product the following call is possible: -; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use: -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - -DefVar $ServiceErrorClass$ -set $ServiceErrorClass$ = getLastServiceErrorClass -comment "Error class: " + $ServiceErrorClass$ - -if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" -else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif -endif - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/installer/license/CLIENT_DATA/uninstall3264.ins b/sample/32bit64/installer/license/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index e71f965..0000000 --- a/sample/32bit64/installer/license/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,84 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/32bit64/installer/license/OPSI/changelog.txt b/sample/32bit64/installer/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit64/installer/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit64/installer/license/OPSI/control b/sample/32bit64/installer/license/OPSI/control deleted file mode 100644 index 6b0cdfc..0000000 --- a/sample/32bit64/installer/license/OPSI/control +++ /dev/null @@ -1,39 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: True -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit64/installer/license/OPSI/postinst b/sample/32bit64/installer/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit64/installer/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit64/installer/license/OPSI/preinst b/sample/32bit64/installer/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit64/installer/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit64/installer/license/Testing.txt b/sample/32bit64/installer/license/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit64/installer/license/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit64/installer/license/builder-product.cfg b/sample/32bit64/installer/license/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/32bit64/installer/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit64/installer/license/builder-targets-cb.sh b/sample/32bit64/installer/license/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit64/installer/license/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit64/installer/nolicense/CLIENT_DATA/delsub3264.ins b/sample/32bit64/installer/nolicense/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index 6fb74cf..0000000 --- a/sample/32bit64/installer/nolicense/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,173 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram32$ = $InstallDir32$ + "\" + $UninstallProg32$ -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" - -Set $UninstallProgram64$ = $InstallDir64$ + "\" + $UninstallProg64$ -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - if FileExists($IniFile32$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile32$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile32$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile32$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $UninstallProg32$ = GetValueFromInifile($IniFile32$,"X86","UninstallProg32","XXXXXXXX.exe") - Set $UninstallProgramOld32$ = $InstallDir32$ + "\" + $UninstallProg32$ - if FileExists($UninstallProgramOld32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_32 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - if FileExists($IniFile64$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile64$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile64$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile64$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $UninstallProg64$ = GetValueFromInifile($IniFile64$,"X86_64","UninstallProg64","XXXXXXXX.exe") - Set $UninstallProgramOld64$ = $InstallDir64$ + "\" + $UninstallProg64$ - if FileExists($UninstallProgramOld64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_64 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_old_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/installer/nolicense/CLIENT_DATA/login.ins b/sample/32bit64/installer/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit64/installer/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit64/installer/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/32bit64/installer/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit64/installer/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit64/installer/nolicense/CLIENT_DATA/setup3264.ins b/sample/32bit64/installer/nolicense/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 766dcad..0000000 --- a/sample/32bit64/installer/nolicense/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,242 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/installer/nolicense/CLIENT_DATA/uninstall3264.ins b/sample/32bit64/installer/nolicense/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index b24987d..0000000 --- a/sample/32bit64/installer/nolicense/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,62 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProg32$ -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $UninstallProg64$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - diff --git a/sample/32bit64/installer/nolicense/OPSI/changelog.txt b/sample/32bit64/installer/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit64/installer/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit64/installer/nolicense/OPSI/control b/sample/32bit64/installer/nolicense/OPSI/control deleted file mode 100644 index d3f60e3..0000000 --- a/sample/32bit64/installer/nolicense/OPSI/control +++ /dev/null @@ -1,39 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit64/installer/nolicense/OPSI/postinst b/sample/32bit64/installer/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit64/installer/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit64/installer/nolicense/OPSI/preinst b/sample/32bit64/installer/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit64/installer/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit64/installer/nolicense/Testing.txt b/sample/32bit64/installer/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit64/installer/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit64/installer/nolicense/builder-product.cfg b/sample/32bit64/installer/nolicense/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/32bit64/installer/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit64/installer/nolicense/builder-targets-cb.sh b/sample/32bit64/installer/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit64/installer/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit64/msi/license/CLIENT_DATA/delsub3264.ins b/sample/32bit64/msi/license/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index c0fdcce..0000000 --- a/sample/32bit64/msi/license/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,137 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" - -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - if FileExists($IniFile32$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile32$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile32$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile32$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $MsiIdOld32$ = GetValueFromInifile($IniFile32$,"X86","MsiId32","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld32$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld32$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_32 - sub_check_exitcode - endif - endif - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "") - comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - if FileExists($IniFile64$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile64$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile64$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile64$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $MsiIdOld64$ = GetValueFromInifile($IniFile64$,"X86_64","MsiId64","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld64$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld64$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_64 - sub_check_exitcode - endif - endif - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "") - comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old_32] -msiexec /x $MsiIdOld32$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_32] -msiexec /x $MsiId32$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_msi_old_64] -msiexec /x $MsiIdOld64$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/msi/license/CLIENT_DATA/login.ins b/sample/32bit64/msi/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit64/msi/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit64/msi/license/CLIENT_DATA/opsi-PN.ini b/sample/32bit64/msi/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit64/msi/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit64/msi/license/CLIENT_DATA/setup3264.ins b/sample/32bit64/msi/license/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 7746cf1..0000000 --- a/sample/32bit64/msi/license/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,282 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " " + $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -comment "License management is enabled and will be used" - -comment "Trying to get a license key" -Set $LicenseKey$ = demandLicenseKey ($LicensePool$) -; If there is an assignment of exactly one licensepool to the product the following call is possible: -; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use: -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - -DefVar $ServiceErrorClass$ -set $ServiceErrorClass$ = getLastServiceErrorClass -comment "Error class: " + $ServiceErrorClass$ - -if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" -else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif -endif - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/msi/license/CLIENT_DATA/uninstall3264.ins b/sample/32bit64/msi/license/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index 30c17d9..0000000 --- a/sample/32bit64/msi/license/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,82 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/32bit64/msi/license/OPSI/changelog.txt b/sample/32bit64/msi/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit64/msi/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit64/msi/license/OPSI/control b/sample/32bit64/msi/license/OPSI/control deleted file mode 100644 index 6b0cdfc..0000000 --- a/sample/32bit64/msi/license/OPSI/control +++ /dev/null @@ -1,39 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: True -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit64/msi/license/OPSI/postinst b/sample/32bit64/msi/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit64/msi/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit64/msi/license/OPSI/preinst b/sample/32bit64/msi/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit64/msi/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit64/msi/license/Testing.txt b/sample/32bit64/msi/license/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit64/msi/license/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit64/msi/license/builder-product.cfg b/sample/32bit64/msi/license/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/32bit64/msi/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit64/msi/license/builder-targets-cb.sh b/sample/32bit64/msi/license/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit64/msi/license/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit64/msi/nolicense/CLIENT_DATA/delsub3264.ins b/sample/32bit64/msi/nolicense/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index c0fdcce..0000000 --- a/sample/32bit64/msi/nolicense/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,137 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" - -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - if FileExists($IniFile32$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile32$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile32$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile32$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $MsiIdOld32$ = GetValueFromInifile($IniFile32$,"X86","MsiId32","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld32$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld32$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_32 - sub_check_exitcode - endif - endif - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "") - comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - if FileExists($IniFile64$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile64$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile64$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile64$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $MsiIdOld64$ = GetValueFromInifile($IniFile64$,"X86_64","MsiId64","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld64$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld64$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_64 - sub_check_exitcode - endif - endif - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "") - comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old_32] -msiexec /x $MsiIdOld32$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_32] -msiexec /x $MsiId32$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_msi_old_64] -msiexec /x $MsiIdOld64$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/msi/nolicense/CLIENT_DATA/login.ins b/sample/32bit64/msi/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/32bit64/msi/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/32bit64/msi/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/32bit64/msi/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/32bit64/msi/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/32bit64/msi/nolicense/CLIENT_DATA/setup3264.ins b/sample/32bit64/msi/nolicense/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 42e565d..0000000 --- a/sample/32bit64/msi/nolicense/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,240 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " " + $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/32bit64/msi/nolicense/CLIENT_DATA/uninstall3264.ins b/sample/32bit64/msi/nolicense/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index dc7df0b..0000000 --- a/sample/32bit64/msi/nolicense/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,58 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - diff --git a/sample/32bit64/msi/nolicense/OPSI/changelog.txt b/sample/32bit64/msi/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/32bit64/msi/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/32bit64/msi/nolicense/OPSI/control b/sample/32bit64/msi/nolicense/OPSI/control deleted file mode 100644 index d3f60e3..0000000 --- a/sample/32bit64/msi/nolicense/OPSI/control +++ /dev/null @@ -1,39 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/32bit64/msi/nolicense/OPSI/postinst b/sample/32bit64/msi/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/32bit64/msi/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/32bit64/msi/nolicense/OPSI/preinst b/sample/32bit64/msi/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/32bit64/msi/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/32bit64/msi/nolicense/Testing.txt b/sample/32bit64/msi/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/32bit64/msi/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/32bit64/msi/nolicense/builder-product.cfg b/sample/32bit64/msi/nolicense/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/32bit64/msi/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/32bit64/msi/nolicense/builder-targets-cb.sh b/sample/32bit64/msi/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/32bit64/msi/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/64bit/installer/license/CLIENT_DATA/delsub64.ins b/sample/64bit/installer/license/CLIENT_DATA/delsub64.ins deleted file mode 100644 index 8091e14..0000000 --- a/sample/64bit/installer/license/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,114 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\" + $UninstallProg$ -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + "\" + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/installer/license/CLIENT_DATA/login.ins b/sample/64bit/installer/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/64bit/installer/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/64bit/installer/license/CLIENT_DATA/opsi-PN.ini b/sample/64bit/installer/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/64bit/installer/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/64bit/installer/license/CLIENT_DATA/setup64.ins b/sample/64bit/installer/license/CLIENT_DATA/setup64.ins deleted file mode 100644 index 8c40345..0000000 --- a/sample/64bit/installer/license/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,231 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/installer/license/CLIENT_DATA/uninstall64.ins b/sample/64bit/installer/license/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index e5e5bba..0000000 --- a/sample/64bit/installer/license/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,74 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/64bit/installer/license/OPSI/changelog.txt b/sample/64bit/installer/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/64bit/installer/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/64bit/installer/license/OPSI/control b/sample/64bit/installer/license/OPSI/control deleted file mode 100644 index f203124..0000000 --- a/sample/64bit/installer/license/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: True -productClasses: -setupScript: setup64.ins -uninstallScript: uninstall64.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/64bit/installer/license/OPSI/postinst b/sample/64bit/installer/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/64bit/installer/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/64bit/installer/license/OPSI/preinst b/sample/64bit/installer/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/64bit/installer/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/64bit/installer/license/Testing.txt b/sample/64bit/installer/license/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/64bit/installer/license/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/64bit/installer/license/builder-product.cfg b/sample/64bit/installer/license/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/64bit/installer/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/64bit/installer/license/builder-targets-cb.sh b/sample/64bit/installer/license/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/64bit/installer/license/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/64bit/installer/nolicense/CLIENT_DATA/delsub64.ins b/sample/64bit/installer/nolicense/CLIENT_DATA/delsub64.ins deleted file mode 100644 index 8091e14..0000000 --- a/sample/64bit/installer/nolicense/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,114 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\" + $UninstallProg$ -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + "\" + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/installer/nolicense/CLIENT_DATA/login.ins b/sample/64bit/installer/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/64bit/installer/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/64bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/64bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/64bit/installer/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/64bit/installer/nolicense/CLIENT_DATA/setup64.ins b/sample/64bit/installer/nolicense/CLIENT_DATA/setup64.ins deleted file mode 100644 index 79674d2..0000000 --- a/sample/64bit/installer/nolicense/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,183 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/installer/nolicense/CLIENT_DATA/uninstall64.ins b/sample/64bit/installer/nolicense/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index aa1b813..0000000 --- a/sample/64bit/installer/nolicense/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,50 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - diff --git a/sample/64bit/installer/nolicense/OPSI/changelog.txt b/sample/64bit/installer/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/64bit/installer/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/64bit/installer/nolicense/OPSI/control b/sample/64bit/installer/nolicense/OPSI/control deleted file mode 100644 index 847dbe0..0000000 --- a/sample/64bit/installer/nolicense/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup64.ins -uninstallScript: uninstall64.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/64bit/installer/nolicense/OPSI/postinst b/sample/64bit/installer/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/64bit/installer/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/64bit/installer/nolicense/OPSI/preinst b/sample/64bit/installer/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/64bit/installer/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/64bit/installer/nolicense/Testing.txt b/sample/64bit/installer/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/64bit/installer/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/64bit/installer/nolicense/builder-product.cfg b/sample/64bit/installer/nolicense/builder-product.cfg deleted file mode 100644 index f10115d..0000000 --- a/sample/64bit/installer/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one UninstallProg - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="UninstallProg" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 UninstallProg's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="UninstallProg32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="UninstallProg64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/64bit/installer/nolicense/builder-targets-cb.sh b/sample/64bit/installer/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/64bit/installer/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/64bit/msi/license/CLIENT_DATA/delsub64.ins b/sample/64bit/msi/license/CLIENT_DATA/delsub64.ins deleted file mode 100644 index c7db77f..0000000 --- a/sample/64bit/msi/license/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,95 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86_64","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/msi/license/CLIENT_DATA/login.ins b/sample/64bit/msi/license/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/64bit/msi/license/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/64bit/msi/license/CLIENT_DATA/opsi-PN.ini b/sample/64bit/msi/license/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/64bit/msi/license/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/64bit/msi/license/CLIENT_DATA/setup64.ins b/sample/64bit/msi/license/CLIENT_DATA/setup64.ins deleted file mode 100644 index e78e1ff..0000000 --- a/sample/64bit/msi/license/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,230 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/msi/license/CLIENT_DATA/uninstall64.ins b/sample/64bit/msi/license/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index 62eb53d..0000000 --- a/sample/64bit/msi/license/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,73 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/64bit/msi/license/OPSI/changelog.txt b/sample/64bit/msi/license/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/64bit/msi/license/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/64bit/msi/license/OPSI/control b/sample/64bit/msi/license/OPSI/control deleted file mode 100644 index f203124..0000000 --- a/sample/64bit/msi/license/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: True -productClasses: -setupScript: setup64.ins -uninstallScript: uninstall64.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/64bit/msi/license/OPSI/postinst b/sample/64bit/msi/license/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/64bit/msi/license/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/64bit/msi/license/OPSI/preinst b/sample/64bit/msi/license/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/64bit/msi/license/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/64bit/msi/license/Testing.txt b/sample/64bit/msi/license/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/64bit/msi/license/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/64bit/msi/license/builder-product.cfg b/sample/64bit/msi/license/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/64bit/msi/license/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/64bit/msi/license/builder-targets-cb.sh b/sample/64bit/msi/license/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/64bit/msi/license/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/64bit/msi/nolicense/CLIENT_DATA/delsub64.ins b/sample/64bit/msi/nolicense/CLIENT_DATA/delsub64.ins deleted file mode 100644 index c7db77f..0000000 --- a/sample/64bit/msi/nolicense/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,95 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86_64","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/msi/nolicense/CLIENT_DATA/login.ins b/sample/64bit/msi/nolicense/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/64bit/msi/nolicense/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/64bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini b/sample/64bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/64bit/msi/nolicense/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/64bit/msi/nolicense/CLIENT_DATA/setup64.ins b/sample/64bit/msi/nolicense/CLIENT_DATA/setup64.ins deleted file mode 100644 index 14e3591..0000000 --- a/sample/64bit/msi/nolicense/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,182 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/64bit/msi/nolicense/CLIENT_DATA/uninstall64.ins b/sample/64bit/msi/nolicense/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index bd43c20..0000000 --- a/sample/64bit/msi/nolicense/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,51 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - diff --git a/sample/64bit/msi/nolicense/OPSI/changelog.txt b/sample/64bit/msi/nolicense/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/64bit/msi/nolicense/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/64bit/msi/nolicense/OPSI/control b/sample/64bit/msi/nolicense/OPSI/control deleted file mode 100644 index 847dbe0..0000000 --- a/sample/64bit/msi/nolicense/OPSI/control +++ /dev/null @@ -1,30 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup64.ins -uninstallScript: uninstall64.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/64bit/msi/nolicense/OPSI/postinst b/sample/64bit/msi/nolicense/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/64bit/msi/nolicense/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/64bit/msi/nolicense/OPSI/preinst b/sample/64bit/msi/nolicense/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/64bit/msi/nolicense/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/64bit/msi/nolicense/Testing.txt b/sample/64bit/msi/nolicense/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/64bit/msi/nolicense/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/64bit/msi/nolicense/builder-product.cfg b/sample/64bit/msi/nolicense/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/64bit/msi/nolicense/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/64bit/msi/nolicense/builder-targets-cb.sh b/sample/64bit/msi/nolicense/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/64bit/msi/nolicense/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/All/CLIENT_DATA/delsub32.ins b/sample/All/CLIENT_DATA/delsub32.ins deleted file mode 100644 index 4857753..0000000 --- a/sample/All/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,135 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " " + $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/delsub3264.ins b/sample/All/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index a581c36..0000000 --- a/sample/All/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,216 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram32$ = $InstallDir32$ + "\uninstall.exe" -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" - -Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe" -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - if FileExists($IniFile32$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile32$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile32$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile32$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $UninstallProg32$ = GetValueFromInifile($IniFile$,"X86","UninstallProg32","XXXXXXXX.exe") - Set $UninstallProgramOld32$ = $InstallDir32$ + "\" + $UninstallProg32$ - if FileExists($UninstallProgramOld32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_32 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_32 - sub_check_exitcode - endif - - if FileExists($IniFile32$) - Set $MsiIdOld32$ = GetValueFromInifile($IniFile32$,"X86","MsiId32","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld32$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld32$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_32 - sub_check_exitcode - endif - endif - - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "") - comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - if FileExists($IniFile64$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile64$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile64$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile64$,"COMMON","RELEASE","") - endif - Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $UninstallProg64$ = GetValueFromInifile($IniFile$,"X86_64","UninstallProg64","XXXXXXXX.exe") - Set $UninstallProgramOld64$ = $InstallDir64$ + "\" + $UninstallProg64$ - if FileExists($UninstallProgramOld64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old_64 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_64 - sub_check_exitcode - endif - - if FileExists($IniFile64$) - Set $MsiIdOld64$ = GetValueFromInifile($IniFile64$,"X86_64","MsiId64","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld64$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld64$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_64 - sub_check_exitcode - endif - endif - - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "") - comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi_old_32] -msiexec /x $MsiIdOld32$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_32] -msiexec /x $MsiId32$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_old_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall_msi_old_64] -msiexec /x $MsiIdOld64$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/delsub64.ins b/sample/All/CLIENT_DATA/delsub64.ins deleted file mode 100644 index 2a521a5..0000000 --- a/sample/All/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,134 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -if FileExists($IniFile$) - Set $OLD_VERSION$ = GetValueFromInifile($IniFile$,"COMMON","VERSION","") - Set $OLD_CREATOR_TAG$ = GetValueFromInifile($IniFile$,"COMMON","CREATOR_TAG","") - Set $OLD_RELEASE$ = GetValueFromInifile($IniFile$,"COMMON","RELEASE","") -endif -Message "Uninstalling " + $ProductId$ + " "+ $OLD_VERSION$ + "-" + $OLD_CREATOR_TAG$ + $OLD_RELEASE$ + " ..." - -if FileExists($IniFile$) - Set $UninstallProg$ = GetValueFromInifile($IniFile$,"X86","UninstallProg","XXXXXXXX.exe") - Set $UninstallProgramOld$ = $InstallDir$ + "\" + $UninstallProg$ - if FileExists($UninstallProgramOld$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86_64","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_old] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgramOld$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgramOld$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/login.ins b/sample/All/CLIENT_DATA/login.ins deleted file mode 100644 index 7b85744..0000000 --- a/sample/All/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/All/CLIENT_DATA/opsi-PN.ini b/sample/All/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/All/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/All/CLIENT_DATA/setup32.ins b/sample/All/CLIENT_DATA/setup32.ins deleted file mode 100644 index a9afa4c..0000000 --- a/sample/All/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,232 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/setup3264.ins b/sample/All/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 0b41e43..0000000 --- a/sample/All/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,286 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " "+ $VERSION$ + "-" + $CREATOR_TAG$ + $RELEASE$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -comment "License management is enabled and will be used" - -comment "Trying to get a license key" -Set $LicenseKey$ = demandLicenseKey ($LicensePool$) -; If there is an assignment of exactly one licensepool to the product the following call is possible: -; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use: -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - -DefVar $ServiceErrorClass$ -set $ServiceErrorClass$ = getLastServiceErrorClass -comment "Error class: " + $ServiceErrorClass$ - -if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" -else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif -endif - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/setup64.ins b/sample/All/CLIENT_DATA/setup64.ins deleted file mode 100644 index e3172b4..0000000 --- a/sample/All/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,232 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/All/CLIENT_DATA/uninstall32.ins b/sample/All/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index c040138..0000000 --- a/sample/All/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,74 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/All/CLIENT_DATA/uninstall3264.ins b/sample/All/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index b575698..0000000 --- a/sample/All/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,86 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld32$ -DefVar $UninstallProgram32$ -DefVar $UninstallProgramOld32$ -DefVar $IniFile32$ -DefVar $MsiIdOld64$ -DefVar $UninstallProgram64$ -DefVar $UninstallProgramOld64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/All/CLIENT_DATA/uninstall64.ins b/sample/All/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index d81dd62..0000000 --- a/sample/All/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,75 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $UninstallProgramOld$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $OLD_VERSION$ -DefVar $OLD_CREATOR_TAG$ -DefVar $OLD_RELEASE$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $NAME$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/All/OPSI/changelog.txt b/sample/All/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/All/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/All/OPSI/control b/sample/All/OPSI/control deleted file mode 100644 index d3f60e3..0000000 --- a/sample/All/OPSI/control +++ /dev/null @@ -1,39 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: sereby.aio -requiredStatus: installed -requirementType: before - - diff --git a/sample/All/OPSI/postinst b/sample/All/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/All/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/All/OPSI/preinst b/sample/All/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/All/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/All/Testing.txt b/sample/All/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/All/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/All/builder-product.cfg b/sample/All/builder-product.cfg deleted file mode 100644 index c8f35f6..0000000 --- a/sample/All/builder-product.cfg +++ /dev/null @@ -1,150 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -NAME="7-Zip" -DESCRIPTION="7-Zip is a file archiver with a high compression ratio." -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTRACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - -######################### -# Setup required OPSI_INI variables -# which will be injected to the opsi-PN.ini files -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# OR - -OPSI_INI_SECTION[0]="X86_64" -OPSI_INI_OPTION[0]="MsiId" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -OPSI_INI_SECTION[0]="X86" -OPSI_INI_OPTION[0]="MsiId32" -OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# AND - -OPSI_INI_SECTION[1]="X86_64" -OPSI_INI_OPTION[1]="MsiId64" -OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - diff --git a/sample/All/builder-targets-cb.sh b/sample/All/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/All/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/32bit/installer/license/Testing.txt b/sample/Testing.txt similarity index 100% rename from sample/32bit/installer/license/Testing.txt rename to sample/Testing.txt diff --git a/sample/builder-product.cfg b/sample/builder-product.cfg index d816336..c8f35f6 100644 --- a/sample/builder-product.cfg +++ b/sample/builder-product.cfg @@ -1,36 +1,150 @@ ############################ # Setup product information ############################ -VENDOR="softmaker.de" -PN="pmviewer" -NAME="PlanMaker Viewer" -DESCRIPTION="PlanMaker Viewer 2010" -VERSION="2010.rev633" -RELEASE="10" +VENDOR="itwatch.de" +PN="itwatch" +NAME="7-Zip" +DESCRIPTION="7-Zip is a file archiver with a high compression ratio." +VERSION="4.10.19" +RELEASE="3" PRIORITY="0" ADVICE="" -TYPE="restricted" +# TYPE - defines, if the install files are public or restricted. +# Valid value: restricted | public +TYPE="public" -##################### -# File object array -##################### +################# +# Downloader (DL) object array +################ +# +# To build the opsi-packet, some files are needed. The files are defined by a file object. +# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together +# using a file index. +# +# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared +# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] +# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} +# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory +# +# - Filename +# Filename used inside the builder and opsi package +# Mandatory parameter. +# DL_FILE[index]="cool-stuff.exe" +# +# - Source URL +# The source URL to download the file from. Multiple URLs are separted by a ";" or "," +# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically +# Therefore, you download the non-public programs to your local/privagte repository. +# You can use variable like $PN or $Version inside the URLs +# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" +# +# - Architecture +# Definition of the architecture to separate different files. This will be used in +# the file structure inside the opsi-package. Also, you can use it in your repos-URL's +# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. +# If it's a file for all architecture, the variable have not to be set. +# Optional parameter. Default value: +# Valid values: , "X86", "X86_64" +# DL_ARCH[index]="X86" +# +# - WINST variable: +# You can access the file (included in the opsi-package) using WINST script language. +# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" +# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: +# Optional parameter. Default value: , +# DL_WINST_NAME[index]=itWESS +# +# - Compression format +# If the retrieved file is compressed, the compression format is specified to +# extract it. If the parameter is not set, no extraction happens +# Optional parameter. Valid values: unzip, 7zip. Default value: . +# DL_EXTRACT_FORMAT="zip" +# +# - Extraction directory for compressed files +# This Variable only works in combination with INSTALL and forces the extraction +# to be done into the specified directory. +# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. +# This feature is mostly needed if a package includes more setup programms that are nemed the +# same. This way you place the setups into diffent dirs +# Optional parameter. Default value: +# DL_EXTRACT_TO[index]="office" +# +# - Specify Downloader +# Defines the downloader to use to retrieve the SOURCE file +# Optional parameter. Valid values: wget|plowdown. Default value: wget +# + +DL_FILE[0]="itWatchLogo.jpg" +DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" -DL_FILE[0]="SoftMaker-Logo.png" -DL_SOURCE[0]="http://www.android-user.de/var/ezflow_site/storage/images/artikel/exklusiv-vorschau-auf-softmaker-office-fuer-android/softmaker-logo.png/25888-1-ger-DE/SoftMaker-Logo.png.png" - -DL_FILE[1]="PlanMakerViewer2010.msi" -DL_SOURCE[1]="http://internal.graz.disconnected-by-peer.at/Orig/SoftMaker/Viewer/HB/2010/PlanMakerViewer2010.msi" +DL_FILE[1]="itWESS-Client_German.msi" +DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" DL_ARCH[1]="X86" -DL_WINST_NAME[1]="InstallMsi" +DL_WINST_NAME[1]=itWESS + +DL_FILE[2]="itWESS-64bit_German.msi" +DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" +DL_ARCH[2]="X86_64" +DL_WINST_NAME[2]=itWESS64 + +DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" +DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" +DL_ARCH[3]="X86" +DL_DOWNLOADER[3]="wget" +DL_EXTRACT_FORMAT[3]="unzip" +DL_EXTRACT_TO[3]="office" # File array index for the image showing while installing the program ICON_DL_INDEX=0 +######################### +# Setup additional, custom WINST variables +# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) +# +# The following tokens inside the WINST_VALUE will be replaced dynamically +# +# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. +# Sample: +# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" +# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" +# +######################### +WINST_NAME[0]="InstallExe" +WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" + +WINST_NAME[1]="MyVar" +WINST_VALUE[1]="My content" + +######################### +# Setup required OPSI_INI variables +# which will be injected to the opsi-PN.ini files +# +# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly +# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! +# +######################### +# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId + OPSI_INI_SECTION[0]="X86" OPSI_INI_OPTION[0]="MsiId" OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" -OPSI_INI_SECTION[1]="Ignore" -OPSI_INI_OPTION[1]="OEMRegisterSkip" -OPSI_INI_VALUE[1]="-1" +# OR + +OPSI_INI_SECTION[0]="X86_64" +OPSI_INI_OPTION[0]="MsiId" +OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" + +# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's + +OPSI_INI_SECTION[0]="X86" +OPSI_INI_OPTION[0]="MsiId32" +OPSI_INI_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" + +# AND + +OPSI_INI_SECTION[1]="X86_64" +OPSI_INI_OPTION[1]="MsiId64" +OPSI_INI_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" + diff --git a/sample/32bit/installer/license/builder-targets-cb.sh b/sample/builder-targets-cb.sh similarity index 100% rename from sample/32bit/installer/license/builder-targets-cb.sh rename to sample/builder-targets-cb.sh diff --git a/sample/control b/sample/control deleted file mode 100644 index 2e70418..0000000 --- a/sample/control +++ /dev/null @@ -1,23 +0,0 @@ -[Package] -version: RELEASE -depends: -incremental: False - -[Product] -type: localboot -id: pmviewer -name: PlanMaker Viewer -description: PlanMaker Viewer 2010 -advice: ADVICE -version: VERSION -priority: PRIORITY -licenseRequired: False -productClasses: -setupScript: setup32.ins -uninstallScript: uninstall32.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - diff --git a/sample/old/CLIENT_DATA/delsub32.ins b/sample/old/CLIENT_DATA/delsub32.ins deleted file mode 100644 index 0f955e8..0000000 --- a/sample/old/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,106 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES - - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/delsub3264.ins b/sample/old/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index c3f7f1d..0000000 --- a/sample/old/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,163 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - - -Set $UninstallProgram32$ = $InstallDir32$ + "\uninstall.exe" -Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe" -Set $IniFile32$ = $InstallDir32$ + "\opsi-" + $ProductId$ + ".ini" -Set $IniFile64$ = $InstallDir64$ + "\opsi-" + $ProductId$ + ".ini" - - - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Uninstalling " + $ProductId$ + " 32 Bit..." - - if FileExists($IniFile32$) - Set $MsiIdOld32$ = GetValueFromInifile($IniFile32$,"X86","MsiId32","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld32$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld32$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_32 - sub_check_exitcode - endif - endif - - if FileExists($UninstallProgram32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_32 - sub_check_exitcode - endif - - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "") - comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Uninstalling " + $ProductId$ + " 64 Bit..." - - if FileExists($IniFile64$) - Set $MsiIdOld64$ = GetValueFromInifile($IniFile64$,"X86_64","MsiId64","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld64$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld64$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old_64 - sub_check_exitcode - endif - endif - if FileExists($UninstallProgram64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_64 - sub_check_exitcode - endif - - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "") - comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; "$UninstallProgram32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram32$" /silent /norestart /SUPPRESSMSGBOXES - - -[Winbatch_uninstall_msi_old_32] -msiexec /x $MsiIdOld32$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_32] -msiexec /x $MsiId32$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; "$UninstallProgram64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram64$" /silent /norestart /SUPPRESSMSGBOXES - - -[Winbatch_uninstall_msi_old_64] -msiexec /x $MsiIdOld64$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/delsub64.ins b/sample/old/CLIENT_DATA/delsub64.ins deleted file mode 100644 index 894f772..0000000 --- a/sample/old/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,106 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - - -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" -Set $IniFile$ = $InstallDir$ + "\opsi-" + $ProductId$ + ".ini" - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists($IniFile$) - Set $MsiIdOld$ = GetValueFromInifile($IniFile$,"X86_64","MsiId","{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}") - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiIdOld$ + "] DisplayName") = "") - comment "Old MSI id " + $MsiIdOld$ + " found in registry, starting msiexec to uninstall old version" - Winbatch_uninstall_msi_old - sub_check_exitcode - endif -endif -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif -if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES - - -[Winbatch_uninstall_msi_old] -msiexec /x $MsiIdOld$ /qb! REBOOT=ReallySuppress - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/opsi-PN.ini b/sample/old/CLIENT_DATA/opsi-PN.ini deleted file mode 100644 index 978f02e..0000000 --- a/sample/old/CLIENT_DATA/opsi-PN.ini +++ /dev/null @@ -1,11 +0,0 @@ -[X86] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId32={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[X86_64] -MsiId={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} -MsiId64={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} - -[COMMON] -PN=name -VERSION=version diff --git a/sample/old/CLIENT_DATA/setup32.ins b/sample/old/CLIENT_DATA/setup32.ins deleted file mode 100644 index 43d4214..0000000 --- a/sample/old/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,236 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId$ -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - - comment "Test for installation success" - ; Test if software marked as installed in registry - ; if (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}] DisplayName") = "") - ; logError "Fatal: After Installation 32 bit [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}] not found" - ; isFatalError - ; else - ; comment "Successful Installation" - ; endif - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=2 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /SUPPRESSMSGBOXES - -[Files_install] -; copy the ini file to the InstallDir -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/setup3264.ins b/sample/old/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 6c9d30e..0000000 --- a/sample/old/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,278 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId32$ -DefVar $MsiIdOld32$ -DefVar $UninstallProgram32$ -DefVar $IniFile32$ -; DefVar $MsiId64$ -DefVar $MsiIdOld64$ -DefVar $UninstallProgram64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " 32 Bit..." - comment "Start setup program" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " 64 Bit..." - comment "Start setup program" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=2 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /SUPPRESSMSGBOXES - -[Files_install_32] -copy "$IniCfgFile$" "$InstallDir32$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=2 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /SUPPRESSMSGBOXES - -[Files_install_64] -copy "$IniCfgFile$" "$InstallDir64$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -comment "License management is enabled and will be used" - -comment "Trying to get a license key" -Set $LicenseKey$ = demandLicenseKey ($LicensePool$) -; If there is an assignment of exactly one licensepool to the product the following call is possible: -; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use: -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - -DefVar $ServiceErrorClass$ -set $ServiceErrorClass$ = getLastServiceErrorClass -comment "Error class: " + $ServiceErrorClass$ - -if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" -else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif -endif - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/setup64.ins b/sample/old/CLIENT_DATA/setup64.ins deleted file mode 100644 index d4ebde1..0000000 --- a/sample/old/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,234 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $IniCfgFile$ = "%ScriptPath%\opsi-" + $ProductId$ + ".ini" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - - comment "Test for installation success" - ; Test if software marked as installed in registry - ; if (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}] DisplayName") = "") - ; logError "Fatal: After Installation 64 Bit [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}] not found" - ; isFatalError - ; else - ; comment "Successful Installation" - ; endif - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=2 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /SUPPRESSMSGBOXES - -[Files_install] -copy "$IniCfgFile$" "$InstallDir$" - -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/old/CLIENT_DATA/uninstall32.ins b/sample/old/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index 97e01be..0000000 --- a/sample/old/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,71 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId$ -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/old/CLIENT_DATA/uninstall3264.ins b/sample/old/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index 2396024..0000000 --- a/sample/old/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,84 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId32$ -DefVar $MsiIdOld32$ -DefVar $UninstallProgram32$ -DefVar $IniFile32$ -; DefVar $MsiId64$ -DefVar $MsiIdOld64$ -DefVar $UninstallProgram64$ -DefVar $IniFile64$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/old/CLIENT_DATA/uninstall64.ins b/sample/old/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index e64e576..0000000 --- a/sample/old/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,72 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Actions] -requiredWinstVersion >= "4.10.8.6" - -; DefVar $MsiId$ -DefVar $MsiIdOld$ -DefVar $UninstallProgram$ -DefVar $IniFile$ -DefVar $IniCfgFile$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; The token BUILDER_VARIABLES will be replaced by opsi-builder.sh -; and adds the following variables: -; from builder-product.cfg : all variables definded by attribute WINST[index] -; from builder-product.cfg : VENDOR PN VERSION RELEASE PRIORITY ADVICE TYPE -; from opsi-builder.cfg : CREATOR_TAG CREATOR_NAME CREATOR_EMAIL -; auto generated winst-variables -; $IconFile$: path to product picture -; -@@BUILDER_VARIABLES@@ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/old/OPSI/changelog.txt b/sample/old/OPSI/changelog.txt deleted file mode 100644 index bc69317..0000000 --- a/sample/old/OPSI/changelog.txt +++ /dev/null @@ -1,2 +0,0 @@ -Don't add cahngelog entries here! -It get autogenerated by the opsi-builder.sh \ No newline at end of file diff --git a/sample/old/OPSI/control b/sample/old/OPSI/control deleted file mode 100644 index 07678c7..0000000 --- a/sample/old/OPSI/control +++ /dev/null @@ -1,37 +0,0 @@ -[Package] -version: RELEASE -depends: -incremental: False - -[Product] -type: localboot -id: !!!plz change!!! -name: !!!plz change!!! -description: !!!plz change!!! -advice: ADVICE -version: VERSION -priority: PRIORITY -licenseRequired: False -productClasses: -setupScript: !!!plz change!!! -uninstallScript: !!!plz change!!! -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[ProductDependency] -action: setup -requiredProduct: aio -requiredStatus: installed -requirementType: before diff --git a/sample/old/OPSI/postinst b/sample/old/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/old/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/old/OPSI/preinst b/sample/old/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/old/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# diff --git a/sample/old/Testing.txt b/sample/old/Testing.txt deleted file mode 100644 index d6b5e6c..0000000 --- a/sample/old/Testing.txt +++ /dev/null @@ -1,28 +0,0 @@ -*** Qualitiymanagement/Testing procedure - -- Product: - - Name: productname - - Version: xxx - - Release: yyyy - -- Environment - - OS: Native windows XP-32Bit installation - - Preinstalled packages: None (also no aio) - - Files used while testing: - File1: http://domain.de/file.ext - -- Testing process: - OPSI-action: - - Installation (without dependencies like AIO/Firefox): ?? - Result: - - File extensions related to program: ?? - - Start menu entry: ?? - - Starting/using program: viewer works, File1 is shown correctly: ?? - - OPSI-action: - - Uninstall - Result: - - File extensions related to program: unrelated: ?? - - Start menu entry: none: ?? - - diff --git a/sample/old/builder-product.cfg b/sample/old/builder-product.cfg deleted file mode 100644 index 1e9ff4f..0000000 --- a/sample/old/builder-product.cfg +++ /dev/null @@ -1,153 +0,0 @@ -############################ -# Setup product information -############################ -VENDOR="itwatch.de" -PN="itwatch" -VERSION="4.10.19" -RELEASE="3" -PRIORITY="0" -ADVICE="" - -# TYPE - defines, if the install files are public or restricted. -# Valid value: restricted | public -TYPE="public" - -# EXTRACTWITH - defines the used programm for decompression -# Valid values: 7zip | unzip -# Default value: 7zip -# This Value is only usefull in combinnation with Variable INSTALL[INDEX] -# EXTRACTWITH="7zip" - -# Begin Not Implemented --- -# DOWNLOADWITH - defines the used programm for download -# Valid values: wget | plowdown -# Default value: wget -# DOWNLOADWITH="wget" -# End Not Implemented --- - - -################# -# Downloader (DL) object array -################ -# -# To build the opsi-packet, some files are needed. The files are defined by a file object. -# A file object contains different attributes. All attributes (FILE, SOURCE, ..) are binded together -# using a file index. -# -# Target "prepare" : Working directory INST_DIR and OUTPUT_DIR are prepared -# Target "retrieve" : the files are downloaded to the the caching storage ${DIST_CACHE_DIR}/$DL_ARCH[i]/$DL_FILE[i] -# Target "create" : the files are extrated/copied to ${INST_DIR}/CLIENT_DATA/${DL_ARCH[$i]} -# Target "package" : opsi-makeproductfile is called processing ${INST_DIR} directory -# -# - Filename -# Filename used inside the builder and opsi package -# Mandatory parameter. -# DL_FILE[index]="cool-stuff.exe" -# -# - Source URL -# The source URL to download the file from. Multiple URLs are separted by a ";" or "," -# The $DIST_PRIVATE_REPOS variable will be added as the first URL automatically -# Therefore, you download the non-public programs to your local/privagte repository. -# You can use variable like $PN or $Version inside the URLs -# DL_SOURCE[index]="http://cool-stuff.de/download/cool-stuff_1.001.exe;http://mirro5.cool-stuff.at/$PN_$VERSION.exe" -# -# - Architecture -# Definition of the architecture to separate different files. This will be used in -# the file structure inside the opsi-package. Also, you can use it in your repos-URL's -# or filenames (OPSI_REPOS_FILE_PATTERN, OPSI_REPOS_PRODUCT_DIR) to structure the repos. -# If it's a file for all architecture, the variable have not to be set. -# Optional parameter. Default value: -# Valid values: , "X86", "X86_64" -# DL_ARCH[index]="X86" -# -# - WINST variable: -# You can access the file (included in the opsi-package) using WINST script language. -# The target "package" will replace all occurence of the string "@@BUILDER_VARIABLES@@" -# by pairs of "DefVar/Set"-commands, if the WINST attribute is set. Default value: -# Optional parameter. Default value: , -# DL_WINST_NAME[index]=itWESS -# -# - Compression format -# If the retrieved file is compressed, the compression format is specified to -# extract it. If the parameter is not set, no extraction happens -# Optional parameter. Valid values: unzip, 7zip. Default value: . -# DL_EXTRACT_FORMAT="zip" -# -# - Extraction directory for compressed files -# This Variable only works in combination with INSTALL and forces the extraction -# to be done into the specified directory. -# This will result in the files to be extracted to ${OUTPUT_DIR}/${DL_ARCH}/${DL_EXTRACT_TO}. -# This feature is mostly needed if a package includes more setup programms that are nemed the -# same. This way you place the setups into diffent dirs -# Optional parameter. Default value: -# DL_EXTRACT_TO[index]="office" -# -# - Specify Downloader -# Defines the downloader to use to retrieve the SOURCE file -# Optional parameter. Valid values: wget|plowdown. Default value: wget -# - -DL_FILE[0]="itWatchLogo.jpg" -DL_SOURCE[0]="http://www.itwatch.de/logos/itWatchLogo.jpg" - -DL_FILE[1]="itWESS-Client_German.msi" -DL_SOURCE[1]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-Client_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-Client_German.msi" -DL_ARCH[1]="X86" -DL_WINST_NAME[1]=itWESS - -DL_FILE[2]="itWESS-64bit_German.msi" -DL_SOURCE[2]="http://repos.dtnet.de/itwatch/itwatch/4.10.19/itWESS-64bit_German.msi;http://internal.graz.disconnected-by-peer.at/Orig/itWatch/itWESS/HB/4.10.19/itWESS-64bit_German.msi" -DL_ARCH[2]="X86_64" -DL_WINST_NAME[2]=itWESS64 - -DL_FILE[3]="AiO-Runtimes-x86-v1.7.1.7z" -DL_SOURCE[3]="http://ftp.computerbase.de/dl-758/weJMhoTGCTbFI5mzRnMlAg/1327825564/AiO-Runtimes-x86-v1.7.1.7z" -DL_ARCH[3]="X86" -DL_DOWNLOADER[3]="wget" -DL_EXTRACT_FORMAT[3]="unzip" -DL_EXTACT_TO[3]="office" - -# File array index for the image showing while installing the program -ICON_DL_INDEX=0 - -######################### -# Setup required WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# if your package is not msi based then you can remove the msi part from *.ins files and drop this variables compleatly -# !!! These Variables are requred if you remove them in this cfg file you will get error's about not defined Variables !!! -# -######################### -# if the packaga just supports X86 OR X86_64 (setupXX.ins delsubXX.ins uninstallXX.ins) then you have to just specify one MsiId - -WINST_NAME[0]="MsiId" -WINST_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -# if the package supports X86 AND X86_64 (setup3264.ins delsub3264.ins uninstall3264.ins) then you have to specify 2 MsiId's - -WINST_NAME[0]="MsiId32" -WINST_VALUE[0]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -WINST_NAME[1]="MsiId64" -WINST_VALUE[1]="{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}" - -######################### -# Setup additional, custom WINST variables -# which will be injected to the *.ins files (replaces token @@BUILDER_VARIABLES@@ ) -# -# The following tokens inside the WINST_VALUE will be replaced dynamically -# -# @DL_EXTRACT_WINST_PATH[]@ : contains the WINST location of the directory, the files from DL_FILE[] was extracted to. -# Sample: -# WINST_VALUE[1]="@DL_EXTRACT_WINST_PATH[]@\\svcpack\\aio-runtimes.exe" -# results in "%ScriptPath%\X86_64\svcpack\aio-runtimes.exe" -# -######################### -WINST_NAME[0]="InstallExe" -WINST_VALUE[0]="@DL_EXTRACT_WINST_PATH[2]@\\svcpack\\aio-runtimes.exe" - -WINST_NAME[1]="MyVar" -WINST_VALUE[1]="My content" - diff --git a/sample/old/builder-targets-cb.sh b/sample/old/builder-targets-cb.sh deleted file mode 100644 index 9a3d4a8..0000000 --- a/sample/old/builder-targets-cb.sh +++ /dev/null @@ -1,25 +0,0 @@ -############################################################################## -# This optional file "builder-targets-cb.sh" will be called by builder.sh -# -# The targets will be called from thde opsi-builder using the following -# order: config, prepare, retrieve, create, package, publish, commit, cleanup -# You can overwrite the target functions in builder-targets-cb.sh -# -# You can define callback functions. The functions are called from -# opsi-builder within processing a target -# cb_package_makeproductfile -# -# You can use every variable defined in any configuration file or by -# the defined builder script itself. Also, calling the predefined -# targets builder_ is possible. -# -# Abstract: -# target order: config, prepare, retrieve, create, package, publish, commit, cleanup -# callbacks: -# -############################################################################## - -function cleanup() { - echo "Cleanup" - builder_cleanup -} diff --git a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/Thumbs.db b/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/Thumbs.db deleted file mode 100644 index 513ee4eea4d18d938af21597f3bfbcedbf10ba1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 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 diff --git a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/setup32.ins b/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/setup32.ins deleted file mode 100644 index 33f8991..0000000 --- a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/setup32.ins +++ /dev/null @@ -1,207 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - - -[Actions] -ExitWindows /Reboot -DefVar $LogDir$ -Set $LogDir$ = "%SystemDrive%\tmp" -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $NewExe$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -Set $InstallDir$ = "%ProgramFilesDir%\" + $ProductId$ -Set $NewExe$ = $InstallDir$ + "\" + $ProductId$ + ".exe" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - ExitWindows /Reboot - isFatalError - ; Stop process and set installation status to failed -else - comment " this is for testing only ...remove on real scripts" - if "true" = GetProductProperty("test-set-fatal","true") - isFatalError - endif - - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if not ($LicenseRequired$ = "false") - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install - - comment "Patch Registry" - Registry_install - - comment "Create shortcuts" - LinkFolder_install - -endif - - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=2 REBOOT=ReallySuppress -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; "%ScriptPath%\setup.exe" /sp- /silent /norestart - -[Files_install] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: $NewExe$ -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: $NewExe$ -; parameters: /some_param -; working_dir: $InstallDir$ -; icon_file: $NewExe$ -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - ExitWindows /Reboot - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - ExitWindows /Reboot - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - ExitWindows /Reboot - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - ExitWindows /Reboot - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/uninstall.ins b/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/uninstall.ins deleted file mode 100644 index 710ed76..0000000 --- a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/localsetup/uninstall.ins +++ /dev/null @@ -1,74 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/credits/ - -[Initial] -requiredWinstVersion >= "4.8.6" -LogLevel=2 -; Log Errors in Logfile but don't abort: -ExitOnError=false -; Show syntax errors in the script: -ScriptErrorMessages=on -; Dont trace step by step through the script: -TraceMode=off -; Let started programs run in front of the winst window -StayOnTop=false - -[Aktionen] -DefVar $TEMP$ -Set $TEMP$ = EnvVar("TEMP") -DefVar $LogDir$ -Set $LogDir$ = "%SystemDrive%\tmp" -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFilesDir%\" + $ProductId$ -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap /3 "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub.ins" -endif - -if not ($LicenseRequired$ = "false") - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to free license used for the product" - DefVar $result$ - Set $result$ = FreeLicense($LicensePool$) - ; If there is an assignment of a license pool to the product, it is possible to use - ; Set $result$ = FreeLicense("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) -else - LogError "Error: licensing required, but license management not enabled" - isFatalError -endif - - - diff --git a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi-template-with-admin.png b/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi-template-with-admin.png deleted file mode 100644 index 069252241a9e83576c683481f6e95d442c07f814..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77186 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 diff --git a/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi.bmp b/sample/source/4.0.2/opsi-template-with-admin/CLIENT_DATA/opsi.bmp deleted file mode 100644 index dfe62040cec18a7db6b1ca0c088c20129b64d1ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76854 zcmeI4zpouf6~|v{Ix7AI3Mz_}6tswfhMta!1_2cXLJ>cNL?jThL^3 zvv>XBkKX-(yY}AsyPJRS=im2k{kv=LeOUZ){JrnlyZJ8)_V(WPpB1nIR=^5a0V`ky ztbi4;0#?8ZSOF_w1+0J-umV=V3RnRvU<$`qj_==!>7q z+r!_whw?u>bo`meAA9wM^X1$b?wW5vffr0$pc!s!gPYE9{n;}!BpbK1aK88;fF8W} z^DVoTO6VIn{tPKEneS8k53lO5RUwn<-ybGFq}IdM_wS`p4)^7Dt}Lh`b!WIMlDd|II>yFuN+*V5-lT&R>WP z-zT=`>(2r4a`+N6v-sEyl!IQWLL8Gizxm;J=mvbU8(0JA`6#`^d|4{YXh?(v7mv$_25lC&m>1)NWh2sR*v%*6$RaC)d^=a> zQX6*R9p;;J<`^8smspz7gpC{02SA{FST0!%@KJ|+EVJVxbP0f7zj!%sB~Wa5fqGZ@ z5(zUws0l6x;S@9(XgirLOk-D$i4hPBXs-N^OE1PI$~gyMjM$_LZwue&PhWWGfz$Wj zduso|zoHMjXHJeiUe8_w%JxZtaOWk9n8r>d8~8*MvX{?3t=(*}w586*C~Uq`;CH|J z+m}9l@{=Fi|HubVXk(YckALV93@WH{HnPhQNJX<4Q{c8f3)ze>?3Z7>+S{m*?}wg{ zZ*{HqZ2cE-1*`am5tISl>Qgc+^ek9ocO|$AwwY`XXj`5$c@l&6o>fBhAV%e0{kcy( z8vUHYUVql<#h52wT2W}?tu!;X%$Cn>fkF#$ zq~zl1KOGpN8FV5pmA0!tN5dJX+9vl(=E;{P1kf08X?VGRN{-+6=U#jBbD~~w#(DFi zF}&y%oXDIAlqE41nrv|8YZq6boI`Z`=#VB4Vl9P(@v4ZEcjw7B-{B$btmNP$`x2SS zi+Vrj$Us{g#PZo!u3qbHQHRR90(Vu~MQDG~^qOVINW+|H6{k%0DK1!$VztI(Fu zobR!FeqREVb_XLB)84$S0i6Pu-4dDeV0|FXwgU4VQm@;XX1>YJi)QqwiEEWWZ-=Lr zW3Ob+d=DIwVlJGUmS>uF5ocH!c@MCNv=rGz1vu^2DYMs)4PaO%8v{pFDj`d7}M zBUQ`Y1H}2xWz%Y66yZ9ear9?w`t$U#tgFqLZ=_Fr(q6i8Y&4&iY9vxa!st08BXazF zZrpi6Km|>2HMYtip`r_MsZ0tNX42H-OA_9D{@AWnj>IcK4~DFwK-rxwUwkvV?qH{7 z42q-0h0D|4OaU9pbO5EzTsdcAcxX&=2iGh9Kgiw;xlqd&@42v^4(H0Ux!a6`I4p0C znP50_^z%4$;251Rh&@}r^i^6!Gs_LfF3pVgmM&dZHbO}t!j4sr?7YCu10ppqoq4L~ zxwqi{Z!pDG%elDl>;HUpaKq&Z3sewR8D*9fO&&~-$-aVeY44yoxp208W4_Si3!UK0 zXL0cCl8mHUyecCvXXOErv*f&r#$mK@;Y$z@rZDj6LB1+1xj{Sr#-PIhlmW>OL1^zv z>DJ8o(rMMeVkl}AK}v{L{#=|Fz9dm%ggxfG$#XT%>fA8kC6t3kUczegXFN1|Y%cUtwEsRYe2!;y7$jV3Z+&V9p&DF$r#Cb&)1A;KhSHLC|-+1j` z+6v{I`!QaZd)A0kG742wLNe0lRawSt`KmwTo@_v5qmAegyCeNMhiIZ=%z2Cdvb>z> zkO;MDRgTPpD{7fnT#D}!++uK6&b6p11YywMqPzCoQx&Mz>+|KB?9P@i_oj?Op*R#M zpY3{1yZ&6@q7Pf^f8XKT zcV6IvFNfUtMuvOwl|fAgT-_4iJ9zWlRix02M0Dn`GuE&9D+f8{fY3D)5#oL?`*r8*ge0(77A*g0m2FhqCY7 z*j2t|A&aGqSeDFu`C(OgWWWT6jm0h~urUMTM7jzaj0oUtcqkh&furrhGKU0LMt0uu zALraT&~k-ckQ)$KEdLgd}u-C@4Pg_!|m zzVWL_#^szvllkDk#i^%YjXJnIp*sU&9H&rM*s$|*Cp*lS*5wsuL?+D2e}gY;lDQ5n z7=l4e&77eL(6~{a2XO;AMd#uhcHW)m%WovI`#^{JOCT0soI1NO0ai03(kCJ|9bj;% z6>El9>Rdio|Ccj5iRxf5G$Z(i|90Dd5i{qmhz!a=EWRvj?E8$wKu=7cJG6k%aA zCrOxALo-504_hiit2w zk%ez0-g)gYuEQr`;Rwgv+E9_O1Mw9R)=mMDzq4b2#) zA-?$sKqI#|<&gPKQE7YYnD6$on{wyoJ4L1Ktz*91%Wle@o9`5rwzrP?_So?bNW2si z?-B6Hn-u)iocD0~wK+fX>76*Ma`SC*@Q#39rY^6CK$$~)vTX%o^DTV!+G!!1cX`cC zuaK0}=eBFUnFyXMj`%47nOFJro+buZ^$sJ4^11W0%{Ox)L9=a(`L>!+0#K4<;&Vx~2+ms(menZpl@v07t3g)7aW=Ndm(5pLWyDL? z0EIICt4)Y0SLK--=34;ayv%Ju+0K9>Xb0tOabfcel@~Z3tVjgFPECbuK5-UO0IhD3D$7omHwZi z@+}+NHQyq&M%Zvq@+i`(T!)h2yA?yQ`DS)u$K)6HR4CS%n+@|_sq?ftA61F|dq8}7 zWTAsh`>5`4`uDDcV6By>-}44)2G)4cKzt@9LzAI7Hab9Wbl$+dt@IUZMYht#SGw(W zSB7aBcGvxlYr6hQ2-aG8O$}W5W!H*qrHd~d#G0DF5&~DY0#?8ZSOF_w1+0J-umV=V z3RnRvU= 4.11.3.3 -setLogLevel=7 -DefVar $ProductName$ -DefVar $ProductSizeMB$ -DefVar $LocalSetupScript$ -DefVar $LockKeyboard$ -DefVar $OpsiAdminPass$ -DefVar $RebootFlag$ -DefVar $WinstRegKey$ -DefVar $AutoName$ -DefVar $AutoPass$ -DefVar $AutoDom$ -DefVar $AutoLogon$ -DefVar $AutoBackupKey$ -DefVar $LocalFilesPath$ -DefVar $LocalWinst$ -DefVar $DefaultLoglevel$ -DefVar $PasswdLogLevel$ -DefVar $AdminGroup$ -DefVar $SearchResult$ -DefVar $LocalDomain$ -DefVar $debug$ -DefVar $isFatal$ - -; ---------------------------------------------------------------- -; - Please edit the following values -; ---------------------------------------------------------------- -Set $ProductName$ = "opsi-template-with-admin" -Set $ProductSizeMB$ = "1" -Set $LocalSetupScript$ = "setup32.ins" -; ---------------------------------------------------------------- - -comment "get and set initial values..." -set $debug$ = GetProductProperty("debug","false") -set $isFatal$ = "false" -set $DefaultLoglevel$ = "7" -SetLogLevel=$DefaultLoglevel$ -Set $LocalDomain$ = "%PCNAME%" - -comment "check if we productive or debugging..." -if $debug$ = "true" - comment "we are in debug mode" - Set $LockKeyboard$="false" - Set $PasswdLogLevel$="7" -else - comment "we are in productive mode" - comment "set $LockKeyboard$ to true to prevent user hacks while admin is logged in" - Set $LockKeyboard$="true" - comment " set $PasswdLogLevel$ to 0 for production" - Set $PasswdLogLevel$="0" -endif - -comment "handle Rebootflag" -Set $WinstRegKey$ = "HKLM\SOFTWARE\opsi.org\winst" -Set $RebootFlag$ = GetRegistryStringValue32("["+$WinstRegKey$+"] "+"RebootFlag") - -comment "some paths required" -Set $AutoBackupKey$ = $WinstRegKey$+"\AutoLogonBackup" -Set $LocalFilesPath$ = "C:\opsi.org\tmp\opsi_local_inst" -Set $LocalWinst$ = "%ProgramFilesDir%\opsi.org\opsi-client-agent\opsi-winst\winst32.exe" -if not( FileExists($LocalWinst$) ) - LogError "No opsi-winst found. Abborting." - isFatalError -endif - -comment "show product picture" -ShowBitmap "%scriptpath%\localsetup\"+$ProductName$+".png" $ProductName$ - -if not (($RebootFlag$ = "1") or ($RebootFlag$ = "2") or ($RebootFlag$ = "3")) - comment "Part before first Reboot" - comment "just reboot - this must be done if this is the first product after OS installation" - comment "handle Rebootflag" - Set $RebootFlag$ = "1" - Registry_SaveRebootFlag /32bit - ;ExitWindows /ImmediateReboot -endif ; Rebootflag = not (1 or 2 or 3) - -if $RebootFlag$ = "1" - comment "Part before second Reboot" - setActionProgress "Preparing" - - if not(HasMinimumSpace ("%SYSTEMDRIVE%", ""+$ProductSizeMB$+" MB")) - LogError "Not enough space on drive C: . "+$ProductSizeMB$+" MB on C: required for "+$ProductName$ - isFatalError - endif - - comment "Lets work..." - Message "Preparing "+$ProductName$+" install step 1..." - sub_Prepare_AutoLogon - - comment "we need to reboot now to be sure that the autologon work" - comment "handle Rebootflag" - Set $RebootFlag$ = "2" - Registry_SaveRebootFlag /32bit - ExitWindows /ImmediateReboot -endif ; Rebootflag = not (1 or 2) - -if ($RebootFlag$ = "2") - comment "Part after first Reboot" - - comment "handle Rebootflag" - Set $RebootFlag$ = "3" - Registry_SaveRebootFlag /32bit - - comment "Lets work..." - Message "Preparing "+$ProductName$+" install step 2..." - Registry_enable_keyboard /sysnative - - comment "now let the autologon work" - comment "it will stop with a reboot" - setActionProgress "Run Installation" - - ExitWindows /ImmediateLogout -endif ; Rebootflag = 2 - -if ($RebootFlag$ = "3") - comment "Part after second Reboot" - ExitWindows /Reboot - setActionProgress "Cleanup" - comment "handle Rebootflag" - Set $RebootFlag$ = "0" - Registry_SaveRebootFlag /32bit - - comment "Lets work..." - Message "Cleanup "+$ProductName$+" install (step 3)..." - sub_Restore_AutoLogon - set $SearchResult$ = GetRegistryStringValueSysnative("[HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] opsi_autologon_setup") - if $SearchResult$ = $LocalWinst$+" "+$LocalFilesPath$+"\"+$LocalSetupScript$+" /batch /productid %installingProdName%" - LogError "Localscript did not run. We remove the RunOnce entry and abort" - Registry_del_runonce /sysnative - set $isFatal$ = "true" - endif - if "true" = getRegistryStringValue32("[HKLM\Software\opsi.org\winst] with-admin-fatal") - LogError "set to fatal because the local script stored this result" - set $isFatal$ = "true" - endif - comment "cleanup the registry key which stores a fatal result of the local script" - Registry_clean_fatal_flag /32bit - if $isFatal$ = "true" - isFatalError - endif - comment "This is the clean end of the installation" -endif ; Rebootflag = 3 - - -[sub_Prepare_AutoLogon] -comment "copy the setup script and files" -Files_copy_Setup_files_local -comment "read actual Autologon values for backup" -set $AutoName$ = GetRegistryStringValueSysnative("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultUserName") -comment "if AutoLogonName is our setup admin user, something bad happend" -comment "then let us cleanup" -if ($AutoName$="opsiSetupAdmin") - set $AutoName$="" - set $AutoPass$="" - set $AutoDom$="" - set $AutoLogon$="0" -else - set $AutoPass$ = GetRegistryStringValueSysnative("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultPassword") - set $AutoDom$ = GetRegistryStringValueSysnative("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] DefaultDomainName") - set $AutoLogon$ = GetRegistryStringValueSysnative("[HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] AutoAdminLogon") -endif - -comment "backup AutoLogon values" -Registry_save_autologon /32bit - -comment "prepare the admin AutoLogon" -SetLogLevel=$PasswdLogLevel$ -set $OpsiAdminPass$= randomstr -Registry_autologon /sysnative - -comment "get the name of the admin group" -set $AdminGroup$ = SidToName("S-1-5-32-544") -comment "create our setup admin user" -DosInAnIcon_makeadmin -SetLogLevel=$DefaultLoglevel$ - -comment "store our setup script as run once" -Registry_runOnce /sysnative - -comment "disable keyboard and mouse while the autologin admin works" -if ($LockKeyboard$="true") - Registry_disable_keyboard /Sysnative -endif - -comment "cleanup the registry key which stores a fatal result of the local script" -Registry_clean_fatal_flag /32bit - -[sub_Restore_AutoLogon] -comment "read AutoLogon values from backup" -set $AutoName$ = GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultUserName") -set $AutoPass$ = GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultPassword") -set $AutoDom$ = GetRegistryStringValue("["+$AutoBackupKey$+"] DefaultDomainName") -set $AutoLogon$ = GetRegistryStringValue("["+$AutoBackupKey$+"] AutoAdminLogon") - -comment "restore the values" -SetLogLevel = $PasswdLogLevel$ -Registry_restore_autologon /Sysnative -SetLogLevel = $DefaultLoglevel$ -comment "delete our setup admin user" -DosInAnIcon_deleteadmin -comment "cleanup setup script, files and profiledir" -Files_delete_Setup_files_local -comment "delete profiledir" -DosInAnIcon_deleteprofile - -[Registry_save_autologon] -openkey [$AutoBackupKey$] -set "DefaultUserName"="$AutoName$" -set "DefaultPassword"="$AutoPass$" -set "DefaultDomainName"="$AutoDom$" -set "AutoAdminLogon"="$AutoLogon$" - -[Registry_restore_autologon] -openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] -set "DefaultUserName"="$AutoName$" -set "DefaultPassword"="$AutoPass$" -set "DefaultDomainName"="$AutoDom$" -set "AutoAdminLogon"="$AutoLogon$" - -[DosInAnIcon_deleteadmin] -NET USER opsiSetupAdmin /DELETE - -[Registry_SaveRebootFlag] -openKey [$WinstRegKey$] -set "RebootFlag" = "$RebootFlag$" - -[Files_copy_Setup_files_local] -copy -s %ScriptPath%\localsetup\*.* $LocalFilesPath$ - -[Files_delete_Setup_files_local] -del -sf $LocalFilesPath$\ -; folgender Befehl funktioniert nicht vollständig, deshalb ist er zur Zeit auskommentier -; der Befehl wird durch die Sektion "DosInAnIcon_deleteprofile" ersetzt (P.Ohler) -;delete -sf "%ProfileDir%\opsiSetupAdmin" - -[DosInAnIcon_deleteprofile] -rmdir /S /Q "%ProfileDir%\opsiSetupAdmin" - -[DosInAnIcon_makeadmin] -NET USER opsiSetupAdmin $OpsiAdminPass$ /ADD -NET LOCALGROUP $AdminGroup$ /ADD opsiSetupAdmin - -[Registry_autologon] -openkey [HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon] -set "DefaultUserName"="opsiSetupAdmin" -set "DefaultPassword"="$OpsiAdminPass$" -set "DefaultDomainName"="$LocalDomain$" -set "AutoAdminLogon"="1" - -[Registry_runonce] -openkey [HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] -set "opsi_autologon_setup"='"$LocalWinst$" "$LocalFilesPath$\$LocalSetupScript$" /batch /productid %installingProdName%' - -[Registry_del_runonce] -openkey [HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce] -DeleteVar "opsi_autologon_setup" - -[Registry_disable_keyboard] -openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kbdclass] -set "Start"=REG_DWORD:0x4 -openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mouclass] -set "Start"=REG_DWORD:0x4 - -[Registry_enable_keyboard] -openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kbdclass] -set "Start"=REG_DWORD:0x1 -openkey [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mouclass] -set "Start"=REG_DWORD:0x1 - -[Registry_clean_fatal_flag] -openkey [$WinstRegKey$] -DeleteVar "with-admin-fatal" - diff --git a/sample/source/4.0.2/opsi-template-with-admin/OPSI/control b/sample/source/4.0.2/opsi-template-with-admin/OPSI/control deleted file mode 100644 index cc66a64..0000000 --- a/sample/source/4.0.2/opsi-template-with-admin/OPSI/control +++ /dev/null @@ -1,122 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template-with-admin -name: opsi template for installs with logged in admin -description: A opsi demo package -advice: -version: 4.0.2 -priority: -20 -licenseRequired: False -productClasses: -setupScript: setup.ins -uninstallScript: localsetup\uninstall.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: - -[ProductProperty] -type: bool -name: debug -description: should be false for production: switch off keyboard lock and increase loglevel -default: False - -[ProductProperty] -type: bool -name: test-set-fatal -description: test only: if true script result is set to fatal -default: False - -[Changelog] -opsi-template-with-admin (4.0.2-2) stable; urgency=low - - * requires opsi-winst >= 4.11.3.3 - * uses /productid switch at opsi-winst call - * code cleanup (use of synative instead of 64bit) - * property debug: switches loglevel and lock keyboard - * code cleanup - - -- detlef oertel Thu, 19 Sep 2012 15:01:53 +0200 - - -opsi-template-with-admin (4.0.2-1) stable; urgency=low - - * requires opsi-winst >= 4.11.3 - * using SidToName instead of psgetsid.exe - * priority set to -20 - * first reboot is commented (;ExitWindows /ImmediateReboot). Uncomment it if you have problems with the autologon - - -- detlef oertel Wed, 04 Jul 2012 15:01:53 +0200 - - -opsi-template-with-admin (1.0-8) stable; urgency=low - - * localdomain = "%PCNAME%" - - -- Jan Schneider Wed, 4 May 2011 14:09:00 +0100 - -opsi-template-with-admin (1.0-7) stable; urgency=low - - * localdomain = "." for nt6 - - -- Jan Schneider Tue, 29 Mar 2011 17:56:00 +0100 - -opsi-template-with-admin (1.0-6) stable; urgency=low - - * postinst fix: /bin/bash - * preinst fix: no more case sensitiv for pcgetsid.exe - - -- detlef oertel Tue, 30 Dec 2010 15:01:53 +0200 - -opsi-template-with-admin (1.0-5) testing; urgency=low - - * added support for opsi 4.0 opsi-client-agent - * scripts renamed to setup.ins, local_setup.ins and uninstall.ins - - -- detlef oertel Tue, 13 Jun 2010 15:01:53 +0200 - - -opsi-template-with-admin (1.0-4) testing; urgency=low - - * new (64 bit) functions of winst 4.10.3 used - - -- detlef oertel Fri, 16 Apr 2010 15:01:53 +0200 - - -opsi-template-with-admin (1.0-3) testing; urgency=low - - * in [sub_fetch_SearchResult] changed ("$s$") to ('$s$') - - -- detlef oertel Tue, 26 Jan 2010 15:01:53 +0200 - -opsi-template-with-admin (1.0-2) stable; urgency=low - - * added support for 64 Bit - * code cleanup - * added psgetsid for international support - - -- detlef oertel Mon, 14 Dec 2009 15:01:53 +0200 - - -opsi-template-with-admin (1.0-1) stable; urgency=low - - * initial package based on http://www.opsi.org/opsi_wiki/TemplateForInstallationsAsTemporaryLocalAdmin - - -- detlef oertel Mon, 13 Nov 2009 15:01:53 +0200 - - - - - - - - - - - diff --git a/sample/source/4.0.2/opsi-template-with-admin/OPSI/postinst b/sample/source/4.0.2/opsi-template-with-admin/OPSI/postinst deleted file mode 100644 index 56a8c4b..0000000 --- a/sample/source/4.0.2/opsi-template-with-admin/OPSI/postinst +++ /dev/null @@ -1,26 +0,0 @@ -#! /bin/bash -# -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# -TMP_DIR=${CLIENT_DATA_DIR}/../${PRODUCT_ID}.tmp - -echo 'Restoring previous files...' -if [ -f $TMP_DIR/psgetsid.exe ]; then - mv $TMP_DIR/psgetsid.exe $CLIENT_DATA_DIR/ || exit 1 -fi - -echo 'get files if not present' -if [ ! -f "$CLIENT_DATA_DIR/psgetsid.exe" ]; then - cd $CLIENT_DATA_DIR - echo 'try to get zip' - wget http://download.sysinternals.com/Files/PsTools.zip - echo 'unzip' - unzip -o PsTools.zip -fi - -echo "Removing temporary files..." -rm -rf $TMP_DIR diff --git a/sample/source/4.0.2/opsi-template-with-admin/OPSI/preinst b/sample/source/4.0.2/opsi-template-with-admin/OPSI/preinst deleted file mode 100644 index 4cbf4ba..0000000 --- a/sample/source/4.0.2/opsi-template-with-admin/OPSI/preinst +++ /dev/null @@ -1,28 +0,0 @@ -#! /bin/bash -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -# -TMP_DIR=${CLIENT_DATA_DIR}/../${PRODUCT_ID}.tmp - -if [ -d $TMP_DIR ]; then - echo "Temporary directory $TMP_DIR already exist, aborting!" 1>&2 - exit 1 -fi - -[ ! -d $CLIENT_DATA_DIR ] && mkdir $CLIENT_DATA_DIR -mkdir $TMP_DIR - -if [ -d $CLIENT_DATA_DIR ]; then - echo "Saving previous files..." - if [ -f $CLIENT_DATA_DIR/[pP][sS][gG][eE][tT][sS][iI][dD].[eE][xX][eE] ]; then - mv $CLIENT_DATA_DIR/[pP][sS][gG][eE][tT][sS][iI][dD].[eE][xX][eE] $TMP_DIR/psgetsid.exe || exit 1 - fi -fi - -exit 0 - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub32.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub32.ins deleted file mode 100644 index db88f69..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub32.ins +++ /dev/null @@ -1,97 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $MsiId$ = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub3264.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub3264.ins deleted file mode 100644 index dab13c4..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub3264.ins +++ /dev/null @@ -1,143 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $MsiId32$ = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' -Set $UninstallProgram32$ = $InstallDir32$ + "\uninstall.exe" - -Set $MsiId64$ = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' -Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe" - -if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Uninstalling " + $ProductId$ + " 32 Bit..." - - if FileExists($UninstallProgram32$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_32 - sub_check_exitcode - endif - - if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId32$ + "] DisplayName") = "") - comment "MSI id " + $MsiId32$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_32 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_32 /32Bit - comment "Cleanup registry" - Registry_uninstall /32Bit -endif - -if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Uninstalling " + $ProductId$ + " 64 Bit..." - - if FileExists($UninstallProgram64$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall_64 - sub_check_exitcode - endif - - if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId64$ + "] DisplayName") = "") - comment "MSI id " + $MsiId64$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi_64 - sub_check_exitcode - endif - - comment "Delete files" - Files_uninstall_64 /64Bit - comment "Cleanup registry" - Registry_uninstall /64Bit -endif - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall_32] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram32$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram32$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi_32] -msiexec /x $MsiId32$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_32] -; Example for recursively deleting the installation directory (don't forget the trailing backslash): -; -; delete -sf "$InstallDir32$\" - -[Winbatch_uninstall_64] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram64$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram64$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi_64] -msiexec /x $MsiId64$ /qb! REBOOT=ReallySuppress - -[Files_uninstall_64] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir64$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub64.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub64.ins deleted file mode 100644 index cf3a4c9..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub64.ins +++ /dev/null @@ -1,97 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - - -Set $MsiId$ = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif -if not (GetRegistryStringValue64("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /64Bit - -comment "Cleanup registry" -Registry_uninstall /64Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; maby better Call as -; Winbatch_uninstall /WaitforProcessending "Au_.exe" /Timeoutseconds 10 -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub_short32.opsiscript b/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub_short32.opsiscript deleted file mode 100644 index 16d9e26..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/delsub_short32.opsiscript +++ /dev/null @@ -1,67 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -include_append "section_sub_check_exitcode.opsiinc" - -Set $MsiId$ = '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}' -Set $UninstallProgram$ = $InstallDir$ + "\uninstall.exe" - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists($UninstallProgram$) - comment "Uninstall program found, starting uninstall" - Winbatch_uninstall - sub_check_exitcode -endif -if not (GetRegistryStringValue32("[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\" + $MsiId$ + "] DisplayName") = "") - comment "MSI id " + $MsiId$ + " found in registry, starting msiexec to uninstall" - Winbatch_uninstall_msi - sub_check_exitcode -endif - -comment "Delete files" -Files_uninstall /32Bit - -comment "Cleanup registry" -Registry_uninstall /32Bit - -comment "Delete program shortcuts" -LinkFolder_uninstall - -[Winbatch_uninstall] -; Choose one of the following examples as basis for program uninstall -; -; === Nullsoft Scriptable Install System ================================================================ -; "$UninstallProgram$" /S -; -; === Inno Setup ======================================================================================== -; "$UninstallProgram$" /silent /norestart /SUPPRESSMSGBOXES /nocancel - - -[Winbatch_uninstall_msi] -msiexec /x $MsiId$ /qb! REBOOT=ReallySuppress - -[Files_uninstall] -; Example for recursively deleting the installation directory: -; -; del -sf "$InstallDir$\" - -[Registry_uninstall] -; Example of deleting a registry key: -; -; deletekey [HKEY_LOCAL_MACHINE\Software\$ProductId$] - -[LinkFolder_uninstall] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of deleting a shortcut from AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; delete_element $ProductId$ - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/login.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/login.ins deleted file mode 100644 index 60419d9..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/login.ins +++ /dev/null @@ -1,24 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -Message "Profile Patch for VLC ...." - -comment "Did we run this script before ? - and set version stamp in profile" -if getValue("installationstate", getProductMap) = "installed" - comment "Product is installed" - if not (scriptWasExecutedBefore) - comment "loginscript was not run yet " - Files_profile_copy - Registry_currentuser_set - endif -endif - -[Files_profile_copy] -copy "%Scriptpath%\profiles\*.*" "%CurrentAppdataDir%\ACME" - -[Registry_currentuser_set] -openkey [HKCU\Software\ACME] -set "show_greeting_window" = "no" diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/opsi-template.png b/sample/source/4.0.2/opsi-template/CLIENT_DATA/opsi-template.png deleted file mode 100644 index e4b974e698524663cb4a7e068a728d5f6f5e30c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16993 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%0Dx8t z)$aWKf-U6wa++a0;b_R^7}Zs%-lEV%9;<0dc7)A{uuOy@(=#yBPuhp^-p!JQ<29c4 z{9EaPPVSgOW4f#W$lt5T?d&E;+0n&rT$mL&is|vk3hd%>+2!Vdc2N=n>jB3+7bvEI z4znSQmCupbSj?FS0XT7I=YrwEm$I-ZO&b*hMYt%d-kz5L00GHKL_t(UdWgE=L}}u5 z4aESk82_$QD%KS@u-XcQR)n8O$0cS10k{E2{zfaVV&|OY-3+<_K;6QLtXWvWhJz?_ zdgxXlup2u&kw!pvbLpIPG-d(BLW>?#0lrHGKv?Kyc7!JvKn$y6m>dVB9QWfDZBqz6 znaEFLN?C-U3>(f@Ea;p-a3M4)q>I^cz=`T_7o3cGDFNt2=nEl&(>XGVyx4a}Y>lCF zkryDpNm9y&^BG0xR}-luvs#=}O%qH2ki{P7f{K$aH2@0%aiYc%EASwhzy(G3f{ENA zEI@G~K07P$LLSmo(F8?^Tc_i)DFF2q55Qu@!G*ejcn+moIBqi$2O09tkFF9bezh12GW+z8&9o89a>KKnz=HMEO2PpRjBW}99B1nfQiR=tx& z4&xNXm;v7m04EGWDqf>ZAKpV_7l0G&VxTqe)|%r?CM=mb1W(A_ZuycqyqlzW}1 zt7is$GXT6S_dEl<830~V8q5H0W}De&wwY~ayNKKW2i4Yg8V-DCQvd(}07*qoM6N<$ Ef-3vOTmS$7 diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup32.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup32.ins deleted file mode 100644 index 4da30e7..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup32.ins +++ /dev/null @@ -1,212 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError "No Space" - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup3264.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup3264.ins deleted file mode 100644 index 20d8c29..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup3264.ins +++ /dev/null @@ -1,262 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId32$ -DefVar $UninstallProgram32$ -DefVar $MsiId64$ -DefVar $UninstallProgram64$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" - endif - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "installing" - - if (($INST_SystemType$ = "x86 System") and ($INST_architecture$ = "system specific")) or ($INST_architecture$ = "both") or ($INST_architecture$ = "32 only") - Message "Installing " + $ProductId$ + " 32 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_32 - Sub_check_exitcode - comment "Copy files" - Files_install_32 /32Bit - comment "Patch Registry" - Registry_install /32Bit - comment "Create shortcuts" - LinkFolder_install - endif - - if ($INST_SystemType$ = "64 Bit System") and (($INST_architecture$ = "system specific") or ($INST_architecture$ = "both") or ($INST_architecture$ = "64 only")) - Message "Installing " + $ProductId$ + " 64 Bit..." - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install_64 - Sub_check_exitcode - comment "Copy files" - Files_install_64 /64Bit - comment "Patch Registry" - Registry_install /64Bit - comment "Create shortcuts" - LinkFolder_install - endif - -endif - -[Winbatch_install_32] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_32] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir32$" - -[Winbatch_install_64] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install_64] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir64$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -comment "License management is enabled and will be used" - -comment "Trying to get a license key" -Set $LicenseKey$ = demandLicenseKey ($LicensePool$) -; If there is an assignment of exactly one licensepool to the product the following call is possible: -; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use: -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - -DefVar $ServiceErrorClass$ -set $ServiceErrorClass$ = getLastServiceErrorClass -comment "Error class: " + $ServiceErrorClass$ - -if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" -else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif -endif - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup64.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup64.ins deleted file mode 100644 index 8fc3187..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup64.ins +++ /dev/null @@ -1,212 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /64Bit - - comment "Patch Registry" - Registry_install /64Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; You may use an answer file by the parameter /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - -[Sub_get_licensekey] -if opsiLicenseManagementEnabled - comment "License management is enabled and will be used" - - comment "Trying to get a license key" - Set $LicenseKey$ = demandLicenseKey ($LicensePool$) - ; If there is an assignment of exactly one licensepool to the product the following call is possible: - ; Set $LicenseKey$ = demandLicenseKey ("", $ProductId$) - ; - ; If there is an assignment of a license pool to a windows software id, it is possible to use: - ; DefVar $WindowsSoftwareId$ - ; $WindowsSoftwareId$ = "..." - ; Set $LicenseKey$ = demandLicenseKey ("", "", $WindowsSoftwareId$) - - DefVar $ServiceErrorClass$ - set $ServiceErrorClass$ = getLastServiceErrorClass - comment "Error class: " + $ServiceErrorClass$ - - if $ServiceErrorClass$ = "None" - comment "Everything fine, we got the license key '" + $LicenseKey$ + "'" - else - if $ServiceErrorClass$ = "LicenseConfigurationError" - LogError "Fatal: license configuration must be corrected" - LogError getLastServiceErrorMessage - isFatalError - else - if $ServiceErrorClass$ = "LicenseMissingError" - LogError "Fatal: required license is not supplied" - isFatalError - endif - endif - endif -else - LogError "Fatal: license required, but license management not enabled" - isFatalError -endif - - -[Sub_check_exitcode] -comment "Test for installation success via exit code" -set $ExitCode$ = getLastExitCode -; informations to exit codes see -; http://msdn.microsoft.com/en-us/library/aa372835(VS.85).aspx -; http://msdn.microsoft.com/en-us/library/aa368542.aspx -if ($ExitCode$ = "0") - comment "Looks good: setup program gives exitcode zero" -else - comment "Setup program gives a exitcode unequal zero: " + $ExitCode$ - if ($ExitCode$ = "1605") - comment "ERROR_UNKNOWN_PRODUCT 1605 This action is only valid for products that are currently installed." - comment "Uninstall of a not installed product failed - no problem" - else - if ($ExitCode$ = "1641") - comment "looks good: setup program gives exitcode 1641" - comment "ERROR_SUCCESS_REBOOT_INITIATED 1641 The installer has initiated a restart. This message is indicative of a success." - else - if ($ExitCode$ = "3010") - comment "looks good: setup program gives exitcode 3010" - comment "ERROR_SUCCESS_REBOOT_REQUIRED 3010 A restart is required to complete the install. This message is indicative of a success." - else - logError "Fatal: Setup program gives an unknown exitcode unequal zero: " + $ExitCode$ - isFatalError - endif - endif - endif -endif - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup_short32.opsiscript b/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup_short32.opsiscript deleted file mode 100644 index 3f808e9..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/setup_short32.opsiscript +++ /dev/null @@ -1,147 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.3.2" -include_append "section_sub_check_exitcode.opsiinc" -include_append "section_sub_get_licensekey.opsiinc" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ProductId$ -DefVar $MinimumSpace$ -DefVar $InstallDir$ -DefVar $ExitCode$ -DefVar $LicenseRequired$ -DefVar $LicenseKey$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\opsi.org\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -;$ProductId$ should be the name of the product in opsi -; therefore please: only lower letters, no umlauts, -; no white space use '-' as a seperator -Set $ProductId$ = "opsi-template" -Set $MinimumSpace$ = "1 MB" -; the path were we find the product after the installation -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - -if not(HasMinimumSpace ("%SystemDrive%", $MinimumSpace$)) - LogError "Not enough space on %SystemDrive%, " + $MinimumSpace$ + " on drive %SystemDrive% needed for " + $ProductId$ - isFatalError - ; Stop process and set installation status to failed -else - comment "Show product picture" - ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - - if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" - endif - - Message "Installing " + $ProductId$ + " ..." - - if $LicenseRequired$ = "true" - comment "Licensing required, reserve license and get license key" - Sub_get_licensekey - endif - - comment "Start setup program" - ChangeDirectory "%SCRIPTPATH%" - Winbatch_install - Sub_check_exitcode - - comment "Copy files" - Files_install /32Bit - - comment "Patch Registry" - Registry_install /32Bit - - comment "Create shortcuts" - LinkFolder_install - -endif - -[Winbatch_install] -; Choose one of the following examples as basis for your installation -; You can use $LicenseKey$ var to pass a license key to the installer -; -; === Nullsoft Scriptable Install System ================================================================ -; "%ScriptPath%\Setup.exe" /S -; -; === MSI package ======================================================================================= -; You may use the parameter PIDKEY=$Licensekey$ -; msiexec /i "%ScriptPath%\some.msi" /l* "$LogDir$\$ProductId$.install_log.txt" /qb! ALLUSERS=1 REBOOT=ReallySuppress -; -; === InstallShield + MSI===================================================================================== -; Attention: The path to the log file should not contain any whitespaces -; "%ScriptPath%\setup.exe" /s /v" /l* $LogDir$\$ProductId$.install_log.txt /qb! ALLUSERS=1 REBOOT=ReallySuppress" -; "%ScriptPath%\setup.exe" /s /v" /qb! ALLUSERS=2 REBOOT=ReallySuppress" -; -; === InstallShield ===================================================================================== -; Create setup.iss answer file by running: setup.exe /r /f1"c:\setup.iss" -; "%ScriptPath%\setup.exe" /s /sms /f1"%ScriptPath%\setup.iss" /f2"$LogDir$\$ProductId$.install_log.txt" -; -; === Inno Setup ======================================================================================== -; http://unattended.sourceforge.net/InnoSetup_Switches_ExitCodes.html -; You may create setup answer file by: setup.exe /SAVEINF="filename" -; You may use an answer file by the parameter /LOADINF="filename" -; "%ScriptPath%\setup.exe" /sp- /silent /norestart /nocancel /SUPPRESSMSGBOXES - -[Files_install] -; Example of recursively copying some files into the installation directory: -; -; copy -s "%ScriptPath%\files\*.*" "$InstallDir$" - -[Registry_install] -; Example of setting some values of an registry key: -; -; openkey [HKEY_LOCAL_MACHINE\Software\$ProductId$] -; set "name1" = "some string value" -; set "name2" = REG_DWORD:0001 -; set "name3" = REG_BINARY:00 af 99 cd - -[LinkFolder_install] -; Example of deleting a folder from AllUsers startmenu: -; -; set_basefolder common_programs -; delete_subfolder $ProductId$ -; -; Example of creating an shortcut to the installed exe in AllUsers startmenu: -; -; set_basefolder common_programs -; set_subfolder $ProductId$ -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: -; end_link -; -; Example of creating an shortcut to the installed exe on AllUsers desktop: -; -; set_basefolder common_desktopdirectory -; set_subfolder "" -; -; set_link -; name: $ProductId$ -; target: -; parameters: -; working_dir: $InstallDir$ -; icon_file: -; icon_index: 2 -; end_link - - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall32.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall32.ins deleted file mode 100644 index 6e184b8..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall32.ins +++ /dev/null @@ -1,58 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub32.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub32.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall3264.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall3264.ins deleted file mode 100644 index 396a593..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall3264.ins +++ /dev/null @@ -1,69 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId32$ -DefVar $UninstallProgram32$ -DefVar $MsiId64$ -DefVar $UninstallProgram64$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir32$ -DefVar $InstallDir64$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ -DefVar $INST_SystemType$ -DefVar $INST_architecture$ - -Set $INST_SystemType$ = GetSystemType -set $INST_architecture$ = GetProductProperty("install_architecture","system specific") - - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir32$ = "%ProgramFiles32Dir%\" -Set $InstallDir64$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub3264.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub3264.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall64.ins b/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall64.ins deleted file mode 100644 index fe4474e..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall64.ins +++ /dev/null @@ -1,59 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.2.6" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFiles64Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub64.ins") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub64.ins" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - - diff --git a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall_short32.opsiscript b/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall_short32.opsiscript deleted file mode 100644 index 9f14fb1..0000000 --- a/sample/source/4.0.2/opsi-template/CLIENT_DATA/uninstall_short32.opsiscript +++ /dev/null @@ -1,58 +0,0 @@ -; Copyright (c) uib gmbh (www.uib.de) -; This sourcecode is owned by uib gmbh -; and published under the Terms of the General Public License. -; credits: http://www.opsi.org/en/credits/ - -[Actions] -requiredWinstVersion >= "4.11.3.2" - -DefVar $MsiId$ -DefVar $UninstallProgram$ -DefVar $LogDir$ -DefVar $ExitCode$ -DefVar $ProductId$ -DefVar $InstallDir$ -DefVar $LicenseRequired$ -DefVar $LicensePool$ - -Set $LogDir$ = "%SystemDrive%\tmp" - -; ---------------------------------------------------------------- -; - Please edit the following values - -; ---------------------------------------------------------------- -Set $ProductId$ = "opsi-template" -Set $InstallDir$ = "%ProgramFiles32Dir%\" -Set $LicenseRequired$ = "false" -Set $LicensePool$ = "p_" + $ProductId$ -; ---------------------------------------------------------------- - - -comment "Show product picture" -ShowBitmap "%ScriptPath%\" + $ProductId$ + ".png" $ProductId$ - -Message "Uninstalling " + $ProductId$ + " ..." - -if FileExists("%ScriptPath%\delsub_short32.opsiscript") - comment "Start uninstall sub section" - Sub "%ScriptPath%\delsub_short32.opsiscript" -endif - -if $LicenseRequired$ = "true" - comment "Licensing required, free license used" - Sub_free_license -endif - -[Sub_free_license] -comment "License management is enabled and will be used" - -comment "Trying to free license used for the product" -DefVar $result$ -Set $result$ = FreeLicense($LicensePool$) -; If there is an assignment of a license pool to the product, it is possible to use -; Set $result$ = FreeLicense("", $ProductId$) -; -; If there is an assignment of a license pool to a windows software id, it is possible to use -; DefVar $WindowsSoftwareId$ -; $WindowsSoftwareId$ = "..." -; set $result$ = FreeLicense("", "", $WindowsSoftwareId$) - diff --git a/sample/source/4.0.2/opsi-template/OPSI/control b/sample/source/4.0.2/opsi-template/OPSI/control deleted file mode 100644 index e97a797..0000000 --- a/sample/source/4.0.2/opsi-template/OPSI/control +++ /dev/null @@ -1,196 +0,0 @@ -[Package] -version: 2 -depends: -incremental: False - -[Product] -type: localboot -id: opsi-template -name: opsi template product -description: A template for opsi products -advice: -version: 4.0.2 -priority: 0 -licenseRequired: False -productClasses: -setupScript: setup3264.ins -uninstallScript: uninstall3264.ins -updateScript: -alwaysScript: -onceScript: -customScript: -userLoginScript: login.ins - -[ProductProperty] -type: unicode -name: install_architecture -multivalue: False -editable: False -description: which architecture (32/64 bit) has to be installed -values: ["32 only", "64 only", "both", "system specific"] -default: ["system specific"] - -[Changelog] -opsi-template (4.0.2-2) stable; urgency=low - - * requiredWinstVersion >= "4.11.3.2" - * Set $LogDir$ = "%SystemDrive%\opsi.org\tmp" - * new: *_short32.opsiscript scripts with includes - * winbatch_install: changed inno-setup example: default without answer file - * winbatch_uninstall: changed NSIS example: /WaitForProcessEnding "Au_.exe" - - -- detlef oertel Fri, 03 Aug 2012 16:01:53 +0200 - -opsi-template (4.0.2-1) stable; urgency=low - - * requiredWinstVersion >= "4.11.2.6" - * added ChangeDirectory "%SCRIPTPATH%" - * changed delete to del (in delsub) - * changed at msi to ALLUSERS=1 - - -- detlef oertel Mon, 02 Jun 2012 16:01:53 +0200 - -opsi-template (4.0.1-5) stable; urgency=low - - * added /nocancel at Inno example - * added login.ins for 'user profile management' - * moved changelog to control file - - -- detlef oertel Mon, 02 Jan 2012 16:01:53 +0200 - - -opsi-template (4.0.1-4) stable; urgency=low - - * removed uncommented test for installation success via registry entries - - -- detlef oertel Thu, 30 Nov 2011 16:01:53 +0200 - - -opsi-template (4.0.1-3) stable; urgency=low - - * changed setup.ins to setup3264.ins (and so on ..) - * added /SUPPRESSMSGBOXES at Inno example - - -- detlef oertel Thu, 06 Oct 2011 16:01:53 +0200 - - -opsi-template (4.0.1-2) stable; urgency=low - - * bugfix: removed '\\' by '\' in showBitMap calls - - -- detlef oertel Tue, 02 Aug 2011 16:01:53 +0200 - - -opsi-template (4.0.1-1) stable; urgency=low - - * bugfix: delsub.ins: Set $UninstallProgram64$ = $InstallDir64$ + "\uninstall.exe" - - -- detlef oertel Wed, 18 Jan 2011 16:01:53 +0200 - - -opsi-template (4.0-1) stable; urgency=low - - * requires opsi.winst 4.10.8 - * default: 32Bit Version - * additional: 64Bit Version - * additional: 32/64Bit Version - - -- detlef oertel Wed, 18 Jan 2011 16:01:53 +0200 - - -opsi-template (1.0-20) stable; urgency=low - - * removed EnvVar("temp") - * all variable definitions at top - * new loglevel - * removed $NewExe$ - * more infos for inno setup - * removed number at showBitmap - * Initial section removed - * example for $installDir$ changed - - -- detlef oertel Wed, 14 Apr 2010 16:01:53 +0200 - - -opsi-template (1.0-19) stable; urgency=low - - * adding 'Installshield + MSI' to the Winbatch_install section - * changing to 'if $LicenseRequired$ = "true"' from 'if not ($LicenseRequired$ = "false")' - * changed from .ins to 'setup.ins' - - -- detlef oertel Tue, 26 Jan 2010 16:01:53 +0200 - - -opsi-template (1.0-18) stable; urgency=low - * bug fix in the successful request (comment out) - -opsi-template (1.0-17) stable; urgency=low - - * bug fix in delsub.ins : deleting a shortcut from AllUsers desktop - - -- detlef oertel Mon, 28 Sep 2009 16:01:53 +0200 - -opsi-template (1.0-16) stable; urgency=low - - * Added some examples for other installers - * Some cleanups - * More examples in other sections - - -- Jan Schneider Fri, 18 Sep 2009 13:01:53 +0200 - -opsi-template (1.0-15) stable; urgency=low - - * bugfix for delopsi-template - - -- Rupert Roeder Mon, 06 Jun 2009 11:15:00 +0100 - -opsi-template (1.0-14) stable; urgency=low - - * bugfix for delopsi-template - - -- Rupert Roeder Tue, 26 May 2009 11:15:00 +0100 - -opsi-template (1.0-13) stable; urgency=low - - * some corrections - - -- Rupert Roeder Tue, 26 May 2009 11:15:00 +0100 - -opsi-template (1.0-12) stable; urgency=low - - * code for license management added - - -- Rupert Roeder Tue, 19 May 2009 11:15:00 +0100 - -opsi-template (1.0-11) stable; urgency=low - - * sub_check_exitcode modified - * sub_check_exitcode 1641 added - * sub_check_exitcode integrated in delsub.ins - - -- Detlef Oertel Mon, 18 May 2009 14:15:00 +0100 - -opsi-template (1.0-10) stable; urgency=low - - * modified test on exit code added 3010 success restart required - -- bardo wolf - -opsi-template (1.0-9) stable; urgency=low - - * renamed from softprod to opsi-template - * added test on exit code - - -- Detlef Oertel Fri, 13 Mar 2009 12:35:32 +0100 - -opsi-template (1.0-8) stable; urgency=low - - * comment Anweisungen - * delsub: - Section: Files_uninstall - ;something like (don't forget the trailing backslash) - ;delete -sf "$InstallDir$\" - - -- Detlef Oertel Wed, 5 Nov 2008 17:00:00 +0100 - - - diff --git a/sample/source/4.0.2/opsi-template/OPSI/postinst b/sample/source/4.0.2/opsi-template/OPSI/postinst deleted file mode 100644 index a8e33fc..0000000 --- a/sample/source/4.0.2/opsi-template/OPSI/postinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# postinst script for softprod -# This script executes after unpacking files from that archive and registering the product at the server. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory which contains the installed client data -# diff --git a/sample/source/4.0.2/opsi-template/OPSI/preinst b/sample/source/4.0.2/opsi-template/OPSI/preinst deleted file mode 100644 index 15a5320..0000000 --- a/sample/source/4.0.2/opsi-template/OPSI/preinst +++ /dev/null @@ -1,9 +0,0 @@ -#! /bin/sh -# -# preinst script for softprod -# This script executes before that package will be unpacked from its archive file. -# -# The following environment variables can be used to obtain information about the current installation: -# PRODUCT_ID: id of the current product -# CLIENT_DATA_DIR: directory where client data will be installed -#

Inno Setup is a popular program +for making software installations. Unfortunately, there is no official unpacker - the +only method of getting the files out of the self-extracting executable +is to run it. One piece of software that addresses this issue is Sergei +Wanin's InstallExplorer, +a plug-in for the FAR Manager that unpacks +several types of installations, including Inno Setup (IS). But since it is not updated in a +timely fashion, and so does not support the latest IS most of the time, this program was born. +The advantages over InstallExplorer are: