Removed all projects except Glazier Dashboard
This commit is contained in:
parent
c3083f5f6a
commit
4c36d11381
0
dashboard/.gitignore → .gitignore
vendored
0
dashboard/.gitignore → .gitignore
vendored
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [
|
|
||||||
"DQpGdW5jdGlvbiBJbnN0YWxsLVJvbGVQcmltYXJ5RG9tYWluQ29udHJvbGxlcg0Kew0KPCMNCi5TWU5PUFNJUw0KQ29uZmlndXJlIG5vZGUncyBuZXR3b3JrIGFkYXB0ZXJzLg0KQ3JlYXRlIGZpcnN0IGRvbWFpbiBjb250cm9sbGVyIGluIHRoZSBmb3Jlc3QuDQoNCi5FWEFNUExFDQpQUz4gSW5zdGFsbC1Sb2xlUHJpbWFyeURvbWFpbkNvbnRyb2xsZXIgLURvbWFpbk5hbWUgYWNtZS5sb2NhbCAtU2FmZU1vZGVQYXNzd29yZCAiUEBzc3cwcmQiDQoNCkluc3RhbGwgRE5TIGFuZCBBRERTLCBjcmVhdGUgZm9yZXN0IGFuZCBkb21haW4gJ2FjbWUubG9jYWwnLg0KU2V0IERDIHJlY292ZXJ5IG1vZGUgcGFzc3dvcmQgdG8gJ1BAc3N3MHJkJy4NCiM+DQoJDQoJcGFyYW0NCgkoDQoJCVtTdHJpbmddDQoJCSMgTmV3IGRvbWFpbiBuYW1lLg0KCQkkRG9tYWluTmFtZSwNCgkJDQoJCVtTdHJpbmddDQoJCSMgRG9tYWluIGNvbnRyb2xsZXIgcmVjb3ZlcnkgbW9kZSBwYXNzd29yZC4NCgkJJFNhZmVNb2RlUGFzc3dvcmQNCgkpDQoNCgl0cmFwIHsgU3RvcC1FeGVjdXRpb24gJF8gfQ0KDQogICAgICAgICMgQWRkIHJlcXVpcmVkIHdpbmRvd3MgZmVhdHVyZXMNCglBZGQtV2luZG93c0ZlYXR1cmVXcmFwcGVyIGANCgkJLU5hbWUgIkROUyIsIkFELURvbWFpbi1TZXJ2aWNlcyIsIlJTQVQtREZTLU1nbXQtQ29uIiBgDQoJCS1JbmNsdWRlTWFuYWdlbWVudFRvb2xzIGANCiAgICAgICAgLU5vdGlmeVJlc3RhcnQNCg0KDQoJV3JpdGUtTG9nICJDcmVhdGluZyBmaXJzdCBkb21haW4gY29udHJvbGxlciAuLi4iDQoJCQ0KCSRTTUFQID0gQ29udmVydFRvLVNlY3VyZVN0cmluZyAtU3RyaW5nICRTYWZlTW9kZVBhc3N3b3JkIC1Bc1BsYWluVGV4dCAtRm9yY2UNCgkJDQoJSW5zdGFsbC1BRERTRm9yZXN0IGANCgkJLURvbWFpbk5hbWUgJERvbWFpbk5hbWUgYA0KCQktU2FmZU1vZGVBZG1pbmlzdHJhdG9yUGFzc3dvcmQgJFNNQVAgYA0KCQktRG9tYWluTW9kZSBEZWZhdWx0IGANCgkJLUZvcmVzdE1vZGUgRGVmYXVsdCBgDQoJCS1Ob1JlYm9vdE9uQ29tcGxldGlvbiBgDQoJCS1Gb3JjZSBgDQoJCS1FcnJvckFjdGlvbiBTdG9wIHwgT3V0LU51bGwNCg0KCVdyaXRlLUxvZyAiV2FpdGluZyBmb3IgcmVib290IC4uLiIJCQ0KIwlTdG9wLUV4ZWN1dGlvbiAtRXhpdENvZGUgMzAxMCAtRXhpdFN0cmluZyAiQ29tcHV0ZXIgbXVzdCBiZSByZXN0YXJ0ZWQgdG8gZmluaXNoIGRvbWFpbiBjb250cm9sbGVyIHByb21vdGlvbi4iDQojCVdyaXRlLUxvZyAiUmVzdGFyaW5nIGNvbXB1dGVyIC4uLiINCiMJUmVzdGFydC1Db21wdXRlciAtRm9yY2UNCn0NCg=="
|
|
||||||
],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Import-Module",
|
|
||||||
"Arguments": {
|
|
||||||
"Name": "CoreFunctions"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Set-LocalUserPassword",
|
|
||||||
"Arguments": {
|
|
||||||
"UserName": "Administrator",
|
|
||||||
"Password": "P@ssw0rd123",
|
|
||||||
"Force": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Install-RolePrimaryDomainController",
|
|
||||||
"Arguments": {
|
|
||||||
"DomainName": "acme.local",
|
|
||||||
"SafeModePassword": "P@ssw0rd"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 1
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
include Install-RolePrimaryDomainController.ps1
|
|
||||||
|
|
||||||
call Import-Module Name="CoreFunctions"
|
|
||||||
call Set-LocalUserPassword UserName="Administrator" , Password="P@ssw0rd123" , Force=true
|
|
||||||
call Install-RolePrimaryDomainController DomainName="acme.local" , SafeModePassword="P@ssw0rd"
|
|
||||||
|
|
||||||
reboot 1
|
|
||||||
|
|
||||||
out CreatePrimaryDC.json
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,53 +0,0 @@
|
|||||||
|
|
||||||
Function Install-RolePrimaryDomainController
|
|
||||||
{
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Configure node's network adapters.
|
|
||||||
Create first domain controller in the forest.
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS> Install-RolePrimaryDomainController -DomainName acme.local -SafeModePassword "P@ssw0rd"
|
|
||||||
|
|
||||||
Install DNS and ADDS, create forest and domain 'acme.local'.
|
|
||||||
Set DC recovery mode password to 'P@ssw0rd'.
|
|
||||||
#>
|
|
||||||
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[String]
|
|
||||||
# New domain name.
|
|
||||||
$DomainName,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# Domain controller recovery mode password.
|
|
||||||
$SafeModePassword
|
|
||||||
)
|
|
||||||
|
|
||||||
trap { Stop-Execution $_ }
|
|
||||||
|
|
||||||
# Add required windows features
|
|
||||||
Add-WindowsFeatureWrapper `
|
|
||||||
-Name "DNS","AD-Domain-Services","RSAT-DFS-Mgmt-Con" `
|
|
||||||
-IncludeManagementTools `
|
|
||||||
-NotifyRestart
|
|
||||||
|
|
||||||
|
|
||||||
Write-Log "Creating first domain controller ..."
|
|
||||||
|
|
||||||
$SMAP = ConvertTo-SecureString -String $SafeModePassword -AsPlainText -Force
|
|
||||||
|
|
||||||
Install-ADDSForest `
|
|
||||||
-DomainName $DomainName `
|
|
||||||
-SafeModeAdministratorPassword $SMAP `
|
|
||||||
-DomainMode Default `
|
|
||||||
-ForestMode Default `
|
|
||||||
-NoRebootOnCompletion `
|
|
||||||
-Force `
|
|
||||||
-ErrorAction Stop | Out-Null
|
|
||||||
|
|
||||||
Write-Log "Waiting for reboot ..."
|
|
||||||
# Stop-Execution -ExitCode 3010 -ExitString "Computer must be restarted to finish domain controller promotion."
|
|
||||||
# Write-Log "Restaring computer ..."
|
|
||||||
# Restart-Computer -Force
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
call Import-Module Name="CoreFunctions"
|
|
||||||
call Set-NetworkAdapterConfiguration FirstAvailable=true , DNSServer="10.0.102.2"
|
|
||||||
call Join-Domain DomainName="acme.local" , Username="Administrator" , Password="P@ssw0rd123"
|
|
||||||
|
|
||||||
reboot 1
|
|
||||||
|
|
||||||
out out.json
|
|
||||||
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,27 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Import-Module",
|
|
||||||
"Arguments": {
|
|
||||||
"Name": "CoreFunctions"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Set-NetworkAdapterConfiguration",
|
|
||||||
"Arguments": {
|
|
||||||
"FirstAvailable": true,
|
|
||||||
"DNSServer": "10.0.102.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Join-Domain",
|
|
||||||
"Arguments": {
|
|
||||||
"DomainName": "acme.local",
|
|
||||||
"Username": "Administrator",
|
|
||||||
"Password": "P@ssw0rd123"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 1
|
|
||||||
}
|
|
@ -1,8 +0,0 @@
|
|||||||
include Install-RoleSecondaryDomainController.ps1
|
|
||||||
|
|
||||||
call Import-Module Name="CoreFunctions"
|
|
||||||
call Install-RoleSecondaryDomainController DomainName="acme.local" , UserName="Administrator" , Password="P@ssw0rd123" , SafeModePassword="P@ssw0rd"
|
|
||||||
|
|
||||||
reboot 1
|
|
||||||
|
|
||||||
out out.json
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,54 +0,0 @@
|
|||||||
Function Install-RoleSecondaryDomainController
|
|
||||||
{
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Install additional (secondary) domain controller.
|
|
||||||
|
|
||||||
#>
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[String]
|
|
||||||
# Domain name to join to.
|
|
||||||
$DomainName,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# Domain user who is allowed to join computer to domain.
|
|
||||||
$UserName,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# User's password.
|
|
||||||
$Password,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# Domain controller recovery mode password.
|
|
||||||
$SafeModePassword
|
|
||||||
)
|
|
||||||
|
|
||||||
trap { Stop-Execution $_ }
|
|
||||||
|
|
||||||
$Credential = New-Credential -UserName "$DomainName\$UserName" -Password $Password
|
|
||||||
|
|
||||||
# Add required windows features
|
|
||||||
Add-WindowsFeatureWrapper `
|
|
||||||
-Name "DNS","AD-Domain-Services","RSAT-DFS-Mgmt-Con" `
|
|
||||||
-IncludeManagementTools `
|
|
||||||
-NotifyRestart
|
|
||||||
|
|
||||||
|
|
||||||
Write-Log "Adding secondary domain controller ..."
|
|
||||||
|
|
||||||
$SMAP = ConvertTo-SecureString -String $SafeModePassword -AsPlainText -Force
|
|
||||||
|
|
||||||
Install-ADDSDomainController `
|
|
||||||
-DomainName $DomainName `
|
|
||||||
-SafeModeAdministratorPassword $SMAP `
|
|
||||||
-Credential $Credential `
|
|
||||||
-NoRebootOnCompletion `
|
|
||||||
-Force `
|
|
||||||
-ErrorAction Stop | Out-Null
|
|
||||||
|
|
||||||
Write-Log "Waiting for restart ..."
|
|
||||||
# Stop-Execution -ExitCode 3010 -ExitString "Computer must be restarted to finish domain controller promotion."
|
|
||||||
# Write-Log "Restarting computer ..."
|
|
||||||
# Restart-Computer -Force
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [
|
|
||||||
"RnVuY3Rpb24gSW5zdGFsbC1Sb2xlU2Vjb25kYXJ5RG9tYWluQ29udHJvbGxlcg0Kew0KPCMNCi5TWU5PUFNJUw0KSW5zdGFsbCBhZGRpdGlvbmFsIChzZWNvbmRhcnkpIGRvbWFpbiBjb250cm9sbGVyLg0KDQojPg0KCXBhcmFtDQoJKA0KCQlbU3RyaW5nXQ0KCQkjIERvbWFpbiBuYW1lIHRvIGpvaW4gdG8uDQoJCSREb21haW5OYW1lLA0KCQkNCgkJW1N0cmluZ10NCgkJIyBEb21haW4gdXNlciB3aG8gaXMgYWxsb3dlZCB0byBqb2luIGNvbXB1dGVyIHRvIGRvbWFpbi4NCgkJJFVzZXJOYW1lLA0KCQkNCgkJW1N0cmluZ10NCgkJIyBVc2VyJ3MgcGFzc3dvcmQuDQoJCSRQYXNzd29yZCwNCgkJDQoJCVtTdHJpbmddDQoJCSMgRG9tYWluIGNvbnRyb2xsZXIgcmVjb3ZlcnkgbW9kZSBwYXNzd29yZC4NCgkJJFNhZmVNb2RlUGFzc3dvcmQNCgkpDQoNCgl0cmFwIHsgU3RvcC1FeGVjdXRpb24gJF8gfQ0KCQ0KCSRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAkUGFzc3dvcmQNCgkJDQoJIyBBZGQgcmVxdWlyZWQgd2luZG93cyBmZWF0dXJlcw0KCUFkZC1XaW5kb3dzRmVhdHVyZVdyYXBwZXIgYA0KCQktTmFtZSAiRE5TIiwiQUQtRG9tYWluLVNlcnZpY2VzIiwiUlNBVC1ERlMtTWdtdC1Db24iIGANCgkJLUluY2x1ZGVNYW5hZ2VtZW50VG9vbHMgYA0KICAgICAgICAgICAgICAgIC1Ob3RpZnlSZXN0YXJ0DQoJCQ0KCQ0KICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBzZWNvbmRhcnkgZG9tYWluIGNvbnRyb2xsZXIgLi4uIg0KICAgIA0KCSRTTUFQID0gQ29udmVydFRvLVNlY3VyZVN0cmluZyAtU3RyaW5nICRTYWZlTW9kZVBhc3N3b3JkIC1Bc1BsYWluVGV4dCAtRm9yY2UNCg0KCUluc3RhbGwtQUREU0RvbWFpbkNvbnRyb2xsZXIgYA0KCQktRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgDQoJCS1TYWZlTW9kZUFkbWluaXN0cmF0b3JQYXNzd29yZCAkU01BUCBgDQoJCS1DcmVkZW50aWFsICRDcmVkZW50aWFsIGANCgkJLU5vUmVib290T25Db21wbGV0aW9uIGANCgkJLUZvcmNlIGANCgkJLUVycm9yQWN0aW9uIFN0b3AgfCBPdXQtTnVsbA0KDQoJV3JpdGUtTG9nICJXYWl0aW5nIGZvciByZXN0YXJ0IC4uLiINCiMJU3RvcC1FeGVjdXRpb24gLUV4aXRDb2RlIDMwMTAgLUV4aXRTdHJpbmcgIkNvbXB1dGVyIG11c3QgYmUgcmVzdGFydGVkIHRvIGZpbmlzaCBkb21haW4gY29udHJvbGxlciBwcm9tb3Rpb24uIg0KIwlXcml0ZS1Mb2cgIlJlc3RhcnRpbmcgY29tcHV0ZXIgLi4uIg0KIwlSZXN0YXJ0LUNvbXB1dGVyIC1Gb3JjZQ0KfQ0K"
|
|
||||||
],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Import-Module",
|
|
||||||
"Arguments": {
|
|
||||||
"Name": "CoreFunctions"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Install-RoleSecondaryDomainController",
|
|
||||||
"Arguments": {
|
|
||||||
"DomainName": "acme.local",
|
|
||||||
"UserName": "Administrator",
|
|
||||||
"Password": "P@ssw0rd123",
|
|
||||||
"SafeModePassword": "P@ssw0rd"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 1
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
include Install-RoleSecondaryDomainController.ps1
|
|
||||||
|
|
||||||
call Import-Module Name="CoreFunctions"
|
|
||||||
call Set-NetworkAdapterConfiguration FirstAvailable=true , DNSServer="10.0.102.2"
|
|
||||||
call Join-Domain DomainName="acme.local" , Username="Administrator" , Password="P@ssw0rd123" , AllowRestart=true
|
|
||||||
call Install-RoleSecondaryDomainController DomainName="acme.local" , UserName="Administrator" , Password="P@ssw0rd123" , SafeModePassword="P@ssw0rd"
|
|
||||||
|
|
||||||
reboot 1
|
|
||||||
|
|
||||||
out out.json
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,54 +0,0 @@
|
|||||||
Function Install-RoleSecondaryDomainController
|
|
||||||
{
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Install additional (secondary) domain controller.
|
|
||||||
|
|
||||||
#>
|
|
||||||
param
|
|
||||||
(
|
|
||||||
[String]
|
|
||||||
# Domain name to join to.
|
|
||||||
$DomainName,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# Domain user who is allowed to join computer to domain.
|
|
||||||
$UserName,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# User's password.
|
|
||||||
$Password,
|
|
||||||
|
|
||||||
[String]
|
|
||||||
# Domain controller recovery mode password.
|
|
||||||
$SafeModePassword
|
|
||||||
)
|
|
||||||
|
|
||||||
trap { Stop-Execution $_ }
|
|
||||||
|
|
||||||
$Credential = New-Credential -UserName "$DomainName\$UserName" -Password $Password
|
|
||||||
|
|
||||||
# Add required windows features
|
|
||||||
Add-WindowsFeatureWrapper `
|
|
||||||
-Name "DNS","AD-Domain-Services","RSAT-DFS-Mgmt-Con" `
|
|
||||||
-IncludeManagementTools `
|
|
||||||
-NotifyRestart
|
|
||||||
|
|
||||||
|
|
||||||
Write-Log "Adding secondary domain controller ..."
|
|
||||||
|
|
||||||
$SMAP = ConvertTo-SecureString -String $SafeModePassword -AsPlainText -Force
|
|
||||||
|
|
||||||
Install-ADDSDomainController `
|
|
||||||
-DomainName $DomainName `
|
|
||||||
-SafeModeAdministratorPassword $SMAP `
|
|
||||||
-Credential $Credential `
|
|
||||||
-NoRebootOnCompletion `
|
|
||||||
-Force `
|
|
||||||
-ErrorAction Stop | Out-Null
|
|
||||||
|
|
||||||
Write-Log "Waiting for restart ..."
|
|
||||||
# Stop-Execution -ExitCode 3010 -ExitString "Computer must be restarted to finish domain controller promotion."
|
|
||||||
# Write-Log "Restarting computer ..."
|
|
||||||
# Restart-Computer -Force
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [
|
|
||||||
"RnVuY3Rpb24gSW5zdGFsbC1Sb2xlU2Vjb25kYXJ5RG9tYWluQ29udHJvbGxlcg0Kew0KPCMNCi5TWU5PUFNJUw0KSW5zdGFsbCBhZGRpdGlvbmFsIChzZWNvbmRhcnkpIGRvbWFpbiBjb250cm9sbGVyLg0KDQojPg0KCXBhcmFtDQoJKA0KCQlbU3RyaW5nXQ0KCQkjIERvbWFpbiBuYW1lIHRvIGpvaW4gdG8uDQoJCSREb21haW5OYW1lLA0KCQkNCgkJW1N0cmluZ10NCgkJIyBEb21haW4gdXNlciB3aG8gaXMgYWxsb3dlZCB0byBqb2luIGNvbXB1dGVyIHRvIGRvbWFpbi4NCgkJJFVzZXJOYW1lLA0KCQkNCgkJW1N0cmluZ10NCgkJIyBVc2VyJ3MgcGFzc3dvcmQuDQoJCSRQYXNzd29yZCwNCgkJDQoJCVtTdHJpbmddDQoJCSMgRG9tYWluIGNvbnRyb2xsZXIgcmVjb3ZlcnkgbW9kZSBwYXNzd29yZC4NCgkJJFNhZmVNb2RlUGFzc3dvcmQNCgkpDQoNCgl0cmFwIHsgU3RvcC1FeGVjdXRpb24gJF8gfQ0KCQ0KCSRDcmVkZW50aWFsID0gTmV3LUNyZWRlbnRpYWwgLVVzZXJOYW1lICIkRG9tYWluTmFtZVwkVXNlck5hbWUiIC1QYXNzd29yZCAkUGFzc3dvcmQNCgkJDQoJIyBBZGQgcmVxdWlyZWQgd2luZG93cyBmZWF0dXJlcw0KCUFkZC1XaW5kb3dzRmVhdHVyZVdyYXBwZXIgYA0KCQktTmFtZSAiRE5TIiwiQUQtRG9tYWluLVNlcnZpY2VzIiwiUlNBVC1ERlMtTWdtdC1Db24iIGANCgkJLUluY2x1ZGVNYW5hZ2VtZW50VG9vbHMgYA0KICAgICAgICAgICAgICAgIC1Ob3RpZnlSZXN0YXJ0DQoJCQ0KCQ0KICAgICAgICBXcml0ZS1Mb2cgIkFkZGluZyBzZWNvbmRhcnkgZG9tYWluIGNvbnRyb2xsZXIgLi4uIg0KICAgIA0KCSRTTUFQID0gQ29udmVydFRvLVNlY3VyZVN0cmluZyAtU3RyaW5nICRTYWZlTW9kZVBhc3N3b3JkIC1Bc1BsYWluVGV4dCAtRm9yY2UNCg0KCUluc3RhbGwtQUREU0RvbWFpbkNvbnRyb2xsZXIgYA0KCQktRG9tYWluTmFtZSAkRG9tYWluTmFtZSBgDQoJCS1TYWZlTW9kZUFkbWluaXN0cmF0b3JQYXNzd29yZCAkU01BUCBgDQoJCS1DcmVkZW50aWFsICRDcmVkZW50aWFsIGANCgkJLU5vUmVib290T25Db21wbGV0aW9uIGANCgkJLUZvcmNlIGANCgkJLUVycm9yQWN0aW9uIFN0b3AgfCBPdXQtTnVsbA0KDQoJV3JpdGUtTG9nICJXYWl0aW5nIGZvciByZXN0YXJ0IC4uLiINCiMJU3RvcC1FeGVjdXRpb24gLUV4aXRDb2RlIDMwMTAgLUV4aXRTdHJpbmcgIkNvbXB1dGVyIG11c3QgYmUgcmVzdGFydGVkIHRvIGZpbmlzaCBkb21haW4gY29udHJvbGxlciBwcm9tb3Rpb24uIg0KIwlXcml0ZS1Mb2cgIlJlc3RhcnRpbmcgY29tcHV0ZXIgLi4uIg0KIwlSZXN0YXJ0LUNvbXB1dGVyIC1Gb3JjZQ0KfQ0K"
|
|
||||||
],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Import-Module",
|
|
||||||
"Arguments": {
|
|
||||||
"Name": "CoreFunctions"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Set-NetworkAdapterConfiguration",
|
|
||||||
"Arguments": {
|
|
||||||
"FirstAvailable": true,
|
|
||||||
"DNSServer": "10.0.102.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Join-Domain",
|
|
||||||
"Arguments": {
|
|
||||||
"DomainName": "acme.local",
|
|
||||||
"Username": "Administrator",
|
|
||||||
"Password": "P@ssw0rd123",
|
|
||||||
"AllowRestart": true
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Install-RoleSecondaryDomainController",
|
|
||||||
"Arguments": {
|
|
||||||
"DomainName": "acme.local",
|
|
||||||
"UserName": "Administrator",
|
|
||||||
"Password": "P@ssw0rd123",
|
|
||||||
"SafeModePassword": "P@ssw0rd"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 1
|
|
||||||
}
|
|
Binary file not shown.
@ -1,7 +0,0 @@
|
|||||||
include Get-DnsListeningIpAddress.ps1
|
|
||||||
|
|
||||||
call Get-DnsListeningIpAddress
|
|
||||||
|
|
||||||
reboot 0
|
|
||||||
|
|
||||||
out out.json
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,5 +0,0 @@
|
|||||||
function Get-DnsListeningIpAddress {
|
|
||||||
Import-Module DnsServer
|
|
||||||
(Get-DNSServer -ComputerName localhost).ServerSetting.ListeningIpAddress |
|
|
||||||
Where-Object { $_ -match "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" }
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [
|
|
||||||
"ZnVuY3Rpb24gR2V0LURuc0xpc3RlbmluZ0lwQWRkcmVzcyB7DQogICAgSW1wb3J0LU1vZHVsZSBEbnNTZXJ2ZXINCiAgICAoR2V0LUROU1NlcnZlciAtQ29tcHV0ZXJOYW1lIGxvY2FsaG9zdCkuU2VydmVyU2V0dGluZy5MaXN0ZW5pbmdJcEFkZHJlc3MgfA0KICAgICAgICBXaGVyZS1PYmplY3QgeyAkXyAtbWF0Y2ggIlxkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30iIH0NCn0NCg=="
|
|
||||||
],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Get-DnsListeningIpAddress",
|
|
||||||
"Arguments": {}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 0
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
include Install-WebServer.ps1
|
|
||||||
|
|
||||||
call Install-WebServer
|
|
||||||
|
|
||||||
reboot 0
|
|
||||||
|
|
||||||
out out.json
|
|
@ -1 +0,0 @@
|
|||||||
..\ExecutionPlanGenerator.exe ExecutionPlan.txt
|
|
@ -1,4 +0,0 @@
|
|||||||
function Install-WebServer {
|
|
||||||
Import-Module ServerManager
|
|
||||||
Install-WindowsFeature Web-Server -IncludeManagementTools
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts": [
|
|
||||||
"ZnVuY3Rpb24gSW5zdGFsbC1XZWJTZXJ2ZXIgew0KICAgIEltcG9ydC1Nb2R1bGUgU2VydmVyTWFuYWdlcg0KICAgIEluc3RhbGwtV2luZG93c0ZlYXR1cmUgV2ViLVNlcnZlciAtSW5jbHVkZU1hbmFnZW1lbnRUb29scw0KfQ0K"
|
|
||||||
],
|
|
||||||
"Commands": [
|
|
||||||
{
|
|
||||||
"Name": "Install-WebServer",
|
|
||||||
"Arguments": {}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 0
|
|
||||||
}
|
|
Binary file not shown.
@ -1,44 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<TimeZone>Pacific Standard Time</TimeZone>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<AutoLogon>
|
|
||||||
<Password>
|
|
||||||
<Value>UABAAHMAcwB3ADAAcgBkAFAAYQBzAHMAdwBvAHIAZAA=</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</Password>
|
|
||||||
<Username>Administrator</Username>
|
|
||||||
<LogonCount>1</LogonCount>
|
|
||||||
<Enabled>false</Enabled>
|
|
||||||
</AutoLogon>
|
|
||||||
<UserAccounts>
|
|
||||||
<AdministratorPassword>
|
|
||||||
<Value>UABAAHMAcwB3ADAAcgBkAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</AdministratorPassword>
|
|
||||||
</UserAccounts>
|
|
||||||
<RegisteredOrganization>-</RegisteredOrganization>
|
|
||||||
<RegisteredOwner>-</RegisteredOwner>
|
|
||||||
<OOBE>
|
|
||||||
<HideEULAPage>true</HideEULAPage>
|
|
||||||
</OOBE>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<InputLocale>en-US</InputLocale>
|
|
||||||
<SystemLocale>en-US</SystemLocale>
|
|
||||||
<UILanguage>en-US</UILanguage>
|
|
||||||
<UserLocale>en-US</UserLocale>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="generalize">
|
|
||||||
<component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<SkipRearm>1</SkipRearm>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<cpi:offlineImage cpi:source="wim:d:/aik/install.wim#Windows Server 2012 SERVERSTANDARDCORE" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
|
|
||||||
</unattend>
|
|
@ -1,51 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<unattend xmlns="urn:schemas-microsoft-com:unattend">
|
|
||||||
<settings pass="specialize">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<TimeZone>Pacific Stantard Time</TimeZone>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="oobeSystem">
|
|
||||||
<component name="Microsoft-Windows-Shell-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<AutoLogon>
|
|
||||||
<Password>
|
|
||||||
<Value>UABAAHMAcwB3ADAAcgBkAFAAYQBzAHMAdwBvAHIAZAA=</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</Password>
|
|
||||||
<LogonCount>1</LogonCount>
|
|
||||||
<Username>Administrator</Username>
|
|
||||||
<Enabled>true</Enabled>
|
|
||||||
</AutoLogon>
|
|
||||||
<UserAccounts>
|
|
||||||
<AdministratorPassword>
|
|
||||||
<Value>UABAAHMAcwB3ADAAcgBkAEEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIAUABhAHMAcwB3AG8AcgBkAA==</Value>
|
|
||||||
<PlainText>false</PlainText>
|
|
||||||
</AdministratorPassword>
|
|
||||||
</UserAccounts>
|
|
||||||
<RegisteredOrganization>-</RegisteredOrganization>
|
|
||||||
<RegisteredOwner>-</RegisteredOwner>
|
|
||||||
<OOBE>
|
|
||||||
<HideEULAPage>true</HideEULAPage>
|
|
||||||
</OOBE>
|
|
||||||
<FirstLogonCommands>
|
|
||||||
<SynchronousCommand wcm:action="add">
|
|
||||||
<RequiresUserInput>true</RequiresUserInput>
|
|
||||||
<CommandLine>powershell.exe -File C:\Deploy\Scripts\FirstLogon.ps1</CommandLine>
|
|
||||||
<Order>1</Order>
|
|
||||||
</SynchronousCommand>
|
|
||||||
</FirstLogonCommands>
|
|
||||||
</component>
|
|
||||||
<component name="Microsoft-Windows-International-Core" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<InputLocale>en-US</InputLocale>
|
|
||||||
<SystemLocale>en-US</SystemLocale>
|
|
||||||
<UILanguage>en-US</UILanguage>
|
|
||||||
<UserLocale>en-US</UserLocale>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<settings pass="generalize">
|
|
||||||
<component name="Microsoft-Windows-Security-SPP" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS" xmlns:wcm="http://schemas.microsoft.com/WMIConfig/2002/State" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<SkipRearm>1</SkipRearm>
|
|
||||||
</component>
|
|
||||||
</settings>
|
|
||||||
<cpi:offlineImage cpi:source="wim:d:/aik/install.wim#Windows Server 2012 SERVERSTANDARD" xmlns:cpi="urn:schemas-microsoft-com:cpi" />
|
|
||||||
</unattend>
|
|
@ -1,28 +0,0 @@
|
|||||||
<#
|
|
||||||
Naming convention:
|
|
||||||
|
|
||||||
== Normal variables
|
|
||||||
** Set: $NormalVar = 123
|
|
||||||
** Get: Write-Host $NormalVar
|
|
||||||
|
|
||||||
== Script-scope variables
|
|
||||||
** Set: $script:__ScriptScopeVar = 123
|
|
||||||
** Get: Write-Host $__ScriptScopeVar
|
|
||||||
|
|
||||||
== Global-scope variables
|
|
||||||
** Set: $global:__GlobalScopeVar__ = 123
|
|
||||||
** Get: Write-Host $__GlobalScopeVar__
|
|
||||||
#>
|
|
||||||
|
|
||||||
$script:__ModulePath = $PsScriptRoot
|
|
||||||
$script:__ModuleName = $PsScriptRoot.Split("\")[-1]
|
|
||||||
$script:__DefaultLogPath = [IO.Path]::Combine([IO.Path]::GetTempPath(), "PowerShell_$__ModuleName.log")
|
|
||||||
|
|
||||||
|
|
||||||
$script:__RequiredModules = @("ServerManager", "DnsClient")
|
|
||||||
$script:__ImportModulesExplicitely = $true
|
|
||||||
$script:__ImportModulesErrorAction = "Stop"
|
|
||||||
|
|
||||||
|
|
||||||
$global:__StopExecutionPreference__ = "Exit"
|
|
||||||
|
|
Binary file not shown.
@ -1,36 +0,0 @@
|
|||||||
# Import config first
|
|
||||||
. "$PsScriptRoot\Config.ps1"
|
|
||||||
|
|
||||||
# Import functions from 'Include' subfolder
|
|
||||||
Get-ChildItem "$PsScriptRoot\Include" -Filter "*.ps1" |
|
|
||||||
ForEach-Object {
|
|
||||||
. "$($_.FullName)"
|
|
||||||
}
|
|
||||||
|
|
||||||
trap { Stop-Execution $_ }
|
|
||||||
|
|
||||||
Export-ModuleMember -Function * -Alias *
|
|
||||||
|
|
||||||
<#
|
|
||||||
if ($__ImportModulesExplicitely) {
|
|
||||||
foreach ($Module in $__RequiredModules) {
|
|
||||||
Write-Log "Importing module '$Module' ..."
|
|
||||||
Import-Module -Name "$Module" -ErrorAction "$__ImportModulesErrorAction"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#>
|
|
||||||
|
|
||||||
Write-Log "Module loaded from '$PsScriptRoot'"
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
switch ($Args[0]) {
|
|
||||||
'installTo' {
|
|
||||||
Install-Module -InstallPath $args[1] -ModulePath $PsScriptRoot
|
|
||||||
}
|
|
||||||
'register' {
|
|
||||||
Register-Module "$PsScriptRoot"
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
}
|
|
||||||
}
|
|
Binary file not shown.
@ -1,99 +0,0 @@
|
|||||||
|
|
||||||
Function ConvertTo-Base64String {
|
|
||||||
<#
|
|
||||||
#>
|
|
||||||
[CmdletBinding(DefaultParameterSetName="FromString")]
|
|
||||||
param (
|
|
||||||
[Parameter(Position=1,ParameterSetName="FromString")]
|
|
||||||
[String] $String,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="FromFile")]
|
|
||||||
[String] $Path,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="FromFile")]
|
|
||||||
[Int] $ChunkSize = 5KB,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="FromFile")]
|
|
||||||
[Switch] $OneChunk
|
|
||||||
)
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"FromString" {
|
|
||||||
[System.Text.Encoding]::UTF8.GetBytes($String)
|
|
||||||
[System.Convert]::ToBase64String($Bytes)
|
|
||||||
}
|
|
||||||
"FromFile" {
|
|
||||||
$FileStream = [IO.File]::Open($Path, [System.IO.FileMode]::Open)
|
|
||||||
$BytesToRead = $FileStream.Length
|
|
||||||
|
|
||||||
if ($OneChunk) {
|
|
||||||
$ChunkSize = $BytesToRead
|
|
||||||
}
|
|
||||||
|
|
||||||
$Bytes = New-Object Byte[] $ChunkSize
|
|
||||||
while ($BytesToRead -gt 0) {
|
|
||||||
if ($BytesToRead -lt $ChunkSize) {
|
|
||||||
$ChunkSize = $BytesToRead
|
|
||||||
$Bytes = New-Object Byte[] $ChunkSize
|
|
||||||
}
|
|
||||||
#Write-Host ("BytesToRead: {0}, ChunkSize: {1}" -f $BytesToRead, $ChunkSize )
|
|
||||||
$BytesRead = $FileStream.Read($Bytes, 0, $ChunkSize)
|
|
||||||
$BytesToRead -= $BytesRead
|
|
||||||
|
|
||||||
[System.Convert]::ToBase64String($Bytes)
|
|
||||||
}
|
|
||||||
$FileStream.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function ConvertFrom-Base64String {
|
|
||||||
<#
|
|
||||||
#>
|
|
||||||
[CmdletBinding(DefaultParameterSetName="ToByteArray")]
|
|
||||||
param (
|
|
||||||
[Parameter(Position=1,ValueFromPipeline=$true)]
|
|
||||||
[String] $Base64String,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ToFile")]
|
|
||||||
[String] $Path,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ToString")]
|
|
||||||
[Switch] $ToString
|
|
||||||
)
|
|
||||||
begin {
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"ToFile" {
|
|
||||||
if ([IO.File]::Exists($Path)) {
|
|
||||||
[IO.File]::Delete($Path)
|
|
||||||
}
|
|
||||||
$FileStream = [IO.File]::Open($Path, [IO.FileMode]::Append)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
process {
|
|
||||||
foreach( $Line in ($Base64String -split '\n')) {
|
|
||||||
$Bytes = [System.Convert]::FromBase64String($Line)
|
|
||||||
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"ToFile" {
|
|
||||||
$FileStream.Write($Bytes, 0, $Bytes.Length)
|
|
||||||
}
|
|
||||||
"ToString" {
|
|
||||||
[System.Text.Encoding]::UTF8.GetString($Bytes)
|
|
||||||
}
|
|
||||||
"ToByteArray" {
|
|
||||||
$Bytes
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
end {
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"ToFile" {
|
|
||||||
$FileStream.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,388 +0,0 @@
|
|||||||
Function Stop-Execution {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Breaks execution with specified error code.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Function break script execution with error code provided. Error code may be 0 in case of non-error stop.
|
|
||||||
|
|
||||||
It also tries to parse ErrorRecord or Exception object (if provided) and logs this information.
|
|
||||||
#>
|
|
||||||
[CmdletBinding(DefaultParameterSetName="Exception")]
|
|
||||||
|
|
||||||
param (
|
|
||||||
[Parameter(Position=1,ParameterSetName="Exception")]
|
|
||||||
$InputObject = $null,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ErrorString")]
|
|
||||||
[String] $ExitString = "",
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ErrorString")]
|
|
||||||
[Int] $ExitCode = 0,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ErrorString")]
|
|
||||||
[Switch] $Success
|
|
||||||
)
|
|
||||||
|
|
||||||
Function Exit-Function {
|
|
||||||
if ($ExitCode -eq 0) {
|
|
||||||
Write-LogInfo ( "STOP ({0}):`n{1}" -f $ExitCode, $ExitString )
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-LogFatal ( "STOP ({0}):`n{1}" -f $ExitCode, $ExitString )
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "__StopExecutionPreference__ = '$__StopExecutionPreference__'"
|
|
||||||
switch ("$__StopExecutionPreference__") {
|
|
||||||
"Exit" {
|
|
||||||
exit $ExitCode
|
|
||||||
}
|
|
||||||
"ThrowIfException" {
|
|
||||||
if ($InputObject -eq $null) {
|
|
||||||
exit $ExitCode
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw $InputObject
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"ThrowAlways" {
|
|
||||||
throw $InputObject
|
|
||||||
}
|
|
||||||
default {
|
|
||||||
throw "Unknown value for __StopExecutionPreference__: '$__StopExecutionPreference__'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"Exception" {
|
|
||||||
#----------
|
|
||||||
if ($InputObject -eq $null) {
|
|
||||||
$ExitString = "***** SCRIPT INTERRUPTED *****"
|
|
||||||
$ExitCode = 255
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
#----------
|
|
||||||
|
|
||||||
|
|
||||||
#----------
|
|
||||||
try {
|
|
||||||
$ErrorRecord = [System.Management.Automation.ErrorRecord] $InputObject
|
|
||||||
<#
|
|
||||||
$ExitString = @"
|
|
||||||
$($ErrorRecord.ToString())
|
|
||||||
|
|
||||||
*** Invocation Info ***
|
|
||||||
$($ErrorRecord.InvocationInfo.PositionMessage)
|
|
||||||
|
|
||||||
*** CategoryInfo ***
|
|
||||||
$($ErrorRecord.CategoryInfo.ToString())
|
|
||||||
|
|
||||||
*** FullyQualifiedErrorId ***
|
|
||||||
$($ErrorRecord.FullyQualifiedErrorId.ToString())
|
|
||||||
|
|
||||||
*** ScriptStackTrace ***
|
|
||||||
$($ErrorRecord.ScriptStackTrace.ToString())
|
|
||||||
*** *** ***
|
|
||||||
"@
|
|
||||||
#>
|
|
||||||
$ExitString = Out-String -InputObject $InputObject
|
|
||||||
$ExitCode = 255
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
$ErrorRecord = $null
|
|
||||||
Write-LogWarning "Unable to cast InputObject to [System.Management.Automation.ErrorRecord]"
|
|
||||||
}
|
|
||||||
#----------
|
|
||||||
|
|
||||||
|
|
||||||
#----------
|
|
||||||
try {
|
|
||||||
$Exception = [System.Exception] $InputObject
|
|
||||||
#$ExitString = $Exception.ToString()
|
|
||||||
$ExitString = Out-String -InputObject $InputObject
|
|
||||||
$ExitCode = 255
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
$Exception = $null
|
|
||||||
Write-LogWarning "Unable to cast InputObject to [System.Exception]"
|
|
||||||
}
|
|
||||||
#----------
|
|
||||||
|
|
||||||
|
|
||||||
#----------
|
|
||||||
try {
|
|
||||||
$ExitString = Out-String -InputObject $InputObject
|
|
||||||
$ExitCode = 255
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-LogWarning "Unable to cast InputObject of type [$($InputObject.GetType())] to any of supported types."
|
|
||||||
}
|
|
||||||
#----------
|
|
||||||
}
|
|
||||||
"ErrorString" {
|
|
||||||
if ($Success) {
|
|
||||||
$ExitString = "Script stopped with NO ERROR."
|
|
||||||
$ExitCode = 0
|
|
||||||
}
|
|
||||||
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ExitString = "Unknown error occured in Stop-Execution"
|
|
||||||
$ExitCode = 255
|
|
||||||
Exit-Function
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Get-PasswordAsSecureString {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Convert to / request password as secure string.
|
|
||||||
#>
|
|
||||||
[CmdletBinding()]
|
|
||||||
param (
|
|
||||||
[String] $Password = "",
|
|
||||||
[String] $Prompt = "Please enter password"
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($Password -eq "") {
|
|
||||||
Read-Host -Prompt $Prompt -AsSecureString
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ConvertTo-SecureString -String "$Password" -AsPlainText -Force
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function New-Credential {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Create new creadential object with username and password provided.
|
|
||||||
#>
|
|
||||||
[CmdletBinding()]
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory=$true)]
|
|
||||||
[String] $UserName,
|
|
||||||
|
|
||||||
[String] $Password
|
|
||||||
)
|
|
||||||
|
|
||||||
$SecurePassword = Get-PasswordAsSecureString -Password "$Password"
|
|
||||||
New-Object System.Management.Automation.PSCredential( "$UserName", $SecurePassword )
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Invoke-WMSettingsChange {
|
|
||||||
if (-not ("win32.nativemethods" -as [type])) {
|
|
||||||
# Import SendMessageTimeout from Win32
|
|
||||||
Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition @"
|
|
||||||
[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
|
|
||||||
public static extern IntPtr SendMessageTimeout(
|
|
||||||
IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam,
|
|
||||||
uint fuFlags, uint uTimeout, out UIntPtr lpdwResult);
|
|
||||||
"@
|
|
||||||
}
|
|
||||||
|
|
||||||
$HWND_BROADCAST = [IntPtr]0xFFFF
|
|
||||||
$WM_SETTINGCHANGE = 0x001A
|
|
||||||
$result = [UIntPtr]::Zero
|
|
||||||
|
|
||||||
# Notify all windows of environment block change
|
|
||||||
Write-Log "Executing 'SendMessageTimeout' ..."
|
|
||||||
|
|
||||||
$retval = [Win32.NativeMethods]::SendMessageTimeout($HWND_BROADCAST, $WM_SETTINGCHANGE,
|
|
||||||
[UIntPtr]::Zero, "Environment", 2, 5000, [ref] $result)
|
|
||||||
|
|
||||||
Write-Log "'SendMessageTimeout' returned '$retval' (non-zero is OK)"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Start-Program {
|
|
||||||
param (
|
|
||||||
[String] $FilePath,
|
|
||||||
[String[]] $ArgumentList = @(' '),
|
|
||||||
[Int] $Timeout = 0,
|
|
||||||
[Switch] $NoWait,
|
|
||||||
[Switch] $PassThru,
|
|
||||||
[String] $WorkingDir = (Get-Location).ProviderPath
|
|
||||||
)
|
|
||||||
|
|
||||||
trap {
|
|
||||||
Write-LogError $_.Exception.Message
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "Starting program: $FilePath $ArgumentList"
|
|
||||||
|
|
||||||
$ProcessStartInfo = New-Object System.Diagnostics.ProcessStartInfo
|
|
||||||
$ProcessStartInfo.FileName = $FilePath
|
|
||||||
$ProcessStartInfo.Arguments = $ArgumentList
|
|
||||||
$ProcessStartInfo.CreateNoWindow = $true
|
|
||||||
$ProcessStartInfo.RedirectStandardOutput = $true
|
|
||||||
$ProcessStartInfo.RedirectStandardError = $true
|
|
||||||
$ProcessStartInfo.UseShellExecute = $false
|
|
||||||
$ProcessStartInfo.WorkingDirectory = $WorkingDir
|
|
||||||
|
|
||||||
$Process = [System.Diagnostics.Process]::Start($ProcessStartInfo)
|
|
||||||
|
|
||||||
if ($NoWait) {
|
|
||||||
if ($PassThru) {
|
|
||||||
return $Process
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ($Timeout -eq 0) {
|
|
||||||
$Process.WaitForExit()
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$Process.WaitForExit($Timeout)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ProcessResult = New-Object PSObject |
|
|
||||||
Add-Member -Name "ExitCode" -MemberType NoteProperty -Value $Process.ExitCode -PassThru |
|
|
||||||
Add-Member -Name "StdOut" -MemberType NoteProperty -Value $Process.StandardOutput.ReadToEnd() -PassThru |
|
|
||||||
Add-Member -Name "StdErr" -MemberType NoteProperty -Value $Process.StandardError.ReadToEnd() -PassThru
|
|
||||||
|
|
||||||
$Process = $null
|
|
||||||
|
|
||||||
Write-Log ( "STDOUT:`n{0}" -f $ProcessResult.StdOut )
|
|
||||||
Write-Log ":STDOUT"
|
|
||||||
|
|
||||||
Write-Log ( "STDERR:`n{0}" -f $ProcessResult.StdErr )
|
|
||||||
Write-Log ":STDERR"
|
|
||||||
|
|
||||||
Write-Log "Program has finished with exit code ($($ProcessResult.ExitCode))"
|
|
||||||
|
|
||||||
if ($PassThru) {
|
|
||||||
return $ProcessResult
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Exec -Value Start-Program
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Backup-File {
|
|
||||||
param (
|
|
||||||
[String] $Path
|
|
||||||
)
|
|
||||||
|
|
||||||
$BackupFile = "$Path.bak"
|
|
||||||
|
|
||||||
if (-not [IO.File]::Exists($Path)) {
|
|
||||||
Write-LogError "Unable to backup file '$Path': file not exists."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([IO.File]::Exists($BackupFile)) {
|
|
||||||
try {
|
|
||||||
[IO.File]::Delete($BackupFile)
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-LogError "Unable to delete existing .bak file '$BackupFile'."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "Backing up file '$Path' to '$BackupFile'"
|
|
||||||
[IO.File]::Copy($Path, $BackupFile, $true)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Install-Module {
|
|
||||||
param (
|
|
||||||
[String] $InstallPath,
|
|
||||||
[String] $ModulePath,
|
|
||||||
[String] $ModuleName
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($ModuleName -eq "") {
|
|
||||||
if ($ModulePath -eq "") {
|
|
||||||
Stop-Execution -ExitString "Don't know which module should be installed."
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$ModuleName = $ModulePath.Split("\")[-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($InstallPath -eq "") {
|
|
||||||
Stop-Execution -ExitString "To install the module destination path must be provided."
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Log "Installing the module to '$InstallPath'"
|
|
||||||
|
|
||||||
$NewModulePath = [IO.Path]::Combine($InstallPath, $ModuleName)
|
|
||||||
if ([IO.Directory]::Exists($NewModulePath)) {
|
|
||||||
[IO.Directory]::Delete($NewModulePath, $true)
|
|
||||||
}
|
|
||||||
|
|
||||||
Copy-Item -Path $ModulePath -Destination $InstallPath -Recurse -Force -ErrorAction Stop
|
|
||||||
|
|
||||||
Update-PsModulePath -AddPath "$InstallPath"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Register-Module {
|
|
||||||
param (
|
|
||||||
[String] $ModulePath
|
|
||||||
)
|
|
||||||
$ModuleRoot = Split-Path -Path $ModulePath -Parent
|
|
||||||
Write-Log "Registering the module at '$ModuleRoot'"
|
|
||||||
Update-PsModulePath -AddPath "$ModuleRoot"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function Test-ModuleVersion {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Test module version.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Function specified module (current module by default), and compares it's version to version provided.
|
|
||||||
Returned values:
|
|
||||||
* -2 : error occured
|
|
||||||
* -1 : module's version is lower than one provided
|
|
||||||
* 0 : module's version is equal to one provided
|
|
||||||
* 1 : module's version is greater than one provided
|
|
||||||
#>
|
|
||||||
param (
|
|
||||||
[String] $Name = "$__ModuleName",
|
|
||||||
[String] $Version
|
|
||||||
)
|
|
||||||
|
|
||||||
$ModuleVersion = (Get-Module -Name $Name -ListAvailable).Version
|
|
||||||
|
|
||||||
if ($ModuleVersion -eq $null) {
|
|
||||||
Write-Log "Module '$Name' not found."
|
|
||||||
return -2
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$RequiredVersion = [System.Version]::Parse($Version)
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Log "'$Version' is not a correct version string."
|
|
||||||
return -2
|
|
||||||
}
|
|
||||||
|
|
||||||
$ModuleVersion.CompareTo($RequiredVersion)
|
|
||||||
}
|
|
@ -1,137 +0,0 @@
|
|||||||
Function Initialize-Logger {
|
|
||||||
param (
|
|
||||||
[String] $ModuleName = $__ModuleName,
|
|
||||||
[String] $LogPath = $__DefaultLogPath
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not ("log4net.LogManager" -as [type])) {
|
|
||||||
$FileStream = ([System.IO.FileInfo] (Get-Item "$__ModulePath\log4net.dll")).OpenRead()
|
|
||||||
|
|
||||||
$AssemblyBytes = New-Object Byte[] $FileStream.Length
|
|
||||||
[Void] $FileStream.Read($AssemblyBytes, 0, $FileStream.Length)
|
|
||||||
|
|
||||||
$FileStream.Close()
|
|
||||||
|
|
||||||
[Void] [System.Reflection.Assembly]::Load($AssemblyBytes)
|
|
||||||
}
|
|
||||||
|
|
||||||
[log4net.GlobalContext]::Properties["LogPath"] = $LogPath
|
|
||||||
[log4net.GlobalContext]::Properties["ModuleName"] = $ModuleName
|
|
||||||
|
|
||||||
$script:__Logger = [log4net.LogManager]::GetLogger("PowerShell")
|
|
||||||
|
|
||||||
$Log4NetConfig = New-Object System.IO.FileInfo("$__ModulePath\log4net.config")
|
|
||||||
|
|
||||||
[log4net.Config.XmlConfigurator]::Configure($Log4NetConfig)
|
|
||||||
|
|
||||||
$__Logger.info("Logger initialized. Log file: '$LogPath'`n")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Function Out-LogInfo {
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[Switch] $EntireObject
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
if ($EntireObject) {
|
|
||||||
$__Logger.info("`n$(Out-String -InputObject $InputObject)")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach ($Object in $InputObject) {
|
|
||||||
$__Logger.info((Out-String -InputObject $Object))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Out-Log -Value Out-LogInfo
|
|
||||||
New-Alias -Name Write-Log -Value Out-LogInfo
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Out-LogWarning {
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[Switch] $EntireObject
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
if ($EntireObject) {
|
|
||||||
$__Logger.warn("`n$(Out-String -InputObject $InputObject)")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach ($Object in $InputObject) {
|
|
||||||
$__Logger.warn((Out-String -InputObject $Object))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Write-LogWarning -Value Out-LogWarning
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Out-LogError {
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[Switch] $EntireObject
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
if ($EntireObject) {
|
|
||||||
$__Logger.error("`n$(Out-String -InputObject $InputObject)")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach ($Object in $InputObject) {
|
|
||||||
$__Logger.error((Out-String -InputObject $Object))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Write-LogError -Value Out-LogError
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Out-LogFatal {
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[Switch] $EntireObject
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
if ($EntireObject) {
|
|
||||||
$__Logger.fatal("`n$(Out-String -InputObject $InputObject)")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach ($Object in $InputObject) {
|
|
||||||
$__Logger.fatal((Out-String -InputObject $Object))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Write-LogFatal -Value Out-LogFatal
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Out-LogDebug {
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[Switch] $EntireObject
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
if ($EntireObject) {
|
|
||||||
$__Logger.debug("`n$(Out-String -InputObject $InputObject)")
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
foreach ($Object in $InputObject) {
|
|
||||||
$__Logger.debug((Out-String -InputObject $Object))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
New-Alias -Name Write-LogDebug -Value Out-LogDebug
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Initialize-Logger
|
|
@ -1,814 +0,0 @@
|
|||||||
Function Set-LocalUserPassword {
|
|
||||||
param (
|
|
||||||
[String] $UserName,
|
|
||||||
[String] $Password,
|
|
||||||
[Switch] $Force
|
|
||||||
)
|
|
||||||
|
|
||||||
trap { Stop-Execution $_ }
|
|
||||||
|
|
||||||
if ((Get-WmiObject Win32_UserAccount -Filter "LocalAccount = 'True' AND Name='$UserName'") -eq $null) {
|
|
||||||
throw "Unable to find local user account '$UserName'"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Force) {
|
|
||||||
Write-Log "Changing password for user '$UserName' to '*****'" # :)
|
|
||||||
([ADSI] "WinNT://./$UserName").SetPassword($Password) | Out-Null
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-LogWarning "You are trying to change the password for the user '$UserName'. To do this please run the command again with -Force parameter."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Set-AutoLogonCredentials {
|
|
||||||
param (
|
|
||||||
[String] $DomainName,
|
|
||||||
[String] $UserName,
|
|
||||||
[String] $Password
|
|
||||||
)
|
|
||||||
|
|
||||||
$KeyName = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
|
|
||||||
|
|
||||||
if ($DomainName -ne "") {
|
|
||||||
$UserName = "$DomainName\$UserName"
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "Setting AutoLogon credentials ..."
|
|
||||||
try {
|
|
||||||
[Microsoft.Win32.Registry]::SetValue($KeyName, "DefaultUserName", "$UserName", [Microsoft.Win32.RegistryValueKind]::String)
|
|
||||||
[Microsoft.Win32.Registry]::SetValue($KeyName, "DefaultPassword", "$Password", [Microsoft.Win32.RegistryValueKind]::String)
|
|
||||||
[Microsoft.Win32.Registry]::SetValue($KeyName, "AutoAdminLogon", "1", [Microsoft.Win32.RegistryValueKind]::String)
|
|
||||||
[Microsoft.Win32.Registry]::SetValue($KeyName, "ForceAutoLogon", "1", [Microsoft.Win32.RegistryValueKind]::String)
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-LogError "FAILED"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "SUCCESS"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Join-Domain {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Executes "Join domain" action.
|
|
||||||
#>
|
|
||||||
param (
|
|
||||||
[String] $DomainName,
|
|
||||||
[String] $UserName,
|
|
||||||
[String] $Password,
|
|
||||||
[Switch] $AllowRestart
|
|
||||||
)
|
|
||||||
|
|
||||||
$Credential = New-Credential -UserName "$DomainName\$UserName" -Password $Password
|
|
||||||
|
|
||||||
# Add the computer to the domain
|
|
||||||
if (Test-ComputerName -DomainName $DomainName) {
|
|
||||||
#Stop-Execution -Success -ExitString "Computer already joined to domain '$DomainName'"
|
|
||||||
Write-LogWarning "Computer already joined to domain '$DomainName'"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Log "Joining computer to domain '$DomainName' ..."
|
|
||||||
|
|
||||||
Add-Computer -DomainName $DomainName -Credential $Credential -Force -ErrorAction Stop
|
|
||||||
|
|
||||||
if ($AllowRestart) {
|
|
||||||
Write-Log "Restarting computer ..."
|
|
||||||
Restart-Computer -Force
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
#Stop-Execution -ExitCode 3010 -ExitString "Please restart the computer now."
|
|
||||||
Write-Log "Please restart the computer now."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Expand-Template {
|
|
||||||
param (
|
|
||||||
[String] $TemplateFile,
|
|
||||||
[String] $OutputFile,
|
|
||||||
[System.Collections.Hashtable] $ReplacementList,
|
|
||||||
[String] $Encoding = "Ascii"
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [IO.File]::Exists($TemplateFile)) {
|
|
||||||
Write-Error "File '$TemplateFile' not exists"
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([IO.File]::Exists($OutputFile)) {
|
|
||||||
[IO.File]::Delete($OutputFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
Get-Content $TemplateFile -Encoding $Encoding |
|
|
||||||
ForEach-Object {
|
|
||||||
$Line = $_
|
|
||||||
foreach ($Key in $ReplacementList.Keys) {
|
|
||||||
$Line = $Line.Replace("%_$($Key)_%", $ReplacementList[$Key])
|
|
||||||
}
|
|
||||||
Add-Content -Path $OutputFile -Encoding $Encoding -Value $Line
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Add-WindowsFeatureWrapper {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Wraps Install-WindowsFeature function.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This function adds some logic to multiple feature installation.
|
|
||||||
|
|
||||||
It fails if any of required features fails.
|
|
||||||
|
|
||||||
It reports that reboot required if it is required, or restarts the computer.
|
|
||||||
#>
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory=$true)]
|
|
||||||
[String[]] $Name,
|
|
||||||
[Switch] $IncludeManagementTools,
|
|
||||||
[Switch] $AllowRestart,
|
|
||||||
[Switch] $NotifyRestart
|
|
||||||
)
|
|
||||||
|
|
||||||
$RestartNeeded = $false
|
|
||||||
|
|
||||||
foreach ($Feature in $Name) {
|
|
||||||
Write-Log "Installing feature '$Feature' ..."
|
|
||||||
$Action = Install-WindowsFeature `
|
|
||||||
-Name $Feature `
|
|
||||||
-IncludeManagementTools:$IncludeManagementTools `
|
|
||||||
-ErrorAction Stop
|
|
||||||
|
|
||||||
if ($Action.Success -eq $true) {
|
|
||||||
if ($Action.FeatureResult.RestartNeeded -eq $true) {
|
|
||||||
Write-LogWarning "Restart required"
|
|
||||||
$RestartNeeded = $true
|
|
||||||
}
|
|
||||||
Write-Log "Feature '$Feature' installed successfully"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Stop-Execution "Failed to install feature '$Feature'"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($RestartNeeded) {
|
|
||||||
Write-Log "Restart required to finish feature(s) installation."
|
|
||||||
if ($AllowRestart) {
|
|
||||||
Write-Log "Restarting computer ..."
|
|
||||||
Restart-Computer -Force
|
|
||||||
}
|
|
||||||
elseif ($NotifyRestart) {
|
|
||||||
Stop-Execution -ExitCode 3010 -ExitString "Please restart the computer now."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Test-WmiReturnValue {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Check the ReturnValue property of the object provided.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
This funciton checks if ReturnValue property is equal to 0.
|
|
||||||
|
|
||||||
=== TODO ===
|
|
||||||
If it is not, then funtion should try to provide desctiption for the error code based on the WMI object type.
|
|
||||||
WMI object type must be provided explicitely.
|
|
||||||
#>
|
|
||||||
param (
|
|
||||||
[Parameter(ValueFromPipeline=$true,Mandatory=$true)]
|
|
||||||
$InputObject,
|
|
||||||
[String] $Type = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
try {
|
|
||||||
$ReturnValue = $InputObject.ReturnValue
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
throw "Property 'ReturnValue' not found on this object"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ReturnValue -eq 0) {
|
|
||||||
Write-Log "WMI operation completed successfully"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Operation failed with status code = $ReturnValue"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Set-NetworkAdapterConfiguration {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Set network adapter configuration.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS> Set-NetworkAdapterConfiguration -MACAddress aa:bb:cc:dd:ee:ff -Auto
|
|
||||||
|
|
||||||
Convert "dynamic" parameters (DHCP) to "static" (manual) for network adapter with MAC address aa:bb:cc:dd:ee:ff
|
|
||||||
|
|
||||||
.EXAMPLE
|
|
||||||
PS> Set-NetworkAdapterConfiguration -MACAddress aa:bb:cc:dd:ee:ff -DNSServer "192.168.0.1","192.168.0.2"
|
|
||||||
|
|
||||||
Configure DNS servers list for network adapter with MAC address aa:bb:cc:dd:ee:ff
|
|
||||||
|
|
||||||
#>
|
|
||||||
param (
|
|
||||||
[String] $MACAddress = "",
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ManualConfig")]
|
|
||||||
[String] $IPAddress = "",
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ManualConfig")]
|
|
||||||
[String] $IPNetmask = "",
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ManualConfig")]
|
|
||||||
[String[]] $IPGateway = @(),
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ManualConfig")]
|
|
||||||
[String[]] $DNSServer = @(),
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="ManualConfig")]
|
|
||||||
[Switch] $FirstAvailable,
|
|
||||||
|
|
||||||
[String] $Name = "",
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="AutoConfig",Mandatory=$true)]
|
|
||||||
[Switch] $Auto,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="AutoConfig")]
|
|
||||||
[Switch] $All
|
|
||||||
)
|
|
||||||
|
|
||||||
Write-Log "Configuring network adapter(s) ..."
|
|
||||||
|
|
||||||
:SetIPAddress switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"AutoConfig" {
|
|
||||||
Write-Log "'auto' mode"
|
|
||||||
|
|
||||||
$IPv4RegExp = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
|
|
||||||
|
|
||||||
if ($All -eq $true) {
|
|
||||||
$Filter = { $_.AdapterTypeId -eq 0 }
|
|
||||||
$Name = ""
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$Filter = { $_.MACAddress -eq $MACAddress }
|
|
||||||
}
|
|
||||||
|
|
||||||
Get-WmiObject Win32_NetworkAdapter |
|
|
||||||
Where-Object $Filter |
|
|
||||||
ForEach-Object {
|
|
||||||
$NetworkAdapter = $_
|
|
||||||
$AdapterConfig = Get-WmiObject Win32_NetworkAdapterConfiguration |
|
|
||||||
Where-Object { $_.Index -eq $NetworkAdapter.DeviceId }
|
|
||||||
|
|
||||||
Write-Log "Configuring '$($NetworkAdapter.Name)' ..."
|
|
||||||
|
|
||||||
for ($i = 0; $i -lt $AdapterConfig.IPAddress.Length; $i++) {
|
|
||||||
if ($AdapterConfig.IPAddress[$i] -match $IPv4RegExp) {
|
|
||||||
$IPAddress = $AdapterConfig.IPAddress[$i]
|
|
||||||
$IPNetmask = $AdapterConfig.IPSubnet[$i]
|
|
||||||
$IPGateway = $AdapterConfig.DefaultIPGateway
|
|
||||||
$DNSServer = $AdapterConfig.DNSServerSearchOrder
|
|
||||||
|
|
||||||
Write-Log "Setting IP address ($IPAddress), netmask ($IPNetmask) ..."
|
|
||||||
$AdapterConfig.EnableStatic($IPAddress, $IPNetmask) | Out-Null
|
|
||||||
|
|
||||||
Write-Log "Setting default gateways ($IPGateway) ..."
|
|
||||||
$AdapterConfig.SetGateways($IPGateway) | Out-Null
|
|
||||||
|
|
||||||
Write-Log "Setting DNS servers ($DNSServer) ..."
|
|
||||||
$AdapterConfig.SetDNSServerSearchOrder($DNSServer) | Out-Null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "'$($NetworkAdapter.Name)' configured"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"ManualConfig" {
|
|
||||||
Write-Log "'manual' mode"
|
|
||||||
if ( $FirstAvailable ) {
|
|
||||||
Write-Log "Selecting first available network adapter ..."
|
|
||||||
$NetworkAdapter = Get-WmiObject Win32_NetworkAdapter |
|
|
||||||
Where-Object { $_.AdapterTypeId -eq 0 } |
|
|
||||||
Select-Object -First 1
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$NetworkAdapter = Get-WmiObject Win32_NetworkAdapter |
|
|
||||||
Where-Object { $_.MACAddress -eq $MACAddress }
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( $NetworkAdapter -eq $null ) {
|
|
||||||
Write-LogError "Network adapter with MAC = '$MACAddress' not found."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$AdapterConfig = Get-WmiObject Win32_NetworkAdapterConfiguration |
|
|
||||||
Where-Object { $_.Index -eq $NetworkAdapter.DeviceId }
|
|
||||||
|
|
||||||
if (($IPAddress -ne "") -and ($IPNetmask -ne "")) {
|
|
||||||
Write-Log "Configuring IP address / netmask for '$($NetworkAdapter.Name)' ..."
|
|
||||||
|
|
||||||
<#
|
|
||||||
for ($i = 0; $i -lt $AdapterConfig.IPAddress.Length; $i++)
|
|
||||||
{
|
|
||||||
if (($AdapterConfig.IPAddress[$i] -eq $IPAddress) -and ($AdapterConfig.IPSubnet[$i] -eq $IPNetmask))
|
|
||||||
{
|
|
||||||
Write-Log "There is an adapter with required configuration."
|
|
||||||
break SetIPAddress
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#>
|
|
||||||
Write-Log "Setting IP address $IPAddress, netmask $IPNetmask"
|
|
||||||
$AdapterConfig.EnableStatic("$IPAddress", "$IPNetmask") | Out-Null
|
|
||||||
|
|
||||||
Write-Log "IP address configured."
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($IPGateway.Count -gt 0) {
|
|
||||||
Write-Log "Configuring IP gateway for '$($NetworkAdapter.Name)' ..."
|
|
||||||
|
|
||||||
$AdapterConfig.SetGateways($IPGateway) | Out-Null
|
|
||||||
|
|
||||||
Write-Log "IP gateway configured."
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($DNSServer.Count -gt 0) {
|
|
||||||
Write-Log "Configuring DNS server(s) for '$($NetworkAdapter.Name)' ..."
|
|
||||||
|
|
||||||
$AdapterConfig.SetDNSServerSearchOrder($DNSServer) | Out-Null
|
|
||||||
|
|
||||||
Write-Log "DNS configured."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Name -ne "") {
|
|
||||||
Write-Log "Changing adapter name '$($NetworkAdapter.NetConnectionId)' --> '$Name'"
|
|
||||||
$NetworkAdapter.NetConnectionId = "$Name"
|
|
||||||
$NetworkAdapter.Put() | Out-Null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Show-EthernetNetworkAdapters {
|
|
||||||
Get-WmiObject Win32_NetworkAdapter -Filter "PhysicalAdapter = 'True' AND AdapterTypeId = '0'" |
|
|
||||||
Select-Object 'Index','MACAddress','NetConnectionId'
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Test-ComputerName {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Test if computer name is set, and the computer belongs to specified domain / workgroup.
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Function tests the following conditions:
|
|
||||||
* the computer name is equal to the provided one
|
|
||||||
* the computer is a part of domain
|
|
||||||
* the computer belongs to the specified domain
|
|
||||||
* the computer belongs to the specified workgroup
|
|
||||||
|
|
||||||
Multiple checks are logically ANDed.
|
|
||||||
#>
|
|
||||||
[CmdletBinding()]
|
|
||||||
param (
|
|
||||||
[String] $ComputerName,
|
|
||||||
[String] $DomainName,
|
|
||||||
[String] $WorkgroupName,
|
|
||||||
[Switch] $PartOfDomain
|
|
||||||
)
|
|
||||||
process {
|
|
||||||
$ComputerSystem = Get-WmiObject Win32_ComputerSystem
|
|
||||||
|
|
||||||
if (($ComputerName -ne "") -and ($ComputerSystem.Name -ne "$ComputerName")) {
|
|
||||||
Write-Error "ComputerName is not equal to '$ComputerName'"
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($DomainName -ne "") -and ($ComputerSystem.Domain -ne "$DomainName")) {
|
|
||||||
Write-Error "DomainName is not equal to '$DomainName'"
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($WorkgroupName -ne "") -and ($ComputerSystem.Workgroup -ne "$WorkgroupName")) {
|
|
||||||
Write-Error "WorkgroupName is not equal to '$WorkgroupName'"
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($PartOfDOmain -eq $true) -and ($ComputerSystem.PartOfDomain -eq $false)) {
|
|
||||||
Write-Error "Computer is not the part of any domain."
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Set-ComputerName {
|
|
||||||
param (
|
|
||||||
[String] $Name
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# Rename the computer
|
|
||||||
if ($Name -ne "") {
|
|
||||||
if (Test-ComputerName -ComputerName $Name) {
|
|
||||||
Stop-Execution -Success -ExitString "Computer name already configured"
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Log "Renaming computer to '$Name'"
|
|
||||||
|
|
||||||
Rename-Computer -NewName $NewName -Force -ErrorAction Stop
|
|
||||||
|
|
||||||
Stop-Execution -ExitCode 3010 -ExitString "Please restart the computer now"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Resolve-LdapDnsName {
|
|
||||||
param (
|
|
||||||
[String] $DomainName
|
|
||||||
)
|
|
||||||
|
|
||||||
Resolve-DNSName -Type "SRV" -Name "_ldap._tcp.dc._msdcs.$DomainName" |
|
|
||||||
Where-Object { $_.Type -eq "A" } |
|
|
||||||
Select-Object -Property Name,IPAddress
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Wait-LdapServerAvailable {
|
|
||||||
param (
|
|
||||||
[String] $DomainName,
|
|
||||||
[Int] $PingSeqCountThreshold = 10,
|
|
||||||
[Int] $PingSeqPerHostThreshold = 5
|
|
||||||
)
|
|
||||||
|
|
||||||
$LdapServerList = @( Resolve-LdapDnsName $DomainName )
|
|
||||||
Write-Log @( "Ldap server list:", ( $LdapServerList | Out-String ) )
|
|
||||||
|
|
||||||
:MainLoop foreach ($LdapServer in $LdapServerList) {
|
|
||||||
$PingSeqCount = 0
|
|
||||||
$PingSeqPerHost = 0
|
|
||||||
while ($PingSeqPerHost -lt $PingSeqPerHostThreshold) {
|
|
||||||
if (Test-Connection -ComputerName $LdapServer.IpAddress -Count 1 -Quiet) {
|
|
||||||
Write-Log "Ping '$($LdapServer.Name)' OK"
|
|
||||||
$PingSeqCount++
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Log "Ping '$($LdapServer.Name)' FAILED"
|
|
||||||
$PingSeqCount = 0
|
|
||||||
$PingSeqPerHost++
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($PingSeqCount -ge $PingSeqCountThreshold) {
|
|
||||||
Write-Log "Returning true"
|
|
||||||
return $true
|
|
||||||
}
|
|
||||||
|
|
||||||
Start-Sleep -Seconds 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Write-Log "Returning false"
|
|
||||||
return $false
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Get-ConfigDriveObject {
|
|
||||||
[CmdletBinding()]
|
|
||||||
param (
|
|
||||||
[Parameter(ParameterSetName="MetaData")]
|
|
||||||
[Switch] $MetaData,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="UserData")]
|
|
||||||
[Switch] $UserData,
|
|
||||||
|
|
||||||
[Parameter(ParameterSetName="CustomObject")]
|
|
||||||
[String] $CustomObject,
|
|
||||||
|
|
||||||
[String] $Path = "openstack/latest"
|
|
||||||
)
|
|
||||||
|
|
||||||
$ConfigDrivePrefix = "http://169.254.169.154/$Path"
|
|
||||||
|
|
||||||
try {
|
|
||||||
switch($PSCmdlet.ParameterSetName) {
|
|
||||||
"MetaData" {
|
|
||||||
$ConfigDriveObjectUrl = "$ConfigDrivePrefix/meta_data.json"
|
|
||||||
$MetaData = Invoke-WebRequest $ConfigDriveObjectUrl
|
|
||||||
ConvertFrom-Json $MetaData.Content
|
|
||||||
}
|
|
||||||
"UserData" {
|
|
||||||
$ConfigDriveObjectUrl = "$ConfigDrivePrefix/user_data"
|
|
||||||
$UserData = Invoke-WebRequest $ConfigDriveObjectUrl
|
|
||||||
$UserData.Content
|
|
||||||
}
|
|
||||||
"CustomObject" {
|
|
||||||
$ConfigDriveObjectUrl = "$ConfigDrivePrefix/$CustomObject"
|
|
||||||
$CustomObject = Invoke-WebRequest $ConfigDriveObjectUrl
|
|
||||||
$CustomObject.Content
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-Error "Unable to retrieve object from 'ConfigDriveObjectUrl'"
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Update-AgentConfig {
|
|
||||||
param (
|
|
||||||
[String] $RootPath = "C:\Keero\Agent"
|
|
||||||
)
|
|
||||||
|
|
||||||
try {
|
|
||||||
$MetaData = Get-ConfigDriveObject -MetaData -ErrorAction Stop
|
|
||||||
if ($MetaData.meta -ne $null) {
|
|
||||||
Stop-Service "Keero Agent" -Force
|
|
||||||
Expand-Template -TemplateFile "$RootPath\WindowsAgent.exe.config.template" -OutputFile "$RootPath\WindowsAgent.exe.config" -ReplacementList $MetaData.meta
|
|
||||||
Start-Service "Keero Agent"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
Write-LogError "Failed to update agent configuration"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Update-PsModulePath {
|
|
||||||
param (
|
|
||||||
[String] $AddPath = ""
|
|
||||||
)
|
|
||||||
|
|
||||||
$NewPsModulePath = (
|
|
||||||
@([Environment]::GetEnvironmentVariable("PsModulePath", [EnvironmentVariableTarget]::Machine) -split ";") + @($AddPath) `
|
|
||||||
| Select-Object -Unique
|
|
||||||
) -join ';'
|
|
||||||
|
|
||||||
[Environment]::SetEnvironmentVariable("PsModulePath", $NewPsModulePath, [EnvironmentVariableTarget]::Machine)
|
|
||||||
|
|
||||||
Invoke-WMSettingsChange
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function Get-ModuleHelp {
|
|
||||||
param (
|
|
||||||
[String] $ModuleName = $__ModuleName,
|
|
||||||
[String] $Path = "",
|
|
||||||
[Switch] $File,
|
|
||||||
[Int] $Width = 80
|
|
||||||
)
|
|
||||||
|
|
||||||
$sb = {
|
|
||||||
$Module = Get-Module $ModuleName
|
|
||||||
|
|
||||||
"`n"
|
|
||||||
"Module: $($Module.Name)"
|
|
||||||
"Module version: $($Module.Version)"
|
|
||||||
"`n"
|
|
||||||
"{0} Module Description {0}" -f ('=' * 30)
|
|
||||||
"`n"
|
|
||||||
|
|
||||||
Get-Help "about_$($Module.Name)" | Out-String -Width $Width
|
|
||||||
|
|
||||||
"{0} Exported Functions {0}" -f ('=' * 30)
|
|
||||||
"`n"
|
|
||||||
|
|
||||||
foreach ($CommandName in $Module.ExportedCommands.Keys) {
|
|
||||||
'-' * 80
|
|
||||||
Get-Help -Name $CommandName -Detailed | Out-String -Width $Width
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (($File) -and ($Path -eq "")) {
|
|
||||||
$Path = [IO.Path]::GetTempFileName()
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($Path -ne "") {
|
|
||||||
& $sb | Out-File -FilePath $Path -Force
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
& $sb | Out-Default
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($File) {
|
|
||||||
notepad.exe "$Path"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Function New-ModuleTemplate {
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory=$true)]
|
|
||||||
[String] $Name,
|
|
||||||
|
|
||||||
[String] $Path = "$($Env:USERPROFILE)\Documents\WindowsPowerShell\Modules",
|
|
||||||
|
|
||||||
[Switch] $Force
|
|
||||||
)
|
|
||||||
if ([IO.Directory]::Exists("$Path\$Name")) {
|
|
||||||
if ($Force) {
|
|
||||||
[IO.Directory]::Delete("$Path\$Name", $true)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Write-Error "Folder '$Path\$Name' already exists. Remove it manually or specify -Force switch."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[IO.Directory]::CreateDirectory("$Path\$Name")
|
|
||||||
[IO.Directory]::CreateDirectory("$Path\$Name\en-US")
|
|
||||||
[IO.Directory]::CreateDirectory("$Path\$Name\include")
|
|
||||||
|
|
||||||
|
|
||||||
Set-Content -Path "$Path\$Name\en-US\about_$Name.help.txt" -Value @'
|
|
||||||
'@
|
|
||||||
|
|
||||||
|
|
||||||
Set-Content -Path "$Path\$Name\Config.ps1" -Value @'
|
|
||||||
$script:__ModulePath = $PsScriptRoot
|
|
||||||
$script:__ModuleName = $PsScriptRoot.Split("\")[-1]
|
|
||||||
$script:__DefaultLogPath = [IO.Path]::Combine([IO.Path]::GetTempPath(), "PowerShell_$__ModuleName.log")
|
|
||||||
|
|
||||||
$global:__StopExecutionExitsSession__ = $false
|
|
||||||
'@
|
|
||||||
|
|
||||||
|
|
||||||
Set-Content -Path "$Path\$Name\$Name.psm1" -Value @'
|
|
||||||
# Import config first
|
|
||||||
. "$PsScriptRoot\Config.ps1"
|
|
||||||
|
|
||||||
# Import functions from 'Include' subfolder
|
|
||||||
Get-ChildItem "$PsScriptRoot\Include" -Filter "*.ps1" |
|
|
||||||
ForEach-Object {
|
|
||||||
. "$($_.FullName)"
|
|
||||||
}
|
|
||||||
|
|
||||||
Export-ModuleMember -Function * -Alias *
|
|
||||||
|
|
||||||
Initialize-Logger -ModuleName $__ModuleName -LogPath $__DefaultLogPath
|
|
||||||
|
|
||||||
Write-Log "Module loaded from '$PsScriptRoot'"
|
|
||||||
'@
|
|
||||||
|
|
||||||
|
|
||||||
New-ModuleManifest `
|
|
||||||
-Path "$Path\$Name\$Name.psd1" `
|
|
||||||
-ModuleToProcess "$Name.psm1" `
|
|
||||||
-RequiredModules "CoreFunctions"
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function New-SqlServerConnection {
|
|
||||||
param (
|
|
||||||
[String] $ServerName,
|
|
||||||
[String] $UserName = '',
|
|
||||||
[String] $Password = '',
|
|
||||||
$Credentials,
|
|
||||||
[Switch] $SqlAuth
|
|
||||||
)
|
|
||||||
|
|
||||||
if ($Credentials -eq $null) {
|
|
||||||
if ($UserName -eq '') {
|
|
||||||
throw "User name must be provided in order to create credentials object!"
|
|
||||||
}
|
|
||||||
|
|
||||||
$Credentials = New-Credential -UserName $UserName -Password $Password
|
|
||||||
}
|
|
||||||
|
|
||||||
$Server = New-Object `
|
|
||||||
-TypeName Microsoft.SqlServer.Management.Smo.Server `
|
|
||||||
-ArgumentList $ServerName
|
|
||||||
|
|
||||||
$LoginName = $Credentials.UserName -replace("^\\", "")
|
|
||||||
|
|
||||||
try {
|
|
||||||
if ($SqlAuth) {
|
|
||||||
$Server.ConnectionContext.set_LoginSecure($false)
|
|
||||||
$Server.ConnectionContext.set_Login($LoginName)
|
|
||||||
$Server.ConnectionContext.set_SecurePassword($Credentials.Password)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
throw "Not implemented!"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch {
|
|
||||||
return $null
|
|
||||||
}
|
|
||||||
|
|
||||||
$Server
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function Import-SqlServerAssemblies {
|
|
||||||
<#
|
|
||||||
.SYNOPSIS
|
|
||||||
Import assemblies required to work with Sql Server instance from PowerShell
|
|
||||||
|
|
||||||
.DESCRIPTION
|
|
||||||
Possible assembly list:
|
|
||||||
"Microsoft.SqlServer.Management.Common"
|
|
||||||
"Microsoft.SqlServer.Smo"
|
|
||||||
"Microsoft.SqlServer.Dmf"
|
|
||||||
"Microsoft.SqlServer.Instapi"
|
|
||||||
"Microsoft.SqlServer.SqlWmiManagement"
|
|
||||||
"Microsoft.SqlServer.ConnectionInfo"
|
|
||||||
"Microsoft.SqlServer.SmoExtended"
|
|
||||||
"Microsoft.SqlServer.SqlTDiagM"
|
|
||||||
"Microsoft.SqlServer.SString"
|
|
||||||
"Microsoft.SqlServer.Management.RegisteredServers"
|
|
||||||
"Microsoft.SqlServer.Management.Sdk.Sfc"
|
|
||||||
"Microsoft.SqlServer.SqlEnum"
|
|
||||||
"Microsoft.SqlServer.RegSvrEnum"
|
|
||||||
"Microsoft.SqlServer.WmiEnum"
|
|
||||||
"Microsoft.SqlServer.ServiceBrokerEnum"
|
|
||||||
"Microsoft.SqlServer.ConnectionInfoExtended"
|
|
||||||
"Microsoft.SqlServer.Management.Collector"
|
|
||||||
"Microsoft.SqlServer.Management.CollectorEnum"
|
|
||||||
"Microsoft.SqlServer.Management.Dac"
|
|
||||||
"Microsoft.SqlServer.Management.DacEnum"
|
|
||||||
"Microsoft.SqlServer.Management.Utility"
|
|
||||||
|
|
||||||
.LINKS
|
|
||||||
http://msdn.microsoft.com/en-us/library/cc281962%28v=sql.105%29.aspx
|
|
||||||
#>
|
|
||||||
$AssemblyList = @(
|
|
||||||
"Microsoft.SqlServer.Smo"
|
|
||||||
"Microsoft.SqlServer.SmoExtended"
|
|
||||||
)
|
|
||||||
|
|
||||||
foreach ($asm in $AssemblyList) {
|
|
||||||
[System.Reflection.Assembly]::LoadWithPartialName($asm) | Out-Null
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function Import-SqlServerProvider {
|
|
||||||
$SqlPsReg="HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.SqlServer.Management.PowerShell.sqlps"
|
|
||||||
|
|
||||||
if (Get-ChildItem $SqlPsReg -ErrorAction "SilentlyContinue") {
|
|
||||||
throw "SQL Server Provider for Windows PowerShell is not installed."
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$Item = Get-ItemProperty $SqlPsReg
|
|
||||||
$SqlPsPath = [System.IO.Path]::GetDirectoryName($Item.Path)
|
|
||||||
}
|
|
||||||
|
|
||||||
#
|
|
||||||
# Set mandatory variables for the SQL Server provider
|
|
||||||
#
|
|
||||||
$global:SqlServerMaximumChildItems = 0
|
|
||||||
$global:SqlServerConnectionTimeout = 30
|
|
||||||
$global:SqlServerIncludeSystemObjects = $false
|
|
||||||
$global:SqlServerMaximumTabCompletion = 1000
|
|
||||||
|
|
||||||
#
|
|
||||||
# Load the snapins, type data, format data
|
|
||||||
#
|
|
||||||
Push-Location
|
|
||||||
Set-Location $sqlpsPath
|
|
||||||
|
|
||||||
Add-PSSnapin SqlServerCmdletSnapin100
|
|
||||||
Add-PSSnapin SqlServerProviderSnapin100
|
|
||||||
|
|
||||||
Update-TypeData -PrependPath SQLProvider.Types.ps1xml
|
|
||||||
Update-FormatData -PrependPath SQLProvider.Format.ps1xml
|
|
||||||
|
|
||||||
Pop-Location
|
|
||||||
}
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
|
|
@ -1,69 +0,0 @@
|
|||||||
[Void] [System.Reflection.Assembly]::LoadFrom("$__ModulePath\Ionic.Zip.dll")
|
|
||||||
|
|
||||||
|
|
||||||
Function Compress-Folder {
|
|
||||||
<#
|
|
||||||
#>
|
|
||||||
[CmdLetBinding()]
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory=$true)]
|
|
||||||
[String] $Path,
|
|
||||||
|
|
||||||
[String] $ZipFile = "",
|
|
||||||
|
|
||||||
[Switch] $TempFile,
|
|
||||||
|
|
||||||
[Switch] $ContentOnly
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [IO.Directory]::Exists($Path)) {
|
|
||||||
Write-LogError "Directory '$Path' not found."
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($TempFile) {
|
|
||||||
$ZipFile = [IO.Path]::GetTempFileName()
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ZipFile -eq "") {
|
|
||||||
$ZipFile = "$Path.zip"
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([IO.File]::Exists($ZipFile)) {
|
|
||||||
[IO.File]::Delete($ZipFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
$zip = New-Object Ionic.Zip.ZipFile
|
|
||||||
if ($ContentOnly) {
|
|
||||||
[Void] $zip.AddDirectory($Path)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
[Void] $zip.AddDirectory($Path, (Split-Path -Path $Path -Leaf))
|
|
||||||
}
|
|
||||||
$zip.Save($ZipFile)
|
|
||||||
$zip.Dispose()
|
|
||||||
|
|
||||||
return $ZipFile
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Function Expand-Zip {
|
|
||||||
<#
|
|
||||||
#>
|
|
||||||
[CmdletBinding()]
|
|
||||||
param (
|
|
||||||
[Parameter(Mandatory=$true)]
|
|
||||||
[String] $Path,
|
|
||||||
|
|
||||||
[String] $Destination
|
|
||||||
)
|
|
||||||
|
|
||||||
if (-not [IO.File]::Exists($Path)) {
|
|
||||||
Write-LogError "File not found '$Path'"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
$zip = [Ionic.Zip.ZipFile]::Read($Path)
|
|
||||||
$zip.ExtractAll($Destination, [Ionic.Zip.ExtractExistingFileAction]::OverwriteSilently)
|
|
||||||
$zip.Dispose()
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
<log4net>
|
|
||||||
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender" >
|
|
||||||
<param name="File" type="log4net.Util.PatternString" value="%property{LogPath}" />
|
|
||||||
<param name="AppendToFile" value="true" />
|
|
||||||
<param name="RollingStyle" value="Size" />
|
|
||||||
<param name="MaxSizeRollBackups" value="100" />
|
|
||||||
<param name="MaximumFileSize" value="1024KB" />
|
|
||||||
<param name="StaticLogFileName" value="true" />
|
|
||||||
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
|
|
||||||
<layout type="log4net.Layout.PatternLayout">
|
|
||||||
<param name="ConversionPattern" value="%date [%-5level] [%property{ModuleName}] %message" />
|
|
||||||
</layout>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
|
|
||||||
<mapping>
|
|
||||||
<level value="error" />
|
|
||||||
<foreColor value="Red, HighIntensity" />
|
|
||||||
</mapping>
|
|
||||||
<mapping>
|
|
||||||
<level value="warn" />
|
|
||||||
<foreColor value="Yellow, HighIntensity" />
|
|
||||||
</mapping>
|
|
||||||
<mapping>
|
|
||||||
<level value="info" />
|
|
||||||
<foreColor value="Green, HighIntensity" />
|
|
||||||
</mapping>
|
|
||||||
<layout type="log4net.Layout.PatternLayout">
|
|
||||||
<conversionPattern value="%date [%-5level] [%property{ModuleName}] %message" />
|
|
||||||
</layout>
|
|
||||||
</appender>
|
|
||||||
|
|
||||||
<!--root>
|
|
||||||
<level value="info" />
|
|
||||||
</root-->
|
|
||||||
|
|
||||||
<logger name="PowerShell" additivity="false">
|
|
||||||
<!--level value="info" /-->
|
|
||||||
<appender-ref ref="ColoredConsoleAppender" />
|
|
||||||
<appender-ref ref="RollingFileAppender" />
|
|
||||||
</logger>
|
|
||||||
</log4net>
|
|
Binary file not shown.
@ -1,11 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
username=Admin
|
|
||||||
groups=Administrators
|
|
||||||
inject_user_password=false
|
|
||||||
network_adapters=
|
|
||||||
config_drive_raw_hdd=false
|
|
||||||
config_drive_cdrom=false
|
|
||||||
verbose=true
|
|
||||||
logdir=C:\Program Files (x86)\Cloudbase Solutions\Cloudbase-Init\log\
|
|
||||||
logfile=cloudbase-init.log
|
|
||||||
plugins=cloudbaseinit.plugins.windows.userdata.UserDataPlugin
|
|
@ -1,37 +0,0 @@
|
|||||||
import codecs
|
|
||||||
|
|
||||||
from cloudbaseinit.osutils.factory import *
|
|
||||||
from cloudbaseinit.plugins.base import *
|
|
||||||
from cloudbaseinit.openstack.common import log as logging
|
|
||||||
|
|
||||||
opts = [
|
|
||||||
cfg.StrOpt('agent_config_file', default='C:\\Keero\\Agent\\WindowsAgent.exe.config', help='')
|
|
||||||
]
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
|
||||||
CONF.register_opts(opts)
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class SetHostNamePlugin(BasePlugin):
|
|
||||||
def execute(self, service):
|
|
||||||
meta_data = service.get_meta_data('openstack')
|
|
||||||
if 'meta' not in meta_data:
|
|
||||||
LOG.debug("Section 'meta' not found in metadata")
|
|
||||||
return False
|
|
||||||
|
|
||||||
if 'agent_config_xml' not in meta_data['meta']:
|
|
||||||
LOG.debug("Config for agent not found in metadata section")
|
|
||||||
return False
|
|
||||||
|
|
||||||
try:
|
|
||||||
configFile=codecs.open(CONF.agent_config_file, encoding='utf-8', mode='w+')
|
|
||||||
configFile.write(meta_data['meta']['agent_config_xml'])
|
|
||||||
configFile.close()
|
|
||||||
except:
|
|
||||||
LOG.error("Unable to update agent file.")
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
|
|
||||||
from cloudbaseinit.osutils.factory import *
|
|
||||||
from cloudbaseinit.plugins.base import *
|
|
||||||
from cloudbaseinit.openstack.common import log as logging
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class SetHostNamePlugin(BasePlugin):
|
|
||||||
def execute(self, service):
|
|
||||||
meta_data = service.get_meta_data('openstack')
|
|
||||||
if 'name' not in meta_data:
|
|
||||||
LOG.debug('Name not found in metadata')
|
|
||||||
return False
|
|
||||||
|
|
||||||
osutils = OSUtilsFactory().get_os_utils()
|
|
||||||
|
|
||||||
new_host_name = meta_data['name'].replace('.', '-')
|
|
||||||
return osutils.set_host_name(new_host_name)
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
|||||||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
||||||
|
|
||||||
# Copyright 2012 Cloudbase Solutions Srl
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
|
|
||||||
import re
|
|
||||||
import tempfile
|
|
||||||
import uuid
|
|
||||||
import email
|
|
||||||
import tempfile
|
|
||||||
import os
|
|
||||||
import errno
|
|
||||||
|
|
||||||
from cloudbaseinit.openstack.common import cfg
|
|
||||||
from cloudbaseinit.openstack.common import log as logging
|
|
||||||
from cloudbaseinit.osutils.factory import *
|
|
||||||
from cloudbaseinit.plugins.base import *
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
opts = [
|
|
||||||
cfg.StrOpt('user_data_folder', default='cloud-data',
|
|
||||||
help='Specifies a folder to store multipart data files.'),
|
|
||||||
]
|
|
||||||
|
|
||||||
CONF = cfg.CONF
|
|
||||||
CONF.register_opts(opts)
|
|
||||||
|
|
||||||
class UserDataPlugin():
|
|
||||||
def __init__(self, cfg=CONF):
|
|
||||||
self.cfg = cfg
|
|
||||||
self.msg = None
|
|
||||||
return
|
|
||||||
|
|
||||||
def execute(self, service):
|
|
||||||
user_data = service.get_user_data('openstack')
|
|
||||||
if not user_data:
|
|
||||||
return False
|
|
||||||
|
|
||||||
LOG.debug('User data content:\n%s' % user_data)
|
|
||||||
|
|
||||||
if user_data.startswith('Content-Type: multipart'):
|
|
||||||
for part in self.parse_MIME(user_data):
|
|
||||||
self.process_part(part)
|
|
||||||
else:
|
|
||||||
self.handle(user_data)
|
|
||||||
return
|
|
||||||
|
|
||||||
def process_part(self, part):
|
|
||||||
if part.get_filename() == 'cfn-userdata':
|
|
||||||
self.handle(part.get_payload())
|
|
||||||
return
|
|
||||||
|
|
||||||
def parse_MIME(self, user_data):
|
|
||||||
folder = self.cfg.user_data_folder
|
|
||||||
self.create_folder(folder)
|
|
||||||
|
|
||||||
self.msg = email.message_from_string(user_data)
|
|
||||||
return self.msg.walk()
|
|
||||||
|
|
||||||
|
|
||||||
def create_folder(self, folder):
|
|
||||||
try:
|
|
||||||
os.mkdir(folder)
|
|
||||||
except os.OSError, e:
|
|
||||||
if e.errno != errno.EEXIST:
|
|
||||||
raise e
|
|
||||||
return
|
|
||||||
|
|
||||||
def handle(self, user_data):
|
|
||||||
|
|
||||||
osutils = OSUtilsFactory().get_os_utils()
|
|
||||||
|
|
||||||
target_path = os.path.join(tempfile.gettempdir(), str(uuid.uuid4()))
|
|
||||||
if re.search(r'^rem cmd\s', user_data, re.I):
|
|
||||||
target_path += '.cmd'
|
|
||||||
args = [target_path]
|
|
||||||
shell = True
|
|
||||||
elif re.search(r'^#!', user_data, re.I):
|
|
||||||
target_path += '.sh'
|
|
||||||
args = ['bash.exe', target_path]
|
|
||||||
shell = False
|
|
||||||
elif re.search(r'^#ps1\s', user_data, re.I):
|
|
||||||
target_path += '.ps1'
|
|
||||||
args = ['powershell.exe', '-ExecutionPolicy', 'RemoteSigned',
|
|
||||||
'-NonInteractive', target_path]
|
|
||||||
shell = False
|
|
||||||
else:
|
|
||||||
# Unsupported
|
|
||||||
LOG.warning('Unsupported user_data format')
|
|
||||||
return False
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open(target_path, 'wb') as f:
|
|
||||||
f.write(user_data)
|
|
||||||
(out, err, ret_val) = osutils.execute_process(args, shell)
|
|
||||||
|
|
||||||
LOG.info('User_data script ended with return code: %d' % ret_val)
|
|
||||||
LOG.debug('User_data stdout:\n%s' % out)
|
|
||||||
LOG.debug('User_data stderr:\n%s' % err)
|
|
||||||
except Exception, ex:
|
|
||||||
LOG.warning('An error occurred during user_data execution: \'%s\'' % ex)
|
|
||||||
finally:
|
|
||||||
if os.path.exists(target_path):
|
|
||||||
os.remove(target_path)
|
|
||||||
|
|
||||||
return False
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
|||||||
Import-Module CoreFunctions
|
|
||||||
|
|
||||||
$ModuleBase = "C:\Keero\Modules"
|
|
||||||
|
|
||||||
|
|
||||||
$NewModule_Name = "ModuleName"
|
|
||||||
$NewModule_Base64 = @'
|
|
||||||
%BASE64_STRINGS%
|
|
||||||
'@
|
|
||||||
|
|
||||||
|
|
||||||
$AgentConfig_Path = "C:\Keero\Agent\WindowsAgent.exe.config"
|
|
||||||
$AgentConfig_Base64 = @'
|
|
||||||
%AGENT_CONFIG_BASE64%
|
|
||||||
'@
|
|
||||||
|
|
||||||
|
|
||||||
ConvertFrom-Base64String -Base64String $NewModule_Base64 -Path "$ModuleBase\$NewModule_Name.zip"
|
|
||||||
Remove-Item -Path "$ModuleBase\$NewModule_Name" -Recurse -Force
|
|
||||||
Expand-Zip -Path "$ModuleBase\$NewModule_Name.zip" -Destination "$ModuleBase\$NewModule_Name"
|
|
||||||
|
|
||||||
|
|
||||||
Remove-Item -Path $AgentConfig_Path -Force
|
|
||||||
ConvertFrom-Base64String -Base64String $NewModule_Base64 -Path $AgentConfig_Path
|
|
@ -1,51 +0,0 @@
|
|||||||
# Devstack's config file for COMPUTE intallation
|
|
||||||
|
|
||||||
|
|
||||||
lab_id=102
|
|
||||||
lab_password=swordfish
|
|
||||||
lab_controller=172.18.124.100
|
|
||||||
|
|
||||||
|
|
||||||
SERVICE_HOST=$lab_controller
|
|
||||||
HOST_IP=172.18.124.${lab_id}
|
|
||||||
MULTI_HOST=1
|
|
||||||
|
|
||||||
|
|
||||||
FLAT_INTERFACE=eth1
|
|
||||||
#PUBLIC_INTERFACE=eth0.261
|
|
||||||
|
|
||||||
|
|
||||||
FIXED_RANGE=192.168.102.0/24
|
|
||||||
FIXED_NETWORK_SIZE=254
|
|
||||||
FLOATING_RANGE=172.18.124.228/27
|
|
||||||
|
|
||||||
|
|
||||||
MYSQL_HOST=$lab_controller
|
|
||||||
RABBIT_HOST=$lab_controller
|
|
||||||
GLANCE_HOSTPORT=$lab_controller:9292
|
|
||||||
KEYSTONE_AUTH_HOST=$lab_controller
|
|
||||||
KEYSTONE_SERVICE_HOST=$lab_controller
|
|
||||||
|
|
||||||
|
|
||||||
VNCSERVER_LISTEN=$HOST_IP
|
|
||||||
VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP
|
|
||||||
|
|
||||||
|
|
||||||
ADMIN_PASSWORD=$lab_password
|
|
||||||
MYSQL_PASSWORD=$lab_password
|
|
||||||
RABBIT_PASSWORD=$lab_password
|
|
||||||
SERVICE_PASSWORD=$lab_password
|
|
||||||
SERVICE_TOKEN=tokentoken
|
|
||||||
|
|
||||||
|
|
||||||
ENABLED_SERVICES=n-cpu,n-net,n-api,n-vol,n-novnc
|
|
||||||
|
|
||||||
|
|
||||||
SCREEN_LOGDIR=/opt/stack/log/
|
|
||||||
LOGFILE=$SCREEN_LOGDIR/stack.sh.log
|
|
||||||
|
|
||||||
|
|
||||||
API_RATE_LIMIT=False
|
|
||||||
|
|
||||||
|
|
||||||
EXTRA_OPTS=(force_config_drive=true libvirt_images_type=qcow2 force_raw_images=false sql_connection=mysql://root:${MYSQL_PASSWORD}@${MYSQL_HOST}/nova?charset=utf8)
|
|
@ -1,45 +0,0 @@
|
|||||||
# Devstack's localrc for CONTROLLER installation
|
|
||||||
|
|
||||||
|
|
||||||
lab_id=100
|
|
||||||
lab_password=swordfish
|
|
||||||
|
|
||||||
|
|
||||||
HOST_IP=172.18.124.${lab_id}
|
|
||||||
|
|
||||||
|
|
||||||
FLAT_INTERFACE=eth1
|
|
||||||
#PUBLIC_INTERFACE=eth0.261
|
|
||||||
|
|
||||||
|
|
||||||
FIXED_RANGE=192.168.102.0/24
|
|
||||||
FIXED_NETWORK_SIZE=254
|
|
||||||
PUBLIC_RANGE=172.18.124.228/27
|
|
||||||
|
|
||||||
|
|
||||||
ADMIN_PASSWORD=$lab_password
|
|
||||||
MYSQL_PASSWORD=$lab_password
|
|
||||||
RABBIT_PASSWORD=$lab_password
|
|
||||||
SERVICE_PASSWORD=$lab_password
|
|
||||||
SERVICE_TOKEN=tokentoken
|
|
||||||
|
|
||||||
|
|
||||||
disable_service n-cpu
|
|
||||||
disable_service n-vol
|
|
||||||
|
|
||||||
|
|
||||||
ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng
|
|
||||||
ENABLED_SERVICES+=,conductor,portas
|
|
||||||
|
|
||||||
|
|
||||||
SCREEN_LOGDIR=/opt/stack/log/
|
|
||||||
LOGFILE=$SCREEN_LOGDIR/stack.sh.log
|
|
||||||
|
|
||||||
|
|
||||||
API_RATE_LIMIT=False
|
|
||||||
|
|
||||||
|
|
||||||
MULTI_HOST=1
|
|
||||||
|
|
||||||
|
|
||||||
EXTRA_OPTS=(force_config_drive=true libvirt_images_type=qcow2 force_raw_images=false)
|
|
@ -1,28 +0,0 @@
|
|||||||
lab_id=101
|
|
||||||
lab_password=swordfish
|
|
||||||
|
|
||||||
HOST_IP=172.18.124.${lab_id}
|
|
||||||
#PUBLIC_INTERFACE=eth1
|
|
||||||
|
|
||||||
FIXED_RANGE=10.0.${lab_id}.0/24
|
|
||||||
NETWORK_GATEWAY=10.0.${lab_id}.1
|
|
||||||
|
|
||||||
#PUBLIC_INTERFACE=eth0
|
|
||||||
FLAT_INTERFACE=eth1
|
|
||||||
|
|
||||||
ADMIN_PASSWORD=$lab_password
|
|
||||||
MYSQL_PASSWORD=$lab_password
|
|
||||||
RABBIT_PASSWORD=$lab_password
|
|
||||||
SERVICE_PASSWORD=$lab_password
|
|
||||||
SERVICE_TOKEN=tokentoken
|
|
||||||
ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng
|
|
||||||
ENABLED_SERVICES+=,conductor,portas
|
|
||||||
|
|
||||||
LOGFILE=/opt/stack/devstack/stack.sh.log
|
|
||||||
SCREEN_LOGDIR=/opt/stack/log/
|
|
||||||
#SCREEN_LOGDIR=/dev/null
|
|
||||||
|
|
||||||
API_RATE_LIMIT=False
|
|
||||||
|
|
||||||
EXTRA_OPTS=(force_config_drive=true libvirt_images_type=qcow2 force_raw_images=false)
|
|
||||||
|
|
@ -1,148 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
|
|
||||||
# Checks an environment variable is not set or has length 0 OR if the
|
|
||||||
# exit code is non-zero and prints "message" and exits
|
|
||||||
# NOTE: env-var is the variable name without a '$'
|
|
||||||
# die_if_not_set env-var "message"
|
|
||||||
function die_if_not_set() {
|
|
||||||
local exitcode=$?
|
|
||||||
set +o xtrace
|
|
||||||
local evar=$1; shift
|
|
||||||
if ! is_set $evar || [ $exitcode != 0 ]; then
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
die "Env var '$evar' is not set!"
|
|
||||||
else
|
|
||||||
die $@
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function restart_service {
|
|
||||||
while [[ -n "$1" ]] ; do
|
|
||||||
_echo "Restarting service '$1' ..."
|
|
||||||
sudo service $1 restart
|
|
||||||
shift 1
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function move_mysql_data_to_ramdrive {
|
|
||||||
# Moving MySQL database to tmpfs
|
|
||||||
#-------------------------------
|
|
||||||
if [[ $(trueorfalse True $MYSQL_DB_TMPFS) = "True" ]] ; then
|
|
||||||
die_if_not_set MYSQL_DB_TMPFS_SIZE
|
|
||||||
mount_dir=/var/lib/mysql
|
|
||||||
sudo -s << EOF
|
|
||||||
echo "Stopping MySQL Server"
|
|
||||||
service mysql stop
|
|
||||||
|
|
||||||
umount $mount_dir
|
|
||||||
mount -t tmpfs -o size=$MYSQL_DB_TMPFS_SIZE tmpfs $mount_dir
|
|
||||||
chmod 700 $mount_dir
|
|
||||||
chown mysql:mysql $mount_dir
|
|
||||||
|
|
||||||
mysql_install_db
|
|
||||||
|
|
||||||
/usr/bin/mysqld_safe --skip-grant-tables &
|
|
||||||
sleep 5
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo mysql << EOF
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('swordfish');
|
|
||||||
SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('swordfish');
|
|
||||||
EOF
|
|
||||||
|
|
||||||
sudo -s << EOF
|
|
||||||
killall mysqld
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
echo "Starting MySQL Server"
|
|
||||||
service mysql start
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
_echo "MYSQL_DB_TMPFS = '$MYSQL_DB_TMPFS'"
|
|
||||||
fi
|
|
||||||
#-------------------------------
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function move_nova_cache_to_ramdrive {
|
|
||||||
# Moving nova images cache to tmpfs
|
|
||||||
#----------------------------------
|
|
||||||
if [[ $(trueorfalse True $NOVA_CACHE_TMPFS) = "True" ]] ; then
|
|
||||||
die_if_not_set NOVA_CACHE_TMPFS_SIZE
|
|
||||||
mount_dir=/opt/stack/data/nova/instances
|
|
||||||
sudo -s << EOF
|
|
||||||
umount $mount_dir
|
|
||||||
mount -t tmpfs -o size=$NOVA_CACHE_TMPFS_SIZE tmpfs $mount_dir
|
|
||||||
chmod 775 $mount_dir
|
|
||||||
chown stack:stack $mount_dir
|
|
||||||
EOF
|
|
||||||
else
|
|
||||||
_echo "NOVA_CACHE_TMPFS = '$NOVA_CACHE_TMPFS'"
|
|
||||||
fi
|
|
||||||
#----------------------------------
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function check_if_folder_exists {
|
|
||||||
if [[ ! -d "$1" ]] ; then
|
|
||||||
_echo "Folder '$1' not exists!"
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function validate_install_mode {
|
|
||||||
case $INSTALL_MODE in
|
|
||||||
'standalone')
|
|
||||||
check_if_folder_exists "$SCRIPTS_DIR/standalone" || exit
|
|
||||||
;;
|
|
||||||
'multihost')
|
|
||||||
check_if_folder_exists "$SCRIPTS_DIR/controller" || exit
|
|
||||||
check_if_folder_exists "$SCRIPTS_DIR/compute" || exit
|
|
||||||
;;
|
|
||||||
'controller')
|
|
||||||
check_if_folder_exists "$SCRIPTS_DIR/controller" || exit
|
|
||||||
;;
|
|
||||||
'compute')
|
|
||||||
check_if_folder_exists "$SCRIPTS_DIR/compute" || exit
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
_echo "Wrong install mode '$INSTALL_MODE'"
|
|
||||||
exit
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function update_devstack_localrc {
|
|
||||||
local $__install_mode=$1
|
|
||||||
|
|
||||||
[[ -z "$__install_mode" ]] \
|
|
||||||
&& die "Install mode for update_devstack_localrc not provided!"
|
|
||||||
|
|
||||||
# Replacing devstack's localrc config
|
|
||||||
#------------------------------------
|
|
||||||
devstack_localrc="$SCRIPTS_DIR/$__install_mode/devstack.localrc"
|
|
||||||
if [[ -f $devstack_localrc ]] ; then
|
|
||||||
rm -f "$DEVSTACK_DIR/localrc"
|
|
||||||
cp $devstack_localrc "$DEVSTACK_DIR/localrc"
|
|
||||||
else
|
|
||||||
_echo "File '$devstack_localrc' not found!"
|
|
||||||
fi
|
|
||||||
#------------------------------------
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
function _echo {
|
|
||||||
echo "[$(hostname)] $@"
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,21 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
|
|
||||||
groupadd stack
|
|
||||||
useradd -g stack -s /bin/bash -m stack
|
|
||||||
|
|
||||||
echo 'stack ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/stack
|
|
||||||
chmod 0440 /etc/sudoers.d/stack
|
|
||||||
|
|
||||||
mkdir -p $DEVSTACK_INSTALL_DIR
|
|
||||||
chmod stack:stack $DEVSTACK_INSTALL_DIR
|
|
||||||
|
|
||||||
sudo -u stack << EOF
|
|
||||||
cd
|
|
||||||
rm -rf devstack
|
|
||||||
git clone git://github.com/openstack-dev/devstack.git
|
|
||||||
EOF
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
DEVSTACK_DIR=/home/stack/devstack
|
|
||||||
DEVSTACK_INSTALL_DIR=/opt/stack
|
|
||||||
|
|
||||||
MYSQL_DB_TMPFS=true
|
|
||||||
MYSQL_DB_TMPFS_SIZE=128M
|
|
||||||
|
|
||||||
NOVA_CACHE_TMPFS=true
|
|
||||||
NOVA_CACHE_TMPFS_SIZE=24G
|
|
||||||
|
|
||||||
GLANCE_IMAGE_LIST=""
|
|
||||||
COMPUTE_NODE_LIST="172.18.124.102"
|
|
||||||
|
|
||||||
#======================================
|
|
||||||
if [[ -d "$DEVSTACK_DIR" ]] ; then
|
|
||||||
source $DEVSTACK_DIR/openrc admin admin
|
|
||||||
fi
|
|
||||||
source $SCRIPTS_DIR/functions.sh
|
|
||||||
|
|
@ -1,109 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
function glance_image_create {
|
|
||||||
local __image_path=$1
|
|
||||||
|
|
||||||
if [[ -z "$__image_path" ]] ; then
|
|
||||||
echo "Image path is missed!"
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
local __image_name=${__image_path##*/}
|
|
||||||
__image_name=${__image_name%.*}
|
|
||||||
|
|
||||||
echo "Importing image '$__image_name' into Glance ..."
|
|
||||||
glance image-delete "$__image_name"
|
|
||||||
if [[ ^http =~ $__image_path]] ; then
|
|
||||||
glance image-create \
|
|
||||||
--name "$__image_name" \
|
|
||||||
--disk-format qcow2 \
|
|
||||||
--container-format bare \
|
|
||||||
--is-public true \
|
|
||||||
--copy-from "$__image_path"
|
|
||||||
else
|
|
||||||
glance image-create \
|
|
||||||
--name "$__image_name" \
|
|
||||||
--disk-format qcow2 \
|
|
||||||
--container-format bare \
|
|
||||||
--is-public true \
|
|
||||||
--file "$__image_path"
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# Executing post-stack actions
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
if [[ ,$INSTALL_MODE, =~ ',standalone,compute,' ]] ; then
|
|
||||||
echo "Adding iptables rule to allow Internet access from instances..."
|
|
||||||
__iptables_rule="POSTROUTING -t nat -s '$FIXED_RANGE' ! -d '$FIXED_RANGE' -j MASQUERADE"
|
|
||||||
sudo iptables -C $__iptables_rule
|
|
||||||
if [[ $? == 0 ]] ; then
|
|
||||||
echo "Iptables rule already exists."
|
|
||||||
else
|
|
||||||
sudo iptables -A $__iptables_rule
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ $INSTALL_MODE == 'compute' ]] ; then
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ -z "$(sudo rabbitmqctl list_users | grep keero)" ]] ; then
|
|
||||||
echo "Adding RabbitMQ 'keero' user"
|
|
||||||
sudo rabbitmqctl add_user keero keero
|
|
||||||
else
|
|
||||||
echo "User 'Keero' already exists."
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ -z "$(sudo rabbitmq-plugins list -e | grep rabbitmq_management)" ]] ; then
|
|
||||||
echo "Enabling RabbitMQ management plugin"
|
|
||||||
sudo rabbitmq-plugins enable rabbitmq_management
|
|
||||||
|
|
||||||
echo "Restarting RabbitMQ ..."
|
|
||||||
restart_service rabbitmq-server
|
|
||||||
else
|
|
||||||
echo "RabbitMQ management plugin already enabled."
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Removing nova flavors ..."
|
|
||||||
for id in $(nova flavor-list | awk '$2 ~ /[[:digit:]]/ {print $2}') ; do
|
|
||||||
echo "** Removing flavor '$id'"
|
|
||||||
nova flavor-delete $id
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Creating new flavors ..."
|
|
||||||
nova flavor-create m1.small auto 768 40 1
|
|
||||||
nova flavor-create m1.medium auto 1024 40 1
|
|
||||||
nova flavor-create m1.large auto 1280 40 2
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Creating security group rules ..."
|
|
||||||
nova secgroup-add-rule default tcp 1 65535 0.0.0.0/0
|
|
||||||
nova secgroup-add-rule default udp 1 65535 0.0.0.0/0
|
|
||||||
nova secgroup-add-rule default icmp 0 8 0.0.0.0/0
|
|
||||||
|
|
||||||
|
|
||||||
if [[ -z "$(nova keypair-list | grep keero_key)" ]] ; then
|
|
||||||
echo "Creating keypair 'keero_key' ..."
|
|
||||||
nova keypair-add keero_key
|
|
||||||
else
|
|
||||||
echo "Keypair 'keero_key' already exists"
|
|
||||||
fi
|
|
||||||
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
for $image in $GLANCE_IMAGE_LIST ; do
|
|
||||||
glance_image_create "$image"
|
|
||||||
done
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
#Remove certificates
|
|
||||||
echo "* Removing old certificate files"
|
|
||||||
for file in $(sudo find $DEVSTACK_DIR/accrc/ -type f -regex ".+.pem.*") ; do
|
|
||||||
echo "Removing file '$file'"
|
|
||||||
sudo rm -f "$file"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# Remove logs
|
|
||||||
echo "* Removing 'devstack' logs ..."
|
|
||||||
sudo rm -f /opt/stack/log/*
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Removing 'apache2' logs ..."
|
|
||||||
for file in $(sudo find /var/log/apache2 -type f) ; do
|
|
||||||
echo "Removing file '$file'"
|
|
||||||
sudo rm -f "$file"
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Stopping all VMs ..."
|
|
||||||
sudo killall kvm
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
|
|
||||||
echo "* Unmounting ramdrive ..."
|
|
||||||
umount /opt/stack/data/nova/instances
|
|
||||||
|
|
@ -1,55 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Executing pre-stack actions
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
# Executing checks
|
|
||||||
#-----------------
|
|
||||||
die_if_not_set DEVSTACK_DIR
|
|
||||||
die_if_not_set MYSQL_DB_TMPFS_SIZE
|
|
||||||
die_if_not_set NOVA_CACHE_TMPFS_SIZE
|
|
||||||
#-----------------
|
|
||||||
|
|
||||||
|
|
||||||
if [[ ,$INSTALL_MODE, =~ ',standalone,multihost,controller,' ]] ; then
|
|
||||||
restart_service dbus rabbitmq-server
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if [[ ,$INSTALL_MODE, =~ ',standalone,multihost,controller,' ]] ; then
|
|
||||||
move_mysql_data_to_ramdrive
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Devstack log folder
|
|
||||||
#--------------------
|
|
||||||
sudo -s << EOF
|
|
||||||
mkdir -p $SCREEN_LOGDIR
|
|
||||||
chown stack:stack $SCREEN_LOGDIR
|
|
||||||
EOF
|
|
||||||
#--------------------
|
|
||||||
|
|
||||||
|
|
||||||
case $INSTALL_MODE in
|
|
||||||
'standalone')
|
|
||||||
update_devstack_localrc 'standalone'
|
|
||||||
;;
|
|
||||||
'multihost')
|
|
||||||
update_devstack_localrc 'controller'
|
|
||||||
;;
|
|
||||||
'controller')
|
|
||||||
update_devstack_localrc 'controller'
|
|
||||||
;;
|
|
||||||
'compute')
|
|
||||||
update_devstack_localrc 'compute'
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#===============================================================================
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
@ -1,53 +0,0 @@
|
|||||||
# This file describes the network interfaces available on your system
|
|
||||||
# and how to activate them. For more information, see interfaces(5).
|
|
||||||
|
|
||||||
# The loopback network interface
|
|
||||||
auto lo
|
|
||||||
iface lo inet loopback
|
|
||||||
|
|
||||||
# The primary network interface
|
|
||||||
auto eth0
|
|
||||||
iface eth0 inet static
|
|
||||||
address 67.207.197.34
|
|
||||||
netmask 255.255.255.240
|
|
||||||
gateway 67.207.197.33
|
|
||||||
# dns-* options are implemented by the resolvconf package, if installed
|
|
||||||
dns-nameservers 208.166.50.13 67.207.201.6
|
|
||||||
dns-search svwh.net
|
|
||||||
|
|
||||||
|
|
||||||
auto eth0.260
|
|
||||||
iface eth0.260 inet manual
|
|
||||||
vlan-raw-device eth0
|
|
||||||
post-up ifconfig $IFACE 172.18.124.102/29
|
|
||||||
# post-up route add -net 172.18.0.0/16 gw 172.18.124.97
|
|
||||||
# pre-down route del -net 172.18.0.0/16 gw 172.18.124.97
|
|
||||||
post-up ip route add default via 172.18.124.97 dev $IFACE table 260
|
|
||||||
post-up ip rule add from 172.18.124.96/29 to 172.18.0.0/16 table 260
|
|
||||||
pre-down ip rule del from 172.18.124.96/29 to 172.18.0.0/16
|
|
||||||
pre-down ip route del table 260
|
|
||||||
pre-down ifconfig $IFACE 0.0.0.0
|
|
||||||
|
|
||||||
|
|
||||||
auto eth0.261
|
|
||||||
iface eth0.261 inet manual
|
|
||||||
vlan-raw-device eth0
|
|
||||||
post-up ifconfig $IFACE 172.18.124.202/26
|
|
||||||
post-up route add -net 172.18.0.0/16 gw 172.18.124.193 dev $IFACE
|
|
||||||
pre-down route del -net 172.18.0.0/16 gw 172.18.124.193 dev $IFACE
|
|
||||||
pre-down ifconfig $IFACE 0.0.0.0
|
|
||||||
|
|
||||||
|
|
||||||
auto eth1
|
|
||||||
iface eth1 inet manual
|
|
||||||
up ifconfig $IFACE up
|
|
||||||
down ifconfig $IFACE down
|
|
||||||
# up ifconfig $IFACE 0.0.0.0
|
|
||||||
|
|
||||||
|
|
||||||
#auto eth1.221
|
|
||||||
#iface eth1.221 inet manual
|
|
||||||
# vlan-raw-device eth1
|
|
||||||
# pre-up ifconfig $IFACE up
|
|
||||||
# post-down ifconfig $IFACE down
|
|
||||||
# up ifconfig $IFACE 0.0.0.0
|
|
@ -1,54 +0,0 @@
|
|||||||
# This file describes the network interfaces available on your system
|
|
||||||
# and how to activate them. For more information, see interfaces(5).
|
|
||||||
|
|
||||||
# The loopback network interface
|
|
||||||
auto lo
|
|
||||||
iface lo inet loopback
|
|
||||||
|
|
||||||
# The primary network interface
|
|
||||||
auto eth0
|
|
||||||
iface eth0 inet static
|
|
||||||
address 67.207.197.36
|
|
||||||
netmask 255.255.255.240
|
|
||||||
network 67.207.197.32
|
|
||||||
broadcast 67.207.197.47
|
|
||||||
gateway 67.207.197.33
|
|
||||||
# dns-* options are implemented by the resolvconf package, if installed
|
|
||||||
dns-nameservers 208.166.50.13 67.207.206.1
|
|
||||||
dns-search svwh.net
|
|
||||||
|
|
||||||
|
|
||||||
auto eth0.260
|
|
||||||
iface eth0.260 inet manual
|
|
||||||
vlan-raw-device eth0
|
|
||||||
post-up ifconfig $IFACE 172.18.124.100/29
|
|
||||||
post-up ip route add default via 172.18.124.97 dev $IFACE table 260
|
|
||||||
post-up ip rule add from 172.18.124.96/29 to 172.18.0.0/16 table 260
|
|
||||||
pre-down ip rule del from 172.18.124.96/29 to 172.18.0.0/16 table 260
|
|
||||||
pre-down ip route del table 260
|
|
||||||
pre-down ifconfig $IFACE 0.0.0.0
|
|
||||||
# post-up route add -net 172.18.0.0/16 gw 172.18.124.97
|
|
||||||
# post-down route del -net 172.18.0.0/16 gw 172.18.124.97
|
|
||||||
|
|
||||||
|
|
||||||
auto eth1
|
|
||||||
iface eth1 inet manual
|
|
||||||
up ifconfig $IFACE up
|
|
||||||
down ifconfig $IFACE down
|
|
||||||
# up ifconfig $IFACE 0.0.0.0
|
|
||||||
|
|
||||||
|
|
||||||
auto eth0.261
|
|
||||||
iface eth0.261 inet manual
|
|
||||||
vlan-raw-device eth0
|
|
||||||
post-up ifconfig $IFACE 172.18.124.200/26
|
|
||||||
post-up route add -net 172.18.0.0/16 gw 172.18.124.193 dev $IFACE
|
|
||||||
pre-down route del -net 172.18.0.0/16 gw 172.18.124.192 dev $IFACE
|
|
||||||
pre-down ifconfig $IFACE 0.0.0.0
|
|
||||||
|
|
||||||
|
|
||||||
#auto eth1.221
|
|
||||||
#iface eth1.221 inet manual
|
|
||||||
# vlan-raw-device eth1
|
|
||||||
# pre-up ifconfig $IFACE up
|
|
||||||
# post-down ifcofnig $IFACE down
|
|
@ -1,27 +0,0 @@
|
|||||||
# Devstack's config file for STANDALONE installation
|
|
||||||
|
|
||||||
lab_id=101
|
|
||||||
lab_password=swordfish
|
|
||||||
|
|
||||||
HOST_IP=172.18.124.${lab_id}
|
|
||||||
|
|
||||||
FIXED_RANGE=10.0.${lab_id}.0/24
|
|
||||||
|
|
||||||
FLAT_INTERFACE=eth1
|
|
||||||
|
|
||||||
ADMIN_PASSWORD=$lab_password
|
|
||||||
MYSQL_PASSWORD=$lab_password
|
|
||||||
RABBIT_PASSWORD=$lab_password
|
|
||||||
SERVICE_PASSWORD=$lab_password
|
|
||||||
SERVICE_TOKEN=tokentoken
|
|
||||||
|
|
||||||
ENABLED_SERVICES+=,heat,h-api,h-api-cfn,h-api-cw,h-eng
|
|
||||||
ENABLED_SERVICES+=,conductor,portas
|
|
||||||
|
|
||||||
SCREEN_LOGDIR=/opt/stack/log/
|
|
||||||
LOGFILE=$SCREEN_LOGDIR/stack.sh.log
|
|
||||||
|
|
||||||
API_RATE_LIMIT=False
|
|
||||||
|
|
||||||
EXTRA_OPTS=(force_config_drive=true libvirt_images_type=qcow2 force_raw_images=false)
|
|
||||||
|
|
@ -1,63 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
|
|
||||||
INSTALL_MODE="$1"
|
|
||||||
|
|
||||||
validate_install_mode
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Update devstack-scripts if multihost
|
|
||||||
#===============================================================================
|
|
||||||
if [[ "$INSTALL_MODE" == 'multihost' ]] ; then
|
|
||||||
_echo "* Copying devstack-scripts to compute nodes ..."
|
|
||||||
for __compute_node in $COMPUTE_NODE_LIST ; do
|
|
||||||
_echo "** Removing devstack-scripts on '$__compute_node' ..."
|
|
||||||
ssh stack@$__compute_node rm -rf ~/devstack-scripts
|
|
||||||
_echo "** Copying devstack-scripts to '$__compute_node' ..."
|
|
||||||
scp -r $SCRIPTS_DIR stack@$__compute_node:~/
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Executing pre-stack actions
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Executing pre-stack actions ..."
|
|
||||||
source $SCRIPTS_DIR/pre-stack.sh no-localrc
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Creating stack
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Starting devstack ..."
|
|
||||||
$DEVSTACK_DIR/stack.sh
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Executing post-stack actions
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Executing post-stack actions ..."
|
|
||||||
source $SCRIPTS_DIR/post-stack.sh no-localrc
|
|
||||||
#source $SCRIPTS_DIR/start-keero.sh no-localrc
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Start installation on compute nodes
|
|
||||||
#===============================================================================
|
|
||||||
if [[ "$INSTALL_MODE" == 'multihost' ]] ; then
|
|
||||||
_echo "* Starting devstack on compute nodes ..."
|
|
||||||
for __compute_node in $COMPUTE_NODE_LIST ; do
|
|
||||||
_echo "** Starting devstack on '$__compute_node' ..."
|
|
||||||
ssh stack@$__compute_node $SCRIPTS_DIR/start-devstack.sh compute
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
#===============================================================================
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
die_if_not_set INSTALL_DIR
|
|
||||||
|
|
||||||
# Starting Portas
|
|
||||||
#================
|
|
||||||
if [[ ! -d "$INSTALL_DIR/portas" ]] ; then
|
|
||||||
mkdir -p "$INSTALL_DIR/portas"
|
|
||||||
fi
|
|
||||||
|
|
||||||
cp "$INSTALL_DIR/keero/portas/etc" "$INSTALL_DIR/portas/etc"
|
|
||||||
|
|
||||||
screen_it portas "cd $INSTALL_DIR/portas && portas-api --config-file=$INSTALL_DIR/portas/etc/portas-api.conf"
|
|
||||||
#================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Starting Conductor
|
|
||||||
#===================
|
|
||||||
screen_it conductor "cd $INSTALL_DIR/keero/conductor && bash ./tools/with_venv.sh ./bin/app.py"
|
|
||||||
#===================
|
|
@ -1,22 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
image_file=$1
|
|
||||||
|
|
||||||
function die {
|
|
||||||
echo "$@"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
[ -z "$image_file" ] && die "VM name MUST be provided!"
|
|
||||||
[ -f "$image_file" ] || die "File '$image_file' not found."
|
|
||||||
|
|
||||||
echo "Starting VM '$image_file' ..."
|
|
||||||
|
|
||||||
kvm \
|
|
||||||
-m 2048 \
|
|
||||||
-drive file="$image_file",if=virtio \
|
|
||||||
-redir tcp:3389::3389 -redir tcp:3390::3390 \
|
|
||||||
-nographic \
|
|
||||||
-usbdevice tablet \
|
|
||||||
-vnc :20
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
|
|
||||||
INSTALL_MODE="$1"
|
|
||||||
|
|
||||||
validate_install_mode
|
|
||||||
|
|
||||||
|
|
||||||
# Executing pre-unstack actions
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Executing pre-unstack actions ..."
|
|
||||||
source $SCRIPTS_DIR/pre-unstack.sh no-localrc
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
# Executing unstack.sh
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Executing stop devstack ..."
|
|
||||||
$DEVSTACK_DIR/unstack.sh
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
# Executing post-unstack actions
|
|
||||||
#===============================================================================
|
|
||||||
_echo "* Executing post-unstack actions ..."
|
|
||||||
source $SCRIPTS_DIR/post-unstack.sh no-localrc
|
|
||||||
#source $SCRIPTS_DIR/stop-keero.sh no-localrc
|
|
||||||
#===============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Stop installation on compute nodes
|
|
||||||
#===============================================================================
|
|
||||||
if [[ "$INSTALL_MODE" == 'multihost' ]] ; then
|
|
||||||
_echo "* Stopping devstack on compute nodes ..."
|
|
||||||
for $__compute_node in $COMPUTE_NODE_LIST ; do
|
|
||||||
_echo "** Stopping devstack on '$__compute_node' ..."
|
|
||||||
ssh stack@$__compute_node $SCRIPTS_DIR/stop-devstack.sh
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
#===============================================================================
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ -z "$1" ]] ; then
|
|
||||||
SCRIPTS_DIR=$( cd $( dirname "$0" ) && pwd )
|
|
||||||
source $SCRIPTS_DIR/localrc
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Stopping Keero components
|
|
||||||
#==========================
|
|
||||||
for serv in conductor portas ; do
|
|
||||||
screen -S $SCREEN_NAME -p $serv -X kill
|
|
||||||
done
|
|
||||||
#==========================
|
|
17
WindowsAgent/.gitignore
vendored
17
WindowsAgent/.gitignore
vendored
@ -1,17 +0,0 @@
|
|||||||
## Ignore Visual Studio temporary files, build results, and
|
|
||||||
## files generated by popular Visual Studio add-ons.
|
|
||||||
# User-specific files
|
|
||||||
*.suo
|
|
||||||
*.user
|
|
||||||
|
|
||||||
# Build results
|
|
||||||
[Dd]ebug/
|
|
||||||
[Rr]elease/
|
|
||||||
x64/
|
|
||||||
build/
|
|
||||||
[Bb]in/
|
|
||||||
[Oo]bj/
|
|
||||||
|
|
||||||
# ReSharper is a .NET coding add-in
|
|
||||||
_ReSharper*/
|
|
||||||
*.[Rr]e[Ss]harper
|
|
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
|
||||||
</startup>
|
|
||||||
</configuration>
|
|
@ -1,62 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{501BE151-4B8C-4355-88DC-3AEF1921B2D7}</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>ConsoleApplication1</RootNamespace>
|
|
||||||
<AssemblyName>ExecutionPlanGenerator</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Newtonsoft.Json">
|
|
||||||
<HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Program.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
@ -1,141 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace ConsoleApplication1
|
|
||||||
{
|
|
||||||
class Command
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
public Dictionary<string, object> Arguments { get; set; }
|
|
||||||
}
|
|
||||||
class ExecutionPlan
|
|
||||||
{
|
|
||||||
public List<string> Scripts { get; set; }
|
|
||||||
public List<Command> Commands { get; set; }
|
|
||||||
public int RebootOnCompletion { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class Program
|
|
||||||
{
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
if (args.Length < 1 || args.Length > 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Usage: ExecutionPlanGenerator inputfile [outputfile]");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var outFile = args.Length == 2 ? args[1] : null;
|
|
||||||
|
|
||||||
var plan = new ExecutionPlan {
|
|
||||||
Scripts = new List<string>(),
|
|
||||||
Commands = new List<Command>()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var lines = File.ReadAllLines(args[0]);
|
|
||||||
|
|
||||||
|
|
||||||
foreach (var statement in lines
|
|
||||||
.Select(t => t.Split(new[] { ' ', '\t' }, 2))
|
|
||||||
.Where(t => t.Length == 2)
|
|
||||||
.Select(t => new Tuple<string, string>(t[0].Trim().ToLower(), t[1].Trim())))
|
|
||||||
{
|
|
||||||
switch (statement.Item1)
|
|
||||||
{
|
|
||||||
case "include":
|
|
||||||
Include(statement.Item2, plan, args[0]);
|
|
||||||
break;
|
|
||||||
case "call":
|
|
||||||
Call(statement.Item2, plan);
|
|
||||||
break;
|
|
||||||
case "reboot":
|
|
||||||
plan.RebootOnCompletion = int.Parse(statement.Item2);
|
|
||||||
break;
|
|
||||||
case "out":
|
|
||||||
if (args.Length < 2)
|
|
||||||
{
|
|
||||||
var path = statement.Item2;
|
|
||||||
if (!Path.IsPathRooted(path))
|
|
||||||
{
|
|
||||||
path = Path.Combine(Path.GetDirectoryName(args[0]), path);
|
|
||||||
}
|
|
||||||
outFile = path;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var data = JsonConvert.SerializeObject(plan, Formatting.Indented);
|
|
||||||
if (outFile == null)
|
|
||||||
{
|
|
||||||
Console.WriteLine(data);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
File.WriteAllText(outFile, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Call(string line, ExecutionPlan plan)
|
|
||||||
{
|
|
||||||
var parts = line.Split(new[] { ' ', '\t'}, 2);
|
|
||||||
var command = new Command() {
|
|
||||||
Name = parts[0].Trim(),
|
|
||||||
Arguments = new Dictionary<string, object>()
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
if (parts.Length == 2)
|
|
||||||
{
|
|
||||||
foreach (var x in parts[1]
|
|
||||||
.Split(',')
|
|
||||||
.Select(t => t.Split('='))
|
|
||||||
.Where(t => t.Length == 2)
|
|
||||||
.Select(t => new KeyValuePair<string, string>(t[0].Trim(), t[1].Trim())))
|
|
||||||
{
|
|
||||||
object value = null;
|
|
||||||
long num;
|
|
||||||
bool boolean;
|
|
||||||
if (x.Value.StartsWith("\""))
|
|
||||||
{
|
|
||||||
value = x.Value.Substring(1, x.Value.Length - 2);
|
|
||||||
}
|
|
||||||
else if (long.TryParse(x.Value, out num))
|
|
||||||
{
|
|
||||||
value = num;
|
|
||||||
}
|
|
||||||
else if (bool.TryParse(x.Value, out boolean))
|
|
||||||
{
|
|
||||||
value = boolean;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
command.Arguments.Add(x.Key, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
plan.Commands.Add(command);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void Include(string file, ExecutionPlan plan, string dslPath)
|
|
||||||
{
|
|
||||||
var path = file;
|
|
||||||
if (!Path.IsPathRooted(file))
|
|
||||||
{
|
|
||||||
path = Path.Combine(Path.GetDirectoryName(dslPath), path);
|
|
||||||
}
|
|
||||||
|
|
||||||
var text = File.ReadAllText(path, Encoding.UTF8);
|
|
||||||
plan.Scripts.Add(Convert.ToBase64String(Encoding.UTF8.GetBytes(text)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("ConsoleApplication1")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("ConsoleApplication1")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
[assembly: Guid("9aab688a-ce5f-402e-8891-2d7b4ae85ea3")]
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
|
|
||||||
</packages>
|
|
Binary file not shown.
@ -1,26 +0,0 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
|
||||||
# Visual Studio 2012
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAgent", "WindowsAgent\WindowsAgent.csproj", "{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}"
|
|
||||||
EndProject
|
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ExecutionPlanGenerator", "ExecutionPlanGenerator\ExecutionPlanGenerator.csproj", "{501BE151-4B8C-4355-88DC-3AEF1921B2D7}"
|
|
||||||
EndProject
|
|
||||||
Global
|
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
|
||||||
Debug|Any CPU = Debug|Any CPU
|
|
||||||
Release|Any CPU = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
|
||||||
{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
{501BE151-4B8C-4355-88DC-3AEF1921B2D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
|
||||||
{501BE151-4B8C-4355-88DC-3AEF1921B2D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
|
||||||
{501BE151-4B8C-4355-88DC-3AEF1921B2D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
|
||||||
{501BE151-4B8C-4355-88DC-3AEF1921B2D7}.Release|Any CPU.Build.0 = Release|Any CPU
|
|
||||||
EndGlobalSection
|
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
|
||||||
HideSolutionNode = FALSE
|
|
||||||
EndGlobalSection
|
|
||||||
EndGlobal
|
|
@ -1,30 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<configuration>
|
|
||||||
<configSections>
|
|
||||||
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
|
|
||||||
</configSections>
|
|
||||||
<startup>
|
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
|
|
||||||
</startup>
|
|
||||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
|
||||||
<targets>
|
|
||||||
<target name="file" xsi:type="File" fileName="${basedir}/log.txt"
|
|
||||||
layout="${date} ${level}: <${logger:shortName=true}> ${message} ${exception:format=tostring}"/>
|
|
||||||
</targets>
|
|
||||||
|
|
||||||
<rules>
|
|
||||||
<logger name="*" minlevel="Debug" writeTo="file" />
|
|
||||||
</rules>
|
|
||||||
</nlog>
|
|
||||||
<appSettings>
|
|
||||||
<add key="rabbitmq.host" value="localhost"/>
|
|
||||||
<add key="rabbitmq.user" value="keero"/>
|
|
||||||
<add key="rabbitmq.password" value="keero"/>
|
|
||||||
<add key="rabbitmq.vhost" value="keero"/>
|
|
||||||
<add key="rabbitmq.resultExchange" value=""/>
|
|
||||||
<add key="rabbitmq.resultRoutingKey" value="-execution-results"/>
|
|
||||||
<add key="rabbitmq.durableMessages" value="true"/>
|
|
||||||
|
|
||||||
</appSettings>
|
|
||||||
</configuration>
|
|
@ -1,21 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
class ExecutionPlan
|
|
||||||
{
|
|
||||||
public class Command
|
|
||||||
{
|
|
||||||
public string Name { get; set; }
|
|
||||||
public Dictionary<string, object> Arguments { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public string[] Scripts { get; set; }
|
|
||||||
public LinkedList<Command> Commands { get; set; }
|
|
||||||
public int RebootOnCompletion { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
class MqMessage
|
|
||||||
{
|
|
||||||
private readonly Action ackFunc;
|
|
||||||
|
|
||||||
public MqMessage(Action ackFunc)
|
|
||||||
{
|
|
||||||
this.ackFunc = ackFunc;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MqMessage()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Body { get; set; }
|
|
||||||
public string Id { get; set; }
|
|
||||||
|
|
||||||
public void Ack()
|
|
||||||
{
|
|
||||||
ackFunc();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,176 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Management.Automation;
|
|
||||||
using System.Management.Automation.Runspaces;
|
|
||||||
using System.Text;
|
|
||||||
using NLog;
|
|
||||||
using Newtonsoft.Json;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
class PlanExecutor
|
|
||||||
{
|
|
||||||
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
|
||||||
|
|
||||||
class ExecutionResult
|
|
||||||
{
|
|
||||||
public bool IsException { get; set; }
|
|
||||||
public object Result { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly string path;
|
|
||||||
|
|
||||||
public PlanExecutor(string path)
|
|
||||||
{
|
|
||||||
this.path = path;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool RebootNeeded { get; set; }
|
|
||||||
|
|
||||||
public void Execute()
|
|
||||||
{
|
|
||||||
RebootNeeded = false;
|
|
||||||
var resultPath = this.path + ".result";
|
|
||||||
Runspace runSpace = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var plan = JsonConvert.DeserializeObject<ExecutionPlan>(File.ReadAllText(this.path));
|
|
||||||
List<ExecutionResult> currentResults = null;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
currentResults = JsonConvert.DeserializeObject<List<ExecutionResult>>(File.ReadAllText(resultPath));
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
currentResults = new List<ExecutionResult>();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
runSpace = RunspaceFactory.CreateRunspace();
|
|
||||||
runSpace.Open();
|
|
||||||
|
|
||||||
var runSpaceInvoker = new RunspaceInvoke(runSpace);
|
|
||||||
runSpaceInvoker.Invoke("Set-ExecutionPolicy Unrestricted");
|
|
||||||
if (plan.Scripts != null)
|
|
||||||
{
|
|
||||||
foreach (var script in plan.Scripts)
|
|
||||||
{
|
|
||||||
runSpaceInvoker.Invoke(Encoding.UTF8.GetString(Convert.FromBase64String(script)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (plan.Commands != null && plan.Commands.Any())
|
|
||||||
{
|
|
||||||
var command = plan.Commands.First();
|
|
||||||
|
|
||||||
var pipeline = runSpace.CreatePipeline();
|
|
||||||
var psCommand = new Command(command.Name);
|
|
||||||
if (command.Arguments != null)
|
|
||||||
{
|
|
||||||
foreach (var kvp in command.Arguments)
|
|
||||||
{
|
|
||||||
psCommand.Parameters.Add(kvp.Key, kvp.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Log.Info("Executing {0} {1}", command.Name, string.Join(" ",
|
|
||||||
(command.Arguments ?? new Dictionary<string, object>()).Select(
|
|
||||||
t => string.Format("{0}={1}", t.Key, t.Value == null ? "null" : t.Value.ToString()))));
|
|
||||||
|
|
||||||
pipeline.Commands.Add(psCommand);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var result = pipeline.Invoke();
|
|
||||||
if (result != null)
|
|
||||||
{
|
|
||||||
currentResults.Add(new ExecutionResult {
|
|
||||||
IsException = false,
|
|
||||||
Result = result.Select(SerializePsObject).Where(obj => obj != null).ToList()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
currentResults.Add(new ExecutionResult {
|
|
||||||
IsException = true,
|
|
||||||
Result = new[] {
|
|
||||||
exception.GetType().FullName, exception.Message
|
|
||||||
}
|
|
||||||
});
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
plan.Commands.RemoveFirst();
|
|
||||||
File.WriteAllText(path, JsonConvert.SerializeObject(plan));
|
|
||||||
File.WriteAllText(resultPath, JsonConvert.SerializeObject(currentResults));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
runSpace.Close();
|
|
||||||
var executionResult = JsonConvert.SerializeObject(new ExecutionResult {
|
|
||||||
IsException = false,
|
|
||||||
Result = currentResults
|
|
||||||
}, Formatting.Indented);
|
|
||||||
|
|
||||||
if (plan.RebootOnCompletion > 0)
|
|
||||||
{
|
|
||||||
if (plan.RebootOnCompletion == 1)
|
|
||||||
{
|
|
||||||
RebootNeeded = !currentResults.Any(t => t.IsException);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
RebootNeeded = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File.WriteAllText(resultPath, executionResult);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
File.WriteAllText(resultPath, JsonConvert.SerializeObject(new ExecutionResult {
|
|
||||||
IsException = true,
|
|
||||||
Result = ex.Message
|
|
||||||
}, Formatting.Indented));
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
if (runSpace != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
runSpace.Close();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static object SerializePsObject(PSObject obj)
|
|
||||||
{
|
|
||||||
if (obj.BaseObject is PSCustomObject)
|
|
||||||
{
|
|
||||||
var result = new Dictionary<string, object>();
|
|
||||||
foreach (var property in obj.Properties.Where(p => p.IsGettable))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
result[property.Name] = property.Value.ToString();
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return obj.BaseObject;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,168 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Management.Automation;
|
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
using NLog;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
[DisplayName("Keero Agent")]
|
|
||||||
sealed public class Program : WindowsService
|
|
||||||
{
|
|
||||||
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
|
||||||
private volatile bool stop;
|
|
||||||
private Thread thread;
|
|
||||||
private RabbitMqClient rabbitMqClient;
|
|
||||||
private int delayFactor = 1;
|
|
||||||
private string plansDir;
|
|
||||||
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
Start(new Program(), args);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnStart(string[] args)
|
|
||||||
{
|
|
||||||
base.OnStart(args);
|
|
||||||
|
|
||||||
Log.Info("Version 0.3");
|
|
||||||
|
|
||||||
this.rabbitMqClient = new RabbitMqClient();
|
|
||||||
|
|
||||||
var basePath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName);
|
|
||||||
this.plansDir = Path.Combine(basePath, "plans");
|
|
||||||
|
|
||||||
|
|
||||||
if (!Directory.Exists(plansDir))
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(plansDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.thread = new Thread(Loop);
|
|
||||||
this.thread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Loop()
|
|
||||||
{
|
|
||||||
const string unknownName = "unknown";
|
|
||||||
while (!stop)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
foreach (var file in Directory.GetFiles(this.plansDir, "*.json.result")
|
|
||||||
.Where(file => !File.Exists(Path.Combine(this.plansDir, Path.GetFileNameWithoutExtension(file)))))
|
|
||||||
{
|
|
||||||
var id = Path.GetFileNameWithoutExtension(Path.GetFileNameWithoutExtension(file)) ?? unknownName;
|
|
||||||
if (id.Equals(unknownName, StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
id = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
var result = File.ReadAllText(file);
|
|
||||||
Log.Info("Sending results for {0}", id ?? unknownName);
|
|
||||||
rabbitMqClient.SendResult(new MqMessage { Body = result, Id = id });
|
|
||||||
File.Delete(file);
|
|
||||||
}
|
|
||||||
|
|
||||||
var path = Directory.EnumerateFiles(this.plansDir, "*.json").FirstOrDefault();
|
|
||||||
if (path == null)
|
|
||||||
{
|
|
||||||
var message = rabbitMqClient.GetMessage();
|
|
||||||
var id = message.Id;
|
|
||||||
if(string.IsNullOrEmpty(id))
|
|
||||||
{
|
|
||||||
id = unknownName;
|
|
||||||
}
|
|
||||||
|
|
||||||
path = Path.Combine(this.plansDir, string.Format("{0}.json", id));
|
|
||||||
File.WriteAllText(path, message.Body);
|
|
||||||
Log.Info("Received new execution plan {0}", id);
|
|
||||||
message.Ack();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var id = Path.GetFileNameWithoutExtension(path);
|
|
||||||
Log.Info("Executing exising plan {0}", id);
|
|
||||||
}
|
|
||||||
var executor = new PlanExecutor(path);
|
|
||||||
executor.Execute();
|
|
||||||
File.Delete(path);
|
|
||||||
delayFactor = 1;
|
|
||||||
|
|
||||||
if (stop) break;
|
|
||||||
if (executor.RebootNeeded)
|
|
||||||
{
|
|
||||||
Reboot();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
WaitOnException(exception);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Reboot()
|
|
||||||
{
|
|
||||||
Log.Info("Going for reboot!!");
|
|
||||||
LogManager.Flush();
|
|
||||||
/*try
|
|
||||||
{
|
|
||||||
System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot execute shutdown.exe", ex);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
PowerShell.Create().AddCommand("Restart-Computer").AddParameter("Force").Invoke();
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
|
|
||||||
Log.FatalException("Reboot exception", exception);
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
Log.Info("Waiting for reboot");
|
|
||||||
for (var i = 0; i < 10 * 60 * 5 && !stop; i++)
|
|
||||||
{
|
|
||||||
Thread.Sleep(100);
|
|
||||||
}
|
|
||||||
Log.Info("Done waiting for reboot");
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WaitOnException(Exception exception)
|
|
||||||
{
|
|
||||||
if (stop) return;
|
|
||||||
Log.WarnException("Exception in main loop", exception);
|
|
||||||
var i = 0;
|
|
||||||
while (!stop && i < 10 * (delayFactor * delayFactor))
|
|
||||||
{
|
|
||||||
Thread.Sleep(100);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
delayFactor = Math.Min(delayFactor + 1, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnStop()
|
|
||||||
{
|
|
||||||
stop = true;
|
|
||||||
this.rabbitMqClient.Dispose();
|
|
||||||
base.OnStop();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,36 +0,0 @@
|
|||||||
using System.Reflection;
|
|
||||||
using System.Runtime.CompilerServices;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
// General Information about an assembly is controlled through the following
|
|
||||||
// set of attributes. Change these attribute values to modify the information
|
|
||||||
// associated with an assembly.
|
|
||||||
[assembly: AssemblyTitle("WindowsAgent")]
|
|
||||||
[assembly: AssemblyDescription("")]
|
|
||||||
[assembly: AssemblyConfiguration("")]
|
|
||||||
[assembly: AssemblyCompany("")]
|
|
||||||
[assembly: AssemblyProduct("WindowsAgent")]
|
|
||||||
[assembly: AssemblyCopyright("Copyright © 2013")]
|
|
||||||
[assembly: AssemblyTrademark("")]
|
|
||||||
[assembly: AssemblyCulture("")]
|
|
||||||
|
|
||||||
// Setting ComVisible to false makes the types in this assembly not visible
|
|
||||||
// to COM components. If you need to access a type in this assembly from
|
|
||||||
// COM, set the ComVisible attribute to true on that type.
|
|
||||||
[assembly: ComVisible(false)]
|
|
||||||
|
|
||||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
|
||||||
[assembly: Guid("9591bf2c-f38b-47e0-a39d-ea9849356371")]
|
|
||||||
|
|
||||||
// Version information for an assembly consists of the following four values:
|
|
||||||
//
|
|
||||||
// Major Version
|
|
||||||
// Minor Version
|
|
||||||
// Build Number
|
|
||||||
// Revision
|
|
||||||
//
|
|
||||||
// You can specify all the values or you can default the Build and Revision Numbers
|
|
||||||
// by using the '*' as shown below:
|
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
|
@ -1,128 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Configuration;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using NLog;
|
|
||||||
using RabbitMQ.Client;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
class RabbitMqClient : IDisposable
|
|
||||||
{
|
|
||||||
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
|
||||||
private static readonly ConnectionFactory connectionFactory;
|
|
||||||
private IConnection currentConnecton;
|
|
||||||
|
|
||||||
static RabbitMqClient()
|
|
||||||
{
|
|
||||||
connectionFactory = new ConnectionFactory {
|
|
||||||
HostName = ConfigurationManager.AppSettings["rabbitmq.host"] ?? "localhost",
|
|
||||||
UserName = ConfigurationManager.AppSettings["rabbitmq.user"] ?? "guest",
|
|
||||||
Password = ConfigurationManager.AppSettings["rabbitmq.password"] ??"guest",
|
|
||||||
Protocol = Protocols.FromEnvironment(),
|
|
||||||
VirtualHost = ConfigurationManager.AppSettings["rabbitmq.vhost"] ?? "/",
|
|
||||||
RequestedHeartbeat = 10
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public RabbitMqClient()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public MqMessage GetMessage()
|
|
||||||
{
|
|
||||||
var queueName = ConfigurationManager.AppSettings["rabbitmq.inputQueue"] ?? Dns.GetHostName().ToLower();
|
|
||||||
try
|
|
||||||
{
|
|
||||||
IConnection connection = null;
|
|
||||||
lock (this)
|
|
||||||
{
|
|
||||||
connection = this.currentConnecton = this.currentConnecton ?? connectionFactory.CreateConnection();
|
|
||||||
}
|
|
||||||
var session = connection.CreateModel();
|
|
||||||
session.BasicQos(0, 1, false);
|
|
||||||
//session.QueueDeclare(queueName, true, false, false, null);
|
|
||||||
var consumer = new QueueingBasicConsumer(session);
|
|
||||||
var consumeTag = session.BasicConsume(queueName, false, consumer);
|
|
||||||
var e = (RabbitMQ.Client.Events.BasicDeliverEventArgs) consumer.Queue.Dequeue();
|
|
||||||
Action ackFunc = delegate {
|
|
||||||
session.BasicAck(e.DeliveryTag, false);
|
|
||||||
session.BasicCancel(consumeTag);
|
|
||||||
session.Close();
|
|
||||||
};
|
|
||||||
|
|
||||||
return new MqMessage(ackFunc) {
|
|
||||||
Body = Encoding.UTF8.GetString(e.Body),
|
|
||||||
Id = e.BasicProperties.MessageId
|
|
||||||
};
|
|
||||||
}
|
|
||||||
catch (Exception exception)
|
|
||||||
{
|
|
||||||
|
|
||||||
Dispose();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendResult(MqMessage message)
|
|
||||||
{
|
|
||||||
var exchangeName = ConfigurationManager.AppSettings["rabbitmq.resultExchange"] ?? "";
|
|
||||||
var resultRoutingKey = ConfigurationManager.AppSettings["rabbitmq.resultRoutingKey"] ?? "-execution-results";
|
|
||||||
bool durable = bool.Parse(ConfigurationManager.AppSettings["rabbitmq.durableMessages"] ?? "true");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
IConnection connection = null;
|
|
||||||
lock (this)
|
|
||||||
{
|
|
||||||
connection = this.currentConnecton = this.currentConnecton ?? connectionFactory.CreateConnection();
|
|
||||||
}
|
|
||||||
var session = connection.CreateModel();
|
|
||||||
/*if (!string.IsNullOrEmpty(resultQueue))
|
|
||||||
{
|
|
||||||
//session.QueueDeclare(resultQueue, true, false, false, null);
|
|
||||||
if (!string.IsNullOrEmpty(exchangeName))
|
|
||||||
{
|
|
||||||
session.ExchangeBind(exchangeName, resultQueue, resultQueue);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
var basicProperties = session.CreateBasicProperties();
|
|
||||||
basicProperties.SetPersistent(durable);
|
|
||||||
basicProperties.MessageId = message.Id;
|
|
||||||
basicProperties.ContentType = "application/json";
|
|
||||||
session.BasicPublish(exchangeName, resultRoutingKey, basicProperties, Encoding.UTF8.GetBytes(message.Body));
|
|
||||||
session.Close();
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
Dispose();
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Dispose()
|
|
||||||
{
|
|
||||||
lock (this)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (this.currentConnecton != null)
|
|
||||||
{
|
|
||||||
this.currentConnecton.Close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
this.currentConnecton = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
{
|
|
||||||
"Scripts":
|
|
||||||
[
|
|
||||||
"ZnVuY3Rpb24gdDMgeyAxMjsgcmV0dXJuICJ0ZXN0IiB9",
|
|
||||||
"ZnVuY3Rpb24gTmV3LVBlcnNvbigpDQp7DQogIHBhcmFtICgkRmlyc3ROYW1lLCAkTGFzdE5hbWUsICRQaG9uZSkNCg0KICAkcGVyc29uID0gbmV3LW9iamVjdCBQU09iamVjdA0KDQogICRwZXJzb24gfCBhZGQtbWVtYmVyIC10eXBlIE5vdGVQcm9wZXJ0eSAtTmFtZSBGaXJzdCAtVmFsdWUgJEZpcnN0TmFtZQ0KICAkcGVyc29uIHwgYWRkLW1lbWJlciAtdHlwZSBOb3RlUHJvcGVydHkgLU5hbWUgTGFzdCAtVmFsdWUgJExhc3ROYW1lDQogICRwZXJzb24gfCBhZGQtbWVtYmVyIC10eXBlIE5vdGVQcm9wZXJ0eSAtTmFtZSBQaG9uZSAtVmFsdWUgJFBob25lDQoNCiAgcmV0dXJuICRwZXJzb24NCn0=",
|
|
||||||
"ZnVuY3Rpb24gVGVzdFRocm93KCkNCnsNCglUaHJvdyBbc3lzdGVtLkluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbl0gDQp9"
|
|
||||||
],
|
|
||||||
"Commands" :
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"Name": "New-Person",
|
|
||||||
"Arguments" :
|
|
||||||
{
|
|
||||||
"FirstName": "MyFirstName",
|
|
||||||
"LastName": "MyLastName",
|
|
||||||
"Phone": "123-456"
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "t3",
|
|
||||||
"Arguments" :
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "Get-Date",
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"Name": "TestThrow",
|
|
||||||
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"RebootOnCompletion": 0
|
|
||||||
}
|
|
@ -1,111 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Configuration.Install;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.ServiceProcess;
|
|
||||||
using NLog;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
public class ServiceManager
|
|
||||||
{
|
|
||||||
private readonly string serviceName;
|
|
||||||
|
|
||||||
public ServiceManager(string serviceName)
|
|
||||||
{
|
|
||||||
this.serviceName = serviceName;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
|
||||||
|
|
||||||
public bool Restart(string[] args, TimeSpan timeout)
|
|
||||||
{
|
|
||||||
var service = new ServiceController(serviceName);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var millisec1 = TimeSpan.FromMilliseconds(Environment.TickCount);
|
|
||||||
|
|
||||||
service.Stop();
|
|
||||||
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
|
|
||||||
Log.Info("Service is stopped");
|
|
||||||
|
|
||||||
// count the rest of the timeout
|
|
||||||
var millisec2 = TimeSpan.FromMilliseconds(Environment.TickCount);
|
|
||||||
timeout = timeout - (millisec2 - millisec1);
|
|
||||||
|
|
||||||
service.Start(args);
|
|
||||||
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
|
|
||||||
Log.Info("Service has started");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot restart service " + serviceName, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Stop(TimeSpan timeout)
|
|
||||||
{
|
|
||||||
var service = new ServiceController(serviceName);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
service.Stop();
|
|
||||||
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot stop service " + serviceName, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Start(string[] args, TimeSpan timeout)
|
|
||||||
{
|
|
||||||
var service = new ServiceController(serviceName);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
service.Start(args);
|
|
||||||
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot start service " + serviceName, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Install()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ManagedInstallerClass.InstallHelper(
|
|
||||||
new string[] { Assembly.GetEntryAssembly().Location });
|
|
||||||
}
|
|
||||||
catch(Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot install service " + serviceName, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool Uninstall()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ManagedInstallerClass.InstallHelper(
|
|
||||||
new string[] { "/u", Assembly.GetEntryAssembly().Location });
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Log.ErrorException("Cannot uninstall service " + serviceName, ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,94 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{F7E2A8D5-6D24-4651-A4BC-1024D59F4903}</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>Mirantis.Keero.WindowsAgent</RootNamespace>
|
|
||||||
<AssemblyName>WindowsAgent</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
<Prefer32Bit>false</Prefer32Bit>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Newtonsoft.Json">
|
|
||||||
<HintPath>..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="NLog">
|
|
||||||
<HintPath>..\packages\NLog.2.0.0.2000\lib\net40\NLog.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="RabbitMQ.Client">
|
|
||||||
<HintPath>..\packages\RabbitMQ.Client.3.0.2\lib\net30\RabbitMQ.Client.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Configuration" />
|
|
||||||
<Reference Include="System.Configuration.Install" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
|
|
||||||
<SpecificVersion>False</SpecificVersion>
|
|
||||||
<HintPath>C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0\System.Management.Automation.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System.ServiceProcess" />
|
|
||||||
<Reference Include="System.Xml.Linq" />
|
|
||||||
<Reference Include="System.Data.DataSetExtensions" />
|
|
||||||
<Reference Include="Microsoft.CSharp" />
|
|
||||||
<Reference Include="System.Data" />
|
|
||||||
<Reference Include="System.Xml" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="ExecutionPlan.cs" />
|
|
||||||
<Compile Include="MqMessage.cs" />
|
|
||||||
<Compile Include="PlanExecutor.cs" />
|
|
||||||
<Compile Include="Program.cs">
|
|
||||||
<SubType>Component</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="RabbitMqClient.cs" />
|
|
||||||
<Compile Include="ServiceManager.cs" />
|
|
||||||
<Compile Include="WindowsService.cs">
|
|
||||||
<SubType>Component</SubType>
|
|
||||||
</Compile>
|
|
||||||
<Compile Include="WindowsServiceInstaller.cs">
|
|
||||||
<SubType>Component</SubType>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config" />
|
|
||||||
<None Include="packages.config" />
|
|
||||||
<None Include="SampleExecutionPlan.json" />
|
|
||||||
</ItemGroup>
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<PreBuildEvent>$(SolutionDir)Tools\nuget install $(ProjectDir)packages.config -o $(SolutionDir)Packages</PreBuildEvent>
|
|
||||||
</PropertyGroup>
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
@ -1,95 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.ServiceProcess;
|
|
||||||
using NLog;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
public abstract class WindowsService : ServiceBase
|
|
||||||
{
|
|
||||||
private static readonly Logger Log = LogManager.GetCurrentClassLogger();
|
|
||||||
public bool RunningAsService { get; private set; }
|
|
||||||
|
|
||||||
protected static void Start(WindowsService service, string[] arguments)
|
|
||||||
{
|
|
||||||
Directory.SetCurrentDirectory(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));
|
|
||||||
|
|
||||||
if (arguments.Contains("/install", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
new ServiceManager(service.ServiceName).Install();
|
|
||||||
}
|
|
||||||
else if (arguments.Contains("/uninstall", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
new ServiceManager(service.ServiceName).Uninstall();
|
|
||||||
}
|
|
||||||
else if (arguments.Contains("/start", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
new ServiceManager(service.ServiceName).Start(Environment.GetCommandLineArgs(), TimeSpan.FromMinutes(1));
|
|
||||||
}
|
|
||||||
else if (arguments.Contains("/stop", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
new ServiceManager(service.ServiceName).Stop(TimeSpan.FromMinutes(1));
|
|
||||||
}
|
|
||||||
else if (arguments.Contains("/restart", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
new ServiceManager(service.ServiceName).Restart(Environment.GetCommandLineArgs(), TimeSpan.FromMinutes(1));
|
|
||||||
}
|
|
||||||
else if (!arguments.Contains("/console", StringComparer.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
service.RunningAsService = true;
|
|
||||||
Run(service);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
service.RunningAsService = false;
|
|
||||||
Console.Title = service.ServiceName;
|
|
||||||
service.OnStart(Environment.GetCommandLineArgs());
|
|
||||||
service.WaitForExitSignal();
|
|
||||||
}
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
service.OnStop();
|
|
||||||
service.Dispose();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected WindowsService()
|
|
||||||
{
|
|
||||||
var displayNameAttribute =
|
|
||||||
this.GetType().GetCustomAttributes(typeof (DisplayNameAttribute), false).Cast<DisplayNameAttribute>().
|
|
||||||
FirstOrDefault();
|
|
||||||
if(displayNameAttribute != null)
|
|
||||||
{
|
|
||||||
ServiceName = displayNameAttribute.DisplayName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected virtual void WaitForExitSignal()
|
|
||||||
{
|
|
||||||
Console.WriteLine("Press ESC to exit");
|
|
||||||
while (Console.ReadKey(true).Key != ConsoleKey.Escape)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnStart(string[] args)
|
|
||||||
{
|
|
||||||
Log.Info("Service {0} started", ServiceName);
|
|
||||||
|
|
||||||
base.OnStart(args);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override void OnStop()
|
|
||||||
{
|
|
||||||
Log.Info("Service {0} exited", ServiceName);
|
|
||||||
base.OnStop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
using System.ComponentModel;
|
|
||||||
using System.Configuration.Install;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Reflection;
|
|
||||||
using System.ServiceProcess;
|
|
||||||
|
|
||||||
namespace Mirantis.Keero.WindowsAgent
|
|
||||||
{
|
|
||||||
[RunInstaller(true)]
|
|
||||||
public class WindowsServiceInstaller : Installer
|
|
||||||
{
|
|
||||||
public WindowsServiceInstaller()
|
|
||||||
{
|
|
||||||
var processInstaller = new ServiceProcessInstaller { Account = ServiceAccount.LocalSystem };
|
|
||||||
foreach (var type in Assembly.GetEntryAssembly().GetExportedTypes().Where(t => t.IsSubclassOf(typeof(ServiceBase))))
|
|
||||||
{
|
|
||||||
var nameAttribute = type.GetCustomAttributes(typeof (DisplayNameAttribute), false)
|
|
||||||
.Cast<DisplayNameAttribute>().FirstOrDefault();
|
|
||||||
if(nameAttribute == null) continue;
|
|
||||||
var serviceInstaller = new ServiceInstaller {
|
|
||||||
StartType = ServiceStartMode.Automatic,
|
|
||||||
ServiceName = nameAttribute.DisplayName,
|
|
||||||
DisplayName = nameAttribute.DisplayName
|
|
||||||
};
|
|
||||||
var descriptionAttribute = type.GetCustomAttributes(typeof(DescriptionAttribute), false)
|
|
||||||
.Cast<DescriptionAttribute>().FirstOrDefault();
|
|
||||||
if(descriptionAttribute != null)
|
|
||||||
{
|
|
||||||
serviceInstaller.Description = descriptionAttribute.Description;
|
|
||||||
}
|
|
||||||
|
|
||||||
Installers.Add(serviceInstaller);
|
|
||||||
}
|
|
||||||
|
|
||||||
Installers.Add(processInstaller);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Newtonsoft.Json" version="4.5.11" targetFramework="net45" />
|
|
||||||
<package id="NLog" version="2.0.0.2000" targetFramework="net45" />
|
|
||||||
<package id="RabbitMQ.Client" version="3.0.2" targetFramework="net45" />
|
|
||||||
</packages>
|
|
@ -1,4 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<repositories>
|
|
||||||
<repository path="..\WindowsAgent\packages.config" />
|
|
||||||
</repositories>
|
|
23
api/.gitignore
vendored
23
api/.gitignore
vendored
@ -1,23 +0,0 @@
|
|||||||
#IntelJ Idea
|
|
||||||
.idea/
|
|
||||||
|
|
||||||
#virtualenv
|
|
||||||
.venv/
|
|
||||||
|
|
||||||
#Build results
|
|
||||||
build/
|
|
||||||
dist/
|
|
||||||
*.egg-info/
|
|
||||||
|
|
||||||
#Python
|
|
||||||
*.pyc
|
|
||||||
|
|
||||||
#Translation build
|
|
||||||
*.mo
|
|
||||||
*.pot
|
|
||||||
|
|
||||||
#SQLite Database files
|
|
||||||
*.sqlite
|
|
||||||
|
|
||||||
#Autogenerated Documentation
|
|
||||||
doc/source/api
|
|
@ -1,7 +0,0 @@
|
|||||||
Glazier API README
|
|
||||||
=====================
|
|
||||||
Glazier API is a project that provides access to engine via API.
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
--------
|
|
||||||
* `Glazier <http://glazier.mirantis.com>`__
|
|
@ -1 +0,0 @@
|
|||||||
[python: **.py]
|
|
@ -1,54 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.from oslo.config import cfg
|
|
||||||
|
|
||||||
import gettext
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# If ../glazierapi/__init__.py exists, add ../ to Python search path, so that
|
|
||||||
# it will override what happens to be installed in /usr/(local/)lib/python...
|
|
||||||
from glazierapi.common.service import TaskResultHandlerService
|
|
||||||
|
|
||||||
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
|
||||||
os.pardir,
|
|
||||||
os.pardir))
|
|
||||||
if os.path.exists(os.path.join(possible_topdir, 'portas', '__init__.py')):
|
|
||||||
sys.path.insert(0, possible_topdir)
|
|
||||||
|
|
||||||
from glazierapi.common import config
|
|
||||||
from glazierapi.openstack.common import log
|
|
||||||
from glazierapi.openstack.common import wsgi
|
|
||||||
from glazierapi.openstack.common import service
|
|
||||||
|
|
||||||
gettext.install('glazierapi', './glazierapi/locale', unicode=1)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
try:
|
|
||||||
config.parse_args()
|
|
||||||
log.setup('glazierapi')
|
|
||||||
|
|
||||||
launcher = service.ServiceLauncher()
|
|
||||||
|
|
||||||
api_service = wsgi.Service(config.load_paste_app(),
|
|
||||||
port=config.CONF.bind_port,
|
|
||||||
host=config.CONF.bind_host)
|
|
||||||
|
|
||||||
launcher.launch_service(api_service)
|
|
||||||
launcher.launch_service(TaskResultHandlerService())
|
|
||||||
launcher.wait()
|
|
||||||
except RuntimeError, e:
|
|
||||||
sys.stderr.write("ERROR: %s\n" % e)
|
|
||||||
sys.exit(1)
|
|
@ -1,241 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# Copyright (c) 2010 OpenStack Foundation.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
# you may not use this file except in compliance with the License.
|
|
||||||
# You may obtain a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
# implied.
|
|
||||||
# See the License for the specific language governing permissions and
|
|
||||||
# limitations under the License.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Portas documentation build configuration file, created by
|
|
||||||
# sphinx-quickstart on Tue February 28 13:50:15 2013.
|
|
||||||
#
|
|
||||||
# This file is execfile()'d with the current directory set to its containing
|
|
||||||
# dir.
|
|
||||||
#
|
|
||||||
# Note that not all possible configuration values are present in this
|
|
||||||
# autogenerated file.
|
|
||||||
#
|
|
||||||
# All configuration values have a default; values that are commented out
|
|
||||||
# serve to show the default.
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
|
||||||
sys.path = [os.path.abspath('../../glazierapi'),
|
|
||||||
os.path.abspath('../..'),
|
|
||||||
os.path.abspath('../../bin')] + sys.path
|
|
||||||
|
|
||||||
# -- General configuration ---------------------------------------------------
|
|
||||||
|
|
||||||
# Add any Sphinx extension module names here, as strings. They can be
|
|
||||||
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
|
||||||
extensions = ['sphinx.ext.autodoc',
|
|
||||||
'sphinx.ext.intersphinx',
|
|
||||||
'sphinx.ext.coverage',
|
|
||||||
'sphinx.ext.pngmath',
|
|
||||||
'sphinx.ext.ifconfig',
|
|
||||||
'sphinx.ext.graphviz']
|
|
||||||
|
|
||||||
# Add any paths that contain templates here, relative to this directory.
|
|
||||||
templates_path = []
|
|
||||||
if os.getenv('HUDSON_PUBLISH_DOCS'):
|
|
||||||
templates_path = ['_ga', '_templates']
|
|
||||||
else:
|
|
||||||
templates_path = ['_templates']
|
|
||||||
|
|
||||||
# The suffix of source filenames.
|
|
||||||
source_suffix = '.rst'
|
|
||||||
|
|
||||||
# The encoding of source files.
|
|
||||||
#source_encoding = 'utf-8'
|
|
||||||
|
|
||||||
# The master toctree document.
|
|
||||||
master_doc = 'index'
|
|
||||||
|
|
||||||
# General information about the project.
|
|
||||||
project = u'Glazier APIs'
|
|
||||||
copyright = u'2013, Mirantis, Inc'
|
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
|
||||||
# |version| and |release|, also used in various other places throughout the
|
|
||||||
# built documents.
|
|
||||||
#
|
|
||||||
# The short X.Y version.
|
|
||||||
from glazierapi.version import version_info as portas_version
|
|
||||||
# The full version, including alpha/beta/rc tags.
|
|
||||||
release = portas_version.version_string_with_vcs()
|
|
||||||
# The short X.Y version.
|
|
||||||
version = portas_version.canonical_version_string()
|
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
|
||||||
# for a list of supported languages.
|
|
||||||
#language = None
|
|
||||||
|
|
||||||
# There are two options for replacing |today|: either, you set today to some
|
|
||||||
# non-false value, then it is used:
|
|
||||||
#today = ''
|
|
||||||
# Else, today_fmt is used as the format for a strftime call.
|
|
||||||
#today_fmt = '%B %d, %Y'
|
|
||||||
|
|
||||||
# List of documents that shouldn't be included in the build.
|
|
||||||
#unused_docs = []
|
|
||||||
|
|
||||||
# List of directories, relative to source directory, that shouldn't be searched
|
|
||||||
# for source files.
|
|
||||||
exclude_trees = ['api']
|
|
||||||
|
|
||||||
# The reST default role (for this markup: `text`) to use for all documents.
|
|
||||||
#default_role = None
|
|
||||||
|
|
||||||
# If true, '()' will be appended to :func: etc. cross-reference text.
|
|
||||||
#add_function_parentheses = True
|
|
||||||
|
|
||||||
# If true, the current module name will be prepended to all description
|
|
||||||
# unit titles (such as .. function::).
|
|
||||||
#add_module_names = True
|
|
||||||
|
|
||||||
# If true, sectionauthor and moduleauthor directives will be shown in the
|
|
||||||
# output. They are ignored by default.
|
|
||||||
show_authors = True
|
|
||||||
|
|
||||||
# The name of the Pygments (syntax highlighting) style to use.
|
|
||||||
pygments_style = 'sphinx'
|
|
||||||
|
|
||||||
# A list of ignored prefixes for module index sorting.
|
|
||||||
modindex_common_prefix = ['glazierapi.']
|
|
||||||
|
|
||||||
# -- Options for man page output --------------------------------------------
|
|
||||||
|
|
||||||
# Grouping the document tree for man pages.
|
|
||||||
# List of tuples 'sourcefile', 'target', u'title', u'Authors name', 'manual'
|
|
||||||
|
|
||||||
man_pages = [
|
|
||||||
('man/glazierapi', 'glazier-api', u'Glazier API Server',
|
|
||||||
[u'Mirantis, Inc'], 1)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for HTML output -------------------------------------------------
|
|
||||||
|
|
||||||
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
|
||||||
# Sphinx are currently 'default' and 'sphinxdoc'.
|
|
||||||
html_theme_path = ["."]
|
|
||||||
html_theme = '_theme'
|
|
||||||
|
|
||||||
# Theme options are theme-specific and customize the look and feel of a theme
|
|
||||||
# further. For a list of options available for each theme, see the
|
|
||||||
# documentation.
|
|
||||||
#html_theme_options = {}
|
|
||||||
|
|
||||||
# Add any paths that contain custom themes here, relative to this directory.
|
|
||||||
#html_theme_path = ['_theme']
|
|
||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
|
||||||
# "<project> v<release> documentation".
|
|
||||||
#html_title = None
|
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
|
||||||
#html_short_title = None
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top
|
|
||||||
# of the sidebar.
|
|
||||||
#html_logo = None
|
|
||||||
|
|
||||||
# The name of an image file (within the static path) to use as favicon of the
|
|
||||||
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
|
||||||
# pixels large.
|
|
||||||
#html_favicon = None
|
|
||||||
|
|
||||||
# Add any paths that contain custom static files (such as style sheets) here,
|
|
||||||
# relative to this directory. They are copied after the builtin static files,
|
|
||||||
# so a file named "default.css" will overwrite the builtin "default.css".
|
|
||||||
html_static_path = ['_static']
|
|
||||||
|
|
||||||
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
|
||||||
# using the given strftime format.
|
|
||||||
#html_last_updated_fmt = '%b %d, %Y'
|
|
||||||
git_cmd = "git log --pretty=format:'%ad, commit %h' --date=local -n1"
|
|
||||||
html_last_updated_fmt = os.popen(git_cmd).read()
|
|
||||||
|
|
||||||
# If true, SmartyPants will be used to convert quotes and dashes to
|
|
||||||
# typographically correct entities.
|
|
||||||
#html_use_smartypants = True
|
|
||||||
|
|
||||||
# Custom sidebar templates, maps document names to template names.
|
|
||||||
#html_sidebars = {}
|
|
||||||
|
|
||||||
# Additional templates that should be rendered to pages, maps page names to
|
|
||||||
# template names.
|
|
||||||
#html_additional_pages = {}
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
html_use_modindex = False
|
|
||||||
|
|
||||||
# If false, no index is generated.
|
|
||||||
html_use_index = False
|
|
||||||
|
|
||||||
# If true, the index is split into individual pages for each letter.
|
|
||||||
#html_split_index = False
|
|
||||||
|
|
||||||
# If true, links to the reST sources are added to the pages.
|
|
||||||
#html_show_sourcelink = True
|
|
||||||
|
|
||||||
# If true, an OpenSearch description file will be output, and all pages will
|
|
||||||
# contain a <link> tag referring to it. The value of this option must be the
|
|
||||||
# base URL from which the finished HTML is served.
|
|
||||||
#html_use_opensearch = ''
|
|
||||||
|
|
||||||
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
|
||||||
#html_file_suffix = ''
|
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
|
||||||
htmlhelp_basename = 'glazierapidoc'
|
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output ------------------------------------------------
|
|
||||||
|
|
||||||
# The paper size ('letter' or 'a4').
|
|
||||||
#latex_paper_size = 'letter'
|
|
||||||
|
|
||||||
# The font size ('10pt', '11pt' or '12pt').
|
|
||||||
#latex_font_size = '10pt'
|
|
||||||
|
|
||||||
# Grouping the document tree into LaTeX files. List of tuples
|
|
||||||
# (source start file, target name, title, author,
|
|
||||||
# documentclass [howto/manual]).
|
|
||||||
latex_documents = [
|
|
||||||
('index', 'Glazier.tex', u'Glazier Documentation',
|
|
||||||
u'Mirantis, Inc', 'manual'),
|
|
||||||
]
|
|
||||||
|
|
||||||
# The name of an image file (relative to this directory) to place at the top of
|
|
||||||
# the title page.
|
|
||||||
#latex_logo = None
|
|
||||||
|
|
||||||
# For "manual" documents, if this is true, then toplevel headings are parts,
|
|
||||||
# not chapters.
|
|
||||||
#latex_use_parts = False
|
|
||||||
|
|
||||||
# Additional stuff for the LaTeX preamble.
|
|
||||||
#latex_preamble = ''
|
|
||||||
|
|
||||||
# Documents to append as an appendix to all manuals.
|
|
||||||
#latex_appendices = []
|
|
||||||
|
|
||||||
# If false, no module index is generated.
|
|
||||||
#latex_use_modindex = True
|
|
||||||
|
|
||||||
# Example configuration for intersphinx: refer to the Python standard library.
|
|
||||||
intersphinx_mapping = {'python': ('http://docs.python.org/', None)}
|
|
@ -1,114 +0,0 @@
|
|||||||
..
|
|
||||||
Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
not use this file except in compliance with the License. You may obtain
|
|
||||||
a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
License for the specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
==============================================
|
|
||||||
Welcome to Glazier API Service!
|
|
||||||
==============================================
|
|
||||||
|
|
||||||
Glazier API is a project that provides access to engine via API.
|
|
||||||
|
|
||||||
This document describes Glazier API for contributors of the project,
|
|
||||||
and assumes that you are already familiar with Glazier API from an
|
|
||||||
`end-user perspective`_.
|
|
||||||
|
|
||||||
.. _`end-user perspective`: http://glazier.mirantis.com/
|
|
||||||
|
|
||||||
This documentation is generated by the Sphinx toolkit and lives in the source
|
|
||||||
tree.
|
|
||||||
|
|
||||||
Installation Guide
|
|
||||||
==================
|
|
||||||
Install
|
|
||||||
-------
|
|
||||||
1. Check out sources to some directory (<home>/glazier)::
|
|
||||||
|
|
||||||
user@work:~/$ git clone ssh://<user>@gerrit.mirantis.com:29418/keero/keero.git
|
|
||||||
|
|
||||||
2. Install Glazier API::
|
|
||||||
|
|
||||||
user@work:~/$ cd glazier/api && sudo python setup.py install
|
|
||||||
|
|
||||||
Configure
|
|
||||||
---------
|
|
||||||
1. Open first configuration file for editing::
|
|
||||||
|
|
||||||
user@work:~/$ cd glazier/api/etc && nano glazier-api.conf
|
|
||||||
|
|
||||||
2. Configure according to you environment (please note rabbitmq section)::
|
|
||||||
|
|
||||||
[DEFAULT]
|
|
||||||
# Show more verbose log output (sets INFO log level output)
|
|
||||||
verbose = True
|
|
||||||
# Show debugging output in logs (sets DEBUG log level output)
|
|
||||||
debug = True
|
|
||||||
# Address to bind the server to
|
|
||||||
bind_host = 0.0.0.0
|
|
||||||
# Port the bind the server to
|
|
||||||
bind_port = 8082
|
|
||||||
# Log to this file. Make sure the user running skeleton-api has
|
|
||||||
# permissions to write to this file!
|
|
||||||
log_file = /tmp/glazier-api.log
|
|
||||||
#A valid SQLAlchemy connection string for the metadata database
|
|
||||||
sql_connection = sqlite:///glazier.sqlite
|
|
||||||
|
|
||||||
[reports]
|
|
||||||
results_exchange = task-results
|
|
||||||
results_queue = task-results
|
|
||||||
reports_exchange = task-reports
|
|
||||||
reports_queue = task-reports
|
|
||||||
|
|
||||||
[rabbitmq]
|
|
||||||
host = localhost
|
|
||||||
port = 5672
|
|
||||||
virtual_host = keero
|
|
||||||
login = keero
|
|
||||||
password = keero
|
|
||||||
|
|
||||||
3. Open second configuration file for editing::
|
|
||||||
|
|
||||||
smelikyan@work:~/cd glazier/api/etc && nano glazier-api.conf
|
|
||||||
|
|
||||||
4. Configure according to you environment (please note filter:authtoken section)::
|
|
||||||
|
|
||||||
[pipeline:glazier-api]
|
|
||||||
pipeline = authtoken context apiv1app
|
|
||||||
[app:apiv1app]
|
|
||||||
paste.app_factory = glazierapi.api.v1.router:API.factory
|
|
||||||
[filter:context]
|
|
||||||
paste.filter_factory = glazierapi.api.middleware.context:ContextMiddleware.factory
|
|
||||||
|
|
||||||
[filter:authtoken]
|
|
||||||
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
|
|
||||||
auth_host = localhost
|
|
||||||
auth_port = 35357
|
|
||||||
auth_protocol = http
|
|
||||||
admin_tenant_name = admin
|
|
||||||
admin_user = admin
|
|
||||||
admin_password = password
|
|
||||||
signing_dir = /tmp/keystone-signing-glazierapi
|
|
||||||
|
|
||||||
Run
|
|
||||||
----
|
|
||||||
Run Glazier API and supply valid configuration file::
|
|
||||||
|
|
||||||
user@work:~/$ glazier-api --config-file=./glazier/api/etc/glazier-api.conf
|
|
||||||
|
|
||||||
Man Pages
|
|
||||||
=========
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 1
|
|
||||||
|
|
||||||
man/glazierapi
|
|
@ -1,69 +0,0 @@
|
|||||||
..
|
|
||||||
Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
not use this file except in compliance with the License. You may obtain
|
|
||||||
a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
License for the specific language governing permissions and limitations
|
|
||||||
under the License.
|
|
||||||
|
|
||||||
==========
|
|
||||||
glazier-api
|
|
||||||
==========
|
|
||||||
|
|
||||||
-----------------------------
|
|
||||||
Glazier API Server
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
:Author: smelikyan@mirantis.com
|
|
||||||
:Date: 2013-04-04
|
|
||||||
:Copyright: Mirantis, Inc.
|
|
||||||
:Version: 2013.1-dev
|
|
||||||
:Manual section: 1
|
|
||||||
:Manual group: cloud computing
|
|
||||||
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
========
|
|
||||||
|
|
||||||
glazier-api [options]
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
===========
|
|
||||||
|
|
||||||
glazier-api is a server daemon that serves the Glazier API
|
|
||||||
|
|
||||||
OPTIONS
|
|
||||||
=======
|
|
||||||
|
|
||||||
**General options**
|
|
||||||
|
|
||||||
**-v, --verbose**
|
|
||||||
Print more verbose output
|
|
||||||
|
|
||||||
**--config-file**
|
|
||||||
Config file used for running service
|
|
||||||
|
|
||||||
**--bind-host=HOST**
|
|
||||||
Address of host running ``glazier-api``. Defaults to `0.0.0.0`.
|
|
||||||
|
|
||||||
**--bind-port=PORT**
|
|
||||||
Port that ``glazier-api`` listens on. Defaults to `8082`.
|
|
||||||
|
|
||||||
|
|
||||||
FILES
|
|
||||||
=====
|
|
||||||
|
|
||||||
* /etc/glazier/glazier-api.conf
|
|
||||||
* /etc/glazier/glazier-api-paste.conf
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
========
|
|
||||||
|
|
||||||
* `Glazier <http://glazier.mirantis.com>`__
|
|
@ -1,18 +0,0 @@
|
|||||||
[pipeline:glazier-api]
|
|
||||||
pipeline = authtoken context apiv1app
|
|
||||||
|
|
||||||
[app:apiv1app]
|
|
||||||
paste.app_factory = glazierapi.api.v1.router:API.factory
|
|
||||||
|
|
||||||
[filter:context]
|
|
||||||
paste.filter_factory = glazierapi.api.middleware.context:ContextMiddleware.factory
|
|
||||||
|
|
||||||
[filter:authtoken]
|
|
||||||
paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory
|
|
||||||
auth_host = localhost
|
|
||||||
auth_port = 35357
|
|
||||||
auth_protocol = http
|
|
||||||
admin_tenant_name = admin
|
|
||||||
admin_user = admin
|
|
||||||
admin_password = password
|
|
||||||
signing_dir = /tmp/keystone-signing-portas
|
|
@ -1,32 +0,0 @@
|
|||||||
[DEFAULT]
|
|
||||||
# Show more verbose log output (sets INFO log level output)
|
|
||||||
verbose = True
|
|
||||||
|
|
||||||
# Show debugging output in logs (sets DEBUG log level output)
|
|
||||||
debug = True
|
|
||||||
|
|
||||||
# Address to bind the server to
|
|
||||||
bind_host = 0.0.0.0
|
|
||||||
|
|
||||||
# Port the bind the server to
|
|
||||||
bind_port = 8082
|
|
||||||
|
|
||||||
# Log to this file. Make sure the user running skeleton-api has
|
|
||||||
# permissions to write to this file!
|
|
||||||
log_file = /tmp/portas-api.log
|
|
||||||
|
|
||||||
#A valid SQLAlchemy connection string for the metadata database
|
|
||||||
sql_connection = sqlite:///glazier.sqlite
|
|
||||||
|
|
||||||
[reports]
|
|
||||||
results_exchange = task-results
|
|
||||||
results_queue = task-results
|
|
||||||
reports_exchange = task-reports
|
|
||||||
reports_queue = task-reports
|
|
||||||
|
|
||||||
[rabbitmq]
|
|
||||||
host = localhost
|
|
||||||
port = 5672
|
|
||||||
virtual_host = keero
|
|
||||||
login = keero
|
|
||||||
password = keero
|
|
@ -1,13 +0,0 @@
|
|||||||
# Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
@ -1,14 +0,0 @@
|
|||||||
# Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.from oslo.config import cfg
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
# Copyright (c) 2013 Mirantis, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.from oslo.config import cfg
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user