I’m trying to configure a health check on my Jamf servers. I can successfully health check a 200 status but Jamf will return a 200 status prior to being ready to process client requests. During this time period the Jamf webpage shows a progress bar and then switches to a login page. I’m trying to do a string validation but I’ve been unable to match the content on the page.
Here’s a return from a curl request:
`
<!-- 508 -->
<head id="login">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="0">
<meta HTTP-EQUIV="content-type" CONTENT="text/html;charset=utf-8">
<meta charset="utf-8" />
<meta name="description" content="" />
<meta name="author" content="JAMF Software" />
<meta name="apple-mobile-web-app-title" content="Jamf Pro">
<meta name="version" content="10.7.1-t1536934276">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Jamf Pro Login - Jamf Pro v10.7.1-t1536934276</title>
<base href="/">
<script type="text/javascript" id="setBaseHrefScript">
var a = document.createElement('a');
a.href = top.location + '';
var path = a.pathname; // defaults to '/' if not set in top.location
// Except in the case of IE, it may need '/' to be prepended.
if (path.slice(0, 1) !== '/') {
path = '/' + path;
}
var components = path.split('/');
var context = '/';
if (components.length > 1 && components[1] && components[1] !== 'view' && components[1] !== 'saml' && ! components[1].match(/^(.*\.html)|enroll?/)) {
context += components[1] + '/';
}
var base = document.getElementsByTagName('base')[0];
if (base) {
var serverBaseHref = base.getAttribute('href');
if (serverBaseHref !== context) {
base.setAttribute('href', context);
}
} else {
base = document.createElement('base');
base.setAttribute('href', context);
var script = document.getElementById('setBaseHrefScript');
script.parentNode.insertBefore(base, script);
}
</script>
<!-- For non-Retina iPhone, iPod Touch, and Android 2.1+ devices: --><link rel="apple-touch-icon-precomposed" href="ui/images/touchicons/touch-icon-iphone.png"><!-- For first- and second-generation iPad: --><link rel="apple-touch-icon-precomposed" sizes="72x72" href="ui/images/touchicons/touch-icon-ipad.png"><!-- For iPhone with high-resolution Retina display: --><link rel="apple-touch-icon-precomposed" sizes="114x114" href="ui/images/touchicons/touch-icon-iphone-retina.png"><!-- For third-generation iPad with high-resolution Retina display: --><link rel="apple-touch-icon-precomposed" sizes="144x144" href="ui/images/touchicons/touch-icon-ipad-retina.png"><link rel="mask-icon" color="#8DC63F" href="ui/images/touchicons/JSS_pinned.svg"><link rel="icon" href="ui/images/jamf-32-32-favicon.ico">
<!--[if lt IE 9]>
<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- C:* -->
<!-- inject:css --><link rel="stylesheet" type="text/css" id="main-stylesheet-link" href="ui/styles/main.css?v=1536937816933"><!-- endinject --><!-- inject:js --><script src="ui/jamf.js?v=1536937816933"></script><!-- endinject --><!-- systemjs:js --><script src="ui/systemjs.config.js?v=1536937816933"></script><!-- endinject --><script>var isLogin = document.head.id === 'login';
var isSetupAssistant = document.head.id === 'setupAssistant';
var isStartup = document.head.id === 'startup' || document.head.id == 'activation';
var config = 'ui/ui';
if (isLogin) {
config = 'ui/auth/loginApp';
} else if (isSetupAssistant) {
config = 'ui/setupAssistant/setupAssistant';
} else if (isStartup) {
config = 'ui/startup/startup';
}
var errorLogger = function (error) {
console.error(error);
};
SystemJS.set('cache-buster', SystemJS.newModule({
locate: function(load) {
return load.address + '?v=1536937816933';
}
}));
SystemJS.config({
packages: {
'.': {
meta: { '*.js': { loader: 'cache-buster' } }
}
}
});
SystemJS.import(config).catch(errorLogger);</script><!-- non-npm:js --><script src="ui/jamf-non-npm.js?v=1536937816933"></script><!-- endinject -->
</head>
<body class="login-page">
<div id="main-login-wrapper" class="unselectable " ng-controller="loginController as lc">
<div id="login-wrapper" ng-class="lc.language">
<div class="login-box">
<div id="jamf-logo-login">
<img src="ui/images/svg/logos/jamf-pro-color.svg" />
</div>
<form class="login-form" method="POST" name="f">
<div id="login-panel">
<div id="login-fields" ng-cloak>
<span class="label" translate='INPUT_USERNAME' translate-default='Username'> </span>
<input name="username" id="username" class="input" value="" autocapitalize="off" autocorrect="off"
ng-bind="lc.username" placeholder="ex. admin" />
<div class="login-separator"></div>
<span class="label" translate='INPUT_PASSWORD' translate-default='Password'> </span>
<input name="password" id="password" class="input" type="password" autocomplete="off"
ng-bind="lc.password" placeholder="••••••••••••" />
<button id="jssLoginButton" class="submit-button icon-arrow-1-circle-right button" type="submit" value="{{'LOG_IN' | translate}}"></button>
</div>
<div id="reset-fields">
<div class="reset-fields-lead">
<p class="reset-header" translate='RESET_PASSWORD' translate-default='Reset Password'> </p>
<p class="reset-body" translate="RESET_PASSWORD_INFO"> </p>
</div>
<div class="login-separator"></div>
<span class="label" translate='INPUT_USERNAME' translate-default='Username'> </span>
<input name="resetUsername" id="resetUsername" class="input" value=""
autocapitalize="off" autocorrect="off" placeholder="ex. admin" />
<input type="hidden" disabled="disabled" name="reset" value="reset" />
<button class="submit-button icon-arrow-1-circle-right button"
type="button" value="{{'RESET_PASSWORD' | translate}}" id="reset" onclick="sendResetPassword()"></button>
</div>
<div id="reset-sent-fields">
<p class="reset-sent-header" translate='RESET_EMAIL_SENT' translate-default='Reset Email Sent'> </p>
<p class="reset-sent-body" translate='CONTACT_JSS_ADMIN_MISSING_EMAIL' translate-default='Contact your Jamf Pro administrator if you do not receive it.'> </p>
<i class="submit-button icon-check-circle" onclick="hideResetPassword()"></i>
<div class="login-separator"></div>
<span class="label" translate='INPUT_USERNAME' translate-default='Username'> </span>
<input class="input" value=""
autocapitalize="off" autocorrect="off" placeholder="ex. admin" />
<input type="hidden" disabled="disabled" name="reset" value="reset"/>
</div>
</div>
</form>
</div>
<div class="reset-links-wrapper">
<jamf-copyright></jamf-copyright>
<div id="show-reset-link" class="reset-links" onclick="showResetPassword()">
<a translate='RESET_PASSWORD' translate-default='Reset Password'> </a><i class="submit-button icon-arrow-2-circle-right"></i>
</div>
<div id="show-login-link" class="reset-links" onclick="hideResetPassword()">
<i class="submit-button icon-arrow-2-circle-left"></i><a translate='LOGIN' translate-default='Login'> </a>
</div>
</div>
</div>
</div>
<script>
function setDefaultField(){
document.addEventListener("angularReady", function() {
document.getElementById('username').focus();
});
}
function showResetPassword(){
document.getElementById("login-wrapper").className="show-reset-fields";
document.getElementsByName("reset")[0].removeAttribute("disabled");
}
function hideResetPassword(){
document.getElementById("login-wrapper").className="show-login-fields";
document.getElementsByName("reset")[0].setAttribute("disabled", "true");
}
document.getElementById("reset").onclick = function() {
document.forms['f'].submit();
};
</script>
</body>
</html>
I’ve also discovered this url that actually does have some content but it doesn’t seem to work when I try to match the string “Powered” or “Jamf” either:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<link href="../stylesheets/bootstrap/css/bootstrap.min.css" rel="stylesheet" />
<link type="text/css" rel="stylesheet" href="../stylesheets/enrollment.css" />
<link type="text/css" rel="stylesheet" href="../stylesheets/enrollmentBase.css" />
<meta content="minimum-scale=1.0, width=device-width, maximum-scale=0.6667, user-scalable=no" name="viewport" />
<script type="text/javascript" src="../javascripts/jquery/jquery.js"></script>
<script type="text/javascript" src="../javascripts/enrollment.js"></script>
<script type="text/javascript" src="../javascripts/jamf-ajaxTimeout.js"></script>
<script type="text/javascript" src="../javascripts/jamf-enrollment-monitor.js"></script>
<script type="text/javascript" src="../javascripts/jamf-enrollment-device.js"></script>
<title>Enroll Your Device</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-3">
</div>
<div class="col-md-6">
<div class="jumbotron">
<form method="post" target="" name="f">
<input type="hidden" name="lastPage" value="unhandled.jsp" />
<input type="hidden" name="payload" id="payload" value="" />
<style>
.form-control-feedback{
top: 6px;
}
</style>
<script>
function toggleType(v){
document.getElementById("deviceType").value=v;
document.f.submit()
}
</script>
<input type="hidden" name="deviceType" id="deviceType" value="">
<div class="form-group has-feedback">
<button class="btn btn-lg btn-default btn-block" type="button" onclick="javascript:toggleType('osx')">macOS</button>
<span id="osx-check" class="glyphicon glyphicon-ok form-control-feedback" style="display:none"></span>
</div>
<div class="form-group has-feedback">
<button class="btn btn-lg btn-default btn-block" type="button" onclick="javascript:toggleType('ios')">iOS</button>
<span id="ios-check" class="glyphicon glyphicon-ok form-control-feedback" style="display:none"></span>
</div>
<div class="form-group has-feedback">
<button class="btn btn-lg btn-default btn-block" type="button" onclick="javascript:toggleType('android')">Android</button>
<span id="android-check" class="glyphicon glyphicon-ok form-control-feedback" style="display:none"></span>
</div>
</form>
</div>
</div>
</div>
</div>
<footer class="footer">
Powered by <a href="https://www.jamf.com/" target="_blank">Jamf</a>
</footer>
</body>`
Any ideas?
edit: having trouble getting the formatting to work. Hopefully you’ll be able to understand.