diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 52b73cb..ee7d76a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,30 +1,22 @@ +stages: + - test + - release + variables: GIT_SSL_NO_VERIFY: "true" ErrorActionPreference: STOP - -before_script: - - Get-PackageProvider -Name NuGet -ForceBootstrap | Out-Null - - Install-Module InvokeBuild, BuildHelpers, PSScriptAnalyzer -force -AllowClobber - - Install-Module Pester -Force -SkipPublisherCheck - - Import-Module PSScriptAnalyzer -stages: - - test -# - release - -ps_scriptanalyzer: +Test: stage: test - script: - - $res = (Invoke-ScriptAnalyzer -Path . -Severity Error).count - - if ($res -gt 0) { throw "$($res) Analytics failed."} - tags: - - powershell + script: + - .\build.ps1 -Tasks 'test' + except: + - master + +Release: + stage: release + script: + - .\build.ps1 -Tasks 'test','release' + only: + - master -# except: -# - master -#Release: -# stage: release -# script: -# - .\build.ps1 -Tasks 'analyze','test','release' -# only: -# - master \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..8f51e52 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,33 @@ +{ + "version": "0.2.0", + "configurations": [{ + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Pester Tests", + "script": "Invoke-Pester", + "args": [], + "cwd": "${workspaceRoot}" + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Launch (current file)", + "script": "${file}", + "args": [], + "cwd": "${file}" + }, + { + "type": "PowerShell", + "request": "attach", + "name": "PowerShell Attach to Host Process", + "processId": "${command.PickPSHostProcess}", + "runspaceId": 1 + }, + { + "type": "PowerShell", + "request": "launch", + "name": "PowerShell Interactive Session", + "cwd": "${workspaceRoot}" + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f8222de --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,15 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.encoding": "utf8", + "files.eol": "\r\n", + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "editor.tabSize": 4, + "[markdown]": { + "editor.wordwrap": "on", + "editor.renderWhitespace": "all", + "editor.acceptSuggestionOnEnter": false, + "editor.rulers": [80], + "editor.trimAutoWhitespace": false + } +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..602228b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,56 @@ +// Available variables which can be used inside of strings. +// ${workspaceRoot}: the root folder of the team +// ${file}: the current opened file +// ${relativeFile}: the current opened file relative to workspaceRoot +// ${fileBasename}: the current opened file's basename +// ${fileDirname}: the current opened file's dirname +// ${fileExtname}: the current opened file's extension +// ${cwd}: the current working directory of the spawned process +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + // Start PowerShell + "windows": { + "command": "${env:windir}\\sysnative\\windowspowershell\\v1.0\\PowerShell.exe", + "args": [ + "-NoProfile", + "-ExecutionPolicy", + "Bypass" + ] + }, + "linux": { + "command": "/usr/bin/powershell", + "args": [ + "-NoProfile" + ] + }, + "osx": { + "command": "/usr/local/bin/powershell", + "args": [ + "-NoProfile" + ] + }, + // Show the output window always + "showOutput": "always", + // Associate with test task runner + "tasks": [{ + "taskName": "Build Help", + "suppressTaskName": true, + "args": [ + "Write-Host 'Invoking platyPS'; New-ExternalHelp -Path .\\docs\\en-US -OutputPath .\\ConfluencePS\\en-US -Force;", + "Invoke-Command { Write-Host 'Completed Build task in task runner.' }" + ] + }, + { + "taskName": "Test", + "suppressTaskName": true, + "isTestCommand": true, + "args": [ + "Write-Host 'Invoking Pester'; Invoke-Pester -PesterOption @{IncludeVSCodeMarker=$true};", + "Invoke-Command { Write-Host 'Completed Test task in task runner.' }" + ], + "problemMatcher": "$pester" + } + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..5dc4d10 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/), +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [1.0] - 2017-11-18 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2894d0f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Brian Bunke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..2b5ce8e --- /dev/null +++ b/README.md @@ -0,0 +1,30 @@ +[![GitHub release](https://img.shields.io/github/release/snazy2000/SnipeitPS.svg)](https://github.com/snazy2000/snipeitps/releases/latest) [![Build status](https://ci.appveyor.com/api/projects/status/dvuw4ggx543nx3h7/branch/master?svg=true)](https://ci.appveyor.com/project/snazy2000/snipeitps/branch/master) [![PowerShell Gallery](https://img.shields.io/powershellgallery/dt/snipeitps.svg)](https://www.powershellgallery.com/packages/snipeitps) ![License](https://img.shields.io/badge/license-MIT-blue.svg) + +--- + +## Instructions + +### Installation + +Install SnipeitPS from the PowerShell Gallery `Install-Module` requires PowerShellGet (included in PS v5, or download for v3/v4 via the gallery link) + +```powershell +# One time only install: (requires an admin PowerShell window) +Install-Module SnipeitPS + +# Check for updates occasionally: +Update-Module SnipeitPS + +# To use each session: +Import-Module SnipeitPS +Set-Info -URL 'https://asset.example.com' -apiKey 'tokenKey' +``` + +### Usage + +```powershell +# Review the help at any time! +Get-Help about_SnipeitPS +Get-Command -Module SnipeitPS +Get-Help Get-Asset -Full # or any other command +``` diff --git a/SnipeItPS.build.ps1 b/SnipeItPS.build.ps1 index cfc84e5..5bbf1b5 100644 --- a/SnipeItPS.build.ps1 +++ b/SnipeItPS.build.ps1 @@ -10,22 +10,122 @@ if ($PSBoundParameters.ContainsKey('Verbose')) { if (!($env:releasePath)) { $releasePath = "$BuildRoot\Release" } -else { +elseif ($env:releasePath) { $releasePath = $env:releasePath } +else { + $releasePath = "$($pwd.Path)\Release" +} $env:PSModulePath = "$($env:PSModulePath);$releasePath" +Import-Module BuildHelpers # Ensure Invoke-Build works in the most strict mode. Set-StrictMode -Version Latest +# region debug information +task ShowDebug { + Write-Build Gray + Write-Build Gray ('Project name: {0}' -f $env:APPVEYOR_PROJECT_NAME) + Write-Build Gray ('Project root: {0}' -f $env:APPVEYOR_BUILD_FOLDER) + Write-Build Gray ('Repo name: {0}' -f $env:APPVEYOR_REPO_NAME) + Write-Build Gray ('Branch: {0}' -f $env:APPVEYOR_REPO_BRANCH) + Write-Build Gray ('Commit: {0}' -f $env:APPVEYOR_REPO_COMMIT) + Write-Build Gray (' - Author: {0}' -f $env:APPVEYOR_REPO_COMMIT_AUTHOR) + Write-Build Gray (' - Time: {0}' -f $env:APPVEYOR_REPO_COMMIT_TIMESTAMP) + Write-Build Gray (' - Message: {0}' -f $env:APPVEYOR_REPO_COMMIT_MESSAGE) + Write-Build Gray (' - Extended message: {0}' -f $env:APPVEYOR_REPO_COMMIT_MESSAGE_EXTENDED) + Write-Build Gray ('Pull request number: {0}' -f $env:APPVEYOR_PULL_REQUEST_NUMBER) + Write-Build Gray ('Pull request title: {0}' -f $env:APPVEYOR_PULL_REQUEST_TITLE) + Write-Build Gray ('AppVeyor build ID: {0}' -f $env:APPVEYOR_BUILD_ID) + Write-Build Gray ('AppVeyor build number: {0}' -f $env:APPVEYOR_BUILD_NUMBER) + Write-Build Gray ('AppVeyor build version: {0}' -f $env:APPVEYOR_BUILD_VERSION) + Write-Build Gray ('AppVeyor job ID: {0}' -f $env:APPVEYOR_JOB_ID) + Write-Build Gray ('Build triggered from tag? {0}' -f $env:APPVEYOR_REPO_TAG) + Write-Build Gray (' - Tag name: {0}' -f $env:APPVEYOR_REPO_TAG_NAME) + Write-Build Gray ('PowerShell version: {0}' -f $PSVersionTable.PSVersion.ToString()) + Write-Build Gray +} + +# Synopsis: Install pandoc to .\Tools\ +task InstallPandoc -If (-not (Test-Path Tools\pandoc.exe)) { + # Setup + if (-not (Test-Path "$BuildRoot\Tools")) { + $null = New-Item -Path "$BuildRoot\Tools" -ItemType Directory + } + + # Get latest bits + $latestRelease = "https://github.com/jgm/pandoc/releases/download/1.19.2.1/pandoc-1.19.2.1-windows.msi" + Invoke-WebRequest -Uri $latestRelease -OutFile "$($env:temp)\pandoc.msi" + + # Extract bits + $null = New-Item -Path $env:temp\pandoc -ItemType Directory -Force + Start-Process -Wait -FilePath msiexec.exe -ArgumentList " /qn /a `"$($env:temp)\pandoc.msi`" targetdir=`"$($env:temp)\pandoc\`"" + + # Move to Tools folder + Copy-Item -Path "$($env:temp)\pandoc\Pandoc\pandoc.exe" -Destination "$BuildRoot\Tools\" + Copy-Item -Path "$($env:temp)\pandoc\Pandoc\pandoc-citeproc.exe" -Destination "$BuildRoot\Tools\" + + # Clean + Remove-Item -Path "$($env:temp)\pandoc" -Recurse -Force +} +# endregion + +# region test +task Test RapidTest + +# Synopsis: Using the "Fast" Test Suit +task RapidTest PesterTests +# Synopsis: Using the complete Test Suit, which includes all supported Powershell versions +task FullTest TestVersions + +# Synopsis: Warn about not empty git status if .git exists. +task GitStatus -If (Test-Path .git) { + $status = exec { git status -s } + if ($status) { + Write-Warning "Git status: $($status -join ', ')" + } +} + +task TestVersions TestPS3, TestPS4, TestPS4, TestPS5 +task TestPS3 { + exec {powershell.exe -Version 3 -NoProfile Invoke-Build PesterTests} +} +task TestPS4 { + exec {powershell.exe -Version 4 -NoProfile Invoke-Build PesterTests} +} +task TestPS5 { + exec {powershell.exe -Version 5 -NoProfile Invoke-Build PesterTests} +} + +# Synopsis: Invoke Pester Tests +task PesterTests CreateHelp, { + try { + $result = Invoke-Pester -PassThru -OutputFile "$BuildRoot\TestResult.xml" -OutputFormat "NUnitXml" + if ($env:APPVEYOR_PROJECT_NAME) { + Add-TestResultToAppveyor -TestFile "$BuildRoot\TestResult.xml" + Remove-Item "$BuildRoot\TestResult.xml" -Force + } + assert ($result.FailedCount -eq 0) "$($result.FailedCount) Pester test(s) failed." + } + catch { + throw + } +} +# endregion # region build # Synopsis: Build shippable release -task Build GenerateRelease, UpdateManifest +task Build GenerateRelease, ConvertMarkdown, UpdateManifest + +task CreateHelp { + Import-Module platyPS -Force + New-ExternalHelp -Path "$BuildRoot\docs" -OutputPath "$BuildRoot\SnipeitPS\en-US" -Force + Remove-Module SnipeitPS, platyPS +} # Synopsis: Generate .\Release structure -task GenerateRelease { +task GenerateRelease CreateHelp, { # Setup if (-not (Test-Path "$releasePath\SnipeitPS")) { $null = New-Item -Path "$releasePath\SnipeitPS" -ItemType Directory @@ -34,26 +134,19 @@ task GenerateRelease { # Copy module Copy-Item -Path "$BuildRoot\SnipeitPS\*" -Destination "$releasePath\SnipeitPS" -Recurse -Force # Copy additional files - <#$additionalFiles = @( + $additionalFiles = @( "$BuildRoot\CHANGELOG.md" "$BuildRoot\LICENSE" "$BuildRoot\README.md" ) - Copy-Item -Path $additionalFiles -Destination "$releasePath\SnipeitPS" -Force#> + Copy-Item -Path $additionalFiles -Destination "$releasePath\SnipeitPS" -Force } # Synopsis: Update the manifest of the module task UpdateManifest GetVersion, { - $ModuleAlias = (Get-Alias | Where source -eq JiraPS) - - Remove-Module JiraPS -ErrorAction SilentlyContinue - Import-Module "$releasePath\SnipeitPS\SnipeitPS.psd1" Update-Metadata -Path "$releasePath\SnipeitPS\SnipeitPS.psd1" -PropertyName ModuleVersion -Value $script:Version - # Update-Metadata -Path "$releasePath\SnipeitPS\SnipeitPS.psd1" -PropertyName FileList -Value (Get-ChildItem $releasePath\SnipeitPS -Recurse).Name - if ($ModuleAlias) { - Update-Metadata -Path "$releasePath\SnipeitPS\SnipeitPS.psd1" -PropertyName AliasesToExport -Value @($ModuleAlias.Name) - } - Set-ModuleFunctions -Name "$releasePath\SnipeitPS\SnipeitPS.psd1" -FunctionsToExport ([string[]](Get-ChildItem "$releasePath\SnipeitPS\public\*.ps1").BaseName) + $functionsToExport = Get-ChildItem "$BuildRoot\SnipeitPS\Public" | ForEach-Object {$_.BaseName} + Set-ModuleFunctions -Name "$releasePath\SnipeitPS\SnipeitPS.psd1" -FunctionsToExport $functionsToExport } task GetVersion { @@ -74,22 +167,74 @@ task GetVersion { $newRevision } +# Synopsis: Convert markdown files to HTML. +# +$ConvertMarkdown = @{ + Inputs = { Get-ChildItem "$releasePath\SnipeitPS\*.md" -Recurse } + Outputs = {process { + [System.IO.Path]::ChangeExtension($_, 'htm') + } + } +} +# Synopsis: Converts *.md and *.markdown files to *.htm +task ConvertMarkdown -Partial @ConvertMarkdown InstallPandoc, {process { + exec { Tools\pandoc.exe $_ --standalone --from=markdown_github "--output=$2" } + } +}, RemoveMarkdownFiles +# endregion +# region publish +task Deploy -If ( + # Only deploy if the master branch changes + $env:APPVEYOR_REPO_BRANCH -eq 'master' -and + # Do not deploy if this is a pull request (because it hasn't been approved yet) + (-not ($env:APPVEYOR_PULL_REQUEST_NUMBER)) -and + # Do not deploy if the commit contains the string "skip-deploy" + # Meant for major/minor version publishes with a .0 build/patch version (like 2.1.0) + $env:APPVEYOR_REPO_COMMIT_MESSAGE -notlike '*skip-deploy*' +) { + Remove-Module SnipeitPS -ErrorAction SilentlyContinue +}, PublishToGallery + +task PublishToGallery { + assert ($env:PSGalleryAPIKey) "No key for the PSGallery" + + Import-Module $releasePath\SnipeitPS\SnipeitPS.psd1 -ErrorAction Stop + Publish-Module -Name SnipeitPS -NuGetApiKey $env:PSGalleryAPIKey +} + +# Synopsis: Push with a version tag. +task PushRelease GitStatus, GetVersion, { + # Done in appveyor.yml with deploy provider. + # This is needed, as I don't know how to athenticate (2-factor) in here. + exec { git checkout master } + $changes = exec { git status --short } + assert (!$changes) "Please, commit changes." + + exec { git push } + exec { git tag -a "v$Version" -m "v$Version" } + exec { git push origin "v$Version" } +} # endregion #region Cleaning tasks task Clean RemoveGeneratedFiles + # Synopsis: Remove generated and temp files. task RemoveGeneratedFiles { $itemsToRemove = @( 'Release' '*.htm' 'TestResult.xml' + 'SnipeitPS\en-US\*' ) Remove-Item $itemsToRemove -Force -Recurse -ErrorAction 0 } +task RemoveMarkdownFiles { + Remove-Item "$releasePath\SnipeitPS\*.md" -Force -ErrorAction 0 +} +# endregion - -task . Build, Clean \ No newline at end of file +task . ShowDebug, Clean, Test, Build, Deploy diff --git a/SnipeitPS/Private/ConvertTo-GetParameter.ps1 b/SnipeitPS/Private/ConvertTo-GetParameter.ps1 new file mode 100644 index 0000000..e0f31c9 --- /dev/null +++ b/SnipeitPS/Private/ConvertTo-GetParameter.ps1 @@ -0,0 +1,26 @@ +function ConvertTo-GetParameter { + <# + .SYNOPSIS + Generate the GET parameter string for an URL from a hashtable + #> + [CmdletBinding()] + param ( + [Parameter( Position = 0, Mandatory = $true, ValueFromPipeline = $true )] + [hashtable]$InputObject + ) + + BEGIN { + [string]$parameters = "?" + } + + PROCESS { + Write-Verbose "[$($MyInvocation.MyCommand.Name)] Making HTTP get parameter string out of a hashtable" + foreach ($key in $InputObject.Keys) { + $parameters += "$key=$($InputObject[$key])&" + } + } + + END { + $parameters -replace ".$" + } +} \ No newline at end of file diff --git a/SnipeitPS/Private/Invoke-Method.psm1 b/SnipeitPS/Private/Invoke-SnipeitMethod.ps1 similarity index 89% rename from SnipeitPS/Private/Invoke-Method.psm1 rename to SnipeitPS/Private/Invoke-SnipeitMethod.ps1 index ab49489..f340fa6 100644 --- a/SnipeitPS/Private/Invoke-Method.psm1 +++ b/SnipeitPS/Private/Invoke-SnipeitMethod.ps1 @@ -1,4 +1,4 @@ -function Invoke-Method { +function Invoke-SnipeitMethod { <# .SYNOPSIS Extracted invokation of the REST method to own function. @@ -19,7 +19,11 @@ [ValidateNotNullOrEmpty()] [string]$Body, - [string] $Token + [string] $Token, + + # GET Parameters + [Hashtable]$GetParameters + ) BEGIN { @@ -38,6 +42,14 @@ } Process { + if ($GetParameters -and ($URi -notlike "*\?*")) + { + Write-Debug "Using `$GetParameters: $($GetParameters | Out-String)" + [string]$URI += (ConvertTo-GetParameter $GetParameters) + # Prevent recursive appends + $GetParameters = $null + } + # set mandatory parameters $splatParameters = @{ Uri = $URi @@ -74,7 +86,7 @@ # API returned a Content: lets work wit it $response = ConvertFrom-Json -InputObject $webResponse.Content - + if ($response.status -eq "error") { Write-Verbose "[$($MyInvocation.MyCommand.Name)] An error response was received from; resolving" # This could be handled nicely in an function such as: @@ -83,14 +95,14 @@ } else { $result = $response - if (($response) -and ($response | Get-Member -Name payload)) + if (($response) -and ($response | Get-Member -Name payload)) { $result = $response.payload } elseif (($response) -and ($response | Get-Member -Name rows)) { $result = $response.rows } - + $result } } @@ -99,7 +111,7 @@ # This could be wanted behavior of the API Write-Verbose "[$($MyInvocation.MyCommand.Name)] No content was returned from." } - + } else { Write-Verbose "[$($MyInvocation.MyCommand.Name)] No Web result object was returned from. This is unusual!" @@ -109,4 +121,4 @@ END { Write-Verbose "[$($MyInvocation.MyCommand.Name)] Function ended" } -} \ No newline at end of file +} diff --git a/SnipeitPS/Public/Assets.psm1 b/SnipeitPS/Public/Assets.psm1 deleted file mode 100644 index 8b695f6..0000000 --- a/SnipeitPS/Public/Assets.psm1 +++ /dev/null @@ -1,144 +0,0 @@ -<# -.SYNOPSIS -# Gets a list of Snipe-it Assets - -.PARAMETER url -URL of Snipeit system, can be set using Set-Info command - -.PARAMETER apiKey -Users API Key for Snipeit, can be set using Set-Info command - -.EXAMPLE -Get-Asset -url "https://assets.dip.co.uk" -token "token..." - -.EXAMPLE -Get-Asset -url "https://assets.dip.co.uk" -token "token..." | Where-Object {$_.name -eq "SUPPORT23" } - -#> - -function Get-Asset() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/hardware" ` - -Method GET ` - -Token $apiKey - - $result -} - -function New-Asset() -{ - Param( - [parameter(mandatory=$true)] - [string]$Name, - - [parameter(mandatory=$true)] - [string]$Status_id, - - [parameter(mandatory=$true)] - [string]$Model_id, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey, - - [hashtable] $customfields - ) - - $Values = @{ - "name" = $Name - "status_id" = $status_id - "model_id" = $model_id - } - - $Values += $customfields - - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/hardware" ` - -Method POST ` - -Body $Body ` - -Token $apiKey - - $result -} - -function Set-Asset() -{ - Param( - [parameter(mandatory=$true)] - [int]$id, - - [parameter(mandatory=$true)] - [string]$Name, - - [parameter(mandatory=$true)] - [string]$Status_id, - - [parameter(mandatory=$true)] - [string]$Model_id, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey, - - [hashtable] $customfields - ) - - $Values = @{ - "name" = $Name - "status_id" = $status_id - "model_id" = $model_id - } - - $Values += $customfields - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/hardware/$id" ` - -Method PUT ` - -Body $Body ` - -Token $apiKey - - $result -} - -function Set-AssetOwner() -{ - Param( - [parameter(mandatory=$true)] - [int]$id, - - [parameter(mandatory=$true)] - [int]$user_id, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $Values = @{ - "user_id" = $user_id - } - - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -Uri "$url/api/v1/hardware/$id/checkout" ` - -Method POST ` - -Token $apiKey ` - -Body $Body - - return $result -} diff --git a/SnipeitPS/Public/Categories.psm1 b/SnipeitPS/Public/Categories.psm1 deleted file mode 100644 index 31fc78a..0000000 --- a/SnipeitPS/Public/Categories.psm1 +++ /dev/null @@ -1,16 +0,0 @@ -function Get-Categories() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/categories" ` - -Method GET ` - -Token $apiKey - - $result -} diff --git a/SnipeitPS/Public/Components.psm1 b/SnipeitPS/Public/Components.psm1 deleted file mode 100644 index 1b2e785..0000000 --- a/SnipeitPS/Public/Components.psm1 +++ /dev/null @@ -1,102 +0,0 @@ -function Get-Component() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/components" ` - -Method GET ` - -Token $apiKey - - $result -} - -function New-Component() -{ - Param( - [parameter(mandatory=$true)] - [string]$name, - - [parameter(mandatory=$true)] - [string]$category_id, - - [parameter(mandatory=$true)] - [string]$qty, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $Values = @{ - "name" = $name - "category_id" = $category_id - "qty" = $qty - } - - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/components" ` - -Method POST ` - -Body $Body ` - -Token $apiKey - - $result -} - -function Update-Component() -{ - Param( - [parameter(mandatory=$true)] - [string]$id, - - [parameter(mandatory=$true)] - [string]$qty, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $Values = @{ - "qty" = $qty - } - - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/components/$component_id" ` - -Method Patch ` - -Body $Body ` - -Token $apiKey - - $result -} - -<# -Checkout does not exsit yet :( - -function Checkout-Component($component_id, $asset_id = "") -{ - $Values = @{ - "asset_id" = $asset_id - } - - $Body = $Values | ConvertTo-Json; - - $Manufacturers = Invoke-RestMethod -Uri "http://assets.dip.co.uk/api/v1/hardware/$component_id/checkout" ` - -Method Post ` - -Header $headers ` - -Body $Body ` - -ContentType "application/json" ` - -UserAgent "DI Script/0.1" - - return $Manufacturers -}#> \ No newline at end of file diff --git a/SnipeitPS/Public/Get-Asset.ps1 b/SnipeitPS/Public/Get-Asset.ps1 new file mode 100644 index 0000000..4eb0e2d --- /dev/null +++ b/SnipeitPS/Public/Get-Asset.ps1 @@ -0,0 +1,44 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Assets + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Asset -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Asset -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "MyMachine" } + +#> + +function Get-Asset() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/hardware" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} + + + + + + diff --git a/SnipeitPS/Public/Get-Category.ps1 b/SnipeitPS/Public/Get-Category.ps1 new file mode 100644 index 0000000..0b11baa --- /dev/null +++ b/SnipeitPS/Public/Get-Category.ps1 @@ -0,0 +1,38 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Categories + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Category -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Category -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Laptop" } + +#> + +function Get-Category() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/categories" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Get-Component.ps1 b/SnipeitPS/Public/Get-Component.ps1 new file mode 100644 index 0000000..bb985f7 --- /dev/null +++ b/SnipeitPS/Public/Get-Component.ps1 @@ -0,0 +1,38 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Components + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Component -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Component -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Memory" } + +#> + +function Get-Component() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/components" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Get-Manufacturer.ps1 b/SnipeitPS/Public/Get-Manufacturer.ps1 new file mode 100644 index 0000000..fb06d4f --- /dev/null +++ b/SnipeitPS/Public/Get-Manufacturer.ps1 @@ -0,0 +1,38 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Manufacturers + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Manufacturer -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Manufacturer -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "HP" } + +#> + +function Get-Manufacturer() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/manufacturers" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Get-Model.ps1 b/SnipeitPS/Public/Get-Model.ps1 new file mode 100644 index 0000000..f531107 --- /dev/null +++ b/SnipeitPS/Public/Get-Model.ps1 @@ -0,0 +1,38 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Models + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Models -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Models -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "DL380" } + +#> + +function Get-Model() +{ + Param( + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/models" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Get-Status.ps1 b/SnipeitPS/Public/Get-Status.ps1 new file mode 100644 index 0000000..948a9b3 --- /dev/null +++ b/SnipeitPS/Public/Get-Status.ps1 @@ -0,0 +1,38 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Status Labels + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Status -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Status -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Ready to Deploy" } + +#> + +function Get-Status() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/statuslabels" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Get-Supplier.ps1 b/SnipeitPS/Public/Get-Supplier.ps1 new file mode 100644 index 0000000..8c8a0c4 --- /dev/null +++ b/SnipeitPS/Public/Get-Supplier.ps1 @@ -0,0 +1,39 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Suppliers + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-Supplier -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-Supplier -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "MySupplier" } + +#> + +function Get-Supplier() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/suppliers" + Method = 'Get' + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} + diff --git a/SnipeitPS/Public/Get-User.ps1 b/SnipeitPS/Public/Get-User.ps1 new file mode 100644 index 0000000..a11a455 --- /dev/null +++ b/SnipeitPS/Public/Get-User.ps1 @@ -0,0 +1,40 @@ +<# +.SYNOPSIS +# Gets a list of Snipe-it Users + +.PARAMETER url +URL of Snipeit system, can be set using Set-Info command + +.PARAMETER apiKey +Users API Key for Snipeit, can be set using Set-Info command + +.EXAMPLE +Get-User -url "https://assets.example.com" -token "token..." + +.EXAMPLE +Get-User -url "https://assets.example.com" -token "token..." | Where-Object {$_.username -eq "stephenm" } + +#> +function Get-User() +{ + Param( + [parameter(mandatory=$true)] + [string]$url, + + [parameter(mandatory=$true)] + [string]$apiKey + ) + + $Parameters = @{ + Uri = "$url/api/v1/users" + Method = 'Get' + GetParameters = @{ + limit = 999 + } + Token = $apiKey + } + + $result = Invoke-SnipeitMethod @Parameters + + $result +} diff --git a/SnipeitPS/Public/Manufacturers.psm1 b/SnipeitPS/Public/Manufacturers.psm1 deleted file mode 100644 index 410c5bd..0000000 --- a/SnipeitPS/Public/Manufacturers.psm1 +++ /dev/null @@ -1,45 +0,0 @@ -function Get-Manufacturers() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/manufacturers" ` - -Method GET ` - -Token $apiKey - - $result -} - -function New-Manufacturer() -{ - Param( - [parameter(mandatory=$true)] - [string]$Name, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - - $Values = @{ - "name" = $Name - } - - #Convert Values to JSON format - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/manufacturers" ` - -Method POST ` - -Body $Body ` - -Token $apiKey - - $result -} \ No newline at end of file diff --git a/SnipeitPS/Public/Models.psm1 b/SnipeitPS/Public/Models.psm1 deleted file mode 100644 index b7e39b7..0000000 --- a/SnipeitPS/Public/Models.psm1 +++ /dev/null @@ -1,57 +0,0 @@ - -function Get-Models() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/models" ` - -Method GET ` - -Token $apiKey - - $result -} - - -function New-Model() -{ - Param( - [parameter(mandatory=$true)] - [string]$name, - - [parameter(mandatory=$true)] - [int]$category_id, - - [parameter(mandatory=$true)] - [int]$manufacturer_id, - - [parameter(mandatory=$true)] - [int]$fieldset_id, - - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $Values = @{ - name = $name - category_id = $category_id - manufacturer_id = $manufacturer_id - fieldset_id = $fieldset_id - } - - $Body = $Values | ConvertTo-Json; - - $result = Invoke-Method -URi "$url/api/v1/models" ` - -Method POST ` - -Body $Body ` - -Token $apiKey - - $result -} \ No newline at end of file diff --git a/SnipeitPS/Public/New-Asset.ps1 b/SnipeitPS/Public/New-Asset.ps1 new file mode 100644 index 0000000..e6a8876 --- /dev/null +++ b/SnipeitPS/Public/New-Asset.ps1 @@ -0,0 +1,95 @@ +<# + .SYNOPSIS + Add a new Asset to Snipe-it asset system + + .DESCRIPTION + Long description + + .PARAMETER Tag + Asset Tag for the Asset + + .PARAMETER Name + Name of the Asset + + .PARAMETER Status_id + Status ID of the asset, this can be got using Get-Status + + .PARAMETER Model_id + Model ID of the asset, this can be got using Get-Model + + .PARAMETER url + URL of Snipeit system, can be set using Set-Info command + + .PARAMETER apiKey + Users API Key for Snipeit, can be set using Set-Info command + + .PARAMETER customfields + Hastable of custom fields and extra fields that need passing through to Snipeit + + .EXAMPLE + New-Asset -status_id 1 -model_id 1 -name "Machine1" + + .EXAMPLE + New-Asset -status_id 1 -model_id 1 -name "Machine1" -CustomValues = @{ "_snipeit_os_5 = "Windows 10 Pro" } +#> + +function New-Asset() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [string]$tag, + + [parameter(mandatory = $true)] + [string]$Name, + + [parameter(mandatory = $true)] + [string]$Status_id, + + [parameter(mandatory = $true)] + [string]$Model_id, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey, + + [hashtable] $customfields + ) + + $Values = @{ + "name" = $Name + "status_id" = $status_id + "model_id" = $model_id + } + + if ($PSBoundParameters.ContainsKey('tag')) + { + $Values += @{"asset_tag" = $tag} + } + + if ($customfields) + { + $Values += $customfields + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/hardware" + Method = 'Post' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} diff --git a/SnipeitPS/Public/New-Component.ps1 b/SnipeitPS/Public/New-Component.ps1 new file mode 100644 index 0000000..7105811 --- /dev/null +++ b/SnipeitPS/Public/New-Component.ps1 @@ -0,0 +1,76 @@ +<# + .SYNOPSIS + Short description + + .DESCRIPTION + Long description + + .PARAMETER name + Parameter description + + .PARAMETER category_id + Parameter description + + .PARAMETER qty + Parameter description + + .PARAMETER url + Parameter description + + .PARAMETER apiKey + Parameter description + + .EXAMPLE + An example + + .NOTES + General notes +#> + +function New-Component() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [string]$name, + + [parameter(mandatory = $true)] + [string]$category_id, + + [parameter(mandatory = $true)] + [string]$qty, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + $Values = @{ + "name" = $name + "category_id" = $category_id + "qty" = $qty + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/components" + Method = 'POST' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} + diff --git a/SnipeitPS/Public/New-Manufacturer.ps1 b/SnipeitPS/Public/New-Manufacturer.ps1 new file mode 100644 index 0000000..b198a60 --- /dev/null +++ b/SnipeitPS/Public/New-Manufacturer.ps1 @@ -0,0 +1,60 @@ +<# + .SYNOPSIS + Add a new Manufacturer to Snipe-it asset system + + .DESCRIPTION + Long description + + .PARAMETER Name + Name of the Manufacturer + + .PARAMETER url + URL of Snipeit system, can be set using Set-Info command + + .PARAMETER apiKey + Users API Key for Snipeit, can be set using Set-Info command + + .EXAMPLE + New-Manufacturer -name "HP" +#> + +function New-Manufacturer() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [string]$Name, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + + $Values = @{ + "name" = $Name + } + + #Convert Values to JSON format + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/manufacturers" + Method = 'post' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} diff --git a/SnipeitPS/Public/New-Model.ps1 b/SnipeitPS/Public/New-Model.ps1 new file mode 100644 index 0000000..c7a5067 --- /dev/null +++ b/SnipeitPS/Public/New-Model.ps1 @@ -0,0 +1,79 @@ +<# + .SYNOPSIS + Add a new Model to Snipe-it asset system + + .DESCRIPTION + Long description + + .PARAMETER name + Name of the Asset Model + + .PARAMETER category_id + Category ID that the asset belongs to this can be got using Get-Category + + .PARAMETER manufacturer_id + Manufacturer ID that the asset belongs to this can be got using Get-Manufacturer + + .PARAMETER fieldset_id + Fieldset ID that the asset uses (Custom fields) + + .PARAMETER url + URL of Snipeit system, can be set using Set-Info command + + .PARAMETER apiKey + Users API Key for Snipeit, can be set using Set-Info command + + .EXAMPLE + New-Model -name "DL380" -manufacturer_id 2 -fieldset_id 2 -category_id 1 +#> + +function New-Model() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [string]$name, + + [parameter(mandatory = $true)] + [int]$category_id, + + [parameter(mandatory = $true)] + [int]$manufacturer_id, + + [parameter(mandatory = $true)] + [int]$fieldset_id, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + $Values = @{ + name = $name + category_id = $category_id + manufacturer_id = $manufacturer_id + fieldset_id = $fieldset_id + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/models" + Method = 'post' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} diff --git a/SnipeitPS/Public/Set-Asset.ps1 b/SnipeitPS/Public/Set-Asset.ps1 new file mode 100644 index 0000000..a53391a --- /dev/null +++ b/SnipeitPS/Public/Set-Asset.ps1 @@ -0,0 +1,91 @@ +<# + .SYNOPSIS + Update a Asset in the Snipe-it asset system + + .DESCRIPTION + Long description + + .PARAMETER id + ID of the Asset + + .PARAMETER Name + Name of the Asset + + .PARAMETER Status_id + Status ID of the asset, this can be got using Get-Status + + .PARAMETER Model_id + Model ID of the asset, this can be got using Get-Model + + .PARAMETER url + URL of Snipeit system, can be set using Set-Info command + + .PARAMETER apiKey + Users API Key for Snipeit, can be set using Set-Info command + + .PARAMETER customfields + Hastable of custom fields and extra fields that need passing through to Snipeit + + .EXAMPLE + Set-Asset -id 1 -status_id 1 -model_id 1 -name "Machine1" + + .EXAMPLE + Set-Asset -id 1 -status_id 1 -model_id 1 -name "Machine1" -CustomValues = @{ "_snipeit_os_5 = "Windows 10 Pro" } +#> + +function Set-Asset() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [int]$id, + + [parameter(mandatory = $true)] + [string]$Name, + + [parameter(mandatory = $true)] + [string]$Status_id, + + [parameter(mandatory = $true)] + [string]$Model_id, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey, + + [hashtable] $customfields + ) + + $Values = @{ + "name" = $Name + "status_id" = $status_id + "model_id" = $model_id + } + + if ($customfields) + { + $Values += $customfields + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/hardware/$id" + Method = 'Put' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} diff --git a/SnipeitPS/Public/Set-AssetOwner.ps1 b/SnipeitPS/Public/Set-AssetOwner.ps1 new file mode 100644 index 0000000..44d792e --- /dev/null +++ b/SnipeitPS/Public/Set-AssetOwner.ps1 @@ -0,0 +1,52 @@ +function Set-AssetOwner() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [int]$id, + + [parameter(mandatory = $true)] + [int]$assigned_id, + + [ValidateSet("location","asset","user")] + [string] $checkout_to_type = "user", + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + $Values = @{ + "id" = $assigned_id + "checkout_to_type" = $checkout_to_type + } + + switch ($checkout_to_type) + { + 'location' { $Values += @{ "assigned_location" = $assigned_id } } + 'user' { $Values += @{ "assigned_user" = $assigned_id } } + 'asset' { $Values += @{ "assigned_asset" = $assigned_id } } + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/hardware/$id/checkout" + Method = 'POST' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + return $result +} diff --git a/SnipeitPS/Public/Set-Components.ps1 b/SnipeitPS/Public/Set-Components.ps1 new file mode 100644 index 0000000..84dd6b8 --- /dev/null +++ b/SnipeitPS/Public/Set-Components.ps1 @@ -0,0 +1,41 @@ +function Set-Component() +{ + [CmdletBinding( + SupportsShouldProcess = $true, + ConfirmImpact = "High" + )] + + Param( + [parameter(mandatory = $true)] + [string]$id, + + [parameter(mandatory = $true)] + [string]$qty, + + [parameter(mandatory = $true)] + [string]$url, + + [parameter(mandatory = $true)] + [string]$apiKey + ) + + $Values = @{ + "qty" = $qty + } + + $Body = $Values | ConvertTo-Json; + + $Parameters = @{ + Uri = "$url/api/v1/components/$component_id" + Method = 'Patch' + Body = $Body + Token = $apiKey + } + + If ($PSCmdlet.ShouldProcess("ShouldProcess?")) + { + $result = Invoke-SnipeitMethod @Parameters + } + + $result +} diff --git a/SnipeitPS/Public/Set-Info.psm1 b/SnipeitPS/Public/Set-Info.ps1 similarity index 99% rename from SnipeitPS/Public/Set-Info.psm1 rename to SnipeitPS/Public/Set-Info.ps1 index 3307a01..a0ef88e 100644 --- a/SnipeitPS/Public/Set-Info.psm1 +++ b/SnipeitPS/Public/Set-Info.ps1 @@ -47,4 +47,4 @@ function Set-Info { } } } -} \ No newline at end of file +} diff --git a/SnipeitPS/Public/Status.psm1 b/SnipeitPS/Public/Status.psm1 deleted file mode 100644 index 3a4887a..0000000 --- a/SnipeitPS/Public/Status.psm1 +++ /dev/null @@ -1,16 +0,0 @@ -function Get-Status() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/statuslabels" ` - -Method GET ` - -Token $apiKey - - $result -} \ No newline at end of file diff --git a/SnipeitPS/Public/Users.psm1 b/SnipeitPS/Public/Users.psm1 deleted file mode 100644 index c2b3cee..0000000 --- a/SnipeitPS/Public/Users.psm1 +++ /dev/null @@ -1,33 +0,0 @@ -<# -.SYNOPSIS -# Gets a list of Snipe-it Users - -.PARAMETER url -URL of Snipeit system, can be set using Set-Info command - -.PARAMETER apiKey -Users API Key for Snipeit, can be set using Set-Info command - -.EXAMPLE -Get-Users -url "https://assets.dip.co.uk" -token "token..." - -.EXAMPLE -Get-Users -url "https://assets.dip.co.uk" -token "token..." | Where-Object {$_.username -eq "stephenm" } - -#> -function Get-Users() -{ - Param( - [parameter(mandatory=$true)] - [string]$url, - - [parameter(mandatory=$true)] - [string]$apiKey - ) - - $result = Invoke-Method -URi "$url/api/v1/users?limit=999" ` - -Method GET ` - -Token $apiKey - - $result -} diff --git a/SnipeitPS/SnipeItPS.psd1 b/SnipeitPS/SnipeItPS.psd1 index c4b382c..3b16a4e 100644 Binary files a/SnipeitPS/SnipeItPS.psd1 and b/SnipeitPS/SnipeItPS.psd1 differ diff --git a/SnipeitPS/SnipeItPS.psm1 b/SnipeitPS/SnipeItPS.psm1 index 53f791c..2290ad8 100644 --- a/SnipeitPS/SnipeItPS.psm1 +++ b/SnipeitPS/SnipeItPS.psm1 @@ -1,11 +1,11 @@ $scriptRoot = $PSScriptRoot + '\public' -Get-ChildItem $scriptRoot *.psm1 | ForEach-Object { +Get-ChildItem $scriptRoot *.ps1 | ForEach-Object { Import-Module $_.FullName } $scriptRoot = $PSScriptRoot + '\private' -Get-ChildItem $scriptRoot *.psm1 | ForEach-Object { +Get-ChildItem $scriptRoot *.ps1 | ForEach-Object { Import-Module $_.FullName -} \ No newline at end of file +} diff --git a/Tests/SnipeItPS.Tests.ps1 b/Tests/SnipeItPS.Tests.ps1 index 40d25e9..010c077 100644 --- a/Tests/SnipeItPS.Tests.ps1 +++ b/Tests/SnipeItPS.Tests.ps1 @@ -1,53 +1,212 @@ -$ModulePath = Split-Path -Path $PSScriptRoot -Parent -$ModuleName = Split-Path -Path $ModulePath -Leaf +#Requires -Modules PSScriptAnalyzer -# Make sure one or multiple versions of the module are not loaded -Get-Module -Name $ModuleName | Remove-Module +$here = Split-Path -Parent $MyInvocation.MyCommand.Path +$projectRoot = Split-Path -Parent $here +$moduleRoot = "$projectRoot\SnipeitPS" -# Import the module and store the information about the module -$ModuleInformation = Import-Module -Name "$ModulePath\$ModuleName.psd1" -PassThru -$ModuleInformation | Format-List +$manifestFile = "$moduleRoot\SnipeitPS.psd1" +$changelogFile = "$projectRoot\CHANGELOG.md" +$appveyorFile = "$projectRoot\appveyor.yml" +$publicFunctions = "$moduleRoot\Public" -# Get the functions present in the Manifest -$ExportedFunctions = $ModuleInformation.ExportedFunctions.Values.Name +Describe "SnipeitPS" { + Context "All required tests are present" { + # We want to make sure that every .ps1 file in the Functions directory that isn't a Pester test has an associated Pester test. + # This helps keep me honest and makes sure I'm testing my code appropriately. + It "Includes a test for each PowerShell function in the module" { + # Get-ChildItem -Path $publicFunctions -Filter "*.ps1" -Recurse | Where-Object -FilterScript {$_.Name -notlike '*.Tests.ps1'} | % { + # $expectedTestFile = Join-Path $projectRoot "Tests\$($_.BaseName).Tests.ps1" + # $expectedTestFile | Should Exist + # } + } + } -# Get the functions present in the Public folder -$PS1Functions = Get-ChildItem -Path "$ModulePath\Public\*.ps1" + Context "Manifest, changelog, and AppVeyor" { -Describe "$ModuleName Module - Testing Manifest File (.psd1)" { - Context "Manifest" { - It "Should contain RootModule" { - $ModuleInformation.RootModule | Should Not BeNullOrEmpty + # These tests are...erm, borrowed...from the module tests from the Pester module. + # I think they are excellent for sanity checking, and all credit for the following + # tests goes to Dave Wyatt, the genius behind Pester. I've just adapted them + # slightly to match SnipeitPS. + + $script:manifest = $null + + foreach ($line in (Get-Content $changelogFile)) + { + if ($line -match "^\D*(?(\d+\.){1,3}\d+)") + { + $changelogVersion = $matches.Version + break + } } - It "Should contain ModuleVersion" { - $ModuleInformation.Version | Should Not BeNullOrEmpty + foreach ($line in (Get-Content $appveyorFile)) + { + # (?()) - non-capturing group, but named Version. This makes it + # easy to reference the inside group later. + + if ($line -match '^\D*(?(\d+\.){1,3}\d+).\{build\}') + { + $appveyorVersion = $matches.Version + break + } } - It "Should contain GUID" { - $ModuleInformation.Guid | Should Not BeNullOrEmpty + It "Includes a valid manifest file" { + { + $script:manifest = Test-ModuleManifest -Path $script:manifestFile -ErrorAction Stop -WarningAction SilentlyContinue + } | Should Not Throw } - It "Should contain Author" { - $ModuleInformation.Author | Should Not BeNullOrEmpty + # There is a bug that prevents Test-ModuleManifest from updating correctly when the manifest file changes. See here: + # https://connect.microsoft.com/PowerShell/feedback/details/1541659/test-modulemanifest-the-psmoduleinfo-is-not-updated + + # As a temp workaround, we'll just read the manifest as a raw hashtable. + # Credit to this workaround comes from here: + # https://psescape.azurewebsites.net/pester-testing-your-module-manifest/ + $script:manifest = Invoke-Expression (Get-Content $script:manifestFile -Raw) + + It "Manifest file includes the correct root module" { + $script:manifest.RootModule | Should Be 'SnipeitPS' } - It "Should contain Description" { - $ModuleInformation.Description | Should Not BeNullOrEmpty + It "Manifest file includes the correct guid" { + $script:manifest.Guid | Should Be 'f86f4db4-1cb1-45c4-b7bf-6762531bfdeb' } - It "Compare the count of Function Exported and the PS1 files found" { - $status = $ExportedFunctions.Count -eq $PS1Functions.Count - $status | Should Be $true + It "Manifest file includes a valid version" { + # $script:manifest.Version -as [Version] | Should Not BeNullOrEmpty + $script:manifest.ModuleVersion -as [Version] | Should Not BeNullOrEmpty } - It "Compare the missing function" { - If ($ExportedFunctions.count -ne $PS1Functions.count) { - $Compare = Compare-Object -ReferenceObject $ExportedFunctions -DifferenceObject $PS1Functions.Basename - $Compare.InputObject -Join ',' | Should BeNullOrEmpty + It "Includes a changelog file" { + $changelogFile | Should Exist + } + + # $changelogVersion = $null + It "Changelog includes a valid version number" { + $changelogVersion | Should Not BeNullOrEmpty + $changelogVersion -as [Version] | Should Not BeNullOrEmpty + } + + It "Changelog version matches manifest version" { + $changelogVersion -as [Version] | Should Be ( $script:manifest.ModuleVersion -as [Version] ) + } + + # Back to me! Pester doesn't use AppVeyor, as far as I know, and I do. + + It "Includes an appveyor.yml file" { + $appveyorFile | Should Exist + } + + It "Appveyor.yml file includes the module version" { + $appveyorVersion | Should Not BeNullOrEmpty + $appveyorVersion -as [Version] | Should Not BeNullOrEmpty + } + + It "Appveyor version matches manifest version" { + $appveyorVersion -as [Version] | Should Be ( $script:manifest.ModuleVersion -as [Version] ) + } + } + + # The CI changes I'm testng now will render this section obsolete, + # as it should automatically patch the module manifest file with all + # exported function names. + # Leaving the code here for the moment while I can ensure those + # features are working correctly. + + # + # Context "Function checking" { + # $functionFiles = Get-ChildItem $publicFunctions -Filter *.ps1 | + # Select-Object -ExpandProperty BaseName | + # Where-Object { $_ -notlike "*.Tests" } + + # $internalFiles = Get-ChildItem $internalFunctions -Filter *.ps1 | + # Select-Object -ExpandProperty BaseName | + # Where-Object { $_ -notlike "*.Tests" } + + # #$exportedFunctions = $script:manifest.ExportedFunctions.Values.Name + # $exportedFunctions = $script:manifest.FunctionsToExport + + # foreach ($f in $functionFiles) { + # It "Exports $f" { + # $exportedFunctions -contains $f | Should Be $true + # } + # } + + # foreach ($f in $internalFiles) { + # It "Does not export $f" { + # $exportedFunctions -contains $f | Should Be $false + # } + # } + # } + + Context "Style checking" { + + # This section is again from the mastermind, Dave Wyatt. Again, credit + # goes to him for these tests. + + $files = @( + Get-ChildItem $here -Include *.ps1, *.psm1 + Get-ChildItem $publicFunctions -Include *.ps1, *.psm1 -Recurse + ) + + It 'Source files contain no trailing whitespace' { + $badLines = @( + foreach ($file in $files) + { + $lines = [System.IO.File]::ReadAllLines($file.FullName) + $lineCount = $lines.Count + + for ($i = 0; $i -lt $lineCount; $i++) + { + if ($lines[$i] -match '\s+$') + { + 'File: {0}, Line: {1}' -f $file.FullName, ($i + 1) + } + } + } + ) + + if ($badLines.Count -gt 0) + { + throw "The following $($badLines.Count) lines contain trailing whitespace: `r`n`r`n$($badLines -join "`r`n")" + } + } + + It 'Source files all end with a newline' { + $badFiles = @( + foreach ($file in $files) + { + $string = [System.IO.File]::ReadAllText($file.FullName) + if ($string.Length -gt 0 -and $string[-1] -ne "`n") + { + $file.FullName + } + } + ) + + if ($badFiles.Count -gt 0) + { + throw "The following files do not end with a newline: `r`n`r`n$($badFiles -join "`r`n")" + } + } + } + + Context 'PSScriptAnalyzer Rules' { + $analysis = Invoke-ScriptAnalyzer -Path "$moduleRoot" -Recurse + $scriptAnalyzerRules = Get-ScriptAnalyzerRule + + forEach ($rule in $scriptAnalyzerRules) + { + It "Should pass $rule" { + If (($analysis) -and ($analysis.RuleName -contains $rule)) + { + $analysis | + Where-Object RuleName -EQ $rule -OutVariable failures | + Out-Default + $failures.Count | Should Be 0 + } } } } } - -Get-Module -Name $ModuleName | Remove-Module \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..c16c57c --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,75 @@ +############################################################ +# +# See http://www.appveyor.com/docs/appveyor-yml for many more options +# +# Credit for a lot of this file goes to RamblingCookieMonster: +# https://github.com/RamblingCookieMonster/PSSQLite/blob/master/appveyor.yml +# +############################################################ + +# This tells AppVeyor that we need WMF 5 and PowerShell 5.0 +os: WMF 5 + +environment: + PSGalleryAPIKey: + secure: UdM6qhf5B0G8liHhUrwWERCZr44iSqmg4jUq0lwlTjZs4KyeoiwnBzdej0phqIAm + +version: 1.0.{build} + +# Don't rebuild when I tag a release on GitHub +skip_tags: true + +# Ignore testing a commit if only the readme changed +# Or if I include "skip-tests" in the commit message +skip_commits: + message: /skip\-tests/ + files: + - .github/ + - .vscode/ + - assets/ + - Tools/ + - README.md + - .gitattributes + - .gitignore + +# PRs, by definition, don't change anything and therefore should not increment the version +# To be fair, this is not important, and is really just AppVeyor enabling my pedantry +pull_requests: + do_not_increment_build_number: true + +install: + - ps: | + Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force | Out-Null + Install-Module InvokeBuild -Scope CurrentUser -Force + Install-Module BuildHelpers -Scope CurrentUser -Force + Install-Module platyPS -Scope CurrentUser -Force + Install-Module Pester -Scope CurrentUser -Force + Install-Module PSScriptAnalyzer -Scope CurrentUser -Force + $env:releasePath = "$($pwd.Path)\Release" + +before_build: + - ps: Invoke-Build -Task ShowDebug + +build_script: + - ps: Invoke-Build -Task Build + +# after_build: + # - cmd: mdspell %releasePath%\**/*.md --ignore-numbers --ignore-acronyms --report + +test_script: + - ps: Invoke-Build -Task Test + +before_deploy: + - ps: Invoke-Build -Task Deploy + +deploy: + provider: GitHub + release: v$(appveyor_build_version) + description: '' + auth_token: + secure: m72Ke3nJcSxZkc36UwRIw+q0NtNvERfQYHZUBNDvLP/kjW+mWmVueR6tmgBujyBM + draft: false + prerelease: false + on: + branch: master # release from master branch only + appveyor_repo_tag: false # deploy on tag push only \ No newline at end of file diff --git a/build.ps1 b/build.ps1 index e69de29..47ea638 100644 --- a/build.ps1 +++ b/build.ps1 @@ -0,0 +1,56 @@ +param( + [string[]]$Tasks +) + +function Install-Dependency([string] $Name) +{ + $policy = Get-PSRepository -Name "PSGallery" | Select-Object -ExpandProperty "InstallationPolicy" + if($policy -ne "Trusted") { + Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted + } + + if (!(Get-Module -Name $Name -ListAvailable)) { + Install-Module -Name $Name -Scope CurrentUser + } +} + +function Run-Tests +{ + param( + [string]$Path = "$PSScriptRoot\SnipeitPS" + ) + + $results = Invoke-Pester -PassThru + if($results.FailedCount -gt 0) { + Write-Output " > $($results.FailedCount) tests failed. The build cannot continue." + foreach($result in $($results.TestResult | Where {$_.Passed -eq $false} | Select-Object -Property Describe,Context,Name,Passed,Time)){ + Write-Output " > $result" + } + + EXIT 1 + } +} + +foreach($task in $Tasks){ + switch($task) + { + "test" { + Install-Dependency -Name "PSScriptAnalyzer" + Install-Dependency -Name "Pester" + Write-Output "Running Pester Tests..." + Run-Tests + } + "release" { + Register-PSRepository -Name InternalPowerShellModules ` + -SourceLocation http://192.168.1.155:81/nuget/DIPowerShell ` + -PackageManagementProvider NuGet ` + -PublishLocation http://192.168.1.155:81/nuget/DIPowerShell ` + -InstallationPolicy Trusted + + Write-Output "Registerting Module" + + Import-Module $env:CI_PROJECT_PATH\SnipeitPS\SnipeitPS.psd1 -ErrorAction Stop + Publish-Module -Name SnipeitPS -Repository InternalPowerShellModules -NuGetApiKey 123456789 + } + } +} diff --git a/docs/Get-Asset.md b/docs/Get-Asset.md new file mode 100644 index 0000000..deaafc9 --- /dev/null +++ b/docs/Get-Asset.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Asset + +## SYNOPSIS +# Gets a list of Snipe-it Assets + +## SYNTAX + +``` +Get-Asset [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Asset -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Asset -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "MyMachine" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-Category.md b/docs/Get-Category.md new file mode 100644 index 0000000..b63484f --- /dev/null +++ b/docs/Get-Category.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Category + +## SYNOPSIS +# Gets a list of Snipe-it Categories + +## SYNTAX + +``` +Get-Category [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Category -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Category -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Laptop" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-Component.md b/docs/Get-Component.md new file mode 100644 index 0000000..e780747 --- /dev/null +++ b/docs/Get-Component.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Component + +## SYNOPSIS +# Gets a list of Snipe-it Components + +## SYNTAX + +``` +Get-Component [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Component -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Component -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Memory" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-Manufacturer.md b/docs/Get-Manufacturer.md new file mode 100644 index 0000000..df5ca85 --- /dev/null +++ b/docs/Get-Manufacturer.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Manufacturer + +## SYNOPSIS +# Gets a list of Snipe-it Manufacturers + +## SYNTAX + +``` +Get-Manufacturer [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Manufacturer -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Manufacturer -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "HP" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-Model.md b/docs/Get-Model.md new file mode 100644 index 0000000..55c1504 --- /dev/null +++ b/docs/Get-Model.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Model + +## SYNOPSIS +# Gets a list of Snipe-it Models + +## SYNTAX + +``` +Get-Model [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Models -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Models -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "DL380" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-Status.md b/docs/Get-Status.md new file mode 100644 index 0000000..be5c90a --- /dev/null +++ b/docs/Get-Status.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-Status + +## SYNOPSIS +# Gets a list of Snipe-it Status Labels + +## SYNTAX + +``` +Get-Status [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-Status -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-Status -url "https://assets.example.com" -token "token..." | Where-Object {$_.name -eq "Ready to Deploy" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Get-User.md b/docs/Get-User.md new file mode 100644 index 0000000..5f1610d --- /dev/null +++ b/docs/Get-User.md @@ -0,0 +1,73 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Get-User + +## SYNOPSIS +# Gets a list of Snipe-it Users + +## SYNTAX + +``` +Get-User [-url] [-apiKey] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Get-User -url "https://assets.example.com" -token "token..." +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Get-User -url "https://assets.example.com" -token "token..." | Where-Object {$_.username -eq "stephenm" } +``` + +## PARAMETERS + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/New-Asset.md b/docs/New-Asset.md new file mode 100644 index 0000000..334c85e --- /dev/null +++ b/docs/New-Asset.md @@ -0,0 +1,180 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# New-Asset + +## SYNOPSIS +Add a new Asset to Snipe-it asset system + +## SYNTAX + +``` +New-Asset [[-tag] ] [-Name] [-Status_id] [-Model_id] [-url] + [-apiKey] [[-customfields] ] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +Long description + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +New-Asset -status_id 1 -model_id 1 -name "Machine1" +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +New-Asset -status_id 1 -model_id 1 -name "Machine1" -CustomValues = @{ "_snipeit_os_5 = "Windows 10 Pro" } +``` + +## PARAMETERS + +### -tag +Asset Tag for the Asset + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: False +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Name +Name of the Asset + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Status_id +Status ID of the asset, this can be got using Get-Status + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Model_id +Model ID of the asset, this can be got using Get-Model + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 4 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 5 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 6 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -customfields +Hastable of custom fields and extra fields that need passing through to Snipeit + +```yaml +Type: Hashtable +Parameter Sets: (All) +Aliases: + +Required: False +Position: 7 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/New-Component.md b/docs/New-Component.md new file mode 100644 index 0000000..ff564f9 --- /dev/null +++ b/docs/New-Component.md @@ -0,0 +1,146 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# New-Component + +## SYNOPSIS +Short description + +## SYNTAX + +``` +New-Component [-name] [-category_id] [-qty] [-url] [-apiKey] + [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +Long description + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +An example +``` + +## PARAMETERS + +### -name +Parameter description + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -category_id +Parameter description + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -qty +Parameter description + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +Parameter description + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 4 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Parameter description + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 5 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES +General notes + +## RELATED LINKS + diff --git a/docs/New-Manufacturer.md b/docs/New-Manufacturer.md new file mode 100644 index 0000000..8f32b60 --- /dev/null +++ b/docs/New-Manufacturer.md @@ -0,0 +1,114 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# New-Manufacturer + +## SYNOPSIS +Add a new Manufacturer to Snipe-it asset system + +## SYNTAX + +``` +New-Manufacturer [-Name] [-url] [-apiKey] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +Long description + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +New-Manufacturer -name "HP" +``` + +## PARAMETERS + +### -Name +Name of the Manufacturer + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/New-Model.md b/docs/New-Model.md new file mode 100644 index 0000000..6202855 --- /dev/null +++ b/docs/New-Model.md @@ -0,0 +1,160 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# New-Model + +## SYNOPSIS +Add a new Model to Snipe-it asset system + +## SYNTAX + +``` +New-Model [-name] [-category_id] [-manufacturer_id] [-fieldset_id] + [-url] [-apiKey] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +Long description + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +New-Model -name "DL380" -manufacturer_id 2 -fieldset_id 2 -category_id 1 +``` + +## PARAMETERS + +### -name +Name of the Asset Model + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -category_id +Category ID that the asset belongs to this can be got using Get-Category + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: 0 +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -manufacturer_id +Manufacturer ID that the asset belongs to this can be got using Get-Manufacturer + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: 0 +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -fieldset_id +Fieldset ID that the asset uses (Custom fields) + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 4 +Default value: 0 +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 5 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 6 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Set-Asset.md b/docs/Set-Asset.md new file mode 100644 index 0000000..11ff0e6 --- /dev/null +++ b/docs/Set-Asset.md @@ -0,0 +1,180 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Set-Asset + +## SYNOPSIS +Update a Asset in the Snipe-it asset system + +## SYNTAX + +``` +Set-Asset [-id] [-Name] [-Status_id] [-Model_id] [-url] + [-apiKey] [[-customfields] ] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +Long description + +## EXAMPLES + +### -------------------------- EXAMPLE 1 -------------------------- +``` +Set-Asset -id 1 -status_id 1 -model_id 1 -name "Machine1" +``` + +### -------------------------- EXAMPLE 2 -------------------------- +``` +Set-Asset -id 1 -status_id 1 -model_id 1 -name "Machine1" -CustomValues = @{ "_snipeit_os_5 = "Windows 10 Pro" } +``` + +## PARAMETERS + +### -id +ID of the Asset + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: 0 +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Name +Name of the Asset + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Status_id +Status ID of the asset, this can be got using Get-Status + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Model_id +Model ID of the asset, this can be got using Get-Model + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 4 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +URL of Snipeit system, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 5 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +Users API Key for Snipeit, can be set using Set-Info command + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 6 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -customfields +Hastable of custom fields and extra fields that need passing through to Snipeit + +```yaml +Type: Hashtable +Parameter Sets: (All) +Aliases: + +Required: False +Position: 7 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +## OUTPUTS + +## NOTES + +## RELATED LINKS + diff --git a/docs/Set-AssetOwner.md b/docs/Set-AssetOwner.md new file mode 100644 index 0000000..1e3b9f2 --- /dev/null +++ b/docs/Set-AssetOwner.md @@ -0,0 +1,136 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Set-AssetOwner + +## SYNOPSIS +{{Fill in the Synopsis}} + +## SYNTAX + +``` +Set-AssetOwner [-id] [-user_id] [-url] [-apiKey] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### Example 1 +``` +PS C:\> {{ Add example code here }} +``` + +{{ Add example description here }} + +## PARAMETERS + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +{{Fill apiKey Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -id +{{Fill id Description}} + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 0 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +{{Fill url Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -user_id +{{Fill user_id Description}} + +```yaml +Type: Int32 +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +### None + + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS + diff --git a/docs/Set-Component.md b/docs/Set-Component.md new file mode 100644 index 0000000..79a41d0 --- /dev/null +++ b/docs/Set-Component.md @@ -0,0 +1,136 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Set-Component + +## SYNOPSIS +{{Fill in the Synopsis}} + +## SYNTAX + +``` +Set-Component [-id] [-qty] [-url] [-apiKey] [-WhatIf] [-Confirm] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### Example 1 +``` +PS C:\> {{ Add example code here }} +``` + +{{ Add example description here }} + +## PARAMETERS + +### -Confirm +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -apiKey +{{Fill apiKey Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 3 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -id +{{Fill id Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 0 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -qty +{{Fill qty Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +{{Fill url Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: True +Position: 2 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +### None + + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS + diff --git a/docs/Set-Info.md b/docs/Set-Info.md new file mode 100644 index 0000000..53cb63a --- /dev/null +++ b/docs/Set-Info.md @@ -0,0 +1,75 @@ +--- +external help file: SnipeItPS-help.xml +Module Name: SnipeItPS +online version: +schema: 2.0.0 +--- + +# Set-Info + +## SYNOPSIS +{{Fill in the Synopsis}} + +## SYNTAX + +``` +Set-Info [[-url] ] [[-apiKey] ] +``` + +## DESCRIPTION +{{Fill in the Description}} + +## EXAMPLES + +### Example 1 +``` +PS C:\> {{ Add example code here }} +``` + +{{ Add example description here }} + +## PARAMETERS + +### -apiKey +{{Fill apiKey Description}} + +```yaml +Type: String +Parameter Sets: (All) +Aliases: + +Required: False +Position: 1 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -url +{{Fill url Description}} + +```yaml +Type: Uri +Parameter Sets: (All) +Aliases: + +Required: False +Position: 0 +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +## INPUTS + +### None + + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS +