#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request::Common qw(GET POST);
my $ua = LWP::UserAgent->new;
$ua->timeout(300); #services start within 5 minutes or timeout
my ($user, $password, $serverName, $port, $requireEncryption) = getUserInput();
my $baseUrl ="http://$serverName:$port/arcgis";
my $token = getToken($baseUrl, $user, $password, $requireEncryption);
startService($baseUrl, $token, "Geometry", "GeometryServer");
sub getToken {
# Attempt to login securely. # If it fails and encryption required, tell user.
# If it fails and encryption not required, try insecure login. my ($baseUrl, $user, $password, $requireEncryption) = @_;
my $secureUrl = $baseUrl;
$secureUrl =~ s/http/https/;
$secureUrl =~ s/:6080/:6443/;
my $token = makeTokenRequest($secureUrl, $user, $password);
return $token if (defined $token);
if ($requireEncryption) {
print "Unable to login. Either the server doesn't support https, or the server name,\nusername, or password might be incorrect.\n\n";
exit(1);
$token = makeTokenRequest($baseUrl, $user, $password);
return $token if (defined $token);
print "Unable to get token. The server name, username, or password might be incorrect.\n";
exit(1);
sub makeTokenRequest {
my ($url, $user, $password) = @_;
my $response = makeHttpPost("$url/admin/generateToken", {username=>$user, password=>$password, client=>"requestip", expiration=>30, f=>'json'});
if ($response =~/\{\"token\"\:\"(.*)\",/) {
return $1;
} else {
return undef;
sub startService {
my($baseUrl, $token, $serviceName, $serviceType) = @_;
my $response = makeHttpPost("$baseUrl/admin/services/Utilities/$serviceName.$serviceType/start", {f=>'json', token=>$token});
if ($response eq "") {
print "ERROR: Unable to start the service. Unable to make http connection to server.\n";
} elsif ($response =~/success/) {
print "Service $serviceName.$serviceType successfully started.\n";
} elsif ($response =~ /"code":404/) {
print "Service $serviceName.$serviceType was not found. Please check for typos.\n";
sub makeHttpPost {
my $url = $_[0];
my %parameter = %{$_[1]};
my $req = HTTP::Request->new(POST => $url);
$req->content_type('application/x-www-form-urlencoded');
my $requestParameters = "";
foreach my $key ( keys %parameter) {
$requestParameters .= "$key=$parameter{$key}&"
$req->content($requestParameters);
my $res = $ua->request($req);
if ($res->is_success) {
return $res->content;
} else {
return "";
sub getUserInput {
my ($user, $password, $serverName, $port, $requireEncryption);
$serverName = "localhost";
$port = "6080";
$requireEncryption = 0;
if ($#ARGV < 0) {
print "This tool is a sample script that starts the Geometry service on a Server.\n\n";
print "\t-u\tArcGIS Server publisher or admin user. Required\n";
print "\t-p\tPassword for the user. Required.\n";
print "\t-s\tServer machine. Optional, default is localhost.\n";
print "\t-t\tPort. Optional, default is 6080.\n";
print "\t-e\tRequire secure login.\n";
print "\n\n\tExample: startGeometryService -u admin -p password.\n";
print "\tExample: startGeometryService -u admin -p password -s gis1.\n";
print "\tExample: startGeometryService -u admin -p password -e.\n";
print "\tExample: startGeometryService -u admin -p password -s gis1 -t 80.\n\n";
print "Warning: This script always tries to login securely through https (encrypted).\n";
print "If that fails, it tries an insecure login since ArcGIS Server may not be\n";
print "configured for https. Use the -e option to avoid ever using an insecure login.\n\n\n";
exit();
} else {
for my $i (0 .. $#ARGV) {
$user = $ARGV[$i+1] if ($ARGV[$i] eq "-u");
$password = $ARGV[$i+1] if ($ARGV[$i] eq "-p");
$serverName = $ARGV[$i+1] if ($ARGV[$i] eq "-s");
$port = $ARGV[$i+1] if ($ARGV[$i] eq "-t");
$requireEncryption = 1 if ($ARGV[$i] eq "-e");
if (! defined $user || ! defined $password) {
print "A user was not provided using the correct syntax.\n" if (! defined $user);
print "A password was not provided using the correct syntax.\n" if (! defined $password);
exit(1);
return ($user, $password, $serverName, $port, $requireEncryption);
}