From efe827cf213458820e4521df5f5f0616887ae0e4 Mon Sep 17 00:00:00 2001 From: Benjamin Ronser Date: Sun, 5 Aug 2018 13:31:39 -0400 Subject: [PATCH] Welcome to Image Services. --- Dockerfile | 92 +++ LICENSE | 674 +++++++++++++++++ README.md | 18 + rootfs/opt/adore-djatoka-1.1/bin/envinit.sh | 46 ++ .../Cantaloupe-3.4.2/cantaloupe.delegates.rb | 237 ++++++ .../Cantaloupe-3.4.2/cantaloupe.properties | 670 +++++++++++++++++ .../cantaloupe-4.0/cantaloupe.delegates.rb | 224 ++++++ .../cantaloupe-4.0/cantaloupe.properties | 707 ++++++++++++++++++ .../WEB-INF/classes/log4j.properties | 22 + 9 files changed, 2690 insertions(+) create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100755 rootfs/opt/adore-djatoka-1.1/bin/envinit.sh create mode 100644 rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.delegates.rb create mode 100644 rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.properties create mode 100644 rootfs/usr/local/cantaloupe-4.0/cantaloupe.delegates.rb create mode 100644 rootfs/usr/local/cantaloupe-4.0/cantaloupe.properties create mode 100755 rootfs/usr/local/tomcat/webapps/adore-djatoka/WEB-INF/classes/log4j.properties diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8e79f29 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,92 @@ +FROM benjaminrosner/isle-tomcat:latest + +ARG BUILD_DATE +ARG VCS_REF +ARG VERSION +LABEL org.label-schema.build-date="2018-08-05T17:13:02Z" \ + org.label-schema.name="ISLE Image Services" \ + org.label-schema.description="Serving all your images needs." \ + org.label-schema.url="https://islandora-collaboration-group.github.io" \ + org.label-schema.vcs-ref=$VCS_REF \ + org.label-schema.vcs-url="https://github.com/Islandora-Collaboration-Group/isle-solr" \ + org.label-schema.vendor="Islandora Collaboration Group (ICG) - islandora-consortium-group@googlegroups.com" \ + org.label-schema.version="RC-20180805T171302Z" \ + org.label-schema.schema-version="1.0" + # traefik.enable="true" \ + # traefik.port="8080" \ + # traefik.backend="imageservices" \ + # traefik.frontend.rule="Host:images.isle.localdomain;" + +### +# Dependencies +RUN GEN_DEP_PACKS="imagemagick \ + libimage-exiftool-perl \ + libtool \ + libpng-dev \ + libjpeg-dev \ + libopenjp2-7-dev \ + libtiff-dev \ + libgif-dev \ + giflib-tools \ + ffmpeg \ + ffmpeg2theora \ + libavcodec-extra \ + x264 \ + lame \ + ghostscript \ + xpdf \ + poppler-utils" && \ + echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections && \ + apt-get update && \ + apt-get install -y --no-install-recommends $GEN_DEP_PACKS && \ + ## Cleanup phase. + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +### +# Djatoka +RUN cd /tmp && \ + wget https://sourceforge.mirrorservice.org/d/dj/djatoka/djatoka/1.1/adore-djatoka-1.1.tar.gz && \ + tar -xzf adore-djatoka-1.1.tar.gz -C /usr/local && \ + ln -s /usr/local/adore-djatoka-1.1/bin/Linux-x86-64/kdu_compress /usr/local/bin/kdu_compress && \ + ln -s /usr/local/adore-djatoka-1.1/bin/Linux-x86-64/kdu_expand /usr/local/bin/kdu_expand && \ + ln -s /usr/local/adore-djatoka-1.1/lib/Linux-x86-64/libkdu_a60R.so /usr/local/lib/libkdu_a60R.so && \ + ln -s /usr/local/adore-djatoka-1.1/lib/Linux-x86-64/libkdu_jni.so /usr/local/lib/libkdu_jni.so && \ + ln -s /usr/local/adore-djatoka-1.1/lib/Linux-x86-64/libkdu_v60R.so /usr/local/lib/libkdu_v60R.so && \ + cp /usr/local/adore-djatoka-1.1/dist/adore-djatoka.war /usr/local/tomcat/webapps/adore-djatoka.war && \ + unzip -o /usr/local/tomcat/webapps/adore-djatoka.war -d /usr/local/tomcat/webapps/adore-djatoka/ && \ + sed -i 's#DJATOKA_HOME=`pwd`#DJATOKA_HOME=/usr/local/adore-djatoka-1.1#g' /usr/local/adore-djatoka-1.1/bin/env.sh && \ + sed -i 's|`uname -p` = "x86_64"|`uname -m` = "x86_64"|' /usr/local/adore-djatoka-1.1/bin/env.sh && \ + echo "/usr/local/adore-djatoka-1.1/lib/Linux-x86-64" > /etc/ld.so.conf.d/kdu_libs.conf && \ + ldconfig && \ + sed -i 's/localhost:8080/isle.localdomain/g' /usr/local/tomcat/webapps/adore-djatoka/index.html && \ + ## Cleanup Phase. + rm /usr/local/adore-djatoka-1.1/bin/*.bat /usr/local/adore-djatoka-1.1/dist/adore-djatoka.war + +### +# Cantaloupe 3.4.2 because I failed 4.x, and also failed to get this running as of 2018-08-05. Giving up for now. +# Ultimate thanks to Diego Pino Navarro's work on the Islandora Vagrant, for which the properties and delegates are copied from. +RUN cd /tmp && \ + wget https://github.com/medusa-project/cantaloupe/releases/download/v3.4.2/cantaloupe-3.4.2.zip && \ + unzip cantaloupe-*.zip -d /usr/local && \ + cp /usr/local/Cantaloupe-3.4.2/Cantaloupe-3.4.2.war /usr/local/tomcat/webapps/cantaloupe.war && \ + unzip /usr/local/tomcat/webapps/cantaloupe.war -d /usr/local/tomcat/webapps/cantaloupe && \ + ## Cleanup Phase. + rm /usr/local/Cantaloupe-3.4.2/Cantaloupe-3.4.2.war /usr/local/Cantaloupe-3.4.2/*.sample && \ + rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* + +# Set up environmental variables for tomcat & dependencies +ENV KAKADU_HOME=/usr/local/adore-djatoka-1.1/bin \ + KAKADU_LIBRARY_PATH=/usr/local/adore-djatoka-1.1/lib/Linux-x86-64 \ + PATH=$PATH:/usr/local/fedora/server/bin:/usr/local/fedora/client/bin \ + CATALINA_OPTS="-Dcantaloupe.config=/usr/local/Cantaloupe-3.4.2/cantaloupe.properties \ + -Dorg.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true \ + -Dkakadu.home=/usr/local/adore-djatoka-1.1/bin/Linux-x86-64 \ + -Djava.library.path=/usr/local/adore-djatoka-1.1/lib/Linux-x86-64:/usr/local/tomcat/lib \ + -DLD_LIBRARY_PATH=/usr/local/adore-djatoka-1.1/lib/Linux-x86-64:/usr/local/tomcat/lib" + +COPY rootfs / + +EXPOSE 8080 + +ENTRYPOINT ["/init"] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d5b52ee --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +# ISLE Fedora + +Based on: + - [Tomcat 8.5.31](https://hub.docker.com/_/tomcat/) + - Oracle Java + - Fedora Repository + - Adore-djatoka + - etc. + @todo complete me + +# Generic Usage + +@todo complete me + +## Tomcat users + +admin:isle_admin +manager:isle_manager diff --git a/rootfs/opt/adore-djatoka-1.1/bin/envinit.sh b/rootfs/opt/adore-djatoka-1.1/bin/envinit.sh new file mode 100755 index 0000000..9f5ae5d --- /dev/null +++ b/rootfs/opt/adore-djatoka-1.1/bin/envinit.sh @@ -0,0 +1,46 @@ +#!/bin/sh +CURRENTDIR=$PWD +LAUNCHDIR=/opt/adore-djatoka-1.1/bin +DJATOKA_HOME=/opt/adore-djatoka-1.1 +LIBPATH=$DJATOKA_HOME/lib + +if [ `uname` = 'Linux' ] ; then + if [ `uname -p` = "x86_64" ] ; then + # Assume Linux AMD 64 has 64-bit Java + PLATFORM="Linux-x86-64" + LD_LIBRARY_PATH="$LIBPATH/$PLATFORM" + export LD_LIBRARY_PATH + KAKADU_LIBRARY_PATH="-DLD_LIBRARY_PATH=$LIBPATH/$PLATFORM" + else + # 32-bit Java + PLATFORM="Linux-x86-32" + LD_LIBRARY_PATH="$LIBPATH/$PLATFORM" + export LD_LIBRARY_PATH + KAKADU_LIBRARY_PATH="-DLD_LIBRARY_PATH=$LIBPATH/$PLATFORM" + fi +elif [ `uname` = 'Darwin' ] ; then + # Mac OS X + PLATFORM="Mac-x86" + export PATH="/System/Library/Frameworks/JavaVM.framework/Versions/1.5/Home/bin:$PATH" + export DYLD_LIBRARY_PATH="$LIBPATH/$PLATFORM" + KAKADU_LIBRARY_PATH="-DDYLD_LIBRARY_PATH=$LIBPATH/$PLATFORM" +elif [ `uname` = 'SunOS' ] ; then + if [ `uname -p` = "i386" ] ; then + # Assume Solaris x86 + PLATFORM="Solaris-x86" + LD_LIBRARY_PATH="$LIBPATH/$PLATFORM" + export LD_LIBRARY_PATH + else + # Sparcv9 + PLATFORM="Solaris-Sparcv9" + LD_LIBRARY_PATH="$LIBPATH/$PLATFORM" + export LD_LIBRARY_PATH + fi +else + echo "djatoka env: Unsupported platform: `uname`" + exit +fi + +KAKADU_HOME=$DJATOKA_HOME/bin/$PLATFORM +export KAKADU_HOME +JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true -Dkakadu.home=$KAKADU_HOME -Djava.library.path=$LIBPATH/$PLATFORM $KAKADU_LIBRARY_PATH" diff --git a/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.delegates.rb b/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.delegates.rb new file mode 100644 index 0000000..2bb5e57 --- /dev/null +++ b/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.delegates.rb @@ -0,0 +1,237 @@ +## +# Cantaloupe ruby delegates file for Islandora Vagrant base box +# @modifiedby: Diego Pino, dpino@metro.org +# @stolenby: Benjamin Rosner, brosner@barnard.edu +# @use: ISLE image-services docker image. +# +# code may change from version to version. See the "Upgrading" section of +# Tested with 3.4.2. +# +## + +module Cantaloupe + + ## + # Tells the server whether the given request is authorized. Will be called + # upon all image requests to any endpoint. + # + # Implementations should assume that the underlying resource is available, + # and not try to check for it. + # + # @param identifier [String] Image identifier + # @param full_size [Hash] Hash with `width` and `height` + # keys corresponding to the pixel + # dimensions of the source image. + # @param operations [Array>] Array of operations in + # order of execution. Only operations that are not no-ops + # will be included. Every hash contains a `class` key + # corresponding to the operation class name, which will be + # one of the e.i.l.c.operation.Operation implementations. + # @param resulting_size [Hash] Hash with `width` and `height` + # keys corresponding to the pixel dimensions of the + # resulting image after all operations are applied. + # @param output_format [Hash] Hash with `media_type` and + # `extension` keys. + # @param request_uri [String] Full request URI + # @param request_headers [Hash] + # @param client_ip [String] + # @param cookies [Hash] + # @return [Boolean,Hash 'Copyright My Great Organization. All rights '\ + 'reserved.', + 'license' => 'http://example.org/license.html', + 'logo' => 'http://example.org/logo.png', + 'service' => { + '@context' => 'http://iiif.io/api/annex/services/physdim/1/context.json', + 'profile' => 'http://iiif.io/api/annex/services/physdim', + 'physicalScale' => 0.0025, + 'physicalUnits' => 'in' + } + } +=end + {} + end + + ## + # Tells which resolver to use for the given identifier. + # + # @param identifier [String] Image identifier + # @return [String] Resolver name + # + def self.get_resolver(identifier) + end + + module FilesystemResolver + + ## + # @param identifier [String] Image identifier + # @param context [Hash] Context for this request + # @return [String,nil] Absolute pathname of the image corresponding to the + # given identifier, or nil if not found. + # + def self.get_pathname(identifier, context) + end + + end + + module AmazonS3Resolver + + ## + # @param identifier [String] Image identifier + # @param context [Hash] Context for this request + # @return [String,Hash,nil] S3 object key of the image + # corresponding to the given identifier, + # or Hash including bucket and key, or nil if not found. + # + def self.get_object_key(identifier, context) + end + + end + + module AzureStorageResolver + + ## + # @param identifier [String] Image identifier + # @param context [Hash] Context for this request + # @return [String,nil] Blob key of the image corresponding to the given + # identifier, or nil if not found. + # + def self.get_blob_key(identifier, context) + end + + end + + module HttpResolver + + ## + # @param identifier [String] Image compound identifier from Islandora + # @param context [Hash] Context for this request + # @return [String,Hash,nil] String URL of the image + # corresponding to the given identifier; or nil if not found. + # + def self.get_url(identifier, context) + require 'cgi' + values = CGI::unescape(identifier).split('~') + if values.length != 3 + return nil + end + pid = values[0] + dsid = values[1] + token = values[2] + return "http://apache/islandora/object/#{pid}/datastream/#{dsid}/view?token=#{token}" + end + + end + + module JdbcResolver + + ## + # @param identifier [String] Image identifier + # @param context [Hash] Context for this request + # @return [String] Identifier of the image corresponding to the given + # identifier in the database. + # + def self.get_database_identifier(identifier, context) + end + + ## + # Returns either the media (MIME) type of an image, or an SQL statement + # that can be used to retrieve it, if it is stored in the database. In the + # latter case, the "SELECT" and "FROM" clauses should be in uppercase in + # order to be autodetected. If nil is returned, the media type will be + # inferred from the extension in the identifier (if present). + # + def self.get_media_type + end + + ## + # Returns an SQL statement that selects the BLOB corresponding to the + # value returned by get_database_identifier(). + # + def self.get_lookup_sql + end + + end + + ## + # Tells the server what overlay, if any, to apply to an image in response + # to a particular request. Will be called upon all image requests to any + # endpoint if `overlays.enabled` is set to `true` and `overlays.strategy` + # is set to `ScriptStrategy` in the configuration file. + # + # N.B. When a string overlay is too large or long to fit entirely within the + # image, it won't be drawn. Consider breaking long strings with LFs (\n). + # + # @param identifier [String] Image identifier + # @param operations [Array>] Array of operations in + # order of execution. Only operations that are not no-ops + # will be included. Every hash contains a `class` key + # corresponding to the operation class name, which will be + # one of the e.i.l.c.operation.Operation implementations. + # @param resulting_size [Hash] Hash with `width` and `height` + # keys corresponding to the pixel dimensions of the + # resulting image after all operations are applied. + # @param output_format [Hash] Hash with `media_type` and + # `extension` keys. + # @param request_uri [String] Full request URI + # @param request_headers [Hash] + # @param client_ip [String] + # @param cookies [Hash] + # @return [Hash,Boolean] For image overlays, a hash with + # `image`, `position`, and `inset` keys. + # For string overlays, a hash with `background_color`, + # `color`, `font`, `font_min_size`, `font_size`, `font_weight`, + # `glyph_spacing`,`inset`, `position`, `string`, `stroke_color`, and + # `stroke_width` keys. + # Return false for no overlay. + # + def self.overlay(identifier, operations, resulting_size, output_format, + request_uri, request_headers, client_ip, cookies) + false + end + + ## + # Tells the server what regions of an image to redact in response to a + # particular request. Will be called upon all image requests to any + # endpoint if `redaction.enabled` is set to `true` in the configuration + # file. + # + # @param identifier [String] Image identifier + # @param request_headers [Hash] + # @param client_ip [String] + # @param cookies [Hash] + # @return [Array>] Array of hashes, each with `x`, `y`, + # `width`, and `height` keys; or an empty array if no redactions are + # to be applied. + # + def self.redactions(identifier, request_headers, client_ip, cookies) + [] + end + +end + +# Uncomment to test on the command line (`ruby delegates.rb`) +# puts Cantaloupe::FilesystemResolver::get_pathname('image.jpg') diff --git a/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.properties b/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.properties new file mode 100644 index 0000000..3f30f36 --- /dev/null +++ b/rootfs/usr/local/Cantaloupe-3.4.2/cantaloupe.properties @@ -0,0 +1,670 @@ +########################################################################### +# Cantaloupe configuration file for Islandora Vagrant base box +# @modifiedby: Diego Pino, dpino@metro.org +# +# Keys may change from version to version. See the "Upgrading" section of +# Tested with 3.4.2. +# +# Most changes will take effect without restarting. Those that won't are +# marked with "!!". +########################################################################### + +# !! Leave blank to use the JVM default temporary directory. +temp_pathname = + +# !! Configures the HTTP server. (Standalone mode only.) +http.enabled = true +http.host = 0.0.0.0 +http.port = 8182 +http.http2.enabled = false + +# !! Configures the HTTPS server. (Standalone mode only.) +https.enabled = false +https.host = 0.0.0.0 +https.port = 8183 +# Secure HTTP/2 requires Java 9 or later. +https.http2.enabled = false + +# !! Available values are `JKS` and `PKCS12`. (Standalone mode only.) +https.key_store_type = JKS +https.key_store_password = myPassword +https.key_store_path = /path/to/keystore.jks +https.key_password = myPassword + +# !! Maximum size of the HTTP(S) request queue. Set to 0 to use the default. +http.accept_queue_limit = 0 + +# Base URI to use for internal links, such as Link headers and JSON-LD +# @id values, in a reverse-proxy context. This should only be used when +# X-Forwarded-* headers cannot be used instead. (See the user manual.) +base_uri = + +# Normally, slashes in a URI path component must be percent-encoded as +# "%2F". If your proxy is not able to pass these through without decoding, +# you can define an alternate character or character sequence to substitute +# for a slash. Supply the non-percent-encoded version here, and use the +# percent-encoded version in URLs. +slash_substitute = + +# Maximum number of pixels to return in a response, to prevent overloading +# the server. Requests for more pixels than this will receive an error +# response. Set to 0 for no maximum. +max_pixels = 400000000 + +# Errors will also be logged to the error log (if enabled). +print_stack_trace_on_error_pages = true + +########################################################################### +# DELEGATE SCRIPT +########################################################################### + +# !! Enables the delegate script: a Ruby script containing various delegate +# methods. (See the user manual.) +delegate_script.enabled = true + +# !! This can be an absolute path, or a filename; if only a filename is +# specified, it will be searched for in the same folder as this file, and +# then the current working directory. +delegate_script.pathname = cantaloupe.delegates.rb + +# Enables the invocation cache, which caches method invocations and return +# values in memory. See the user manual for more information. +delegate_script.cache.enabled = false + +########################################################################### +# ENDPOINTS +########################################################################### + +# !! Configures HTTP Basic authentication in all public endpoints. +endpoint.public.auth.basic.enabled = false +endpoint.public.auth.basic.username = myself +endpoint.public.auth.basic.secret = mypassword + +endpoint.iiif.1.enabled = true +endpoint.iiif.2.enabled = true + +# Controls the response Content-Disposition header for images. Allowed +# values are `inline`, `attachment`, and `none`. This can be overridden +# using the ?response-content-disposition query argument. +endpoint.iiif.content_disposition = none + +# Minimum size that will be used in info.json `sizes` keys. +endpoint.iiif.min_size = 64 + +# Minimum size that will be used in info.json `tiles` keys. See the user +# manual to learn how these are calculated. +endpoint.iiif.min_tile_size = 1024 + +# If true, requests for sizes other than those specified in an info.json +# response will be denied. +endpoint.iiif.2.restrict_to_sizes = false + +# Enables the Control Panel, at /admin. +endpoint.admin.enabled = false +endpoint.admin.username = admin +endpoint.admin.secret = + +# Enables the administrative HTTP API. (See the user manual.) +endpoint.api.enabled = false + +# HTTP Basic credentials to access the HTTP API. +endpoint.api.username = +endpoint.api.secret = + +########################################################################### +# RESOLVERS +########################################################################### + +# Specifies one resolver to translate the identifier in the URL to an image +# source for all requests. Available values are `FilesystemResolver`, +# `HttpResolver`, `JdbcResolver`, `AmazonS3Resolver`, and +# `AzureStorageResolver`. +resolver.static = HttpResolver + +# If true, `resolver.static` will be overridden, and the +# `get_resolver(identifier)` delegate script method will be used to select +# a resolver per-request. +resolver.delegate = false + +#---------------------------------------- +# FilesystemResolver +#---------------------------------------- + +# How to look up files. Allowed values are `BasicLookupStrategy` and +# `ScriptLookupStrategy`. ScriptLookupStrategy uses the delegate script for +# dynamic lookups; see the user manual. +FilesystemResolver.lookup_strategy = BasicLookupStrategy + +# Server-side path that will be prefixed to the identifier in the URL. +# Trailing slash is important! +FilesystemResolver.BasicLookupStrategy.path_prefix = /home/myself/images/ + +# Server-side path or extension that will be suffixed to the identifier in +# the URL. +FilesystemResolver.BasicLookupStrategy.path_suffix = + +#---------------------------------------- +# HttpResolver +#---------------------------------------- + +# Whether to trust insecure certificates when making HTTPS connections. +HttpResolver.trust_all_certs = false +HttpResolver.request_timeout = 10 + +# Tells HttpResolver how to look up resources. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses the delegate script for dynamic lookups; see the user manual for +# details. +HttpResolver.lookup_strategy = ScriptLookupStrategy + +# URL that will be prefixed to the identifier in the request URL. +# Trailing slash is important! +HttpResolver.BasicLookupStrategy.url_prefix = http://localhost/images/ + +# Path, extension, query string, etc. that will be suffixed to the +# identifier in the request URL. +HttpResolver.BasicLookupStrategy.url_suffix = + +# Enables access to resources that require HTTP Basic authentication. +HttpResolver.auth.basic.username = +HttpResolver.auth.basic.secret = + +#---------------------------------------- +# JdbcResolver +#---------------------------------------- + +# Note: JdbcResolver requires some delegate methods to be implemented in +# addition to the configuration here, and a JDBC driver to be installed on +# the classpath; see the user manual. + +# !! +JdbcResolver.url = jdbc:postgresql://localhost:5432/my_database +# !! +JdbcResolver.user = postgres +# !! +JdbcResolver.password = postgres + +# !! Connection timeout in seconds. +JdbcResolver.connection_timeout = 10 + +#---------------------------------------- +# AmazonS3Resolver +#---------------------------------------- + +# !! Credentials for your AWS account. +# See: http://aws.amazon.com/security-credentials +# Note that this info can be obtained from elsewhere rather than setting +# it here; see the user manual. +AmazonS3Resolver.access_key_id = +AmazonS3Resolver.secret_key = + +# !! Name of the bucket containing images to be served. +AmazonS3Resolver.bucket.name = + +# !! See: http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region +AmazonS3Resolver.bucket.region = + +# Tells AmazonS3Resolver how to look up objects. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses the delegate script for dynamic lookups; see the user manual for +# details. +AmazonS3Resolver.lookup_strategy = BasicLookupStrategy + +# !! Maximum number of concurrent HTTP connections to AWS. Leave blank to +# use the default. +AmazonS3Resolver.max_connections = + +#---------------------------------------- +# AzureStorageResolver +#---------------------------------------- + +# !! Credentials for your Azure account. +AzureStorageResolver.account_name = +AzureStorageResolver.account_key = + +# !! Name of the container containing images to be served. +AzureStorageResolver.container_name = + +# Tells AzureStorageResolver how to look up objects. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses the delegate script for dynamic lookups; see the user manual. +AzureStorageResolver.lookup_strategy = BasicLookupStrategy + +########################################################################### +# PROCESSORS +########################################################################### + +#---------------------------------------- +# Processor Selection +#---------------------------------------- + +# Image processors to use for various source formats. Available values are +# `Java2dProcessor`, `GraphicsMagickProcessor`, `ImageMagickProcessor`, +# `KakaduProcessor`, `OpenJpegProcessor`, `JaiProcessor`, `PdfBoxProcessor`, +# and `FfmpegProcessor`. + +# These extension-specific definitions are optional. +processor.avi = FfmpegProcessor +processor.bmp = +processor.dcm = ImageMagickProcessor +processor.flv = FfmpegProcessor +processor.gif = +processor.jp2 = OpenJpegProcessor +processor.jpg = +processor.mov = FfmpegProcessor +processor.mp4 = FfmpegProcessor +processor.mpg = FfmpegProcessor +processor.pdf = PdfBoxProcessor +processor.png = +processor.tif = +processor.webm = FfmpegProcessor +processor.webp = ImageMagickProcessor + +# Fall back to this processor for any formats not assigned above. +processor.fallback = Java2dProcessor + +#---------------------------------------- +# Global Processor Configuration +#---------------------------------------- + +# Resolution of vector rasterization (of e.g. PDFs) at a scale of 1. +processor.dpi = 150 + +# Expands contrast to utilize available dynamic range. This forces the entire +# source image to be read into memory, so can be slow with large images. +processor.normalize = false + +# Color of the background when an image is rotated or alpha-flattened, for +# output formats that don't support transparency. +# This may not be respected for indexed color derivative images. +processor.background_color = black + +# Available values are `bell`, `bspline`, `bicubic`, `box`, `hermite`, +# `lanczos3`, `mitchell`, `triangle`. (JaiProcessor ignores these.) +processor.downscale_filter = bicubic +processor.upscale_filter = bicubic + +# Intensity of an unsharp mask from 0 to 1. +processor.sharpen = 0 + +# Attempts to copy source image metadata (EXIF, IPTC, XMP) into derivative +# images. (This is not foolproof; see the user manual.) +processor.metadata.preserve = false + +# Whether to auto-rotate images using the EXIF `Orientation` field. +# The check for this field can impair performance slightly. +processor.metadata.respect_orientation = false + +# Whether to reduce images with more than 8 bits per sample to 8 bits. +# This only applies to formats that support >8-bit samples, and not all +# processors respect this setting; see the user manual. +processor.limit_to_8_bits = true + +# Progressive JPEGs are usually more compact. +processor.jpg.progressive = true + +# JPEG output quality (1-100). +processor.jpg.quality = 80 + +# TIFF output compression type. Available values are `Deflate`, `JPEG`, +# `LZW`, and `RLE`. Leave blank for no compression. +processor.tif.compression = LZW + +# Available values are `StreamStrategy` and `CacheStrategy`. StreamStrategy +# will try to stream source images from non-filesystem resolvers, when this +# is possible; CacheStrategy will first download them into the source cache +# using FilesystemCache, which must also be configured. +StreamProcessor.retrieval_strategy = CacheStrategy + +#---------------------------------------- +# FfmpegProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing the FFmpeg binaries. +# Overrides the PATH. +FfmpegProcessor.path_to_binaries = + +#---------------------------------------- +# GraphicsMagickProcessor +#---------------------------------------- + +# !! Optional absolute path of the directory containing the GraphicsMagick +# binary. Overrides the PATH. +GraphicsMagickProcessor.path_to_binaries = + +#---------------------------------------- +# ImageMagickProcessor +#---------------------------------------- + +# !! Optional absolute path of the directory containing the ImageMagick +# binary. Overrides the PATH. +ImageMagickProcessor.path_to_binaries = /usr/bin + +#---------------------------------------- +# KakaduProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing the Kakadu binaries. +# Overrides the PATH. +KakaduProcessor.path_to_binaries = /usr/local/bin + +#---------------------------------------- +# OpenJpegProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing the OpenJPEG binaries. +# Overrides the PATH. +# OpenJpegProcessor.path_to_binaries = /usr/local/bin +OpenJpegProcessor.path_to_binaries = + +########################################################################### +# CLIENT-SIDE CACHING +########################################################################### + +# Whether to enable the response Cache-Control header. +cache.client.enabled = true + +cache.client.max_age = 2592000 +cache.client.shared_max_age = +cache.client.public = true +cache.client.private = false +cache.client.no_cache = false +cache.client.no_store = false +cache.client.must_revalidate = false +cache.client.proxy_revalidate = false +cache.client.no_transform = true + +########################################################################### +# SERVER-SIDE CACHING +########################################################################### + +# Enables the source cache. Note that source images will only be cached +# when a FileProcessor is used with a StreamResolver, or when a +# StreamProcessor is used with `StreamProcessor.retrieval_strategy` set to +# `CacheStrategy`. + +cache.server.source.enabled = true + +# FilesystemCache is the only available source cache. +cache.server.source = FilesystemCache + +# Enables the derivative (processed image) cache. +cache.server.derivative.enabled = false + +# Available values are `FilesystemCache`, `JdbcCache`, `RedisCache`, +# `HeapCache`, `AmazonS3Cache`, and `AzureStorageCache`. +cache.server.derivative = FilesystemCache + +# Whether to use the Java heap as a "level 1" cache for image infos, either +# independently or in front of a "level 2" derivative cache (if enabled). +cache.server.info.enabled = true + +# Time before cached content (excluding info cache content) becomes invalid. +# Set to blank or 0 for never. +cache.server.ttl_seconds = 2592000 + +# If true, when a resolver reports that the requested source image has gone +# missing, all cached information relating to it (if any) will be deleted. +# (This is effectively always false when cache.server.resolve_first is also +# false.) +cache.server.purge_missing = false + +# If true, the source image will be confirmed to exist before a cached copy +# is returned. If false, the cached copy will be returned without checking. +# Resolving first is safer but slower. +cache.server.resolve_first = false + +# !! Enables the cache worker, which periodically purges invalid cache +# items in the background. +cache.server.worker.enabled = true + +# !! The cache worker will start its shifts this many seconds apart. +cache.server.worker.interval = 86400 + +#---------------------------------------- +# FilesystemCache +#---------------------------------------- + +# If this directory does not exist, it will be created automatically. +FilesystemCache.pathname = /usr/local/tomcat/temp/cantaloupe + +# Levels of folder hierarchy in which to store cached images. Deeper depth +# results in fewer files per directory. Set to 0 to disable subfolders. +# Purge the cache after changing this. +FilesystemCache.dir.depth = 3 + +# Number of characters in hierarchy directory names. Should be set to +# 16^n < (max number of directory entries your filesystem can deal with). +# Purge the cache after changing this. +FilesystemCache.dir.name_length = 2 + +#---------------------------------------- +# HeapCache +#---------------------------------------- + +# Target cache size, in bytes or a number ending in M, MB, G, GB, etc. +# This is not a hard limit, and may be transiently exceeded. +# Ensure your heap can accommodate this size using the -Xmx= VM argument. +HeapCache.target_size = 2G + +# If true, the cache contents will be written to a file on exit, and read +# back in at startup. +HeapCache.persist = false + +# When the contents are persisted, this specifies the location of the cache +# file. If the parent directory does not exist, it will be created +# automatically. +HeapCache.persist.filesystem.pathname = /usr/local/tomcat/temp/cantaloupe/heap.cache + +#---------------------------------------- +# JdbcCache +#---------------------------------------- + +# !! +JdbcCache.url = jdbc:postgresql://localhost:5432/cantaloupe +# !! +JdbcCache.user = postgres +# !! +JdbcCache.password = + +# !! Connection timeout in seconds. +JdbcCache.connection_timeout = 10 + +# These must be created manually; see the user manual. +JdbcCache.derivative_image_table = derivative_cache +JdbcCache.info_table = info_cache + +#---------------------------------------- +# AmazonS3Cache +#---------------------------------------- + +# !! Credentials for your AWS account. +# See: http://aws.amazon.com/security-credentials +# Note that this info can be obtained from elsewhere rather than setting it +# here; see the user manual. +AmazonS3Cache.access_key_id = +AmazonS3Cache.secret_key = + +# !! Name of a bucket to use to hold cached data. +AmazonS3Cache.bucket.name = + +# See: http://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region +AmazonS3Cache.bucket.region = + +# !! String that will be prefixed to object keys. +AmazonS3Cache.object_key_prefix = + +# !! Maximum number of concurrent HTTP connections to AWS. Leave blank to +# use the default. +AmazonS3Cache.max_connections = + +#---------------------------------------- +# AzureStorageCache +#---------------------------------------- + +# !! Credentials for your Azure account. +AzureStorageCache.account_name = +AzureStorageCache.account_key = + +# !! Name of the container containing cached images. +AzureStorageCache.container_name = + +# !! String that will be prefixed to object keys. +AzureStorageCache.object_key_prefix = + +#---------------------------------------- +# RedisCache +#---------------------------------------- + +# !! Redis connection info. +RedisCache.host = localhost +RedisCache.port = 6379 +RedisCache.ssl = false +RedisCache.password = +RedisCache.database = 0 + +########################################################################### +# OVERLAYS +########################################################################### + +# Whether to enable overlays. +overlays.enabled = false + +# Controls how overlays are configured. `BasicStrategy` will use the +# `overlays.BasicStrategy.*` keys in this section. `ScriptStrategy` will +# use the `overlay` delegate method. See the user manual for more +# information. +overlays.strategy = BasicStrategy + +# `image` or `string`. +overlays.BasicStrategy.type = image + +# Absolute path or URL of the overlay image. Must be a PNG file. +overlays.BasicStrategy.image = /path/to/overlay.png + +# Overlay text. +overlays.BasicStrategy.string = Copyright \u00A9️ My Great Organization\nAll rights reserved. + +# For possible values, launch with the -Dcantaloupe.list_fonts option. +overlays.BasicStrategy.string.font = Helvetica + +# Font size in points. +overlays.BasicStrategy.string.font.size = 24 + +# If the string doesn't fit in the image at the above size, the largest size +# at which it does fit will be used, down to this. +overlays.BasicStrategy.string.font.min_size = 18 + +# Font weight. 1 = regular, 2 = bold. Unfortunately, many fonts don't +# support fractional weights. +overlays.BasicStrategy.string.font.weight = 1.0 + +# Point spacing between glyphs, typically between -0.1 and 0.1. +overlays.BasicStrategy.string.glyph_spacing = 0.02 + +# CSS color syntax is supported. +overlays.BasicStrategy.string.color = white + +# CSS color syntax is supported. +overlays.BasicStrategy.string.stroke.color = black + +# Stroke width in pixels. +overlays.BasicStrategy.string.stroke.width = 1 + +# Color of a rectangular background to draw under the string. +# CSS color syntax and alpha are supported. +overlays.BasicStrategy.string.background.color = rgba(0, 0, 0, 100) + +# Allowed values: `top left`, `top center`, `top right`, `left center`, +# `center`, `right center`, `bottom left`, `bottom center`, `bottom right`. +overlays.BasicStrategy.position = bottom right + +# Pixel margin between the overlay and the image edge. +overlays.BasicStrategy.inset = 10 + +# Output images less than this many pixels wide will not receive an overlay. +# Set to 0 to add the overlay regardless. +overlays.BasicStrategy.output_width_threshold = 400 + +# Output images less than this many pixels tall will not receive an overlay. +# Set to 0 to add the overlay regardless. +overlays.BasicStrategy.output_height_threshold = 300 + +########################################################################### +# REDACTIONS +########################################################################### + +# See the user manual for information about how redactions work. +redaction.enabled = false + +########################################################################### +# LOGGING +########################################################################### + +#---------------------------------------- +# Application Log +#---------------------------------------- + +# `trace`, `debug`, `info`, `warn`, `error`, `all`, or `off` +log.application.level = debug + +log.application.ConsoleAppender.enabled = true + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.application.FileAppender.enabled = false +log.application.FileAppender.pathname = /var/log/cantaloupe/cantaloupe.log + +log.application.RollingFileAppender.enabled = true +log.application.RollingFileAppender.pathname = /usr/local/tomcat/logs/cantaloupe.log +log.application.RollingFileAppender.policy = TimeBasedRollingPolicy +log.application.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /usr/local/tomcat/logs/cantaloupe.log-%d{yyyy-MM-dd}.log +log.application.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +# See the "SyslogAppender" section for a list of facilities: +# http://logback.qos.ch/manual/appenders.html +log.application.SyslogAppender.enabled = false +log.application.SyslogAppender.host = +log.application.SyslogAppender.port = 514 +log.application.SyslogAppender.facility = LOCAL0 + +#---------------------------------------- +# Error Log +#---------------------------------------- + +# Application log messages with a severity of WARN or greater can be copied +# into a dedicated error log, which may make them easier to spot. + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.error.FileAppender.enabled = false +log.error.FileAppender.pathname = /usr/local/tomcat/logs/cantaloupe.error.log + +log.error.RollingFileAppender.enabled = true +log.error.RollingFileAppender.pathname = /usr/local/tomcat/logs/cantaloupe.error.log +log.error.RollingFileAppender.policy = TimeBasedRollingPolicy +log.error.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /usr/local/tomcat/logs/cantaloupe.error-%d{yyyy-MM-dd}.log +log.error.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +#---------------------------------------- +# Access Log +#---------------------------------------- + +log.access.ConsoleAppender.enabled = true + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.access.FileAppender.enabled = false +log.access.FileAppender.pathname = /usr/local/tomcat/logs/access-cantaloupe.log + +# RollingFileAppender is an alternative to using something like +# FileAppender + logrotate. +log.access.RollingFileAppender.enabled = false +log.access.RollingFileAppender.pathname = /usr/local/tomcat/logs/access-cantaloupe.log +log.access.RollingFileAppender.policy = TimeBasedRollingPolicy +log.access.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /usr/local/tomcat/logs/access-cantaloupe.log-%d{yyyy-MM-dd}.log +log.access.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +# See the "SyslogAppender" section for a list of facilities: +# http://logback.qos.ch/manual/appenders.html +log.access.SyslogAppender.enabled = false +log.access.SyslogAppender.host = +log.access.SyslogAppender.port = 514 +log.access.SyslogAppender.facility = LOCAL0 diff --git a/rootfs/usr/local/cantaloupe-4.0/cantaloupe.delegates.rb b/rootfs/usr/local/cantaloupe-4.0/cantaloupe.delegates.rb new file mode 100644 index 0000000..639abf8 --- /dev/null +++ b/rootfs/usr/local/cantaloupe-4.0/cantaloupe.delegates.rb @@ -0,0 +1,224 @@ +## +# Sample Ruby delegate script containing stubs and documentation for all +# available delegate methods. See the "Delegate Script" section of the user +# manual for more information. +# +# The application will create an instance of this class early in the request +# cycle and dispose of it at the end of the request cycle. Instances don't need +# to be thread-safe, but sharing information across instances (requests) +# **does** need to be thread-safe. +# +# This version of the script works with Cantaloupe version 4, and not earlier +# versions. Likewise, earlier versions of the script are not compatible with +# Cantaloupe 4. +# +class CustomDelegate + + ## + # Attribute for the request context, which is a hash containing information + # about the current request. + # + # This attribute will be set by the server before any other methods are + # called. Methods can access its keys like: + # + # ``` + # identifier = context['identifier'] + # ``` + # + # The hash will contain the following keys in response to all requests: + # + # * `client_ip` [String] Client IP address. + # * `cookies` [Hash] Hash of cookie name-value pairs. + # * `identifier` [String] Image identifier. + # * `request_headers` [Hash] Hash of header name-value pairs. + # * `request_uri` [String] Public request URI. + # + # It will contain the following additional string keys in response to image + # requests: + # + # * `full_size` [Hash] Hash with `width` and `height` + # keys corresponding to the pixel dimensions of the + # source image. + # * `operations` [Array>] Array of operations in + # order of application. Only operations that are not + # no-ops will be included. Every hash contains a `class` + # key corresponding to the operation class name, which + # will be one of the `e.i.l.c.operation.Operation` + # implementations. + # * `output_format` [String] Output format media (MIME) type. + # * `resulting_size` [Hash] Hash with `width` and `height` + # keys corresponding to the pixel dimensions of the + # resulting image after all operations have been applied. + # + # @return [Hash] Request context. + # + attr_accessor :context + + ## + # Tells the server whether to redirect in response to the request. Will be + # called upon all image requests. + # + # @param options [Hash] Empty hash. + # @return [Hash,nil] Hash with `location` and `status_code` + # keys. `location` must be a URI string; `status_code` must be an + # integer from 300 to 399. Return nil for no redirect. + # + def redirect(options = {}) + end + + ## + # Tells the server whether the given request is authorized. Will be called + # upon all image requests to any endpoint. + # + # Implementations should assume that the underlying resource is available, + # and not try to check for it. + # + # @param options [Hash] Empty hash. + # @return [Boolean] Whether the request is authorized. + # + def authorized?(options = {}) + true + end + + ## + # Used to add additional keys to an information JSON response. See the + # [Image API specification](http://iiif.io/api/image/2.1/#image-information). + # + # @param options [Hash] Empty hash. + # @return [Hash] Hash that will be merged into an IIIF Image API 2.x + # information response. Return an empty hash to add nothing. + # + def extra_iiif2_information_response_keys(options = {}) +=begin + Example: + { + 'attribution' => 'Copyright My Great Organization. All rights '\ + 'reserved.', + 'license' => 'http://example.org/license.html', + 'logo' => 'http://example.org/logo.png', + 'service' => { + '@context' => 'http://iiif.io/api/annex/services/physdim/1/context.json', + 'profile' => 'http://iiif.io/api/annex/services/physdim', + 'physicalScale' => 0.0025, + 'physicalUnits' => 'in' + } + } +=end + {} + end + + ## + # Tells the server which source to use for the given identifier. + # + # @param options [Hash] Empty hash. + # @return [String] Source name. + # + def source(options = {}) + end + + ## + # @param options [Hash] Empty hash. + # @return [String,nil] Blob key of the image corresponding to the given + # identifier, or nil if not found. + # + def azurestoragesource_blob_key(options = {}) + end + + ## + # @param options [Hash] Empty hash. + # @return [String,nil] Absolute pathname of the image corresponding to the + # given identifier, or nil if not found. + # + def filesystemsource_pathname(options = {}) + end + + ## + # @param options [Hash] Empty hash. + # @return [String,Hash,nil] String URI; Hash with `uri` key, + # and optionally `username` and `secret` keys; or nil if not found. + # + def httpsource_resource_info(options = {}) + require 'cgi' + identifier = context['identifier'] + values = CGI::unescape(identifier).split('~') + if values.length != 3 + return nil + end + pid = values[0] + dsid = values[1] + token = values[2] + return "http://apache:80/islandora/object/#{pid}/datastream/#{dsid}/view?token=#{token}" + end + + ## + # @param options [Hash] Empty hash. + # @return [String] Identifier of the image corresponding to the given + # identifier in the database. + # + def jdbcsource_database_identifier(options = {}) + end + + ## + # Returns either the media (MIME) type of an image, or an SQL statement that + # can be used to retrieve it, if it is stored in the database. In the latter + # case, the "SELECT" and "FROM" clauses should be in uppercase in order to + # be autodetected. If nil is returned, the media type will be inferred some + # other way, such as by identifier extension or magic bytes. + # + # @param options [Hash] Empty hash. + # @return [String, nil] + # + def jdbcsource_media_type(options = {}) + end + + ## + # @param options [Hash] Empty hash. + # @return [String] SQL statement that selects the BLOB corresponding to the + # value returned by `jdbcsource_database_identifier()`. + # + def jdbcsource_lookup_sql(options = {}) + end + + ## + # @param options [Hash] Empty hash. + # @return [Hash,nil] Hash containing `bucket` and `key` keys; + # or nil if not found. + # + def s3source_object_info(options = {}) + end + + ## + # Tells the server what overlay, if any, to apply to an image in response + # to a request. Will be called upon all image requests to any endpoint if + # overlays are enabled and the overlay strategy is set to `ScriptStrategy` + # in the application configuration. + # + # N.B.: When a string overlay is too large or long to fit entirely within + # the image, it won't be drawn. Consider breaking long strings with LFs (\n). + # + # @param options [Hash] Empty hash. + # @return [Hash,nil] For image overlays, a hash with `image`, + # `position`, and `inset` keys. For string overlays, a hash with + # `background_color`, `color`, `font`, `font_min_size`, `font_size`, + # `font_weight`, `glyph_spacing`,`inset`, `position`, `string`, + # `stroke_color`, and `stroke_width` keys. + # Return nil for no overlay. + # + def overlay(options = {}) + end + + ## + # Tells the server what regions of an image to redact in response to a + # particular request. Will be called upon all image requests to any endpoint + # if redactions are enabled in the application configuration. + # + # @param options [Hash] Empty hash. + # @return [Array>] Array of hashes, each with `x`, `y`, + # `width`, and `height` keys; or an empty array if no redactions are + # to be applied. + # + def redactions(options = {}) + [] + end + +end diff --git a/rootfs/usr/local/cantaloupe-4.0/cantaloupe.properties b/rootfs/usr/local/cantaloupe-4.0/cantaloupe.properties new file mode 100644 index 0000000..3ec34f5 --- /dev/null +++ b/rootfs/usr/local/cantaloupe-4.0/cantaloupe.properties @@ -0,0 +1,707 @@ +########################################################################### +# Sample Cantaloupe configuration file +# +# Copy this file to `cantaloupe.properties` and edit as desired. +# +# Keys may change from version to version. See the "Upgrading" section of +# the website. +# +# Most changes will take effect without restarting. Those that won't are +# marked with "!!". +########################################################################### + +# !! Leave blank to use the JVM default temporary directory. +temp_pathname = + +# !! Configures the HTTP server. (Standalone mode only.) +http.enabled = true +http.host = 0.0.0.0 +http.port = 8182 +http.http2.enabled = false + +# !! Configures the HTTPS server. (Standalone mode only.) +https.enabled = false +https.host = 0.0.0.0 +https.port = 8183 +# Secure HTTP/2 requires Java 9 or later. +https.http2.enabled = false + +# !! Available values are `JKS` and `PKCS12`. (Standalone mode only.) +https.key_store_type = JKS +https.key_store_password = myPassword +https.key_store_path = /path/to/keystore.jks +https.key_password = myPassword + +# !! Maximum size of the HTTP(S) request queue. Leave blank to use the +# default. +http.accept_queue_limit = + +# Base URI to use for internal links, such as Link headers and JSON-LD +# @id values, in a reverse-proxy context. This should only be used when +# X-Forwarded-* headers cannot be used instead. (See the user manual.) +base_uri = + +# Normally, slashes in a URI path component must be percent-encoded as +# "%2F". If your proxy is not able to pass these through without decoding, +# you can define an alternate character or character sequence to substitute +# for a slash. Supply the non-percent-encoded version here, and use the +# percent-encoded version in URLs. +slash_substitute = + +# Maximum number of pixels to return in a response, to prevent overloading +# the server. Requests for more pixels than this will receive an error +# response. Set to 0 for no maximum. +max_pixels = 400000000 + +# Errors will also be logged to the error log (if enabled). +print_stack_trace_on_error_pages = true + +########################################################################### +# DELEGATE SCRIPT +########################################################################### + +# Enables the delegate script: a Ruby script containing various delegate +# methods. (See the user manual.) +delegate_script.enabled = true + +# !! This can be an absolute path, or a filename; if only a filename is +# specified, it will be searched for in the same folder as this file, and +# then the current working directory. +delegate_script.pathname = cantaloupe.delegates.rb + +# Enables the invocation cache, which caches method invocations and return +# values in memory. See the user manual for more information. +delegate_script.cache.enabled = false + +########################################################################### +# ENDPOINTS +########################################################################### + +# !! Configures HTTP Basic authentication in all public endpoints. +endpoint.public.auth.basic.enabled = false +endpoint.public.auth.basic.username = myself +endpoint.public.auth.basic.secret = mypassword + +# Enables the IIIF Image API 1.x endpoint, at /iiif/1. +endpoint.iiif.1.enabled = true + +# Enables the IIIF Image API 2.x endpoint, at /iiif/2. +endpoint.iiif.2.enabled = true + +# Controls the response Content-Disposition header for images. Allowed +# values are `inline`, `attachment`, and `none`. This can be overridden +# using the ?response-content-disposition query argument. +endpoint.iiif.content_disposition = none + +# Minimum size that will be used in info.json `sizes` keys. +endpoint.iiif.min_size = 64 + +# Minimum size that will be used in info.json `tiles` keys. The user manual +# explains how these are calculated. +endpoint.iiif.min_tile_size = 1024 + +# If true, requests for sizes other than those contained in an information +# response will be denied. +endpoint.iiif.2.restrict_to_sizes = false + +# Enables the Control Panel, at /admin. +endpoint.admin.enabled = false +endpoint.admin.username = admin +endpoint.admin.secret = + +# Enables the administrative HTTP API. (See the user manual.) +endpoint.api.enabled = false + +# HTTP Basic credentials to access the HTTP API. +endpoint.api.username = +endpoint.api.secret = + +########################################################################### +# SOURCES +########################################################################### + +# Uses one source for all requests. Available values are `FilesystemSource`, +# `HttpSource`, `JdbcSource`, `S3Source`, and `AzureStorageSource`. +source.static = HttpSource + +# If true, `source.static` will be overridden, and the `source()` delegate +# method will be used to select a source per-request. +source.delegate = false + +#---------------------------------------- +# FilesystemSource +#---------------------------------------- + +# How to look up files. Allowed values are `BasicLookupStrategy` and +# `ScriptLookupStrategy`. ScriptLookupStrategy uses the delegate script for +# dynamic lookups; see the user manual. +FilesystemSource.lookup_strategy = BasicLookupStrategy + +# Server-side path that will be prefixed to the identifier in the URL. +# Trailing slash is important! +FilesystemSource.BasicLookupStrategy.path_prefix = /home/myself/images/ + +# Server-side path or extension that will be suffixed to the identifier in +# the URL. +FilesystemSource.BasicLookupStrategy.path_suffix = + +#---------------------------------------- +# HttpSource +#---------------------------------------- + +HttpSource.trust_all_certs = false +HttpSource.request_timeout = + +# Tells HttpSource how to look up resources. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses a delegate method for dynamic lookups; see the user manual. +HttpSource.lookup_strategy = ScriptLookupStrategy + +# URL that will be prefixed to the identifier in the request URL. +# Trailing slash is important! +HttpSource.BasicLookupStrategy.url_prefix = http://localhost/images/ + +# Path, extension, query string, etc. that will be suffixed to the +# identifier in the request URL. +HttpSource.BasicLookupStrategy.url_suffix = + +# Enables access to resources that require HTTP Basic authentication. +HttpSource.BasicLookupStrategy.auth.basic.username = +HttpSource.BasicLookupStrategy.auth.basic.secret = + +#---------------------------------------- +# JdbcSource +#---------------------------------------- + +# Note: JdbcSource requires some delegate methods to be implemented in +# addition to the configuration here, and a JDBC driver to be installed on +# the classpath; see the user manual. + +# !! +JdbcSource.url = jdbc:postgresql://localhost:5432/my_database +# !! +JdbcSource.user = postgres +# !! +JdbcSource.password = postgres + +# !! Connection timeout in seconds. +JdbcSource.connection_timeout = 10 + +#---------------------------------------- +# S3Source +#---------------------------------------- + +# !! Endpoint URI. +# For AWS endpoints, see: +# https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region +S3Source.endpoint = + +# !! Credentials for your AWS account. +# See: http://aws.amazon.com/security-credentials +# Note that this info can be obtained from elsewhere rather than setting +# it here; see the user manual. +S3Source.access_key_id = +S3Source.secret_key = + +# !! Maximum number of concurrent HTTP connections to AWS. Leave blank to +# use the default. +S3Source.max_connections = + +# Tells S3Source how to look up objects. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses a delegate method for dynamic lookups; see the user manual. +S3Source.lookup_strategy = BasicLookupStrategy + +# !! Name of the bucket containing images to be served. +S3Source.BasicLookupStrategy.bucket.name = + +# Path within the bucket that will be prefixed to the identifier in the URL. +# Trailing slash is important! +S3Source.BasicLookupStrategy.path_prefix = + +# Path or extension that will be suffixed to the identifier in the URL. +S3Source.BasicLookupStrategy.path_suffix = + +#---------------------------------------- +# AzureStorageSource +#---------------------------------------- + +# !! Name of your Azure account. +# Leave blank if using URI with a SAS token in your object key. +AzureStorageSource.account_name = + +# !! Key of your Azure account. +# Leave blank if using URI with a SAS token in your object key. +AzureStorageSource.account_key = + +# !! Name of the container containing images to be served. +# Leave blank if using URI with the container in your object key. +AzureStorageSource.container_name = + +# Tells AzureStorageSource how to look up objects. Allowed values are +# `BasicLookupStrategy` and `ScriptLookupStrategy`. ScriptLookupStrategy +# uses a delegate method for dynamic lookups; see the user manual. +AzureStorageSource.lookup_strategy = BasicLookupStrategy + +########################################################################### +# PROCESSORS +########################################################################### + +#---------------------------------------- +# Processor Selection +#---------------------------------------- + +# Image processors to use for various source formats. Available values are +# `Java2dProcessor`, `GraphicsMagickProcessor`, `ImageMagickProcessor`, +# `KakaduDemoProcessor`, `KakaduNativeProcessor`, `OpenJpegProcessor`, +# `JaiProcessor`, `PdfBoxProcessor`, and `FfmpegProcessor`. + +# These extension-specific definitions are optional. +processor.avi = FfmpegProcessor +processor.bmp = +processor.dcm = ImageMagickProcessor +processor.flv = FfmpegProcessor +processor.gif = +processor.jp2 = KakaduNativeProcessor +processor.jpg = +processor.mov = FfmpegProcessor +processor.mp4 = FfmpegProcessor +processor.mpg = FfmpegProcessor +processor.pdf = PdfBoxProcessor +processor.png = +processor.tif = +processor.webm = FfmpegProcessor +processor.webp = ImageMagickProcessor + +# Fall back to this processor for any formats not assigned above. +processor.fallback = Java2dProcessor + +#---------------------------------------- +# Global Processor Configuration +#---------------------------------------- + +# Controls how content is fed to processors from stream-based sources. +# * `StreamStrategy` will try to stream a source image from a source when +# possible, and use `processor.fallback_retrieval_strategy` otherwise. +# * `DownloadStrategy` will download it to a temporary file, and delete +# it after the request is complete. +# * `CacheStrategy` will download it into the source cache using +# FilesystemCache, which must also be configured. (This will perform a +# lot better than DownloadStrategy if you can spare the disk space.) +processor.stream_retrieval_strategy = StreamStrategy + +# Controls how an incompatible StreamSource + FileProcessor combination is +# dealt with. +# * `DownloadStrategy` and `CacheStrategy` work the same as above. +# * `AbortStrategy` causes the request to fail. +processor.fallback_retrieval_strategy = DownloadStrategy + +# Resolution of vector rasterization (of e.g. PDFs) at a scale of 1. +processor.dpi = 150 + +# Expands contrast to utilize available dynamic range. This usually requires +# the whole source image to be read into memory, so it can be inefficient. +processor.normalize = false + +# Color of the background when an image is rotated or alpha-flattened, for +# output formats that don't support transparency. +# This may not be respected for indexed color derivative images. +processor.background_color = black + +# Available values are `bell`, `bspline`, `bicubic`, `box`, `hermite`, +# `lanczos3`, `mitchell`, `triangle`. (JaiProcessor & KakaduNativeProcessor +# ignore these.) +processor.downscale_filter = bicubic +processor.upscale_filter = bicubic + +# Intensity of an unsharp mask from 0 to 1. +processor.sharpen = 0 + +# Attempts to copy source image metadata (EXIF, IPTC, XMP) into derivative +# images. (This is not foolproof; see the user manual.) +processor.metadata.preserve = false + +# Whether to auto-rotate images using the EXIF `Orientation` field. +# The check for this field can impair performance slightly. +processor.metadata.respect_orientation = false + +# Progressive JPEGs are usually more compact. +processor.jpg.progressive = true + +# JPEG output quality (1-100). +processor.jpg.quality = 80 + +# TIFF output compression type. Available values are `Deflate`, `JPEG`, +# `LZW`, and `RLE`. Leave blank for no compression. +processor.tif.compression = LZW + +#---------------------------------------- +# ImageIO Plugin Preferences +#---------------------------------------- + +# These override the default plugins used by the application and should not +# normally be changed. +processor.imageio.bmp.reader = +processor.imageio.gif.reader = +processor.imageio.gif.writer = +processor.imageio.jpg.reader = +processor.imageio.jpg.writer = +processor.imageio.png.reader = +processor.imageio.png.writer = +processor.imageio.tif.reader = +processor.imageio.tif.writer = + +#---------------------------------------- +# FfmpegProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing the FFmpeg binaries. +# Overrides the PATH. +FfmpegProcessor.path_to_binaries = + +#---------------------------------------- +# GraphicsMagickProcessor +#---------------------------------------- + +# !! Optional absolute path of the directory containing the GraphicsMagick +# binary. Overrides the PATH. +GraphicsMagickProcessor.path_to_binaries = + +#---------------------------------------- +# ImageMagickProcessor +#---------------------------------------- + +# !! Optional absolute path of the directory containing the ImageMagick +# binary. Overrides the PATH. +ImageMagickProcessor.path_to_binaries = + +#---------------------------------------- +# KakaduDemoProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing kdu_expand. +# Overrides the PATH. +KakaduDemoProcessor.path_to_binaries = + +#---------------------------------------- +# OpenJpegProcessor +#---------------------------------------- + +# Optional absolute path of the directory containing opj_decompress. +# Overrides the PATH. +OpenJpegProcessor.path_to_binaries = + +########################################################################### +# CLIENT-SIDE CACHING +########################################################################### + +# Whether to enable the response Cache-Control header. +cache.client.enabled = true + +cache.client.max_age = 2592000 +cache.client.shared_max_age = +cache.client.public = true +cache.client.private = false +cache.client.no_cache = false +cache.client.no_store = false +cache.client.must_revalidate = false +cache.client.proxy_revalidate = false +cache.client.no_transform = true + +########################################################################### +# SERVER-SIDE CACHING +########################################################################### + +# N.B.: The source cache may be used if the +# `processor.stream_retrieval_strategy` and/or +# `processor.fallback_retrieval_strategy` keys are set to `CacheStrategy`. + +# FilesystemCache is the only available source cache. +cache.server.source = FilesystemCache + +# Amount of time source cache content remains valid. Set to blank or 0 +# for forever. +cache.server.source.ttl_seconds = 2592000 + +# Enables the derivative (processed image) cache. +cache.server.derivative.enabled = false + +# Available values are `FilesystemCache`, `JdbcCache`, `RedisCache`, +# `HeapCache`, `S3Cache`, and `AzureStorageCache`. +cache.server.derivative = + +# Amount of time derivative cache content remains valid. Set to blank or 0 +# for forever. +cache.server.derivative.ttl_seconds = 2592000 + +# Whether to use the Java heap as a "level 1" cache for image infos, either +# independently or in front of a "level 2" derivative cache (if enabled). +cache.server.info.enabled = true + +# If true, when a source reports that the requested source image has gone +# missing, all cached information relating to it (if any) will be deleted. +# (This is effectively always false when cache.server.resolve_first is also +# false.) +cache.server.purge_missing = false + +# If true, the source image will be confirmed to exist before a cached copy +# is returned. If false, the cached copy will be returned without checking. +# Resolving first is safer but slower. +cache.server.resolve_first = false + +# !! Enables the cache worker, which periodically purges invalid cache +# items in the background. +cache.server.worker.enabled = true + +# !! The cache worker will wait this many seconds before starting its +# next shift. +cache.server.worker.interval = 86400 + +#---------------------------------------- +# FilesystemCache +#---------------------------------------- + +# If this directory does not exist, it will be created automatically. +FilesystemCache.pathname = /var/cache/cantaloupe + +# Levels of folder hierarchy in which to store cached images. Deeper depth +# results in fewer files per directory. Set to 0 to disable subdirectories. +# Purge the cache after changing this. +FilesystemCache.dir.depth = 3 + +# Number of characters in tree directory names. Should be set to +# 16^n < (max number of directory entries your filesystem can deal with). +# Purge the cache after changing this. +FilesystemCache.dir.name_length = 2 + +#---------------------------------------- +# HeapCache +#---------------------------------------- + +# Target cache size, in bytes or a number ending in M, MB, G, GB, etc. +# This is not a hard limit, and may be transiently exceeded. +# Ensure your heap can accommodate this size. +HeapCache.target_size = 2G + +# If true, the cache contents will be written to a file on exit and during +# cache worker shifts, and read back in at startup. +HeapCache.persist = false + +# When the contents are persisted, this specifies the location of the cache +# file. If the parent directory does not exist, it will be created +# automatically. +HeapCache.persist.filesystem.pathname = /var/cache/cantaloupe/heap.cache + +#---------------------------------------- +# JdbcCache +#---------------------------------------- + +# !! +JdbcCache.url = jdbc:postgresql://localhost:5432/cantaloupe +# !! +JdbcCache.user = postgres +# !! +JdbcCache.password = + +# !! Connection timeout in seconds. +JdbcCache.connection_timeout = 10 + +# These must be created manually; see the user manual. +JdbcCache.derivative_image_table = derivative_cache +JdbcCache.info_table = info_cache + +#---------------------------------------- +# S3Cache +#---------------------------------------- + +# !! Endpoint URI. +# For AWS endpoints, see: +# https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region +S3Cache.endpoint = + +# !! Credentials for your AWS account. +# See: http://aws.amazon.com/security-credentials +# Note that this info can be obtained from elsewhere rather than setting it +# here; see the user manual. +S3Cache.access_key_id = +S3Cache.secret_key = + +# !! Name of a bucket to use to hold cached data. +S3Cache.bucket.name = + +# !! String that will be prefixed to object keys. +S3Cache.object_key_prefix = + +# !! Maximum number of concurrent HTTP connections to AWS. Leave blank to +# use the default. +S3Cache.max_connections = + +#---------------------------------------- +# AzureStorageCache +#---------------------------------------- + +# !! Credentials for your Azure account. +AzureStorageCache.account_name = +AzureStorageCache.account_key = + +# !! Name of the container containing cached images. +AzureStorageCache.container_name = + +# !! String that will be prefixed to object keys. +AzureStorageCache.object_key_prefix = + +#---------------------------------------- +# RedisCache +#---------------------------------------- + +# !! Redis connection info. +RedisCache.host = localhost +RedisCache.port = 6379 +RedisCache.ssl = false +RedisCache.password = +RedisCache.database = 0 + +########################################################################### +# OVERLAYS +########################################################################### + +# Whether to enable overlays. +overlays.enabled = false + +# Controls how overlays are configured. `BasicStrategy` will use the +# `overlays.BasicStrategy.*` keys in this section. `ScriptStrategy` will +# use a delegate method. (See the user manual.) +overlays.strategy = BasicStrategy + +# `image` or `string`. +overlays.BasicStrategy.type = image + +# Absolute path or URL of the overlay image. Must be a PNG file. +overlays.BasicStrategy.image = /path/to/overlay.png + +# Overlay text. +overlays.BasicStrategy.string = Copyright \u00A9️ My Great Organization\nAll rights reserved. + +# For possible values, launch with the -Dcantaloupe.list_fonts option. +overlays.BasicStrategy.string.font = Helvetica + +# Font size in points. +overlays.BasicStrategy.string.font.size = 24 + +# If the string doesn't fit in the image at the above size, the largest size +# at which it does fit will be used, down to this. +overlays.BasicStrategy.string.font.min_size = 18 + +# Font weight. 1 = regular, 2 = bold. Unfortunately, many fonts don't +# support fractional weights. +overlays.BasicStrategy.string.font.weight = 1.0 + +# Point spacing between glyphs, typically between -0.1 and 0.1. +overlays.BasicStrategy.string.glyph_spacing = 0.02 + +# CSS color syntax is supported. +overlays.BasicStrategy.string.color = white + +# CSS color syntax is supported. +overlays.BasicStrategy.string.stroke.color = black + +# Stroke width in pixels. +overlays.BasicStrategy.string.stroke.width = 1 + +# Color of a rectangular background to draw under the string. +# CSS color syntax and alpha are supported. +overlays.BasicStrategy.string.background.color = rgba(0, 0, 0, 100) + +# Allowed values: `top left`, `top center`, `top right`, `left center`, +# `center`, `right center`, `bottom left`, `bottom center`, `bottom right`. +overlays.BasicStrategy.position = bottom right + +# Pixel margin between the overlay and the image edge. +overlays.BasicStrategy.inset = 10 + +# Output images less than this many pixels wide will not receive an overlay. +# Set to 0 to add the overlay regardless. +overlays.BasicStrategy.output_width_threshold = 400 + +# Output images less than this many pixels tall will not receive an overlay. +# Set to 0 to add the overlay regardless. +overlays.BasicStrategy.output_height_threshold = 300 + +########################################################################### +# REDACTIONS +########################################################################### + +# See the user manual for information about how redactions work. +redaction.enabled = false + +########################################################################### +# LOGGING +########################################################################### + +#---------------------------------------- +# Application Log +#---------------------------------------- + +# `trace`, `debug`, `info`, `warn`, `error`, `all`, or `off` +log.application.level = debug + +log.application.ConsoleAppender.enabled = true + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.application.FileAppender.enabled = false +log.application.FileAppender.pathname = /path/to/logs/application.log + +log.application.RollingFileAppender.enabled = true +log.application.RollingFileAppender.pathname = /usr/local/tomcat/logs/cantaloupe.log +log.application.RollingFileAppender.policy = TimeBasedRollingPolicy +log.application.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /usr/local/tomcat/logs/cantaloupe-%d{yyyy-MM-dd}.log +log.application.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +# See the "SyslogAppender" section for a list of facilities: +# http://logback.qos.ch/manual/appenders.html +log.application.SyslogAppender.enabled = false +log.application.SyslogAppender.host = +log.application.SyslogAppender.port = 514 +log.application.SyslogAppender.facility = LOCAL0 + +#---------------------------------------- +# Error Log +#---------------------------------------- + +# Application log messages with a severity of WARN or greater can be copied +# into a dedicated error log, which may make them easier to spot. + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.error.FileAppender.enabled = false +log.error.FileAppender.pathname = /path/to/logs/error.log + +log.error.RollingFileAppender.enabled = true +log.error.RollingFileAppender.pathname = /usr/local/tomcat/logs/cantaloupe.error.log +log.error.RollingFileAppender.policy = TimeBasedRollingPolicy +log.error.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /usr/local/tomcat/logs/cantaloupe.error-%d{yyyy-MM-dd}.log +log.error.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +#---------------------------------------- +# Access Log +#---------------------------------------- + +log.access.ConsoleAppender.enabled = false + +# N.B.: Don't enable FileAppender and RollingFileAppender simultaneously! +log.access.FileAppender.enabled = false +log.access.FileAppender.pathname = /path/to/logs/access.log + +# RollingFileAppender is an alternative to using something like +# FileAppender + logrotate. +log.access.RollingFileAppender.enabled = false +log.access.RollingFileAppender.pathname = /path/to/logs/access.log +log.access.RollingFileAppender.policy = TimeBasedRollingPolicy +log.access.RollingFileAppender.TimeBasedRollingPolicy.filename_pattern = /path/to/logs/access-%d{yyyy-MM-dd}.log +log.access.RollingFileAppender.TimeBasedRollingPolicy.max_history = 30 + +# See the "SyslogAppender" section for a list of facilities: +# http://logback.qos.ch/manual/appenders.html +log.access.SyslogAppender.enabled = false +log.access.SyslogAppender.host = +log.access.SyslogAppender.port = 514 +log.access.SyslogAppender.facility = LOCAL0 diff --git a/rootfs/usr/local/tomcat/webapps/adore-djatoka/WEB-INF/classes/log4j.properties b/rootfs/usr/local/tomcat/webapps/adore-djatoka/WEB-INF/classes/log4j.properties new file mode 100755 index 0000000..e06a7b5 --- /dev/null +++ b/rootfs/usr/local/tomcat/webapps/adore-djatoka/WEB-INF/classes/log4j.properties @@ -0,0 +1,22 @@ +# Define the root logger with appender file +log4j.rootLogger = DEBUG, FILE + +# Define the file appender +log4j.appender.FILE=org.apache.log4j.FileAppender + +# Set the name of the file +log4j.appender.FILE.File=/usr/local/tomcat/logs/djatoka.log + +# Set the immediate flush to true (default) +log4j.appender.FILE.ImmediateFlush=true + +# Set the threshold to debug mode +log4j.appender.FILE.Threshold=all + +# Set the append to false, overwrite +log4j.appender.FILE.Append=false + +# Define the layout for file appender +log4j.appender.FILE.layout=org.apache.log4j.PatternLayout +#log4j.appender.FILE.layout.conversionPattern=%d{${datestamp}} [%t] %-5p %m%n +log4j.appender.FILE.layout.conversionPattern=%d %m%n