Browse files

version 0.0.2.pre

  • Loading branch information...
2 parents 4d0421f + 9e2f8b8 commit 8adb097d1737dec4c144aa27c8a265b39edf2c9f @helma helma committed Apr 2, 2012
Showing with 1,227 additions and 42,336 deletions.
  1. +4 −4 .gitignore
  2. +12 −0 Gemfile
  3. +111 −0 Gemfile.lock
  4. +674 −0 LICENSE
  5. +33 −0 README
  6. +14 −0 Rakefile
  7. +259 −217 application.rb
  8. +76 −0 bin/toxbank-investigation-install
  9. +6 −10 config.ru
  10. +9 −0 config/production.rb
  11. +0 −2 install/README
  12. +0 −14 install/aa-local.yaml
  13. +0 −77 install/base-install.sh
  14. +0 −37 install/config.sh
  15. +0 −2 install/gemlist
  16. +0 −120 install/install
  17. +0 −55 install/investigation-services.sh
  18. +0 −35 install/nginx.conf
  19. +0 −78 install/nginx.sh
  20. +0 −6 install/production.yaml
  21. +0 −83 install/ruby.sh
  22. +0 −47 install/tb-tools.sh
  23. +0 −41 install/utils.sh
  24. +0 −392 lib/authorization.rb
  25. +0 −72 lib/environment.rb
  26. +0 −100 lib/helper.rb
  27. +0 −45 lib/otlogger.rb
  28. +0 −261 lib/policy.rb
  29. +0 −54 lib/templates/default_guest_policy.xml
  30. +0 −4 lib/toxbank-ruby.rb
  31. +0 −43 test/Rakefile
  32. +0 −3 test/all.rb
  33. +0 −112 test/authorization.rb
  34. +0 −92 test/basic_rest.rb
  35. +0 −97 test/data/invalid/a_TB-ACCUTOX-plate1.txt
  36. +0 −97 test/data/invalid/a_TB-ACCUTOX-plate2.txt
  37. +0 −97 test/data/invalid/a_TB-ACCUTOX-plate3.txt
  38. +0 −97 test/data/invalid/acetaminophen-plate1-data.txt
  39. +0 −97 test/data/invalid/acetaminophen-plate2-data.txt
  40. +0 −97 test/data/invalid/acetaminophen-plate3-data.txt
  41. +0 −156 test/data/invalid/i_Investigation.txt
  42. +0 −20 test/data/invalid/ic50.txt
  43. BIN test/data/invalid/isa_TB_ACCUTOX.xls
  44. BIN test/data/invalid/isa_TB_ACCUTOX.zip
  45. +0 −58 test/data/invalid/s_TB-ACCUTOX-acetaminophen.txt
  46. +0 −19,648 test/data/valid/BII-I-1.n3
  47. +0 −19,648 test/data/valid/BII-I-1.rdf
  48. BIN test/data/valid/BII-I-1.zip
  49. BIN test/data/valid/isa-tab-renamed.zip
  50. BIN test/data/valid/isa_TB_BII.xls
  51. +0 −32 test/import4s.rb
  52. +0 −42 test/querytest.rb
  53. +0 −84 test/upload.rb
  54. +0 −60 test/xls_upload.rb
  55. +29 −0 toxbank-investigation.gemspec
View
8 .gitignore
@@ -1,11 +1,11 @@
+*.gem
+.bundle
+pkg/*
tmp/*
public/*
investigation/*
target/*
-services/*
-java/isa2rdf-0.0.1-SNAPSHOT.jar
+java/*.jar
java/logs
-java/ISA-validator-1.4.zip
-java/ISA-validator-1.4/*
oo_*/*
*~
View
12 Gemfile
@@ -0,0 +1,12 @@
+source :gemcutter
+gemspec
+# uncomment and edit if you want to use github versions of opentox gems
+# gem 'opentox-server', :git => "git://github.com/opentox/opentox-server", :branch => "development"
+# gem 'opentox-client', :git => "git://github.com/opentox/opentox-client", :branch => "development"
+# uncomment and edit if you want to use local installations of opentox gems
+#gem 'rake', '~> 0.9.3.beta.1'
+gem 'opentox-server', :path => "~/opentox-server"
+gem "opentox-client", :path => "~/opentox-client"
+group :test do
+ gem "rack-test", :require => "rack/test"
+end
View
111 Gemfile.lock
@@ -0,0 +1,111 @@
+PATH
+ remote: .
+ specs:
+ toxbank-investigation (0.0.2pre)
+ opentox-server
+
+PATH
+ remote: ~/opentox-client
+ specs:
+ opentox-client (0.0.1pre)
+ bundler
+ open4
+ rdf
+ rdf-raptor
+ rest-client
+
+PATH
+ remote: ~/opentox-server
+ specs:
+ opentox-server (0.0.1pre)
+ emk-sinatra-url-for
+ opentox-client
+ rack
+ rack-contrib
+ roo
+ sinatra
+ sinatra-contrib
+ unicorn
+
+GEM
+ remote: http://rubygems.org/
+ specs:
+ addressable (2.2.7)
+ backports (2.3.0)
+ choice (0.1.5)
+ emk-sinatra-url-for (0.2.1)
+ sinatra (>= 0.9.1.1)
+ eventmachine (0.12.10)
+ faraday (0.7.6)
+ addressable (~> 2.2)
+ multipart-post (~> 1.1)
+ rack (~> 1.1)
+ ffi (1.0.11)
+ google-spreadsheet-ruby (0.1.8)
+ nokogiri (>= 1.4.3.1)
+ oauth (>= 0.3.6)
+ oauth2 (>= 0.5.0)
+ kgio (2.7.2)
+ log4r (1.1.10)
+ mime-types (1.17.2)
+ multi_json (1.1.0)
+ multipart-post (1.1.5)
+ nokogiri (1.5.2)
+ oauth (0.4.5)
+ oauth2 (0.5.2)
+ faraday (~> 0.7)
+ multi_json (~> 1.0)
+ open4 (1.3.0)
+ rack (1.4.1)
+ rack-contrib (1.1.0)
+ rack (>= 0.9.1)
+ rack-protection (1.2.0)
+ rack
+ rack-test (0.6.1)
+ rack (>= 1.0)
+ raindrops (0.8.0)
+ rdf (0.3.5)
+ addressable (>= 2.2.6)
+ rdf-raptor (0.4.1)
+ ffi (>= 1.0)
+ rdf (~> 0.3.0)
+ rest-client (1.6.7)
+ mime-types (>= 1.16)
+ roo (1.10.1)
+ choice (>= 0.1.4)
+ google-spreadsheet-ruby (>= 0.1.5)
+ nokogiri (>= 1.5.0)
+ rubyzip (>= 0.9.4)
+ spreadsheet (> 0.6.4)
+ todonotes (>= 0.1.0)
+ ruby-ole (1.2.11.3)
+ rubyzip (0.9.6.1)
+ sinatra (1.3.2)
+ rack (~> 1.3, >= 1.3.6)
+ rack-protection (~> 1.2)
+ tilt (~> 1.3, >= 1.3.3)
+ sinatra-contrib (1.3.1)
+ backports (>= 2.0)
+ eventmachine
+ rack-protection
+ rack-test
+ sinatra (~> 1.3.0)
+ tilt (~> 1.3)
+ spreadsheet (0.6.8)
+ ruby-ole (>= 1.0)
+ tilt (1.3.3)
+ todonotes (0.1.0)
+ log4r
+ unicorn (4.2.0)
+ kgio (~> 2.6)
+ rack
+ raindrops (~> 0.7)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ opentox-client!
+ opentox-server!
+ rack-test
+ toxbank-investigation!
View
674 LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ 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.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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 <http://www.gnu.org/licenses/>.
+
+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:
+
+ <program> Copyright (C) <year> <name of author>
+ 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
+<http://www.gnu.org/licenses/>.
+
+ 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
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
View
33 README
@@ -1 +1,34 @@
toxbank-investigation: Investigation service for ToxBank
+
+Installation:
+
+ Dependencies: ruby 1.9.x, git, zip, java, curl, wget
+
+ gem install toxbank-investigation
+ toxbank-investigation-install # service setup, configuration and webserver start
+
+Development:
+
+ git clone git@github.com:ToxBank/toxbank-investigation.git
+ cd toxbank-investigation
+ git checkout development
+
+ # edit Gemfile
+ #
+ # uncomment and edit if you want to use github versions of opentox gems
+ # gem 'opentox-server', :git => "git://github.com/opentox/opentox-server", :branch => "development"
+ # gem 'opentox-client', :git => "git://github.com/opentox/opentox-client", :branch => "development"
+ # uncomment and edit if you want to use local installations of opentox gems
+ # gem 'opentox-server', :path => "~/opentox-server"
+ # gem "opentox-client", :path => "~/opentox-client"
+
+ bundle install
+ bin/toxbank-investigation-install
+ # Do you want to start the webserver? (y/n)
+ # Answer "n"
+ unicorn # starts server in development mode at port 8080
+ # unicorn -h: more options
+
+ see also https://github.com/opentox/opentox-server
+
+
View
14 Rakefile
@@ -0,0 +1,14 @@
+require "bundler/gem_tasks"
+require 'bundler'
+Bundler.require
+Bundler.setup
+
+require 'rake/testtask'
+Rake::TestTask.new do |t|
+ t.libs << 'test'
+ t.test_files = FileList['test/*.rb'] - FileList["test/setup.rb"]
+ t.verbose = true
+end
+
+desc "Run tests"
+task :default => :test
View
476 application.rb
@@ -1,242 +1,284 @@
-require 'rubygems'
-require 'fileutils'
-require 'rack'
-require 'rack/contrib'
-require 'sinatra'
-require 'sinatra/url_for'
-require 'grit'
-require 'yaml'
-require 'lib/toxbank-ruby'
-require 'spreadsheet'
-require 'roo'
-require 'uri'
-
-
-helpers do
-
- def uri
- params[:id] ? url_for("/#{params[:id]}", :full) : "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
- end
+require "opentox-server"
+require File.join(ENV["HOME"],".opentox","config","toxbank-investigation.rb")
- def uri_list
- params[:id] ? d = "./investigation/#{params[:id]}/*" : d = "./investigation/*"
- Dir[d].collect{|f| url_for(f.sub(/\.\/investigation/,''),:full) if f.match(/\.txt$/) or f.match(/\d$/) }.compact.sort.join("\n") + "\n"
- end
+module OpenTox
+ class Application < Service
- def dir
- File.join File.dirname(File.expand_path __FILE__), "investigation", params[:id].to_s
- end
+ helpers do
- def tmp
- File.join dir,"tmp"
- end
+ def uri
+ params[:id] ? url_for("/#{params[:id]}", :full).sub("http://","https://") : "https://#{request.env['HTTP_HOST']}"
+ end
- def file
- File.join dir, params[:filename]
- end
+ def uri_list
+ params[:id] ? d = "./investigation/#{params[:id]}/*" : d = "./investigation/*"
+ uris = Dir[d].collect{|f| url_for(f.sub(/\.\/investigation/,''), :full).sub("http://","https://") }
+ uris.collect!{|u| u.sub(/(\/#{params[:id]}\/)/,'\1isatab/')} if params[:id]
+ uris.compact.sort.join("\n") + "\n"
+ end
- def n3
- "#{params[:id]}.n3"
- end
+ def dir
+ File.join File.dirname(File.expand_path __FILE__), "investigation", params[:id].to_s
+ end
- def next_id
- id = Dir["./investigation/*"].collect{|f| File.basename(f).to_i}.sort.last
- id ? id + 1 : 0
- end
+ def tmp
+ File.join dir,"tmp"
+ end
- def prepare_upload
- # lock tmp dir
- halt 423, "Importing another submission. Please try again later." if File.exists? tmp
- halt 400, "Please submit data as multipart/form-data" unless request.form_data?
- # move existing ISA-TAB files to tmp
- FileUtils.mkdir_p tmp
- FileUtils.cp Dir[File.join(dir,"*.txt")], tmp
- File.open(File.join(tmp, params[:file][:filename]), "w+"){|f| f.puts params[:file][:tempfile].read}
- end
+ def file
+ File.join dir, params[:filename]
+ end
- def extract_zip
- # overwrite existing files with new submission
- `unzip -o #{File.join(tmp,params[:file][:filename])} -d #{tmp}`
- Dir["#{tmp}/*"].collect{|d| d if File.directory?(d)}.compact.each do |d|
- `mv #{d}/* #{tmp}`
- `rmdir #{d}`
- end
- end
+ def n3
+ "#{params[:id]}.n3"
+ end
- def extract_xls
- # use Excelx.new instead of Excel.new if your file is a .xlsx
- xls = Excel.new(File.join(tmp, params[:file][:filename])) if params[:file][:filename].match(/.xls$/)
- xls = Excelx.new(File.join(tmp, params[:file][:filename])) if params[:file][:filename].match(/.xlsx$/)
- xls.sheets.each_with_index do |sh, idx|
- name = sh.to_s
- xls.default_sheet = xls.sheets[idx]
- 1.upto(xls.last_row) do |ro|
- 1.upto(xls.last_column) do |co|
- unless (co == xls.last_column)
- File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "#{xls.cell(ro, co)}\t"}
- #File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "\"#{xls.cell(ro, co)}\"\t"}
- else
- File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "#{xls.cell(ro, co)}\n"}
- #File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "\"#{xls.cell(ro, co)}\"\n"}
+ def next_id
+ id = Dir["./investigation/*"].collect{|f| File.basename(f).to_i}.sort.last
+ id ? id + 1 : 0
+ end
+
+ def prepare_upload
+ # remove stale directories from failed tests
+ stale_files = `cd #{File.dirname(__FILE__)}/investigation && git ls-files --others --exclude-standard --directory`.chomp
+ `cd #{File.dirname(__FILE__)}/investigation && rm -rf #{stale_files}` unless stale_files.empty?
+ # lock tmp dir
+ locked_error "Processing investigation #{params[:id]}. Please try again later." if File.exists? tmp
+ bad_request_error "Please submit data as multipart/form-data" unless request.form_data?
+ # move existing ISA-TAB files to tmp
+ FileUtils.mkdir_p tmp
+ FileUtils.cp Dir[File.join(dir,"*.txt")], tmp
+ File.open(File.join(tmp, params[:file][:filename]), "w+"){|f| f.puts params[:file][:tempfile].read}
+ end
+
+ def extract_zip
+ # overwrite existing files with new submission
+ `unzip -o #{File.join(tmp,params[:file][:filename])} -d #{tmp}`
+ Dir["#{tmp}/*"].collect{|d| d if File.directory?(d)}.compact.each do |d|
+ `mv #{d}/* #{tmp}`
+ `rmdir #{d}`
+ end
+ end
+
+ def extract_xls
+ # use Excelx.new instead of Excel.new if your file is a .xlsx
+ xls = Excel.new(File.join(tmp, params[:file][:filename])) if params[:file][:filename].match(/.xls$/)
+ xls = Excelx.new(File.join(tmp, params[:file][:filename])) if params[:file][:filename].match(/.xlsx$/)
+ xls.sheets.each_with_index do |sh, idx|
+ name = sh.to_s
+ xls.default_sheet = xls.sheets[idx]
+ 1.upto(xls.last_row) do |ro|
+ 1.upto(xls.last_column) do |co|
+ unless (co == xls.last_column)
+ File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "#{xls.cell(ro, co)}\t"}
+ else
+ File.open(File.join(tmp, name + ".txt"), "a+"){|f| f.print "#{xls.cell(ro, co)}\n"}
+ end
+ end
end
+ end
+ rescue
+ bad_request_error "Could not parse spreadsheet #{params[:file][:filename]}"
+ end
+
+ def isa2rdf
+ begin # isa2rdf returns correct exit code
+ `cd #{File.dirname(__FILE__)}/java && java -jar isa2rdf-0.0.1-SNAPSHOT.jar -d #{tmp} -o #{File.join tmp,n3} &> #{File.join tmp,'log'}`
+ rescue
+ log = File.read File.join(tmp,"log")
+ FileUtils.remove_entry dir
+ bad_request_error "ISA-TAB validation failed:\n#{log}", uri
end
+ # rewrite default prefix
+ `sed -i 's;http://onto.toxbank.net/isa/tmp/;#{uri}/;' #{File.join tmp,n3}`
+ # add owl:sameAs to identify investigation later
+ investigation_id = `grep ":I[0-9]" #{File.join tmp,n3}|cut -f1 -d ' '`.strip
+ `echo "\n: owl:sameAs #{investigation_id} ." >> #{File.join tmp,n3}`
+ FileUtils.rm Dir[File.join(tmp,"*.zip")]
+ # if everything is fine move ISA-TAB files back to original dir
+ FileUtils.cp Dir[File.join(tmp,"*")], dir
+ # git commit
+ newfiles = `cd #{File.dirname(__FILE__)}/investigation; git ls-files --others --exclude-standard --directory`
+ `cd #{File.dirname(__FILE__)}/investigation && git add #{newfiles}`
+ ['application/zip', 'application/vnd.ms-excel'].include?(params[:file][:type]) ? action = "created" : action = "modified"
+ `cd #{File.dirname(__FILE__)}/investigation && git commit -am "investigation #{params[:id]} #{action} by #{request.ip}"`
+ # create new zipfile
+ zipfile = File.join dir, "investigation_#{params[:id]}.zip"
+ `zip -j #{zipfile} #{dir}/*.txt`
+ # store RDF
+ length = File.size(File.join dir,n3)
+ file = File.join(dir,n3)
+ `curl -0 -k -u #{$four_store[:user]}:#{$four_store[:password]} -T #{file} -H 'Content_Length => #{length}' '#{$four_store[:uri]}/data/?graph=#{$four_store[:uri]}/data/#{$four_store[:user]}/investigation#{n3}'`
+ FileUtils.remove_entry tmp # unlocks tmp
+ OpenTox::Authorization.check_policy(uri, @subjectid)
+ uri
end
- end
- end
- def isa2rdf
- result = `cd java && java -jar isa2rdf-0.0.1-SNAPSHOT.jar -d #{tmp} -o #{File.join tmp,n3}` # warnings go to stdout
- if result =~ /Invalid ISA-TAB/ or !File.exists? "#{File.join tmp,n3}"
- FileUtils.remove_entry tmp
- FileUtils.remove_entry dir
- halt 400, "ISA-TAB validation failed:\n"+result
+ def query sparql
+ if @accept.match(/turtle/) and sparql.match(/CONSTRUCT/)
+ response['Content-type'] = @accept
+ elsif sparql.match(/CONSTRUCT/)
+ response['Content-type'] = 'application/rdf+xml'
+ else
+ response['Content-type'] = "application/sparql-results+xml"
+ end
+ `curl -H 'Accept:#{@accept}' -k -u #{$four_store[:user]}:#{$four_store[:password]} -d 'query=#{sparql}' '#{$four_store[:uri]}/sparql/'`
+ end
+
end
- # if everything is fine move ISA-TAB files back to original dir
- FileUtils.cp Dir[File.join(tmp,"*")], dir
- # git commit
- newfiles = `cd investigation; git ls-files --others --exclude-standard --directory`
- `cd investigation && git add #{newfiles}`
- ['application/zip', 'application/vnd.ms-excel'].include?(params[:file][:type]) ? action = "created" : action = "modified"
- `cd investigation && git commit -am "investigation #{params[:id]} #{action} by #{request.ip}"`
- # create new zipfile
- zipfile = File.join dir, "investigation_#{params[:id]}.zip"
- `zip -j #{zipfile} #{dir}/*.txt`
- FileUtils.remove_entry tmp # unlocks tmp
- # store RDF
- # TODO: remove RDF of existing investigations
- puts `4s-import -v ToxBank --model #{uri} #{File.join dir,n3}`
- response['Content-Type'] = 'text/uri-list'
- uri
- end
- def query
- @base ="http://onto.toxbank.net/isa/TEST/"
- @prefix ="PREFIX isa: <http://onto.toxbank.net/isa/>PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>PREFIX dc:<http://purl.org/dc/elements/1.1/>PREFIX owl: <http://www.w3.org/2002/07/owl#>PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX dcterms: <http://purl.org/dc/terms/>"
- params.each{|k, v| @query = CGI.unescape(v)}
- # use it like: "http://localhost/?query=SELECT * WHERE {?x ?p ?o}" in your browser
- @result = `4s-query --soft-limit -1 ToxBank -f json -b '#{@base}' '#{@prefix} #{@query}'`
- @result.chomp
- end
-
- def query_all
- @base ="http://onto.toxbank.net/isa/TEST/"
- @prefix ="PREFIX isa: <http://onto.toxbank.net/isa/>PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>PREFIX dc:<http://purl.org/dc/elements/1.1/>PREFIX owl: <http://www.w3.org/2002/07/owl#>PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>PREFIX dcterms: <http://purl.org/dc/terms/>"
- @result = `4s-query --soft-limit -1 ToxBank -f json -b '#{@base}' '#{@prefix} SELECT * WHERE {?s ?p ?o}'`
- @result.chomp
- end
-end
+ before do
+ not_found_error "Directory #{dir} does not exist." unless File.exist? dir
+ @accept = request.env['HTTP_ACCEPT']
+ response['Content-Type'] = @accept
+ # TODO: A+A
+ end
-before do
- halt 404 unless File.exist? dir
- @accept = request.env['HTTP_ACCEPT']
- response['Content-Type'] = @accept
- # TODO: A+A
-end
+ # Query all investigations or get a list of all investigations
+ # Requests with a query parameter will perform a SPARQL query on all investigations
+ # @return [application/sparql-results+json] Query result
+ # @return [text/uri-list] List of investigations
+ get '/?' do
+ if params[:query] # pass SPARQL query to 4store
+ query params[:query]
+ else
+ # Requests without a query parameter return a list of all investigations
+ case @accept
+ when 'text/uri-list'
+ uri_list
+ else
+ response['Content-Type'] = 'application/rdf+xml'
+ response['Content-Type'] = @accept if @accept == 'text/turtle'
+ query "
+ PREFIX isa: <http://onto.toxbank.net/isa/>
+ CONSTRUCT { ?s ?p ?o . }
+ WHERE {
+ ?s a isa:Investigation ;
+ ?p ?o .
+ }
+ "
+ end
+ end
+ end
-# Query all investigations or get a list of all investigations
-# Requests with a query parameter will perform a SPARQL query on all investigations
-# @return [application/sparql-results+json] Query result
-# @return [text/uri-list] List of investigations
-get '/?' do
- if params[:query] # "/?query=SELECT * WHERE {?s ?p ?o}"
- # @param query SPARQL query
- response['Content-type'] = "application/sparql-results+json"
- query
- elsif params[:query_all] # "/?query="
- # Requests without a query string return a list of all sparql results (?s ?p ?o)
- response['Content-type'] = "application/sparql-results+json"
- query_all
- else
- # Requests without a query parameter return a list of all investigations
- response['Content-Type'] = 'text/uri-list'
- uri_list
- end
-end
+ # Create a new investigation from ISA-TAB files
+ # @param [Header] Content-type: multipart/form-data
+ # @param file Zipped investigation files in ISA-TAB format
+ # @return [text/uri-list] Investigation URI
+ post '/?' do
+ params[:id] = next_id
+ mime_types = ['application/zip','text/tab-separated-values', "application/vnd.ms-excel"]
+ bad_request_error "No file uploaded." unless params[:file]
+ bad_request_error "Mime type #{params[:file][:type]} not supported. Please submit data as zip archive (application/zip), Excel file (application/vnd.ms-excel) or as tab separated text (text/tab-separated-values)" unless mime_types.include? params[:file][:type]
+ task = OpenTox::Task.create($task[:uri], :description => "#{params[:file][:filename]}: Uploding, validating and converting to RDF") do
+ prepare_upload
+ case params[:file][:type]
+ when "application/vnd.ms-excel"
+ extract_xls
+ when "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
+ extract_xls
+ when 'application/zip'
+ extract_zip
+ #when 'text/tab-separated-values' # do nothing, file is already in tmp
+ end
+ isa2rdf
+ end
+ response['Content-Type'] = 'text/uri-list'
+ halt 202,task.uri+"\n"
+ end
-# Create a new investigation from ISA-TAB files
-# @param [Header] Content-type: multipart/form-data
-# @param file Zipped investigation files in ISA-TAB format
-# @return [text/uri-list] Investigation URI
-post '/?' do
- # TODO check free disc space + Limit 4store to 10% free disc space
- params[:id] = next_id
- prepare_upload
- case params[:file][:type]
- when "application/vnd.ms-excel"
- extract_xls
- when "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
- extract_xls
- when 'application/zip'
- extract_zip
- when 'text/tab-separated-values' # do nothing, file is already in tmp
- else
- mime_types = ['application/zip','text/tab-separated-values', "application/vnd.ms-excel"]
- halt 400, "Mime type #{params[:file][:type]} not supported. Please submit data as zip archive (application/zip), Excel file (application/vnd.ms-excel) or as tab separated text (text/tab-separated-values)" unless mime_types.include? params[:file][:type]
- end
- isa2rdf
-end
+ # Get an investigation representation
+ # @param [Header] Accept: one of text/tab-separated-values, text/uri-list, application/zip, application/sparql-results+json
+ # @return [text/tab-separated-values, text/uri-list, application/zip, application/sparql-results+json] Investigation in the requested format
+ get '/:id' do
+ not_found_error "Investigation #{uri} does not exist." unless File.exist? dir # not called in before filter???
+ case @accept
+ when "text/tab-separated-values"
+ send_file Dir["./investigation/#{params[:id]}/i_*txt"].first, :type => @accept
+ when "text/uri-list"
+ uri_list
+ when "application/zip"
+ send_file File.join dir, "investigation_#{params[:id]}.zip"
+ when "application/rdf+xml"
+ query "CONSTRUCT { ?s ?p ?o } FROM <#{$four_store[:uri]}/data/#{$four_store[:user]}/investigation#{n3}> WHERE {?s ?p ?o } LIMIT 15000"
+ else
+ #$logger.debug request.to_yaml
+ #bad_request_error "Accept header #{@accept} not supported for #{uri}"
+ $logger.warn "Accept header #{@accept} not supported for #{uri}" # do not halt: strange requests from test, TODO: identify and fix
+ end
+ end
-# Get an investigation representation
-# @param [Header] Accept: one of text/tab-separated-values, text/uri-list, application/zip, application/sparql-results+json
-# @return [text/tab-separated-values, text/uri-list, application/zip, application/sparql-results+json] Investigation in the requested format
-get '/:id' do
- halt 404 unless File.exist? dir # not called in before filter???
- case @accept
- when "text/tab-separated-values"
- send_file Dir["./investigation/#{params[:id]}/i_*txt"].first, :type => @accept
- when "text/uri-list"
- uri_list
- when "application/zip"
- send_file File.join dir, "investigation_#{params[:id]}.zip"
- when "application/sparql-results+json"
- query_all
- # TODO return all data from [:id] investigation
- else
- halt 400, "Accept header #{@accept} not supported"
- end
-end
+ # Get investigation metadata in RDF
+ get '/:id/metadata' do
+ not_found_error "Investigation #{uri} does not exist." unless File.exist? dir # not called in before filter???
+ query "
+ PREFIX : <#{uri}/>
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
+ CONSTRUCT { ?s ?p ?o. }
+ WHERE {
+ : owl:sameAs ?s .
+ ?s ?p ?o .
+ }
+ "
+ end
+ # Get a study, assay, data representation
+ # @param [Header] one of text/tab-separated-values, application/sparql-results+json
+ # @return [text/tab-separated-values, application/sparql-results+json] Study, assay, data representation in ISA-TAB or RDF format
+ get '/:id/isatab/:filename' do
+ not_found_error "File #{File.join uri,"isatab",params[:filename]} does not exist." unless File.exist? file
+ # TODO: returns text/plain content type for tab separated files
+ send_file file, :type => File.new(file).mime_type
+ end
-# Add studies, assays or data to an investigation
-# @param [Header] Content-type: multipart/form-data
-# @param file Study, assay and data file (zip archive of ISA-TAB files or individual ISA-TAB files)
-# @return [text/uri-list] New resource URI(s)
-post '/:id' do
- prepare_upload
- isa2rdf
-end
+ # Get RDF for an investigation resource
+ get '/:id/:resource' do
+ query "
+ PREFIX : <#{uri}/>
+ PREFIX owl: <http://www.w3.org/2002/07/owl#>
+ CONSTRUCT { :#{params[:resource]} ?p ?o. }
+ WHERE {
+ :#{params[:resource]} ?p ?o .
+ }
+ "
+ end
-# Delete an investigation
-delete '/:id' do
- FileUtils.remove_entry dir
- # git commit
- `cd investigation; git commit -am "#{dir} deleted by #{request.ip}"`
- # TODO: updata RDF
- `4s-delete-model ToxBank #{uri}`
- response['Content-Type'] = 'text/plain'
- "investigation #{params[:id]} deleted"
-end
+ # Add studies, assays or data to an investigation
+ # @param [Header] Content-type: multipart/form-data
+ # @param file Study, assay and data file (zip archive of ISA-TAB files or individual ISA-TAB files)
+ post '/:id' do
+ mime_types = ['application/zip','text/tab-separated-values', "application/vnd.ms-excel"]
+ bad_request_error "Mime type #{params[:file][:type]} not supported. Please submit data as zip archive (application/zip), Excel file (application/vnd.ms-excel) or as tab separated text (text/tab-separated-values)" unless mime_types.include? params[:file][:type]
+ task = OpenTox::Task.create($task[:uri], :description => "#{params[:file][:filename]}: Uploding, validationg and converting to RDF") do
+ prepare_upload
+ isa2rdf
+ end
+ response['Content-Type'] = 'text/uri-list'
+ halt 202,task.uri+"\n"
+ end
-# Get a study, assay, data representation
-# @param [Header] one of text/tab-separated-values, application/sparql-results+json
-# @return [text/tab-separated-values, application/sparql-results+json] Study, assay, data representation in ISA-TAB or RDF format
-get '/:id/:filename' do
- case @accept
- when "text/tab-separated-values"
- send_file file, :type => @accept
- when "application/sparql-results+json"
- # TODO: return all data in rdf
- halt 501, "SPARQL query not yet implemented"
- else
- halt 400, "Accept header #{@accept} not supported"
- end
-end
+ # Delete an investigation
+ delete '/:id' do
+ FileUtils.remove_entry dir
+ # git commit
+ `cd #{File.dirname(__FILE__)}/investigation; git commit -am "#{dir} deleted by #{request.ip}"`
+ # updata RDF
+ `curl -i -k -u #{$four_store[:user]}:#{$four_store[:password]} -X DELETE '#{$four_store[:uri]}/data/#{$four_store[:user]}/investigation#{n3}'`
+ response['Content-Type'] = 'text/plain'
+ "Investigation #{params[:id]} deleted"
+ end
-# Delete an individual study, assay or data file
-delete '/:id/:filename' do
- prepare_upload
- File.delete File.join(tmp,params[:filename])
- isa2rdf
- response['Content-Type'] = 'text/plain'
- "#{params[:filename]} deleted from investigation #{params[:id]}"
+ # Delete an individual study, assay or data file
+ delete '/:id/:filename' do
+ task = OpenTox::Task.create($task[:uri], :description => "Deleting #{params[:file][:filename]} from investigation #{params[:id]}.") do
+ prepare_upload
+ File.delete File.join(tmp,params[:filename])
+ isa2rdf
+ "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
+ end
+ response['Content-Type'] = 'text/uri-list'
+ halt 202,task.uri+"\n"
+ end
+
+ end
end
View
76 bin/toxbank-investigation-install
@@ -0,0 +1,76 @@
+#!/bin/sh
+# Main ToxBank-investigation install script
+# Author: Christoph Helma, Andreas Maunz, Denis Gebele.
+
+ISA2RDF=isa2rdf-0.0.1-SNAPSHOT.jar
+
+echo
+echo "This script will setup and configure the toxbank-investigation service."
+echo "You may have to run the script as root if the toxbank-invetigation gem has been installed as root (deprecated)"
+echo
+
+TB_HOME=`dirname $0`/..
+cd $TB_HOME
+TB_HOME=`pwd`
+mkdir -p investigation
+mkdir -p java
+mkdir -p public
+
+
+cd java
+if [ ! -f $ISA2RDF ]
+then
+ echo "Installing isa2rdf"
+ wget -v "https://github.com/downloads/ToxBank/isa2rdf/$ISA2RDF"
+fi
+cd $TB_HOME
+
+cd investigation
+if [ ! -d .git ]
+then
+ echo "Initializing git for investigations"
+ git init
+ echo "*/*.zip" > .gitignore
+ echo "*/tmp" >> .gitignore
+ git add .gitignore
+ git commit -am "Initial commit: .gitignore added"
+fi
+cd $TB_HOME
+
+echo "Installing configuration files"
+
+mkdir -p "$HOME/.opentox/config/toxbank-investigation"
+mkdir -p "$HOME/.opentox/log"
+mkdir -p "$HOME/.opentox/tmp"
+
+config="$HOME/.opentox/config/toxbank-investigation/production.rb"
+
+if [ -f $config ]
+then
+ echo "Configuration $config exists. Please check if the settings are correct."
+else
+ echo "Creating configuration"
+ echo -n "Please enter your 4store username: "
+ read user
+ echo -n "Please enter your 4store password: "
+ read pass
+
+ sed -e "s/ USER/ '$user'/;s/ PASS/ '$pass'/" config/production.rb > $config
+ echo "Configuration $config created. Please check if the settings are correct."
+fi
+
+echo
+echo "Installation finished and system configured."
+echo "Do you want to start the webserver? (y/n)"
+
+read answer
+if [ $answer = "y" ]
+then
+ last_ip=`ip addr show|grep -w inet|grep -v '127.0'|sed 's/ \+inet //'|cut -d '/' -f1|cut -d '.' -f4`
+ port=8`printf "%03d" $last_ip`
+ echo "Starting unicorn in production mode at port $port"
+ unicorn -p $port -E production -D
+else
+ echo "Run 'unicorn -E production -D' to start the service. See 'unicorn -h' for more options"
+fi
+echo
View
16 config.ru
@@ -1,10 +1,6 @@
-#require 'rubygems'
-#require 'rack'
-#require 'rack/contrib'
-#require 'sinatra'
-require 'application.rb'
-#require 'opentox-ruby'
-#require 'config/config_ru'
-run Sinatra::Application
-set :raise_errors, true
-set :show_exceptions, true
+require 'bundler'
+Bundler.require
+#Encoding.default_external = Encoding::UTF_8
+#Encoding.default_internal = Encoding::UTF_8
+require './application.rb'
+run OpenTox::Application
View
9 config/production.rb
@@ -0,0 +1,9 @@
+TASK = "http://webservices.in-silico.ch/task"
+
+FOUR_STORE = "https://4store.in-silico.ch"
+FOUR_STORE_USER = USER
+FOUR_STORE_PASS = PASS
+
+AA = "https://opensso.in-silico.ch"
+AA_USER = "guest"
+AA_PASS = "guest"
View
2 install/README
@@ -1,2 +0,0 @@
-Add {source "$HOME/.toxbank-ui-sh"} to your .bashrc and check tb-tools.sh for commands. Works on Debian and Ubuntu (if you get problems during installation try to remove already installed libraptor1 library before you run the installer).
-After configure the paths install gems from the gemlist.
View
14 install/aa-local.yaml
@@ -1,14 +0,0 @@
-# OpenSSO Authorization
-# set ":server: " to disable A&A
-:authorization:
- :server: AA
- :free_request: #request-method not controlled by A&A
- - "GET"
- - "POST"
- - "HEAD"
- - "DELETE"
- - "PUT"
- :authenticate_request: #only for authenticated user
- - ""
- :authorize_request: #only for authenticated and authorizeduser
- - ""
View
77 install/base-install.sh
@@ -1,77 +0,0 @@
-#!/bin/sh
-#
-# Installs base packages for Ubuntu
-# Author: Andreas Maunz, Denis Gebele
-#
-# Your installed packages are safe and will not be updated.
-
-. "`pwd`/utils.sh"
-DIR="`pwd`"
-
-if [ "$(id -u)" = "0" ]; then
- echo "This script must not be run as root" 1>&2
- exit 1
-fi
-
-# Utils
-APTITUDE="`which aptitude`"
-APT_CACHE="`which apt-cache`"
-DPKG="`which dpkg`"
-
-if [ ! -e "$APTITUDE" ]; then
- echo "Aptitude missing. Install aptitude first." 1>&2
- exit 1
-fi
-
-touch $TB_UI_CONF
-
-# Pkgs
-packs="build-essential curl git-core hostname libcurl4-openssl-dev libpcre3-dev libxml2-dev libtool libglib2.0-dev libreadline-dev libssl-dev libxslt-dev ncurses-dev openjdk-6-jdk unzip wget zip"
-
-echo
-echo "Base Packages:"
-
-pack_arr=""
-for p in $packs; do
- if $DPKG -S "$p" >/dev/null 2>&1; then
- printf "%50s%30s\n" "'$p'" "Y"
- else
- printf "%50s%30s\n" "'$p'" "N"
- pack_arr="$pack_arr $p"
- fi
-done
-
-if [ -n "$pack_arr" ]; then
- echo
- echo "Checking availablity:"
- sudo $APTITUDE update -y >/dev/null 2>&1
-# sudo $APTITUDE upgrade -y >/dev/null 2>&1
-fi
-
-for p in $pack_arr; do
- if [ -n "`$APT_CACHE search $p`" ] ; then
- printf "%50s%30s\n" "'$p'" "Y"
- else
- printf "%50s%30s\n" "'$p'" "N"
- pack_fail="$pack_fail $p"
- fi
-done
-
-if [ -n "$pack_fail" ]; then
- echo
- echo "WARNING: At least one missing package has no suitable installation candidate."
- echo "Press <Ctrl+C> to abort (5 sec)."
- sleep 5
-fi
-
-echo
-if [ -n "$pack_arr" ]; then
- echo "Installing missing packages:"
-fi
-
-for p in $pack_arr; do
- cmd="sudo $APTITUDE -y install $p" && run_cmd "$cmd" "$p"
-done
-
-cd "$DIR"
-
View
37 install/config.sh
@@ -1,37 +0,0 @@
-#!/bin/sh
-#
-# Configuration file for ToxBank-Investigation installer.
-# Author: Christoph Helma, Andreas Maunz, Denis Gebele.
-#
-
-# 1) Base setup
-TB_DIST="debian" # Linux distribution (debian)
-TB_INSTALL="local" # Type (local)
-TB_BRANCH="master" # Maturity (master)
-
-# 2) Where all binaries are installed.
-TB_PREFIX="$HOME/toxbank-investigation/services"
-TB_HOME="$HOME/toxbank-investigation"
-
-# 3) What versions to install.
-RUBY_NUM_VER="1.8.7-2011.03"
-
-# 4) Server settings.
-NGINX_SERVERNAME="localhost"
-WWW_DEST="$TB_HOME/public"
-PORT=":8080" # set to empty string ("") for port 80 otherwise set to port *using colon* e.g. ":8080"
-OHM_PORT="6379" # set to port (no colon)
-
-# Done.
-
-
-### Nothing to gain from changes below this line.
-RUBY_CONF="$TB_PREFIX/.sh_ruby_tb"
-NGINX_CONF="$TB_PREFIX/.sh_nginx_tb"
-
-RUBY_VER="ruby-enterprise-$RUBY_NUM_VER"
-
-RUBY_DEST="$TB_PREFIX/$RUBY_VER"
-NGINX_DEST="$TB_PREFIX/nginx"
-
-TB_UI_CONF="$HOME/.toxbank-ui.sh"
View
2 install/gemlist
@@ -1,2 +0,0 @@
-# After configure your ruby path (install/README) install this gems
-gem install rack-contrib sinatra emk-sinatra-url-for grit iconv rest-client roo spreadsheet --no-ri --no-rdoc
View
120 install/install
@@ -1,120 +0,0 @@
-#!/bin/sh
-# Main ToxBank-investigation install script
-# Author: Christoph Helma, Andreas Maunz, Denis Gebele.
-
-DIR=`pwd`
-if [ "$(id -u)" = "0" ]; then
- echo "This script must not be run as root" 1>&2
- exit 1
-fi
-
-LOG="/tmp/`basename $0`-log.txt"
-. "./utils.sh"
-echo
-echo "ToxBank-investigation installation."
-echo "You may need to give root password for some privileged actions right now and later:"
-echo
-cmd="sudo echo -n \"\"" && run_cmd "$cmd" "Acquire privileges"
-
-echo "Cleaning up /tmp files."
-sudo rm -rf /tmp/ruby* /tmp/passenger*
-
-. "./base-install.sh"
-. "./ruby.sh"
-
-if [ "$install" != "gem" ]
-then
- . "./nginx.sh"
- . "./investigation-services.sh"
-fi
-
-cd $TB_HOME
-mkdir -p investigation
-mkdir -p java
-mkdir -p public
-mkdir -p tmp
-
-cd java
-#wget https://github.com/downloads/ISA-tools/ISAvalidator-ISAconverter-BIImanager/ISA-validator-1.4.zip
-#unzip ISA-validator-1.4.zip
-wget https://github.com/downloads/ToxBank/isa2rdf/isa2rdf-0.0.1-SNAPSHOT.jar
-cd -
-
-# get, compile, install "raptor" "rasqal"
-# raptor
-cd tmp
-wget http://download.librdf.org/source/raptor2-2.0.4.tar.gz
-tar xvzf raptor2-2.0.4.tar.gz
-cd raptor2-2.0.4 >>$LOG 2>&1
-./configure
-make
-sudo make install
-cd -
-
-# rasqal
-wget http://download.librdf.org/source/rasqal-0.9.27.tar.gz
-tar xvzf rasqal-0.9.27.tar.gz
-cd rasqal-0.9.27
-./configure >>$LOG 2>&1
-make
-sudo make install
-cd -
-
-# 4store
-wget http://4store.org/download/4store-v1.1.4.tar.gz
-tar xvzf 4store-v1.1.4.tar.gz
-cd 4store-v1.1.4
-./configure --with-storage-path=$TB_PREFIX/4store >>$LOG 2>&1
-make >>$LOG 2>&1
-sudo make install
-sudo /sbin/ldconfig
-cd $TB_HOME
-sudo rm -r tmp
-
-# start 4s service
-4s-backend-setup ToxBank
-4s-backend ToxBank
-
-cd investigation
-git init
-echo "*/*.zip" > .gitignore
-echo "*/tmp" >> .gitignore
-git add .gitignore
-git commit -am ".gitignore added"
-cd -
-
-servername="`hostname`"
-serverdomain="`dnsdomainname`"
-if [ -n "$serverdomain" ]; then
- servername="$servername"."$serverdomain"
-fi
-escapedserver="`echo $servername | sed 's/\/\\\//'`"
-
-if [ "$TB_BRANCH" = "development" ]; then
- logger=":logger: backtrace"
-else
- logger=""
-fi
-
-if [ "$TB_INSTALL" = "server" ]; then
- aa="https:\/\/opensso.in-silico.ch"
-else
- aa=""
-fi
-
-mkdir -p "$HOME/.toxbank/config" >>$LOG 2>&1
-mkdir -p "$HOME/.toxbank/log" >>$LOG 2>&1
-mkdir -p "$HOME/.toxbank/tmp" >>$LOG 2>&1
-
-git checkout production.yaml >>$LOG 2>&1
-git checkout aa-$TB_INSTALL.yaml >>$LOG 2>&1
-
-cmd="sed -e \"s,SERVERNAME,$servername,;s,ESCAPEDSERVER,$escapedserver,;s,LOGGER,$logger,;s,AA,$aa,;s,WWW_DEST,$WWW_DEST,;s,NGINX_PORT,$NGINX_PORT,\" $DIR/production.yaml > $HOME/.toxbank/config/production.yaml" && run_cmd "$cmd" "Config 1"
-cmd="sed -e \"s,SERVERNAME,$servername,;s,ESCAPEDSERVER,$escapedserver,;s,LOGGER,$logger,;s,AA,$aa,;s,WWW_DEST,$WWW_DEST,;s,NGINX_PORT,$NGINX_PORT,\" $DIR/aa-$TB_INSTALL.yaml >> $HOME/.toxbank/config/production.yaml" && run_cmd "$cmd" "Config 2"
-
-echo
-echo "Installation finished and system configured."
-echo "Destination: '$TB_PREFIX'"
-echo "Nginx: '$NGINX_DEST'"
-echo "IMPORTANT: Include the file '$TB_UI_CONF' in your shell or system startup to have the system automatically configured."
-echo
View
55 install/investigation-services.sh
@@ -1,55 +0,0 @@
-#!/bin/sh
-#
-# Installs Opentox Webservices.
-# Author: Christoph Helma, Andreas Maunz, Denis Gebele.
-#
-
-. "`pwd`/utils.sh"
-DIR=`pwd`
-
-if [ "$(id -u)" = "0" ]; then
- echo "This script must be run as non-root." 1>&2
- exit 1
-fi
-
-# Utils
-WGET="`which wget`"
-if [ ! -e "$WGET" ]; then
- echo "'wget' missing. Install 'wget' first. Aborting..."
- exit 1
-fi
-
-GIT="`which git`"
-if [ ! -e "$GIT" ]; then
- echo "'git' missing. Install 'git' first. Aborting..."
- exit 1
-fi
-
-RUBY="`which ruby`"
-if [ ! -e "$RUBY" ]; then
- echo "'ruby' missing. Install 'ruby' first. Aborting..."
- exit 1
-fi
-
-LOG="/tmp/`basename $0`-log.txt"
-
-echo
-echo "services ('$LOG'):"
-
-#mkdir -p "$WWW_DEST" >>$LOG 2>&1
-#cd "$WWW_DEST" >>$LOG 2>&1
-#for s in $HOME; do
- #rm -rf "$s" >>$LOG 2>&1
- #$GIT clone "git://github.com/ToxBank/toxbank-investigation/$s.git" "$s" >>$LOG 2>&1
- #cd "$s" >>$LOG 2>&1
- #$GIT checkout -b $TB_BRANCH origin/$TB_BRANCH >>$LOG 2>&1
- #rm -rf public >>$LOG 2>&1
- #mkdir public >>$LOG 2>&1
- #mypath_from="$WWW_DEST/public"
- #mypath_to="$WWW_DEST/$s"
- #cmd="ln -sf \"$mypath_from\" \"$mypath_to\"" && run_cmd "$cmd" "Linking $s"
- #cd - >>$LOG 2>&1
-#done
-
-cd "$DIR"
-
View
35 install/nginx.conf
@@ -1,35 +0,0 @@
-worker_processes 10;
-
-events {
- worker_connections 1024;
-}
-
-http {
-
- server_names_hash_bucket_size 256;
-
- passenger_root RUBY_DEST/lib/ruby/gems/1.8/gems/PASSENGER;
- passenger_ruby RUBY_DEST/bin/ruby;
- passenger_default_user USER;
- passenger_log_level 2;
- passenger_spawn_method conservative;
- #passenger_use_global_queue on;
-
- include NGINX_DEST/conf/mime.types;
- default_type application/octet-stream;
-
- sendfile on;
- keepalive_timeout 65;
-
- # webservices
- server {
- listen NGINX_PORT;
- client_max_body_size 5000m;
- server_name SERVERNAME;
- location / {
- root WWW_DEST;
- passenger_enabled on;
- }
- }
-
-}
View
78 install/nginx.sh
@@ -1,78 +0,0 @@
-#!/bin/sh
-#
-# Installs Passenger.
-# Author: Christoph Helma, Andreas Maunz.
-#
-
-. "`pwd`/utils.sh"
-DIR="`pwd`"
-
-if [ "$(id -u)" = "0" ]; then
- echo "This script must be run as non-root." 1>&2
- exit 1
-fi
-
-# Utils
-PIN="`which passenger-install-nginx-module`"
-if [ ! -e "$PIN" ]; then
- echo "'passenger-install-nginx-module' missing. Install 'passenger-install-nginx-module' first. Aborting..."
- exit 1
-fi
-
-GIT="`which git`"
-if [ ! -e "$GIT" ]; then
- echo "'git' missing. Install 'git' first. Aborting..."
- exit 1
-fi
-
-
-LOG="/tmp/`basename $0`-log.txt"
-
-echo
-echo "Nginx ('$LOG'):"
-
-NGINX_DONE=false
-mkdir "$NGINX_DEST" >/dev/null 2>&1
-if [ ! -d "$NGINX_DEST" ]; then
- echo "Install directory '$NGINX_DEST' is not available! Aborting..."
- exit 1
-else
- if ! rmdir "$NGINX_DEST" >/dev/null 2>&1; then # if not empty this will fail
- NGINX_DONE=true
- fi
-fi
-
-if ! $NGINX_DONE; then
- cmd="$PIN --auto-download --auto --prefix=$NGINX_DEST" && run_cmd "$cmd" "Install"
-fi
-
-cd "$RUBY_DEST/lib/ruby/gems/1.8/gems/" >>$LOG 2>&1
-passenger=`ls -d passenger*`
-cd - >>$LOG 2>&1
-servername=`hostname`
-$GIT checkout nginx.conf>>$LOG 2>&1
-cmd="sed -i -e \"s,PASSENGER,$passenger,;s,SERVERNAME,$servername,;s,RUBY_DEST,$RUBY_DEST,;s,NGINX_DEST,$NGINX_DEST,;s,WWW_DEST,$WWW_DEST,\" ./nginx.conf" && run_cmd "$cmd" "Config"
-cmd="sed -i -e \"s,USER,`whoami`,\" ./nginx.conf" && run_cmd "$cmd" "User"
-
-if [ -z "$NGINX_PORT" ]; then
- NGINX_PORT=80
-else
- NGINX_PORT=`echo "$NGINX_PORT" | sed 's/^.//g'`
-fi
-cmd="sed -i -e \"s,NGINX_PORT,$NGINX_PORT,\" ./nginx.conf" && run_cmd "$cmd" "NGINX_PORT"
-cmd="cp ./nginx.conf \"$NGINX_DEST/conf\"" && run_cmd "$cmd" "Copy"
-$GIT checkout nginx.conf>>$LOG 2>&1
-
-if [ ! -f $NGINX_CONF ]; then
- echo "if ! echo \"\$PATH\" | grep \"$NGINX_DEST\">/dev/null 2>&1; then export PATH=$NGINX_DEST/sbin:\$PATH; fi" >> "$NGINX_CONF"
- echo "Nginx configuration has been stored in '$NGINX_CONF'."
-
- if ! grep ". \"$NGINX_CONF\"" $TB_UI_CONF; then
- echo ". \"$NGINX_CONF\"" >> $TB_UI_CONF
- fi
-
-fi
-
-
-cd "$DIR"
-
View
6 install/production.yaml
@@ -1,6 +0,0 @@
-:base_dir: WWW_DEST
-
-# Uncomment for verbose logging
-LOGGER
-:logger: debug
-:backtrace: true
View
83 install/ruby.sh
@@ -1,83 +0,0 @@
-#!/bin/sh
-#
-# Installs Ruby enterprise edition and passenger gem.
-# A configuration file is created and included in your '$TB_UI_CONF'.
-# Author: Christoph Helma, Andreas Maunz, Denis Gebele.
-#
-
-. "`pwd`/utils.sh"
-DIR="`pwd`"
-
-if [ "$(id -u)" = "0" ]; then
- echo "This script must be run as non-root." 1>&2
- exit 1
-fi
-
-# Utils
-WGET="`which wget`"
-if [ ! -e "$WGET" ]; then
- echo "'wget' missing. Install 'wget' first. Aborting..."
- exit 1
-fi
-
-# Pkg
-LOG="/tmp/`basename $0`-log.txt"
-
-echo
-echo "Ruby Enterprise edition ('$RUBY_DEST', '$LOG')."
-
-
-mkdir "$RUBY_DEST" >/dev/null 2>&1
-if [ ! -d "$RUBY_DEST" ]; then
- echo "Install directory '$RUBY_DEST' is not available! Aborting..."
- exit 1
-else
- if ! rmdir "$RUBY_DEST" >/dev/null 2>&1; then # if not empty this will fail
- RUBY_DONE=true
- fi
-fi
-
-if [ ! $RUBY_DONE ]; then
- cd /tmp
- URI="http://rubyenterpriseedition.googlecode.com/files/$RUBY_VER.tar.gz"
- if ! [ -d "/tmp/$RUBY_VER" ]; then
- cmd="$WGET $URI" && run_cmd "$cmd" "Download"
- cmd="tar xzf $RUBY_VER.tar.gz" && run_cmd "$cmd" "Unpack"
- fi
- cmd="sh /tmp/$RUBY_VER/installer --dont-install-useful-gems --no-dev-docs --auto=$RUBY_DEST" && run_cmd "$cmd" "Install"
-fi
-
-
-
-if ! [ -f "$RUBY_CONF" ]; then
- echo "if echo \"\$PATH\" | grep -v \"$RUBY_DEST\">/dev/null 2>&1; then export PATH=\"$RUBY_DEST/bin:\$PATH\"; fi" >> "$RUBY_CONF"
-
- echo "Ruby configuration has been stored in '$RUBY_CONF'."
- if ! grep "$RUBY_CONF" $TB_UI_CONF >/dev/null 2>&1 ; then
- echo ". \"$RUBY_CONF\"" >> $TB_UI_CONF
- fi
-fi
-. "$RUBY_CONF"
-
-
-GEM="`which gem`"
-if [ ! -e "$GEM" ]; then
- echo "'gem' missing. Install 'gem' first. Aborting..."
- exit 1
-fi
-
-if [ "$PASSENGER_SKIP" != "s" ]; then
- export PATH="$RUBY_DEST/bin:$PATH"
- cmd="$GEM sources -a http://gemcutter.org" && run_cmd "$cmd" "Add Gemcutter"
- cmd="$GEM sources -a http://rubygems.org" && run_cmd "$cmd" "Add Rubygems"
- GEMCONF="gem: --no-ri --no-rdoc"
- if ! grep "$GEMCONF" $HOME/.gemrc >>$LOG 2>&1; then
- echo "$GEMCONF" | tee -a $HOME/.gemrc >>$LOG 2>&1
- fi
- if ! $GEM list | grep passenger >/dev/null 2>&1; then
- cmd="$GEM install passenger" && run_cmd "$cmd" "Install Passenger"
- fi
-
-fi
-
-cd "$DIR"
View
47 install/tb-tools.sh
@@ -1,47 +0,0 @@
-# Some useful scripts to put in your ~/.bashrc in case you are using bash (assuming OT_PREFIX is '~/toxbank-investigation'):
-# USE ONLY IF YOUR NGINX PORT IS less or equal to 1024 (PRIVILEGED)
-
-# Load server config
-tbconfig() {
- source $HOME/.toxbank-ui.sh
-}
-
-# Update the version
-tbupdate() {
- START_DIR=`pwd`
- tbconfig
- cd $HOME/toxbank-investigation
- for d in `find -not -name "." -type d -maxdepth 1 2>/dev/null`; do echo ; echo $d ; cd $d ; MYBRANCH=`git branch | grep "*" | sed 's/.*\ //g'`; git pull origin $MYBRANCH ; cd - ; done
-}
-
-# Start the server
-tbstart() {
- tbconfig
- tbkill
- sudo bash -c "source $HOME/.toxbank-ui.sh; nohup nginx -c $HOME/toxbank-investigation/services/nginx/conf/nginx.conf >/dev/null 2>&1 &"
- sleep 2
- if ! pgrep -u root nginx>/dev/null 2>&1; then echo "Failed to start nginx."; fi
- bash -c "4s-backend ToxBank"
-}
-
-# Display log
-alias tbless='less $HOME/.toxbank/log/production.log'
-
-# Tail log
-alias tbtail='tail -f $HOME/.toxbank/log/production.log'
-
-# Reload the server
-tbreload() {
- sudo bash -c "source $HOME/.toxbank-ui.sh; nginx -s reload"
- sudo killall 4s-backend >/dev/null 2>&1
- sudo bash -c "4s-backend ToxBank"
-}
-
-# Kill the server
-tbkill() {
- sudo killall -u root nginx >/dev/null 2>&1
- sudo bash -c "source $HOME/.toxbank-ui.sh; $OHM_PORT shutdown >/dev/null 2>&1"
- sudo killall 4s-backend >/dev/null 2>&1
- while sudo ps x | grep PassengerWatchdog | grep -v grep >/dev/null 2>&1; do sleep 1; done
- for p in `pgrep -u root R 2>/dev/null`; do sudo kill -9 $p; done
-}
View
41 install/utils.sh
@@ -1,41 +0,0 @@
-#!/bin/sh
-
-check_dest()
-{
- if ! [ -d "$TB_PREFIX" ]; then
- if ! mkdir -p "$TB_PREFIX"; then
- echo "Could not create target directory '$TB_PREFIX'! Aborting..."
- exit 1
- fi
- fi
-}
-
-run_cmd ()
-{
- local cmd="$1"
- local title="$2"
-
- printf "%30s" "'$title'"
- if ! eval $cmd >>$LOG 2>&1 ; then
- printf "%50s\n" "FAIL"
- echo "Last 10 lines of log:"
- tail -10 "$LOG"
- exit 1
- fi
- printf "%50s\n" "DONE"
-
-}
-
-abs_path()
-{
- local path="$1"
- case "$path" in
- /*) absolute=1 ;;
- *) absolute=0 ;;
- esac
-}
-
-. "`pwd`/config.sh"
-touch "$TB_UI_CONF"
-. "$TB_UI_CONF"
-check_dest
View
392 lib/authorization.rb
@@ -1,392 +0,0 @@
-module OpenTox
-
- #Module for Authorization and Authentication
- #@example Authentication
- # require "opentox-ruby-api-wrapper"
- # OpenTox::Authorization::AA_SERVER = "https://opensso.in-silico.ch" #if not set in .opentox/conf/[environment].yaml
- # token = OpenTox::Authorization.authenticate("benutzer", "passwort")
- #@see http://www.opentox.org/dev/apis/api-1.2/AA OpenTox A&A API 1.2 specification
-
- module Authorization
-
- #Helper Class AA to create and send default policies out of xml templates
- #@example Creating a default policy to a URI
- # aa=OpenTox::Authorization::AA.new(tok)
- # xml=aa.get_xml('http://uri....')
- # OpenTox::Authorization.create_policy(xml,tok)
-
- class AA
- attr_accessor :user, :subjectid, :policy
-
- #Generates AA object - requires subjectid
- # @param [String] subjectid
- def initialize(subjectid)
- @user = Authorization.get_user(subjectid)
- @subjectid = subjectid
- @policy = Policies.new()
- end
-
- #Cleans AA Policies and loads default xml file into policy attribute
- #set uri and user, returns Policyfile(XML) for open-sso
- # @param [String] URI to create a policy for
- def get_xml(uri)
- @policy.drop_policies
- @policy.load_default_policy(@user, uri)
- return @policy.to_xml
- end
-
- #Loads and sends Policyfile(XML) to open-sso server
- # @param [String] URI to create a policy for
- def send(uri)
- xml = get_xml(uri)
- ret = false
- ret = Authorization.create_policy(xml, @subjectid)
- LOGGER.debug "Policy send with subjectid: #{@subjectid}"
- LOGGER.warn "Not created Policy is: #{xml}" if !ret
- ret
- end
-
- end
-
- #Returns the open-sso server set in the config file .opentox/config/[environment].yaml
- # @return [String, nil] the openSSO server URI or nil
- def self.server
- return AA_SERVER
- end
-
- #Authentication against OpenSSO. Returns token. Requires Username and Password.
- # @param [String, String]Username,Password
- # @return [String, nil] gives subjectid or nil
- def self.authenticate(user, pw)
- return nil if !AA_SERVER
- begin
- resource = RestClient::Resource.new("#{AA_SERVER}/auth/authenticate")
- out = resource.post(:username=>user, :password => pw).sub("token.id=","").sub("\n","")
- return out
- rescue
- return nil
- end
- end
-
- #Logout on opensso. Make token invalid. Requires token
- # @param [String]subjectid the subjectid
- # @return [Boolean] true if logout is OK
- def self.logout(subjectid)
- begin
- resource = RestClient::Resource.new("#{AA_SERVER}/auth/logout")
- resource.post(:subjectid => subjectid)
- return true
- rescue
- return false
- end
- end
-
- #Authorization against OpenSSO for a URI with request-method (action) [GET/POST/PUT/DELETE]
- # @param [String,String,String]uri,action,subjectid
- # @return [Boolean, nil] returns true, false or nil (if authorization-request fails).
- def self.authorize(uri, action, subjectid)
- return true if !AA_SERVER
- begin
- resource = RestClient::Resource.new("#{AA_SERVER}/auth/authorize")
- return true if resource.post(:uri => uri, :action => action, :subjectid => subjectid) == "boolean=true\n"
- rescue
- return nil
- end
- end
-
- #Checks if a token is a valid token
- # @param [String]subjectid subjectid from openSSO session
- # @return [Boolean] subjectid is valid or not.
- def self.is_token_valid(subjectid)
- return true if !AA_SERVER
- begin
- resource = RestClient::Resource.new("#{AA_SERVER}/auth/isTokenValid")
- return true if resource.post(:tokenid => subjectid) == "boolean=true\n"
- rescue
- return false
- end
- end
-
- #Returns array with all policies of the token owner
- # @param [String]subjectid requires subjectid
- # @return [Array, nil] returns an Array of policy names or nil if request fails
- def self.list_policies(subjectid)
- begin
- resource = RestClient::Resource.new("#{AA_SERVER}/pol")
- out = resource.get(:subjectid => subjectid)
- return out.split("\n")
- rescue RestClient::InternalServerError => e
- raise e.response
- rescue
- return nil
- end
- end