Quantcast
Channel: THWACK: All Content - Orion SDK
Viewing all 2677 articles
Browse latest View live

Discover Interfaces on node (powershell and curl)

$
0
0

I am running into an issue with trying to add interfaces on a node that I was successfully able to add by either powershell or curl.

 

For powershell I am running the command:

$discovered = Invoke-SwisVerb $swis Orion.NPM.Interfaces -verb DiscoverInterfacesOnNode 1647

 

Which returns the error:

Invoke-SwisVerb : The operation has timed out.

At C:\Data\Powershell\solarwinds_insert.ps1:68 char:15

+ ... iscovered = Invoke-SwisVerb $swis Orion.NPM.Interfaces DiscoverInterf ...

+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (:) [Invoke-SwisVerb], FaultException`1

    + FullyQualifiedErrorId : SwisError,SwisPowerShell.InvokeSwisVerb

 

With CURL I am running the command:

curl -k -u yyyyyyy:xxxxxxx -k --tlsv1.0 -H "Content-Type: application/json" -X POST "https://<server>:17778/SolarWinds/InformationService/v3/Json/Invoke/Orion.NPM.Interfaces/DiscoverInterfacesOnNode" -d "["1647"]"

 

Which returns the error:

{"Message":"The operation has timed out.","ExceptionType":"System.TimeoutException","FullException":"System.TimeoutException: The operation has timed out.\u000d\u000a   at SolarWinds.InformationService.Verb.VerbExecutor.Invoke(Object hostInstance, Object[] parameters)\u000d\u000a   at SolarWinds.InformationService.Verb.VerbExecutorContext.Invoke()\u000d\u000a   at SolarWinds.InformationService.Core.InformationService.Invoke[T](String entity, String verb, Action`1 setupParameters, Func`2 extractReturnValue)"}

 

I have been able to push and pull lots of information, and manually discovering and adding the interfaces through the web GUI works fine.  The timeout occurs around 5 minutes for the curl and powershell commands which hopefully means there is a timeout adjustment which can be made.  Although discovering the interfaces on the web gui does not take nearly this long...

 

Will be very appreciative of any assistance.  Even the logs that I looked at did not show much, although I am not entirely sure I was looking at the correct logs.

 

Message was edited by: Jeff Drouet Fixed the wrong error output for the CURL version.


Creating a detail view page but limited to certain custom property edits.

$
0
0

Hi,

I am trying to create a single detail page with only a few "custom property" that I can allow a user to edit.  I then added a view limitation to certain groups of servers that can also be viewed/search.  This will prevent users from viewing other node detail information and be locked down to group of servers that can be edited or viewed.

 

 

Now I need to enable the "custom search" where the query will update the url with the host/ip: /Orion/NetPerfMon/NodeDetails.aspx?netobject=N:1546&ViewID=280

 

This is where I need help: how do I create a custom search query that will update the url (N:(nodeid))?

 

Thanks in advance for your help/.

Solarwinds MIB

$
0
0

Hello:

 

How can i get the solarwinds MIB in MIB format is that makes sense . I had gotten the MIBs but in the format MIB.cfg but the programmer is request for the MIBs in mib format? Does anyone know how I can get it in that format?

Thanks for the help.

change node SNMP V3 encryption

$
0
0

Hello,

Please I need help help to change SNMPv3 encryption.

 

I can use swis.update(uri,PrivacyMethod='AES128') to change it. but still has other field to change:

Found the the field in NCM.nodes but

tried to use swis.update(uri,SNMPEncryptType='AES128') and it doesm't work.

Is there a log that stores the authentication methods used by the SDK or SWIS? Looking for auditing purposes.

Orion SAM script or API - Display Custom Application Status results pulled by Power Shell using vendor API.

$
0
0

Hello Orion Experts,

 

I am trying to display application health status from an API feed. (Unfortunately we do not have access to the servers to install agents). I have a power shell script that works perfectly to pull the results using REST API returning the results in PS Custom Object as following.

 

Display_name       : ServerFQDN

host_address       : IPAddress

host_alias         :  ServerName

host_plugin_output : PING OK - Packet loss = 0%, RTA = 0.25 ms

LastChecked        : 7/3/2017 3:31:00 PM

LastChanged        : 7/1/2017 4:31:01 AM

Status                   : Warning

perf_data          : 'Overall Disk Space'=102.27GB; 'Overall Disk Utilization'=18.3%;80;90; 'C: Space'=52.08GB; 'C: Utilisation'=86.9%;80;90; 'Data Space'=50.19GB; 'Data

                     Utilisation'=10.0%;80;90;

 

I have over 300+ Nodes to monitor. My goal is to display the Application name and status in Orion Dash board.

 

My question are following

 

1 - What will be the best method to display the node status in Orion dash board.  A- SAM custom monitor  or SWIS API?

2- Each scan results are different should I add all 300+ nodes to ICMP monitoring pool or if there is anyway i can add a custom property like Node name and status on the fly using any of the above methods?

3- How can I input data from XML/CSV or JASON in SAM Script editor,

4- If anyone has any power shell example or video showing how to attach custom scripts and output the results to dash bard will be much appreciated.

Getting the error of "Set-SwisObject : Access to IPAM.IPNode denied." using PowerShell

$
0
0

When doing the set-swisobject I get an access denied error. The account "admin" is marked as an admin in the Orion website.

 

Is there another location to set permissions that enable read/write on the nodes?

REST Orion.NPM.Interfaces/DiscoverInterfacesOnNode - ifOperStatus

$
0
0

Hello Orion SDK Community,

 

I'm using the Orion.NPM.Interfaces/DiscoverInterfacesOnNode verb - when I take a look at the discovery results, I get ifOperStatus = 4 for all interfaces.

 

Upon adding those interfaces with the AddInterfacesOnNode verb - the interfaces show a different status. Wondering if this is this a bug or by design?

When using the GUI/List resources, there is an indicator of the interface status (up/down shown as green/red).

 

I'm wanting to use the DiscoverInterfacesOnNode verb to list all interfaces, filter based on ifType and ifOperStatus (let's say for example, IfType = 6 and ifOperStatus = 1) and then add the resulting interfaces. This would allow me to filter based on interface status/other attributes.


For now, I am using another loop after the interfaces are added to query URI based on status and delete in bulk , but would prefer to do this all in one step if possible.

 

Thank you,

 

=swql

 

 

 

 


Add node (or something) to NCM - NPM

$
0
0

Hi,

I have a question. Can be added a node via SWIS (Orion SDK) ? Can you help me about that? -like sample code-

(I'm working on ASP .Net / C# project about that subject.)

Thanks.

How do I use curl to suppress alerts

SWQL Complex query

$
0
0

very new to the swis api and SWQL so would greatly appreciate any help.

i am looking for a query that will give me traffic information interfaces this being the max/min in/out bps  and the avg in/out bps for a period of the last 30 days.

any thing i have tried so far will give me multiple entries for every few hours is there anyway to just take the highest and lowest recorded for the given day to be used for the min and max.

 

many thanks sorry if this a vague

SWIS Fails when querying uninitialized Date/Time fields in NodesCustomProperties

$
0
0

I've run into a strangeness dealing with SWQL/SWIS.  If I use the following query in SWQL Studio, it works fine.  If I attempt to run the same query via SWIS (python flavor), I get a strange error.

 

I created a (Node) Custom Property called SLA_Sync_Time which is defined as a Date/Time custom property: not required, no default value.

 

Here's the (simple/sample) query:

     SELECT TOP 10 NodeID, SLA_Sync_Time from Orion.NodesCustomProperties

 

When I run this in SWQL Studio, I get the 10 rows I would expect.

 

The python code looks like so:

import requests

import orionsdk

 

npm_server = '<server>'

npm_user = '<user>'

npm_password = '<password>'

requests.packages.urllib3.disable_warnings()

swis = orionsdk.SwisClient(npm_server, npm_user, npm_password)

 

sql = "SELECT TOP 10 NodeID, SLA_Sync_Time from Orion.NodesCustomProperties"

print swis.query(sql)['results']

 

This produces the following error:

      requests.exceptions.HTTPError: 400 Client Error: Cannot set Column 'SLA_Sync_Time' to be null. Please use DBNull instead.

 

This is weird in that (a) I'm not trying to 'set' anything (so the message is particularly scary) and (b) it works in SWQL.

 

I have a few of these Date/Time properties, and all of them generate the same error.

 

What's the best work-around?  Set a default date (I'd rather not, as that puts bogus data in my DB)?  Update all of the fields to contain a DBNull (how)?

Issues creating SNMPv3 nodes via the API

$
0
0

Hi,

 

We're trying to get SNMPv3 nodes created via the API (from Python) with both SNMPv3PrivKeyIsPwd and SNMPv3AuthKeyIsPwd set to False, but it seems like this is failing with a "400 Client Error: Specified cast is not valid" error. If I leave those fields undefined, the node gets created without issues, but SNMPv3 doesn't actually work unless I go to the web UI and uncheck those checkboxes - which kind of defeats the whole point of automating node creation via the API. The default for those fields seems to be True.

 

I've tried a few different values for those fields (boolean/integer, string formats), but nothing seems to be working. Does anyone know how to create a SNMPv3 node with those fields set to false via the API (without doing a discovery)?

 

thanks for the help!

Application Alerts, insert SWQL variables

$
0
0

Hi,

 

I am creating an "Application" alert to notify me when an application goes down.

 

On the message, I want to insert a custom variable to show all components that are down.

 

However, when I use this SWQL statement, it only shows the 1 item, and not every component.

 

An example:

If the IIS application has 2 components that are down, it only shows one on the message, and not the rest.

 

Question;

Is there a way to allow the SWQL statement to "list" all the components that are down?

 

Currently, the available variables will show components with "unknown" as well, which I do not want it displayed.

 

PowerShell - Create and update Custom Property for a node being monitored via ICMP.

$
0
0

Hello Orion Experts.

I am trying to create and update custom property values for 300+ nodes that are being monitored via ICMP.  Found a script OrionSDK/CRUD.SettingCustomProperty.ps1 at master · solarwinds/OrionSDK · GitHub  to update the custom property. When i try to get the data from Swis using Get-OrionNode command i do not get property interfaceID. the script above is using interface Id to set and update the property values.  Script above is asking to build interface ID.  Please let me know if i am using a wrong interface or if there is a better way to get the task done.

 

$uri="swis://localhost/Orion/Orion.Nodes/NodeID=$($nodeId)/CustomProperties";
# set the custom property
Set-SwisObject$swis-Uri $uri-Properties $customProps
# build the interface URI
$uri="swis://localhost/Orion/Orion.Nodes/NodeID=$($nodeId)/Interfaces/InterfaceID=$($ifaceId)/CustomProperties";

 

 

Following is the datatype from Get-OrionNode output. 

 

TypeName: System.Management.Automation.PSCustomObject

 

 

Name                                  MemberType   Definition                                                              

----                                  ----------   ----------                                                              

Equals                                Method       bool Equals(System.Object obj)                                          

GetHashCode                           Method       int GetHashCode()                                                       

GetType                               Method       type GetType()                                                          

ToString                              Method       string ToString()                                                       

AgentPort                             NoteProperty string AgentPort=161                                                    

Allow64BitCounters                    NoteProperty bool Allow64BitCounters=True                                            

AncestorDetailsUrls                   NoteProperty string[] AncestorDetailsUrls=System.String[]                            

AncestorDisplayNames                  NoteProperty string[] AncestorDisplayNames=System.String[]                           

AvgResponseTime                       NoteProperty int AvgResponseTime=1                                                   

BlockUntil                            NoteProperty datetime BlockUntil=12/30/1899 4:00:00 AM                               

BufferBgMissThisHour                  NoteProperty double BufferBgMissThisHour=0                                           

BufferBgMissToday                     NoteProperty double BufferBgMissToday=0                                              

BufferHgMissThisHour                  NoteProperty double BufferHgMissThisHour=0                                           

BufferHgMissToday                     NoteProperty double BufferHgMissToday=0                                              

BufferLgMissThisHour                  NoteProperty double BufferLgMissThisHour=0                                           

BufferLgMissToday                     NoteProperty double BufferLgMissToday=0                                              

BufferMdMissThisHour                  NoteProperty double BufferMdMissThisHour=0                                           

BufferMdMissToday                     NoteProperty double BufferMdMissToday=0                                              

BufferNoMemThisHour                   NoteProperty double BufferNoMemThisHour=0                                            

BufferNoMemToday                      NoteProperty double BufferNoMemToday=0                                               

BufferSmMissThisHour                  NoteProperty double BufferSmMissThisHour=0                                           

BufferSmMissToday                     NoteProperty double BufferSmMissToday=0                                              

Caption                               NoteProperty string Caption=nyu01cu1.stnyu01.isyntax.net                             

Category                              NoteProperty int Category=2                                                          

ChildStatus                           NoteProperty int ChildStatus=1                                                       

CMTS                                  NoteProperty char CMTS=N                                                             

Community                             NoteProperty string Community=                                                       

Contact                               NoteProperty string Contact=                                                         

CPULoad                               NoteProperty int CPULoad=-2                                                          

CustomPollerLastStatisticsPoll        NoteProperty datetime CustomPollerLastStatisticsPoll=12/30/1899 4:00:00 AM           

CustomPollerLastStatisticsPollSuccess NoteProperty datetime CustomPollerLastStatisticsPollSuccess=12/30/1899 4:00:00 AM    

CustomStatus                          NoteProperty bool CustomStatus=False                                                 

Description                           NoteProperty string Description=Unknown                                              

DetailsUrl                            NoteProperty string DetailsUrl=/Orion/NetPerfMon/NodeDetails.aspx?NetObject=N:6255   

DisplayName                           NoteProperty string DisplayName=             

DNS                                   NoteProperty string DNS=                                                             

DynamicIP                             NoteProperty bool DynamicIP=False                                                    

EngineID                              NoteProperty int EngineID=9                                                          

EntityType                            NoteProperty string EntityType=Orion.Nodes                                           

External                              NoteProperty bool External=False                                                     

GroupStatus                           NoteProperty string GroupStatus=Up.gif                                               

Icon                                  NoteProperty string Icon=Unknown.gif                                                 

Image                                 NoteProperty DBNull Image=                                                           

InstanceSiteId                        NoteProperty int InstanceSiteId=0                                                    

InstanceType                          NoteProperty string InstanceType=Orion.Nodes                                         

IOSImage                              NoteProperty string IOSImage=                                                        

IOSVersion                            NoteProperty string IOSVersion=                                                      

IP                                    NoteProperty string IP=                                             

IPAddress                             NoteProperty string IPAddress=                                     

IPAddressGUID                         NoteProperty guid IPAddressGUID=               

IPAddressType                         NoteProperty string IPAddressType=IPv4                                               

IP_Address                            NoteProperty string IP_Address=                                      

IsOrionServer                         NoteProperty bool IsOrionServer=False                                                

IsServer                              NoteProperty bool IsServer=False                                                     

LastBoot                              NoteProperty DBNull LastBoot=                                                        

LastSync                              NoteProperty datetime LastSync=                              

LastSystemUpTimePollUtc               NoteProperty DBNull LastSystemUpTimePollUtc=                                         

Location                              NoteProperty string Location=                                                        

MachineType                           NoteProperty string MachineType=Unknown                                              

MaxResponseTime                       NoteProperty int MaxResponseTime=2                                                   

MemoryAvailable                       NoteProperty DBNull MemoryAvailable=                                                 

MemoryUsed                            NoteProperty double MemoryUsed=-2                                                    

MinResponseTime                       NoteProperty int MinResponseTime=1                                                   

MinutesSinceLastSync                  NoteProperty int MinutesSinceLastSync=1                                              

NextPoll                              NoteProperty datetime NextPoll=                          

 

NodeDescription                       NoteProperty string NodeDescription=                                                 

NodeID                                NoteProperty int NodeID=6255                                                         

                   

ObjectSubType                         NoteProperty string ObjectSubType=ICMP                                               

OrionIdColumn                         NoteProperty string OrionIdColumn=NodeID                                             

OrionIdPrefix                         NoteProperty string OrionIdPrefix=N:                                                 

PercentLoss                           NoteProperty double PercentLoss=0                                                    

PercentMemoryAvailable                NoteProperty int PercentMemoryAvailable=100                                          

PercentMemoryUsed                     NoteProperty int PercentMemoryUsed=0                                                 

PollInterval                          NoteProperty int PollInterval=90                                                     

RediscoveryInterval                   NoteProperty int RediscoveryInterval=30                                              

ResponseTime                          NoteProperty int ResponseTime=2                                                      

RWCommunity                           NoteProperty string RWCommunity=                                                     

Severity                              NoteProperty int Severity=0                                                          

SkippedPollingCycles                  NoteProperty int SkippedPollingCycles=0                                              

SNMPVersion                           NoteProperty int16 SNMPVersion=0                                                     

StatCollection                        NoteProperty int StatCollection=10                                                   

Status                                NoteProperty int Status=1                                                            

StatusDescription                     NoteProperty string StatusDescription=Node status is Up.                             

StatusIcon                            NoteProperty string StatusIcon=Up.gif                                                

StatusIconHint                        NoteProperty DBNull StatusIconHint=                                                  

StatusLED                             NoteProperty string StatusLED=Up.gif                                                 

SysName                               NoteProperty string SysName=                                                         

SysObjectID                           NoteProperty string SysObjectID=                                                     

SystemUpTime                          NoteProperty double SystemUpTime=0                                                   

TotalMemory                           NoteProperty float TotalMemory=0                                                     

UiSeverity                            NoteProperty int UiSeverity=0                                                        

UnManaged                             NoteProperty bool UnManaged=False                                                    

UnManageFrom                          NoteProperty datetime UnManageFrom=12/30/1899 12:00:00 AM                            

UnManageUntil                         NoteProperty datetime UnManageUntil=12/30/1899 12:00:00 AM                           

Vendor                                NoteProperty string Vendor=Unknown                                                   

VendorIcon                            NoteProperty string VendorIcon=Unknown.gif  


ImportDiscoveryResults (API)

$
0
0

We have a Python script that does a full discovery, including Interface filters, with AutoImport=True and it works like a champ. However, we're trying to figure out how to have a two part approach:

 

1 - Discovery with AutoImport=False

2 - Import devices that have been discovered

 

There aren't a lot of references out there that provide detailed examples of using 'ImportDiscoveryResults'. Here are some that I've been looking at:

 

SolarWinds Information Service v3.0 Schema Documentation

orionsdk-python/swisclient.py at master · solarwinds/orionsdk-python · GitHub

From that one:

    definvoke(self, entity, verb, *args):
        returnself._req(
                "POST",
                "Invoke/{}/{}".format(entity, verb), args).json()

 

So it seems like I should have something like this:

swis.invoke('Orion.Discovery', 'ImportDiscoveryResults', ??)

 

Can I provide just the ProfileID that I already have from the previous Discovery? I've seen references about specifying Nodes, but I would like to only have to provide the ProfileID if possible.

 

Any help would be greatly appreciated!

Discover Interfaces on node (powershell and curl)

$
0
0

I am running into an issue with trying to add interfaces on a node that I was successfully able to add by either powershell or curl.

 

For powershell I am running the command:

$discovered = Invoke-SwisVerb $swis Orion.NPM.Interfaces -verb DiscoverInterfacesOnNode 1647

 

Which returns the error:

Invoke-SwisVerb : The operation has timed out.

At C:\Data\Powershell\solarwinds_insert.ps1:68 char:15

+ ... iscovered = Invoke-SwisVerb $swis Orion.NPM.Interfaces DiscoverInterf ...

+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (:) [Invoke-SwisVerb], FaultException`1

    + FullyQualifiedErrorId : SwisError,SwisPowerShell.InvokeSwisVerb

 

With CURL I am running the command:

curl -k -u yyyyyyy:xxxxxxx -k --tlsv1.0 -H "Content-Type: application/json" -X POST "https://<server>:17778/SolarWinds/InformationService/v3/Json/Invoke/Orion.NPM.Interfaces/DiscoverInterfacesOnNode" -d "["1647"]"

 

Which returns the error:

{"Message":"The operation has timed out.","ExceptionType":"System.TimeoutException","FullException":"System.TimeoutException: The operation has timed out.\u000d\u000a   at SolarWinds.InformationService.Verb.VerbExecutor.Invoke(Object hostInstance, Object[] parameters)\u000d\u000a   at SolarWinds.InformationService.Verb.VerbExecutorContext.Invoke()\u000d\u000a   at SolarWinds.InformationService.Core.InformationService.Invoke[T](String entity, String verb, Action`1 setupParameters, Func`2 extractReturnValue)"}

 

I have been able to push and pull lots of information, and manually discovering and adding the interfaces through the web GUI works fine.  The timeout occurs around 5 minutes for the curl and powershell commands which hopefully means there is a timeout adjustment which can be made.  Although discovering the interfaces on the web gui does not take nearly this long...

 

Will be very appreciative of any assistance.  Even the logs that I looked at did not show much, although I am not entirely sure I was looking at the correct logs.

 

Message was edited by: Jeff Drouet Fixed the wrong error output for the CURL version.

Error Updating Properties and Custom Properties of Nodes

$
0
0

Greetings,

 

 

I am currently trying to automate the maintenance of the SWQL database using the ORION SDK, SwisSnappin and PowerORION Module for Powershell.

 

I have been successful in deleting and adding nodes based on data imported from a .csv file.

 

I keep getting the following error when trying to update node properties/custom properties using the Set-SwisObject cmdlet.

 

Set-SwisObject : Invalid column name 'SNMPV3Username'.

Invalid column name 'SNMPV3PrivMethod'.

Invalid column name 'SNMPV3PrivKey'.

Invalid column name 'SNMPV3AuthMethod'.

Invalid column name 'SNMPV3AuthKey'.

At C:\Users\welfakir\Documents\Powershell_Scripts\Add-Node\Update-Node.ps1:222 char:102

+ ...  @{IP=$node.IP} | Set-SwisObject -SwisConnection $swis -Properties @{

+                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    + CategoryInfo          : InvalidOperation: (:) [Set-SwisObject], FaultException`1

    + FullyQualifiedErrorId : SwisError,SwisPowerShell.SetSwisObject

 

I am running SWQL Studio 2.2.54.0, NPM 12.1, SAM 6.4 (Both Trial as I cannot test on a production server) and PowerShell V5.

 

On another note, when I create nodes I am using the sample found on git hub : OrionSDK/CRUD.AddNode.ps1 at master · solarwinds/OrionSDK · GitHub

 

Are there other properties/pollers that need to be added upon creation for successful monitoring?

 

Thanks,

 

Will.

Orion SDK 2.2 released

$
0
0

Orion SDK 2.2 has been released. The main feature in this release is smart autocomplete in SWQL Studio, but there are also various minor bugfixes and improvements.

 

You can download the installer from GitHub: Release v2.2.54 · solarwinds/OrionSDK · GitHub

You can also install it from Chocolatey (Chocolatey Gallery | SolarWinds Orion SDK 2.2.54 ) using "choco install orionsdk"

 

Documentation is on the GitHub wiki: Home · solarwinds/OrionSDK Wiki · GitHub

 

These tools are compatible with all of the same SolarWinds products that the previous release was, so you should have no fear of upgrading. On the other side, Orion SDK 2.1 and several previous releases are compatible with the latest 2017 SolarWinds products, so don't feel like you need to upgrade the Orion SDK just for compatibility.

 

As always, you can ask your Orion SDK questions in this forum. If you see a bug in the SDK tools, feel free to open an issue on the GitHub project: Issues · solarwinds/OrionSDK · GitHub.

REST Orion.NPM.Interfaces/DiscoverInterfacesOnNode - ifOperStatus

$
0
0

Hello Orion SDK Community,

 

I'm using the Orion.NPM.Interfaces/DiscoverInterfacesOnNode verb - when I take a look at the discovery results, I get ifOperStatus = 4 for all interfaces.

 

Upon adding those interfaces with the AddInterfacesOnNode verb - the interfaces show a different status. Wondering if this is this a bug or by design?

When using the GUI/List resources, there is an indicator of the interface status (up/down shown as green/red).

 

I'm wanting to use the DiscoverInterfacesOnNode verb to list all interfaces, filter based on ifType and ifOperStatus (let's say for example, IfType = 6 and ifOperStatus = 1) and then add the resulting interfaces. This would allow me to filter based on interface status/other attributes.


For now, I am using another loop after the interfaces are added to query URI based on status and delete in bulk , but would prefer to do this all in one step if possible.

 

Thank you,

 

=swql

 

 

 

 

Viewing all 2677 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>