# Example of deployment scripts

The deployment can be divided into several steps:

  • the installation of the application;
  • the installation of the Outlook plugin (optional);
  • the creation of accounts.

WARNING

Environment variables vary between 32-bit and 64-bit versions of Windows.

# Installation of the application:

# Required when running with administrator rights.
cd %~dp0

# Seald's installation on the station in a silent way
Seald-Setup-1.0.0.exe /allusers /S

# Creation of the Seald configuration directory.
mkdir %APPDATA%\Seald\

# Adding the essential configuration after a program installation.
echo {"autoUpdate": "disable", "windowsRegistry": "READ_ONLY"} > %APPDATA%\Seald\config.json

# Installing the Outlook plugin:

TIP

The environment variable %CommonProgramFiles% must be replaced by %CommonProgramFiles(X86)% if the version of Outlook is in 64 bits.

# Required when running with administrator rights.
cd %~dp0

# Adding the Seald signature certificate
certutil -addstore TRUSTEDPUBLISHER "plugin-cert.cer"

# Installation of plugin prerequisites
.\vstor_redist.exe Setup /q /norestart #Installing VSTO redistributable
.\NDP472-KB4054530-x86-x64-x86-x64-AllOS-ENU.exe Setup /q /norestart # Installing.NET 4.7

# Plugin installation
# %CommonProgramFiles% if Outlook 32 bits. %CommonProgramFiles(X86)% if Outlook 64 bits
"%CommonProgramFiles%\Microsoft Shared\VSTO\10.0\VSTOInstaller.exe" /s /I https://api.seald.io/outlook-v2/SealdOutlookPlugin.vsto # silent installation command for the outlook plugin

# Smart Assistant rules deployment

It is possible to deploy a custom rule file for the Smart Assistant using the following command:

copy new-rules.js %APPDATA%\Seald\rules.js

TIP

For more information on writing and deploying the rule file, refer to this page

TIP

To activate the rules programmatically, refer to the plugin configuration help.

# Create an account and launch:

TIP

The environment variable %ProgramFiles% must be replaced by %ProgramFilesX86% if the version of Windows is in 64 bits.

# Create an account. 
cd %ProgramFiles%\Seald
seald-cli create-account -d "Tim" -e tim@seald.io --email-validation 5f32fdb5-cb1d-4b1b-b981-d35f75e9376c:1b4e5537890f92cce85d86df22eergerg4 --accept-licence --force --accept-backup-keys

# Launch the application. The first argument (empty string) allows the process not to be stopped at the end of this script
start "" "%ProgramFiles%\Seald\Seald.exe"

# Example of account creation script generation

This snippet script was written for Node.js 14 LTS, and is based on the csv@5.3.2 package in addition to the standard library. Adjustments are certainly necessary depending on the target environment:

const csv = require('csv')
const fs = require('fs')
const { promisify } = require('util')
const crypto = require('crypto')
const path = require('path')

const csvPath = './mails.csv' // CSV with the "Display name" in the first colum, and the "Email address" in the second column, separated with ";"
const domainValidationKeyId = process.env.DOMAIN_ID
const domainValidationKey = process.env.DOMAIN_KEY
const outputDir = './out'

try {
  fs.rmdirSync(outputDir, { recursive: true })
} catch (err) {
  console.warn(err)
  console.warn('directory outputDir does not exist')
} finally {
  fs.mkdirSync(outputDir, { recursive: true })
}

const random = (size = 1000) => crypto.randomBytes(size)

const scrypt = (buff, salt) => new Promise((resolve, reject) => {
  crypto.scrypt(
    buff,
    salt,
    64, // 64 bytes for a 256 bits key (there is also a signing key for HMAC)
    { N: 16384, r: 8, p: 1 },
    (err, key) => {
      if (err) reject(err)
      else resolve(key)
    }
  )
})

const generate = async (email, domainValidationKeyId, domainValidationKey) => {
  const nonce = random(32).toString('hex')
  const token = (await scrypt(
    Buffer.from(`${email}-${domainValidationKey}`, 'utf8'),
    Buffer.from(nonce, 'utf8')
  )).toString('hex')
}

const makeScript = (displayName, emailAddress) =>
  `"%LOCALAPPDATA%\\Programs\\Seald\\Seald.exe" --headless create-account -d "${displayName.replace('"', '\\"')}" -e "${emailAddress.replace('"', '\\"')}" --email-validation ${generate(emailAddress, domainValidationKeyId, domainValidationKey)} --accept-backup-keys --accept-licence --force
start "" "%LOCALAPPDATA%\\Programs\\Seald\\Seald.exe"`

const main = async () => {
  const result = await promisify(csv.parse)(fs.readFileSync(csvPath), { delimiter: ';' })
  result.shift() // remove header
  for (const [displayName, emailAddress] of result) {
    // Writes indiviual script for each user to be executed on each machine
    fs.writeFileSync(path.join(outputDir, emailAddress + '.bat'), makeScript(displayName, emailAddress).replace('\n', '\r\n'))
  }
}

main()