package org.jenkinsci.plugins.github.webhook.subscriber; import com.cloudbees.jenkins.GitHubRepositoryName; import hudson.Extension; import hudson.model.Item; import java.io.IOException; import java.io.StringReader; import java.util.Set; import javax.inject.Inject; import org.jenkinsci.plugins.github.admin.GitHubHookRegisterProblemMonitor; import org.jenkinsci.plugins.github.extension.GHEventsSubscriber; import org.kohsuke.github.GHEvent; import org.kohsuke.github.GHEventPayload; import org.kohsuke.github.GHOrganization; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GitHub; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static com.google.common.collect.Sets.immutableEnumSet; import static org.kohsuke.github.GHEvent.PING; /** * Get ping events to log them * * @author lanwen (Merkushev Kirill) * @since 1.13.0 */ @Extension @SuppressWarnings("unused") public class PingGHEventSubscriber extends GHEventsSubscriber { private static final Logger LOGGER = LoggerFactory.getLogger(PingGHEventSubscriber.class); @Inject private transient GitHubHookRegisterProblemMonitor monitor; /** * This subscriber is not applicable to any item * * @param project ignored * @return always false */ @Override protected boolean isApplicable(Item project) { return false; } /** * @return set with only ping event */ @Override protected Set<GHEvent> events() { return immutableEnumSet(PING); } /** * Logs repo on ping event * * @param event only PING event * @param payload payload of gh-event. Never blank */ @Override protected void onEvent(GHEvent event, String payload) { GHEventPayload.Ping ping; try { ping = GitHub.offline().parseEventPayload(new StringReader(payload), GHEventPayload.Ping.class); } catch (IOException e) { LOGGER.warn("Received malformed PingEvent: " + payload, e); return; } GHRepository repository = ping.getRepository(); if (repository != null) { LOGGER.info("{} webhook received from repo <{}>!", event, repository.getHtmlUrl()); monitor.resolveProblem(GitHubRepositoryName.create(repository.getHtmlUrl().toExternalForm())); } else { GHOrganization organization = ping.getOrganization(); if (organization != null) { LOGGER.info("{} webhook received from org <{}>!", event, organization.getUrl()); } else { LOGGER.warn("{} webhook received with unexpected payload", event); } } } }