NETSetup

Version: 0.7.0-proxmoxvms.1656

Branch: feature/proxmoxvms

Tag: Autodeployed

Release Date: 09/12/2025 16:39:37

NEWS

Date: 2025-07-03

Updated the Flow to include the future Flow for Liberators.

Purpose

NETSetup allows users to automatically (or automagically) setup and configure any number of machines (servers, client computers, laptops) in a given organisation from OS installation, to server configuration, to domain joining of client computers, to software installation, all according to a given NETSetup configuration file.

In other words: NETSetup translates an enterprise structure to a network configuration and sets up the network accordingly.

In a future revision a new machine will receive its NETSetup automatically during its OOBE experience ("Just plug it in!"™).

Step by Step Process

@startuml

'Actors
actor Customer
actor Agent as "Agent (public)"
actor Ticketing as "Ticketing (public)"
actor Accounting as "Accounting (private)"
actor NETSetup as "NETSetup (private)"
actor Supplier as "Supplier (Alltron)"
actor Provider as "Provider (Dropbox)"
actor Computer
actor SWVendor as "Software Vendor (Microsoft)"
actor HWVendor as "Hardware Vendor (HP)"

'Contact
Customer -> Agent: [[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/NETSetup/050%20Kontaktaufnahme/Kontaktaufnahme%20V1.1.adoc callAgent() -> new order]]
Agent -> Ticketing: [[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/NETSetup/050%20Kontaktaufnahme/Ticketverwaltung%20in%20Freshdesk.adoc createNETSetupTicket(order) -> new ticket]]
Ticketing -> Customer: notifyCustomer(ticket)

'Delta
Agent -> Customer: [[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/NETSetup/100%20Offerte/Offertprozess.adoc#ist-soll-analyse requestCurrentMode(ticket)]] -> ensureConfig(ticket.customer.currentMode)[[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/Templates/TemplateCompany.adoc Template Company]] [[https://github.com/osisa/NETSetup/tree/feature/proxmoxvms/src/NETSetup.Tests/TestInfrastructure/OfflineCompany.cs Example Code]]
Customer -> Agent: responseCurrentMode(ticket) -> updateConfig(updatedCurrentMode)
Agent -> Customer: requestFutureMode(updatedCurrentMode.config)
Customer -> Agent: responseFutureMode(updatedCurrentMode.config) -> futureMode.config

'Quote
Agent -> Accounting: [[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/NETSetup/100%20Offerte/Offertprozess.adoc#offerterstellung createQuote(updatedCurrentMode.config, futureMode.config) -> new quote]]
Accounting -> Agent: returnQuote(quote)
Agent -> Customer: sendQuote(quote)
Customer -> Agent: responseQuote(quote)

'Config
Agent -> Supplier: [[https://github.com/osisa/NETSetup/blob/feature/proxmoxvms/docs/NETSetup/230%20Beschaffung/Beschaffung.adoc createOrder(quote) -> new order]]
Supplier -> Agent: return order.Success
Agent -> NETSetup: [[https://github.com/osisa/NETSetup/tree/feature/proxmoxvms/src/NETSetup.Tests/Customers/TranslateCompanyToConfig.cs createConfigs(ticket, futureMode.config)]] -> new config[]
note over Agent, NETSetup: someConfig[] = { {HASTAG}ticket.json, ... }
NETSetup -> Provider: [[https://www.dropbox.com/home/NETSetup/BOOT/Config save config() ]]
Provider -> NETSetup: return save.Success
NETSetup -> Agent: return save.Success

newpage Old Prerequisite Steps
Supplier -> Agent: return order.HardwareHashes
Agent -> NETSetup: TODO: updateConfigs(ticket, hardwareHashes)
NETSetup -> Provider: TODO: updateConfigs(ticket, hardwareHashes)
Provider -> NETSetup: return update.Success
NETSetup -> Agent: return update.Success
Supplier -> Customer: [[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/300%20Auslieferung/Auslieferung.adoc deliverOrder(setup)]]
Agent -> NETSetup: [[https://github.com/osisa/NETSetup/tree/feature/proxmoxvms/input/NETSetupInstallUSB.adoc#NS-INSTALL-USB-CREATE-STICK Create NETSetup USB Stick]]
NETSetup -> Agent: NETSetup ready USB Stick

'Installation
loop For every computer
    Agent -> Computer: [[https://github.com/osisa/NETSetup/tree/feature/proxmoxvms/input/NETSetupInstall.adoc#NS-INSTALL-USB-USE-STICK plugIn(Power, USB Stick, Display, Keyboard)]]
    Agent -> Computer: turnOn()
    Agent -> Computer: hold(F9 or other key to get into Boot Menu)
    Agent -> Computer: select(USB Stick)

newpage New Liberator Flow


newpage NETSetup Setup Process
    Computer -> Computer: tries to boot
    alt Can boot NTFS Partition
        Computer -> Computer: Boots WinPE from NTFS Partition
    else Lacks NTFS Driver
        Computer -> Computer: Boots FAT32 NTFS Driver
        Computer -> Computer: Boots WinPE from NTFS Partition
    end
    Computer -> Computer: WinPE runs startnet.cmd
    Computer -> Computer: startnet.cmd searches every drive for autoexecute.ps1
    Computer -> Computer: cd to drive and run autoexecute.ps1
    Computer -> NETSetup: autoexecute.ps1 runs [[https://github.com/osisa/NETSetup/tree/feature/proxmoxvms/src/NETSetup/CLI/Commands/InstallCommand.cs NETSetup.exe install]]
    NETSetup -> Computer: logs NETSetup Version
    NETSetup -> Computer: os = GetOperatingSystem()
    NETSetup -> Computer: config = GetConfig()
    opt GetConfig()
        NETSetup -> Computer: register jsonSerializerOptions
        NETSetup -> Computer: isVirtualMachine?
        NETSetup -> Computer: isWinPE?
        NETSetup -> Computer: disks = GetAllDisksExceptUSB()
        NETSetup -> Computer: serialNumber = GetSerialNumber()
        NETSetup -> Computer: online = CheckOnline(timeout 10s)
        alt online
            NETSetup -> Computer: check for online map file
            note over Agent, NETSetup: foreach machine in config a map file. Nomenclature: SerialNumber#Ticket.json
            NETSetup -> Computer: download map file
            NETSetup -> Computer: check for single matching map file
        else
            NETSetup -> Computer: check for single matching map file
            NETSetup -> Computer: if no disks or not online -> try to install drivers
            NETSetup -> Computer: if is WinPE VM create temp partition
            NETSetup -> Computer: if no map file -> same check with online as before to get the config
            NETSetup -> Computer: if nothing is found, but there are configs locally -> UI select which
        end
    end
    alt os is WinPE
        NETSetup -> Computer: isOnline = CheckOnline
        NETSetup -> Computer: computer = GetComputer(config)
        NETSetup -> Computer: if no disk or not online -> try to install drivers
        NETSetup -> Computer: EnsureImage() - local check else download
        NETSetup -> Computer: installationDisk = GetDisk() - might require UI select disk
        alt operatingSystem.Contains(Windows)
            NETSetup -> Computer: CopyNETSetupFolderToImage(operatingSystem)
            NETSetup -> Computer: CurrentDirectory = Images\\operatingSystem
            NETSetup -> Computer: unattended = unattended.Replace(DISKID, targetDrive.Index)
            NETSetup -> Computer: StartProcess(setup.exe /unattend)
            NETSetup -> Computer: Reboot()
            Computer -> Computer: Boots Windows Setup from installationDisk
            Computer -> Computer: Windows auto setup via unattend.xml
            Computer -> Computer: Add scheduled Task to run NETSetup
            Computer -> Computer: Reboot()
            Computer -> Computer: Boots Windows from installationDisk
            Computer -> NETSetup: Run NETSetup
            NETSetup -> Computer: DomainJoin(currentConfig.Domain), ...
        else
            NETSetup -> Computer: installationDisk.CreateLinuxPartitions()
            NETSetup -> Computer: installationDisk.CopyEverythingToNewPartitions()
            NETSetup -> Computer: BIOS.DeactivateSecureBoot() #TODO
            NETSetup -> Computer: BIOS.DeactivateFastBoot() #TODO
            NETSetup -> Computer: BIOS.BootDriveFirst(targetDrive) #TODO
            NETSetup -> Computer: Reboot()
            Computer -> Computer: Boots GRUB Boot Manager
            Computer -> Computer: Boots Void Linux
            Computer -> Computer: Run /etc/profile
            Computer -> NETSetup: Run /efi/netsetup/autoexecute.sh
            NETSetup -> Computer: Partition Drive
            NETSetup -> Computer: Format Drive
            NETSetup -> Computer: Unpack Linux Image.tar.gz
            NETSetup -> Computer: Mount Image
            NETSetup -> Computer: Update BootEntry
            NETSetup -> Computer: Umount Image
            NETSetup -> Computer: Reboot()
        end
    end
end

newpage Approval and Billing
Agent -> Customer: [[https://github.com/osisa/NETSetup/tree/develop/docs/NETSetup/400%20Abnahme config.CreateApprovalForm())]]
Customer -> Agent: fillOut(config.approvalForm)
Agent -> Accounting: [[https://github.com/osisa/NETSetup/blob/develop/docs/Infobl%C3%A4tter/Software/Sage/Sage%20Start/Softwareinfoblatt%20Sage%20Start.adoc commissionBill(config)]]
Accounting -> Agent: returnBill(config.bill)
Agent -> Customer: sendBill(config.bill)
Customer -> Accounting: payBill(config.bill)
Accounting -> Agent: notify(config.bill.paid)
Agent -> Ticketing: closeTicket()

@enduml

NETSetup: Install using USB Stick

0. Requirements for Installation using NETSetup USB Stick

Read the entire Installation Instructions once from start to end before doing anything.

Target machine’s serial number has to be associated to a specific configuration. To do this goto the NETSetup.Tests Project and copy a customer file (e.g. Schnell.cs and at the bottom fill in all the details.The tests are supposed to be run in order to ensure the functionality of the configuration.One (by default ignored) test will upload the config files to the remote source, e.g. Dropbox).The most important methods are the ServerIP Range and the CreateCompany! (ALTERNATIVE to 1. for single Computers) Take #123.json from Dropbox and set the SerialNumber inside the desired type of Computer and ensure the {SerialNumber}#123.map File both exist.Copy them after creating the USB Stick in the NETSetup/Config Folder.

  1. Config has to be online of customer

  2. Physical access to the machine, which has internet cable, power, display and a keyboard connected.

  3. Press power button and hold the button labeled ESC until you see a menu

  4. Choose BIOS Setup / Computer Setup with arrow keys and press Enter

  5. Go through all Settings using the keys while looking for and setting the following settings (if you dont find the name, skip). In the end goto File > Save Changes and Exit and confirm yes and shutdown Machine with power button after reboot:

    • Secure Boot Configuration > Legacy Support / CSM / MBR Boot Disabled

    • USB / Removable Media Boot enabled

    • Secure Boot Configuration > Fast Boot Disabled

    • For Liberator VTx (Virtualization) Enabled

    • For Liberator Secure Boot Configuration > Secure Boot Disabled

    • For Liberator Boot Order > Push all entries with "USB" to the bottom

  6. A USB Stick of at least 16 GB (This USB Stick will be formatted and all data on it will be lost).

  7. Goto your existing Personal Computer and login with an Administrator

  8. Precondition: Chocolatey

  9. Press Win and X and open Terminal (Administrator) and confirm

  10. write the following into the box and press Enter:

choco install rufus -y
  1. Download this file from the documentation and (optionally) verify the correctness by: pressing right click on the file and copy path, type the following in the box "Get-FileHash" press space and right click and enter. If the the text is the same its correct.

76B350EC29B06B66F862BA5D231E6DD321637AC00C2BD4A1C1382B0D6F3447AF

1. Making the USB Stick

  1. Plug in your USB Stick to your computer

  2. Press Win and R and type "rufus" and press enter and confirm

  3. Select your USB Stick from the list at the top "Laufwerk" (Drive):

Select drive
  1. Click the "AUSWAHL" (SELECT) button and select the "NETSetup.iso" file from your Downloads folder.

Select image
  1. Make sure that the following Items are set as expected:

    • "Partitionsschema" is set to "GPT"

    • "Zielsystem" is set to "UEFI (ohne CSM)"

    • "Dateisystem" is set to "NTFS"

Proper settings
  1. Click the "START" button.

Start button
  1. Rufus might show you a warning. Click "OK" to confirm that all existing data on the stick will be deleted.

Warning
  1. Wait for the green progress bar at the bottom of the program to fill. This is a good time to get a cup of coffee.

Progress
  1. Rufus will show the text "FERTIG" (FINISHED) in the filled progress bar once it is done. You can unplug and use the NETSetup USB Stick now, and you can close rufus.

Done

2. Using the Install USB Stick

  1. Plug the USB Stick in the target machine on the back side (directly into the motherboard and not a front header USB).

  2. Power on the machine and hold down the F9 key (or a different one depending on your machine to enter the boot menu, refer to your manufacturers manual) until you enter the boot menu.

  3. Use the arrow keys to select USB. If you have multiple USB shows up, pick the topmost occurence and press enter

  4. If it asks you to select something, type the answer using the keyboard and press enter.

  5. Wait for the installation to finish, it reboots several times

For Liberator (or other linux based system) enter the Boot Menu 2 times and boot the disk and not the USB Stick

Note: If you’re setting up a new Windows Server Domain/AD, wait for the server to finish all its tasks before installing the clients. ~30min should be enough for reasonably up-to-date hardware. Connect the new machines to the LAN and boot them the same way with the USB Stick from before or a different one that has been made the same way

Workaround for Liberator Use this to setup machines on Liberator

3. USB Stick Troubleshooting

  • I cant boot the USB Stick. Check that UEFI Boot is enabled and NOT CSM/MBR BOOT!!!

  • I get an error while creating the USB stick:

    => Ensure that the USB stick is working and that it has enough space.
  • I cannot enter the boot menu:

    => <<BIOS-SETTINGS,Disable "Fast Boot">> in the BIOS. Consult Google if you are unsure on how to do this.
  • The NETSetup fails unexpectedly:

    => Ensure that you have the correct version of NETSetup.iso file (check the SHA-256 hash).
    => Make sure you follow the directions in <<Using the USB Stick>> correctly and ensure that the target machine's serial number is correctly registered in the config.
  • Windows Server installation fails:

    => Windows Server installation REQUIRES to be connected to an ethernet environment (a router is enough, it doesn't have to be a complete internet-activated environment with multiple machines). If there is no response on the ethernet port while installing, Windows Server will not install and setup ethernet and it will fail.

Executable (Advanced Functions)

SHA-256 Hash of NETSetup.exe:
Unresolved directive in NETSetup.adoc - include::NETSetup.exe.SHA256.adoc[]

Usage

NETSetup.exe can install and configure aspects of a given machine. During a regular NETSetup installation it need not be downloaded seperately. The executable is provided here for advanced users.

Use "NETSetup.exe [command]" with one of the following commands:

  • ensure-file --file <filename> --dir <directory>:
    Ensures that the file <filename> exists in the directory <directory>. If it does not yet exist, it will be downloaded from dropbox. Root for the --file parameter is Dropbox:\NETSetup\boot

  • ensure-folder --folder <foldername> --dir <directory>:
    Ensures that the folder <foldername> with all its contents exists in the directory <directory>. If it does not yet exist, it will be downloaded from dropbox. Root for the --folder parameter is Dropbox:\NETSetup\boot

  • install Requires <driveroot>\NETSetup\config\config.json to be present, where <driveroot> is the current drive’s drive letter. Looks in <driveroot>\NETSetup\config\config.json for a configuration matching the machine’s serial number and uses it to update the machine to match the machine’s configuration (OS, software, domain, etc.).

  • set-ip --ip <ipaddress> --netmask <netmask> --gateway <geteway> --dns <dns>:
    Sets the machine’s ip address to <ip-address> and changes netmask, gateway and dns to the entries provided.

  • join-domain --domain <domain> --user <username> --password <password>:
    Tries to join the machine to the domain <domain> with the user <username> and its password <password>. The user must include the NETBios-domain (e.g. osisa\user.name)

  • get-id: Gets the machin’s BIOS serial number (SMBIOS).

  • get-md5 --file <filename>:
    Gets the md5 hash of the file <filename>.

  • get-sha --file <filename>:
    Gets the sha256 hash of the file <filename>.

  • get-crc --file <filename>:
    Gets the crc-32 hash of the file <filename>.

  • check-sha --file <filename> --sha <checksum>:
    Checks that the sha256 checksum of the file <filename> matches the provides <checksum>

  • reboot-oobe [--force [1|true]]: Reboots the machine to the OOBE environment after confirmation. Optionally use "--force 1" to skip confirmation. WARNING: Once the machine is in OOBE environment, the entire process must be finished before you can return to the regular desktop.

  • rename --name <name> [--force [1|true]]:
    Renames the machine to <name>. Asks for confirmation unless "--force 1" is specified. WARNING: Using this while joined to a domain will mess up your system because the AD entry of your machine is not updated to match the new name. Leaving the domain will then be impossible because (presumably) no computer with the new name <name> exists in the domain.

  • wlan --ssid <ssid> --password <password>:
    Tries to connect your wifi to the ntwork with the SSID <ssid> using the password <password>.

Examples:

.\NETSetup.exe set-ip --ip 192.168.1.123 --netmask 255.255.255.0 --gateway 192.168.1.1 --dns 8.8.8.8
.\NETSetup.exe get-sha c:\temp\document.docx
.\NETSetup.exe wlan --ssid swisscom --password abcd-1234-efgh-5678-ijkl
.\NETSetup.exe install

Developer Info

When you push changes to the NETSetup repository, the corresponding Git Action tests, builds, and updates the executable and the ISO-Image automatically.

The entrypoint for the executable is CLI/NETSetup.cs/Main(). There it adds all the commands to the application.

The Install command is in CLI/Commands/InstallCommand.cs

You can create an offline ISO with "__main__.cs > [TestMethod] CreateOffline"

If Offline Install ensure Image, Drivers and Config are copied onto USB Stick. If singular computer ensure the Config and MapFile as described in Requirements

Linux Notes

Install Pimox

  1. Download Raspbian Lite image

  2. Download PI Imager

  3. Need SD Card

  4. Flash Raspbian Lite image to SD Card using PI Imager

  5. u need to copy the files from Dropbox IMAGES Pimox to the SD Card inside the folder netsetup, if it does not exist, create it

  6. plug the SD Card into your Raspberry Pi and boot it

  7. run the following scripts in order:

sudo /netsetup/upgrade.sh
EDIT, eg with nano /netsetup/pimox-SERIALNUMBER.config # see notes below for details
sudo /netsetup/install.sh

WSL Notes / Pimox install Notes

  • Open SD Card inside WSL

sudo mkdir /mnt/sdcard -p
sudo mount -t drvfs 'SDCARDDRIVELETTER:' /mnt/sdcard
  • I recommend using nvim or nano as editors

sudo apt install nvim nano -y
  • You maybe need to link the SDCARD/netsetup folder, booted its under firmware, thus do:

sudo ln -sf /boot/firmware/netsetup /netsetup
  • Before being able to run any script in linux, set the permissions to be writeable by the owner and executable by everyone with

sudo chmod 755 /mnt/sdcard/path/to/script.sh
# i added a script to do that for all scripts in /netsetup
cat /netsetup/chmod-all.sh | sudo bash
  • To get the serial number of your Raspberry Pi, when booting, read the very first line: "board: rev …​ serial SERIALNUMBER …​", to reread the logs run:

cat /proc/cpuinfo | grep Serial
  • To install using the scripts, first upgrade your pi, then modify the config file, then run the install script

sudo /netsetup/upgrade.sh
nano /netsetup/pimox-SERIALNUMBER.config
sudo /netsetup/install.sh

How to work with Tarballs / Images

  • 1 to create tarball on source machine (booted):

sudo tar -czlpPf /mnt/backup/system.tar.gz --numeric-owner --preserve-permissions --acls --xattrs --one-file-system /
  • 2 to unpack the tarball

mkdir extracted -p & sudo tar --no-mknod --numeric-owner --preserve-permissions --acls --xattrs --one-file-system -xzpPf proxmox.tar.gz -C extracted
  • 3 switch into the os

sudo chroot extracted
  • 4 to repack the tarball

 sudo tar -czlpPf proxmox.tar.gz extracted/ && rm -rf extracted/

How to work with SquashFS images & Void Linux Loader

  • 1 if not yet make new folder /mnt

mkdir /mnt -p
  • 2 unsquash

unsquashfs -x -f squashfs.img LiveOS/ext3fs.img -d void
  • 3 mount image locally to mnt/void

sudo mount -o loop squashfs-root/LiveOS/ext3fs.img /mnt/void
  • 4 modify files on the image, eg:

sudo nvim /mnt/void/etc/profile
  • 5 or even enter the image as if you booted it with

sudo chroot /mnt/void
  • 6 unmount when done

sudo umount /mnt/void
  • 7 delete the previous file to ensure no error there

sudo rm squashfs.img
  • 8 and then repack the image

sudo mksquashfs squashfs-root squashfs.img

only good way to style bash shell / terminal btw

export PS1="[ \[\e[31m\]\u\[\e[m\]@\[\e[36m\]\H\[\e[m\]: \[\e[33m\]\w\[\e[m\] ] \[\e[36m\]\t\[\e[m\] \[\e[31m\]\\$\[\e[m\] "

osisa NETSetup Master

where what

What is NETSetup

NETSetup is a collection of processes and tools to run any aspect of an IT Company. It provides processes to onboard employees handling support cases, provide a process to get information from what the customer needs, to offering, ordering, implementing and supporting whole network infrastructures.

Purpose of this document

This is the starting root of all NETSetup o.s.i.s.a. documentations. Working through this documentation will provide any user of NETSetup with sufficent information to run the NETSetup proccess.

Pre-requisites to work with this documentation

Technologies to be used in NETSetup v3.0

These technologies are to be used in NETSetup 3.0:

  • Fileserver, Mailserver, Firewall, Webserver via Proxmox

  • File storage will use IPFS (interplanetary filesystem)

  • Name resolution will use IPNS (interplanetary nameserver)

  • Every business has a database with OrbitDB (Database with IPFS), local backups should exist

  • Software distribution will happen with our own "IPIS" (interplanetary Installation server)

    • This will also include our NETBase

    • When all this works, we should be able to "get rid" of our financial accounnting software because this will happen automatically

      • Eventually, the automated accounting will use wallets instead of bank accounts

Our business uses three main Repositories:

  • NETSetup: This repo is concerned with installing an OS / getting a computer up and running

  • NETBase: This repo contains all our business logic

  • Laufentaler: This repo contains the currency we intend to use in the future

Further read

Step by step guide on how to install Windows using osisa NETSetup HERE (gh Pages) and HERE (gh Pages source) and HERE (old documentation)

How to register a device in Autopilot

How to install KMULine

How To install Dropbox

How To update Alltron product data

How To assure the correct set up of a new development machine

How To create new GitHub Repository

addition from release 0.6.0

Osisa NETSetup Diagram

Explanation of terms:

Config: Whole customer configuration (unique per customer)

Setup: Specific Version of a customer hardware/workstation setup

Ensure Item: Either locate existing item or create new item

@startuml
!pragma teoz true



'Actors



'Customer Box

box Customer #lightyellow
actor Customer
end box

'Osisa Box

box osisa #lightblue
actor "Agent (public)" as Agent
actor "Ticketing (public)" as Ticketing
actor "Accounting (private)" as Accounting
actor "NETSetup (private)" as NETSetup
end box

'Suppliers Box

box Suppliers #lightgreen
actor "Supplier (Alltron)" as Supplier
actor "Software Vendor (Microsoft)" as SWVendor
actor "Hardware Vendor (HP)" as HWVendor
end box



'Variables



'Contact and Ticket

!$callAgent = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/050%20Kontaktaufnahme/Kontaktaufnahme%20V1.1.adoc callAgent() -> new order]]"
!$createTicket = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/050%20Kontaktaufnahme/Ticketverwaltung%20in%20Freshdesk.adoc createNETSetupTicket(order) -> new ticket]]"
!$notifyCustomer = "notifyCustomer(ticket)"

'Quote Process

!$requestCurrentMode = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/100%20Offerte/Offertprozess.adoc#ist-soll-analyse requestCurrentMode(ticket) -> ensure(ticket.customer) config<currentMode> ]]"
!$responseCurrentMode = "responseCurrentMode(ticket) -> update config<updatedCurrentMode>"
!$requestFutureMode = "requestFutureMode(config<updatedCurrentMode>)"
!$responseFutureMode = "responseFutureMode(config<updatedCurrentMode>) -> config<futureMode>"
!$createQuote = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/100%20Offerte/Offertprozess.adoc#offerterstellung createQuote(config<updatedCurrentMode>, config<futureMode>) -> new quote]]"
!$returnQuote = "returnQuote(quote)"
!$sendQuote = "sendQuote(quote)"
!$responseQuote = "responseQuote(quote)"

'Order Process

!$createOrder = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/230%20Beschaffung/Beschaffung.adoc createOrder(quote) -> new order]]"
!$confirmOrder = "confirmOrder(order)"
!$updateCustomer = "updateCustomer(customer)"
!$registerCustomer = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/250%20Setup/Kundenerfassung%20in%20NETSetup-Datenbank.adoc registerCustomer(databaseEntry<newCustomer>) -> new customer]]"
!$createSetup = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/250%20Setup/Softwareinfoblatt%20NETSetup-Datenbank.adoc createSetup(config<futureMode>) -> new setup]]"
!$returnSetup = "returnSetup(setup)"
!$deliverOrder = "deliverOrder(setup)"

'Setup Process Server

!$plugInServer = "plugInServer(setup)"
!$configureRaid = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/250%20Setup/Installation%20Server.adoc#festplatten-installieren-und-raid-konfigurieren configureRaid()]]"
!$setUpServer = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/250%20Setup/Installation%20Server.adoc#aufsetzen-per-netsetup setUpServer(setup)]]"
!$configureServer = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/250%20Setup/Installation%20Server.adoc#konfiguration configureServer()]]"
!$setUpFirewall = "firewallSetup()"
!$setUpAccessPoints = "accesspointsSetup()"

'Setup Process Client

!$plugInClient = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup.adoc plugInHardware(setup)]]"
!$registerHash = "registerHardwareHash(setup)"
!$rebootClient = "reboot(setup)"
!$requestLogin = "requestLogin()"
!$login = "login()"
!$osSetup = "[[https://github.com/osisa/NETSetup/tree/develop/NETSetup.WinPEBoot TargetOSSetup(setup)]]"
!$domainJoin = "domainJoin(setup)"

'Last Steps

!$backupCheck = "targetBackupCheck()"
!$backupRecoveryTest = "targetBackupRecoveryTest()"
!$backupSelfTest = "targetBackupSelfTest()"
!$requestCablingProtocol = "networkCablingMeasurementRequest(Protocol)"
!$returnCablingProtocol = "return(Protocol)"
!$validateCablingProtocol = "ProtocolValidate()"
!$setDeliveryDate = "setTicketDeliveryDate(setup.deliveryDate)"
!$deliverMaterial = "[[https://github.com/osisa/NETSetup/blob/develop/docs/NETSetup/300%20Auslieferung/Auslieferung.adoc deliverOrder]](setup and [[https://github.com/osisa/NETSetup/tree/develop/docs/NETSetup/400%20Abnahme setup.approvalForm]], training material and awareness test)"
!$fillOutMaterial = "fillOut(setup.approvalForm and awareness test)"

'Billing and Ending

!$comissionBill = "[[https://github.com/osisa/NETSetup/blob/develop/docs/Infobl%C3%A4tter/Software/Sage/Sage%20Start/Softwareinfoblatt%20Sage%20Start.adoc commissionBill(setup)]]"
!$returnBill = "returnBill(setup.bill)"
!$sendBill = "sendBill(setup.bill)"
!$payBill = "payBill(setup.bill)"
!$notifyAccounting = "notify(setup.bill.paid())"
!$closeTicket = "closeTicket()"



'Netsetup Diagram for Client
== Netsetup Diagram for Client ==



'Contact and Ticket

Customer -> Agent : $callAgent
Agent -> Ticketing : $createTicket
Ticketing -> Customer : $notifyCustomer

'Quote Process

Agent -> Customer : $requestCurrentMode
Customer -> Agent : $responseCurrentMode
group If customer not\nSatisfied: repeat
Agent -> Customer : $requestFutureMode
Customer -> Agent : $responseFutureMode
Agent -> Accounting : $createQuote
Accounting -> Agent : $returnQuote
Agent -> Customer : $sendQuote
Customer -> Agent : $responseQuote
end

'Order Process

Agent -> Supplier : $createOrder
Supplier -> Agent : $confirmOrder
alt if customer is already registered:
Agent -> NETSetup : $updateCustomer
else else
Agent -> NETSetup: $registerCustomer
end
Agent -> NETSetup : $createSetup
NETSetup -> Agent : $returnSetup
Supplier -> Customer : $deliverOrder

'Setup Process Client

loop for n clients do
Agent -> Agent: $plugInClient
Agent -> SWVendor : $registerHash
Agent -> SWVendor : $rebootClient
SWVendor -> Agent: $requestLogin
Agent -> SWVendor : $login
SWVendor -[#red]> Agent: $osSetup
Agent -> Agent : $domainJoin
end

'Last Steps

Agent -> Agent : $backupCheck
Agent -> Agent : $backupRecoveryTest
Agent -> Agent : $backupSelfTest
Agent -> Customer : $requestCablingProtocol
Customer -> Agent : $returnCablingProtocol
Agent -> Agent : $validateCablingProtocol
Agent -> Ticketing : $setDeliveryDate
Agent -> Customer : $deliverMaterial
Customer -> Agent : $fillOutMaterial

'Billing and Ending

Agent -> Accounting : $comissionBill
Accounting -> Agent : $returnBill
Agent -> Customer : $sendBill
Customer -> Accounting : $payBill
Accounting -> Agent : $notifyAccounting
Agent -> Ticketing : $closeTicket



'NETSetup Diagram for Network (Client + Server)
== Diagram for Network (Client + Server) ==



'Contact and Ticket

Customer -> Agent : $callAgent
Agent -> Ticketing : $createTicket
Ticketing -> Customer : $notifyCustomer

'Quote Process

Agent -> Customer : $requestCurrentMode
Customer -> Agent : $responseCurrentMode
group If customer not\nSatisfied: repeat
Agent -> Customer : $requestFutureMode
Customer -> Agent : $responseFutureMode
Agent -> Accounting : $createQuote
Accounting -> Agent : $returnQuote
Agent -> Customer : $sendQuote
Customer -> Agent : $responseQuote
end

'Order Process

Agent -> Supplier : $createOrder
Supplier -> Agent : $confirmOrder
alt if customer is already registered:
Agent -> NETSetup : $updateCustomer
else else
Agent -> NETSetup: $registerCustomer
end
Agent -> NETSetup : $createSetup
NETSetup -> Agent : $returnSetup
Supplier -> Customer : $deliverOrder

'Setup Process Server

Agent -> Agent : $plugInServer
Agent -> Agent : $configureRaid
Agent -> NETSetup : $setUpServer
Agent -> Agent : $configureServer
Agent -> Agent : $setUpFirewall
Agent -> Agent : $setUpAccessPoints

'Setup Process Client

loop for n clients do
Agent -> Agent: $plugInClient
Agent -> SWVendor : $registerHash
Agent -> SWVendor : $rebootClient
SWVendor -> Agent: $requestLogin
Agent -> SWVendor : $login
SWVendor -[#red]> Agent: $osSetup
Agent -> Agent : $domainJoin
end

'Last Steps

Agent -> Agent : $backupCheck
Agent -> Agent : $backupRecoveryTest
Agent -> Agent : $backupSelfTest
Agent -> Customer : $requestCablingProtocol
Customer -> Agent : $returnCablingProtocol
Agent -> Agent : $validateCablingProtocol
Agent -> Ticketing : $setDeliveryDate
Agent -> Customer : $deliverMaterial
Customer -> Agent : $fillOutMaterial

'Billing and Ending

Agent -> Accounting : $comissionBill
Accounting -> Agent : $returnBill
Agent -> Customer : $sendBill
Customer -> Accounting : $payBill
Accounting -> Agent : $notifyAccounting
Agent -> Ticketing : $closeTicket

@enduml



@enduml

Steps required to setup a fresh development machine

---

setup using netsetup

(you might need mermaid-cli aka mmdc, npm install -g @mermaid-js/mermaid-cli, and add "%USERPROFILE%\AppData\Roaming\npm" to path)

set-executionpolicy -executionpolicy bypass -scope localmachine -force

Set-ExecutionPolicy Bypass -Scope Process -Force; iex New-Object System.Net.WebClient).DownloadString('http://netsetupprod.osisa.com:8080/install.ps1'

choco source add --name=netsetup --source=http://netsetupprod.osisa.com:8080/chocolatey

cinst -y firefox git git-lfs vscode chocolateygui 7zip dotnetcore dotnet dropbox googlechrome infoniqaonestart2023_00 kmuline netsetupdb notepadplusplus office365netsetup teamviewer teams vlc windirstat asciidocfx putty ruby

2-machine firewall rdp wallpaper vpnToConfiguredVPNServer(connection to domain controller)

install-language en-us

set-winuilanguageoverride en-us

$LanguageList = Get-WinUserLanguageList ; $LanguageList.Add("en-US") ; $firstLang = $LanguageList[0].LanguageTag ; $LanguageList[0] = $LanguageList[-1] ; $LanguageList[-1] = $firstLang ; Set-WinUserLanguageList $LanguageList -force

set-ItemProperty -Path "REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "dontdisplaylastusername" -Value 1

set-ItemProperty -Path "REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "PromptOnSecureDesktop" -Value 0

set-ItemProperty -Path "REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "shutdownwithoutlogin" -Value 0

set-ItemProperty -Path "REGISTRY::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "ConsentPromptBehaviorAdmin" -Value "0"

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System" -Name "LocalAccountTokenFilterPolicy" -Value 1

Get-NetConnectionProfile | ForEach-Object { Set-NetConnectionProfile -NetworkCategory Private -Name $.Name Set-NetConnectionProfile -NetworkDiscoveryEnabled true -Name $.Name }

[System.Environment]::SetEnvironmentVariable('DOTNET_ENVIRONMENT','Development',[System.EnvironmentVariableTarget]::Machine)

[System.Environment]::SetEnvironmentVariable('MSBuildEnableWorkloadResolver','true',[System.EnvironmentVariableTarget]::Machine)

[System.Environment]::SetEnvironmentVariable('MSDOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLE','false',[System.EnvironmentVariableTarget]::Machine)

git config --global --add safe.directory /git/

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All

reboot

domain join

login as your user (must be an admin)

3-user

dotnet nuget remove source github

dotnet nuget add source --name github "https://nuget.pkg.github.com/osisa/index.json" -u soeren.maske@osisa.com -p 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 --store-password-in-clear-text

"./nuget.exe setapikey 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 -Source github"

dotnet tool install --global GitVersion.Tool

dotnet tool install --global gpr

dotnet tool install --global netbase.build --prerelease --no-cache

dotnet tool update --global netbase.build --prerelease --no-cache

gem install asciidoctor

gem install asciidoctor-diagram

asciidoctor -r asciidoctor-diagram -a diagrams docs/ghpages.adoc

Windows SDK

add newest win to path, eg C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64

Windows ADK Windows EDK

Install-Module -Name OpenSSL


systemmanagement.contracts

-> isoftware
-> icomputer
-> iuser

usermanagement.contracts

-> irole
-> igroup
-> imembership
-> idomain

human.contracts

-> icontact
-> inaturalperson
-> iperson

localization.contracts

-> ilocale
-> itimezone

enterprise.contracts

-> icompany
-> iorganizationalunit
-> iemployee
-> icustomer
-> isupplier
-> idevice
-> itask
-> iservice

netsetup.contracts

-> inetsetupsoftware [new: packagename]
-> inetsetupcontact [new: naturalperson]
-> inetsetupcustomer [new: conclusionDate,
							documentationLink]
-> inetsetupmanageduser [new: associated computers]
-> inetsetupdomain [new: groups replaced with functionality groups,
						computer list,
						contact list replaces person list]
-> iconfig has domain, contacts, software

BSP

funcionality = accounting

accounting.softwareversion[0] = infoniqa v2023

accounting.softwareversion[1] = office 365

accounting.membership[0] = remo.oser [role: head]