# -*- coding: utf-8 -*-

################################################################################
# emcli Jython script zum Entsperren des DBSNMP Accounts fuer alle             #
# Datenbanken, die in EM bekannt sind.                                         #
# Setzt auch ein neues Passwort fuer den DBSNMP Account                        #
#                                                                              #
# Autor: Ralf Durben                                                           #
# Datum: 15.12.2016                                                            #
# Aenderungen:                                                                 #
################################################################################


## Notwendiger Import von Klassen
import sys
from emcli import *
import re
from xml.etree import ElementTree as ET
import os.path
import string
import cStringIO
import random
import socket
import oracle.sysman.emSDK.emCLI.Password as Password
import java.lang.String as String

## Prozedur zum Erzeugen eines Zufallsstrings
def getrstr(self, length):
    seq = string.letters + string.digits
    return ''.join(random.choice(seq) for _ in xrange(length))

## Prozedur zum Lesen von Daten (Sichtbar)
def get_normal_input(msg, default):
    v_input = raw_input(msg)

    if default != "" and v_input == "":
        v_input = default

    if v_input == "":
       print("Geben Sie einen nichtleeren Wert ein: ")
       v_input = get_normal_input(msg, default)

    return v_input

## Prozedur zum Lesen von Daten (mit Sternen maskiert für Passwoerter)
def get_password(msg):
 while(True):
   read = Password.readPassword(msg)
   password = String(read.getPassword())
   if str(password) == "":
      print("Geben Sie einen nichtleeren Wert ein: ")
   else:
      return str(password)

## Prozedur zum Ausführen von EMCLI Kommandos mit ordentlicher Ausgabe von Fehlermeldungen
def exec_emcli(commandstring):
 try:
  exec "ret = " + commandstring
  print ('Successfull')
 except emcli.exception.VerbExecutionError, e:
  print (str(e))

## Prozedur zum Anmelden an den OMS
def login_to_em():
 set_client_property('EMCLI_OMS_URL','https://sccloud049.de.oracle.com:7802/em')
 set_client_property('EMCLI_TRUSTALL','TRUE')
 set_client_property('EMCLI_OUTPUT_TYPE','JSON')
 omsusername = get_normal_input("\nOMS Login, Benutzername:[sysman] ","sysman")
 omspassword = get_password("OMS Login, Passwort    : ")
 try:
  ret = login(username=omsusername, password=omspassword)
  print("Logged in")
  return True
 except emcli.exception.VerbExecutionError, e:
  print (str(e))
  return False

## Prozedur zum Neusetzen des Passworts von DBSNMP
def set_pwd_dbsnmp (p_dbname, p_emdtyp):
 emdtyp = p_emdtyp
 dbname = p_dbname
 print("\n--------------------------------------------------------------")
 print("\n Arbeite fuer Datenbank " + dbname)
 print("\n--------------------------------------------------------------")
 pwdlen = 15
 temppwd = "A"+getrstr(pwdlen,pwdlen)
 newpwd = getrstr(pwdlen,pwdlen)

 command =  'execute_sql (sql="alter user dbsnmp identified by ' + temppwd + ' account unlock;" ,targets="' + dbname + ':' + emdtyp + '")'
 print ("\n " + command)
 exec_emcli (command)
 print ("\n Temp PWD gesetzt")

 command = 'set_monitoring_credential (target_name="' + dbname + '",target_type="' + emdtyp + '",set_name="DBCredsMonitoring",cred_type="DBCreds",attributes="DBUserName:dbsnmp;DBPassword:' + newpwd + ';DBRole:normal")'
 print ("\n " + command)
 exec_emcli (command)
 print ("\n MonCred  gesetzt")

 command = 'update_db_password (target_name="' + dbname + '",user_name="dbsnmp",change_all_references="yes",change_at_target="yes",old_password="' + temppwd + '",new_password="' + newpwd + '",retype_new_password="' + newpwd +'")'
 print ("\n " + command)
 exec_emcli (command)
 print ("\n New  PWD gesetzt")

 command =  'execute_sql (sql="alter user dbsnmp  account unlock;" ,targets="' + dbname + ':' + emdtyp + '")'
 print ("\n " + command)
 exec_emcli (command)
 print ("\n DBSNMP UNLOCK")

 return dbname



###############################
# An OMS anmelden             #
###############################
while (login_to_em() == False):
  donothing=1

###########################################
# Fuer alle Datenbanken                   #
###########################################

## Entsperren und Neusetzen fuer Targets vom Typ oracle_database
tlist = get_targets(targets="oracle_database")
for tlist in tlist.out()['data']:
     print(tlist['Target Name'] + "   " + tlist['Target Type'] +"   " + tlist['Status'])
     if tlist['Status'] == "Up":
        ret = set_pwd_dbsnmp (tlist['Target Name'],tlist['Target Type'])
     elif tlist['Status'] == "Down":
        print("\n--------------------------------------------------------------")
        print("\n " + tlist['Target Name'] + " ist nicht aufrufbar, versuche es trotzdem")
        print("\n--------------------------------------------------------------")
        ret = set_pwd_dbsnmp (tlist['Target Name'],tlist['Target Type'])
     elif tlist['Status'] == "Agent unreachable":
        print("\n--------------------------------------------------------------")
        print("\n " + tlist['Target Name'] + ": Agent ist nicht erreichbar, ueberspringe Target")
        print("\n--------------------------------------------------------------")
     else:
        donothing = 1


## Entsperren und Neusetzen fuer Targets vom Typ rac_database
tlist = get_targets(targets="rac_database")
for tlist in tlist.out()['data']:
     print(tlist['Target Name'] + "   " + tlist['Target Type'] +"   " + tlist['Status'])
     if tlist['Status'] == "Up":
        ret = set_pwd_dbsnmp (tlist['Target Name'],tlist['Target Type'])
     elif tlist['Status'] == "Down":
        print("\n--------------------------------------------------------------")
        print("\n " + tlist['Target Name'] + " ist nicht aufrufbar, versuche es trotzdem")
        print("\n--------------------------------------------------------------")
        ret = set_pwd_dbsnmp (tlist['Target Name'],tlist['Target Type'])
     elif tlist['Status'] == "Agent Unreachable":
        print("\n--------------------------------------------------------------")
        print("\n " + tlist['Target Name'] + ": Agent ist nicht erreichbar, ueberspringe Target")
        print("\n--------------------------------------------------------------")
     else:
        donothing = 1


