Modifying the proxies blocked status via scripting is not being retained - Sonatype Nexus Repository - Sonatype Community
Modifying the proxies blocked status via scripting is not being retained
post by chris.raposo on Feb 20, 2025
CHRISTOPHER RAPOSO
I have created a groovy script that is used for updating the a proxy repositories blocked status. The intent here is I need to automate sometimes flipping a handful of proxies to being blocked (my understanding is this will treat the proxy similar to hosted).
This is the script I had created:
import org.sonatype.nexus.repository.config.Configuration
import org.sonatype.nexus.repository.Repository
import org.sonatype.nexus.repository.manager.RepositoryManager
import groovy.json.JsonOutput;
import groovy.json.JsonSlurper;
parsed_args = new JsonSlurper().parseText(args)
def repositoryName = parsed_args.repositoryName
def isBlocked = parsed_args.isBlocked
def repositoryManager = container.lookup(org.sonatype.nexus.repository.manager.RepositoryManager.class.name)
def repository = repositoryManager.get(repositoryName)
if (repository == null) {
throw new IllegalStateException("Repository not found; unable to block. name: " + repositoryName)
}
if (!"proxy".equalsIgnoreCase(repository.getType().getValue())) {
throw new IllegalStateException("Repository is not a proxy repository; unable to block. name: " + repository.getName() + "; type: " + repository.getType().getValue())
}
def configuration = repository.getConfiguration()
if (configuration == null) {
throw new IllegalStateException("Repository configuration is null; unable to block. name: " + repository.getName())
}
def attributes = configuration.getAttributes()
if (attributes == null) {
throw new IllegalStateException("Repository attributes are null; unable to block. name: " + repository.getName())
}
def httpclient = attributes.get("httpclient")
if (httpclient == null) {
throw new IllegalStateException("Repository httpclient attributes are null; unable to block. name: " + repository.getName())
}
httpclient.put("blocked", isBlocked)
def result = [\
"params.repositoryName": repositoryName,\
"params.isBlocked": isBlocked,\
"httpclient.blocked": httpclient.get("blocked"),\
"result": httpclient.get("blocked") == isBlocked]
return JsonOutput.toJson(result)
When I run this script the response is what I would expect:
{
"name": "block-proxy-repository",
"result": "{\"params.repositoryName\":\"my-private-proxy\",\"params.isBlocked\":true,\"httpclient.blocked\":true,\"result\":true}"
}
But when I check the GUI in nexus the checkbox is not checked:
When I restart the nexus, the GUI remains the same and the rest api returns a reverted change:
"httpClient": {
"blocked": false,
"autoBlock": false,
...
This leads me to believe I am missing something in how to persist the repository change.
I know I could do this through the Rest API; the problem is I dont want to modify its httpClient.authentication parameters. What I am trying to do is: here is a list of proxies, flip there blocked status. I should be able to modify a single field without having to redefine the entire repository (this is why I went with scripting because from what I can tell you can’t modify single fields via the rest api without redefining everything).
post by mpiggott on Feb 20, 2025
You should never modify Configuration objects from running repositories. If you wish to update a repository use Configuration.copy(), modify the copy, then invoke RepositoryManager.update(updatedConfiguration).
post by chris.raposo on Feb 20, 2025
Thank you the missing part was RepositoryManager.update(updatedConfiguration); I also updated my script to perform the Configuration.copy()
Incase others are interested:
import groovy.json.JsonOutput; import groovy.json.JsonSlurper;
parsed_args = new JsonSlurper().parseText(args)
def repositoryName = parsed_args.repositoryName
def isBlocked = parsed_args.isBlocked
def repositoryManager = container.lookup(org.sonatype.nexus.repository.manager.RepositoryManager.class.name)
def repository = repositoryManager.get(repositoryName)
if (repository == null) { throw new IllegalStateException("Repository not found; unable to block. name: " + repositoryName) }
if (repository.getConfiguration() == null) { throw new IllegalStateException("Repository configuration is null; unable to block. name: " + repository.getName()) }
def configuration = repository.getConfiguration().copy() def attributes = configuration.getAttributes()
if (attributes == null) { throw new IllegalStateException("Repository attributes are null; unable to block. name: " + repository.getName()) }
httpclient.put("blocked", isBlocked)
repositoryManager.update(configuration)
return JsonOutput.toJson(result)