martes, 9 de julio de 2013

Resincronizar todos los snapmirrors rotos (DR Test II) con PowerShell

Esta es la segunda parte del test de DR. Una vez parados todos los snapmirror para hacer las pruebas de contingencia, hay que arrancar todas las relaciones paradas. En este script lo que se hace es:

1.- Para los servicios CIFS. Muchas veces el resync falla porque hay ficheros abiertos en los volúmenes.
2.- Busca los snapmirror que no se encuentren en la lista negra (te pueden interesar excepciones)
3.- Verifica que está en estado 'broken-off' e ignora el resto.
4.- Resyncroniza las relaciones de snapmirror que cumplen las condiciones.
5.- Arranca nuevamente los servicio CIFS.

¡OJO! si el filer de destino tiene algún volumen en producción, al parar CIFS se pueden ver afectado los ficheros abiertos que no tienen nada que ver con el test de DR. Hay que tener esto en cuenta antes de ejecutarlo en un entorno de trabajo.

# Inicio del script

$allNetAPP = @("NetappDR01", "NetappDR02" ) # <--- controladores_de_dominio_o_direccion_IP
@("vol0", "vol_test") # <--- excluidos_del_script
########################################################################################################################
$password = "76492d1116743f0423413b16050a5345MgB8AGgAbwA2AEwAWgBBAGIAcABQADEALwAyADYAbABuAEgAOQBGADYAcwBqAFEAPQA9AHwAOQBmADUANwAyADkAOABmAGEANgA5AGYAZAA1ADcANAA5ADkANQAzADEAMABkAGYANwA0AGEAYwBkADIAMAA5AGUAYQA2ADMANgBiAGYAYwA0AGIANwA0ADkAZAA3ADgANgA4AGUAZABiADIAYwBhADAAZgBiAGEAMwA5AGMAZQA="
$key = "155 43 100 117 110 219 64 220 246 113 218 12 7 233 143 111 25 241 206 16 209 132 60 235 108 215 245 140 103 215 23 210"
$passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" "))
$cred = New-Object system.Management.Automation.PSCredential("root", $passwordSecure)
########################################################################################################################

Import-module DataONTAP

Write-Host "#########################################################################"
Write-Host "#########################################################################"
Write-Host "## ##"
Write-Host "## Este proceso va a resincronizar los snapmirrors rotos. ##"
Write-Host "## ##"
Write-Host "## Pulsar + C para abortar el script ##"
Write-Host "## ##"
Write-Host "#########################################################################"
Write-Host "#########################################################################"


foreach ($thisNetAPP in $allNetAPP)

{
Connect-NaController $thisNetAPP -Credential $cred |Out-null
$AllSnapMirrors = Get-NaSnapMirror


#Parando los servicios CIFS antes de resincronizar
Write-Host "Parando CIFS ......."
Invoke-NaSsh -Name $thisNetapp -Command 'cifs terminate -t 0' -Credential $Cred
Write-Host "Netapp: CIFS parado en: " $thisNetapp


foreach ($ThisSnapMirror in $AllSnapMirrors)
{
$Destination = $ThisSnapMirror.destination.split(":")
$State = $ThisSnapMirror.state
#$DestinationFiler = $Destination[0]
$DestinationVolName = $Destination[1]
#Si el volumen no está en la lista negra entonces...
if (($volUnused -NotContains $DetinationVolName) -and ($State -eq "broken-off"))
{
Write-Host "Estado actual ....... " $State
Write-Host "Resincronizando .... " $DestinationVolName
Invoke-NaSnapmirrorResync $DestinationVolName -Confirm:$false
Start-Sleep -s 1
}
}
}

Invoke-NaSsh -Name $thisNetapp -Command 'cifs restart' -Credential $Cred
Write-Host "Netapp: CIFS arrancado en : " $thisNetapp


Write-Host "#####################################################"
Write-Host "## ##"
Write-Host "## Los snapmirrors ya se han resincronizado ##"
Write-Host "## ##"
Write-Host "#####################################################"

$SnapMirror = Get-NaSnapmirror
$SnapMirror | format-table |Out-Default

Start-Sleep -s 10

#Fin del script

Parar todos los snapmirrors en destino (DR test) con PowerShell

Este scritp lo utilizo para parar todos los snapmirror de destino y ponerlos en modo lectura/escritura en las pruebas de desastre. Básicamente lo que hace es un listado de los volúmenes que tienen relación de snapmirror creada y esta información la utiliza para ponerlos todos primero en 'quiesce' y luego hacer el 'break'. Se pueden añadir los volúmenes que no queramos romper en una variable de cadena (muy práctico en los primeros tests). Sé que se puede mejorar y se admiten sugerencias y modificaciones.
Observaréis que he puesto contraseña ofuscada con el script que publiqué recientemente. Espero que lo encontréis práctico. Para generar vuestro própio script de contraseña ofuscada os tocará leer el post anterios ;-)

#Inicio del script

$allNetAPP = @("NetappDR01", "NetappDR02" ) # <--- br="" controlador="" del="" el="" introducir="" ip="" nombre="" o=""> $volUnused = @("vol0", "vol_test") # <--- br="" cortar="" los="" menes="" no="" poner="" que="" queramos="" vol=""> ########################################################################################################################
$password = "76492d1116743f0423413b16050a5345MgB8AGgAbwA2AEwAWgBBAGIAcABQADEALwAyADYAbABuAEgAOQBGADYAcwBqAFEAPQA9AHwAOQBmADUANwAyADkAOABmAGEANgA5AGYAZAA1ADcANAA5ADkANQAzADEAMABkAGYANwA0AGEAYwBkADIAMAA5AGUAYQA2ADMANgBiAGYAYwA0AGIANwA0ADkAZAA3ADgANgA4AGUAZABiADIAYwBhADAAZgBiAGEAMwA5AGMAZQA="
$key = "155 43 100 117 110 219 64 220 246 113 218 12 7 233 143 111 25 241 206 16 209 132 60 235 108 215 245 140 103 215 23 210"
$passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" "))
$cred = New-Object system.Management.Automation.PSCredential("root", $passwordSecure)
########################################################################################################################
Import-module DataONTAP

Write-Host "#########################################################################"
Write-Host "#########################################################################"
Write-Host "##                                                                                                                   ##"
Write-Host "## Este proceso va a parar todas las relaciones de los SnapMirrors ##"
Write-Host "##                                                                                                                  ##"
Write-Host "## Pulsa + C para abortar la ejecución ##"
Write-Host "##                                                                                                                  ##"
Write-Host "#########################################################################"
Write-Host "#########################################################################"
Start-Sleep -s 10

foreach ($thisNetAPP in $allNetAPP)

{
Connect-NaController $thisNetAPP -Credential $cred |Out-null
$AllSnapMirrors = Get-NaSnapMirror

foreach ($ThisSnapMirror in $AllSnapMirrors)
{
$Destination = $ThisSnapMirror.destination.split(":")
$DestinationVolName = $Destination[1]
# Si el volumen no está en la lista negra...
if ($volUnused -NotContains $DetinationVolName)
{
Write-Host "Stopping .... " $DestinationVolName
Invoke-NaSnapmirrorQuiesce $DestinationVolName -Confirm:$false
Invoke-NaSnapmirrorBreak $DestinationVolName -Confirm:$false
Start-Sleep -s 1
}
}
}

Write-Host "###################################################"
Write-Host "## ##"
Write-Host "## Todos los SnapMirrors se han parado ##"
Write-Host "## ##"
Write-Host "###################################################"

$SnapMirror = Get-NaSnapmirror
$SnapMirror | format-table |Out-Default

Start-Sleep -s 20

#Final del script

Crear credenciales ofuscadas en un script de PowerShell

Hola,

Esto se puede considerar una segunda parte del script anterior. En este caso se van a generar unas credenciales ofuscadas, o lo que es lo mismo, unas credenciales ilegibles, pero que si controlas un poco se podría revertir el proceso para revelar el contenido (yo no soy capaz). Es muy práctico si tienes que dejar scripts para que lo ejecuten otros y no quieres que puedan editar el código y ver las credenciales en texto plano. Por ejemplo, para que un departamento de helpdesk pueda ver cierta información que le dejemos disponible en el powershell, pero que no queremos que conozcan las credenciales del usuario con derechos de admin.

Vamos al lío. El script lleva dos partes. La primera genera el código que debemos pegar en en el script y la segunda es un ejemplo que he creado con unas contraseña super segura para ver si alguien es capaz de sacarla

GENERAR EL CÓDIGO
------------------------
Al ejecutar el script te preguntará el usuario y la contraseña. Al introducirlos te genera un fichero llamado OFUSCADO.PS1 y te abre el ISE con el código para hacer directamente el copy/paste sobre el script.

# Ubicación donde se guardará el fichero con los datos ofuscados
$path = 'c:\temp\Ofuscado.ps1'
New-Item -ItemType File $path -Force -ErrorAction SilentlyContinue
$user = Read-Host 'Escribe el nombre de usuario'
$pwd = Read-Host 'Escribe la contraseña' -AsSecureString
$key = 1..32 | ForEach-Object { Get-Random -Maximum 256 }
$pwdencrypted = $pwd | ConvertFrom-SecureString -Key $key

$private:ofs = ' ' ('$password = "{0}"' -f $pwdencrypted) | Out-File $path
('$key = "{0}"' -f "$key") | Out-File $path -Append

'$passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" "))' |
Out-File $path -Append
('$cred = New-Object system.Management.Automation.PSCredential("{0}", $passwordSecure)' -f $user) |
Out-File $path -Append
'$cred' | Out-File $path -Append

ise $path

EJEMPLO DE CÓDIGO -------------------------
En este ejemplo simplemente se conecta a un Filer. Es simplemente para ver dónde se podría pegar el código generado anteriormente y qué aspecto tendría.

$Controller="MiFiler001.lab.local"
########################################################################################################################
$password = "76492d1116743f0423413b16050a5345MgB8AEwAKwA4AGwATQBXAC8AOQBZAGEAYwBjAG4AZgBJAGsATwB0AGYAOQBFAFEAPQA9AHwAZAA5AGQANwA4ADQAZAAzADQAYgA3AGUANwA4AGMANQA5ADAAZQA3AGYAMQBhADkAZgBmADUAZgA1AGQAOABmAGMAMQBkADEAYQAwAGMANAA0ADYAMQBmADAAYgAyADkAZABmADkANgBkAGMAZABmAGEANQA2AGUAOQA3ADIAYQA=" $key = "105 145 37 32 163 64 245 82 109 74 48 173 214 181 126 204 158 112 230 15 57 124 104 138 207 57 162 140 7 171 186 223" $passwordSecure = ConvertTo-SecureString -String $password -Key ([Byte[]]$key.Split(" ")) $cred = New-Object system.Management.Automation.PSCredential("root", $passwordSecure) ########################################################################################################################
Import-module DataONTAP
Connect-NaController $Controller -Credential $cred | Out-Null

En el ejemplo se puede ver que la contraseña es completamente ilegible y que el usuario que he empleado para generarlo ha sido 'root'. Por cierto, si alguien consigue descubrir la contraseña que escriba un post indicando los pasos seguidos para conseguirlo. Como pista os diré que es una palabra anglosajona que significa 'contraseña', seguida de un número binario de una sola cifra y que no es '0'

Crear credenciales encriptada en un fichero con PowerShell

Hola,

Hoy voy a empezar a publicar los scripts basados en PowerShell para Netapp, que también publico en Netapperos.com, web dedicada a los locos de Netapp. 

Lo primero aclarar que no es lo mismo una credencial ofuscada que una credencial encriptada. Si se quieren ejecutar los scripts siempre con la misma máquina y siempre con el mismo usuario, la forma más segura es almacenar las credenciales en un fichero encriptado. Si se va a ejecutar el script desde varias máquinas y con varios usuarios, la única forma que se me ocurre es ofuscar las credenciales, o lo que es lo mismo, darles un aspecto de encriptado, pero en realidad se podría revertir y llegar a sacar la información. Este último caso lo veremos en otro post.

Este es el caso primero, el de crear un fichero de texto encriptado para guardar las credenciales y que éstas sean seguras. Es un proceso muy sencillo, pero tiene como limitación que utiliza nuestros IDs para hacer la encriptación de la contraseña. Es decir, que si lo utiliza otra persona le pedirá introducir las credenciales.

CREAR EL FICHERO DE TEXTO
-------------------------------------
Este script va a mostar una pantalla de login, donde meteremos las credenciales que queremos utilizar y automáticamente nos generará un fichero llamado CRED.TXT, donde las almacena de forma encriptada. Para que funcione es tan simple como copiar estas dos líneas de código en un nuevo PS1 y ejecutarlo.
$Credential = Get-Credential
$credential.Password | ConvertFrom-SecureString | Set-Content CRED.TXT

ASOCIAR EL FICHERO A UN SCRIPT
-------------------------------------------
Este trozo de script se pegará en nuestro PS1 para 'rescatar' las credenciales que tenemos encriptadas en CRED.TXT. Hay que fijarse que es necesario incluir el usuario asociado a las credenciales. En nuestro caso he utilizado 'root'. En fichero CRED.TXT se encuentra en el mismo path que el script, pero se podría centralizar y apuntar hacia esa ruta.
$password = Get-Content CRED.TXT | ConvertTo-SecureString
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "root",$password

Espero que os sea útil. Es una forma de poder ejecutar scritps sin tener que recordar las credenciales o tener que incluirlas en texto plano dentro del código.
Un saludo,

martes, 26 de febrero de 2013

IE 10 para Windows 7

Pues sí, finalmente Microsoft se ha dado cuenta de que empezaban a tener éxito los proyectos de portar IE 10 para Windows 7 y ha decidido liberar la versión de su último navegador. También parece un poco estratégico ante el aumento de la competecia. Sea como fuere, se puede descargar desde:

http://windows.microsoft.com/es-ES/internet-explorer/download-ie

Si lo que buscas es la versión en Inglés americano puede ir a:

http://windows.microsoft.com/en-US/internet-explorer/download-ie

Por supuesto yo ya lo tengo instalado y lo estoy utilizando para escribir estas líneas. De momento no tengo nada que comentar. No he tenido tiempo de disfrutarlo o sufrirlo ;-)

Un saludo,

Añadir aplicaciones a "Enviar a" en Win7/8


Hoy he tenido un problema con algo que parece muy sencillo, pero que me ha costado un rato encontrar. ¿Cómo meter más aplicaciones al menú "Enviar a" en Windows 7?. En el pasado lo he utilizado mucho, pero hacía tiempo que no lo necesitaba y lo tenía olvidado. La teoría es sencilla, simplemente hay que dejar el acceso directo de la aplicación en la carpeta "SenTo". El problema es encontrarla de forma sencilla.

Bueno esta es la solución. Bien desde la ventana de búsqueda de Windows, bien con con 'Ejecutar', ponemos:

Shell:sendto

Estas son las capturas:

1.- ejecutamos 


2.- Añadimos el acceso directo.



Es sencillo, ¿no?. Bueno, espero que os sirva igual que me está sirviendo a mi ;-)


viernes, 1 de febrero de 2013

Actualizar LG Optimus 7 (E900) a WP 7.8

Bueno, como prometió Microsoft, ayer sacó la tan esperada versión de Windows Phone 7.8 para los teléfonos de última generación. La pena es que no nos deje pasar a WP8, pero algo es algo.

Como era de esperar, LG no ha dado muestras de querer actualizar el teléfono. De hecho nunca he recibido actualización alguna por parte del fabricante y he tenido que ir saltando de versión de forma 'manual', utilizando un bug de Zune. Este mismo procedimiento me ha servido para poder actualizar el teléfono a la última versión del nuevo sistema operativo.

PROCEDIMIENTO:

1.- Se desconecta la Wifi y los datos del teléfono.
2.- Se conecta al ordenador y se sincroniza con Zune
3.- En Zune se pulsa en el icono inferior izquierdo, el del dibudo del terminal.
4.- En la zona del telefono, en la parte superior aparece el link a Configuración /Setting. Pulsamos.
5.- Se habre una ventana y pulsamos en Actualizar/Update que se encuentra a la izquierda.
6.- Saldrá un mensaje de buscando actualizaciones/Checking for updates....
7.- A los 3 o 4 segundos de que aparezca el mensaje de arriba se tiene que quitar la conexión a Internet del PC. Como yo utilizo mi portátil solo tengo que tocar el switch del WiFi, pero en otros casos dependerá del tipo de conexión que tengáis.

Repetir los pasos 5 a 7 tantas veces como haga falta hasta que salga que se tiene una actualización disponible. Actualizas y listo!!!!

Al principio cuesta un poco, pero probando al final sale. A lo mejor en lugar de esperar 3 o 4 segundos antes de cortar Internet hay que darle más o menos tiempo.

¡¡¡ IMPORTANTE !!! Si tenéis activado el modo de desarrollo en el teléfono, os lo va a desactivar. A diferencia de WP 7.5, si abres una aplicación 'no autorizada' no va a preguntarte nada y la desinstala automáticamente. No hay problema, podéis ver en este mismo blog los pasos para activarla y funcina sin problema en WP7.8 ;-)

Espero que los que poseen este buen terminal puedan (podamos) seguir disfrutando de él.

NOTA: Haz tantas actualizaciones como te pida y sigue los pasos. No hace mucho que lo actualicé y me costó meter 3 actualizaciones antes de presentarme la versión 7.18.8858.136 , que en realidad es WP7.8 y así lo muestra el teléfono.