Using cURL To Upload Files

Uploading files is fairly easy in SN but what if you need to upload a lot of files?

There are some solutions using the AttachmentCreator service which work great but I wondered if it was possible to do it without any programming at all. So I racked my brain then I remembered a tool: cURL.

cURL is a tool used for making all sorts of web related requests. The best part about is it a command line tool so if you are in need of automating web requests this is the tool to use. Theres several versions for every OS out there and its fairly well documented.

So lets take a look at how to use it…

If you haven’t already grab a copy of cURL from

Logging in is a two step process, first we need to initialize our connection and set up a cookie:

The –cookie-jar cjar parameter creates a cookie called cjar so that we can save our information

-k tells cURL to just accept any certificates that the site offers, this gets us by HTTPS if that’s enabled on your instance.

-o output1.log tells curl to output to a log file instead of the screen

–location tells curl to follow any redirects

Finally we put our instance URL.

Once you run this command and you have a cookie jar created you can attempt to log in.

This command reuses some of the same parameters but also specifies all the data used to log in. Just replace USERNAME, PASSWORD and INSTANCE and you should get a positive response back.

The way to check that everything is working properly is in the output files. If they return the code that would be the homepage you are golden.

Finally once you have your cookie and are logged in you can start uploading files.

In this case I am uploading a PNG file called test that’s located in the same directory as cURL. If this is successful you will now be able to see the newly uploaded file on your instance.

Because this is an image file it will be available in the Image file browser but also at or

Note: Theres also no need to keep logging in, once you are in you can continue to upload files.

If you’ve got tons of files no problem, just couple this technique with the for command (Windows Systems) and you can loop through all the files in a directory.

Heres a quick tutorial on that command:


RemoteGlideRecord Revisited

So there was a request to bring back an old article on RemoteGlideRecord.  I am fairly certain ServiceNow will want to deprecate this Package.  I have tested the following in Eureka and it still works but I don’t know for how long.  Of course, even if you use this and it gets deprecated you always have the option of another integration type.

So what is RemoteGlideRecord?  It is a Package that allows you to use GlideRecord to query from one ServiceNow Instance to another.  If you are interested, behind the scenes this is executing a SOAP Request and uses Basic Authentication to authenticate to the second instance.

To create a basic instance of the Package use the following syntax.

var gr = new"", "TABLE");
gr.setBasicAuth("USER", "PASS");


Of course replace INSTANCE with your target instance, TABLE with the target TABLE and USER/PASS with the user and password.

WOAH!  Wait a second.  I don’t want to store my passwords in plain text in a script file!

Great point.  So here is an example of the Encrypter class.  You can encrypt and store passwords as properties and decrypt them when you need them.

var encrypter = new GlideEncrypter();
var encryptedPass = encrypter.encrypt("test");

gs.log( encrypter.decrypt(encryptedPass) );


Once we have the basic object set up the query can be executed.  Here is a sample of the code to run that query complete with some error checking to make sure the connection is valid.

if (gr.isValid()) {

while ( {

} else {
gs.print("not valid");


Notice that you cannot just dot.walk to the field name you must use getValue, getDisplayValue, getIntValue, getBooleanValue.

Likewise setting a value is done with setValue(field, value).

There are also a few configuration options which may or may not help you.

setAcceptGZIP(boolean) and setSendGZIP(boolean) obviously instruct the RemoteGlideRecord to send and receive GZIP.  This should be true.

setRedirectSupported(boolean) I can only assume tells RemoteGlideRecord to follow redirects, although I cannot test this theory.

setupProxy( host, port, user, pass ) seems like it can route the call through a proxy although I can think of no reason why that would ever happen.

setReturnDisplayValue(boolean) will turn of returning display values, if you aren’t planning on using them it can save some bytes off of what gets transferred.

setDebug(boolean) turns off and on debugging.  Off by default this will add invaluable log outputs that will definitely help if you don’t get connected straight away.

There is also a RemoteGlideAggregate which extends RemoteGlideRecord.  Seems to have the same methods as a standard GlideAggregate.  So there’s that to try as well.


Giving ServiceNow A Brain

In this, the first monthly project, I will be looking at trying to give ServiceNow the ability to automatically classify user input and suggest resolutions.

To start lets talk briefly about text classification.  I will say upfront that I am no expert in natural language processing.   I understand just enough to get myself in trouble.   For my purpose I will be using what is known as a Naive Bayes Classifier.

A super simple explanation is that based on some given data one can predict the probable output. This is done by creating a sort of map by training the system with previous data for which the output is already known.

The data that is important for text classification is word frequency and really anything that can be expressed in terms of data can be classified this way.

The intention will be to train the system based on a user input “description” and classify that text in a couple dimensions.  Possibly the type of resolution: Knowledge Base, Request, Incident and Category: Software, Hardware, Network and Topic.  The resulting classification will be fed into a ServiceNow application to make suggestions and automatically resolve the users issue if possible.

Since the libraries to do the classification are too large to bring them into ServiceNow I think the best solution would be to create a WebService Integration to a NodeJS app.  The integration will be able to add training data directly from ServiceNow and ask for a suggestion based on text.

The interface should accept users input and make suggestions which the user can accept or reject (and look for another solution.)  This could either be from the Ticket table or possibly a custom form, like a mock chat system.

Join me for the next post in this series where I will prototype the Node Service and Integration.  In the final post I will fully train the system and let end users try it.


sn_angular Project Started

After spending more time than I should have researching any out of box Angular directives that could be usable in custom pages I turned up not much.  There are some for the mobile interface but they are not created in a way that would be easily reusable.  I was also not sure if that would be changing so it would be a pretty unstable place to start.

Rather than wait I am starting my own project to recreate as much of the ServiceNow OOB features as Angular modules.

The project is located on github:

It is also dependent on an earlier gist until I can merge everything into a single Update Set.


Recreating The Form

The first step is to get a reliable model of the form fields.  Just using GlideRecord would not return enough information.  Remember we need all the attributes for a field, such as: type, mandatory, read only, length and so on.  This will allow us to create a fully functional form without having to do any custom coding.

To address this I have started ngGlideRecord which is meant to be a client callable Script Include which exposes a get function (meant to be like GlideRecord get) that returns a record with each fields full attributes.  For forms this will make it very easy to just iterate over the fields and output them immediately having access to all the attributes.

I also created a simple test UI Page that includes the core files and does a get for an Incident record (you’ll need to change the sys id if you try to recreate this test page).

The test page (which will eventually become a boilerplat and the Form Directive) has a simple switch to output the variable as an input text field if it is of type String.  The rest will just output the variable value.

Each type will eventually have a directive which recreates the standard ServiceNow functionality.

Be sure to watch the repository on github and check back here to get the latest.



After a ton of issues with the old site I have decided to reboot on WordPress 4.0.  This is going to be a lot cleaner and a lot easier to manage.

Most of the old content is no longer useful but what is I will selectively import and update.

In addition I will be bringing new content featuring tutorials on JavaScript and web development, integrations, best practices, administration tips and tricks and the latest ServiceNow news.

Thanks for visiting and check back often!  New content will be published weekly.