Removed all projects except Glazier Api
This commit is contained in:
parent
c3083f5f6a
commit
33a0a171a3
0
api/.gitignore → .gitignore
vendored
0
api/.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>
|
20
conductor/.gitignore
vendored
20
conductor/.gitignore
vendored
@ -1,20 +0,0 @@
|
||||
#IntelJ Idea
|
||||
.idea/
|
||||
|
||||
#virtualenv
|
||||
.venv/
|
||||
|
||||
#Build results
|
||||
build/
|
||||
dist/
|
||||
*.egg-info/
|
||||
|
||||
#Python
|
||||
*.pyc
|
||||
|
||||
#Translation build
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
#SQLite Database files
|
||||
*.sqlite
|
@ -1,8 +0,0 @@
|
||||
Glazier Conductor README
|
||||
========================
|
||||
Conductor is an Glazier orchestration engine that transforms object model sent by
|
||||
REST API service into a series of Heat and Glazier-Agent commands
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
* `Keero <http://keero.mirantis.com>`__
|
@ -1 +0,0 @@
|
||||
[python: **.py]
|
@ -1,33 +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.
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
from conductor import config
|
||||
from conductor.openstack.common import log
|
||||
from conductor.openstack.common import service
|
||||
from conductor.app import ConductorWorkflowService
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
config.parse_args()
|
||||
log.setup('conductor')
|
||||
launcher = service.ServiceLauncher()
|
||||
launcher.launch_service(ConductorWorkflowService())
|
||||
launcher.wait()
|
||||
except RuntimeError, e:
|
||||
sys.stderr.write("ERROR: %s\n" % e)
|
||||
sys.exit(1)
|
@ -1,105 +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.
|
||||
|
||||
import datetime
|
||||
import glob
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
import anyjson
|
||||
from conductor.openstack.common import service
|
||||
from workflow import Workflow
|
||||
from commands.dispatcher import CommandDispatcher
|
||||
from openstack.common import log as logging
|
||||
from config import Config
|
||||
import reporting
|
||||
import rabbitmq
|
||||
|
||||
import windows_agent
|
||||
import cloud_formation
|
||||
|
||||
config = Config(sys.argv[1] if len(sys.argv) > 1 else None)
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def task_received(task, message_id):
|
||||
with rabbitmq.RmqClient() as rmqclient:
|
||||
try:
|
||||
log.info('Starting processing task {0}: {1}'.format(
|
||||
message_id, anyjson.dumps(task)))
|
||||
reporter = reporting.Reporter(rmqclient, message_id, task['id'])
|
||||
|
||||
command_dispatcher = CommandDispatcher(
|
||||
task['name'], rmqclient, task['token'], task['tenant_id'])
|
||||
workflows = []
|
||||
for path in glob.glob("data/workflows/*.xml"):
|
||||
log.debug('Loading XML {0}'.format(path))
|
||||
workflow = Workflow(path, task, command_dispatcher, config,
|
||||
reporter)
|
||||
workflows.append(workflow)
|
||||
|
||||
while True:
|
||||
try:
|
||||
while True:
|
||||
result = False
|
||||
for workflow in workflows:
|
||||
if workflow.execute():
|
||||
result = True
|
||||
if not result:
|
||||
break
|
||||
if not command_dispatcher.execute_pending():
|
||||
break
|
||||
except Exception as ex:
|
||||
log.exception(ex)
|
||||
break
|
||||
|
||||
command_dispatcher.close()
|
||||
finally:
|
||||
del task['token']
|
||||
result_msg = rabbitmq.Message()
|
||||
result_msg.body = task
|
||||
result_msg.id = message_id
|
||||
|
||||
rmqclient.send(message=result_msg, key='task-results')
|
||||
log.info('Finished processing task {0}. Result = {1}'.format(
|
||||
message_id, anyjson.dumps(task)))
|
||||
|
||||
|
||||
class ConductorWorkflowService(service.Service):
|
||||
def __init__(self):
|
||||
super(ConductorWorkflowService, self).__init__()
|
||||
|
||||
def start(self):
|
||||
super(ConductorWorkflowService, self).start()
|
||||
self.tg.add_thread(self._start_rabbitmq)
|
||||
|
||||
def stop(self):
|
||||
super(ConductorWorkflowService, self).stop()
|
||||
|
||||
def _start_rabbitmq(self):
|
||||
while True:
|
||||
try:
|
||||
with rabbitmq.RmqClient() as rmq:
|
||||
rmq.declare('tasks', 'tasks')
|
||||
rmq.declare('task-results')
|
||||
with rmq.open('tasks') as subscription:
|
||||
while True:
|
||||
msg = subscription.get_message()
|
||||
self.tg.add_thread(
|
||||
task_received, msg.body, msg.id)
|
||||
except Exception as ex:
|
||||
log.exception(ex)
|
||||
|
@ -1,127 +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.
|
||||
|
||||
import base64
|
||||
import config
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
|
||||
import xml_code_engine
|
||||
|
||||
|
||||
def update_cf_stack(engine, context, body, template,
|
||||
mappings, arguments, **kwargs):
|
||||
command_dispatcher = context['/commandDispatcher']
|
||||
|
||||
callback = lambda result: engine.evaluate_content(
|
||||
body.find('success'), context)
|
||||
|
||||
command_dispatcher.execute(
|
||||
name='cf', command='CreateOrUpdate', template=template,
|
||||
mappings=mappings, arguments=arguments, callback=callback)
|
||||
|
||||
|
||||
def delete_cf_stack(engine, context, body, **kwargs):
|
||||
command_dispatcher = context['/commandDispatcher']
|
||||
|
||||
callback = lambda result: engine.evaluate_content(
|
||||
body.find('success'), context)
|
||||
|
||||
command_dispatcher.execute(
|
||||
name='cf', command='Delete', callback=callback)
|
||||
|
||||
|
||||
def prepare_user_data(context, hostname, service, unit,
|
||||
template='Default', **kwargs):
|
||||
settings = config.CONF.rabbitmq
|
||||
|
||||
with open('data/init.ps1') as init_script_file:
|
||||
with open('data/templates/agent-config/{0}.template'.format(
|
||||
template)) as template_file:
|
||||
init_script = init_script_file.read()
|
||||
template_data = template_file.read()
|
||||
|
||||
replacements = {
|
||||
'%RABBITMQ_HOST%': settings.host,
|
||||
'%RABBITMQ_INPUT_QUEUE%': '-'.join(
|
||||
[str(context['/dataSource']['name']),
|
||||
str(service), str(unit)]).lower(),
|
||||
'%RESULT_QUEUE%': '-execution-results-{0}'.format(
|
||||
str(context['/dataSource']['name'])).lower(),
|
||||
'%RABBITMQ_USER%': settings.login,
|
||||
'%RABBITMQ_PASSWORD%': settings.password,
|
||||
'%RABBITMQ_VHOST%': settings.virtual_host
|
||||
}
|
||||
|
||||
template_data = set_config_params(template_data, replacements)
|
||||
|
||||
init_script = init_script.replace(
|
||||
'%WINDOWS_AGENT_CONFIG_BASE64%',
|
||||
base64.b64encode(template_data))
|
||||
|
||||
init_script = init_script.replace('%INTERNAL_HOSTNAME%', hostname)
|
||||
|
||||
return init_script
|
||||
|
||||
|
||||
def set_config_params(template_data, replacements):
|
||||
for key in replacements:
|
||||
template_data = template_data.replace(key, replacements[key])
|
||||
return template_data
|
||||
|
||||
|
||||
counter = 0
|
||||
|
||||
|
||||
def int2base(x, base):
|
||||
digs = string.digits + string.lowercase
|
||||
if x < 0:
|
||||
sign = -1
|
||||
elif x == 0:
|
||||
return '0'
|
||||
else:
|
||||
sign = 1
|
||||
x *= sign
|
||||
digits = []
|
||||
while x:
|
||||
digits.append(digs[x % base])
|
||||
x /= base
|
||||
if sign < 0:
|
||||
digits.append('-')
|
||||
digits.reverse()
|
||||
return ''.join(digits)
|
||||
|
||||
|
||||
def generate_hostname(**kwargs):
|
||||
global counter
|
||||
prefix = ''.join(random.choice(string.lowercase) for _ in range(5))
|
||||
timestamp = int2base(int(time.time() * 1000), 36)[:8]
|
||||
suffix = int2base(counter, 36)
|
||||
counter = (counter + 1) % 1296
|
||||
return prefix + timestamp + suffix
|
||||
|
||||
|
||||
xml_code_engine.XmlCodeEngine.register_function(
|
||||
update_cf_stack, "update-cf-stack")
|
||||
|
||||
xml_code_engine.XmlCodeEngine.register_function(
|
||||
delete_cf_stack, "delete-cf-stack")
|
||||
|
||||
xml_code_engine.XmlCodeEngine.register_function(
|
||||
prepare_user_data, "prepare-user-data")
|
||||
|
||||
xml_code_engine.XmlCodeEngine.register_function(
|
||||
generate_hostname, "generate-hostname")
|
@ -1,16 +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.
|
||||
|
||||
import command
|
@ -1,188 +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.
|
||||
|
||||
import anyjson
|
||||
import eventlet
|
||||
import types
|
||||
import jsonpath
|
||||
|
||||
from conductor.openstack.common import log as logging
|
||||
import conductor.helpers
|
||||
from command import CommandBase
|
||||
import conductor.config
|
||||
from heatclient.client import Client
|
||||
import heatclient.exc
|
||||
from keystoneclient.v2_0 import client as ksclient
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class HeatExecutor(CommandBase):
|
||||
def __init__(self, stack, token, tenant_id):
|
||||
self._update_pending_list = []
|
||||
self._delete_pending_list = []
|
||||
self._stack = stack
|
||||
settings = conductor.config.CONF.heat
|
||||
|
||||
client = ksclient.Client(endpoint=settings.auth_url)
|
||||
auth_data = client.tokens.authenticate(
|
||||
tenant_id=tenant_id,
|
||||
token=token)
|
||||
|
||||
scoped_token = auth_data.id
|
||||
|
||||
heat_url = jsonpath.jsonpath(
|
||||
auth_data.serviceCatalog,
|
||||
"$[?(@.name == 'heat')].endpoints[0].publicURL")[0]
|
||||
|
||||
self._heat_client = Client(
|
||||
'1',
|
||||
heat_url,
|
||||
token_only=True,
|
||||
token=scoped_token)
|
||||
|
||||
def execute(self, command, callback, **kwargs):
|
||||
log.debug('Got command {0} on stack {1}'.format(command, self._stack))
|
||||
|
||||
if command == 'CreateOrUpdate':
|
||||
return self._execute_create_update(
|
||||
kwargs['template'],
|
||||
kwargs['mappings'],
|
||||
kwargs['arguments'],
|
||||
callback)
|
||||
elif command == 'Delete':
|
||||
return self._execute_delete(callback)
|
||||
|
||||
def _execute_create_update(self, template, mappings, arguments, callback):
|
||||
with open('data/templates/cf/%s.template' % template) as template_file:
|
||||
template_data = template_file.read()
|
||||
|
||||
template_data = conductor.helpers.transform_json(
|
||||
anyjson.loads(template_data), mappings)
|
||||
|
||||
self._update_pending_list.append({
|
||||
'template': template_data,
|
||||
'arguments': arguments,
|
||||
'callback': callback
|
||||
})
|
||||
|
||||
def _execute_delete(self, callback):
|
||||
self._delete_pending_list.append({
|
||||
'callback': callback
|
||||
})
|
||||
|
||||
def has_pending_commands(self):
|
||||
return len(self._update_pending_list) + \
|
||||
len(self._delete_pending_list) > 0
|
||||
|
||||
def execute_pending(self):
|
||||
r1 = self._execute_pending_updates()
|
||||
r2 = self._execute_pending_deletes()
|
||||
return r1 or r2
|
||||
|
||||
def _execute_pending_updates(self):
|
||||
if not len(self._update_pending_list):
|
||||
return False
|
||||
|
||||
template, arguments = self._get_current_template()
|
||||
stack_exists = (template != {})
|
||||
|
||||
for t in self._update_pending_list:
|
||||
template = conductor.helpers.merge_dicts(
|
||||
template, t['template'], max_levels=2)
|
||||
arguments = conductor.helpers.merge_dicts(
|
||||
arguments, t['arguments'], max_levels=1)
|
||||
|
||||
log.info(
|
||||
'Executing heat template {0} with arguments {1} on stack {2}'
|
||||
.format(anyjson.dumps(template), arguments, self._stack))
|
||||
|
||||
if stack_exists:
|
||||
self._heat_client.stacks.update(
|
||||
stack_id=self._stack,
|
||||
parameters=arguments,
|
||||
template=template)
|
||||
log.debug(
|
||||
'Waiting for the stack {0} to be update'.format(self._stack))
|
||||
self._wait_state('UPDATE_COMPLETE')
|
||||
log.info('Stack {0} updated'.format(self._stack))
|
||||
else:
|
||||
self._heat_client.stacks.create(
|
||||
stack_name=self._stack,
|
||||
parameters=arguments,
|
||||
template=template)
|
||||
log.debug('Waiting for the stack {0} to be create'.format(
|
||||
self._stack))
|
||||
self._wait_state('CREATE_COMPLETE')
|
||||
log.info('Stack {0} created'.format(self._stack))
|
||||
|
||||
pending_list = self._update_pending_list
|
||||
self._update_pending_list = []
|
||||
|
||||
for item in pending_list:
|
||||
item['callback'](True)
|
||||
|
||||
return True
|
||||
|
||||
def _execute_pending_deletes(self):
|
||||
if not len(self._delete_pending_list):
|
||||
return False
|
||||
|
||||
log.debug('Deleting stack {0}'.format(self._stack))
|
||||
try:
|
||||
self._heat_client.stacks.delete(
|
||||
stack_id=self._stack)
|
||||
log.debug(
|
||||
'Waiting for the stack {0} to be deleted'.format(self._stack))
|
||||
self._wait_state(['DELETE_COMPLETE', ''])
|
||||
log.info('Stack {0} deleted'.format(self._stack))
|
||||
except Exception as ex:
|
||||
log.exception(ex)
|
||||
|
||||
pending_list = self._delete_pending_list
|
||||
self._delete_pending_list = []
|
||||
|
||||
for item in pending_list:
|
||||
item['callback'](True)
|
||||
return True
|
||||
|
||||
def _get_current_template(self):
|
||||
try:
|
||||
stack_info = self._heat_client.stacks.get(stack_id=self._stack)
|
||||
template = self._heat_client.stacks.template(
|
||||
stack_id='{0}/{1}'.format(stack_info.stack_name, stack_info.id))
|
||||
return template, stack_info.parameters
|
||||
except heatclient.exc.HTTPNotFound:
|
||||
return {}, {}
|
||||
|
||||
def _wait_state(self, state):
|
||||
if isinstance(state, types.ListType):
|
||||
states = state
|
||||
else:
|
||||
states = [state]
|
||||
|
||||
while True:
|
||||
try:
|
||||
status = self._heat_client.stacks.get(
|
||||
stack_id=self._stack).stack_status
|
||||
except heatclient.exc.HTTPNotFound:
|
||||
status = ''
|
||||
|
||||
if 'IN_PROGRESS' in status:
|
||||
eventlet.sleep(1)
|
||||
continue
|
||||
if status not in states:
|
||||
raise EnvironmentError()
|
||||
return
|
@ -1,28 +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.
|
||||
|
||||
|
||||
class CommandBase(object):
|
||||
def execute(self, **kwargs):
|
||||
pass
|
||||
|
||||
def execute_pending(self):
|
||||
return False
|
||||
|
||||
def has_pending_commands(self):
|
||||
return False
|
||||
|
||||
def close(self):
|
||||
pass
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user