Skip to content
This repository was archived by the owner on Jan 17, 2023. It is now read-only.

Commit 4f2430e

Browse files
author
Alex Collins
committed
Merge pull request #136 from atc-/0.98.0
0.98.0
2 parents d3a00cf + 3de0daf commit 4f2430e

26 files changed

+105
-30
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ The application boasts the following features:
2424

2525
* Custom deployment context (e.g. /reg-ui)
2626

27-
* Exposes the webapp's configuration data as a volume for use with data-containers or simple host directory storage
27+
* Read only mode for preventing registry configuration changes once running
28+
29+
* Stateless application
2830

2931
## Demo
3032

@@ -74,6 +76,11 @@ You can deploy this container in a custom context as such:
7476

7577
will expose the container under `http://localhost/ui`.
7678

79+
## Read Only Mode
80+
81+
Using the container parameter `-e READ_ONLY=true` will enable read only mode, which prevents manipulation of the
82+
registry configurations at runtime.
83+
7784
# License
7885

7986
As of release 0.9.5, this project is licenced under GPL v3.0. See the LICENSE file.

application.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Grails Metadata file
22
#Wed Jul 09 18:55:10 BST 2014
3-
app.grails.version=2.4.2
3+
app.grails.version=2.4.4
44
app.name=docker-registry-ui
5-
app.version=0.96.0
5+
app.version=0.98.0

build-deploy.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/bash
22
./grailsw war docker-registry-ui.war && \
3-
scp docker-registry-ui.war $1:$2
3+
docker build .
44

grails-app/conf/BootStrap.groovy

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import docker.registry.web.Registry
2+
import docker.registry.web.Setting
23
import docker.registry.web.User
34

4-
class BootStrap {
5+
public class BootStrap {
56

67
def init = { servletContext ->
78
if (!User.findByUsername("admin")) {
@@ -12,30 +13,45 @@ class BootStrap {
1213
}
1314

1415
log.info("Checking for registries in system env")
15-
System.getenv().each { key, urlStr ->
16+
System.getenv().each { key, val ->
1617
if (key.matches("REG(\\d)")) {
17-
log.info("Found registry $urlStr. Creating...")
18-
def reg = Registry.fromUrl(urlStr)
19-
20-
if (reg) {
21-
if (Registry.findByHostAndApiVersion(reg.host, reg.apiVersion)) {
22-
log.info("Not creating registry ${urlStr} as it already exists")
23-
} else {
24-
log.info("Registry ${reg} doesn't exist; saving")
25-
reg.save()
26-
}
27-
28-
if (!reg.ping()) {
29-
log.warn("Registry '${reg.toUrl()}' ping failed! Check it's up!")
30-
}
31-
32-
} else {
33-
log.error("Couldn't parse valid registry URL from $urlStr")
34-
}
18+
handleRegistry(val)
19+
} else if ("READ_ONLY".equalsIgnoreCase(key)) {
20+
handleReadOnlyMode(val)
3521
}
3622
}
3723
}
3824

25+
def handleReadOnlyMode(String val) {
26+
if (val?.matches("true|false")) {
27+
new Setting(name: "READ_ONLY", value: val.toString()).save()
28+
log.info("Read only mode enabled")
29+
} else {
30+
log.error("Ignoring value ${val} for READ_ONLY mode; it's not valid")
31+
}
32+
}
33+
34+
def handleRegistry(final String val) {
35+
log.info("Found registry $val. Creating...")
36+
def reg = Registry.fromUrl(val)
37+
38+
if (reg) {
39+
if (Registry.findByHostAndApiVersion(reg.host, reg.apiVersion)) {
40+
log.info("Not creating registry ${val} as it already exists")
41+
} else {
42+
log.info("Registry ${reg} doesn't exist; saving")
43+
reg.save()
44+
}
45+
46+
if (!reg.ping()) {
47+
log.warn("Registry '${reg.toUrl()}' ping failed! Check it's up!")
48+
}
49+
50+
} else {
51+
log.error("Couldn't parse valid registry URL from $val")
52+
}
53+
}
54+
3955
def destroy = {
4056
}
4157
}

grails-app/conf/UrlMappings.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ class UrlMappings {
1010
"/"(view:"/index")
1111
"/about"(view:"/about")
1212
"500"(view:'/error')
13+
"403"(view:'/forbidden')
1314
}
1415
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package docker.registry.ui
2+
import docker.registry.web.Setting
3+
4+
class SettingFilters {
5+
6+
def filters = {
7+
all(controller: '*', action: 'save|update|delete|edit') {
8+
before = {
9+
def setting = Setting.findByName("READ_ONLY")
10+
if (setting?.value) {
11+
log.info("Read only mode is enabled; rejecting request")
12+
response.status = 403
13+
flash.message = "Read only mode enabled. Save, edit and update actions are prohibited" //FIXME externalise
14+
render(view:'/forbidden')
15+
return false
16+
}
17+
}
18+
}
19+
}
20+
}

grails-app/domain/docker/registry/web/Setting.groovy

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package docker.registry.web
33
class Setting {
44

55
String name
6-
String description
76
String value
87

98
static constraints = {

grails-app/i18n/messages.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,4 @@ labels.registry.host=Hostname
9090
labels.registry.port=Port
9191
labels.registry.username=Username
9292
labels.registry.password=Password
93+
image.delete.prohibited=Delete prohibited. Is read only mode enabled?

grails-app/i18n/messages_cs_CZ.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,4 @@ labels.registry.host=Hostname
8888
labels.registry.port=Port
8989
labels.registry.username=Username
9090
labels.registry.password=Password
91+
image.delete.prohibited=Delete prohibited. Is read only mode enabled?

grails-app/i18n/messages_da.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,4 +88,5 @@ labels.registry.host=Hostname
8888
labels.registry.port=Port
8989
labels.registry.username=Username
9090
labels.registry.password=Password
91+
image.delete.prohibited=Delete prohibited. Is read only mode enabled?
9192

0 commit comments

Comments
 (0)