package io.cattle.platform.register.api;
import io.cattle.platform.archaius.util.ArchaiusUtil;
import io.cattle.platform.core.model.Account;
import io.cattle.platform.iaas.api.request.handler.ScriptsHandler;
import io.cattle.platform.register.auth.RegistrationAuthTokenManager;
import io.cattle.platform.register.util.RegisterConstants;
import io.cattle.platform.server.context.ServerContext;
import io.cattle.platform.server.context.ServerContext.BaseProtocol;
import io.github.ibuildthecloud.gdapi.request.ApiRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.text.StrSubstitutor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.config.DynamicStringProperty;
public class RegisterScriptHandler implements ScriptsHandler {
private static final Logger log = LoggerFactory.getLogger(RegisterScriptHandler.class);
private static final DynamicStringProperty IMAGE = ArchaiusUtil.getString("agent.image");
private static final DynamicStringProperty SCRIPT = ArchaiusUtil.getString("agent.instance.register.script");
private static final DynamicStringProperty URL = ArchaiusUtil.getString("agent.instance.register.url");
RegistrationAuthTokenManager tokenManager;
@Override
public boolean handle(ApiRequest request) throws IOException {
String id = request.getId();
if (StringUtils.isBlank(id)) {
return false;
}
Account account = tokenManager.validateToken(id);
if (account == null) {
return false;
}
Map<String, String> tokens = new HashMap<String, String>();
tokens.put("CATTLE_URL", getUrl(request));
tokens.put("CATTLE_REGISTRATION_ACCESS_KEY", RegisterConstants.KIND_CREDENTIAL_REGISTRATION_TOKEN);
tokens.put("CATTLE_REGISTRATION_SECRET_KEY", id);
tokens.put("CATTLE_AGENT_IMAGE", IMAGE.get());
tokens.put("CATTLE_AGENT_IP", request.getClientIp());
String script = getScript();
if (script == null) {
return false;
}
script = new StrSubstitutor(tokens).replace(script);
request.getServletContext().getResponse().getOutputStream().write(script.getBytes("UTF-8"));
return true;
}
protected String getUrl(ApiRequest request) {
String url = URL.get();
if (!StringUtils.isBlank(url)) {
return url;
}
if (ServerContext.isCustomApiHost()) {
return ServerContext.getHostApiBaseUrl(BaseProtocol.HTTP);
}
return request.getUrlBuilder().version(request.getVersion()).toExternalForm();
}
protected String getScript() {
InputStream is = null;
try {
is = getClass().getClassLoader().getResourceAsStream(SCRIPT.get());
if (is == null) {
return null;
}
return IOUtils.toString(is, "UTF-8");
} catch (IOException e) {
log.error("Failed to read [{}]", SCRIPT.get(), e);
return null;
} finally {
IOUtils.closeQuietly(is);
}
}
public RegistrationAuthTokenManager getTokenManager() {
return tokenManager;
}
@Inject
public void setTokenManager(RegistrationAuthTokenManager tokenManager) {
this.tokenManager = tokenManager;
}
}