Use Python Script to Create New SecureCRT Sessions from Data File

Problem description

Every time I configure a network in my virtual environment I have to manually:

  • create a special folder for the project
  • create each session (copy-paste)
  • rename each session
  • setup the logon actions on session properties

Solution

On SecureCRT website, I have found a useful article named Importing SecureCRT® Sessions from a Data File. This script creates simple sessions. It also gives me the possibility to define a logon script for each session. Therefore, I will create a script that takes the session name and use it as variable to introduce my first cli commands:

root@MX% cli
root@MX> set cli logical-system SessionName
Logical system: SessionName

root@MX:SessionName> 

Next, I will take as an example the network created to Carrier-of-carriers setup created in a recent post.

My Carrier-of-carriers.csv file:

session_name,hostname,protocol,username,folder,emulation,logon_script
21-CE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
31-CE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
11-PE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
12-P,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
13-ASBR,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
14-ASBR,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
15-P,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
16-PE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
22-CE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
32-CE,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,/Users/silvia/Dropbox/Scripting/For SecureCRT/LogicalSystemsLogonScript.py
vMX-mng,192.168.83.11,SSH2,root,Local Labs/Interpovider L3VPN,XTerm,

The modified Python script ImportArbitraryDataFromFileToSecureCRTSessions-Silvia-v1.0.py:

# $language = "Python"
# $interface = "1.0"

# ImportArbitraryDataFromFileToSecureCRTSessions.py
#   (Designed for use with SecureCRT 7.2 and later)
#
#   Last Modified: 23 Feb, 2018
#      - Blurb about sessions that were created during the import was
#        missing from the results log
#     - If running on Windows, and unable to write to results log, make
#       sure clipboard data containing the results log info is formatted
#       with \r\n instead of just \n so that it's legible in Notepad, for
#       example, when pasted.
#
#   Last Modified: 21 Dec, 2017
#      - Allow multiple 'description' fields on the same line. All will be
#        compounded together with each one ending up on a separate line in
#        the Session's Description session option.
#      - Allow 'username' field to be defaulted in the header line
#      - Duplicate sessions are now imported with unique time-stamped
#        names (for each additional duplicate). Earlier versions of this
#        script would overwrite the first duplicate with any subsequent
#        duplicates that were found in the data file.
#      - Allow header fields to be case-insentive so that "Description"
#        and "HostName", etc. work just as well as "description" and "hostname"
#
#   Last Modified: 18 Dec, 2017
#      - Remove unused (commented out) code block left in from the
#        20 Apr, 2017 changes.
#      - Fix required header line message to no longer reference
#        'protocol' field as required.
#      - Add fallback locations where the script will attempt to
#        write summary log of script's activities/errors/warnings.
#        This attempts to facilitate running this script in environments
#        where SecureCRT may not have access to a "Documents" folder
#        (such as when SecureCRT is being launched through VDI publishing).
#         --> First try Documents,
#         --> Then try Desktop,
#         --> Then try SecureCRT's config folder.
#         --> If none of the above are accessible for writing, the
#             script will copy the summary report to the clipboard,
#             providing the user with a way to see the summary report
#             if pasted into a text editor.
#      - Added support for defaulting the "folder" header so that all
#        new entries could be imported into a folder w/o having to
#        specify the folder on each line. Example header line for
#        CSV file with only hostname data would be:
#            hostname,folder=default_import_folder_name
#
#   Last Modified: 17 Nov, 2017
#      - No longer attempt to use platform to determine OS ver info,
#        as it's no longer needed.
#
#   Last Modified: 20 Apr, 2017
#      - No longer require protocol in header. Use the Default session's
#        protocol if the protocol field is not present in the header line.
#      - Conform to python join() method requiring only one argument.
#      - Prompt for delimiter character if it isn't found in the header line.
#      - Allow delimiter character to be NONE, so that a single field (hostname)
#        and corresponding data can be used to import sessions (say for example
#        if you have a file that just contains hostnames, one per line).
#      - [Bug Fix]: can't use + to concatenate str and int, so use format()
#        instead.
#      - [Bug Fix]: "Procotol" typo fixed to "Protocol" in error case where
#        protocol header field not found/set.
#
#   Last Modified: 04 Jan, 2017
#      - Added support for specifying logon script file to be set for
#        imported sessions.
#
#   Last Modified: 02 Jul, 2015
#      - Display status bar info for each line we're processing so that if
#        there's an error, the individual running the script might have
#        better information about why the error might have occurred.
#      - Handle cases where a line in the data file might have more fields
#        in it than the number of header fields designated for import. This
#        fixes an error reported by forum user wixxyl here:
#           https://forums.vandyke.com/showthread.php?t=12021
#        If a line has too many fields, create a warning to be displayed
#        later on, and move on to the next line -- skipping the current line
#        because it's unknown whether the data is even valid for import.
#
#   Last Modified: 20 Jan, 2015
#      - Combined TAPI protocol handling (which is no longer
#        supported for mass import) with Serial protocol
#        import errors.
#      - Enhanced example .csv file data to show subfolder specification.
#
#   Last Modified: 21 Mar, 2012
#      - Initial version for public forums
#
# DESCRIPTION
# This sample script is designed to create sessions from a text file (.csv
# format by default, but this can be edited to fit the format you have).
#
# To launch this script, map a button on the button bar to run this script:
#    http://www.vandyke.com/support/tips/buttonbar.html
#
# The first line of your data file should contain a comma-separated (or whatever
# you define as the g_strDelimiter below) list of supported "fields" designated
# by the following keywords:
# -----------------------------------------------------------------------------
# session_name: The name that should be used for the session. If this field
#               does not exist, the hostname field is used as the session_name.
#       folder: Relative path for session as displayed in the Connect dialog.
#     hostname: The hostname or IP for the remote server.
#     protocol: The protocol (SSH2, SSH1, telnet, rlogin)
#         port: The port on which remote server is listening
#     username: The username for the account on the remote server
#    emulation: The emulation (vt100, xterm, etc.)
#  description: The comment/description. Multiple lines are separated with '\r'
# logon_script: The full path to the Logon Script filename for the session.
# =============================================================================
#
#
# As mentioned above, the first line of the data file instructs this script as
# to the format of the fields in your data file and their meaning.  It is not a
# requirement that all the options be used. For example, notice the first line
# of the following file only uses the "hostname", "username", and "protocol"
# fields.  Note also that the "protocol" field can be defaulted so that if a
# protocol field is empty it will use the default value.
# -----------------------------------------------------------------------------
#   hostname,username,folder,protocol=SSH2
#   192.168.0.1,root,_imported,SSH1
#   192.168.0.2,admin,_imported,SSH2
#   192.168.0.3,root,_imported/folderA,
#   192.168.0.4,root,,
#   192.168.0.5,admin,_imported/folderB,telnet
#   ... and so on
# =============================================================================

import datetime
import os
import platform
import re
import shutil
import sys
import time
import subprocess

MsgBox = crt.Dialog.MessageBox
# The g_strDefaultProtocol variable will only be defined within the
# ValidateFieldDesignations function if the protocol field has a default value
# (e.g., protocol=SSH2), as read in from the first line of the data file.
global g_strDefaultProtocol
g_strDefaultProtocol = ""

# The g_strDefaultFolder variable will only be defined within the
# ValidateFieldDesignations function if the folder field has a default value
# (e.g., folder=Site34), as read in from the first line of the data file.
global g_strDefaultFolder
g_strDefaultFolder = ""

# The g_strDefaultUsername variable will only be defined within the
# ValidateFieldDesignations function if the protocol field has a default value
# (e.g., username=bobofet), as read in from the first line of the data file.
global g_strDefaultUsername
g_strDefaultUsername = ""

# If your data file uses spaces or a character other than comma as the
# delimiter, you would also need to edit the g_strDelimiter value a few lines
# below to indicate that fields are separated by spaces, rather than by commas.
# For example:
#       g_strDelimiter = " "
# Using a ";" might be a good alternative for a file that includes the comma
# character as part of any legitimate session name or folder name, etc.
global g_strDelimiter
g_strDelimiter = ","      # comma
#g_strDelimiter = " "    # space
#g_strDelimiter = ";"    # semi-colon
#g_strDelimiter = chr(9) # tab
#g_strDelimiter = "|||"  # a more unique example of a delimiter.


# The g_strSupportedFields indicates which of all the possible fields, are
# supported in this example script.  If a field designation is found in a data
# file that is not listed in this variable, it will not be imported into the
# session configuration.
global g_strSupportedFields
g_strSupportedFields = \
    "description,emulation,folder,hostname,port,protocol,session_name,username,logon_script"

# If you wish to overwrite existing sessions, set the
# g_bOverwriteExistingSessions to True; for this example script, we're playing
# it safe and leaving any existing sessions in place :).
global g_bOverwriteExistingSessions
g_bOverwriteExistingSessions = False

strHome = os.path.expanduser("~")
global g_strMyDocs
g_strMyDocs = strHome + "/Documents"

g_strMyDesktop = strHome + "/Desktop"

global g_strHostsFile
g_strHostsFile = g_strMyDocs + "/MyDataFile.csv"

global g_strExampleHostsFile
g_strExampleHostsFile = \
    "\thostname,protocol,username,folder,emulation\n" + \
    "\t192.168.0.1,SSH2,root,Linux Machines,XTerm\n" + \
    "\t192.168.0.2,SSH2,root,Linux Machines,XTerm\n" + \
    "\t...\n" + \
    "\t10.0.100.1,SSH1,admin,CISCO Routers,VT100\n" + \
    "\t10.0.101.1,SSH1,admin,CISCO Routers,VT100\n" + \
    "\t...\n" + \
    "\tmyhost.domain.com,SSH2,administrator,Windows Servers,VShell\n" + \
    "\t...\n"

g_strExampleHostsFile = g_strExampleHostsFile.replace(",", g_strDelimiter)

global g_strConfigFolder, strFieldDesignations, g_strFieldsArray, vSessionInfo

global strSessionName, strHostName, strPort
global strUserName, strProtocol, strEmulation
global strPathForSessions, strLine, nFieldIndex
global strSessionFileName, strFolder, nDescriptionLineCount, strDescription

global g_strLastError, g_strErrors, g_strSessionsCreated
global g_nSessionsCreated, g_nDataLines
g_strLastError = ""
g_strErrors = ""
g_strSessionsCreated = ""
g_nSessionsCreated = 0
g_nDataLines = 0

# Use current date/time info to avoid overwriting existing sessions by
# importing sessions into a new folder named with a unique timestamp.
g_strDateTimeTag = datetime.datetime.now().strftime("%Y%m%d_%H%M%S.%f")[:19]

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def GetConfigPath():
    objConfig = crt.OpenSessionConfiguration("Default")
    # Try and get at where the configuration folder is located. To achieve
    # this goal, we'll use one of SecureCRT's cross-platform path
    # directives that means "THE path this instance of SecureCRT
    # is using to load/save its configuration": ${VDS_CONFIG_PATH}.

    # First, let's use a session setting that we know will do the
    # translation between the cross-platform moniker ${VDS_CONFIG_PATH}
    # and the actual value... say, "Upload Directory V2"
    strOptionName = "Upload Directory V2"

    # Stash the original value, so we can restore it later...
    strOrigValue = objConfig.GetOption(strOptionName)

    # Now set the value to our moniker...
    objConfig.SetOption(strOptionName, "${VDS_CONFIG_PATH}")
    # Make the change, so that the above templated name will get written
    # to the config...
    objConfig.Save()

    # Now, load a fresh copy of the config, and pull the option... so
    # that SecureCRT will convert from the template path value to the
    # actual path value:
    objConfig = crt.OpenSessionConfiguration("Default")
    strConfigPath = objConfig.GetOption(strOptionName)

    # Now, let's restore the setting to its original value
    objConfig.SetOption(strOptionName, strOrigValue)
    objConfig.Save()

    # Now return the config path
    return strConfigPath

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def ValidateFieldDesignations(strFields):
    global g_strDelimiter, g_strExampleHostsFile, g_strDefaultProtocol
    global g_strFieldsArray, g_strDefaultFolder, g_strDefaultUsername
    if strFields.find(g_strDelimiter) == -1:
        if len(g_strDelimiter) > 1:
            strDelimiterDisplay = g_strDelimiter
        else:
            if ord(g_strDelimiter) < 33 or ord(g_strDelimiter) > 126:
                strDelimiterDisplay = "ASCII[{0}]".format(ord(g_strDelimiter))
            else:
                strDelimiterDisplay = g_strDelimiter
        strDelim = crt.Dialog.Prompt(
            "Delimiter character [" + strDelimiterDisplay + "] was not found " +
            "in the header line of your data file.\r\n\r\n" +
            "What is the delimiter (field separator) that your file " +
            "is using?\r\n\r\n\t Enter \"NONE\" if your data file only has a single field.")

        if strDelim == "":
            crt.Dialog.MessageBox("Script cannot continue w/o a field delimiter.")
            return

        if strDelim != "NONE":
            g_strDelimiter = strDelim

    g_strFieldsArray = strFields.split(g_strDelimiter)
    if not "hostname" in [x.lower() for x in g_strFieldsArray]:
        strErrorMsg = "Invalid header line in data file. " + \
            "'hostname' field is required."
        if len(g_strDelimiter) > 1:
            strDelimiterDisplay = g_strDelimiter
        else:
            if ord(g_strDelimiter) < 33 or ord(g_strDelimiter) > 126:
                strDelimiterDisplay = "ASCII[{0}]".format(ord(g_strDelimiter))
            else:
                strDelimiterDisplay = g_strDelimiter

        MsgBox(strErrorMsg + "\n" +
            "The first line of the data file is a header line " +
            "that must include\n" +
            "a '" + strDelimiterDisplay +
            "' separated list of field keywords.\n" +
            "\n" +
            "'hostname' is a required keyword." +
            "\n\n" +
            "The remainder of the lines in the file should follow the " +
            "\n" +
            "pattern established by the header line " +
            "(first line in the file)." + "\n" + "For example:\n" +
            g_strExampleHostsFile,
            "Import Data To SecureCRT Sessions")
        return


    if not "protocol" in [x.lower() for x in g_strFieldsArray]:
        if strFields.lower().find("protocol=") == -1:
            # Load the default configuration and use that as the default
            # protocol.
            objConfig = crt.OpenSessionConfiguration("Default")
            g_strDefaultProtocol = objConfig.GetOption("Protocol Name")

    for strField in g_strFieldsArray:
        #MsgBox("{0}\nHas 'protocol': {1}\nHas '=': {2}".format(strField, strField.find("protocol"), strField.find("=")))
        if strField.lower().find("protocol") > -1 and \
           strField.lower().find("=") > -1:
                g_strDefaultProtocol = strField.split("=")[1].upper()
                #MsgBox(("Found a default protocol spec: {0}".format(g_strDefaultProtocol)))
                # Fix the protocol field since we know the default protocol
                # value
                strFields = strFields.replace(strField, "protocol")
        if strField.lower().find("folder") > -1 and \
            strField.lower().find("=") > -1:
                g_strDefaultFolder = strField.split("=")[1]
                strFields = strFields.replace(strField, "folder")

        if strField.lower().find("username") > -1 and \
            strField.lower().find("=") > -1:
                g_strDefaultUsername = strField.split("=")[1]
                strFields = strFields.replace(strField, "username")


    g_strFieldsArray = strFields.split(g_strDelimiter)
    return True

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def SessionExists(strSessionPath):
    # Returns True if a session specified as value for strSessionPath already
    # exists within the SecureCRT configuration.
    # Returns False otherwise.
    try:
        objTosserConfig = crt.OpenSessionConfiguration(strSessionPath)
        return True
    except Exception as objInst:
        return False


#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def OpenPathInDefaultApp(strFile):
    strPlatform = sys.platform
    crt.Session.SetStatusText("Platform: {0}".format(strPlatform))
    crt.Sleep(200)
    try:
        if sys.platform.startswith('darwin'):
            subprocess.call(('open', strFile))
        elif strPlatform == "win32":
            os.startfile(strFile)
        elif sys.platform.startswith('linux'):
            subprocess.call(('xdg-open', strFile))
        else:
            MsgBox("Unknown operating system:  " + os.name)
    except Exception, objErr:
        MsgBox(
            "Failed to open " + strFile + " with the default app.\n\n"  +
            str(objErr).replace('\\\\', '\\').replace('u\'', '\''))

#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def Import():
    global g_strHostsFile, strFieldDesignations, g_strErrors, g_strDelimiter
    global g_strDefaultProtocol, g_nDataLines, g_strSessionsCreated, g_nSessionsCreated
    global g_strDefaultFolder, g_strDefaultUsername
    g_strHostsFile = crt.Dialog.FileOpenDialog(
        "Please select the host data file to be imported.",
        "Open",
        g_strHostsFile,
        "CSV/Text Files (*.txt;*.csv)|*.txt;*.csv|All files (*.*)|*.*")

    if g_strHostsFile == "":
        return

    nStartTime = time.time()
    bFoundHeader = False
    nLine = 0
    vSessionInfo = []
    # Open our data file for reading
    with open(g_strHostsFile, "r") as objDataFile:
        # Iterate over each of the lines in the file, processing them one by one.
        for strLine in objDataFile:
            strLine = strLine.strip("\r\n")
            nLine += 1
            # if nLine == 1 or (nLine % 10) == 0:
            crt.Session.SetStatusText("Processing line #{0} from import file: {1}".format(nLine, str(strLine)))
            bSaveSession = False
            strSessionPath = ""
            strPort = ""
            strProtocol = ""
            strHostName = ""
            strUserName = ""
            strEmulation = ""
            strFolder = ""
            strDescription = ""
            strLogonScript = ""

            if not bFoundHeader:
                strFieldDesignations = strLine
                # Validate the data file
                if not ValidateFieldDesignations(strFieldDesignations):
                    return
                else:
                    # Get a timer reading so that we can calculate how long it takes to import.
                    nStartTime = time.time()
                    bFoundHeader = True
            else:
                vSessionInfo = strLine.split(g_strDelimiter)
                if len(vSessionInfo) < len(g_strFieldsArray): if strLine.strip() == "": strLine = "[Empty Line]" g_strErrors = ("\n" + "Insufficient data on line #{0:04d}: {1:s}{2:s}".format(nLine, strLine, g_strErrors)) else: # Variable used to determine if a session file should actually be # created, or if there was an unrecoverable error (and the session # should be skipped). bSaveSession = True # Now we will match the items from the new file array to the correct # variable for the session's ini file for nFieldIndex in xrange(0, len(vSessionInfo)): if nFieldIndex >= len(g_strFieldsArray):
                            g_strErrors = ("\n" +
                                "Error: Too many data fields({0:d}) found on line #{1:04d}: {2:s}".format(len(vSessionInfo), nLine, strLine) +
                                "<-- This line should only have these {0:d} fields: {1:s}{2:s}".format(len(g_strFieldsArray), g_strDelimiter.join(g_strFieldsArray), g_strErrors))
                            bSaveSession = False
                            break

                        #MsgBox("nFieldIndex: {0}\nlen(vSessionInfo):{1}\n{2}:{3}".format(nFieldIndex, len(vSessionInfo), g_strFieldsArray[nFieldIndex], vSessionInfo[nFieldIndex]))
                        strFieldLabel = g_strFieldsArray[nFieldIndex].strip().lower()
                        if strFieldLabel == "session_name":
                            strSessionName = vSessionInfo[nFieldIndex].strip()
                            # Check folder name for any invalid characters
                            mSession = re.search(r"[\\\|\/\:\*\?\\\"\<\>]", strSessionName)
                            if mSession:
                                bSaveSession = False
                                g_strErrors = ("\nError: Invalid characters found in SessionName \"{0}\" specified on line #{1:04d}: {2:s}{3:s}".format(
                                    strSessionName, nLine, strLine, g_strErrors))

                        elif strFieldLabel == "logon_script":
                            strLogonScript = vSessionInfo[nFieldIndex].strip()

                        elif strFieldLabel == "port":
                            strPort = vSessionInfo[nFieldIndex].strip()
                            if not strPort == "":
                                if not strPort.isdigit():
                                    bSaveSession = False
                                    g_strErrors = ("\nError: Invalid port \"{0}\" specified on line #{1:04d}: {2:s}{3:s}".format(
                                        strPort, nLine, strLine, g_strErrors))

                        elif strFieldLabel == "protocol":
                            strProtocol = vSessionInfo[nFieldIndex].lower().strip()


                            if strProtocol == "ssh2":
                                strProtocol = "SSH2"
                            elif strProtocol == "ssh1":
                                strProtocol = "SSH1"
                            elif strProtocol == "telnet":
                                strProtocol = "Telnet"
                            elif strProtocol == "serial" or strProtocol == "tapi":
                                bSaveSession = False
                                g_strErrors = ("\n" +
                                    "Error: Unsupported protocol \"" + vSessionInfo[nFieldIndex].strip() +
                                    "\" specified on line #" +
                                    "{0:04d}: {1:s}".format(nLine, strLine) +
                                    g_strErrors)
                            elif strProtocol == "rlogin":
                                strProtocol = "RLogin"
                            else:
                                if g_strDefaultProtocol <> "":
                                    strProtocol = g_strDefaultProtocol
                                else:
                                    bSaveSession = False
                                    g_strErrors = ("\n" +
                                        "Error: Invalid protocol \"" + strProtocol +
                                        "\" specified on line #" +
                                        "{0:04d}: {1:s}".format(nLine, strLine) +
                                        g_strErrors)

                        elif strFieldLabel == "hostname":
                            strHostName = vSessionInfo[nFieldIndex].strip()
                            if strHostName == "":
                                bSaveSession = False
                                g_strErrors = ("\n" +
                                    "Error: Hostname field on line #{0:04d} is empty: {1:s}".format(nLine, strLine) +
                                    g_strErrors)

                        elif strFieldLabel == "username":
                            strUserName = vSessionInfo[nFieldIndex].strip()

                        elif strFieldLabel == "emulation":
                            strEmulation = vSessionInfo[nFieldIndex].lower().strip()
                            if strEmulation == "xterm":
                                strEmulation = "Xterm"
                            elif strEmulation == "vt100":
                                strEmulation = "VT100"
                            elif strEmulation == "vt102":
                                strEmulation = "VT102"
                            elif strEmulation == "vt220":
                                strEmulation = "VT220"
                            elif strEmulation == "ansi":
                                strEmulation = "ANSI"
                            elif strEmulation == "linux":
                                strEmulation = "Linux"
                            elif strEmulation == "scoansi":
                                strEmulation = "SCOANSI"
                            elif strEmulation == "vshell":
                                strEmulation = "VShell"
                            elif strEmulation == "wyse50":
                                strEmulation = "WYSE50"
                            elif strEmulation == "wyse60":
                                strEmulation = "WYSE60"
                            else:
                                bSaveSession = False
                                g_strErrors = ("\n" +
                                    "Error: Invalid emulation \"{0}\" specified on line #{1:04d}: {2:s}{3:s}".format(
                                        strEmulation, nLine, strLine, g_strErrors))

                        elif strFieldLabel == "folder":
                            strFolderOrig = vSessionInfo[nFieldIndex].strip()
                            strFolder = strFolderOrig.lower()
                            if strFolder == "":
                                strFolder = g_strDefaultFolder

                            # Check folder name for any invalid characters
                            # Note that a folder can have subfolder designations,
                            # so '/' is a valid character for the folder (path).
                            mSession = re.search('[\\|\\:\\*\\?\\\\"\\<\\>]', strFolder)
                            if mSession:
                                bSaveSession = False
                                g_strErrors = ("\n" +
                                    "Error: Invalid characters in folder \"{0:s}\" specified on line #{1:04d}: {2:s}{3:s}".format(
                                        strFolder, nLine, strLine, g_strErrors))
                            else:
                                strFolder = strFolderOrig

                        elif strFieldLabel == "description":
                            strCurDescription = vSessionInfo[nFieldIndex].strip()
                            if strDescription == "":
                                strDescription = strCurDescription
                            else:
                                strDescription = "{0}\\r{1}".format(strDescription, strCurDescription)
                                strDescription = strDescription.replace("\\r", "\r")

                        else:
                            # If there is an entry that the script is not set to use
                            # in strFieldDesignations, stop the script and display a
                            # message
                            strMsg1 = "Error: Unknown field designation: {0:s}\n\tSupported fields are as follows:\n\n\t{1:s}\n\nFor a description of the supported fields, see the comments in the sample script file.".format(g_strFieldsArray[nFieldIndex], g_strSupportedFields)

                            if g_strErrors.strip() <> "":
                                strMsg1 = (strMsg1 + "\n\n" +
                                    "Other errors found so far include: " +
                                    g_strErrors)
                            MsgBox(strMsg1, "Import Data To SecureCRT Sessions: Data File Error")
                            return
                    if bSaveSession:
                        # Use hostname if a session_name field wasn't present
                        if strSessionName == "":
                            strSessionName = strHostName

                        # Canonicalize the path to the session, as needed
                        strSessionPath = strSessionName
                        if strFolder.strip() == "":
                            strFolder = g_strDefaultFolder

                        if strFolder != "":
                            strSessionPath = strFolder + "/" + strSessionName

                        if strUserName.strip() == "":
                            strUserName = g_strDefaultUsername

                        # Strip any leading '/' characters from the session path
                        strSessionPath = strSessionPath.strip('/')

                        if SessionExists(strSessionPath):
                            if not g_bOverwriteExistingSessions:
                                # Append a unique tag to the session name, if it already exists
                                strSessionPath = "{0:s}(import_({1:s})".format(strSessionPath, datetime.datetime.now().strftime("%Y%m%d_%H%M%S.%f")[:19])

                        #MsgBox(
                        #    "Line #{0}: {1}\nbSaveSession: {2}\nSessionPath: {3}\n\nPort: {4}\nProtocol: {5}\nHostname: {6}\nUsername: {7}\nEmulation: {8}\nFolder: {9}\nDescription: {10}\n\n{11}".format(
                        #        nLine, strLine, bSaveSession, strSessionPath, strPort, strProtocol, strHostName, strUserName, strEmulation, strFolder, strDescription, g_strErrors))

                        # Now: Create the session.
                        # ===================================================================
                        # Copy the default session settings into new session name and set the
                        # protocol.  Setting protocol protocol is essential since some variables
                        # within a config are only available with certain protocols.  For example,
                        # a telnet configuration will not be allowed to set any port forwarding
                        # settings since port forwarding settings are specific to SSH.
                        objConfig = crt.OpenSessionConfiguration("Default")
                        if strProtocol == "":
                            strProtocol = g_strDefaultProtocol

                        objConfig.SetOption("Protocol Name", strProtocol)

                        # We opened a default session & changed the protocol, now we save the
                        # config to the new session path:
                        objConfig.Save(strSessionPath)

                        # Now, let's open the new session configuration we've saved, and set
                        # up the various parameters that were specified in the file.
                        objConfig = crt.OpenSessionConfiguration(strSessionPath)
                        if objConfig.GetOption("Protocol Name") != strProtocol:
                            MsgBox("Error: Protocol not set. Expected \"{0}\", but got \"{1}\"".format(strProtocol, objConfig.GetOption("Protocol Name")))
                            return

                        if strDescription != "":
                            vDescription = strDescription.split("\r")
                            objConfig.SetOption("Description", vDescription)

                        if strLogonScript != "":
                            objConfig.SetOption("Script Filename V2", strLogonScript)
                            objConfig.SetOption("Use Script File", True)

                        objConfig.SetOption("Emulation", strEmulation)

                        if strProtocol.lower() <> "serial":
                            if strHostName != "":
                                objConfig.SetOption("Hostname", strHostName)

                            if strUserName != "":
                                objConfig.SetOption("Username", strUserName)

                        if strProtocol.upper() == "SSH2":
                            if strPort == "":
                                strPort = 22
                            objConfig.SetOption("[SSH2] Port", int(strPort))
                        elif strProtocol.upper() == "SSH1":
                            if strPort == "":
                                strPort = "22"
                            objConfig.SetOption("[SSH1] Port", int(strPort))
                        elif strProtocol.upper() == "TELNET":
                            if strPort == "":
                                strPort = "23"
                            objConfig.SetOption("Port", int(strPort))


                        # If you would like ANSI Color enabled for all imported sessions (regardless
                        # of value in Default session, remove comment from following line)
                        # ---------------------------------------------------------------------------
                        objConfig.SetOption("ANSI Color", True)

                        # Add other "SetOption" calls desired here...
                        # ---------------------------------------------------------------------------
                        objConfig.SetOption("Auto Reconnect", False)
                        objConfig.SetOption("Color Scheme", "Monochrome")
                        objConfig.SetOption("Color Scheme Overrides Ansi Color", True)
                        objConfig.SetOption("Copy to clipboard as RTF and plain text", True)
                        objConfig.SetOption("Line Send Delay", 15)
                        objConfig.SetOption("Log Filename V2", "${VDS_USER_DATA_PATH}\_ScrtLog(%S)_%Y%M%D_%h%m%s.%t.txt")
                        objConfig.SetOption("Rows", 60)
                        objConfig.SetOption("Cols", 140)
                        objConfig.SetOption("Use Word Delimiter Chars", True)
                        objConfig.SetOption("Word Delimiter Chars", " <>()+=$%!#*")

                        objConfig.Save()

                        if g_strSessionsCreated <> "":
                            g_strSessionsCreated = g_strSessionsCreated + "\n"

                        g_strSessionsCreated = g_strSessionsCreated + "    " + strSessionPath
                        g_nSessionsCreated += 1

            # Reset all variables in preparation for reading in the next line of
            # the hosts info file.
            strEmulation = ""
            strPort = ""
            strHostName = ""
            strFolder = ""
            strUserName = ""
            strSessionName = ""
            strDescription = ""
            nDescriptionLineCount = 0
            g_nDataLines += 1

    nTimeElapsed = time.time() - nStartTime
    strResults = "Import operation completed in %2.3f seconds." % (nTimeElapsed)

    if g_nSessionsCreated > 0:
        strResults = (strResults + "\n" +
            "-" * 70 + "\n" +
            "Number of Sessions created: %d\n" % (g_nSessionsCreated))
        strResults = strResults + "\n" + g_strSessionsCreated
    else:
        strResults = (strResults + "\n" +
            "-" * 70 + "\n" +
            "No sessions were created from %d lines of data." % (g_nDataLines))

    crt.Session.SetStatusText("Import operation completed in {0:2.3f} seconds".format(nTimeElapsed))

    # Log activity information to a file for debugging purposes...
    strFilename = "{0}/__SecureCRT-Session-ImportLog-{1}.txt".format(g_strMyDocs, g_strDateTimeTag)
    if g_strErrors == "":
        strResults = (
            "No errors/warnings encountered from the import operation.\n\n{0:s}".format(strResults))
    else:
        strResults = "Errors/warnings from this operation include:{0}\n{1}\n{2}\n\n".format(
            g_strErrors, "-" * 70, strResults)

    cFilenames = [
        "{0}/__SecureCRT-Session-ImportLog-{1}.txt".format(g_strMyDocs,     g_strDateTimeTag).replace("\\", "/"),
        "{0}/__SecureCRT-Session-ImportLog-{1}.txt".format(g_strMyDesktop,  g_strDateTimeTag).replace("\\", "/"),
        "{0}/__SecureCRT-Session-ImportLog-{1}.txt".format(GetConfigPath(), g_strDateTimeTag).replace("\\", "/")
        ]

    bSuccess = False

    for strFilename in cFilenames:
        try:
            objFile = open(strFilename, "w")
            bSuccess = True
        except:
            crt.Session.SetStatusText("Unable to open results file.")
            strResults = (strResults + "\n" +
                "Failed to write summary results to: {0}".format(strFilename))
        if not os.path.isfile(strFilename):
            bSuccess = False
        else:
            break

    if not bSuccess:
        if ":\\" in g_strMyDocs:
            strResults = strResults.replace("\n", "\r\n")
        crt.Clipboard.Text = strResults
        crt.Dialog.MessageBox(
            "Attempted to write summary results to the file locations below, " +
            "but access was denied.\r\n\t{0}".format("\r\n\t".join(cFilenames)) +
            "\r\n\r\nResults are in the clipboard. " +
            "Paste them into your favorite app now to see what occurred.")
        return


    objFile.write(strResults)
    objFile.close()


    # Display the log file as an indication that the information has been
    # imported.
    OpenPathInDefaultApp(strFilename)
    crt.Session.SetStatusText("")


Import()

My Python Logon Script LogicalSystemsLogonScript.py:

# $language = "python"
# $interface = "1.0"

import SecureCRT

def Main():

    # Get the session path... since on Windows, we might get a back-slash
    # char instead of a /, convert any '\' received into '/':
    strSessionPath = crt.Session.Path.replace("\\", "/")
    
    # Now, split on "/" and take the first one from the right ([-1]),
    # which will be our session name:
    strSessionName = strSessionPath.split("/")[-1]
    
    # turn on synchronous mode so we don't miss any data
    crt.Screen.Synchronous = True
    
    # Wait for a string that looks like first Junos prompt: 
    crt.Screen.WaitForString("root@MX% ")
    
    # Send your command followed by a carriage return
    crt.Screen.Send("cli\r")

    # Wait for a string that looks like Junos operational prompt:
    crt.Screen.WaitForString("root@MX> ")

    # send the command and a carriage return
    crt.Screen.Send("set cli logical-system " + strSessionName + "\r")
  
    # turn off synchronous mode to restore normal input processing
    crt.Screen.Synchronous = False

Main()

Sources of info:

112 thoughts on “Use Python Script to Create New SecureCRT Sessions from Data File

  1. One thing I have actually noticed is the fact that there are plenty of fallacies regarding the finance institutions intentions while talking about foreclosure. One misconception in particular is the bank wants your house. Your banker wants your hard earned cash, not your house. They want the amount of money they loaned you having interest. Keeping away from the bank will draw the foreclosed summary. Thanks for your posting.

  2. Thanks for your write-up. One other thing is that if you are selling your property alone, one of the concerns you need to be aware about upfront is how to deal with home inspection accounts. As a FSBO vendor, the key concerning successfully transferring your property and saving money on real estate agent profits is know-how. The more you understand, the more stable your sales effort are going to be. One area that this is particularly essential is inspection reports.

  3. I think this is among the most important information for me.And i’m glad reading your article. But should remark on few general things, Thewebsite style is perfect, the articles is really excellent :D. Good job, cheers

  4. Undeniably consider that that you said. Your favorite justification seemed to be on the internet the easiest factor to consider of. I say to you, I definitely get annoyed even as people think about issues that they just do not realize about. You managed to hit the nail upon the top as neatly as defined out the entire thing with no need side effect , other folks could take a signal. Will probably be again to get more. Thanks

  5. When I originally commented I clicked the -Notify me when new comments are added- checkbox and now each time a comment is added I get four emails with the identical comment. Is there any manner you can take away me from that service? Thanks!

  6. I was very happy to search out this internet-site.I needed to thanks for your time for this excellent read!! I positively enjoying each little little bit of it and I’ve you bookmarked to check out new stuff you blog post.

  7. Youre so cool! I dont suppose Ive read something like this before. So nice to search out any individual with some authentic thoughts on this subject. realy thank you for beginning this up. this web site is something that is wanted on the net, somebody with a little originality. helpful job for bringing something new to the internet!

  8. A powerful share, I just given this onto a colleague who was doing a little analysis on this. And he actually bought me breakfast as a result of I found it for him.. smile. So let me reword that: Thnx for the treat! But yeah Thnkx for spending the time to debate this, I feel strongly about it and love reading more on this topic. If potential, as you develop into expertise, would you thoughts updating your weblog with extra details? It is extremely helpful for me. Huge thumb up for this blog post!

  9. My husband and i were thrilled Chris managed to conclude his preliminary research out of the precious recommendations he received in your web pages. It’s not at all simplistic to just find yourself making a gift of instructions that many some other people have been making money from. And we remember we now have the website owner to give thanks to for this. These explanations you’ve made, the easy web site menu, the relationships your site make it easier to instill – it’s got most sensational, and it’s making our son and us know that the subject matter is enjoyable, which is wonderfully serious. Thank you for the whole thing!

  10. I needed to write you one little bit of remark so as to say thank you the moment again regarding the awesome knowledge you have provided on this page. It was remarkably generous with people like you to provide extensively precisely what many people would have supplied for an ebook in making some dough for themselves, chiefly considering that you could possibly have tried it if you ever wanted. The smart ideas additionally acted as a fantastic way to recognize that many people have the identical interest just as mine to figure out more and more in regard to this issue. I believe there are many more fun instances up front for those who find out your website.

  11. I definitely wanted to compose a message to express gratitude to you for the marvelous advice you are placing on this site. My time-consuming internet search has finally been compensated with awesome suggestions to share with my relatives. I would repeat that most of us readers actually are rather blessed to be in a very good network with many lovely professionals with insightful methods. I feel really lucky to have discovered your website page and look forward to many more brilliant minutes reading here. Thanks once more for a lot of things.

  12. Thanks for each of your hard work on this web site. Debby take interest in making time for investigations and it’s really easy to see why. My partner and i notice all regarding the powerful way you give reliable ideas through your web blog and as well as welcome participation from website visitors on the idea so my simple princess is always studying so much. Take pleasure in the rest of the year. Your carrying out a really great job.

  13. I wanted to compose a message so as to say thanks to you for those fantastic points you are posting here. My time-consuming internet lookup has now been compensated with good quality information to share with my guests. I ‘d admit that we visitors actually are very endowed to exist in a wonderful website with so many wonderful people with great pointers. I feel rather happy to have come across your entire webpages and look forward to tons of more thrilling moments reading here. Thanks a lot again for all the details.

  14. I have to express some appreciation to this writer just for rescuing me from this type of predicament. Right after searching throughout the the web and obtaining ways which are not beneficial, I thought my life was gone. Living minus the solutions to the problems you have fixed as a result of your good short post is a crucial case, as well as the kind which could have adversely damaged my career if I hadn’t encountered your web blog. Your own personal mastery and kindness in maneuvering every aspect was crucial. I don’t know what I would’ve done if I had not discovered such a point like this. It’s possible to at this moment relish my future. Thank you very much for your expert and effective guide. I won’t be reluctant to recommend the blog to any person who ought to have guide about this situation.

  15. I must show thanks to the writer just for rescuing me from this type of situation. Because of scouting through the world-wide-web and coming across solutions which are not helpful, I assumed my entire life was over. Existing without the presence of strategies to the issues you have fixed all through this article content is a crucial case, and the ones that would have adversely affected my entire career if I hadn’t come across the blog. Your own personal capability and kindness in dealing with every part was very useful. I am not sure what I would have done if I hadn’t come upon such a point like this. I can also now relish my future. Thank you so much for your skilled and effective guide. I will not be reluctant to propose your web blog to any individual who needs direction on this problem.

  16. I want to convey my passion for your kindness for women who require help on your subject matter. Your personal dedication to passing the solution along appeared to be pretty informative and have all the time made individuals much like me to achieve their objectives. Your personal insightful information signifies a great deal a person like me and somewhat more to my colleagues. Many thanks; from everyone of us.

  17. I wanted to create you one very small observation just to give thanks yet again on the splendid knowledge you have shown in this article. It was certainly incredibly open-handed of you giving publicly just what most of us would have supplied for an e-book to help with making some bucks on their own, notably given that you could have tried it in the event you wanted. Those points additionally worked to become easy way to be aware that someone else have the identical dreams similar to my very own to learn more on the topic of this issue. I’m sure there are some more pleasurable periods up front for many who looked over your site.

  18. I am just writing to make you understand of the impressive encounter my child obtained viewing your site. She noticed too many issues, most notably what it is like to possess an incredible teaching mindset to let other folks without hassle completely grasp a number of grueling matters. You truly surpassed people’s expectations. I appreciate you for distributing such informative, safe, educational and easy tips on that topic to Evelyn.

  19. I wanted to construct a small note in order to thank you for these awesome pointers you are placing at this website. My time-consuming internet look up has finally been recognized with reasonable tips to write about with my friends and classmates. I would tell you that we site visitors are rather fortunate to live in a fabulous community with so many special individuals with interesting ideas. I feel quite lucky to have encountered your website page and look forward to so many more entertaining moments reading here. Thanks once again for everything.

  20. I want to show my affection for your kind-heartedness giving support to those individuals that must have guidance on this particular area of interest. Your special commitment to getting the solution around had been wonderfully insightful and has continually made ladies just like me to arrive at their desired goals. The interesting guidelines indicates much to me and extremely more to my mates. Regards; from all of us.

  21. A lot of thanks for all your valuable efforts on this site. Kim really loves doing internet research and it’s really easy to see why. My partner and i know all of the powerful medium you offer useful tips and tricks via your blog and as well encourage contribution from the others on that concept and our simple princess is understanding a whole lot. Have fun with the rest of the year. You’re conducting a very good job.

  22. I must show my gratitude for your generosity supporting persons that really want help on the content. Your personal commitment to passing the solution all around appeared to be particularly valuable and has allowed many people like me to arrive at their targets. Your interesting publication can mean a whole lot a person like me and additionally to my office workers. With thanks; from everyone of us.

  23. I’m also commenting to let you understand what a helpful discovery my child undergone studying your blog. She picked up several details, including what it is like to possess an awesome teaching heart to let certain people with no trouble learn about selected complex topics. You undoubtedly did more than my desires. Many thanks for coming up with the effective, safe, explanatory and even easy tips about your topic to Kate.

  24. I precisely had to thank you so much again. I am not sure the things that I could possibly have worked on in the absence of the type of secrets discussed by you concerning my concern. This was a very difficult crisis in my position, nevertheless finding out this skilled manner you resolved the issue made me to jump for delight. I’m happier for this guidance as well as have high hopes you comprehend what an amazing job you have been accomplishing educating many others by way of a web site. I know that you’ve never met all of us.

  25. I wanted to put you the tiny remark to say thanks a lot over again for your nice thoughts you have provided above. It is quite tremendously generous with people like you to make publicly all that some people would have sold as an ebook to generate some money on their own, specifically given that you might well have done it if you considered necessary. These tricks additionally acted to become great way to understand that other people online have a similar dream like my personal own to know very much more on the topic of this matter. I’m certain there are millions of more enjoyable opportunities in the future for individuals who browse through your blog.

  26. I am also writing to make you understand what a cool experience my wife’s daughter obtained browsing your web page. She noticed too many details, most notably what it’s like to possess a marvelous giving character to get many more with no trouble understand some extremely tough issues. You truly did more than people’s desires. Thanks for giving the powerful, trustworthy, edifying and as well as unique tips on your topic to Tanya.

  27. Thank you a lot for giving everyone remarkably pleasant possiblity to read articles and blog posts from this site. It is usually very awesome plus full of a good time for me personally and my office friends to search your site on the least thrice every week to read the new items you will have. And definitely, we are certainly satisfied with the sensational thoughts served by you. Some two areas in this post are really the very best I have had.

  28. I’m just writing to make you know what a awesome experience my girl developed visiting your webblog. She came to understand several pieces, most notably what it’s like to possess an excellent giving style to make other folks without difficulty learn about several grueling things. You undoubtedly did more than people’s expected results. Thanks for providing these valuable, dependable, explanatory and as well as cool tips about that topic to Mary.

  29. I as well as my pals were actually reading through the best secrets on your web blog then quickly I had a horrible suspicion I had not expressed respect to the site owner for those secrets. Most of the boys were definitely certainly joyful to read all of them and have extremely been using these things. Appreciation for turning out to be quite kind and then for deciding on this form of very good areas millions of individuals are really desperate to discover. My personal sincere regret for not expressing appreciation to sooner.

  30. I have to express some thanks to you just for bailing me out of such a instance. Because of checking through the world wide web and meeting advice that were not pleasant, I figured my life was gone. Living devoid of the approaches to the issues you have sorted out by way of your entire guide is a serious case, as well as ones that could have in a negative way damaged my career if I hadn’t encountered your website. Your own personal knowledge and kindness in taking care of a lot of things was vital. I am not sure what I would’ve done if I hadn’t come upon such a stuff like this. I’m able to now relish my future. Thank you very much for your reliable and amazing help. I will not think twice to endorse your site to any person who should receive guidance on this problem.

  31. I have to express thanks to the writer just for rescuing me from this scenario. After browsing throughout the world-wide-web and seeing things which are not productive, I believed my life was gone. Being alive without the strategies to the difficulties you’ve fixed through your good article is a critical case, as well as the kind that could have in a wrong way damaged my entire career if I hadn’t discovered your site. Your good ability and kindness in taking care of the whole thing was precious. I am not sure what I would have done if I had not discovered such a stuff like this. I can also at this moment look ahead to my future. Thanks so much for your expert and results-oriented help. I will not think twice to recommend your web site to any person who should receive guide on this problem.

  32. Thanks for all of the hard work on this website. My mom really loves participating in internet research and it is easy to understand why. Most of us know all about the powerful tactic you convey both interesting and useful tactics through the blog and as well as encourage contribution from people about this theme plus our own daughter is truly discovering a lot. Take pleasure in the remaining portion of the year. Your carrying out a fabulous job.

  33. I precisely wanted to say thanks once again. I do not know what I would’ve created in the absence of the tricks revealed by you relating to such a concern. It seemed to be a very intimidating setting in my view, nevertheless being able to view this specialised approach you managed it made me to weep with fulfillment. I am just thankful for the support and then hope that you realize what a great job that you are accomplishing educating many others through the use of your webblog. I am certain you have never come across any of us.

  34. I would like to express some thanks to this writer for bailing me out of this particular condition. After browsing through the world wide web and seeing solutions that were not beneficial, I figured my life was well over. Living without the presence of solutions to the problems you’ve resolved by means of this write-up is a serious case, and those that could have badly damaged my entire career if I had not encountered your blog post. Your personal capability and kindness in controlling all the things was vital. I don’t know what I would have done if I hadn’t come across such a subject like this. I can at this moment look ahead to my future. Thank you so much for your high quality and sensible guide. I won’t be reluctant to suggest the website to any individual who ought to have tips on this subject.

  35. I not to mention my pals happened to be checking the nice tricks from your website then all of a sudden developed a terrible feeling I had not expressed respect to the website owner for them. Those boys are already for this reason glad to learn all of them and have in effect actually been having fun with those things. We appreciate you genuinely well thoughtful and then for picking such very good themes millions of individuals are really desirous to discover. My sincere regret for not expressing gratitude to you earlier.

  36. A lot of thanks for all of your work on this blog. My niece takes pleasure in setting aside time for investigations and it’s really easy to understand why. I notice all regarding the powerful mode you provide very important tips and hints on this website and as well cause participation from the others on this matter while my simple princess is actually starting to learn a lot. Have fun with the remaining portion of the new year. You’re doing a useful job.

  37. Thanks for your whole efforts on this site. Betty loves getting into investigation and it’s really easy to see why. A lot of people know all concerning the lively ways you provide priceless techniques on your blog and as well inspire response from other ones on the issue and our own simple princess is undoubtedly discovering a lot of things. Take pleasure in the rest of the year. You are always carrying out a dazzling job.

  38. I am just commenting to make you understand of the useful encounter my cousin’s princess went through using your webblog. She figured out a wide variety of pieces, with the inclusion of what it’s like to have a marvelous helping style to make other people without difficulty learn a number of hard to do topics. You truly did more than our own expected results. Thanks for presenting these productive, healthy, explanatory as well as unique tips on this topic to Lizeth.

  39. A lot of thanks for every one of your hard work on this web site. Kim take interest in engaging in investigation and it’s obvious why. We all hear all of the powerful ways you present simple steps via your blog and even boost contribution from website visitors on the point then our own princess is without question discovering a whole lot. Take pleasure in the remaining portion of the year. You are doing a fantastic job.

  40. I simply wanted to appreciate you yet again. I’m not certain what I would have implemented without the opinions shown by you about this question. It actually was the distressing concern for me, nevertheless understanding this skilled strategy you resolved that made me to jump with happiness. I will be happy for the information and have high hopes you recognize what a great job you were putting in training people today via your web blog. I know that you’ve never encountered all of us.

  41. My spouse and i felt really thankful that Louis managed to round up his preliminary research using the ideas he received using your weblog. It’s not at all simplistic to simply always be freely giving guidance which the others have been trying to sell. And we also do know we need the writer to thank because of that. The most important explanations you’ve made, the easy blog navigation, the relationships your site make it easier to instill – it’s got all powerful, and it’s really helping our son and us imagine that that topic is cool, which is exceptionally serious. Thanks for the whole thing!

  42. My husband and i were relieved Louis could conclude his investigation through your precious recommendations he acquired through the blog. It is now and again perplexing to just choose to be releasing thoughts that a number of people may have been trying to sell. And we all take into account we have the website owner to thank because of that. The most important explanations you’ve made, the straightforward site menu, the friendships you will help engender – it is mostly incredible, and it is letting our son in addition to the family do think this matter is satisfying, and that is especially indispensable. Thank you for the whole lot!

  43. I together with my pals came looking at the great recommendations located on your web page while instantly developed a terrible suspicion I never thanked the blog owner for those techniques. Most of the men came passionate to read through all of them and have in effect surely been loving those things. Many thanks for truly being considerably helpful and for having this form of superior resources millions of individuals are really needing to understand about. Our honest regret for not saying thanks to sooner.

  44. My husband and i felt absolutely comfortable Edward managed to finish off his investigation via the precious recommendations he gained through the web page. It’s not at all simplistic just to always be freely giving thoughts the others might have been making money from. And we all acknowledge we now have the blog owner to appreciate for that. These illustrations you have made, the simple website navigation, the friendships you will help create – it’s got all spectacular, and it’s really aiding our son in addition to us do think that subject matter is interesting, which is really indispensable. Thank you for everything!

  45. I together with my guys were actually reviewing the nice secrets from your website then immediately got an awful suspicion I never expressed respect to the website owner for those strategies. These young boys had been for that reason excited to learn all of them and already have seriously been using those things. Thanks for getting well considerate and also for going for some useful subject matter most people are really wanting to be aware of. My honest regret for not expressing appreciation to you sooner.

  46. I enjoy you because of your entire work on this site. My aunt delights in going through investigation and it’s simple to grasp why. A number of us notice all regarding the powerful manner you give advantageous strategies through your web blog and in addition strongly encourage response from some others on this issue so our simple princess is really starting to learn a whole lot. Take pleasure in the rest of the new year. You have been carrying out a superb job.

  47. I am glad for writing to let you know of the exceptional discovery my wife’s child gained checking your web site. She even learned some issues, which include what it is like to have a very effective giving mindset to get many more with no trouble learn several very confusing issues. You actually did more than visitors’ expected results. Many thanks for rendering such priceless, safe, explanatory and also fun guidance on this topic to Evelyn.

  48. I precisely needed to thank you very much once again. I do not know the things that I could possibly have followed in the absence of the information discussed by you over that subject. It has been an absolute frustrating circumstance for me, but taking a look at your well-written manner you processed the issue took me to jump for happiness. I’m just happy for your information as well as hope that you recognize what an amazing job your are carrying out educating people with the aid of your site. I know that you have never got to know any of us.

  49. I wish to show my thanks to the writer for rescuing me from this situation. Right after researching through the the net and finding tricks that were not productive, I assumed my life was gone. Being alive without the presence of strategies to the difficulties you’ve solved by way of your good site is a serious case, as well as those which may have adversely damaged my career if I had not noticed your web page. Your primary skills and kindness in touching almost everything was vital. I’m not sure what I would have done if I hadn’t come upon such a solution like this. I can also at this moment look forward to my future. Thanks a lot very much for this impressive and result oriented guide. I won’t be reluctant to suggest the website to anyone who should get tips on this topic.

  50. I precisely wanted to thank you so much once more. I’m not certain the things that I might have achieved without the thoughts contributed by you regarding this situation. It had become a alarming condition in my view, but finding out your specialized style you processed that forced me to cry over happiness. I’m just thankful for the service and then wish you recognize what an amazing job that you are getting into training the rest all through a site. I’m certain you have never encountered all of us.

  51. I would like to show some thanks to you just for rescuing me from this particular predicament. Because of exploring throughout the online world and coming across views which were not pleasant, I believed my life was gone. Being alive minus the answers to the difficulties you’ve solved through your article is a critical case, as well as those which could have badly affected my entire career if I hadn’t noticed the blog. Your actual capability and kindness in controlling everything was invaluable. I don’t know what I would’ve done if I had not come across such a stuff like this. I am able to now relish my future. Thanks for your time very much for this reliable and results-oriented guide. I won’t hesitate to recommend your web page to anybody who should receive support on this subject.

  52. I together with my pals appeared to be reviewing the excellent hints found on your web page and so unexpectedly got a terrible suspicion I had not expressed respect to the blog owner for those strategies. Most of the guys had been as a consequence joyful to read through all of them and now have in actuality been using them. We appreciate you genuinely so accommodating and also for utilizing these kinds of extraordinary subject areas most people are really wanting to be informed on. Our own honest regret for not saying thanks to sooner.

  53. I must point out my appreciation for your kind-heartedness supporting men and women that absolutely need assistance with this important content. Your special commitment to passing the solution throughout became particularly invaluable and have specifically allowed some individuals much like me to realize their pursuits. Your new warm and friendly help and advice implies a great deal to me and substantially more to my office workers. Warm regards; from each one of us.

  54. I wish to show my gratitude for your kindness in support of people that actually need help on in this concept. Your special dedication to passing the message along has been extraordinarily important and has constantly made girls much like me to achieve their objectives. Your personal helpful tips and hints implies this much to me and additionally to my colleagues. Warm regards; from all of us.

  55. I and also my friends came looking through the excellent techniques located on your web site and so all of the sudden developed a horrible suspicion I had not thanked the web blog owner for those secrets. All of the young boys were consequently very interested to read all of them and have now actually been using them. I appreciate you for getting very accommodating and then for deciding on these kinds of amazing things most people are really wanting to know about. Our own sincere apologies for not expressing gratitude to you earlier.

  56. I and also my guys were actually examining the great solutions from the website and instantly got a horrible suspicion I never thanked you for those secrets. These guys were definitely as a result happy to study all of them and have absolutely been taking pleasure in those things. Thanks for turning out to be simply accommodating as well as for making a decision on this sort of superior topics millions of individuals are really desperate to be informed on. Our sincere regret for not expressing gratitude to earlier.

  57. I must show some appreciation to you for bailing me out of this type of issue. Because of browsing through the internet and coming across basics which were not powerful, I figured my life was over. Being alive minus the approaches to the difficulties you have solved by way of the review is a serious case, and ones that would have in a wrong way affected my entire career if I had not encountered your web page. Your own training and kindness in touching every part was very helpful. I’m not sure what I would have done if I hadn’t encountered such a stuff like this. I can also at this point look ahead to my future. Thanks a lot very much for your professional and amazing help. I will not hesitate to propose your blog post to anyone who should receive care on this area.

  58. I actually wanted to post a simple comment to thank you for some of the wonderful ways you are placing on this site. My incredibly long internet look up has at the end of the day been compensated with wonderful knowledge to share with my pals. I ‘d suppose that most of us site visitors are very lucky to be in a perfect place with very many wonderful professionals with very beneficial solutions. I feel extremely privileged to have come across the website page and look forward to some more cool times reading here. Thanks a lot once more for a lot of things.

  59. I and also my pals came going through the great key points on the blog and so immediately came up with a terrible suspicion I had not expressed respect to the site owner for those strategies. Those men were as a consequence stimulated to study all of them and have unquestionably been making the most of them. Appreciation for simply being indeed thoughtful and also for choosing varieties of decent things millions of individuals are really needing to learn about. My very own sincere regret for not expressing appreciation to you earlier.

  60. Thank you a lot for providing individuals with a very wonderful possiblity to read critical reviews from this web site. It is always so sweet and as well , packed with fun for me and my office mates to visit your website on the least 3 times in a week to learn the newest things you have. And of course, we’re actually satisfied with your astounding concepts you give. Some 4 points in this article are unequivocally the most suitable I’ve ever had.

  61. I intended to send you this little bit of observation just to say thank you yet again for those great basics you have documented at this time. It is so strangely generous of you to supply without restraint all that many people would have offered as an e book to help make some money for themselves, and in particular given that you could have tried it in case you desired. The tactics likewise worked as the great way to recognize that some people have the identical keenness really like my own to learn a whole lot more in respect of this matter. I’m sure there are a lot more fun occasions ahead for those who look into your blog.

  62. I actually wanted to type a quick remark in order to express gratitude to you for those unique instructions you are giving out on this site. My time intensive internet search has at the end of the day been recognized with good quality tips to exchange with my two friends. I ‘d claim that many of us website visitors actually are unquestionably blessed to exist in a decent website with so many lovely people with very helpful strategies. I feel very grateful to have seen your webpages and look forward to so many more enjoyable minutes reading here. Thank you once more for a lot of things.

  63. I simply wanted to say thanks once again. I’m not certain what I could possibly have created without the thoughts shown by you on my field. It had become an absolute distressing dilemma for me, nevertheless spending time with the well-written avenue you processed the issue forced me to jump over joy. I am just thankful for the information and even hope you know what an amazing job you’re accomplishing training most people with the aid of your websites. I’m certain you’ve never encountered all of us.

  64. I’m just writing to let you know of the incredible encounter our girl went through browsing yuor web blog. She came to understand plenty of pieces, with the inclusion of how it is like to possess an excellent teaching nature to get others really easily gain knowledge of a variety of impossible topics. You undoubtedly did more than her expected results. Thank you for rendering such beneficial, dependable, edifying and in addition fun tips about your topic to Mary.

  65. Thank you for all your valuable work on this web page. Betty take interest in making time for research and it is easy to see why. All of us notice all regarding the powerful medium you render very important guidelines on the blog and even attract participation from some others on this matter while my girl is certainly starting to learn a whole lot. Take advantage of the rest of the new year. You are performing a fantastic job.

  66. I precisely wished to thank you so much yet again. I am not sure the things that I would have gone through in the absence of those points discussed by you on such a situation. This has been a troublesome problem for me, however , understanding a new specialised technique you solved the issue forced me to cry for fulfillment. I’m grateful for this guidance and then expect you are aware of a powerful job you were providing teaching people today with the aid of your website. Most probably you’ve never got to know any of us.

  67. I simply wanted to appreciate you again. I am not sure the things that I would’ve tried in the absence of those information revealed by you over that theme. It had become a daunting scenario in my position, however , discovering your well-written form you dealt with the issue made me to cry for joy. Now i’m grateful for the support and even believe you really know what a great job you were getting into educating many people with the aid of your web site. Most probably you haven’t come across all of us.

  68. I precisely had to thank you very much once again. I am not sure the things that I could possibly have carried out without the strategies shared by you regarding this concern. It was before a real depressing issue in my opinion, nevertheless being able to see your specialized avenue you dealt with that took me to cry over joy. I am just thankful for your support and thus sincerely hope you really know what a powerful job you are always putting in instructing the mediocre ones through your web site. Probably you’ve never encountered any of us.

  69. Thank you a lot for providing individuals with remarkably splendid opportunity to read critical reviews from this site. It is usually very good and as well , full of amusement for me personally and my office acquaintances to search the blog at minimum 3 times in 7 days to study the fresh issues you have. And indeed, I’m so certainly satisfied for the powerful strategies you give. Certain 3 facts in this posting are unquestionably the finest I have ever had.

  70. I am writing to let you be aware of of the extraordinary experience our princess experienced using your webblog. She came to find several details, which include how it is like to have a great giving mindset to make the others without problems understand certain complex subject matter. You truly exceeded our desires. Thank you for imparting these productive, trusted, explanatory not to mention cool tips on that topic to Janet.

  71. Thanks a lot for giving everyone remarkably wonderful chance to check tips from this web site. It’s always very beneficial and as well , full of a great time for me personally and my office acquaintances to visit your website at the very least 3 times in a week to read through the fresh secrets you have. Not to mention, I am also usually amazed concerning the sensational ideas you serve. Some two areas in this posting are honestly the best I have ever had.

  72. I precisely needed to appreciate you yet again. I do not know the things I would’ve taken care of without these information shared by you over my area of interest. It was an absolute intimidating crisis in my position, but being able to view this well-written avenue you treated that took me to cry with joy. I’m just happier for the assistance and as well , believe you realize what an amazing job you were doing educating the others by way of your web blog. I am sure you’ve never met all of us.

  73. I wish to show my appreciation to the writer for bailing me out of this challenge. Because of checking throughout the the web and finding suggestions which were not helpful, I assumed my life was over. Living without the presence of answers to the difficulties you’ve resolved as a result of the posting is a critical case, as well as those that might have adversely affected my career if I hadn’t discovered your web blog. The understanding and kindness in maneuvering all things was priceless. I don’t know what I would’ve done if I hadn’t encountered such a thing like this. It’s possible to at this time look ahead to my future. Thanks a lot very much for this specialized and amazing help. I will not hesitate to propose the website to any person who should have support on this subject matter.

  74. I in addition to my friends were found to be following the nice procedures on your web page while unexpectedly I had an awful feeling I had not expressed respect to the website owner for those secrets. All the guys came so warmed to study all of them and have in effect unquestionably been loving those things. Many thanks for turning out to be well considerate as well as for settling on this kind of terrific information millions of individuals are really desirous to understand about. My personal honest regret for not expressing appreciation to you sooner.

  75. Thank you for all your valuable effort on this web page. Debby take interest in making time for internet research and it’s really easy to see why. All of us hear all regarding the compelling mode you offer efficient tips and hints via your blog and as well boost participation from website visitors on this matter plus our own simple princess is undoubtedly learning a lot. Take advantage of the rest of the new year. You’re conducting a stunning job.

  76. Thanks for every one of your effort on this web site. Kim really loves participating in research and it’s really simple to grasp why. Almost all learn all concerning the lively way you give effective tricks through your web site and as well recommend contribution from some other people about this situation plus our favorite child is learning a lot of things. Enjoy the rest of the year. You’re doing a terrific job.

  77. Thank you so much for providing individuals with such a memorable opportunity to discover important secrets from this web site. It is usually so superb and also full of a great time for me and my office peers to visit the blog the equivalent of three times per week to learn the new items you have. And of course, I am just certainly astounded concerning the staggering things served by you. Some two facts on this page are surely the most efficient we have all had.

  78. I want to show my thanks to the writer for bailing me out of this particular situation. Just after looking throughout the world wide web and obtaining views that were not pleasant, I believed my entire life was well over. Being alive without the presence of approaches to the problems you’ve fixed as a result of your article is a critical case, as well as ones which may have in a negative way affected my entire career if I had not noticed your blog. Your own ability and kindness in dealing with the whole thing was useful. I’m not sure what I would’ve done if I hadn’t come across such a stuff like this. I can also at this time look ahead to my future. Thanks for your time very much for the skilled and amazing help. I won’t be reluctant to endorse your web site to any person who should have guidance on this subject.

  79. My husband and i have been fortunate when Michael managed to conclude his preliminary research because of the ideas he obtained through your site. It’s not at all simplistic to simply continually be freely giving key points that many some people may have been trying to sell. And we recognize we have got the blog owner to thank for that. Most of the explanations you have made, the simple blog navigation, the friendships your site assist to instill – it’s most powerful, and it is making our son and our family recognize that that subject matter is entertaining, and that is exceptionally pressing. Many thanks for the whole lot!

  80. Thank you a lot for giving everyone an extremely breathtaking possiblity to check tips from this blog. It is always very pleasing plus stuffed with a great time for me and my office peers to visit your website particularly thrice in one week to read the newest guidance you have. And definitely, we’re always contented considering the awesome tactics you serve. Selected two facts on this page are easily the finest I’ve ever had.

  81. My wife and i have been very fulfilled when Chris managed to finish up his studies while using the ideas he made out of your web site. It’s not at all simplistic to just choose to be giving out guides some others might have been making money from. We do know we have you to appreciate because of that. All the explanations you’ve made, the simple web site menu, the friendships you can help to promote – it is everything excellent, and it is making our son and the family recognize that the situation is cool, and that is really pressing. Many thanks for the whole thing!

  82. I want to get across my affection for your kind-heartedness for all those that really want assistance with your subject. Your real commitment to getting the solution around came to be extremely interesting and have usually enabled those much like me to realize their pursuits. Your entire insightful guidelines denotes a great deal a person like me and extremely more to my mates. Thanks a lot; from all of us.

  83. Thank you for all your valuable efforts on this website. Kim enjoys getting into investigation and it’s really easy to understand why. We all learn all regarding the compelling manner you convey insightful guidelines via your website and recommend response from some other people on this content so our favorite girl is certainly understanding a lot. Take pleasure in the remaining portion of the new year. You are always performing a really good job.

  84. I truly wanted to make a small note to say thanks to you for all the fantastic ways you are showing at this website. My time-consuming internet research has finally been recognized with awesome facts and strategies to exchange with my best friends. I ‘d admit that we site visitors are rather endowed to dwell in a magnificent site with many wonderful individuals with good plans. I feel quite fortunate to have come across your web pages and look forward to tons of more enjoyable moments reading here. Thanks once again for everything.

  85. I must express my appreciation to the writer for rescuing me from this problem. Because of looking out throughout the world wide web and getting principles which are not pleasant, I figured my entire life was over. Being alive devoid of the answers to the issues you’ve resolved as a result of the guide is a crucial case, as well as the ones which could have negatively affected my entire career if I hadn’t noticed your web site. That competence and kindness in taking care of a lot of things was priceless. I am not sure what I would have done if I had not encountered such a point like this. It’s possible to at this moment relish my future. Thanks for your time so much for your professional and results-oriented guide. I won’t be reluctant to refer your web sites to any person who ought to have counselling about this area.

  86. I’m just writing to let you know of the perfect discovery our child obtained visiting your blog. She realized so many issues, most notably what it is like to possess a great helping character to make many more with ease grasp selected very confusing subject matter. You undoubtedly exceeded people’s expectations. Thank you for delivering those useful, trusted, educational and as well as cool thoughts on this topic to Evelyn.

  87. I am glad for writing to make you understand of the wonderful experience my cousin’s child gained reading your site. She came to find so many pieces, with the inclusion of what it’s like to possess an awesome teaching mood to make folks smoothly gain knowledge of selected advanced things. You truly exceeded people’s desires. Thank you for coming up with the warm and friendly, trusted, informative and in addition cool tips about that topic to Sandra.

  88. I want to express my love for your kind-heartedness in support of those people that have the need for help on in this situation. Your special dedication to passing the message along had become pretty practical and have surely encouraged associates just like me to realize their dreams. The warm and friendly advice implies a great deal a person like me and far more to my office workers. Regards; from everyone of us.

  89. I simply had to appreciate you once again. I am not sure the things that I would’ve undertaken in the absence of the actual opinions shown by you over that theme. This was the traumatic setting for me, however , taking a look at a new professional way you processed it took me to jump over joy. Now i’m happier for this work and as well , believe you are aware of a great job that you are doing training the rest with the aid of your site. I know that you’ve never met any of us.

  90. I am also commenting to let you know of the fine encounter our princess developed reading your web page. She came to understand plenty of issues, including what it’s like to possess a great giving style to make the mediocre ones very easily fully understand some complicated subject matter. You actually surpassed her expected results. Thank you for giving these useful, trustworthy, educational and also unique tips about your topic to Sandra.

  91. I truly wanted to post a brief note to be able to thank you for all of the stunning tricks you are giving on this website. My rather long internet lookup has at the end been compensated with high-quality facts to exchange with my colleagues. I ‘d say that many of us website visitors actually are undoubtedly blessed to live in a useful place with so many special individuals with valuable methods. I feel really blessed to have discovered your weblog and look forward to many more pleasurable moments reading here. Thanks once again for a lot of things.

  92. I want to show appreciation to this writer just for bailing me out of this type of condition. As a result of surfing throughout the the net and meeting opinions which are not productive, I believed my life was over. Being alive minus the solutions to the problems you have resolved through your main post is a serious case, as well as ones which might have adversely damaged my entire career if I had not come across your web page. That ability and kindness in playing with every item was vital. I don’t know what I would have done if I had not come across such a stuff like this. I can also now look ahead to my future. Thank you so much for the skilled and results-oriented guide. I won’t think twice to refer your web blog to any person who will need care on this topic.

  93. I together with my friends appeared to be reviewing the excellent pointers on the website while suddenly I got an awful feeling I had not thanked you for those strategies. All of the young boys came consequently thrilled to read through them and now have seriously been using these things. Many thanks for actually being very considerate as well as for choosing this sort of remarkable subject areas most people are really needing to be informed on. Our honest regret for not saying thanks to sooner.

  94. I and also my buddies have already been looking through the great procedures located on your web page while then I got a horrible suspicion I had not thanked the web blog owner for those secrets. The boys were definitely for this reason happy to see them and already have definitely been loving those things. Appreciate your turning out to be very helpful and for finding some magnificent useful guides most people are really eager to understand about. Our honest apologies for not saying thanks to you sooner.

  95. I definitely wanted to make a quick comment so as to appreciate you for the great tips and tricks you are placing at this website. My time-consuming internet look up has now been honored with reliable concept to exchange with my family members. I would repeat that most of us website visitors are unequivocally endowed to exist in a great place with many wonderful individuals with interesting pointers. I feel pretty privileged to have used your web page and look forward to plenty of more awesome minutes reading here. Thanks a lot again for all the details.

Leave a Reply

Your email address will not be published. Required fields are marked *