# Developer Guide - General Information This guide will introduce you on how to write custom PowerShell modules (described as Icinga for Windows components) and how certain aspects of the architecture work. ## PowerShell Module Architecture Each single PowerShell module has to be installed inside a module directory of Windows. You can view a list of current available locations by using `$Env:PSModulePath`. By default, we are going to use the directory `C:\Program Files\WindowsPowerShell\Modules`. ### Folder Structure To create a new module, you can create a custom folder within the PowerShell module folder. This folder is the namespace of your module and is required for later creating the `RootModule` and `Manifest`. Within your module folder, you are free to create as many sub-directories as you want and place script and module files there, which are shipped and used by your module. ### Manifest And RootModule To provide all basic information, you will require to create at least a `Manifest` file, which has the file ending `.psd1`. The name of the file has to match the folder name you choose as namespace for your module in the previous section. Our `RootModule` is using the file ending `.psm1` and can use the same name as your folder, but is not required to, as long as a valid `.psd1` file is present. Within our manifest, we can define the path on where the `.psm1` can be found. ### Nested Modules While writing your own module, you will add additional code and possible different files to your project. By adding additional `.psm1` files for easier loading of functions, we can use the `NestedModules` attribute within our `.psd1` file, to add them to our known module list. Please note that it is only required to use the relative path, starting with `.\` to use the root directory of your module as base. Lets assume we have the following file structure: ```text module |_ plugin.psd1 |_ plugin.psm1 |_ provider |_ custom_provider.psm1 |_ plugin |_ custom_plugin.psm1 ``` In this case, our `NestedModules` variable within our `.psd1` file requires the following values ```powershell NestedModules = @( '.\provider\custom_provider.psm1', '.\provider\custom_plugin.psm1' ) ``` ## Using Icinga for Windows Dev Tools Maintaining the entire structure above seems to be complicated at the beginning, especially when considering to update the `NestedModules` section whenever you make changes. To mitigate this, Icinga for Windows provides a bunch of Cmdlets to help with the process ### Create New Components To create new components, you can use the command `New-IcingaForWindowsComponent`. It will create a new PowerShell module inside the same module directory, were you installed the Framework itself. The command ships with a bunch of configurations to modify the created `.psd1` in addition, with a different author, copyright, and so on. the most important arguments how ever are `Name` and `ComponentType`. | Argument | Type | Description | | --- | --- | --- | | Name | String | The name of your Icinga for Windows component. This will create a new module in the following syntax: `icinga-powershell-{name}` | | ComponentType | String | The type of component you want to create for Icinga for Windows with different base-modules and code available to get started quickly. Available types: `plugins`, `apiendpoint`, `daemon`, `library` | | OpenInEditor | Switch | Will directly open the module after creation inside an editor for editing | ### Publish/Update Components Once you have started to write your own code, you can use the Cmdlet `Publish-IcingaForWindowsComponent` to update the `NestedModules` attribute inside the `.psd1` file automatically, including the documentation in case the module is of type plugin. In addition, you ca create a `.zip` file for this module which can be integrated directly into the [Repository Manager](..\120-Repository-Manager\01-Add-Repositories.md). By default, created `.zip` files will be created in your home folder, the path can how ever be changed while executing the command. | Argument | Type | Description | | --- | --- | --- | | Name | String | The name of your Icinga for Windows component to update information from | | ReleasePackagePath | String | The path on where the `.zip` file will be created in. Defaults to the current users home folder | | CreateReleasePackage | Switch | This will toggle the `.zip` file creation of the specified package | ### Testing Your Component In order to validate if your module can be loaded and is working properly, you can use the command `Test-IcingaForWindowsComponent`. In addition to an import check, it will also validate the code styling and give you an overview if and how many issues there are with your code. By default, only a summary of possible issues is added to the output, you can how ever use an argument flag to print a list of possible found issues, allowing you to resolve them more easily. | Argument | Type | Description | | --- | --- | --- | | Name | String | The name of your Icinga for Windows component to test | | ShowIssues | Switch | Prints a list of all possible found issues into the console | ### Open Components A quick and easy way for opening components inside an editor is to use the command `Open-IcingaForWindowsComponentInEditor`. You simply require to specify the name of the component and the editor is opening. At the moment, only [Visual Studio Code](https://code.visualstudio.com/) is supported. More editors will follow in the future. | Argument | Type | Description | | --- | --- | --- | | Name | String | The name of your Icinga for Windows component to open | | Editor | String | Allows to specify, which editor the component should be opened with. Supported values: `code` |