├── .dockerignore ├── .gitignore ├── .travis.yml ├── Dockerfile ├── LICENSE ├── README.md ├── application.properties ├── build-deploy.sh ├── grails-app ├── assets │ ├── images │ │ ├── GitHub_Logo.png │ │ ├── animated-overlay.gif │ │ ├── apple-touch-icon-retina.png │ │ ├── apple-touch-icon.png │ │ ├── favicon.ico │ │ ├── github.png │ │ ├── grails_logo.png │ │ ├── icons │ │ │ ├── 185020 - macintosh.png │ │ │ ├── 185021 - bomb bug.png │ │ │ ├── 185022 - computer macintosh vintage.png │ │ │ ├── 185023 - computer imac.png │ │ │ ├── 185024 - computer imac.png │ │ │ ├── 185025 - ibook laptop.png │ │ │ ├── 185026 - laptop macbook streamline.png │ │ │ ├── 185027 - computer network streamline.png │ │ │ ├── 185028 - iphone streamline.png │ │ │ ├── 185029 - ipod streamline.png │ │ │ ├── 185030 - cook pan pot streamline.png │ │ │ ├── 185031 - shoes snickers streamline.png │ │ │ ├── 185032 - ipad streamline.png │ │ │ ├── 185033 - ipod music streamline.png │ │ │ ├── 185034 - ipod mini music streamline.png │ │ │ ├── 185035 - computer streamline.png │ │ │ ├── 185036 - remote control streamline.png │ │ │ ├── 185037 - browser streamline window.png │ │ │ ├── 185039 - earth globe streamline.png │ │ │ ├── 185040 - map pin streamline.png │ │ │ ├── 185041 - arrow streamline target.png │ │ │ ├── 185042 - edit modify streamline.png │ │ │ ├── 185043 - ink pen streamline.png │ │ │ ├── 185044 - pen streamline.png │ │ │ ├── 185045 - pen streamline.png │ │ │ ├── 185046 - design graphic tablet streamline tablet.png │ │ │ ├── 185047 - pen streamline.png │ │ │ ├── 185048 - pen streamline.png │ │ │ ├── 185049 - design pencil rule streamline.png │ │ │ ├── 185050 - eye dropper streamline.png │ │ │ ├── 185051 - crop streamline.png │ │ │ ├── 185052 - paint bucket streamline.png │ │ │ ├── 185053 - brush paint streamline.png │ │ │ ├── 185054 - painting roll streamline.png │ │ │ ├── 185055 - painting pallet streamline.png │ │ │ ├── 185056 - stamp streamline.png │ │ │ ├── 185057 - magic magic wand streamline.png │ │ │ ├── 185058 - grid lines streamline.png │ │ │ ├── 185059 - handle streamline vector.png │ │ │ ├── 185060 - magnet streamline.png │ │ │ ├── 185061 - photo pictures streamline.png │ │ │ ├── 185062 - camera photo streamline.png │ │ │ ├── 185063 - camera photo polaroid streamline.png │ │ │ ├── 185064 - picture streamline.png │ │ │ ├── 185065 - frame picture streamline.png │ │ │ ├── 185066 - picture streamline.png │ │ │ ├── 185067 - camera streamline video.png │ │ │ ├── 185068 - music note streamline.png │ │ │ ├── 185069 - headset sound streamline.png │ │ │ ├── 185070 - micro record streamline.png │ │ │ ├── 185071 - music speaker streamline.png │ │ │ ├── 185072 - book read streamline.png │ │ │ ├── 185074 - notebook streamline.png │ │ │ ├── 185075 - envellope mail streamline.png │ │ │ ├── 185076 - streamline suitcase travel.png │ │ │ ├── 185077 - first aid medecine shield streamline.png │ │ │ ├── 185078 - email mail streamline.png │ │ │ ├── 185079 - bubble comment streamline talk.png │ │ │ ├── 185080 - bubble love streamline talk.png │ │ │ ├── 185081 - speech streamline talk user.png │ │ │ ├── 185082 - man people streamline user.png │ │ │ ├── 185083 - like love streamline.png │ │ │ ├── 185084 - crown king streamline.png │ │ │ ├── 185085 - happy smiley streamline.png │ │ │ ├── 185086 - map streamline user.png │ │ │ ├── 185088 - lock locker streamline.png │ │ │ ├── 185089 - locker streamline unlock.png │ │ │ ├── 185091 - danger death delete destroy skull streamline.png │ │ │ ├── 185092 - clock streamline time.png │ │ │ ├── 185093 - dashboard speed streamline.png │ │ │ ├── 185094 - settings streamline.png │ │ │ ├── 185095 - settings streamline.png │ │ │ ├── 185096 - settings streamline.png │ │ │ ├── 185097 - database streamline.png │ │ │ ├── 185098 - streamline sync.png │ │ │ ├── 185099 - factory lift streamline warehouse.png │ │ │ ├── 185100 - caddie shop shopping streamline.png │ │ │ ├── 185101 - caddie shopping streamline.png │ │ │ ├── 185102 - receipt shopping streamline.png │ │ │ ├── 185103 - bag shopping streamline.png │ │ │ ├── 185104 - streamline umbrella weather.png │ │ │ ├── 185105 - drug medecine streamline syringue.png │ │ │ ├── 185106 - armchair chair streamline.png │ │ │ ├── 185107 - backpack streamline trekking.png │ │ │ ├── 185108 - chaplin hat movie streamline.png │ │ │ ├── 185109 - cocktail mojito streamline.png │ │ │ ├── 185110 - diving leisure sea sport streamline.png │ │ │ ├── 185111 - monocle mustache streamline.png │ │ │ ├── 185112 - barista coffee espresso streamline.png │ │ │ ├── 185113 - coffee streamline.png │ │ │ ├── 185114 - chef food restaurant streamline.png │ │ │ ├── 185115 - barbecue eat food streamline.png │ │ │ ├── 185116 - eat food hotdog streamline.png │ │ │ ├── 185117 - food ice cream streamline.png │ │ │ ├── 185118 - japan streamline tea.png │ │ │ ├── 185119 - eat food fork knife streamline.png │ │ │ ├── book_download.png │ │ │ ├── garbage.png │ │ │ ├── house.png │ │ │ └── link.png │ │ ├── skin │ │ │ ├── database_add.png │ │ │ ├── database_delete.png │ │ │ ├── database_edit.png │ │ │ ├── database_save.png │ │ │ ├── database_table.png │ │ │ ├── exclamation.png │ │ │ ├── house.png │ │ │ ├── information.png │ │ │ ├── shadow.jpg │ │ │ ├── sorted_asc.gif │ │ │ └── sorted_desc.gif │ │ ├── spinner.gif │ │ ├── springsource.png │ │ ├── ui-bg_diagonals-thick_18_b81900_40x40.png │ │ ├── ui-bg_diagonals-thick_20_666666_40x40.png │ │ ├── ui-bg_flat_10_000000_40x100.png │ │ ├── ui-bg_glass_100_f6f6f6_1x400.png │ │ ├── ui-bg_glass_100_fdf5ce_1x400.png │ │ ├── ui-bg_glass_65_ffffff_1x400.png │ │ ├── ui-bg_gloss-wave_35_f6a828_500x100.png │ │ ├── ui-bg_highlight-soft_100_eeeeee_1x100.png │ │ ├── ui-bg_highlight-soft_75_ffe45c_1x100.png │ │ ├── ui-icons_222222_256x240.png │ │ ├── ui-icons_228ef1_256x240.png │ │ ├── ui-icons_ef8c08_256x240.png │ │ ├── ui-icons_ffd27a_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ ├── javascripts │ │ ├── application.js │ │ └── bootstrap.min.js │ └── stylesheets │ │ ├── application.css │ │ ├── bootstrap.journal.css │ │ ├── bootswatch.min.css │ │ ├── errors.css │ │ ├── general.css │ │ ├── main.css │ │ └── mobile.css ├── conf │ ├── BootStrap.groovy │ ├── BuildConfig.groovy │ ├── Config.groovy │ ├── DataSource.groovy │ ├── UrlMappings.groovy │ ├── docker │ │ └── registry │ │ │ └── ui │ │ │ └── SettingFilters.groovy │ └── spring │ │ └── resources.groovy ├── controllers │ └── docker │ │ └── registry │ │ └── web │ │ ├── RegistryController.groovy │ │ ├── RepositoryController.groovy │ │ └── SearchController.groovy ├── domain │ └── docker │ │ └── registry │ │ └── web │ │ ├── Registry.groovy │ │ ├── Role.groovy │ │ ├── Setting.groovy │ │ ├── User.groovy │ │ └── UserRole.groovy ├── i18n │ ├── messages.properties │ ├── messages_cs_CZ.properties │ ├── messages_da.properties │ ├── messages_de.properties │ ├── messages_es.properties │ ├── messages_fr.properties │ ├── messages_it.properties │ ├── messages_ja.properties │ ├── messages_nb.properties │ ├── messages_nl.properties │ ├── messages_pl.properties │ ├── messages_pt_BR.properties │ ├── messages_pt_PT.properties │ ├── messages_ru.properties │ ├── messages_sv.properties │ ├── messages_th.properties │ └── messages_zh_CN.properties ├── services │ └── docker │ │ └── registry │ │ ├── ui │ │ └── RegistryViewService.groovy │ │ └── web │ │ ├── ImageService.groovy │ │ ├── RepositoryService.groovy │ │ └── SearchService.groovy ├── taglib │ └── docker │ │ └── registry │ │ └── ui │ │ └── UtilTagLib.groovy └── views │ ├── about.gsp │ ├── error.gsp │ ├── forbidden.gsp │ ├── index.gsp │ ├── layouts │ ├── footer.gsp │ ├── main.gsp │ └── nav.gsp │ ├── registry │ ├── _form.gsp │ ├── create.gsp │ ├── edit.gsp │ ├── index.gsp │ └── show.gsp │ ├── repository │ ├── delete.gsp │ ├── image-prompts.js.gsp │ ├── index.gsp │ └── show.gsp │ ├── search │ ├── index.gsp │ └── results.gsp │ ├── setting │ ├── _form.gsp │ ├── create.gsp │ ├── edit.gsp │ ├── index.gsp │ └── show.gsp │ └── status.gsp ├── grailsw.bat ├── grailsw.sh ├── src └── groovy │ └── docker │ └── registry │ └── web │ └── support │ ├── Container.groovy │ ├── ContainerConfig.groovy │ ├── Image.groovy │ ├── RegistryAction.groovy │ ├── RegistryReposView.groovy │ ├── Repository.groovy │ ├── Result.groovy │ ├── Search.groovy │ └── Tag.groovy ├── startup.sh ├── test ├── integration │ └── docker │ │ └── registry │ │ └── ui │ │ └── RepositoryServiceIntegrationTestSpec.groovy └── unit │ └── docker │ └── registry │ ├── ui │ ├── RegistryViewServiceSpec.groovy │ └── UtilTagLibSpec.groovy │ └── web │ ├── ImageServiceSpec.groovy │ ├── RegistryControllerSpec.groovy │ ├── RegistrySpec.groovy │ ├── RepositoryControllerSpec.groovy │ ├── RepositoryServiceSpec.groovy │ ├── RepositorySpec.groovy │ ├── SearchControllerSpec.groovy │ └── SearchServiceSpec.groovy ├── web-app └── WEB-INF │ ├── applicationContext.xml │ ├── sitemesh.xml │ └── tld │ ├── c.tld │ ├── fmt.tld │ ├── grails.tld │ ├── spring-form.tld │ └── spring.tld └── wrapper ├── grails-wrapper-runtime-2.4.4.jar ├── grails-wrapper.properties └── springloaded-1.2.1.RELEASE.jar /.dockerignore: -------------------------------------------------------------------------------- 1 | .*.swp 2 | .git 3 | target 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # .gitignore for Grails 1.2 and 1.3 2 | 3 | # web application files 4 | /web-app/WEB-INF/classes 5 | 6 | # default HSQL database files for production mode 7 | /prodDb.* 8 | 9 | # general HSQL database files 10 | *Db.properties 11 | *Db.script 12 | 13 | # logs 14 | /stacktrace.log 15 | /test/reports 16 | /logs 17 | 18 | # project release file 19 | /*.war 20 | 21 | # plugin release files 22 | /*.zip 23 | /plugin.xml 24 | 25 | # older plugin install locations 26 | /plugins 27 | /web-app/plugins 28 | 29 | # "temporary" build files 30 | /target 31 | 32 | .idea 33 | *.iml 34 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: groovy 2 | 3 | jdk: 4 | - oraclejdk8 5 | 6 | script: ./grailsw.sh war docker-registry-web.war 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu 2 | 3 | # Install java and tomcat 4 | RUN apt-get update && apt-get install -y tomcat9 openjdk-8-jdk curl 5 | RUN mkdir /var/lib/h2 && chmod a+rw /var/lib/h2 6 | RUN rm -rf /var/lib/tomcat9/webapps/* 7 | ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ 8 | 9 | # Install grails and project dependencies 10 | WORKDIR /work 11 | ADD grailsw.sh /work/grailsw.sh 12 | ADD wrapper /work/wrapper 13 | ADD application.properties /work/application.properties 14 | ADD grails-app/conf/BuildConfig.groovy /work/grails-app/conf/BuildConfig.groovy 15 | RUN ./grailsw.sh help 16 | 17 | # Add project files and build a war 18 | ADD . /work 19 | RUN ./grailsw.sh war 20 | RUN cp target/docker-registry-ui-*.war /var/lib/tomcat9/webapps/ROOT.war 21 | 22 | # Update catalina configuration 23 | WORKDIR /usr/share/tomcat9/bin/ 24 | ADD startup.sh /usr/share/tomcat9/bin/custom-startup.sh 25 | RUN chmod +x /usr/share/tomcat9/bin/custom-startup.sh 26 | 27 | # Clean up the installation 28 | RUN apt --purge autoremove -y curl \ 29 | && rm -rf /var/lib/apt/lists/* /var/cache/apt/* 30 | 31 | EXPOSE 8080 32 | VOLUME ["/var/lib/h2/", "/var/lib/tomcat9"] 33 | ENV CATALINA_BASE /var/lib/tomcat9 34 | CMD /usr/share/tomcat9/bin/custom-startup.sh 35 | 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Build Status](https://travis-ci.org/atc-/docker-registry-ui.svg?branch=master)](https://travis-ci.org/atc-/docker-registry-web) [![Gitter chat](https://badges.gitter.im/atc-/docker-registry-web.png)](https://gitter.im/atc-/docker-registry-web) 2 | 3 | This project is archived as it has not been maintained in years. There are alternatives as listed [here](https://www.cloudbees.com/blog/docker-guis). 4 | 5 | Docker Registry UI 6 | =================== 7 | 8 | A web UI for easy private/local Docker V1 or V2 Registry integration. 9 | 10 | Docker Registry UI is a mature, easy-to-use and fast web application for administering your Docker Registry through a sleek user interface. You can register one-to-many registries and then browse, search and delete images. 11 | 12 | ## Features 13 | 14 | The application boasts the following features: 15 | 16 | * View all images for all registries (one to many) 17 | 18 | * Further info. page for images for inspection of config. etc 19 | 20 | * Pull copy/paste shortcuts 21 | 22 | * Delete images 23 | 24 | * Search for images 25 | 26 | * Containerized via [Docker](https://registry.hub.docker.com/u/atcol/docker-registry-ui/) 27 | 28 | * Custom deployment context (e.g. /reg-ui) 29 | 30 | * Read only mode for preventing registry configuration changes once running 31 | 32 | * Stateless application 33 | 34 | ## Demo 35 | 36 | This project is containerized. You can run with docker right now by simply running: 37 | 38 | docker run -d -p 8080:8080 atcol/docker-registry-ui 39 | 40 | and browsing to localhost:8080/. 41 | 42 | ## Dependencies 43 | 44 | You need to have a running instance of `docker registry` that has a **search backend enabled**! See [this issue](https://github.com/atc-/docker-registry-web/issues/65#issuecomment-68060219) for further information. 45 | 46 | ## Statelessness 47 | 48 | The app' requires registry configuration which can be supplied once the app's running, or through container environment 49 | variables: 50 | 51 | docker run -d -p 8080:8080 -e REG1=http://dev:5000/v1/ -e REG2=http://prod/v1/ atcol/docker-registry-ui 52 | 53 | which will run the application and automatically register two registries at the hosts `dev` and `prod` respectively, 54 | both running API versions v1. You must provide URLs that include the API version. 55 | 56 | **Note:** don't use `localhost` in registry URLs! The host needs to be visible from inside the container, so `-e REG1=http://localhost/...` won't work because localhost will resolve to the container's IP. If registry is running on the host, then remember to use its IP: `172.17.42.1`. 57 | 58 | ## Volumes 59 | 60 | The webapp's configuration data is stored inside the container in a H2 database under `/var/lib/h2/`. You can hold this data on the host machine using the `-v` flag: 61 | 62 | docker run -d -p 8080:8080 -v /some/data/dir:/var/lib/h2 atcol/docker-registry-ui 63 | 64 | which survives container restarts. 65 | 66 | You could also use the data-container pattern using `--volumes-from`: 67 | 68 | docker run -d -v /var/lib/h2 --name="registry_web_data" ubuntu 69 | 70 | docker run -d -p 8080:8080 --volumes-from=registry_web_data atcol/docker-registry-ui 71 | 72 | Now all data will be kept in the `registry_web_data` container. 73 | 74 | ## Custom Deployment Context 75 | 76 | You can deploy this container in a custom context as such: 77 | 78 | `docker run -d -p 80:8080 -it -e APP_CONTEXT=ui -e REG1=http://172.17.42.1:5000/v1/ atcol/docker-registry-ui` 79 | 80 | will expose the container under `http://localhost/ui`. 81 | 82 | ## Read Only Mode 83 | 84 | Using the container parameter `-e READ_ONLY=true` will enable read only mode, which prevents manipulation of the 85 | registry configurations at runtime. 86 | 87 | # License 88 | 89 | As of release 0.9.5, this project is licenced under GPL v3.0. See the LICENSE file. 90 | 91 | # Troubleshooting 92 | 93 | ## My registry can't be found/seen by docker registry web! Help! 94 | 95 | If you're seeing error messages like `Connection to http://registry refused`, make sure you've configured the port and hostname correctly. **Do not** set the registry hostname to `localhost`, because the container will resolve this to itself (127.0.0.1). If the registry instance runs on the host machine (that which runs the container), then set the registry IP/hostname to `172.17.42.1`. Alternatively, you could use writable /etc/hosts as of Docker 1.2 and 'route' it that way. 96 | 97 | ## Registries behind HTTPS or `Ping failed: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated` 98 | You need to register the CA with the container's keystore; see [this issue](https://github.com/atcol/docker-registry-ui/issues/108#issuecomment-74063947). 99 | -------------------------------------------------------------------------------- /application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Sat Jan 06 14:46:27 GMT 2018 3 | app.grails.version=2.4.4 4 | app.name=docker-registry-ui 5 | app.version=0.99.0 6 | -------------------------------------------------------------------------------- /build-deploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ./grailsw.sh clean && \ 3 | ./grailsw.sh war docker-registry-ui.war && \ 4 | docker build . 5 | 6 | -------------------------------------------------------------------------------- /grails-app/assets/images/GitHub_Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/GitHub_Logo.png -------------------------------------------------------------------------------- /grails-app/assets/images/animated-overlay.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/animated-overlay.gif -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon-retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/apple-touch-icon-retina.png -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/apple-touch-icon.png -------------------------------------------------------------------------------- /grails-app/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/favicon.ico -------------------------------------------------------------------------------- /grails-app/assets/images/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/github.png -------------------------------------------------------------------------------- /grails-app/assets/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/grails_logo.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185020 - macintosh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185020 - macintosh.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185021 - bomb bug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185021 - bomb bug.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185022 - computer macintosh vintage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185022 - computer macintosh vintage.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185023 - computer imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185023 - computer imac.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185024 - computer imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185024 - computer imac.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185025 - ibook laptop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185025 - ibook laptop.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185026 - laptop macbook streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185026 - laptop macbook streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185027 - computer network streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185027 - computer network streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185028 - iphone streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185028 - iphone streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185029 - ipod streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185029 - ipod streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185030 - cook pan pot streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185030 - cook pan pot streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185031 - shoes snickers streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185031 - shoes snickers streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185032 - ipad streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185032 - ipad streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185033 - ipod music streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185033 - ipod music streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185034 - ipod mini music streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185034 - ipod mini music streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185035 - computer streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185035 - computer streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185036 - remote control streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185036 - remote control streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185037 - browser streamline window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185037 - browser streamline window.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185039 - earth globe streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185039 - earth globe streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185040 - map pin streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185040 - map pin streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185041 - arrow streamline target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185041 - arrow streamline target.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185042 - edit modify streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185042 - edit modify streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185043 - ink pen streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185043 - ink pen streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185044 - pen streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185044 - pen streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185045 - pen streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185045 - pen streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185046 - design graphic tablet streamline tablet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185046 - design graphic tablet streamline tablet.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185047 - pen streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185047 - pen streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185048 - pen streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185048 - pen streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185049 - design pencil rule streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185049 - design pencil rule streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185050 - eye dropper streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185050 - eye dropper streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185051 - crop streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185051 - crop streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185052 - paint bucket streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185052 - paint bucket streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185053 - brush paint streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185053 - brush paint streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185054 - painting roll streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185054 - painting roll streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185055 - painting pallet streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185055 - painting pallet streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185056 - stamp streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185056 - stamp streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185057 - magic magic wand streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185057 - magic magic wand streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185058 - grid lines streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185058 - grid lines streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185059 - handle streamline vector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185059 - handle streamline vector.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185060 - magnet streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185060 - magnet streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185061 - photo pictures streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185061 - photo pictures streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185062 - camera photo streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185062 - camera photo streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185063 - camera photo polaroid streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185063 - camera photo polaroid streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185064 - picture streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185064 - picture streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185065 - frame picture streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185065 - frame picture streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185066 - picture streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185066 - picture streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185067 - camera streamline video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185067 - camera streamline video.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185068 - music note streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185068 - music note streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185069 - headset sound streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185069 - headset sound streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185070 - micro record streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185070 - micro record streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185071 - music speaker streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185071 - music speaker streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185072 - book read streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185072 - book read streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185074 - notebook streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185074 - notebook streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185075 - envellope mail streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185075 - envellope mail streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185076 - streamline suitcase travel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185076 - streamline suitcase travel.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185077 - first aid medecine shield streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185077 - first aid medecine shield streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185078 - email mail streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185078 - email mail streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185079 - bubble comment streamline talk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185079 - bubble comment streamline talk.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185080 - bubble love streamline talk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185080 - bubble love streamline talk.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185081 - speech streamline talk user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185081 - speech streamline talk user.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185082 - man people streamline user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185082 - man people streamline user.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185083 - like love streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185083 - like love streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185084 - crown king streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185084 - crown king streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185085 - happy smiley streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185085 - happy smiley streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185086 - map streamline user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185086 - map streamline user.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185088 - lock locker streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185088 - lock locker streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185089 - locker streamline unlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185089 - locker streamline unlock.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185091 - danger death delete destroy skull streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185091 - danger death delete destroy skull streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185092 - clock streamline time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185092 - clock streamline time.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185093 - dashboard speed streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185093 - dashboard speed streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185094 - settings streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185094 - settings streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185095 - settings streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185095 - settings streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185096 - settings streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185096 - settings streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185097 - database streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185097 - database streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185098 - streamline sync.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185098 - streamline sync.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185099 - factory lift streamline warehouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185099 - factory lift streamline warehouse.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185100 - caddie shop shopping streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185100 - caddie shop shopping streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185101 - caddie shopping streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185101 - caddie shopping streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185102 - receipt shopping streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185102 - receipt shopping streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185103 - bag shopping streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185103 - bag shopping streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185104 - streamline umbrella weather.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185104 - streamline umbrella weather.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185105 - drug medecine streamline syringue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185105 - drug medecine streamline syringue.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185106 - armchair chair streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185106 - armchair chair streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185107 - backpack streamline trekking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185107 - backpack streamline trekking.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185108 - chaplin hat movie streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185108 - chaplin hat movie streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185109 - cocktail mojito streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185109 - cocktail mojito streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185110 - diving leisure sea sport streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185110 - diving leisure sea sport streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185111 - monocle mustache streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185111 - monocle mustache streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185112 - barista coffee espresso streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185112 - barista coffee espresso streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185113 - coffee streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185113 - coffee streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185114 - chef food restaurant streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185114 - chef food restaurant streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185115 - barbecue eat food streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185115 - barbecue eat food streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185116 - eat food hotdog streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185116 - eat food hotdog streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185117 - food ice cream streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185117 - food ice cream streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185118 - japan streamline tea.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185118 - japan streamline tea.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/185119 - eat food fork knife streamline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/185119 - eat food fork knife streamline.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/book_download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/book_download.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/garbage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/garbage.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/house.png -------------------------------------------------------------------------------- /grails-app/assets/images/icons/link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/icons/link.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/database_add.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/database_delete.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/database_edit.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/database_save.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/database_table.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/exclamation.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/house.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/information.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/shadow.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/spinner.gif -------------------------------------------------------------------------------- /grails-app/assets/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/springsource.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_diagonals-thick_18_b81900_40x40.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_diagonals-thick_20_666666_40x40.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_flat_10_000000_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_flat_10_000000_40x100.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_glass_100_f6f6f6_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_glass_100_f6f6f6_1x400.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_glass_100_fdf5ce_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_glass_100_fdf5ce_1x400.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_glass_65_ffffff_1x400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_glass_65_ffffff_1x400.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_gloss-wave_35_f6a828_500x100.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_highlight-soft_100_eeeeee_1x100.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-bg_highlight-soft_75_ffe45c_1x100.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-icons_222222_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-icons_222222_256x240.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-icons_228ef1_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-icons_228ef1_256x240.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-icons_ef8c08_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-icons_ef8c08_256x240.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-icons_ffd27a_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-icons_ffd27a_256x240.png -------------------------------------------------------------------------------- /grails-app/assets/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/grails-app/assets/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /grails-app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js. 2 | // 3 | // Any JavaScript file within this directory can be referenced here using a relative path. 4 | // 5 | // You're free to add application-wide JavaScript to this file, but it's generally better 6 | // to create separate JavaScript files as needed. 7 | // 8 | //= require jquery 9 | //= require_tree . 10 | //= require_self 11 | 12 | if (typeof jQuery !== 'undefined') { 13 | (function($) { 14 | $('#spinner').ajaxStart(function() { 15 | $(this).fadeIn(); 16 | }).ajaxStop(function() { 17 | $(this).fadeOut(); 18 | }); 19 | })(jQuery); 20 | } 21 | 22 | var SUCCESS_ALERT_HTML = "
\ 23 | \ 24 | Done! \ 25 |
"; 26 | 27 | var FAIL_ALERT_HTML = "
\ 28 | \ 29 | Error! \ 30 |
"; 31 | 32 | function showSuccess(msg) { 33 | $("#banner").prepend(SUCCESS_ALERT_HTML); 34 | $("#successMsg").innerText = msg 35 | } 36 | 37 | function showFail(msg) { 38 | $("#banner").prepend(FAIL_ALERT_HTML); 39 | $("#errMsg").innerText = msg 40 | } 41 | 42 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS file within this directory can be referenced here using a relative path. 6 | * 7 | * You're free to add application-wide styles to this file and they'll appear at the top of the 8 | * compiled file, but it's generally better to create a new file per style scope. 9 | * 10 | *= require main 11 | *= require mobile 12 | *= require_self 13 | */ 14 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/bootstrap.journal.css: -------------------------------------------------------------------------------- 1 | .niceTable { 2 | margin:0px;padding:0px; 3 | width:100%; 4 | border:1px solid #000000; 5 | 6 | -moz-border-radius-bottomleft:0px; 7 | -webkit-border-bottom-left-radius:0px; 8 | border-bottom-left-radius:0px; 9 | 10 | -moz-border-radius-bottomright:0px; 11 | -webkit-border-bottom-right-radius:0px; 12 | border-bottom-right-radius:0px; 13 | 14 | -moz-border-radius-topright:0px; 15 | -webkit-border-top-right-radius:0px; 16 | border-top-right-radius:0px; 17 | 18 | -moz-border-radius-topleft:0px; 19 | -webkit-border-top-left-radius:0px; 20 | border-top-left-radius:0px; 21 | }.niceTable table{ 22 | border-collapse: collapse; 23 | border-spacing: 0; 24 | width:100%; 25 | height:100%; 26 | margin:0px;padding:0px; 27 | }.niceTable tr:last-child td:last-child { 28 | -moz-border-radius-bottomright:0px; 29 | -webkit-border-bottom-right-radius:0px; 30 | border-bottom-right-radius:0px; 31 | } 32 | .niceTable table tr:first-child td:first-child { 33 | -moz-border-radius-topleft:0px; 34 | -webkit-border-top-left-radius:0px; 35 | border-top-left-radius:0px; 36 | } 37 | .niceTable table tr:first-child td:last-child { 38 | -moz-border-radius-topright:0px; 39 | -webkit-border-top-right-radius:0px; 40 | border-top-right-radius:0px; 41 | }.niceTable tr:last-child td:first-child{ 42 | -moz-border-radius-bottomleft:0px; 43 | -webkit-border-bottom-left-radius:0px; 44 | border-bottom-left-radius:0px; 45 | }.niceTable tr:hover td{ 46 | 47 | } 48 | .niceTable tr:nth-child(odd){ background-color:#e5e5e5; } 49 | .niceTable tr:nth-child(even) { background-color:#ffffff; }.niceTable td{ 50 | vertical-align:middle; 51 | 52 | 53 | border:1px solid #000000; 54 | border-width:0px 1px 1px 0px; 55 | text-align:left; 56 | padding:7px; 57 | font-size:10px; 58 | font-family:Arial; 59 | font-weight:normal; 60 | color:#000000; 61 | }.niceTable tr:last-child td{ 62 | border-width:0px 1px 0px 0px; 63 | }.niceTable tr td:last-child{ 64 | border-width:0px 0px 1px 0px; 65 | }.niceTable tr:last-child td:last-child{ 66 | border-width:0px 0px 0px 0px; 67 | } 68 | .niceTable tr:first-child td{ 69 | background:-o-linear-gradient(bottom, #cccccc 5%, #b2b2b2 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #cccccc), color-stop(1, #b2b2b2) ); 70 | background:-moz-linear-gradient( center top, #cccccc 5%, #b2b2b2 100% ); 71 | filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#cccccc", endColorstr="#b2b2b2"); background: -o-linear-gradient(top,#cccccc,b2b2b2); 72 | 73 | background-color:#cccccc; 74 | border:0px solid #000000; 75 | text-align:center; 76 | border-width:0px 0px 1px 1px; 77 | font-size:14px; 78 | font-family:Arial; 79 | font-weight:bold; 80 | color:#000000; 81 | } 82 | .niceTable tr:first-child:hover td{ 83 | background:-o-linear-gradient(bottom, #cccccc 5%, #b2b2b2 100%); background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #cccccc), color-stop(1, #b2b2b2) ); 84 | background:-moz-linear-gradient( center top, #cccccc 5%, #b2b2b2 100% ); 85 | filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#cccccc", endColorstr="#b2b2b2"); background: -o-linear-gradient(top,#cccccc,b2b2b2); 86 | 87 | background-color:#cccccc; 88 | } 89 | .niceTable tr:first-child td:first-child{ 90 | border-width:0px 0px 1px 0px; 91 | } 92 | .niceTable tr:first-child td:last-child{ 93 | border-width:0px 0px 1px 1px; 94 | } -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/bootswatch.min.css: -------------------------------------------------------------------------------- 1 | body{padding-top:50px}#banner{border-bottom:none}.page-header h1{font-size:4em}.bs-docs-section{margin-top:8em}.bs-component{position:relative}.bs-component .modal{position:relative;top:auto;right:auto;left:auto;bottom:auto;z-index:1;display:block}.bs-component .modal-dialog{width:90%}.bs-component .popover{position:relative;display:inline-block;width:220px;margin:20px}#source-button{position:absolute;top:0;right:0;z-index:100;font-weight:bold}.progress{margin-bottom:10px}footer{margin:5em 0}footer li{float:left;margin-right:1.5em;margin-bottom:1.5em}footer p{clear:left;margin-bottom:0}.splash{padding:4em 0 2em;background:#141d27;background:-moz-linear-gradient(70deg, #141d27 0, #233344 72%, #2c4055 89%, #39526e 100%);background:-webkit-gradient(linear, left bottom, right top, color-stop(0, #141d27), color-stop(72%, #233344), color-stop(89%, #2c4055), color-stop(100%, #39526e));background:-webkit-linear-gradient(70deg, #141d27 0, #233344 72%, #2c4055 89%, #39526e 100%);background:-o-linear-gradient(70deg, #141d27 0, #233344 72%, #2c4055 89%, #39526e 100%);background:-ms-linear-gradient(70deg, #141d27 0, #233344 72%, #2c4055 89%, #39526e 100%);background:linear-gradient(70deg, #141d27 0, #233344 72%, #2c4055 89%, #39526e 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#141d27', endColorstr='#39526e', GradientType=1);color:#fff;text-align:center}.splash h1{font-size:4em}.splash #social{margin:2em 0}.splash .alert{margin:2em 0}.splash .bsa{max-width:350px;margin:0 auto;background:none}.splash .bsa .one .bsa_it_ad{border:1px solid #3e4653 !important;border-color:rgba(255,255,255,0.2) !important}.splash .bsa a{color:#fff}.section-tout{padding:4em 0 3em;border-top:1px solid rgba(255,255,255,0.1);border-bottom:1px solid rgba(0,0,0,0.1);background-color:#eaf1f1}.section-tout .fa{margin-right:.5em}.section-tout p{margin-bottom:3em}.section-preview{padding:4em 0 4em}.section-preview .preview{margin-bottom:4em;background-color:#eaf1f1;border:1px solid rgba(0,0,0,0.1)}.section-preview .preview .options{padding:1em 2em 2em;border-top:1px solid rgba(0,0,0,0.1);text-align:center}.section-preview .preview .options p{margin-bottom:2em}.section-preview .dropdown-menu{text-align:left}.section-preview .lead{margin-bottom:2em}@media (max-width:767px){.section-preview .image img{width:100%}}.sponsor img{border:1px solid rgba(0,0,0,0.1);border-radius:4px}.sponsor a:hover{text-decoration:none}.bsa{padding:0}.bsa .one .bsa_it_ad{border:none !important;background-color:transparent !important}.bsa .one .bsa_it_ad .bsa_it_t,.bsa .one .bsa_it_ad .bsa_it_d{color:inherit !important}.bsa .one .bsa_it_ad .bsa_it_i{margin-bottom:0 !important}.bsa .one .bsa_it_p{display:none} -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/errors.css: -------------------------------------------------------------------------------- 1 | h1, h2 { 2 | margin: 10px 25px 5px; 3 | } 4 | 5 | h2 { 6 | font-size: 1.1em; 7 | } 8 | 9 | .filename { 10 | font-style: italic; 11 | } 12 | 13 | .exceptionMessage { 14 | margin: 10px; 15 | border: 1px solid #000; 16 | padding: 5px; 17 | background-color: #E9E9E9; 18 | } 19 | 20 | .stack, 21 | .snippet { 22 | margin: 0 25px 10px; 23 | } 24 | 25 | .stack, 26 | .snippet { 27 | border: 1px solid #ccc; 28 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 29 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 30 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 31 | } 32 | 33 | /* error details */ 34 | .error-details { 35 | border-top: 1px solid #FFAAAA; 36 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 37 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 38 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 39 | border-bottom: 1px solid #FFAAAA; 40 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 41 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 42 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 43 | background-color:#FFF3F3; 44 | line-height: 1.5; 45 | overflow: hidden; 46 | padding: 5px; 47 | padding-left:25px; 48 | } 49 | 50 | .error-details dt { 51 | clear: left; 52 | float: left; 53 | font-weight: bold; 54 | margin-right: 5px; 55 | } 56 | 57 | .error-details dt:after { 58 | content: ":"; 59 | } 60 | 61 | .error-details dd { 62 | display: block; 63 | } 64 | 65 | /* stack trace */ 66 | .stack { 67 | padding: 5px; 68 | overflow: auto; 69 | height: 150px; 70 | } 71 | 72 | /* code snippet */ 73 | .snippet { 74 | background-color: #fff; 75 | font-family: monospace; 76 | } 77 | 78 | .snippet .line { 79 | display: block; 80 | } 81 | 82 | .snippet .lineNumber { 83 | background-color: #ddd; 84 | color: #999; 85 | display: inline-block; 86 | margin-right: 5px; 87 | padding: 0 3px; 88 | text-align: right; 89 | width: 3em; 90 | } 91 | 92 | .snippet .error { 93 | background-color: #fff3f3; 94 | font-weight: bold; 95 | } 96 | 97 | .snippet .error .lineNumber { 98 | background-color: #faa; 99 | color: #333; 100 | font-weight: bold; 101 | } 102 | 103 | .snippet .line:first-child .lineNumber { 104 | padding-top: 5px; 105 | } 106 | 107 | .snippet .line:last-child .lineNumber { 108 | padding-bottom: 5px; 109 | } -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/mobile.css: -------------------------------------------------------------------------------- 1 | /* Styles for mobile devices */ 2 | 3 | @media screen and (max-width: 480px) { 4 | .nav { 5 | padding: 0.5em; 6 | } 7 | 8 | .nav li { 9 | margin: 0 0.5em 0 0; 10 | padding: 0.25em; 11 | } 12 | 13 | /* Hide individual steps in pagination, just have next & previous */ 14 | .pagination .step, .pagination .currentStep { 15 | display: none; 16 | } 17 | 18 | .pagination .prevLink { 19 | float: left; 20 | } 21 | 22 | .pagination .nextLink { 23 | float: right; 24 | } 25 | 26 | /* pagination needs to wrap around floated buttons */ 27 | .pagination { 28 | overflow: hidden; 29 | } 30 | 31 | /* slightly smaller margin around content body */ 32 | fieldset, 33 | .property-list { 34 | padding: 0.3em 1em 1em; 35 | } 36 | 37 | input, textarea { 38 | width: 100%; 39 | -moz-box-sizing: border-box; 40 | -webkit-box-sizing: border-box; 41 | -ms-box-sizing: border-box; 42 | box-sizing: border-box; 43 | } 44 | 45 | select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] { 46 | width: auto; 47 | } 48 | 49 | /* hide all but the first column of list tables */ 50 | .scaffold-list td:not(:first-child), 51 | .scaffold-list th:not(:first-child) { 52 | display: none; 53 | } 54 | 55 | .scaffold-list thead th { 56 | text-align: center; 57 | } 58 | 59 | /* stack form elements */ 60 | .fieldcontain { 61 | margin-top: 0.6em; 62 | } 63 | 64 | .fieldcontain label, 65 | .fieldcontain .property-label, 66 | .fieldcontain .property-value { 67 | display: block; 68 | float: none; 69 | margin: 0 0 0.25em 0; 70 | text-align: left; 71 | width: auto; 72 | } 73 | 74 | .errors ul, 75 | .message p { 76 | margin: 0.5em; 77 | } 78 | 79 | .error ul { 80 | margin-left: 0; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | import docker.registry.web.Registry 2 | import docker.registry.web.Setting 3 | import docker.registry.web.User 4 | 5 | public class BootStrap { 6 | 7 | def init = { servletContext -> 8 | if (!User.findByUsername("admin")) { 9 | def user = new User() 10 | user.password = "pleasechangeme" 11 | user.username = "admin" 12 | user.save(); 13 | } 14 | 15 | log.info("Checking for registries in system env") 16 | System.getenv().each { key, val -> 17 | if (key.matches("REG(\\d)")) { 18 | handleRegistry(val) 19 | } else if ("READ_ONLY".equalsIgnoreCase(key)) { 20 | handleReadOnlyMode(val) 21 | } 22 | } 23 | } 24 | 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.isPresent()) { 39 | reg = reg.get() 40 | if (Registry.findByHostAndApiVersion(reg.host, reg.apiVersion)) { 41 | log.info("Not creating registry ${val} as it already exists") 42 | } else { 43 | log.info("Registry ${reg} doesn't exist; saving") 44 | reg.save() 45 | } 46 | 47 | if (!reg.ping()) { 48 | log.warn("Registry '${reg.toUrl()}' ping failed! Check it's up!") 49 | } 50 | } else { 51 | log.error("Couldn't parse valid registry URL from $val") 52 | } 53 | } 54 | 55 | def destroy = { 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /grails-app/conf/BuildConfig.groovy: -------------------------------------------------------------------------------- 1 | grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0) 2 | grails.project.class.dir = "target/classes" 3 | grails.project.test.class.dir = "target/test-classes" 4 | grails.project.test.reports.dir = "target/test-reports" 5 | grails.project.work.dir = "target/work" 6 | grails.project.target.level = 1.6 7 | grails.project.source.level = 1.6 8 | //grails.project.war.file = "target/${appName}-${appVersion}.war" 9 | 10 | grails.project.fork = [ 11 | // configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required 12 | // compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true], 13 | 14 | // configure settings for the test-app JVM, uses the daemon by default 15 | // test: false, // [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true], 16 | // configure settings for the run-app JVM 17 | // run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false], 18 | // configure settings for the run-war JVM 19 | war : [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve: false], 20 | // configure settings for the Console UI JVM 21 | console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256] 22 | ] 23 | 24 | grails.project.dependency.resolver = "maven" // or ivy 25 | grails.project.dependency.resolution = { 26 | // inherit Grails' default dependencies 27 | inherits("global") { 28 | // specify dependency exclusions here; for example, uncomment this to disable ehcache: 29 | // excludes 'ehcache' 30 | } 31 | log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose' 32 | checksums true // Whether to verify checksums on resolve 33 | legacyResolve false 34 | // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility 35 | 36 | repositories { 37 | inherits true // Whether to inherit repository definitions from plugins 38 | 39 | grailsPlugins() 40 | grailsHome() 41 | mavenLocal() 42 | grailsCentral() 43 | mavenCentral() 44 | // uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories 45 | //mavenRepo "http://repository.codehaus.org" 46 | //mavenRepo "http://download.java.net/maven/2/" 47 | //mavenRepo "http://repository.jboss.com/maven2/" 48 | mavenRepo "https://repo1.maven.org/maven2/" 49 | } 50 | 51 | dependencies { 52 | // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g. 53 | // runtime 'mysql:mysql-connector-java:5.1.29' 54 | // runtime 'org.postgresql:postgresql:9.3-1101-jdbc41' 55 | 56 | compile "org.springframework:spring-orm:$springVersion" 57 | } 58 | 59 | plugins { 60 | // plugins for the build system only 61 | build ":tomcat:7.0.70" 62 | 63 | // plugins for the compile step 64 | compile ":scaffolding:2.1.2" 65 | compile ':cache:1.1.8' 66 | compile ':cache-ehcache:1.0.5' 67 | compile ':asset-pipeline:2.9.1' 68 | compile ":rest:0.8" 69 | compile ":jquery:1.11.1" 70 | compile ":jquery-ui:1.10.4" 71 | compile ":jquery-datatables:1.7.5" 72 | compile ":spring-security-core:2.0.0" 73 | 74 | // plugins needed at runtime but not for compilation 75 | runtime ":hibernate4:4.3.8.1" 76 | runtime ":database-migration:1.4.1" 77 | 78 | // Uncomment these to enable additional asset-pipeline capabilities 79 | //compile ":sass-asset-pipeline:1.7.4" 80 | //compile ":less-asset-pipeline:1.7.0" 81 | //compile ":coffee-asset-pipeline:1.7.0" 82 | //compile ":handlebars-asset-pipeline:1.3.0.3" 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | dataSource { 2 | pooled = true 3 | jmxExport = true 4 | driverClassName = "org.h2.Driver" 5 | username = "sa" 6 | password = "" 7 | } 8 | hibernate { 9 | cache.use_second_level_cache = true 10 | cache.use_query_cache = false 11 | // cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 12 | cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4 13 | singleSession = true // configure OSIV singleSession mode 14 | } 15 | 16 | // environment specific settings 17 | environments { 18 | development { 19 | dataSource { 20 | dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 21 | url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=SOCKET" 22 | } 23 | } 24 | test { 25 | dataSource { 26 | dbCreate = "update" 27 | url = "jdbc:h2:file:/tmp/docker-registry-ui/h2/testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=SOCKET" 28 | } 29 | } 30 | production { 31 | dataSource { 32 | dbCreate = "update" 33 | url = "jdbc:h2:file:/var/lib/h2/prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE;FILE_LOCK=SOCKET" 34 | properties { 35 | // See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation 36 | jmxEnabled = true 37 | initialSize = 5 38 | maxActive = 50 39 | minIdle = 5 40 | maxIdle = 25 41 | maxWait = 10000 42 | maxAge = 10 * 60000 43 | timeBetweenEvictionRunsMillis = 5000 44 | minEvictableIdleTimeMillis = 60000 45 | validationQuery = "SELECT 1" 46 | validationQueryTimeout = 3 47 | validationInterval = 15000 48 | testOnBorrow = true 49 | testWhileIdle = true 50 | testOnReturn = false 51 | jdbcInterceptors = "ConnectionState" 52 | defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?(.$format)?"{ 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/"(view:"/index") 11 | "/about"(view:"/about") 12 | "500"(view:'/error') 13 | "403"(view:'/forbidden') 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /grails-app/conf/docker/registry/ui/SettingFilters.groovy: -------------------------------------------------------------------------------- 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 | } 21 | -------------------------------------------------------------------------------- /grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /grails-app/controllers/docker/registry/web/RegistryController.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | 4 | 5 | import static org.springframework.http.HttpStatus.* 6 | import grails.transaction.Transactional 7 | 8 | @Transactional(readOnly = true) 9 | class RegistryController { 10 | 11 | static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 12 | 13 | def index(Integer max) { 14 | params.max = Math.min(max ?: 10, 100) 15 | respond Registry.list(params), model:[registryInstanceCount: Registry.count()] 16 | } 17 | 18 | def show(Registry registryInstance) { 19 | //FIXME this is really inefficient 20 | boolean isUp = registryInstance != null && registryInstance.ping() 21 | respond registryInstance, model: [registryIsUp: isUp] 22 | } 23 | 24 | def create() { 25 | respond new Registry(params) 26 | } 27 | 28 | @Transactional 29 | def save(Registry registryInstance) { 30 | if (registryInstance == null) { 31 | notFound() 32 | return 33 | } 34 | 35 | if (registryInstance.hasErrors()) { 36 | respond registryInstance.errors, view:'create' 37 | return 38 | } 39 | 40 | registryInstance.save flush:true 41 | 42 | request.withFormat { 43 | form multipartForm { 44 | flash.message = message(code: 'default.created.message', args: [message(code: 'registry.label', default: 'Registry'), registryInstance.id]) 45 | redirect registryInstance 46 | } 47 | '*' { respond registryInstance, [status: CREATED] } 48 | } 49 | } 50 | 51 | def edit(Registry registryInstance) { 52 | respond registryInstance 53 | } 54 | 55 | @Transactional 56 | def update(Registry registryInstance) { 57 | if (registryInstance == null) { 58 | notFound() 59 | return 60 | } 61 | 62 | if (registryInstance.hasErrors()) { 63 | respond registryInstance.errors, view:'edit' 64 | return 65 | } 66 | 67 | registryInstance.save flush:true 68 | 69 | request.withFormat { 70 | form multipartForm { 71 | flash.message = message(code: 'default.updated.message', args: [message(code: 'Registry.label', default: 'Registry'), registryInstance.id]) 72 | redirect registryInstance 73 | } 74 | '*'{ respond registryInstance, [status: OK] } 75 | } 76 | } 77 | 78 | @Transactional 79 | def delete(Registry registryInstance) { 80 | 81 | if (registryInstance == null) { 82 | notFound() 83 | return 84 | } 85 | 86 | registryInstance.delete flush:true 87 | 88 | request.withFormat { 89 | form multipartForm { 90 | flash.message = message(code: 'default.deleted.message', args: [message(code: 'Registry.label', default: 'Registry'), registryInstance.id]) 91 | redirect action:"index", method:"GET" 92 | } 93 | '*'{ render status: NO_CONTENT } 94 | } 95 | } 96 | 97 | protected void notFound() { 98 | request.withFormat { 99 | form multipartForm { 100 | flash.message = message(code: 'default.not.found.message', args: [message(code: 'registry.label', default: 'Registry'), params.id]) 101 | redirect action: "index", method: "GET" 102 | } 103 | '*'{ render status: NOT_FOUND } 104 | } 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /grails-app/controllers/docker/registry/web/RepositoryController.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.Repository 4 | import docker.registry.web.support.RegistryReposView 5 | 6 | class RepositoryController { 7 | 8 | def repositoryService 9 | def registryViewService 10 | static allowedMethods = [delete: 'DELETE'] 11 | 12 | def index() { 13 | def registries = registryViewService.viewRegistries() 14 | render view: "index", model: [registryViewSet: registries] 15 | } 16 | 17 | def show(final int registryId, final String repoName, final String tag, final String imgId) { 18 | def reg = Registry.get(registryId) 19 | Repository repository = null 20 | 21 | if (reg) { 22 | repository = repositoryService.detail(reg, repoName) 23 | } 24 | 25 | if (!reg || !repository) { 26 | response.status = 404 27 | } 28 | 29 | render view: "show", model: [registry: reg, img: repository.images.find { it.id.equals(imgId)}] 30 | } 31 | 32 | def delete() { 33 | def repoName = params.repoName 34 | def registry = params.registry 35 | def tag = params.tag 36 | log.info("Deleting image $repoName for registry $registry and tag $tag") 37 | def reg = Registry.get(registry) 38 | log.info("Got registry by id $registry ? $reg") 39 | if (reg) { 40 | repositoryService.delete(reg, repoName, tag) 41 | } else { 42 | response.status = 404 43 | } 44 | render view: "delete" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /grails-app/controllers/docker/registry/web/SearchController.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.Search 4 | 5 | class SearchController { 6 | 7 | def searchService 8 | 9 | def index() { } 10 | 11 | def search(String q) { 12 | final resultMap = searchService.searchAll(new Search(query: q)) 13 | render view: "results", model: [registryToRepoMap: resultMap] 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /grails-app/domain/docker/registry/web/Registry.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.RegistryAction 4 | 5 | import javax.swing.text.html.Option 6 | 7 | class Registry { 8 | String host = "localhost" 9 | int port 10 | String apiVersion = "v1" 11 | String username 12 | String password 13 | String protocol = "http" 14 | 15 | def repositoryService 16 | 17 | static constraints = { 18 | username nullable: true 19 | password nullable: true 20 | } 21 | 22 | static transients = ['toUrl', 'repositories', 'ping', 'fromUrl'] 23 | 24 | String toUrl() { 25 | def resolvedPort = this.port == 80 || this.port <= 0 ? "" : ":" + this.port; 26 | def urlString = "${this.protocol}://${this.host}${resolvedPort}/${this.apiVersion}" 27 | if (username) { 28 | if (password) urlString = urlString.replace("://", "://$username:$password@") 29 | else urlString = urlString.replace("://", "://$username@") 30 | } 31 | urlString 32 | } 33 | 34 | URL toUrl(RegistryAction registryAction) { 35 | switch (registryAction) { 36 | case RegistryAction.PING: return new URL(this.apiVersion == "v1" ? "${this.toUrl()}/_ping" : "${this.toUrl()}/_catalog") 37 | case RegistryAction.SEARCH: return new URL(this.apiVersion == "v1" ? "${this.toUrl()}/search" : "${this.toUrl()}/_catalog") 38 | default: return null; 39 | } 40 | } 41 | 42 | def getRepositories() { 43 | repositoryService.index(this) 44 | } 45 | 46 | def ping() { 47 | repositoryService.ping(this) 48 | } 49 | 50 | /** 51 | * Static factory method for creating an instance from a URL. 52 | * @param urlStr a url in the format: http://hostOrIP:OptionalPort/v1/ 53 | **/ 54 | static Optional fromUrl(final String urlStr) { 55 | if (urlStr?.endsWith("/v1/") || urlStr?.endsWith("/v2/")) { 56 | def url = urlStr.toURL() 57 | if (url) { 58 | def auth = url.userInfo?.split(":") 59 | return Optional.of(new Registry( 60 | protocol: url.protocol, 61 | host: url.host, 62 | port: url.port == -1 ? 80 : url.port, 63 | apiVersion: url.path.replaceAll("\\p{Punct}", ""), 64 | username: auth?.length > 0 ? auth[0] : null, 65 | password: auth?.length > 1 ? auth[1] : null 66 | )) 67 | } 68 | } 69 | Optional.empty() 70 | } 71 | 72 | @Override 73 | public String toString() { 74 | return "Registry{" + 75 | "id=" + id + 76 | ", protocol='" + protocol + '\'' + 77 | ", host='" + host + '\'' + 78 | ", port=" + port + 79 | ", apiVersion='" + apiVersion + '\'' + 80 | ", username='" + username + '\'' + 81 | ", password='" + password?.replaceAll("(?s).", "*") + '\'' + 82 | ", repositoryService=" + repositoryService + 83 | ", version=" + version + 84 | '}'; 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /grails-app/domain/docker/registry/web/Role.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | class Role { 4 | 5 | String authority 6 | 7 | static mapping = { 8 | cache true 9 | } 10 | 11 | static constraints = { 12 | authority blank: false, unique: true 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /grails-app/domain/docker/registry/web/Setting.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | class Setting { 4 | 5 | String name 6 | String value 7 | 8 | static constraints = { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/domain/docker/registry/web/User.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | class User { 4 | 5 | transient springSecurityService 6 | 7 | String username 8 | String password 9 | boolean enabled = true 10 | boolean accountExpired 11 | boolean accountLocked 12 | boolean passwordExpired 13 | 14 | static transients = ['springSecurityService'] 15 | 16 | static constraints = { 17 | username blank: false, unique: true 18 | password blank: false 19 | } 20 | 21 | static mapping = { 22 | password column: '`password`' 23 | } 24 | 25 | Set getAuthorities() { 26 | UserRole.findAllByUser(this).collect { it.role } 27 | } 28 | 29 | def beforeInsert() { 30 | encodePassword() 31 | } 32 | 33 | def beforeUpdate() { 34 | if (isDirty('password')) { 35 | encodePassword() 36 | } 37 | } 38 | 39 | protected void encodePassword() { 40 | password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /grails-app/domain/docker/registry/web/UserRole.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import org.apache.commons.lang.builder.HashCodeBuilder 4 | 5 | class UserRole implements Serializable { 6 | 7 | private static final long serialVersionUID = 1 8 | 9 | User user 10 | Role role 11 | 12 | boolean equals(other) { 13 | if (!(other instanceof UserRole)) { 14 | return false 15 | } 16 | 17 | other.user?.id == user?.id && 18 | other.role?.id == role?.id 19 | } 20 | 21 | int hashCode() { 22 | def builder = new HashCodeBuilder() 23 | if (user) builder.append(user.id) 24 | if (role) builder.append(role.id) 25 | builder.toHashCode() 26 | } 27 | 28 | static UserRole get(long userId, long roleId) { 29 | UserRole.where { 30 | user == User.load(userId) && 31 | role == Role.load(roleId) 32 | }.get() 33 | } 34 | 35 | static boolean exists(long userId, long roleId) { 36 | UserRole.where { 37 | user == User.load(userId) && 38 | role == Role.load(roleId) 39 | }.count() > 0 40 | } 41 | 42 | static UserRole create(User user, Role role, boolean flush = false) { 43 | def instance = new UserRole(user: user, role: role) 44 | instance.save(flush: flush, insert: true) 45 | instance 46 | } 47 | 48 | static boolean remove(User u, Role r, boolean flush = false) { 49 | if (u == null || r == null) return false 50 | 51 | int rowCount = UserRole.where { 52 | user == User.load(u.id) && 53 | role == Role.load(r.id) 54 | }.deleteAll() 55 | 56 | if (flush) { UserRole.withSession { it.flush() } } 57 | 58 | rowCount > 0 59 | } 60 | 61 | static void removeAll(User u, boolean flush = false) { 62 | if (u == null) return 63 | 64 | UserRole.where { 65 | user == User.load(u.id) 66 | }.deleteAll() 67 | 68 | if (flush) { UserRole.withSession { it.flush() } } 69 | } 70 | 71 | static void removeAll(Role r, boolean flush = false) { 72 | if (r == null) return 73 | 74 | UserRole.where { 75 | role == Role.load(r.id) 76 | }.deleteAll() 77 | 78 | if (flush) { UserRole.withSession { it.flush() } } 79 | } 80 | 81 | static constraints = { 82 | role validator: { Role r, UserRole ur -> 83 | if (ur.user == null) return 84 | boolean existing = false 85 | UserRole.withNewSession { 86 | existing = UserRole.exists(ur.user.id, r.id) 87 | } 88 | if (existing) { 89 | return 'userRole.exists' 90 | } 91 | } 92 | } 93 | 94 | static mapping = { 95 | id composite: ['role', 'user'] 96 | version false 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /grails-app/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}] 2 | default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL 3 | default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number 4 | default.invalid.email.message=Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address 5 | default.invalid.range.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid range from [{3}] to [{4}] 6 | default.invalid.size.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid size range from [{3}] to [{4}] 7 | default.invalid.max.message=Property [{0}] of class [{1}] with value [{2}] exceeds maximum value [{3}] 8 | default.invalid.min.message=Property [{0}] of class [{1}] with value [{2}] is less than minimum value [{3}] 9 | default.invalid.max.size.message=Property [{0}] of class [{1}] with value [{2}] exceeds the maximum size of [{3}] 10 | default.invalid.min.size.message=Property [{0}] of class [{1}] with value [{2}] is less than the minimum size of [{3}] 11 | default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation 12 | default.not.inlist.message=Property [{0}] of class [{1}] with value [{2}] is not contained within the list [{3}] 13 | default.blank.message=Property [{0}] of class [{1}] cannot be blank 14 | default.not.equal.message=Property [{0}] of class [{1}] with value [{2}] cannot equal [{3}] 15 | default.null.message=Property [{0}] of class [{1}] cannot be null 16 | default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must be unique 17 | 18 | default.paginate.prev=Previous 19 | default.paginate.next=Next 20 | default.boolean.true=True 21 | default.boolean.false=False 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} created 26 | default.updated.message={0} {1} updated 27 | default.deleted.message={0} {1} deleted 28 | default.not.deleted.message={0} {1} could not be deleted 29 | default.not.found.message={0} not found with id {1} 30 | default.optimistic.locking.failure=Another user has updated this {0} while you were editing 31 | 32 | default.home.label=Home 33 | default.list.label={0} List 34 | default.add.label=Add {0} 35 | default.new.label=New {0} 36 | default.create.label=Create {0} 37 | default.show.label=Show {0} 38 | default.edit.label=Edit {0} 39 | 40 | default.button.create.label=Create 41 | default.button.edit.label=Edit 42 | default.button.update.label=Update 43 | default.button.delete.label=Delete 44 | default.button.delete.confirm.message=Are you sure? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Property {0} must be a valid URL 48 | typeMismatch.java.net.URI=Property {0} must be a valid URI 49 | typeMismatch.java.util.Date=Property {0} must be a valid Date 50 | typeMismatch.java.lang.Double=Property {0} must be a valid number 51 | typeMismatch.java.lang.Integer=Property {0} must be a valid number 52 | typeMismatch.java.lang.Long=Property {0} must be a valid number 53 | typeMismatch.java.lang.Short=Property {0} must be a valid number 54 | typeMismatch.java.math.BigDecimal=Property {0} must be a valid number 55 | typeMismatch.java.math.BigInteger=Property {0} must be a valid number 56 | labels.search.query=Search\: 57 | nav.label={0} 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.protocol=Protocol (http|https) 77 | labels.registry.url=URL 78 | registry.apiVersion.label=API Version 79 | registry.apiVersion.label=Protocol (http|https) 80 | registry.url.label=URL 81 | ui.dialog.button.deleteTag=Delete tag 82 | registry.ping.failed=Ping failed\! 83 | registry.ping.succeeded=Ping succeeded 84 | labels.registry.ping=Pingable? 85 | registry.host.label=Hostname 86 | registry.port.label=Port 87 | registry.password.label=Password 88 | registry.username.label=Username 89 | labels.registry.host=Hostname 90 | labels.registry.port=Port 91 | labels.registry.username=Username 92 | labels.registry.password=Password 93 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 94 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_cs_CZ.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}] 2 | default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL 3 | default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty 4 | default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa 5 | default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 6 | default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 7 | default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}] 8 | default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}] 9 | default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}] 10 | default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}] 11 | default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací 12 | default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}] 13 | default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná 14 | default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}] 15 | default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná 16 | default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní 17 | 18 | default.paginate.prev=Předcházející 19 | default.paginate.next=Následující 20 | default.boolean.true=Pravda 21 | default.boolean.false=Nepravda 22 | default.date.format=dd. MM. yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} vytvořeno 26 | default.updated.message={0} {1} aktualizováno 27 | default.deleted.message={0} {1} smazáno 28 | default.not.deleted.message={0} {1} nelze smazat 29 | default.not.found.message={0} nenalezen s id {1} 30 | default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován 31 | 32 | default.home.label=Domů 33 | default.list.label={0} Seznam 34 | default.add.label=Přidat {0} 35 | default.new.label=Nový {0} 36 | default.create.label=Vytvořit {0} 37 | default.show.label=Ukázat {0} 38 | default.edit.label=Editovat {0} 39 | 40 | default.button.create.label=Vytvoř 41 | default.button.edit.label=Edituj 42 | default.button.update.label=Aktualizuj 43 | default.button.delete.label=Smaž 44 | default.button.delete.confirm.message=Jste si jistý? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Položka {0} musí být validní URL 48 | typeMismatch.java.net.URI=Položka {0} musí být validní URI 49 | typeMismatch.java.util.Date=Položka {0} musí být validní datum 50 | typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo 51 | typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo 52 | typeMismatch.java.lang.Long=Položka {0} musí být validní číslo 53 | typeMismatch.java.lang.Short=Položka {0} musí být validní číslo 54 | typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo 55 | typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] må ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Næste 20 | default.boolean.true=Sand 21 | default.boolean.false=Falsk 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} oprettet 26 | default.updated.message={0} {1} opdateret 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} er ikke fundet 30 | default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser 31 | 32 | default.home.label=Hjem 33 | default.list.label={0} Liste 34 | default.add.label=Tilføj {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opret {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Ret {0} 39 | 40 | default.button.create.label=Opret 41 | default.button.edit.label=Ret 42 | default.button.update.label=Opdater 43 | default.button.delete.label=Slet 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} skal være en valid URL 48 | typeMismatch.java.net.URI=Feltet {0} skal være en valid URI 49 | typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato 50 | typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal 51 | typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal 52 | typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal 53 | typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal 54 | typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal 55 | typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | 93 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | default.boolean.true=Verdadero 21 | default.boolean.false=Falso 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creado 26 | default.updated.message={0} {1} actualizado 27 | default.deleted.message={0} {1} eliminado 28 | default.not.deleted.message={0} {1} no puede eliminarse 29 | default.not.found.message=No se encuentra {0} con id {1} 30 | default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0} 31 | 32 | default.home.label=Principal 33 | default.list.label={0} Lista 34 | default.add.label=Agregar {0} 35 | default.new.label=Nuevo {0} 36 | default.create.label=Crear {0} 37 | default.show.label=Mostrar {0} 38 | default.edit.label=Editar {0} 39 | 40 | default.button.create.label=Crear 41 | default.button.edit.label=Editar 42 | default.button.update.label=Actualizar 43 | default.button.delete.label=Eliminar 44 | default.button.delete.confirm.message=¿Está usted seguro? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 48 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 49 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 50 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 51 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 52 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 53 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 54 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 55 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? -------------------------------------------------------------------------------- /grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | labels.search.query=Search\: 21 | nav.label=[0] 22 | app.name=Docker Registry Web 23 | ui.dialog.button.deleteImage=Delete image? 24 | image.delete.success="Deleted. Bye bye..." 25 | image.delete.failure="That failed. Please try again." 26 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 27 | image.pull.prompt=Copy & paste the following into a shell to pull 28 | image.delete.prompt.title=Delete image tag? 29 | image.pull.prompt.title=Pull an image 30 | labels.image.name=Image Name 31 | labels.image.id=Image Id 32 | labels.image.tag=Tag 33 | labels.image.pull=Pull 34 | labels.image.description=Description 35 | labels.image.config=Config. 36 | labels.image.created=Created 37 | labels.image.author=Author 38 | title.repository=Repositories 39 | labels.registry.apiVersion=API Version 40 | labels.registry.url=URL 41 | registry.apiVersion.label=API Version 42 | registry.url.label=URL 43 | ui.dialog.button.deleteTag=Delete tag 44 | registry.ping.failed=Ping failed\! 45 | registry.ping.succeeded=Ping succeeded 46 | labels.registry.ping=Pingable? 47 | registry.host.label=Hostname 48 | registry.port.label=Port 49 | registry.password.label=Password 50 | registry.username.label=Username 51 | labels.registry.host=Hostname 52 | labels.registry.port=Port 53 | labels.registry.username=Username 54 | labels.registry.password=Password 55 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo 20 | default.boolean.true=Vero 21 | default.boolean.false=Falso 22 | default.date.format=dd/MM/yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creato 26 | default.updated.message={0} {1} aggiornato 27 | default.deleted.message={0} {1} eliminato 28 | default.not.deleted.message={0} {1} non può essere eliminato 29 | default.not.found.message={0} non trovato con id {1} 30 | default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica 31 | 32 | default.home.label=Home 33 | default.list.label={0} Elenco 34 | default.add.label=Aggiungi {0} 35 | default.new.label=Nuovo {0} 36 | default.create.label=Crea {0} 37 | default.show.label=Mostra {0} 38 | default.edit.label=Modifica {0} 39 | 40 | default.button.create.label=Crea 41 | default.button.edit.label=Modifica 42 | default.button.update.label=Aggiorna 43 | default.button.delete.label=Elimina 44 | default.button.delete.confirm.message=Si è sicuri? 45 | 46 | # Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido 48 | typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido 49 | typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida 50 | typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido 51 | typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido 52 | typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido 53 | typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido 54 | typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido 55 | typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | default.boolean.true=はい 21 | default.boolean.false=いいえ 22 | default.date.format=yyyy/MM/dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0}(id:{1})を作成しました。 26 | default.updated.message={0}(id:{1})を更新しました。 27 | default.deleted.message={0}(id:{1})を削除しました。 28 | default.not.deleted.message={0}(id:{1})は削除できませんでした。 29 | default.not.found.message={0}(id:{1})は見つかりませんでした。 30 | default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 31 | 32 | default.home.label=ホーム 33 | default.list.label={0}リスト 34 | default.add.label={0}を追加 35 | default.new.label={0}を新規作成 36 | default.create.label={0}を作成 37 | default.show.label={0}詳細 38 | default.edit.label={0}を編集 39 | 40 | default.button.create.label=作成 41 | default.button.edit.label=編集 42 | default.button.update.label=更新 43 | default.button.delete.label=削除 44 | default.button.delete.confirm.message=本当に削除してよろしいですか? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 48 | typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 49 | typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 50 | typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 51 | typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 52 | typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 53 | typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 54 | typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 55 | typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nb.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke et gyldig kredittkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig epostadresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumsverdien på [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er under minimumsverdien på [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumslengden på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er kortere enn minimumslengden på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke den brukerdefinerte valideringen 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] finnes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] kan ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] må være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Neste 20 | default.boolean.true=Ja 21 | default.boolean.false=Nei 22 | default.date.format=dd.MM.yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} opprettet 26 | default.updated.message={0} {1} oppdatert 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} ble ikke funnet 30 | default.optimistic.locking.failure=En annen bruker har oppdatert denne {0} mens du redigerte 31 | 32 | default.home.label=Hjem 33 | default.list.label={0}liste 34 | default.add.label=Legg til {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opprett {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Endre {0} 39 | 40 | default.button.create.label=Opprett 41 | default.button.edit.label=Endre 42 | default.button.update.label=Oppdater 43 | default.button.delete.label=Slett 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} må være en gyldig URL 48 | typeMismatch.java.net.URI=Feltet {0} må være en gyldig URI 49 | typeMismatch.java.util.Date=Feltet {0} må være en gyldig dato 50 | typeMismatch.java.lang.Double=Feltet {0} må være et gyldig tall 51 | typeMismatch.java.lang.Integer=Feltet {0} må være et gyldig heltall 52 | typeMismatch.java.lang.Long=Feltet {0} må være et gyldig heltall 53 | typeMismatch.java.lang.Short=Feltet {0} må være et gyldig heltall 54 | typeMismatch.java.math.BigDecimal=Feltet {0} må være et gyldig tall 55 | typeMismatch.java.math.BigInteger=Feltet {0} må være et gyldig heltall 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | 93 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nl.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}] 2 | default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL 3 | default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer 4 | default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres 5 | default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}] 6 | default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}] 7 | default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}] 8 | default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}] 9 | default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}] 10 | default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}] 11 | default.invalid.validator.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is niet geldig 12 | default.not.inlist.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet voor in de lijst [{3}] 13 | default.blank.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 14 | default.not.equal.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] mag niet gelijk zijn aan [{3}] 15 | default.null.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 16 | default.not.unique.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] moet uniek zijn 17 | 18 | default.paginate.prev=Vorige 19 | default.paginate.next=Volgende 20 | default.boolean.true=Ja 21 | default.boolean.false=Nee 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} ingevoerd 26 | default.updated.message={0} {1} gewijzigd 27 | default.deleted.message={0} {1} verwijderd 28 | default.not.deleted.message={0} {1} kon niet worden verwijderd 29 | default.not.found.message={0} met id {1} kon niet worden gevonden 30 | default.optimistic.locking.failure=Een andere gebruiker heeft deze {0} al gewijzigd 31 | 32 | default.home.label=Home 33 | default.list.label={0} Overzicht 34 | default.add.label=Toevoegen {0} 35 | default.new.label=Invoeren {0} 36 | default.create.label=Invoeren {0} 37 | default.show.label=Details {0} 38 | default.edit.label=Wijzigen {0} 39 | 40 | default.button.create.label=Invoeren 41 | default.button.edit.label=Wijzigen 42 | default.button.update.label=Opslaan 43 | default.button.delete.label=Verwijderen 44 | default.button.delete.confirm.message=Weet je het zeker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Attribuut {0} is geen geldige URL 48 | typeMismatch.java.net.URI=Attribuut {0} is geen geldige URI 49 | typeMismatch.java.util.Date=Attribuut {0} is geen geldige datum 50 | typeMismatch.java.lang.Double=Attribuut {0} is geen geldig nummer 51 | typeMismatch.java.lang.Integer=Attribuut {0} is geen geldig nummer 52 | typeMismatch.java.lang.Long=Attribuut {0} is geen geldig nummer 53 | typeMismatch.java.lang.Short=Attribuut {0} is geen geldig nummer 54 | typeMismatch.java.math.BigDecimal=Attribuut {0} is geen geldig nummer 55 | typeMismatch.java.math.BigInteger=Attribuut {0} is geen geldig nummer 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | default.boolean.true=Sim 25 | default.boolean.false=Não 26 | default.date.format=dd/MM/yyyy HH:mm:ss z 27 | default.number.format=0 28 | 29 | default.created.message={0} {1} criado 30 | default.updated.message={0} {1} atualizado 31 | default.deleted.message={0} {1} removido 32 | default.not.deleted.message={0} {1} não pode ser removido 33 | default.not.found.message={0} não foi encontrado com id {1} 34 | default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo 35 | 36 | default.home.label=Principal 37 | default.list.label={0} Listagem 38 | default.add.label=Adicionar {0} 39 | default.new.label=Novo {0} 40 | default.create.label=Criar {0} 41 | default.show.label=Ver {0} 42 | default.edit.label=Editar {0} 43 | 44 | default.button.create.label=Criar 45 | default.button.edit.label=Editar 46 | default.button.update.label=Alterar 47 | default.button.delete.label=Remover 48 | default.button.delete.confirm.message=Tem certeza? 49 | 50 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 51 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 52 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 53 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 54 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 55 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 56 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 57 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 58 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 59 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 60 | labels.search.query=Search\: 61 | nav.label=[0] 62 | app.name=Docker Registry Web 63 | ui.dialog.button.deleteImage=Delete image? 64 | image.delete.success="Deleted. Bye bye..." 65 | image.delete.failure="That failed. Please try again." 66 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 67 | image.pull.prompt=Copy & paste the following into a shell to pull 68 | image.delete.prompt.title=Delete image tag? 69 | image.pull.prompt.title=Pull an image 70 | labels.image.name=Image Name 71 | labels.image.id=Image Id 72 | labels.image.tag=Tag 73 | labels.image.pull=Pull 74 | labels.image.description=Description 75 | labels.image.config=Config. 76 | labels.image.created=Created 77 | labels.image.author=Author 78 | title.repository=Repositories 79 | labels.registry.apiVersion=API Version 80 | labels.registry.url=URL 81 | registry.apiVersion.label=API Version 82 | registry.url.label=URL 83 | ui.dialog.button.deleteTag=Delete tag 84 | registry.ping.failed=Ping failed\! 85 | registry.ping.succeeded=Ping succeeded 86 | labels.registry.ping=Pingable? 87 | registry.host.label=Hostname 88 | registry.port.label=Port 89 | registry.password.label=Password 90 | registry.username.label=Username 91 | labels.registry.host=Hostname 92 | labels.registry.port=Port 93 | labels.registry.username=Username 94 | labels.registry.password=Password 95 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | labels.search.query=Search\: 36 | nav.label=[0] 37 | app.name=Docker Registry Web 38 | ui.dialog.button.deleteImage=Delete image? 39 | image.delete.success="Deleted. Bye bye..." 40 | image.delete.failure="That failed. Please try again." 41 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 42 | image.pull.prompt=Copy & paste the following into a shell to pull 43 | image.delete.prompt.title=Delete image tag? 44 | image.pull.prompt.title=Pull an image 45 | labels.image.name=Image Name 46 | labels.image.id=Image Id 47 | labels.image.tag=Tag 48 | labels.image.pull=Pull 49 | labels.image.description=Description 50 | labels.image.config=Config. 51 | labels.image.created=Created 52 | labels.image.author=Author 53 | title.repository=Repositories 54 | labels.registry.apiVersion=API Version 55 | labels.registry.url=URL 56 | registry.apiVersion.label=API Version 57 | registry.url.label=URL 58 | ui.dialog.button.deleteTag=Delete tag 59 | registry.ping.failed=Ping failed\! 60 | registry.ping.succeeded=Ping succeeded 61 | labels.registry.ping=Pingable? 62 | registry.host.label=Hostname 63 | registry.port.label=Port 64 | registry.password.label=Password 65 | registry.username.label=Username 66 | labels.registry.host=Hostname 67 | labels.registry.port=Port 68 | labels.registry.username=Username 69 | labels.registry.password=Password 70 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 71 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | labels.search.query=Search\: 33 | nav.label=[0] 34 | app.name=Docker Registry Web 35 | ui.dialog.button.deleteImage=Delete image? 36 | image.delete.success="Deleted. Bye bye..." 37 | image.delete.failure="That failed. Please try again." 38 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 39 | image.pull.prompt=Copy & paste the following into a shell to pull 40 | image.delete.prompt.title=Delete image tag? 41 | image.pull.prompt.title=Pull an image 42 | labels.image.name=Image Name 43 | labels.image.id=Image Id 44 | labels.image.tag=Tag 45 | labels.image.pull=Pull 46 | labels.image.description=Description 47 | labels.image.config=Config. 48 | labels.image.created=Created 49 | labels.image.author=Author 50 | title.repository=Repositories 51 | labels.registry.apiVersion=API Version 52 | labels.registry.url=URL 53 | registry.apiVersion.label=API Version 54 | registry.url.label=URL 55 | ui.dialog.button.deleteTag=Delete tag 56 | registry.ping.failed=Ping failed\! 57 | registry.ping.succeeded=Ping succeeded 58 | labels.registry.ping=Pingable? 59 | registry.host.label=Hostname 60 | registry.port.label=Port 61 | registry.password.label=Password 62 | registry.username.label=Username 63 | labels.registry.host=Hostname 64 | labels.registry.port=Port 65 | labels.registry.username=Username 66 | labels.registry.password=Password 67 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 68 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_sv.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attributet [{0}] för klassen [{1}] med värde [{2}] matchar inte mot uttrycket [{3}] 2 | default.invalid.url.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig URL 3 | default.invalid.creditCard.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte ett giltigt kreditkortsnummer 4 | default.invalid.email.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig e-postadress 5 | default.invalid.range.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte inom intervallet [{3}] till [{4}] 6 | default.invalid.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] har en storlek som inte är inom [{3}] till [{4}] 7 | default.invalid.max.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxvärdet [{3}] 8 | default.invalid.min.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimivärdet [{3}] 9 | default.invalid.max.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxstorleken [{3}] 10 | default.invalid.min.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimistorleken [{3}] 11 | default.invalid.validator.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt enligt anpassad regel 12 | default.not.inlist.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt, måste vara ett av [{3}] 13 | default.blank.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 14 | default.not.equal.message=Attributet [{0}] för klassen [{1}] med värde [{2}] får inte vara lika med [{3}] 15 | default.null.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 16 | default.not.unique.message=Attributet [{0}] för klassen [{1}] med värde [{2}] måste vara unikt 17 | 18 | default.paginate.prev=Föregående 19 | default.paginate.next=Nästa 20 | default.boolean.true=Sant 21 | default.boolean.false=Falskt 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} skapades 26 | default.updated.message={0} {1} uppdaterades 27 | default.deleted.message={0} {1} borttagen 28 | default.not.deleted.message={0} {1} kunde inte tas bort 29 | default.not.found.message={0} med id {1} kunde inte hittas 30 | default.optimistic.locking.failure=En annan användare har uppdaterat det här {0} objektet medan du redigerade det 31 | 32 | default.home.label=Hem 33 | default.list.label= {0} - Lista 34 | default.add.label=Lägg till {0} 35 | default.new.label=Skapa {0} 36 | default.create.label=Skapa {0} 37 | default.show.label=Visa {0} 38 | default.edit.label=Ändra {0} 39 | 40 | default.button.create.label=Skapa 41 | default.button.edit.label=Ändra 42 | default.button.update.label=Uppdatera 43 | default.button.delete.label=Ta bort 44 | default.button.delete.confirm.message=Är du säker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Värdet för {0} måste vara en giltig URL 48 | typeMismatch.java.net.URI=Värdet för {0} måste vara en giltig URI 49 | typeMismatch.java.util.Date=Värdet {0} måste vara ett giltigt datum 50 | typeMismatch.java.lang.Double=Värdet {0} måste vara ett giltigt nummer 51 | typeMismatch.java.lang.Integer=Värdet {0} måste vara ett giltigt heltal 52 | typeMismatch.java.lang.Long=Värdet {0} måste vara ett giltigt heltal 53 | typeMismatch.java.lang.Short=Värdet {0} måste vara ett giltigt heltal 54 | typeMismatch.java.math.BigDecimal=Värdet {0} måste vara ett giltigt nummer 55 | typeMismatch.java.math.BigInteger=Värdet {0} måste vara ett giltigt heltal 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? -------------------------------------------------------------------------------- /grails-app/i18n/messages_th.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] 2 | default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL 3 | default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต 4 | default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ 5 | default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 6 | default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 7 | default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] 8 | default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] 9 | default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] 10 | default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] 11 | default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น 12 | default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] 13 | default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ 14 | default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ 15 | default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ 16 | default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) 17 | 18 | default.paginate.prev=ก่อนหน้า 19 | default.paginate.next=ถัดไป 20 | default.boolean.true=จริง 21 | default.boolean.false=เท็จ 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว 26 | default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว 27 | default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว 28 | default.not.deleted.message=ไม่สามารถลบ {0} {1} 29 | default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ 30 | default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ 31 | 32 | default.home.label=หน้าแรก 33 | default.list.label=รายการ {0} 34 | default.add.label=เพิ่ม {0} 35 | default.new.label=สร้าง {0} ใหม่ 36 | default.create.label=สร้าง {0} 37 | default.show.label=แสดง {0} 38 | default.edit.label=แก้ไข {0} 39 | 40 | default.button.create.label=สร้าง 41 | default.button.edit.label=แก้ไข 42 | default.button.update.label=ปรับปรุง 43 | default.button.delete.label=ลบ 44 | default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง 48 | typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง 49 | typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ 50 | typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double 51 | typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer 52 | typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long 53 | typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short 54 | typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal 55 | typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger 56 | labels.search.query=Search\: 57 | nav.label=[0] 58 | app.name=Docker Registry Web 59 | ui.dialog.button.deleteImage=Delete image? 60 | image.delete.success="Deleted. Bye bye..." 61 | image.delete.failure="That failed. Please try again." 62 | image.delete.tag.prompt=This image's tag will be permanently deleted and cannot be recovered\! 63 | image.pull.prompt=Copy & paste the following into a shell to pull 64 | image.delete.prompt.title=Delete image tag? 65 | image.pull.prompt.title=Pull an image 66 | labels.image.name=Image Name 67 | labels.image.id=Image Id 68 | labels.image.tag=Tag 69 | labels.image.pull=Pull 70 | labels.image.description=Description 71 | labels.image.config=Config. 72 | labels.image.created=Created 73 | labels.image.author=Author 74 | title.repository=Repositories 75 | labels.registry.apiVersion=API Version 76 | labels.registry.url=URL 77 | registry.apiVersion.label=API Version 78 | registry.url.label=URL 79 | ui.dialog.button.deleteTag=Delete tag 80 | registry.ping.failed=Ping failed\! 81 | registry.ping.succeeded=Ping succeeded 82 | labels.registry.ping=Pingable? 83 | registry.host.label=Hostname 84 | registry.port.label=Port 85 | registry.password.label=Password 86 | registry.username.label=Username 87 | labels.registry.host=Hostname 88 | labels.registry.port=Port 89 | labels.registry.username=Username 90 | labels.registry.password=Password 91 | image.delete.prohibited=Delete prohibited. Is read only mode enabled? 92 | -------------------------------------------------------------------------------- /grails-app/services/docker/registry/ui/RegistryViewService.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.ui 2 | 3 | import docker.registry.web.Registry 4 | import docker.registry.web.support.RegistryReposView 5 | import grails.transaction.Transactional 6 | 7 | @Transactional(readOnly = true) 8 | class RegistryViewService { 9 | 10 | def repositoryService 11 | 12 | def viewRegistries() { 13 | def registries = [] as Set 14 | Registry.all.each { registry -> 15 | def repositories = [] 16 | def reachable = true 17 | try { 18 | repositories = repositoryService.index(registry) 19 | 20 | } catch (errorRetrievingReposFromRegistry) { 21 | reachable = false 22 | errorRetrievingReposFromRegistry.printStackTrace() 23 | log.error("The registry ${registry.toUrl()} is unreachable") 24 | } 25 | registries.add(RegistryReposView.make(registry, repositories, reachable)) 26 | } 27 | registries 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /grails-app/services/docker/registry/web/ImageService.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.Image 4 | import grails.transaction.Transactional 5 | import groovyx.net.http.HTTPBuilder 6 | import groovyx.net.http.Method 7 | 8 | @Transactional 9 | class ImageService { 10 | 11 | def grailsApplication 12 | 13 | def index(final Registry registry) { 14 | log.info("Loading images from $registry") 15 | final imageList = [] 16 | registry.repositories.each { repo -> 17 | def http = new HTTPBuilder("${registry.toUrl()}/repositories/$repo.name/images") 18 | http.request(Method.GET, groovyx.net.http.ContentType.JSON) { 19 | response.success = { resp, res -> 20 | log.info("response data for image list $res $resp") 21 | res.each { img -> 22 | imageList.add(getImage(registry, img.id)) 23 | } 24 | } 25 | } 26 | } 27 | imageList 28 | } 29 | 30 | def Image getImage(final Registry registry, def imgId) { 31 | final BASE_URI = getBaseURIFromConfig() 32 | log.info("getting image $imgId") 33 | def img = null 34 | def http = new HTTPBuilder(registry.url) 35 | http.request (Method.GET, groovyx.net.http.ContentType.JSON) { 36 | uri.path = "/$registry.apiVersion/images/${imgId}/json" 37 | log.info("uri is $uri.path") 38 | response.success = { imgResp, imgData -> 39 | log.info("Image data is $imgData") 40 | img = new Image(imgData) 41 | } 42 | } 43 | img 44 | } 45 | 46 | def deleteImage(final String imageId) { 47 | final BASE_URI = getBaseURIFromConfig() 48 | final uri = "$BASE_URI/${grailsApplication.config.docker.registry.web.api.version}/images/$imageId" 49 | def http = new HTTPBuilder(uri) 50 | http.request(Method.DELETE, groovyx.net.http.ContentType.JSON) { 51 | response.success = { resp, json -> 52 | log.info("Image $imageId deleted: $json") 53 | } 54 | } 55 | } 56 | 57 | private String getBaseURIFromConfig() { 58 | grailsApplication.config.docker.registry.web.uri 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /grails-app/services/docker/registry/web/SearchService.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.Search 4 | import grails.transaction.Transactional 5 | 6 | @Transactional(readOnly = true) 7 | class SearchService { 8 | 9 | def repositoryService 10 | 11 | def searchAll(final Search search) { 12 | log.info("Search query is ${search.query}") 13 | final searchResults = [:] 14 | 15 | Registry.all.each { Registry registry -> 16 | searchResults.put(registry, repositoryService.search(registry, search.query)) 17 | } 18 | log.info("Results are $searchResults") 19 | searchResults 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /grails-app/taglib/docker/registry/ui/UtilTagLib.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.ui 2 | 3 | class UtilTagLib { 4 | static defaultEncodeAs = [taglib:'html'] 5 | //static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']] 6 | static namespace = "util" 7 | 8 | def repositoryService 9 | 10 | /** 11 | * @attr registry the registry 12 | * @attr repoName 13 | * @attr tag 14 | */ 15 | def generatePullName = { attrs, body -> 16 | out << repositoryService.buildPullName(attrs.registry, attrs.repoName, attrs.tag) 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /grails-app/views/about.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | About ${grailsApplication.metadata['app.name']} 6 | 7 | 8 | 9 |

This project is open source software licensed under the GPL v3.

10 |

You are running version ${grailsApplication.metadata['app.version']}.

11 |

Contribute at

12 |

Styles by Bootswatch

13 | 14 | -------------------------------------------------------------------------------- /grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:if env="development">Grails Runtime Exception</g:if><g:else>Error</g:else> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /grails-app/views/forbidden.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:if env="development">Forbidden</g:if><g:else>Error</g:else> 5 | 6 | 7 | 8 | 9 |

Forbidden

10 |

${flash.message}

11 | 12 | 13 | -------------------------------------------------------------------------------- /grails-app/views/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Welcome to <g:message code="app.name" /> 6 | 7 | 8 |

Welcome to ${g.message(code: 'app.name')}. This application allows you to search, delete and view images 9 | for a given Docker Registry installation. Just head on over to Registries and add your registry URLs (with 'v1' or similar for the API version) and you're good to go!

10 | 11 | 12 | -------------------------------------------------------------------------------- /grails-app/views/layouts/footer.gsp: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 5 | 9 | 10 |
11 |
12 |
-------------------------------------------------------------------------------- /grails-app/views/layouts/main.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | <g:layoutTitle default="Grails"/> 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 36 | 37 | 38 |
39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /grails-app/views/layouts/nav.gsp: -------------------------------------------------------------------------------- 1 | 29 | -------------------------------------------------------------------------------- /grails-app/views/registry/_form.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Registry" %> 2 | 3 |
4 | 5 | 6 |
7 | 9 |
10 |
11 | 12 |
13 | 14 | 15 |
16 | 18 |
19 |
20 | 21 |
22 | 23 | 24 |
25 | 27 |
28 |
29 | 30 |
31 | 32 | 33 |
34 | 36 |
37 |
38 | 39 |
40 | 41 | 42 |
43 | 45 |
46 |
47 | 48 |
49 | 50 | 51 |
52 | 54 |
55 |
56 | -------------------------------------------------------------------------------- /grails-app/views/registry/create.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <g:message code="default.create.label" args="[entityName]" /> 7 | 8 | 9 | 15 | 16 | 17 | 18 |
19 |

20 | 21 |
${flash.message}
22 |
23 | 24 | 29 | 30 | 31 | 32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 | 40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /grails-app/views/registry/edit.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Registry" %> 2 | 3 | 4 | 5 | 6 | 7 | <g:message code="default.edit.label" args="[entityName]" /> 8 | 9 | 10 | 11 | 17 | 18 |
19 | 20 |

21 | 22 | 23 |
${flash.message}
24 |
25 | 26 | 27 | 32 | 33 | 34 | 35 | 36 |
37 |
38 | 39 | 40 |
41 | 43 |
44 |
45 | 46 |
47 | 48 | 49 |
50 | 52 |
53 |
54 | 55 |
56 | 57 | 58 |
59 | 61 |
62 |
63 | 64 |
65 | 66 | 67 |
68 | 70 |
71 |
72 |
73 |
74 | 75 |
76 |
77 |
78 | 79 | 80 | -------------------------------------------------------------------------------- /grails-app/views/registry/index.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Registry" %> 2 | 3 | 4 | 5 | 6 | 7 | <g:message code="default.list.label" args="[entityName]" /> 8 | 9 | 10 | 16 |
17 | 18 |
${flash.message}
19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 |
${message(code: 'registry.host.label', default: 'Hostname')}${message(code: 'registry.port.label', default: 'Port')}${message(code: 'registry.apiVersion.label', default: 'Api Version')}
${fieldValue(bean: registryInstance, field: "host")}${fieldValue(bean: registryInstance, field: "port")}${fieldValue(bean: registryInstance, field: "apiVersion")}
38 | 41 |
42 | 43 | 44 | -------------------------------------------------------------------------------- /grails-app/views/registry/show.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Registry" %> 2 | 3 | 4 | 5 | 6 | 7 | <g:message code="default.show.label" args="[entityName]"/> 8 | 9 | 10 | 11 | 12 | 18 | 19 |
20 |

21 | 22 |
${flash.message}
23 |
24 | 25 | 26 |
27 |
28 | 29 | 30 |
31 | 33 |
34 |
35 | 36 |
37 | 38 | 39 |
40 | 42 |
43 |
44 | 45 |
46 | 47 | 48 |
49 | 51 |
52 |
53 | 54 |
55 | 56 | 57 |
58 | 60 |
61 |
62 | 63 |
64 | 65 | 66 |
67 | ${registryIsUp ? message(code:"registry.ping.succeeded") : message(code:"registry.ping.failed")} 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 | 76 |
77 | 79 | 82 |
83 |
84 |
85 | 86 | 87 | -------------------------------------------------------------------------------- /grails-app/views/repository/delete.gsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" %> 2 | 3 | 4 | Docker Registry - Image Search 5 | 6 | 7 | 8 | 9 |

Image Deleted

10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /grails-app/views/repository/image-prompts.js.gsp: -------------------------------------------------------------------------------- 1 | 86 |
87 |

88 |

89 | 
90 |
91 |

92 |
93 | -------------------------------------------------------------------------------- /grails-app/views/repository/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Docker Registry - Image List 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Registry ${entry.registry.host}

13 | 14 |
15 | Oh no! This registry is unreachable! 16 |
17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 35 | 47 | 48 | 49 | 50 | 51 |
Tag
31 | 33 | 34 | 36 | 38 | 39 | | 40 | 41 | 42 | | 43 | 44 | 45 | 46 |
52 | 53 |
54 |
55 |
56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /grails-app/views/repository/show.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Docker Registry - Image List 6 | 7 | 8 | 9 | 10 |
11 |
12 |

${img?.displayName}

13 | 14 |
15 | 16 | 17 |
18 | 20 |
21 |
22 | 23 |
24 | 25 | 26 |
27 | 29 |
30 |
31 | 32 |
33 | 34 | 35 |
36 | 38 |
39 |
40 | 41 |
42 | 43 | 44 |
45 | 47 |
48 |
49 | 50 |
51 | 52 | 53 |
54 | 56 |
57 |
58 | 59 |
60 | 61 | 62 |
63 | 65 |
66 |
67 | 68 |
69 | 70 | 71 |
72 | 74 |
75 |
76 | 77 |
78 | 79 | 80 |
81 | 83 |
84 |
85 |
86 |
87 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /grails-app/views/search/index.gsp: -------------------------------------------------------------------------------- 1 | <%@ page contentType="text/html;charset=UTF-8" %> 2 | 3 | 4 | 5 | Docker Registry - Image Search 6 | 7 | 8 | 9 | 10 |

Docker Image Search

11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /grails-app/views/search/results.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Docker Registry - Image List 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |

Registry ${registry.host}

15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 32 | 44 | 45 | 46 | 47 | 48 |
Tag
28 | 30 | 31 | 33 | 35 | 36 | | 37 | 38 | 39 | | 40 | 41 | 42 | 43 |
49 | 50 |
51 |
52 |
53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /grails-app/views/setting/_form.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Setting" %> 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /grails-app/views/setting/create.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <g:message code="default.create.label" args="[entityName]" /> 7 | 8 | 9 | 10 | 16 |
17 |

18 | 19 |
${flash.message}
20 |
21 | 22 | 27 | 28 | 29 |
30 | 31 |
32 |
33 | 34 |
35 |
36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /grails-app/views/setting/edit.gsp: -------------------------------------------------------------------------------- 1 | <%@ page import="docker.registry.web.Setting" %> 2 | 3 | 4 | 5 | 6 | 7 | <g:message code="default.edit.label" args="[entityName]" /> 8 | 9 | 10 | 11 | 18 |
19 |

20 | 21 |
${flash.message}
22 |
23 | 24 | 29 | 30 | 31 | 32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 |
40 | 41 | 42 | -------------------------------------------------------------------------------- /grails-app/views/setting/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page import="docker.registry.web.Setting" %> 3 | 4 | 5 | 6 | 7 | 8 | <g:message code="default.list.label" args="[entityName]" /> 9 | 10 | 11 | 12 | 18 |
19 |

20 | 21 |
${flash.message}
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 | 40 |
41 | 42 | 43 | -------------------------------------------------------------------------------- /grails-app/views/setting/show.gsp: -------------------------------------------------------------------------------- 1 | 2 | <%@ page import="docker.registry.web.Setting" %> 3 | 4 | 5 | 6 | 7 | 8 | <g:message code="default.show.label" args="[entityName]" /> 9 | 10 | 11 | 12 | 19 |
20 |

21 | 22 |
${flash.message}
23 |
24 |
    25 | 26 |
27 | 28 |
29 | 30 | 31 |
32 |
33 |
34 | 35 | 36 | -------------------------------------------------------------------------------- /grails-app/views/status.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Application Status 6 | 7 | 8 | 9 | 29 |
30 |

Welcome to Grails

31 |

Congratulations, you have successfully started your first Grails application! At the moment 32 | this is the default page, feel free to modify it to either redirect to a controller or display whatever 33 | content you may choose. Below is a list of controllers that are currently deployed in this application, 34 | click on each to execute its default action:

35 | 36 | 44 |
45 | 46 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Container.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | class Container { 4 | } 5 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/ContainerConfig.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | class ContainerConfig { 4 | String hostname 5 | String user 6 | int memory 7 | int memorySwap 8 | boolean attachStdin 9 | boolean attachStdout 10 | boolean attachStderr 11 | String portSpecs 12 | boolean tty 13 | boolean openStdin 14 | boolean stdinOnce 15 | String env 16 | List command 17 | String dns 18 | String image 19 | List volumes 20 | String volumesFrom 21 | String size 22 | 23 | // container_config: { 24 | // Hostname: "host-test", 25 | // User: "", 26 | // Memory: 0, 27 | // MemorySwap: 0, 28 | // AttachStdin: false, 29 | // AttachStdout: false, 30 | // AttachStderr: false, 31 | // PortSpecs: null, 32 | // Tty: false, 33 | // OpenStdin: false, 34 | // StdinOnce: false, 35 | // Env: null, 36 | // Cmd: [ 37 | // "/bin/bash", 38 | // "-c", 39 | // "apt-get -q -yy -f install libevent-dev" 40 | // ], 41 | // Dns: null, 42 | // Image: "imagename/blah", 43 | // Volumes: { }, 44 | // VolumesFrom: "" 45 | // }, 46 | } 47 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Image.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | class Image { 4 | String checksum 5 | String displayName 6 | String pullName 7 | String architecture 8 | String author 9 | String id 10 | String name 11 | String description 12 | String docker_version 13 | String parent 14 | String os 15 | String tag 16 | String created 17 | String container 18 | String comment 19 | Map config 20 | Map container_config 21 | String Size 22 | // Docker API v2 manifest fields https://docs.docker.com/registry/spec/api/#manifest 23 | int schemaVersion 24 | ArrayList> fsLayers 25 | ArrayList> history 26 | ArrayList signatures 27 | 28 | @Override 29 | public String toString() { 30 | return "Image{" + 31 | "checksum='" + checksum + '\'' + 32 | ", displayName='" + displayName + '\'' + 33 | ", pullName='" + pullName + '\'' + 34 | ", architecture='" + architecture + '\'' + 35 | ", author='" + author + '\'' + 36 | ", id='" + id + '\'' + 37 | ", name='" + name + '\'' + 38 | ", description='" + description + '\'' + 39 | ", docker_version='" + docker_version + '\'' + 40 | ", parent='" + parent + '\'' + 41 | ", os='" + os + '\'' + 42 | ", tag='" + tag + '\'' + 43 | ", created='" + created + '\'' + 44 | ", container='" + container + '\'' + 45 | ", comment='" + comment + '\'' + 46 | ", config=" + config + 47 | ", container_config=" + container_config + 48 | ", Size='" + Size + '\'' + 49 | '}'; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/RegistryAction.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | enum RegistryAction { 4 | PING, SEARCH 5 | } -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/RegistryReposView.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support; 2 | 3 | import docker.registry.web.Registry; 4 | 5 | /** 6 | * Defines the view of a registry and their docker repositories, with a set 7 | * of extra attributes from the current state of the registries in the given 8 | * Registry server. 9 | */ 10 | class RegistryReposView { 11 | 12 | /** 13 | * The registry that was contacted. 14 | */ 15 | Registry registry 16 | /** 17 | * The current list of repositories of the registry. 18 | */ 19 | Set repositories = [] as Set 20 | 21 | /** 22 | * Whether this registry is reachable or not based on the attempt to reach its URL. 23 | */ 24 | boolean isReachable = false 25 | 26 | /** 27 | * @return An instance of RegistryReposView that associates a registry to a set of repos 28 | * and the status. 29 | * TODO: if other attributes are needed, we may extend this to a builder method. 30 | */ 31 | def static RegistryReposView make(Registry registry, List repos, Boolean isReachable) { 32 | def instance = new RegistryReposView() 33 | instance.registry = registry 34 | instance.repositories.addAll(repos) 35 | instance.isReachable = isReachable 36 | instance 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Repository.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | class Repository { 4 | 5 | String name 6 | Set tags = [] as Set 7 | Set images = [] as Set 8 | 9 | 10 | @Override 11 | String toString() { 12 | return "Repository{" + 13 | "name='" + name + '\'' + 14 | ", tags=" + tags + 15 | ", images=" + images + 16 | '}' 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Result.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | class Result { 4 | } 5 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Search.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | 4 | class Search { 5 | String query 6 | List results 7 | 8 | @Override 9 | public String toString() { 10 | return "Search{" + 11 | "query='" + query + '\'' + 12 | ", results=" + results + 13 | '}'; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/groovy/docker/registry/web/support/Tag.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web.support 2 | 3 | 4 | class Tag { 5 | String name 6 | String imageId 7 | 8 | @Override 9 | String toString() { 10 | return "Tag{" + 11 | "name='" + name + '\'' + 12 | ", imageId='" + imageId + '\'' + 13 | '}' 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /startup.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | if [ -n "$APP_CONTEXT" ]; then 4 | mv /var/lib/tomcat7/webapps/ROOT.war /var/lib/tomcat7/webapps/${APP_CONTEXT}.war 5 | fi 6 | sed -i '1iexport CATALINA_OPTS=" -Djava.security.egd=file:/dev/./urandom -Djava.net.preferIPv6Addresses=true "' catalina.sh 7 | exec ./catalina.sh run 8 | 9 | -------------------------------------------------------------------------------- /test/integration/docker/registry/ui/RepositoryServiceIntegrationTestSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.ui 2 | 3 | import docker.registry.web.Registry 4 | import docker.registry.web.RepositoryService 5 | import grails.test.mixin.TestFor 6 | import spock.lang.Specification 7 | 8 | @TestFor(RepositoryService) 9 | class RepositoryServiceIntegrationTestSpec extends Specification { 10 | 11 | final VALID_REGISTRY_URL = "http://localhost:5000/v1/" 12 | final NO_SUCH_REGISTRY = "http://bad.registry/v1/" 13 | final VALID_REGISTRY = Registry.fromUrl(VALID_REGISTRY_URL).orElseThrow { new AssertionError("No registry instance") } 14 | final BAD_REGISTRY = Registry.fromUrl(NO_SUCH_REGISTRY).orElseThrow { new AssertionError("No registry instance") } 15 | 16 | def repositoryService 17 | 18 | def setup() { 19 | } 20 | 21 | def cleanup() { 22 | } 23 | 24 | void "test ping true on valid registry url"() { 25 | when: 26 | def pingResult = repositoryService.ping(VALID_REGISTRY) 27 | then: 28 | pingResult 29 | } 30 | 31 | void "test ping false on invalid registry url"() { 32 | when: 33 | def pingResult = repositoryService.ping(BAD_REGISTRY) 34 | then: 35 | !pingResult 36 | } 37 | 38 | void "test search returns non-empty collection"() { 39 | when: 40 | def search = repositoryService.search(VALID_REGISTRY, "ui") 41 | then: 42 | !search.isEmpty() 43 | } 44 | 45 | void "test getImageDetail"() { 46 | when: 47 | def image = repositoryService.getImageDetail(VALID_REGISTRY, "repo/my_docker", "latest") 48 | then: 49 | image.checksum != '' 50 | } 51 | 52 | 53 | void "test detail"() { 54 | when: 55 | def repo = repositoryService.detail(VALID_REGISTRY, "repo/my_docker") 56 | then: 57 | !repo.images.isEmpty() 58 | } 59 | 60 | void "test index returns non-empty collection"() { 61 | when: 62 | def index = repositoryService.index(VALID_REGISTRY) 63 | then: 64 | !index.isEmpty() 65 | def repo = index.pop() 66 | repo.name != null 67 | repo.tags != null 68 | repo.tags.size() > 0 69 | repo.images.size() == 0 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /test/unit/docker/registry/ui/RegistryViewServiceSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.ui 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(RegistryViewService) 10 | class RegistryViewServiceSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/ui/UtilTagLibSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.ui 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.GroovyPageUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(UtilTagLib) 10 | class UtilTagLibSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/ImageServiceSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(ImageService) 10 | class ImageServiceSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/RepositoryControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(RepositoryController) 10 | class RepositoryControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/RepositoryServiceSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(RepositoryService) 10 | class RepositoryServiceSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/RepositorySpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import docker.registry.web.support.Repository 4 | import grails.test.mixin.TestFor 5 | import spock.lang.Specification 6 | 7 | /** 8 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 9 | */ 10 | @TestFor(Repository) 11 | class RepositorySpec extends Specification { 12 | 13 | def setup() { 14 | } 15 | 16 | def cleanup() { 17 | } 18 | 19 | void "test something"() { 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/SearchControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(SearchController) 10 | class SearchControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/docker/registry/web/SearchServiceSpec.groovy: -------------------------------------------------------------------------------- 1 | package docker.registry.web 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(SearchService) 10 | class SearchServiceSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Grails application factory bean 8 | 9 | 10 | 11 | 12 | A bean that manages Grails plugins 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | utf-8 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /wrapper/grails-wrapper-runtime-2.4.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/wrapper/grails-wrapper-runtime-2.4.4.jar -------------------------------------------------------------------------------- /wrapper/grails-wrapper.properties: -------------------------------------------------------------------------------- 1 | wrapper.dist.url=http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/ 2 | -------------------------------------------------------------------------------- /wrapper/springloaded-1.2.1.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/atcol/docker-registry-ui/a910d87b2b237c4267c0dbaac4e1b621f7e2d7dc/wrapper/springloaded-1.2.1.RELEASE.jar --------------------------------------------------------------------------------