ソースを参照

Third party roles now live in roles/external and are specified by thirdparty_roles.yml

Till Klocke 9 年 前
コミット
cc7e5158d4
100 ファイル変更3184 行追加0 行削除
  1. 15 0
      roles/external/debops.radvd/.travis.yml
  2. 675 0
      roles/external/debops.radvd/LICENSE
  3. 44 0
      roles/external/debops.radvd/README.md
  4. 73 0
      roles/external/debops.radvd/defaults/main.yml
  5. 20 0
      roles/external/debops.radvd/handlers/main.yml
  6. 1 0
      roles/external/debops.radvd/meta/.galaxy_install_info
  7. 24 0
      roles/external/debops.radvd/meta/ansigenome.yml
  8. 26 0
      roles/external/debops.radvd/meta/main.yml
  9. 42 0
      roles/external/debops.radvd/tasks/main.yml
  10. 6 0
      roles/external/debops.radvd/templates/etc/radvd.conf.d/00_ansible.j2
  11. 91 0
      roles/external/debops.radvd/templates/etc/radvd.conf.d/interface.j2
  12. 2 0
      roles/external/dereulenspiegel.alfred-json/.gitignore
  13. 32 0
      roles/external/dereulenspiegel.alfred-json/.kitchen.yml
  14. 23 0
      roles/external/dereulenspiegel.alfred-json/.travis.yml
  15. 7 0
      roles/external/dereulenspiegel.alfred-json/Gemfile
  16. 47 0
      roles/external/dereulenspiegel.alfred-json/README.md
  17. 6 0
      roles/external/dereulenspiegel.alfred-json/defaults/main.yml
  18. 2 0
      roles/external/dereulenspiegel.alfred-json/handlers/main.yml
  19. 1 0
      roles/external/dereulenspiegel.alfred-json/meta/.galaxy_install_info
  20. 18 0
      roles/external/dereulenspiegel.alfred-json/meta/main.yml
  21. 27 0
      roles/external/dereulenspiegel.alfred-json/tasks/main.yml
  22. 2 0
      roles/external/dereulenspiegel.alfred-json/test/ansible.cfg
  23. 7 0
      roles/external/dereulenspiegel.alfred-json/test/application/alfred-json.yml
  24. 7 0
      roles/external/dereulenspiegel.alfred-json/test/application/alfred-json_travis.yml
  25. 10 0
      roles/external/dereulenspiegel.alfred-json/test/integration/alfred-json/serverspec/test_spec.rb
  26. 1 0
      roles/external/dereulenspiegel.alfred-json/test/local.ini
  27. 17 0
      roles/external/dereulenspiegel.alfred-json/test/run_vagrant_kitchen.sh
  28. 98 0
      roles/external/dereulenspiegel.alfred-json/test/travis_run.py
  29. 8 0
      roles/external/dereulenspiegel.alfred-json/vars/Debian.yml
  30. 2 0
      roles/external/dereulenspiegel.alfred-json/vars/main.yml
  31. 2 0
      roles/external/dereulenspiegel.alfred/.gitignore
  32. 36 0
      roles/external/dereulenspiegel.alfred/.kitchen.yml
  33. 23 0
      roles/external/dereulenspiegel.alfred/.travis.yml
  34. 7 0
      roles/external/dereulenspiegel.alfred/Gemfile
  35. 50 0
      roles/external/dereulenspiegel.alfred/README.md
  36. 10 0
      roles/external/dereulenspiegel.alfred/defaults/main.yml
  37. 5 0
      roles/external/dereulenspiegel.alfred/handlers/main.yml
  38. 1 0
      roles/external/dereulenspiegel.alfred/meta/.galaxy_install_info
  39. 20 0
      roles/external/dereulenspiegel.alfred/meta/main.yml
  40. 15 0
      roles/external/dereulenspiegel.alfred/tasks/debian.yml
  41. 61 0
      roles/external/dereulenspiegel.alfred/tasks/main.yml
  42. 16 0
      roles/external/dereulenspiegel.alfred/templates/alfred.default.j2
  43. 63 0
      roles/external/dereulenspiegel.alfred/templates/alfred.init.j2
  44. 6 0
      roles/external/dereulenspiegel.alfred/templates/batadv-vis.default.j2
  45. 59 0
      roles/external/dereulenspiegel.alfred/templates/batadv-vis.init.j2
  46. 20 0
      roles/external/dereulenspiegel.alfred/templates/libcap.patch.j2
  47. 63 0
      roles/external/dereulenspiegel.alfred/templates/simple_init.j2
  48. 2 0
      roles/external/dereulenspiegel.alfred/test/ansible.cfg
  49. 10 0
      roles/external/dereulenspiegel.alfred/test/application/alfred_all.yml
  50. 10 0
      roles/external/dereulenspiegel.alfred/test/application/alfred_pure.yml
  51. 10 0
      roles/external/dereulenspiegel.alfred/test/application/alfred_travis.yml
  52. 29 0
      roles/external/dereulenspiegel.alfred/test/integration/alfred_all/serverspec/alfred_spec.rb
  53. 27 0
      roles/external/dereulenspiegel.alfred/test/integration/alfred_pure/serverspec/test_spec.rb
  54. 1 0
      roles/external/dereulenspiegel.alfred/test/local.ini
  55. 17 0
      roles/external/dereulenspiegel.alfred/test/run_vagrant_kitchen.sh
  56. 98 0
      roles/external/dereulenspiegel.alfred/test/travis_run.py
  57. 11 0
      roles/external/dereulenspiegel.alfred/vars/Debian-jessie.yml
  58. 11 0
      roles/external/dereulenspiegel.alfred/vars/Debian-wheezy.yml
  59. 11 0
      roles/external/dereulenspiegel.alfred/vars/Ubuntu-precise.yml
  60. 11 0
      roles/external/dereulenspiegel.alfred/vars/Ubuntu-trusty.yml
  61. 2 0
      roles/external/dereulenspiegel.alfred/vars/main.yml
  62. 2 0
      roles/external/dereulenspiegel.fastd/.gitignore
  63. 36 0
      roles/external/dereulenspiegel.fastd/.kitchen.yml
  64. 23 0
      roles/external/dereulenspiegel.fastd/.travis.yml
  65. 7 0
      roles/external/dereulenspiegel.fastd/Gemfile
  66. 82 0
      roles/external/dereulenspiegel.fastd/README.md
  67. 26 0
      roles/external/dereulenspiegel.fastd/defaults/main.yml
  68. 5 0
      roles/external/dereulenspiegel.fastd/handlers/main.yml
  69. 1 0
      roles/external/dereulenspiegel.fastd/meta/.galaxy_install_info
  70. 17 0
      roles/external/dereulenspiegel.fastd/meta/main.yml
  71. 43 0
      roles/external/dereulenspiegel.fastd/tasks/debian.yml
  72. 16 0
      roles/external/dereulenspiegel.fastd/tasks/libsodium/debian.yml
  73. 8 0
      roles/external/dereulenspiegel.fastd/tasks/libsodium/main.yml
  74. 18 0
      roles/external/dereulenspiegel.fastd/tasks/libsodium/source.yml
  75. 9 0
      roles/external/dereulenspiegel.fastd/tasks/libsodium/ubuntu.yml
  76. 17 0
      roles/external/dereulenspiegel.fastd/tasks/libuecc/debian.yml
  77. 8 0
      roles/external/dereulenspiegel.fastd/tasks/libuecc/main.yml
  78. 13 0
      roles/external/dereulenspiegel.fastd/tasks/libuecc/source.yml
  79. 48 0
      roles/external/dereulenspiegel.fastd/tasks/main.yml
  80. 36 0
      roles/external/dereulenspiegel.fastd/tasks/repo.yml
  81. 14 0
      roles/external/dereulenspiegel.fastd/tasks/source.yml
  82. 103 0
      roles/external/dereulenspiegel.fastd/templates/fastd.conf.j2
  83. 12 0
      roles/external/dereulenspiegel.fastd/templates/peer.config.j2
  84. 5 0
      roles/external/dereulenspiegel.fastd/templates/secret.conf.j2
  85. 2 0
      roles/external/dereulenspiegel.fastd/test/ansible.cfg
  86. 9 0
      roles/external/dereulenspiegel.fastd/test/application/fastd.yml
  87. 42 0
      roles/external/dereulenspiegel.fastd/test/application/fastd_pkg_vars.yml
  88. 9 0
      roles/external/dereulenspiegel.fastd/test/application/travis-fastd.yml
  89. 55 0
      roles/external/dereulenspiegel.fastd/test/integration/fastd/serverspec/fastd_spec.rb
  90. 1 0
      roles/external/dereulenspiegel.fastd/test/local.ini
  91. 17 0
      roles/external/dereulenspiegel.fastd/test/run_vagrant_kitchen.sh
  92. 98 0
      roles/external/dereulenspiegel.fastd/test/travis_run.py
  93. 2 0
      roles/external/dereulenspiegel.fastd/vars/main.yml
  94. 2 0
      roles/external/jdauphant.nginx/.gitignore
  95. 32 0
      roles/external/jdauphant.nginx/.travis.yml
  96. 241 0
      roles/external/jdauphant.nginx/README.md
  97. 19 0
      roles/external/jdauphant.nginx/Vagrantfile
  98. 2 0
      roles/external/jdauphant.nginx/ansible.cfg
  99. 63 0
      roles/external/jdauphant.nginx/defaults/main.yml
  100. 0 0
      roles/external/jdauphant.nginx/example-vars.yml

+ 15 - 0
roles/external/debops.radvd/.travis.yml

@@ -0,0 +1,15 @@
+---
+
+language: 'python'
+python: '2.7'
+
+virtualenv:
+  system_site_packages: true
+
+before_install: True
+install: True
+
+script:
+  - 'git clone --depth 1 https://github.com/nickjj/rolespec'
+  - 'cd rolespec ; bin/rolespec -r https://github.com/debops/test-suite'
+

+ 675 - 0
roles/external/debops.radvd/LICENSE

@@ -0,0 +1,675 @@
+                    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>.
+

+ 44 - 0
roles/external/debops.radvd/README.md

@@ -0,0 +1,44 @@
+## [![DebOps project](http://debops.org/images/debops-small.png)](http://debops.org) radvd
+
+[![Travis CI](http://img.shields.io/travis/debops/ansible-radvd.svg?style=flat)](http://travis-ci.org/debops/ansible-radvd) [![test-suite](http://img.shields.io/badge/test--suite-ansible--radvd-blue.svg?style=flat)](https://github.com/debops/test-suite/tree/master/ansible-radvd/)  [![Ansible Galaxy](http://img.shields.io/badge/galaxy-debops.radvd-660198.svg?style=flat)](https://galaxy.ansible.com/list#/roles/2096)
+
+`debops.radvd` role manages [Router Advertisement Daemon](https://en.wikipedia.org/wiki/Radvd).
+`radvd` periodically sends router advertisements and other hosts on the
+network will automatically pick them up. This results in them obtaining an
+IPv6 address and internet connectivity.
+
+### Installation
+
+This role requires at least Ansible `v1.7.0`. To install it, run:
+
+    ansible-galaxy install debops.radvd
+
+### Documentation
+
+More information about `debops.radvd` can be found in the
+[official debops.radvd documentation](http://docs.debops.org/en/latest/ansible/roles/debops.radvd.html).
+
+
+
+### Are you using this as a standalone role without DebOps?
+
+You may need to include missing roles from the [DebOps common
+playbook](https://github.com/debops/debops-playbooks/blob/master/playbooks/common.yml)
+into your playbook.
+
+[Try DebOps now](https://github.com/debops/debops) for a complete solution to run your Debian-based infrastructure.
+
+
+
+
+
+### Authors and license
+
+`radvd` role was written by:
+- Maciej Delmanowski | [e-mail](mailto:drybjed@gmail.com) | [Twitter](https://twitter.com/drybjed) | [GitHub](https://github.com/drybjed)
+
+License: [GPLv3](https://tldrlegal.com/license/gnu-general-public-license-v3-%28gpl-3%29)
+
+***
+
+This role is part of the [DebOps](http://debops.org/) project. README generated by [ansigenome](https://github.com/nickjj/ansigenome/).

+ 73 - 0
roles/external/debops.radvd/defaults/main.yml

@@ -0,0 +1,73 @@
+---
+
+# ---- Default options ----
+
+# Network interface to configure
+# By default, configure on interface created by 'debops.subnetwork' role
+radvd_default_interface: 'br2'
+
+# Options for default interface, specified as YAML text block
+radvd_default_interface_options: |
+  AdvSendAdvert on;
+  MaxRtrAdvInterval {{ radvd_max_advert_interval }};
+  {% if radvd_default_dhcpv6 is defined and radvd_default_dhcpv6 %}
+  AdvManagedFlag on;
+  AdvOtherConfigFlag on;
+  {% endif %}
+
+# Options defined for default prefixes as YAML text block
+radvd_default_prefix_options: ''
+
+# Enable or disable support for DHCPv6 server in default configuration
+radvd_default_dhcpv6: True
+
+
+# ---- DNS and search domains ----
+
+# Local subdomain leaf to advertise in DNSSL
+radvd_default_subdomain: 'lan'
+
+# List of search domains to advertise in DNSSL
+radvd_default_domains: [ '{{ radvd_default_subdomain }}.{{ ansible_fqdn }}', '{{ ansible_domain }}' ]
+
+
+# ---- radvd configuration ----
+
+# Maximum time between router advertisements, in seconds
+radvd_max_advert_interval: '60'
+
+# See radvd.conf(5) for documentation of available options. Each section is
+# specified with lowercase name, section options are specified as YAML text
+# blocks (semicolons at the end of each line are required).
+radvd_interfaces:
+
+    # Default interface created by 'debops.subnetwork' role
+  - interface: '{{ radvd_default_interface }}'
+    comment: 'Default configuration for local network'
+
+    # Interface options as YAML text block
+    options: '{{ radvd_default_interface_options }}'
+
+    # List of prefixes advertised on this interface
+    prefixes:
+      - prefix: '::/64'
+        options: '{{ radvd_default_prefix_options }}'
+
+    # List of configured routes for this interface
+    routes: []
+      #- route: ''
+      #  options: |
+
+    # List of nameservers advertised on this interface
+    nameservers: []
+      #- rdnss: []
+      #  options: |
+
+    # List of search domains advertised on this interface
+    domains:
+      - dnssl: '{{ radvd_default_domains }}'
+
+    # List of clients to advertise to, if not defined, advertise to all hosts
+    # on this interface
+    clients: []
+

+ 20 - 0
roles/external/debops.radvd/handlers/main.yml

@@ -0,0 +1,20 @@
+---
+
+- name: Test radvd and reload
+  command: radvd --configtest
+  notify: [ 'Reload radvd' ]
+
+- name: Test radvd and restart
+  command: radvd --configtest
+  notify: [ 'Restart radvd' ]
+
+- name: Reload radvd
+  service:
+    name: 'radvd'
+    state: 'reloaded'
+
+- name: Restart radvd
+  service:
+    name: 'radvd'
+    state: 'restarted'
+

+ 1 - 0
roles/external/debops.radvd/meta/.galaxy_install_info

@@ -0,0 +1 @@
+{install_date: 'Mon Dec 14 17:09:37 2015', version: master}

+ 24 - 0
roles/external/debops.radvd/meta/ansigenome.yml

@@ -0,0 +1,24 @@
+---
+
+ansigenome_info:
+  github_url: "https://github.com/debops/ansible-radvd"
+  git_branch: "master"
+  galaxy_id: "2096"
+
+  travis: True
+
+  license_url: 'https://tldrlegal.com/license/gnu-general-public-license-v3-(gpl-3)'
+
+  authors:
+    - name:  'Maciej Delmanowski'
+      url: ''
+      email: 'drybjed@gmail.com'
+      twitter: 'drybjed'
+      github: 'drybjed'
+
+  synopsis: |
+    `debops.radvd` role manages [Router Advertisement Daemon](https://en.wikipedia.org/wiki/Radvd).
+    `radvd` periodically sends router advertisements and other hosts on the
+    network will automatically pick them up. This results in them obtaining an
+    IPv6 address and internet connectivity.
+

+ 26 - 0
roles/external/debops.radvd/meta/main.yml

@@ -0,0 +1,26 @@
+---
+
+dependencies: []
+
+galaxy_info:
+  author: 'Maciej Delmanowski'
+  description: 'Manage radvd (IPv6 router advertisement daemon)'
+  company: 'DebOps'
+  license: 'GNU General Public License v3'
+  min_ansible_version: '1.7.0'
+  platforms:
+  - name: Ubuntu
+    versions:
+    - precise
+    - quantal
+    - raring
+    - saucy
+    - trusty
+  - name: Debian
+    versions:
+    - wheezy
+    - jessie
+  categories:
+  - system
+  - networking
+

+ 42 - 0
roles/external/debops.radvd/tasks/main.yml

@@ -0,0 +1,42 @@
+---
+
+- name: Install radvd package
+  apt:
+    name: 'radvd'
+    state: 'latest'
+    install_recommends: False
+
+- name: Create /etc/radvd.conf.d directory
+  file:
+    path: '/etc/radvd.conf.d'
+    state: 'directory'
+    owner: 'root'
+    group: 'root'
+    mode: '0755'
+
+- name: Create configuration header
+  template:
+    src: 'etc/radvd.conf.d/00_ansible.j2'
+    dest: '/etc/radvd.conf.d/00_ansible'
+    owner: 'root'
+    group: 'root'
+    mode: '0644'
+
+- name: Configure radvd interfaces
+  template:
+    src: 'etc/radvd.conf.d/interface.j2'
+    dest: '/etc/radvd.conf.d/interface_{{ item.interface }}'
+    owner: 'root'
+    group: 'root'
+    mode: '0644'
+  with_items: radvd_interfaces
+
+- name: Assemble /etc/radvd.conf
+  assemble:
+    src: '/etc/radvd.conf.d'
+    dest: '/etc/radvd.conf'
+    owner: 'root'
+    group: 'root'
+    mode: '0644'
+  notify: [ 'Test radvd and reload' ]
+

+ 6 - 0
roles/external/debops.radvd/templates/etc/radvd.conf.d/00_ansible.j2

@@ -0,0 +1,6 @@
+# This file is managed by Ansible, all changes will be lost
+
+# This file is assembled from fragments in /etc/radvd.conf.d/.
+# If you want to add your own interfaces, put them there. They
+# will be included automatically on next Ansible run.
+

+ 91 - 0
roles/external/debops.radvd/templates/etc/radvd.conf.d/interface.j2

@@ -0,0 +1,91 @@
+{% if item.comment is defined and item.comment %}
+# {{ item.comment }}
+{% endif %}
+interface {{ item.interface }} {
+{% if item.options is defined and item.options %}
+{{ item.options | indent(2, true) }}
+{% endif %}
+
+{% if item.prefixes is defined and item.prefixes %}
+{% if hostvars[inventory_hostname]["ansible_" + item.interface].ipv6 is defined and hostvars[inventory_hostname]["ansible_" + item.interface].ipv6 %}
+{% for element in item.prefixes %}
+{% if element.prefix is defined and element.prefix %}
+{% if element.comment is defined and element.comment %}
+  # {{ element.comment }}
+{% endif %}
+  prefix {{ element.prefix }} {
+{% if element.options is defined and element.options %}
+{{ element.options | indent(4, true) }}
+{% endif %}
+  };
+
+{% endif %}
+{% endfor %}
+{% else %}
+  # No IPv6 prefixes present on the interface, prefix advertisement disabled
+
+{% endif %}
+{% endif %}
+{% if item.routes is defined and item.routes %}
+{% for element in item.routes %}
+{% if element.route is defined and element.route %}
+{% if element.comment is defined and element.comment %}
+  # {{ element.comment }}
+{% endif %}
+  route {{ element.route }} {
+{% if element.options is defined and element.options %}
+{{ element.options | indent(4, true) }}
+{% endif %}
+  };
+
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if item.nameservers is defined and item.nameservers %}
+{% for element in item.nameservers %}
+{% if element.comment is defined and element.comment %}
+  # {{ element.comment }}
+{% endif %}
+  RDNSS {{ element.rdnss | join(" ") }} {
+{% if element.options is defined and element.options %}
+{{ element.options | indent(4, true) }}
+{% endif %}
+  };
+
+{% endfor %}
+{% else %}
+{% if hostvars[inventory_hostname]["ansible_" + item.interface].ipv6 is defined and hostvars[inventory_hostname]["ansible_" + item.interface].ipv6 %}
+{% set radvd_tpl_nameservers = hostvars[inventory_hostname]["ansible_" + item.interface].ipv6 | map(attribute='address') | list %}
+  # Advertise router on {{ item.interface }} interface as local DNS server
+  RDNSS {{ radvd_tpl_nameservers | join(" ") }} {
+  };
+
+{% endif %}
+{% endif %}
+{% if item.domains is defined and item.domains %}
+{% for element in item.domains %}
+{% if (element.dnssl is defined and element.dnssl[0] not in [ 'False', 'false' ] and element.dnssl) %}
+{% if element.comment is defined and element.comment %}
+  # {{ element.comment }}
+{% endif %}
+  DNSSL {{ element.dnssl | join(" ") }} {
+{% if element.options is defined and element.options %}
+{{ element.options | indent(4, true) }}
+{% endif %}
+  };
+
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if item.clients is defined and item.clients %}
+  clients {
+{% for element in item.clients %}
+{% if element is defined and element %}
+    {{ element }};
+{% endif %}
+{% endfor %}
+  };
+
+{% endif %}
+};
+

+ 2 - 0
roles/external/dereulenspiegel.alfred-json/.gitignore

@@ -0,0 +1,2 @@
+.kitchen/
+secrets

+ 32 - 0
roles/external/dereulenspiegel.alfred-json/.kitchen.yml

@@ -0,0 +1,32 @@
+---
+driver:
+  name: vagrant
+
+provisioner:
+    name               : ansible_push
+    verbose            : "vvvv"
+    ansible_config     : "test/ansible.cfg"
+    idempotency_test   : False
+    sudo               : True
+    #chef_bootstrap_url : False
+    #extra_vars        : "@kitchen_vars.yml"
+
+platforms:
+    - name: Ubuntu-precise
+      driver:
+        box: ubuntu/precise64
+    - name: Debian-jessie
+      driver:
+        box: debian/jessie64
+    - name: Debian-wheezy
+      driver:
+        box: debian/wheezy64
+    - name: Ubuntu-trusty
+      driver:
+        box: ubuntu/trusty64
+
+suites:
+  - name: alfred-json
+    provisioner:
+      playbook: "test/application/alfred-json.yml"
+      extra_vars: {'kitchen_connection': 'smart'}

+ 23 - 0
roles/external/dereulenspiegel.alfred-json/.travis.yml

@@ -0,0 +1,23 @@
+---
+language: python
+python: "2.7"
+
+before_install:
+  # Make sure everything's up to date.
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq python-apt python-pycurl git python-pip ruby ruby-dev build-essential autoconf
+  - gem install bundler
+
+install:
+  - sudo pip install ansible
+
+
+script:
+    #- cd test
+    - ansible --version
+    - bundle install
+    - KITCHEN_YAML=.kitchen.travis.yml bundle exec kitchen test travis
+
+
+after_success:
+    - echo "Success"

+ 7 - 0
roles/external/dereulenspiegel.alfred-json/Gemfile

@@ -0,0 +1,7 @@
+source "https://rubygems.org"
+
+gem "test-kitchen"
+gem "kitchen-ansiblepush"
+gem "kitchen-ansible"
+gem "kitchen-vagrant"
+gem "kitchen-localhost"

+ 47 - 0
roles/external/dereulenspiegel.alfred-json/README.md

@@ -0,0 +1,47 @@
+alfred-json [![Build Status](https://travis-ci.org/dereulenspiegel/ansible-alfred-json.svg)](https://travis-ci.org/dereulenspiegel/ansible-alfred-json)
+=========
+
+This role simply compiles and installs [alfred-json](https://github.com/tcatm/alfred-json).
+
+Requirements
+------------
+
+None, except ansible and a Debian based host.
+
+Role Variables
+--------------
+
+## Default Variables
+
+None of these need to be modified, but is is possible to modify them to suit your needs (i.e. build your custom fork)
+
+Name | Default | Description
+---- | ------- | -----------
+alfred_json_repo_url | https://github.com/tcatm/alfred-json.git | The git url to clone alfred-json from
+alfred_json_version | v0.3.1 | Branch or tag to checkout after cloning
+alfred_json_src_dir | /usr/src/alfred-json | Where to clone the sources
+alfred_json_build_dir | /usr/src/alfred-json-build | CMake build dir
+
+Dependencies
+------------
+
+None
+
+Example Playbook
+----------------
+
+Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
+
+    - hosts: servers
+      roles:
+         - { role: dereulenspiegel.alfred-json }
+
+License
+-------
+
+MIT
+
+Author Information
+------------------
+
+Till Klocke [dereulenspiegel](https://twitter.com/dereulenspiegel)

+ 6 - 0
roles/external/dereulenspiegel.alfred-json/defaults/main.yml

@@ -0,0 +1,6 @@
+---
+# defaults file for alfred-json
+alfred_json_repo_url: https://github.com/tcatm/alfred-json.git
+alfred_json_version: v0.3.1
+alfred_json_src_dir: /usr/src/alfred-json
+alfred_json_build_dir: /usr/src/alfred-json-build

+ 2 - 0
roles/external/dereulenspiegel.alfred-json/handlers/main.yml

@@ -0,0 +1,2 @@
+---
+# handlers file for alfred-json

+ 1 - 0
roles/external/dereulenspiegel.alfred-json/meta/.galaxy_install_info

@@ -0,0 +1 @@
+{install_date: 'Mon Dec 14 17:09:54 2015', version: v1.0}

+ 18 - 0
roles/external/dereulenspiegel.alfred-json/meta/main.yml

@@ -0,0 +1,18 @@
+---
+galaxy_info:
+  author: Till Klocke
+  description: Installs alfred-json
+  company: Freifunk Dortmund
+  license: MIT
+  min_ansible_version: 1.2
+  platforms:
+  - name: Ubuntu
+    versions:
+    - all
+  - name: Debian
+    versions:
+    - all
+  categories:
+  - monitoring
+  - networking
+dependencies: []

+ 27 - 0
roles/external/dereulenspiegel.alfred-json/tasks/main.yml

@@ -0,0 +1,27 @@
+---
+# tasks file for alfred-json
+
+- include_vars: "{{ ansible_os_family }}.yml"
+
+- name: Install build dependencies
+  apt: name={{item}} state=present
+  with_items: "{{alfred_json_build_deps}}"
+
+- name: Create directories for clone and build
+  file: dest={{item}} state=directory
+  with_items:
+  - "{{alfred_json_src_dir}}"
+  - "{{alfred_json_build_dir}}"
+
+- name: Clone alfred-json repo
+  git: dest={{alfred_json_src_dir}} repo={{alfred_json_repo_url}} version={{alfred_json_version}}
+
+- name: Cmake alfred-json
+  shell: cmake {{alfred_json_src_dir}}
+  args:
+    chdir: "{{alfred_json_build_dir}}"
+
+- name: Build and install alfred-json
+  shell: make && make install
+  args:
+    chdir: "{{alfred_json_build_dir}}"

+ 2 - 0
roles/external/dereulenspiegel.alfred-json/test/ansible.cfg

@@ -0,0 +1,2 @@
+[defaults]
+roles_path=../:../../:/spec/

+ 7 - 0
roles/external/dereulenspiegel.alfred-json/test/application/alfred-json.yml

@@ -0,0 +1,7 @@
+---
+- name         : Install alfred-json from source
+  hosts        : all
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  roles        :
+                 - "ansible-alfred-json"

+ 7 - 0
roles/external/dereulenspiegel.alfred-json/test/application/alfred-json_travis.yml

@@ -0,0 +1,7 @@
+---
+- name         : Install alfde-json from source on Travis CI
+  hosts        : localhost
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  roles        :
+                 - "ansible-alfred-json"

+ 10 - 0
roles/external/dereulenspiegel.alfred-json/test/integration/alfred-json/serverspec/test_spec.rb

@@ -0,0 +1,10 @@
+require 'serverspec'
+
+# Required by serverspec
+set :backend, :exec
+
+describe file('/usr/local/bin/alfred-json') do
+  it { should be_file }
+  it { should be_readable }
+  it { should be_executable }
+end

+ 1 - 0
roles/external/dereulenspiegel.alfred-json/test/local.ini

@@ -0,0 +1 @@
+localhost ansible_connection='local'

+ 17 - 0
roles/external/dereulenspiegel.alfred-json/test/run_vagrant_kitchen.sh

@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+set -e
+echo "**** Box setup ***"
+
+echo "* mkdir /kitchen"
+mkdir -p /kitchen
+
+#echo "* cp -ar /mnt/shared /kitchen"
+#cp -r /mnt/shared/. /kitchen
+echo "* ln -sf /mnt/shared /kitchen"
+ln -sf /mnt/shared/* /kitchen/
+
+echo "* cd /kitchen"
+cd /kitchen/*
+
+echo "* python test/travis_run.py"
+python test/travis_run.py

+ 98 - 0
roles/external/dereulenspiegel.alfred-json/test/travis_run.py

@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+# https://github.com/ahelal/travis-in-box
+
+import yaml
+import subprocess
+import sys
+import os.path
+
+
+class TravisExec(object):
+    def __init__(self, filename="travis.yml"):
+        self.fail = False
+        stream = open(filename, 'r')
+        yaml_file = yaml.load(stream)
+        # language
+        self.language = yaml_file.get("language", None)
+
+        # Section
+        self.section_before_install = yaml_file.get("before_install", None)
+        self.section_install = yaml_file.get("install", None)
+        self.section_before_script = yaml_file.get("before_script", None)
+        self.section_script = yaml_file.get("script", None)
+
+        #self.section_after_script = yaml_file.get("after_script", None)
+        self.section_after_failure = yaml_file.get("after_failure", None)
+        self.section_after_success = yaml_file.get("after_success", None)
+
+    def _setup(self):
+        if self.language == "python":
+            print "********** Setup Python  **********"
+            print ""
+            # Since we are not using container we have to install various lang our self
+            # So this is probably not the best way to do it
+            self._execute_command(["sudo apt-get install python-setuptools python-pip -y"])
+        else:
+            print "Errors unsupported language {}".format(self.language)
+            exit(1)
+
+    def life_cycle(self):
+        # See http://docs.travis-ci.com/user/build-configuration/
+
+            # 1. setup language
+            self._setup()
+            # 4. Run before_install commands
+            self.run_command("before_install", self.section_before_install, self.section_after_failure)
+            # 5. Run install commands
+            self.run_command("install", self.section_install, self.section_after_failure)
+            # 6. Run before_script commands
+            self.run_command("before_script", self.section_before_script, self.section_after_failure)
+            # 7. Run test script commands
+            self.run_command("script", self.section_script, self.section_after_failure)
+            # 8 . if we reach this point we made it run after_success
+            self.run_command("after_success", self.section_after_success, None)
+
+    @staticmethod
+    def _execute_command(command):
+        new_command = ["echo '> " + item.rstrip('\n') + "' && { " + item.rstrip('\n') + " ; }" for item in command]
+        new_command = " && ".join(new_command)
+
+        p = subprocess.Popen(new_command, shell=True, stderr=subprocess.PIPE)
+        while True:
+            out = p.stderr.read(1)
+            if out == '' and p.poll() is not None:
+                break
+            if out != '':
+                sys.stdout.write(out)
+                sys.stdout.flush()
+        print ""
+        return p.returncode
+
+    def run_command(self, section_name=None, command=None, execute_on_failure=None):
+        if command:
+            print ""
+            print "********** Running '{}' **********".format(section_name)
+            return_code = self._execute_command(command)
+            if return_code != 0:
+                print ""
+                print "********** Failed in '{}' **********".format(section_name)
+                if execute_on_failure:
+                    print ""
+                    print "********** Running after_failure  **********".format(section_name)
+                    self._execute_command(execute_on_failure)
+                    exit(1)
+
+filename = None
+if len(sys.argv) == 1:
+    filename = ".travis.yml"
+elif len(sys.argv) == 2:
+    filename = sys.argv[1]
+else:
+    print "Invalid number of arguments"
+    exit(1)
+
+if os.path.exists(filename):
+    TravisExec(filename).life_cycle()
+else:
+    print "Could not file travis file '{}'".format(filename)
+    exit(1)

+ 8 - 0
roles/external/dereulenspiegel.alfred-json/vars/Debian.yml

@@ -0,0 +1,8 @@
+alfred_json_build_deps:
+- cmake
+- build-essential
+- git
+- libjansson-dev
+- libjansson4
+- zlib1g-dev
+- pkg-config

+ 2 - 0
roles/external/dereulenspiegel.alfred-json/vars/main.yml

@@ -0,0 +1,2 @@
+---
+# vars file for alfred-json

+ 2 - 0
roles/external/dereulenspiegel.alfred/.gitignore

@@ -0,0 +1,2 @@
+.kitchen/
+secrets

+ 36 - 0
roles/external/dereulenspiegel.alfred/.kitchen.yml

@@ -0,0 +1,36 @@
+---
+driver:
+  name: vagrant
+
+provisioner:
+    name               : ansible_push
+    verbose            : "vvvv"
+    ansible_config     : "test/ansible.cfg"
+    idempotency_test   : False
+    sudo               : True
+    #chef_bootstrap_url : False
+    #extra_vars        : "@kitchen_vars.yml"
+
+platforms:
+    - name: Ubuntu-precise
+      driver:
+        box: ubuntu/precise64
+    - name: Debian-jessie
+      driver:
+        box: debian/jessie64
+    - name: Debian-wheezy
+      driver:
+        box: debian/wheezy64
+    - name: Ubuntu-trusty
+      driver:
+        box: ubuntu/trusty64
+
+suites:
+  - name: alfred_all
+    provisioner:
+      playbook: "test/application/alfred_all.yml"
+      extra_vars: {'kitchen_connection': 'smart'}
+  - name: alfred_pure
+    provisioner:
+      playbook: "test/application/alfred_pure.yml"
+      extra_vars: {'kitchen_connection': 'smart'}

+ 23 - 0
roles/external/dereulenspiegel.alfred/.travis.yml

@@ -0,0 +1,23 @@
+---
+language: python
+python: "2.7"
+
+before_install:
+  # Make sure everything's up to date.
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq python-apt python-pycurl git python-pip ruby ruby-dev build-essential autoconf
+  - gem install bundler
+
+install:
+  - sudo pip install ansible
+
+
+script:
+    #- cd test
+    - ansible --version
+    - bundle install
+    - KITCHEN_YAML=.kitchen.travis.yml bundle exec kitchen test travis
+
+
+after_success:
+    - echo "Success"

+ 7 - 0
roles/external/dereulenspiegel.alfred/Gemfile

@@ -0,0 +1,7 @@
+source "https://rubygems.org"
+
+gem "test-kitchen"
+gem "kitchen-ansiblepush"
+gem "kitchen-ansible"
+gem "kitchen-vagrant"
+gem "kitchen-localhost"

+ 50 - 0
roles/external/dereulenspiegel.alfred/README.md

@@ -0,0 +1,50 @@
+alfred [![Build Status](https://travis-ci.org/dereulenspiegel/ansible-alfred.svg?branch=master)](https://travis-ci.org/dereulenspiegel/ansible-alfred)
+=========
+
+This role installs [alfred](http://www.open-mesh.org/projects/open-mesh/wiki/Alfred).
+
+Requirements
+------------
+
+Ansible of course
+
+Role Variables
+--------------
+
+### Default Variables
+
+Name | Default | Description
+---- | ------- | -----------
+alfred_version | 2015.0 | The version of alfred to install
+alfred_source_url | http://downloads.open-mesh.org/batman/stable/sources/alfred/alfred-{{alfred_version}}.tar.gz | The URL to download alfred from
+alfred_gps | true | Wether to build alfred-gpsd
+alfred_vis | true | Wether to build batadv-vis
+alfred_batman_interface | bat0 | The Batman interface alfred will use. Use 'none' to disable the batman-adv based best server selection.
+alfred_interface | bat0 | The interface alfred will use
+alfred_batadv_vis_interface | bat0 | Interface for batadv-vis if alfred_vis is true
+alfred_master_mode | false | Wether alfred should run master mode or not
+
+
+Dependencies
+------------
+
+None
+
+Example Playbook
+----------------
+
+Simply depend on this role
+
+    - hosts: servers
+      roles:
+         - { role: dereulenspiegel.alfred, alfred_gps: false, alfred_interface: alfred0 }
+
+License
+-------
+
+MIT
+
+Author Information
+------------------
+
+Till Klocke [dereulenspiegel](https://twitter.com/dereulenspiegel) on Twitter

+ 10 - 0
roles/external/dereulenspiegel.alfred/defaults/main.yml

@@ -0,0 +1,10 @@
+---
+# defaults file for alfred
+alfred_version: 2015.0
+alfred_source_url: http://downloads.open-mesh.org/batman/stable/sources/alfred/alfred-{{alfred_version}}.tar.gz
+alfred_gps: true
+alfred_vis: true
+alfred_batman_interface: bat0
+alfred_interface: bat0
+alfred_batadv_vis_interface: bat0
+alfred_master_mode: false

+ 5 - 0
roles/external/dereulenspiegel.alfred/handlers/main.yml

@@ -0,0 +1,5 @@
+---
+# handlers file for alfred
+
+- name: Mount all
+  shell: mount -a

+ 1 - 0
roles/external/dereulenspiegel.alfred/meta/.galaxy_install_info

@@ -0,0 +1 @@
+{install_date: 'Mon Dec 14 17:09:49 2015', version: v1.1}

+ 20 - 0
roles/external/dereulenspiegel.alfred/meta/main.yml

@@ -0,0 +1,20 @@
+---
+galaxy_info:
+  author: Till Klocke
+  description: Install alfred daemon
+  company: Freifunk Dortmund
+  license: MIT
+  min_ansible_version: 1.2
+  platforms:
+  - name: Ubuntu
+    versions:
+    - trusty
+    - precise
+  - name: Debian
+    versions:
+    - wheezy
+    - jessie
+  categories:
+  - monitoring
+  - networking
+dependencies: []

+ 15 - 0
roles/external/dereulenspiegel.alfred/tasks/debian.yml

@@ -0,0 +1,15 @@
+- include_vars: "{{ ansible_distribution }}-{{ ansible_distribution_release }}.yml"
+
+- name: Ensure Alfred build deps are installed
+  apt: name={{item}} state=present
+  with_items: "{{alfred_build_deps}}"
+
+- name: Ensure alfred-gpsd build deps are installed
+  when: alfred_gps
+  apt: name={{item}} state=present
+  with_items: "{{alfred_gpsd_build_deps}}"
+
+- name: Ensure that debugfs is mounted. Alfred seems to depend on it
+  when: ansible_distribution_release == 'wheezy'
+  lineinfile: dest=/etc/fstab line="none /sys/kernel/debug     debugfs   defaults   0  0"
+  notify: Mount all

+ 61 - 0
roles/external/dereulenspiegel.alfred/tasks/main.yml

@@ -0,0 +1,61 @@
+---
+# tasks file for alfred
+
+- include: debian.yml
+  when: ansible_os_family == 'Debian'
+
+- name: Download alfred source code
+  get_url: dest=/usr/src url={{alfred_source_url}}
+
+- name: Extract alfred source code
+  unarchive: src=/usr/src/alfred-{{alfred_version}}.tar.gz dest=/usr/src copy=no
+
+- name: Copy libcap patch to src directory
+  when: alfred_libcap_dev_broken
+  template: src=libcap.patch.j2 dest=/usr/src/alfred-{{alfred_version}}/libcap.patch
+
+- name: Patch makefile to fix broken libcap-dev package on Debian and Ubuntu
+  when: alfred_libcap_dev_broken
+  patch: basedir=/usr/src/alfred-{{alfred_version}} src=/usr/src/alfred-{{alfred_version}}/libcap.patch remote_src=True strip=0
+
+- set_fact:
+    alfred_config_gps: "CONFIG_ALFRED_GPSD=n"
+  when: not alfred_gps
+
+- set_fact:
+    alfred_config_vis: "CONFIG_ALFRED_VIS=n"
+  when: not alfred_vis
+
+- name: Compile and install alfred
+  shell: "make {{alfred_config_gps|default('')}} {{alfred_config_vis|default('')}} && make {{alfred_config_gps|default('')}} {{alfred_config_vis|default('')}} install"
+  args:
+    chdir: /usr/src/alfred-{{alfred_version}}
+
+- name: Install init script and defaults for alfred
+  template: src="{{item.src}}" dest="{{item.dest}}" mode="{{item.mode}}"
+  with_items:
+  - src: alfred.init.j2
+    dest: /etc/init.d/alfred
+    mode: "u=rwx,g=r,o=r"
+  - src: alfred.default.j2
+    dest: /etc/default/alfred
+    mode: "u=rw,g=r,o=r"
+
+- name: Install init script and defaults for batadv-vis
+  when: alfred_vis is defined and alfred_vis
+  template: src="{{item.src}}" dest="{{item.dest}}" mode="{{item.mode}}"
+  with_items:
+  - src: batadv-vis.init.j2
+    dest: /etc/init.d/batadv-vis
+    mode: "u=rwx,g=r,o=r"
+  - src: batadv-vis.default.j2
+    dest: /etc/default/batadv-vis
+    mode: "u=rw,g=r,o=r"
+
+
+- name: Start and enable alfred
+  service: name=alfred state=started enabled=yes
+
+- name: Start and enable batadv-vis service
+  when: alfred_vis is defined and alfred_vis
+  service: name=batadv-vis state=started enabled=yes

+ 16 - 0
roles/external/dereulenspiegel.alfred/templates/alfred.default.j2

@@ -0,0 +1,16 @@
+#
+# /etc/default/alfred
+#
+
+# Additional command line options
+DAEMON_OPTS="{{alfed_daemon_opts|default('')}}"
+
+# Enable master mode (0/1)
+MASTER={% if alfred_master_mode is defined and alfred_master_mode %}1{% else %}0{% endif %}
+
+# Interface for A.L.F.R.E.D. to listen on. Has to be specified.
+INTERFACE={{alfred_interface}}
+
+# Specify the batman-adv interface configured on the system (default: bat0).
+# Use 'none' to disable the batman-adv based best server selection.
+BATMANIF={{alfred_batman_interface}}

+ 63 - 0
roles/external/dereulenspiegel.alfred/templates/alfred.init.j2

@@ -0,0 +1,63 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          alfred
+# Required-Start:    $remote_fs $network
+# Required-Stop:     $remote_fs $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: A.L.F.R.E.D
+### END INIT INFO
+
+# Author: Nils Schneider <nils@nilsschneider.net>
+
+PATH=/sbin:/bin
+DESC="A.L.F.R.E.D"
+NAME=alfred
+DAEMON=/usr/local/sbin/$NAME
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+OPTIONS=""
+UMASK=0117
+
+[ -x "$DAEMON" ] || exit 0
+
+# Source defaults.
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+[ -n "$INTERFACE" ] && OPTIONS="$OPTIONS -i $INTERFACE"
+[ -n "$BATMANIF" ] && OPTIONS="$OPTIONS -b $BATMANIF"
+[ "$MASTER" = "1" ] && OPTIONS="$OPTIONS -m"
+[ -n "$DAEMON_OPTS" ] && OPTIONS="$OPTIONS $DAEMON_OPTS"
+
+. /lib/lsb/init-functions
+
+case "$1" in
+  start)
+        log_daemon_msg "Starting $DESC" "$NAME"
+        start-stop-daemon --start --quiet --pidfile "$PIDFILE" \
+                --umask $UMASK --make-pidfile \
+                --background --exec "$DAEMON" --oknodo \
+                -- $OPTIONS
+        log_end_msg $?
+        ;;
+  stop)
+        log_daemon_msg "Stopping $DESC" "$NAME"
+        start-stop-daemon --stop --quiet --pidfile "$PIDFILE" \
+                --retry 1 --oknodo
+        log_end_msg $?
+        ;;
+  restart|force-reload)
+        $0 stop
+        sleep 1
+        $0 start
+        ;;
+  status)
+        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+        ;;
+  *)
+        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
+        exit 1
+        ;;
+esac
+
+exit $?

+ 6 - 0
roles/external/dereulenspiegel.alfred/templates/batadv-vis.default.j2

@@ -0,0 +1,6 @@
+#
+# /etc/default/batadv-vis
+#
+
+# Specify the batman-adv interface configured on the system (default: bat0).
+BATMANIF={{alfred_batadv_vis_interface}}

+ 59 - 0
roles/external/dereulenspiegel.alfred/templates/batadv-vis.init.j2

@@ -0,0 +1,59 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          batadv-vis
+# Required-Start:    $remote_fs $network alfred
+# Required-Stop:     $remote_fs $network alfred
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: batadv-vis
+### END INIT INFO
+
+# Author: Nils Schneider <nils@nilsschneider.net>
+
+PATH=/sbin:/bin
+DESC="batadv-vis"
+NAME=batadv-vis
+DAEMON=/usr/local/sbin/$NAME
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+GROUP=alfred
+OPTIONS="-s"
+
+[ -x "$DAEMON" ] || exit 0
+
+# Source defaults.
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+[ -n "$BATMANIF" ] && OPTIONS="$OPTIONS -i $BATMANIF"
+
+. /lib/lsb/init-functions
+
+case "$1" in
+  start)
+        log_daemon_msg "Starting $DESC" "$NAME"
+        start-stop-daemon --start --quiet --pidfile "$PIDFILE" \
+                --make-pidfile --background \
+                --exec "$DAEMON" --oknodo -- $OPTIONS
+        log_end_msg $?
+        ;;
+  stop)
+        log_daemon_msg "Stopping $DESC" "$NAME"
+        start-stop-daemon --stop --quiet --pidfile "$PIDFILE" \
+                --retry 1 --oknodo
+        log_end_msg $?
+        ;;
+  restart|force-reload)
+        $0 stop
+        sleep 1
+        $0 start
+        ;;
+  status)
+        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+        ;;
+  *)
+        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
+        exit 1
+        ;;
+esac
+
+exit $?

+ 20 - 0
roles/external/dereulenspiegel.alfred/templates/libcap.patch.j2

@@ -0,0 +1,20 @@
+--- ../alfred_/Makefile 2015-05-01 23:47:25.179644579 +0000
++++ Makefile    2015-05-02 00:11:56.251644579 +0000
+@@ -83,11 +83,12 @@
+ 
+   ifeq ($(origin LIBCAP_CFLAGS) $(origin LIBCAP_LDLIBS), undefined undefined)
+     LIBCAP_NAME ?= libcap
+-    ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBCAP_NAME) 2>/dev/null),)
+-      $(error No $(LIBCAP_NAME) development libraries found!)
+-    endif
+-    LIBCAP_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBCAP_NAME))
+-    LIBCAP_LDLIBS +=  $(shell $(PKG_CONFIG) --libs $(LIBCAP_NAME))
++#    ifeq ($(shell $(PKG_CONFIG) --modversion $(LIBCAP_NAME) 2>/dev/null),)
++#      $(error No $(LIBCAP_NAME) development libraries found!)
++#    endif
++#    LIBCAP_CFLAGS += $(shell $(PKG_CONFIG) --cflags $(LIBCAP_NAME))
++#    LIBCAP_LDLIBS +=  $(shell $(PKG_CONFIG) --libs $(LIBCAP_NAME))
++    LIBCAP_LDLIBS += -lcap
+   endif
+   CFLAGS += $(LIBCAP_CFLAGS)
+   CPPFLAGS += -DCONFIG_ALFRED_CAPABILITIES

+ 63 - 0
roles/external/dereulenspiegel.alfred/templates/simple_init.j2

@@ -0,0 +1,63 @@
+#!/bin/sh
+### BEGIN INIT INFO
+# Provides:          alfred
+# Required-Start:    $remote_fs $network
+# Required-Stop:     $remote_fs $network
+# Default-Start:     2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: A.L.F.R.E.D
+### END INIT INFO
+
+# Author: Nils Schneider <nils@nilsschneider.net>
+
+PATH=/sbin:/bin
+DESC="{{item.description}}"
+NAME={{item.name}}
+DAEMON={{item.daemon_path}}$NAME
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+OPTIONS=""
+UMASK=0117
+
+[ -x "$DAEMON" ] || exit 0
+
+# Source defaults.
+[ -r /etc/default/$NAME ] && . /etc/default/$NAME
+
+[ -n "$INTERFACE" ] && OPTIONS="$OPTIONS -i $INTERFACE"
+[ -n "$BATMANIF" ] && OPTIONS="$OPTIONS -b $BATMANIF"
+[ "$MASTER" = "1" ] && OPTIONS="$OPTIONS -m"
+[ -n "$DAEMON_OPTS" ] && OPTIONS="$OPTIONS $DAEMON_OPTS"
+
+. /lib/lsb/init-functions
+
+case "$1" in
+  start)
+        log_daemon_msg "Starting $DESC" "$NAME"
+        start-stop-daemon --start --quiet --pidfile "$PIDFILE" \
+                --umask $UMASK --make-pidfile \
+                --background --exec "$DAEMON" --oknodo \
+                -- $OPTIONS
+        log_end_msg $?
+        ;;
+  stop)
+        log_daemon_msg "Stopping $DESC" "$NAME"
+        start-stop-daemon --stop --quiet --pidfile "$PIDFILE" \
+                --retry 1 --oknodo
+        log_end_msg $?
+        ;;
+  restart|force-reload)
+        $0 stop
+        sleep 1
+        $0 start
+        ;;
+  status)
+        status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
+        ;;
+  *)
+        echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|status}" >&2
+        exit 1
+        ;;
+esac
+
+exit $?

+ 2 - 0
roles/external/dereulenspiegel.alfred/test/ansible.cfg

@@ -0,0 +1,2 @@
+[defaults]
+roles_path=../:../../:/spec/

+ 10 - 0
roles/external/dereulenspiegel.alfred/test/application/alfred_all.yml

@@ -0,0 +1,10 @@
+---
+- name         : Install and configure alfred
+  hosts        : all
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  vars         :
+                 alfred_gps: true
+                 alfred_vis: true
+  roles        :
+                 - "ansible-alfred"

+ 10 - 0
roles/external/dereulenspiegel.alfred/test/application/alfred_pure.yml

@@ -0,0 +1,10 @@
+---
+- name         : Install and configure alfred without alfred-gpsd or batadv-vis
+  hosts        : all
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  vars         :
+                 alfred_gps: false
+                 alfred_vis: false
+  roles        :
+                 - "ansible-alfred"

+ 10 - 0
roles/external/dereulenspiegel.alfred/test/application/alfred_travis.yml

@@ -0,0 +1,10 @@
+---
+- name         : Install and configure alfred
+  hosts        : localhost
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  vars         :
+                 alfred_gps: true
+                 alfred_vis: true
+  roles        :
+                 - "ansible-alfred"

+ 29 - 0
roles/external/dereulenspiegel.alfred/test/integration/alfred_all/serverspec/alfred_spec.rb

@@ -0,0 +1,29 @@
+require 'serverspec'
+
+# Required by serverspec
+set :backend, :exec
+
+describe file('/usr/local/sbin/alfred') do
+  it { should exist }
+  it { should be_executable }
+end
+
+describe file('/usr/local/sbin/alfred-gpsd') do
+  it { should exist }
+  it { should be_executable }
+end
+
+describe file('/usr/local/sbin/batadv-vis') do
+  it { should exist }
+  it { should be_executable }
+end
+
+describe file('/etc/init.d/alfred') do
+  it { should exist }
+  it { should be_executable }
+end
+
+describe file('/etc/init.d/batadv-vis') do
+  it { should exist }
+  it { should be_executable }
+end

+ 27 - 0
roles/external/dereulenspiegel.alfred/test/integration/alfred_pure/serverspec/test_spec.rb

@@ -0,0 +1,27 @@
+require 'serverspec'
+
+# Required by serverspec
+set :backend, :exec
+
+describe file('/usr/local/sbin/alfred') do
+  it { should exist }
+  it { should be_executable }
+end
+
+describe file('/usr/local/sbin/alfred-gpsd') do
+  it { should_not exist }
+  it { should_not be_executable }
+end
+
+describe file('/usr/local/sbin/batadv-vis') do
+  it { should_not exist }
+  it { should_not be_executable }
+end
+
+describe package('libgps-dev') do
+  it { should_not be_installed }
+end
+
+describe file('/etc/init.d/batadv-vis') do
+  it { should_not exist }
+end

+ 1 - 0
roles/external/dereulenspiegel.alfred/test/local.ini

@@ -0,0 +1 @@
+localhost ansible_connection='local'

+ 17 - 0
roles/external/dereulenspiegel.alfred/test/run_vagrant_kitchen.sh

@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+set -e
+echo "**** Box setup ***"
+
+echo "* mkdir /kitchen"
+mkdir -p /kitchen
+
+#echo "* cp -ar /mnt/shared /kitchen"
+#cp -r /mnt/shared/. /kitchen
+echo "* ln -sf /mnt/shared /kitchen"
+ln -sf /mnt/shared/* /kitchen/
+
+echo "* cd /kitchen"
+cd /kitchen/*
+
+echo "* python test/travis_run.py"
+python test/travis_run.py

+ 98 - 0
roles/external/dereulenspiegel.alfred/test/travis_run.py

@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+# https://github.com/ahelal/travis-in-box
+
+import yaml
+import subprocess
+import sys
+import os.path
+
+
+class TravisExec(object):
+    def __init__(self, filename="travis.yml"):
+        self.fail = False
+        stream = open(filename, 'r')
+        yaml_file = yaml.load(stream)
+        # language
+        self.language = yaml_file.get("language", None)
+
+        # Section
+        self.section_before_install = yaml_file.get("before_install", None)
+        self.section_install = yaml_file.get("install", None)
+        self.section_before_script = yaml_file.get("before_script", None)
+        self.section_script = yaml_file.get("script", None)
+
+        #self.section_after_script = yaml_file.get("after_script", None)
+        self.section_after_failure = yaml_file.get("after_failure", None)
+        self.section_after_success = yaml_file.get("after_success", None)
+
+    def _setup(self):
+        if self.language == "python":
+            print "********** Setup Python  **********"
+            print ""
+            # Since we are not using container we have to install various lang our self
+            # So this is probably not the best way to do it
+            self._execute_command(["sudo apt-get install python-setuptools python-pip -y"])
+        else:
+            print "Errors unsupported language {}".format(self.language)
+            exit(1)
+
+    def life_cycle(self):
+        # See http://docs.travis-ci.com/user/build-configuration/
+
+            # 1. setup language
+            self._setup()
+            # 4. Run before_install commands
+            self.run_command("before_install", self.section_before_install, self.section_after_failure)
+            # 5. Run install commands
+            self.run_command("install", self.section_install, self.section_after_failure)
+            # 6. Run before_script commands
+            self.run_command("before_script", self.section_before_script, self.section_after_failure)
+            # 7. Run test script commands
+            self.run_command("script", self.section_script, self.section_after_failure)
+            # 8 . if we reach this point we made it run after_success
+            self.run_command("after_success", self.section_after_success, None)
+
+    @staticmethod
+    def _execute_command(command):
+        new_command = ["echo '> " + item.rstrip('\n') + "' && { " + item.rstrip('\n') + " ; }" for item in command]
+        new_command = " && ".join(new_command)
+
+        p = subprocess.Popen(new_command, shell=True, stderr=subprocess.PIPE)
+        while True:
+            out = p.stderr.read(1)
+            if out == '' and p.poll() is not None:
+                break
+            if out != '':
+                sys.stdout.write(out)
+                sys.stdout.flush()
+        print ""
+        return p.returncode
+
+    def run_command(self, section_name=None, command=None, execute_on_failure=None):
+        if command:
+            print ""
+            print "********** Running '{}' **********".format(section_name)
+            return_code = self._execute_command(command)
+            if return_code != 0:
+                print ""
+                print "********** Failed in '{}' **********".format(section_name)
+                if execute_on_failure:
+                    print ""
+                    print "********** Running after_failure  **********".format(section_name)
+                    self._execute_command(execute_on_failure)
+                    exit(1)
+
+filename = None
+if len(sys.argv) == 1:
+    filename = ".travis.yml"
+elif len(sys.argv) == 2:
+    filename = sys.argv[1]
+else:
+    print "Invalid number of arguments"
+    exit(1)
+
+if os.path.exists(filename):
+    TravisExec(filename).life_cycle()
+else:
+    print "Could not file travis file '{}'".format(filename)
+    exit(1)

+ 11 - 0
roles/external/dereulenspiegel.alfred/vars/Debian-jessie.yml

@@ -0,0 +1,11 @@
+alfred_build_deps:
+  - build-essential
+  - pkg-config
+  - libcap2
+  - libcap-dev
+
+alfred_gpsd_build_deps:
+  - libgps21
+  - libgps-dev
+
+alfred_libcap_dev_broken: false

+ 11 - 0
roles/external/dereulenspiegel.alfred/vars/Debian-wheezy.yml

@@ -0,0 +1,11 @@
+alfred_build_deps:
+  - build-essential
+  - pkg-config
+  - libcap2
+  - libcap-dev
+
+alfred_gpsd_build_deps:
+  - libgps20
+  - libgps-dev
+
+alfred_libcap_dev_broken: true

+ 11 - 0
roles/external/dereulenspiegel.alfred/vars/Ubuntu-precise.yml

@@ -0,0 +1,11 @@
+alfred_build_deps:
+  - build-essential
+  - pkg-config
+  - libcap2
+  - libcap-dev
+
+alfred_gpsd_build_deps:
+  - libgps20
+  - libgps-dev
+
+alfred_libcap_dev_broken: true

+ 11 - 0
roles/external/dereulenspiegel.alfred/vars/Ubuntu-trusty.yml

@@ -0,0 +1,11 @@
+alfred_build_deps:
+  - build-essential
+  - pkg-config
+  - libcap2
+  - libcap-dev
+
+alfred_gpsd_build_deps:
+  - libgps20
+  - libgps-dev
+
+alfred_libcap_dev_broken: true

+ 2 - 0
roles/external/dereulenspiegel.alfred/vars/main.yml

@@ -0,0 +1,2 @@
+---
+# vars file for alfred

+ 2 - 0
roles/external/dereulenspiegel.fastd/.gitignore

@@ -0,0 +1,2 @@
+.kitchen/
+secrets

+ 36 - 0
roles/external/dereulenspiegel.fastd/.kitchen.yml

@@ -0,0 +1,36 @@
+---
+driver:
+  name: vagrant
+
+provisioner:
+    name               : ansible_push
+    verbose            : "vvvv"
+    ansible_config     : "test/ansible.cfg"
+    idempotency_test   : False
+    sudo               : True
+    #chef_bootstrap_url : False
+    #extra_vars        : "@kitchen_vars.yml"
+
+platforms:
+    - name: Ubuntu-precise
+      driver:
+        box: ubuntu/precise64
+    - name: Debian-jessie
+      driver:
+        box: debian/jessie64
+    - name: Debian-wheezy
+      driver:
+        box: debian/wheezy64
+    - name: Ubuntu-trusty
+      driver:
+        box: ubuntu/trusty64
+
+suites:
+  - name: fastd
+    provisioner:
+      playbook: "test/application/fastd.yml"
+      extra_vars: {'kitchen_connection': 'smart'}
+#  - name            : group
+#    provisioner     :
+#        playbook    : "test/application/group.yml"
+#        extra_vars  : { 'kitchen_connection': 'smart' }

+ 23 - 0
roles/external/dereulenspiegel.fastd/.travis.yml

@@ -0,0 +1,23 @@
+---
+language: python
+python: "2.7"
+
+before_install:
+  # Make sure everything's up to date.
+  - sudo apt-get update -qq
+  - sudo apt-get install -qq python-apt python-pycurl git python-pip ruby ruby-dev build-essential autoconf
+  - gem install bundler
+
+install:
+  - sudo pip install ansible
+
+
+script:
+    #- cd test
+    - ansible --version
+    - bundle install
+    - KITCHEN_YAML=.kitchen.travis.yml bundle exec kitchen test travis
+
+
+after_success:
+    - echo "Success"

+ 7 - 0
roles/external/dereulenspiegel.fastd/Gemfile

@@ -0,0 +1,7 @@
+source "https://rubygems.org"
+
+gem "test-kitchen"
+gem "kitchen-ansiblepush"
+gem "kitchen-ansible"
+gem "kitchen-vagrant"
+gem "kitchen-localhost"

+ 82 - 0
roles/external/dereulenspiegel.fastd/README.md

@@ -0,0 +1,82 @@
+fastd [![Build Status](https://travis-ci.org/dereulenspiegel/ansible-fastd.svg?branch=master)](https://travis-ci.org/dereulenspiegel/ansible-fastd)
+=========
+
+This role installs fastd and its dependency (from source if necessary) and is able to configure one or more instances.
+
+Requirements
+------------
+
+Ansible 1.2 and a Debian based OS (this may change in the future)
+
+Role Variables
+--------------
+
+### Default variables
+
+Variable | Description | Default
+-------- | ----------- | --------
+fastd_repo | If building from source the git repo to checkout from | http://git.universe-factory.net/fastd/
+fastd_repo_tag | If building from source, the git tag or branch to checkout | v17
+fastd_build_dir | If building from source, the directory where the sources are build | /usr/src/fastd-build
+fastd_install_from_source | Wether to build from source, this is set automatically if necessary | false
+fastd_user_name | The user which should be created for fastd | fastd
+fastd_user_shell | Shell for the fastd user | /bin/false
+libsodum_src_url | If building from source, where to find the source tar ball | https://download.libsodium.org/libsodium/releases/libsodium-{{libsodum_version}}.tar.gz
+libsodum_version | If building from source, which version of libsodium to download | 1.0.3
+libsodium_build_dir | If building from source, where should the build happen | /usr/src/
+libuecc_version | If building from source, which git tag or branch to checkout from source repo | v5
+libuecc_repo | If building from source, from which repo to checkout the source | git://git.universe-factory.net/libuecc
+libuecc_repo_dir | If building from source, under which directory should the local clone be created | /usr/src/
+libuecc_build_dir | Where to create the cmake build dir, if building from source | /usr/src/libuecc-build
+
+### Instance variables
+
+This playbook can create configurations for multiple instances running on the same host.
+All instances are defined in an array under `fastd_instances`.
+
+```
+fastd_instances:
+  - name: fast-vpn    # Name of the instance and the config folder under /etc/fastd
+    bind: any:10000 interface "eth0" default ipv4
+    interface: tap00
+    loglevel: info
+    mode: tap
+    method: salsa2012+umac
+    peer_limit: 125
+    mtu: 1280
+    status_socket: /tmp/fastd00.sock
+    on_up_script: |
+      ip link set up $INTERFACE
+      batctl if add $INTERFACE
+    on_verify_script: |
+      /etc/fastd/fastd-blacklist.sh $PEER_KEY
+```
+The secret keys are defined in a seperate variable so you can encrypt them `fastd_instances_secret`.
+
+```
+fastd_instances_secret:
+  - name: fast-vpn
+    secret: 280088c4463559417e9f2daf17babc1db820ab79eb4f79e3718719b2a976e8a8b5e
+```
+
+Dependencies
+------------
+
+no dependencies
+
+Example Playbook
+----------------
+
+TODO
+
+License
+-------
+
+MIT
+
+Author Information
+------------------
+
+Till Klocke
+- [Twitter](https://twitter.com/dereulenspiegel)
+- [Github](https://github.com/dereulenspiegel)

+ 26 - 0
roles/external/dereulenspiegel.fastd/defaults/main.yml

@@ -0,0 +1,26 @@
+---
+# defaults file for fastd
+fastd_repo: http://git.universe-factory.net/fastd/
+fastd_repo_tag: v17
+fastd_install_dir: /opt/fastd
+fastd_build_dir: /usr/src/fastd-build
+fastd_install_from_source: false
+fastd_user_name: fastd
+fastd_user_shell: /bin/false
+fastd_libjson_url: https://launchpad.net/~ondrej/+archive/ubuntu/php5/+build/4910513/+files/libjson-c2_0.11-3%2Bdebphp.org~precise%2B1_amd64.deb
+fastd_libjson_dev_url: https://launchpad.net/~ondrej/+archive/ubuntu/php5/+build/4910513/+files/libjson-c-dev_0.11-3%2Bdebphp.org~precise%2B1_amd64.deb
+fastd_use_rng: false
+
+repo_universe_factory_unsupported_architecture: false
+repo_universe_factory_unsupported_distro: false
+
+libsodium_build_from_source: false
+libsodum_version: 1.0.3
+libsodum_src_url: https://download.libsodium.org/libsodium/releases/libsodium-{{libsodum_version}}.tar.gz
+libsodium_build_dir: /usr/src/
+
+libuecc_build_from_source: false
+libuecc_version: v5
+libuecc_repo: git://git.universe-factory.net/libuecc
+libuecc_repo_dir: /usr/src/
+libuecc_build_dir: /usr/src/libuecc-build

+ 5 - 0
roles/external/dereulenspiegel.fastd/handlers/main.yml

@@ -0,0 +1,5 @@
+---
+# handlers file for fastd
+
+- name: Restart fastd
+  service: name=fastd state=restarted

+ 1 - 0
roles/external/dereulenspiegel.fastd/meta/.galaxy_install_info

@@ -0,0 +1 @@
+{install_date: 'Mon Dec 14 17:09:45 2015', version: v1.0}

+ 17 - 0
roles/external/dereulenspiegel.fastd/meta/main.yml

@@ -0,0 +1,17 @@
+---
+galaxy_info:
+  author: Till Klocke
+  description: Installs fastd
+  company: Freifunk Dortmund
+  license: MIT
+  min_ansible_version: 1.2
+  platforms:
+  - name: Debian
+    versions:
+    - all
+  - name: Ubuntu
+    vesions:
+    - all
+  categories:
+  - networking
+dependencies: []

+ 43 - 0
roles/external/dereulenspiegel.fastd/tasks/debian.yml

@@ -0,0 +1,43 @@
+- name: Install fastd build dependencies
+  when: not repo_universe_factory_available
+  apt: name={{item}} update_cache=yes
+  with_items:
+    - libcap2
+    - libcap-dev
+    - bison
+    - pkg-config
+    - cmake
+    - libssl1.0.0
+    - libssl-dev
+    - git
+    - build-essential
+
+- name: Install rng-tools
+  when: fastd_use_rng
+  apt: name=rng-tools state=present
+
+- name: Make sure that rng-tools uses /dev/urandom
+  when: fastd_use_rng
+  lineinfile:
+    dest: /etc/default/rng-tools
+    line: HRNGDEVICE=/dev/urandom
+
+- include: source.yml
+  when: not repo_universe_factory_available
+
+- name: Download backported libjson-c2
+  when: ansible_distribution == 'Ubuntu' and ansible_distribution_major_version|int < 14
+  get_url: 
+    url="{{ fastd_libjson_url }}"
+    dest="/tmp/libjson-c2.deb"
+
+- name: Install backported libjson-c2
+  when: ansible_distribution == 'Ubuntu' and ansible_distribution_major_version|int < 14
+  apt: deb="/tmp/libjson-c2.deb"
+
+- name: Install fastd via Apt
+  when: repo_universe_factory_available
+  apt: name=fastd state=latest
+
+- name: Add fastd user
+  user: createhome=no system=yes shell={{fastd_user_shell}} name={{fastd_user_name}}

+ 16 - 0
roles/external/dereulenspiegel.fastd/tasks/libsodium/debian.yml

@@ -0,0 +1,16 @@
+- name: Install libsodium via Apt
+  when: repo_universe_factory_available
+  apt: name={{item}} state=latest update_cache=yes
+  with_items:
+  - libsodium13
+  - libsodium-dev
+
+- name: Install build dependencies for libsodium
+  when: not repo_universe_factory_available
+  apt: name={{item}} state=present
+  with_items:
+  - build-essential
+  - autoconf
+
+- include: source.yml
+  when: not repo_universe_factory_available

+ 8 - 0
roles/external/dereulenspiegel.fastd/tasks/libsodium/main.yml

@@ -0,0 +1,8 @@
+---
+# tasks file for libsodium
+
+- include: ubuntu.yml
+  when: ansible_distribution == "Ubuntu"
+
+- include: debian.yml
+  when: ansible_distribution == "Debian"

+ 18 - 0
roles/external/dereulenspiegel.fastd/tasks/libsodium/source.yml

@@ -0,0 +1,18 @@
+- name: Download libsodium
+  get_url: dest={{libsodium_build_dir}} url={{libsodum_src_url}}
+
+- name: Extract libsodium
+  unarchive: dest={{libsodium_build_dir}} copy=no src="/usr/src/libsodium-{{libsodum_version}}.tar.gz" creates="{{libsodium_build_dir}}/libsodium-{{libsodum_version}}"
+
+- name: Configure libsodium
+  register: libsodiumconfigured
+  command: ./configure chdir="{{libsodium_build_dir}}/libsodium-{{libsodum_version}}" creates="{{libsodium_build_dir}}/libsodium-{{libsodum_version}}/Makefile"
+
+- name: Compile libsodium
+  when: libsodiumconfigured|changed
+  register: libsodiumcompiled
+  shell: make && make check chdir="{{libsodium_build_dir}}/libsodium-{{libsodum_version}}"
+
+- name: Install libsodium
+  when: libsodiumcompiled|changed
+  command: make install chdir="{{libsodium_build_dir}}/libsodium-{{libsodum_version}}"

+ 9 - 0
roles/external/dereulenspiegel.fastd/tasks/libsodium/ubuntu.yml

@@ -0,0 +1,9 @@
+- name: Install libsodium via apt
+  when: repo_universe_factory_available
+  apt: name={{item}} state=latest update_cache=yes
+  with_items:
+  - libsodium13
+  - libsodium-dev
+
+- include: source.yml
+  when: not repo_universe_factory_available

+ 17 - 0
roles/external/dereulenspiegel.fastd/tasks/libuecc/debian.yml

@@ -0,0 +1,17 @@
+- name: Install libuecc via Apt
+  when: repo_universe_factory_available
+  apt: name={{item}} state=latest update_cache=yes
+  with_items:
+  - libuecc0
+  - libuecc-dev
+
+- name: Install libuecc build dependencies
+  when: not repo_universe_factory_available
+  apt: name={{item}} state=present
+  with_items:
+  - cmake
+  - build-essential
+  - git
+
+- include: source.yml
+  when: not repo_universe_factory_available

+ 8 - 0
roles/external/dereulenspiegel.fastd/tasks/libuecc/main.yml

@@ -0,0 +1,8 @@
+---
+# tasks file for libsodium
+
+- include: debian.yml
+  when: ansible_distribution == "Ubuntu"
+
+- include: debian.yml
+  when: ansible_distribution == "Debian"

+ 13 - 0
roles/external/dereulenspiegel.fastd/tasks/libuecc/source.yml

@@ -0,0 +1,13 @@
+- name: Create dirs
+  file: dest={{item}} state=directory
+  with_items:
+  - "{{libuecc_repo_dir}}"
+  - "{{libuecc_build_dir}}"
+
+- name: Checkout
+  git: repo={{libuecc_repo}} dest={{libuecc_repo_dir}}/libuecc accept_hostkey=yes version={{libuecc_version}}
+
+- name: Build and install libuecc
+  shell: cmake {{libuecc_repo_dir}}/libuecc && make && make install
+  args:
+    chdir: "{{libuecc_build_dir}}"

+ 48 - 0
roles/external/dereulenspiegel.fastd/tasks/main.yml

@@ -0,0 +1,48 @@
+---
+# tasks file for fastd
+
+- include: repo.yml
+
+- include: libsodium/main.yml
+
+- include: libuecc/main.yml
+
+- include: debian.yml
+  when: ansible_distribution == "Ubuntu"
+
+- include: debian.yml
+  when: ansible_distribution == "Debian"
+
+- name: Create fastd config directories
+  file: path=/etc/fastd/{{item.name}} state=directory recurse=yes
+  with_items:
+    - "{{fastd_instances}}"
+
+- name: Create fastd configs
+  template: src=fastd.conf.j2 dest=/etc/fastd/{{item.name}}/fastd.conf
+  with_items: "{{fastd_instances}}"
+  notify: Restart fastd
+
+- name: Create fastd secrets
+  template: src=secret.conf.j2 dest=/etc/fastd/{{item.name}}/secret.conf
+  with_items: "{{fastd_instances_secret}}"
+  notify: Restart fastd
+
+- name: Create fastd peer include directories
+  when: item.peer_dir is defined
+  file: dest={{item.peer_dir}} state=directory
+  with_items: "{{fastd_instances}}"
+
+- name: Create fastd peer configs
+  when: item.0.peer_dir is defined
+  template: src=peer.config.j2 dest="{{item.0.peer_dir}}/{{item.1.name}}"
+  with_subelements:
+  - "{{fastd_instances | selectattr('peers', 'defined') | list}}"
+  - peers
+
+- name: rng-tools need to run
+  when: fastd_use_rng
+  service: name=rng-tools state=started enabled=yes pattern=/usr/sbin/rngd
+
+- name: fastd needs to autostart
+  service: name=fastd enabled=yes state=started

+ 36 - 0
roles/external/dereulenspiegel.fastd/tasks/repo.yml

@@ -0,0 +1,36 @@
+---
+# tasks file for repo-universe-factory
+
+- name: Check architecture
+  when: ansible_architecture != 'i386' and ansible_architecture != 'amd64' and ansible_architecture !='x86_64'
+  set_fact: 
+    repo_universe_factory_unsupported_architecture: true
+
+- name: Check Distro
+  when: ansible_distribution != "Debian" and ansible_distribution != "Ubuntu"
+  set_fact:
+    repo_universe_factory_unsupported_distro: true
+
+- set_fact:
+    repo_universe_factory_available: true
+  when: not repo_universe_factory_unsupported_distro and not repo_universe_factory_unsupported_architecture
+
+- set_fact:
+    repo_universe_factory_available: false
+  when: repo_universe_factory_unsupported_distro or repo_universe_factory_unsupported_architecture
+
+- name: Add GPG key for Wheezy backports
+  when: ansible_distribution_release == 'wheezy' and repo_universe_factory_available
+  apt_key: keyserver=pgpkeys.mit.edu id=8B48AD6246925553
+
+- name: Add Wheezy backports
+  when: ansible_distribution_release == 'wheezy' and repo_universe_factory_available
+  apt_repository: repo='deb http://http.debian.net/debian wheezy-backports main' state=present update_cache=yes
+
+- name: Add Universe Factory GPG Key
+  when: repo_universe_factory_available
+  apt_key: keyserver=pgpkeys.mit.edu id=16EF3F64CB201D9C
+
+- name: Add Universe Factory Apt Repository 
+  when: repo_universe_factory_available
+  apt_repository: repo='deb http://repo.universe-factory.net/debian/ sid main' state=present update_cache=yes

+ 14 - 0
roles/external/dereulenspiegel.fastd/tasks/source.yml

@@ -0,0 +1,14 @@
+- name: Clone fastd repo
+  register: clonefastd
+  git: repo={{fastd_repo}} dest=/usr/src/fastd accept_hostkey=yes version={{fastd_repo_tag}}
+
+- name: Create build dirs
+  when: clonelibuecc|changed
+  register: builddircreated
+  file: path={{item}} state=directory
+  with_items:
+    - "{{fastd_build_dir}}"
+
+- name: Build and install fastd
+  when: builddircreated|changed
+  shell: cmake /usr/src/fastd && make && make install chdir={{fastd_build_dir}}

+ 103 - 0
roles/external/dereulenspiegel.fastd/templates/fastd.conf.j2

@@ -0,0 +1,103 @@
+#
+# This file is managed by ansible. Do not edit by hand!
+#
+
+bind {{item.bind}};
+include "secret.conf";
+interface "{{item.interface}}";
+log level {{item.loglevel|default('warn')}};
+{% if item.syslog_level is defined %}
+log to syslog level {{item.syslog_level}};
+{% endif %}
+{% if item.stderr_level is defined %}
+log to syslog level {{item.stderr_level}};
+{% endif %}
+mode {{item.mode}};
+method "{{item.method}}";
+peer limit {{item.peer_limit}};
+hide ip addresses {{item.hide_ip_addressess|default('yes')}};
+mtu {{item.mtu}};
+secure handshakes {{item.secure_handshake|default('yes')}};
+status socket "{{item.status_socket}}";
+user "{{fastd_user_name}}";
+drop capabilities {{item.drop_capabilities|default('yes')}};
+forward {{item.forward|default('no')}};
+hide mac addresses {{item.hide_mac_addresses|default('yes')}};
+{% if item.includes is defined %}
+{% for include in item.includes %}
+include {{include}};
+{% endfor %}
+{% endif %}
+{% if item.peer_includes is defined %}
+{% for include in item.peers %}
+{% if include.file is defined %}
+include peer "{{include.file}}" {% if include.name is defined %}[ as "{{include.name}}" ]{% endif %};
+{% endif %}
+{% endfor %}
+{% endif %}
+{% if item.peer_dir is defined %}
+include peers from "{{item.peer_dir}}";
+{% endif %}
+{% if item.mac is defined %}
+mac "{{item.mac.name}}" use "{{item.mac.implementation}}";
+{% endif %}
+{% if item.packet_mark is defined %}
+packet mark {{item.packet_mark}};
+{% endif %}
+{% if item.on_pre_up_script is defined %}
+on pre-up "
+  {{item.on_pre_up_script}}
+";
+{% endif %}
+{% if item.on_up_script is defined %}
+on up "
+  {{item.on_up_script}}
+";
+{% endif %}
+
+{% if item.on_verify_script is defined %}
+on verify "
+  {{item.on_verify_script}}
+";
+{% endif %}
+{% if item.on_down_script is defined %}
+on down "
+  {{item.on_down_script}}
+";
+{% endif %}
+{% if item.on_post_down_script is defined %}
+on post-down "
+  {{item.on_post_down_script}}
+";
+{% endif %}
+{% if item.on_connect_script is defined %}
+on connect "
+  {{item.on_connect_script}}
+";
+{% endif %}
+{% if item.on_establish_script is defined %}
+on establish "
+  {{item.on_establish_script}}
+";
+{% endif %}
+{% if item.on_disestablish_script is defined %}
+on disestablish "
+  {{item.on_disestablish_script}}
+";
+{% endif %}
+
+{% if item.peers is defined and item.peer_dir is not defined %}
+{% for peer in item.peers %}
+peer "{{peer.name}}" {
+  
+};
+{% endfor %}
+{% endif %}
+
+{% if item.peer_groups is defined %}
+{% for peer_group in item.peer_groups %}
+peer group "{{peer_group-name}}" {
+  
+};
+{% endfor %}
+{% endif %}

+ 12 - 0
roles/external/dereulenspiegel.fastd/templates/peer.config.j2

@@ -0,0 +1,12 @@
+{% if item.1 is defined %}
+{% set peer = item.1 %}
+{% endif %}
+key "{{peer.key}}";
+{% if peer.remotes is defined %}
+{% for remote in peer.remotes %}
+remote {{remote}};
+{% endfor %}
+{% endif %}
+{% if peer.float is defined %}
+float {{peer.float}};
+{% endif %}

+ 5 - 0
roles/external/dereulenspiegel.fastd/templates/secret.conf.j2

@@ -0,0 +1,5 @@
+#
+# This file is managed by ansible. Do not edit by hand!
+#
+
+secret "{{item.secret}}";

+ 2 - 0
roles/external/dereulenspiegel.fastd/test/ansible.cfg

@@ -0,0 +1,2 @@
+[defaults]
+roles_path=../:../../:/spec/

+ 9 - 0
roles/external/dereulenspiegel.fastd/test/application/fastd.yml

@@ -0,0 +1,9 @@
+---
+- name         : Install and configure fastd
+  hosts        : all
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  vars_files   :
+                 - "fastd_pkg_vars.yml"
+  roles        :
+                 - "ansible-fastd"

+ 42 - 0
roles/external/dereulenspiegel.fastd/test/application/fastd_pkg_vars.yml

@@ -0,0 +1,42 @@
+fastd_instances:
+  - name: test1
+    bind: any:10000 interface "eth0" default ipv4
+    interface: tap00
+    loglevel: info
+    mode: tap
+    method: salsa2012+umac
+    peer_limit: 125
+    mtu: 1280
+    status_socket: /tmp/fastd00.sock
+    peer_dir: /etc/fastd/test1/dummy
+    on_up_script: |
+      ip link set up $INTERFACE
+      batctl if add $INTERFACE
+    on_verify_script: |
+      /etc/fastd/fastd-blacklist.sh $PEER_KEY
+  - name: test2
+    bind: any:10001 interface "eth0" default ipv4
+    interface: tap01
+    loglevel: info
+    mode: tap
+    method: salsa2012+umac
+    peer_limit: 125
+    mtu: 1280
+    status_socket: /tmp/fastd01.sock
+    on_up_script: |
+      ip link set up $INTERFACE
+      batctl if add $INTERFACE
+    on_verify_script: |
+      /etc/fastd/fastd-blacklist.sh $PEER_KEY
+    peer_dir: "/etc/fastd/test2/peers"
+    peers:
+    - name: test-peer
+      key: "not a valid key"
+      remotes:
+      - 192.0.2.1:10000
+
+fastd_instances_secret:
+  - name: test1
+    secret: 280088c4263359417e9f2daf1771db820ab79eb4f79e3718719b2a976e8a8b5e
+  - name: test2
+    secret: 280088c4263359417e9f2daf1771db820ab79eb4f79e3718719b2a976e8a8b5e

+ 9 - 0
roles/external/dereulenspiegel.fastd/test/application/travis-fastd.yml

@@ -0,0 +1,9 @@
+---
+- name         : Install and configure fastd
+  hosts        : localhost
+  gather_facts : yes
+  connection   : "{{ kitchen_connection | default('local') }}"
+  vars_files   :
+                 - "fastd_pkg_vars.yml"
+  roles        :
+                 - "ansible-fastd"

+ 55 - 0
roles/external/dereulenspiegel.fastd/test/integration/fastd/serverspec/fastd_spec.rb

@@ -0,0 +1,55 @@
+require 'serverspec'
+
+# Required by serverspec
+set :backend, :exec
+
+describe file('/etc/fastd') do
+  it { should be_directory }
+end
+
+describe file('/etc/fastd/test1') do
+  it { should be_directory }
+end
+
+describe file('/etc/fastd/test2') do
+  it { should be_directory }
+end
+
+describe file('/etc/fastd/test2/peers') do
+  it { should be_directory}
+end
+
+describe file('/etc/fastd/test2/peers/test-peer') do
+  it { should be_file }
+  it { should be_readable }
+end
+
+describe package('fastd') do
+  it { should be_installed }
+end
+
+if ENV['CI'] != 'true'
+  # Travis doesn't provide the tap module, so our service won't start
+  # Ansible seems to have problems to enable a service. Needs investigation
+  describe service('fastd') do
+    it { should be_running }
+  #  it { should be_enabled }
+  end
+
+  describe process('fastd') do
+    it { should be_running }
+  end
+
+  describe port(10000) do
+    it { should be_listening.with('udp6') }
+  end
+
+  describe port(10001) do
+    it { should be_listening.with('udp6') }
+  end
+end
+
+describe user('fastd') do
+  it { should exist }
+  it { should have_login_shell '/bin/false' }
+end

+ 1 - 0
roles/external/dereulenspiegel.fastd/test/local.ini

@@ -0,0 +1 @@
+localhost ansible_connection='local'

+ 17 - 0
roles/external/dereulenspiegel.fastd/test/run_vagrant_kitchen.sh

@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+set -e
+echo "**** Box setup ***"
+
+echo "* mkdir /kitchen"
+mkdir -p /kitchen
+
+#echo "* cp -ar /mnt/shared /kitchen"
+#cp -r /mnt/shared/. /kitchen
+echo "* ln -sf /mnt/shared /kitchen"
+ln -sf /mnt/shared/* /kitchen/
+
+echo "* cd /kitchen"
+cd /kitchen/*
+
+echo "* python test/travis_run.py"
+python test/travis_run.py

+ 98 - 0
roles/external/dereulenspiegel.fastd/test/travis_run.py

@@ -0,0 +1,98 @@
+#!/usr/bin/env python
+# https://github.com/ahelal/travis-in-box
+
+import yaml
+import subprocess
+import sys
+import os.path
+
+
+class TravisExec(object):
+    def __init__(self, filename="travis.yml"):
+        self.fail = False
+        stream = open(filename, 'r')
+        yaml_file = yaml.load(stream)
+        # language
+        self.language = yaml_file.get("language", None)
+
+        # Section
+        self.section_before_install = yaml_file.get("before_install", None)
+        self.section_install = yaml_file.get("install", None)
+        self.section_before_script = yaml_file.get("before_script", None)
+        self.section_script = yaml_file.get("script", None)
+
+        #self.section_after_script = yaml_file.get("after_script", None)
+        self.section_after_failure = yaml_file.get("after_failure", None)
+        self.section_after_success = yaml_file.get("after_success", None)
+
+    def _setup(self):
+        if self.language == "python":
+            print "********** Setup Python  **********"
+            print ""
+            # Since we are not using container we have to install various lang our self
+            # So this is probably not the best way to do it
+            self._execute_command(["sudo apt-get install python-setuptools python-pip -y"])
+        else:
+            print "Errors unsupported language {}".format(self.language)
+            exit(1)
+
+    def life_cycle(self):
+        # See http://docs.travis-ci.com/user/build-configuration/
+
+            # 1. setup language
+            self._setup()
+            # 4. Run before_install commands
+            self.run_command("before_install", self.section_before_install, self.section_after_failure)
+            # 5. Run install commands
+            self.run_command("install", self.section_install, self.section_after_failure)
+            # 6. Run before_script commands
+            self.run_command("before_script", self.section_before_script, self.section_after_failure)
+            # 7. Run test script commands
+            self.run_command("script", self.section_script, self.section_after_failure)
+            # 8 . if we reach this point we made it run after_success
+            self.run_command("after_success", self.section_after_success, None)
+
+    @staticmethod
+    def _execute_command(command):
+        new_command = ["echo '> " + item.rstrip('\n') + "' && { " + item.rstrip('\n') + " ; }" for item in command]
+        new_command = " && ".join(new_command)
+
+        p = subprocess.Popen(new_command, shell=True, stderr=subprocess.PIPE)
+        while True:
+            out = p.stderr.read(1)
+            if out == '' and p.poll() is not None:
+                break
+            if out != '':
+                sys.stdout.write(out)
+                sys.stdout.flush()
+        print ""
+        return p.returncode
+
+    def run_command(self, section_name=None, command=None, execute_on_failure=None):
+        if command:
+            print ""
+            print "********** Running '{}' **********".format(section_name)
+            return_code = self._execute_command(command)
+            if return_code != 0:
+                print ""
+                print "********** Failed in '{}' **********".format(section_name)
+                if execute_on_failure:
+                    print ""
+                    print "********** Running after_failure  **********".format(section_name)
+                    self._execute_command(execute_on_failure)
+                    exit(1)
+
+filename = None
+if len(sys.argv) == 1:
+    filename = ".travis.yml"
+elif len(sys.argv) == 2:
+    filename = sys.argv[1]
+else:
+    print "Invalid number of arguments"
+    exit(1)
+
+if os.path.exists(filename):
+    TravisExec(filename).life_cycle()
+else:
+    print "Could not file travis file '{}'".format(filename)
+    exit(1)

+ 2 - 0
roles/external/dereulenspiegel.fastd/vars/main.yml

@@ -0,0 +1,2 @@
+---
+# vars file for fastd

+ 2 - 0
roles/external/jdauphant.nginx/.gitignore

@@ -0,0 +1,2 @@
+### Vagrant ###
+.vagrant/

+ 32 - 0
roles/external/jdauphant.nginx/.travis.yml

@@ -0,0 +1,32 @@
+---
+language: python
+python: "2.7"
+before_install:
+ - sudo apt-get update -qq
+ - sudo apt-get install -qq python-apt python-pycurl
+install:
+  - pip install ansible
+  - ansible --version
+script:
+  - echo localhost > inventory
+  - ansible-playbook -i inventory --syntax-check --list-tasks test.yml -e "role_name=ansible-role-nginx" -e "hosts_group=hosts_group"
+  - ansible-playbook -i inventory --connection=local --sudo -vvvv test.yml -u root -e "role_name=ansible-role-nginx" -e "hosts_group=localhost"
+  - >
+      ansible-playbook -i inventory --connection=local --sudo -vvvv test.yml -u root -e "role_name=ansible-role-nginx" -e "hosts_group=localhost"
+      | grep -q 'changed=0.*failed=0'
+      && (echo 'Idempotence test: pass' && exit 0)
+      || (echo 'Idempotence test: fail' && exit 1)
+  - cat /etc/nginx/nginx.conf
+  - cat /etc/nginx/sites-enabled/default.conf
+  - cat /etc/nginx/sites-enabled/foo.conf
+  - cat /etc/nginx/sites-enabled/bar.conf
+  - cat /etc/nginx/conf.d/proxy.conf
+  - cat /etc/nginx/conf.d/upstream.conf
+  - cat /etc/nginx/conf.d/geo.conf
+  - cat /etc/nginx/conf.d/gzip.conf
+  - sudo cat /etc/nginx/auth_basic/demo
+  - sudo nginx -t
+after_script:
+  - ls /etc/nginx/auth_basic/
+  - ls /etc/nginx/conf.d/
+  - ls /etc/nginx/sites-enabled/

+ 241 - 0
roles/external/jdauphant.nginx/README.md

@@ -0,0 +1,241 @@
+nginx
+=====
+
+This role installs and configures the nginx web server. The user can specify
+any http configuration parameters they wish to apply their site. Any number of
+sites can be added with configurations of your choice.
+
+Requirements
+------------
+
+This role requires Ansible 1.4 or higher and platform requirements are listed
+in the metadata file.  
+For FreeBSD a working pkgng setup is required (see: https://www.freebsd.org/doc/handbook/pkgng-intro.html )
+
+Role Variables
+--------------
+
+The variables that can be passed to this role and a brief description about
+them are as follows.
+
+```yaml
+# The user to run nginx
+nginx_user: "www-data"
+
+# A list of directives for the events section.
+nginx_events_params:
+ - worker_connections 512
+ - debug_connection 127.0.0.1
+ - use epoll
+ - multi_accept on
+
+# A list of hashs that define the servers for nginx,
+# as with http parameters. Any valid server parameters
+# can be defined here.
+nginx_sites:
+ default:
+     - listen 80
+     - server_name _
+     - root "/usr/share/nginx/html"
+     - index index.html
+ foo:
+     - listen 8080
+     - server_name localhost
+     - root "/tmp/site1"
+     - location / { try_files $uri $uri/ /index.html; }
+     - location /images/ { try_files $uri $uri/ /index.html; }
+ bar:
+     - listen 9090
+     - server_name ansible
+     - root "/tmp/site2"
+     - location / { try_files $uri $uri/ /index.html; }
+     - location /images/ {
+         try_files $uri $uri/ /index.html;
+         allow 127.0.0.1;
+         deny all;
+       }
+
+# A list of hashs that define additional configuration
+nginx_configs:
+  proxy:
+      - proxy_set_header X-Real-IP  $remote_addr
+      - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
+  upstream:
+      - upstream foo { server 127.0.0.1:8080 weight=10; }
+  geo:
+      - geo $local {
+          default 0;
+          127.0.0.1 1;
+        }
+  gzip:
+      - gzip on
+      - gzip_disable msie6
+
+# A list of hashs that define user/password files
+nginx_auth_basic_files:
+   demo:
+     - foo:$apr1$mEJqnFmy$zioG2q1iDWvRxbHuNepIh0 # foo:demo , generated by : htpasswd -nb foo demo
+     - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , generated by : htpasswd -nb bar demo
+
+```
+
+Examples
+========
+
+1) Install nginx with HTTP directives of choices, but with no sites
+configured and no additionnal configuration:
+
+```yaml
+- hosts: all
+  roles:
+  - {role: nginx,
+     nginx_http_params: ["sendfile on", "access_log /var/log/nginx/access.log"]
+                          }
+```
+
+2) Install nginx with different HTTP directives than previous example, but no
+sites configured and no additionnal configuration.
+
+```yaml
+- hosts: all
+  roles:
+  - {role: nginx,
+     nginx_http_params: ["tcp_nodelay on", "error_log /var/log/nginx/error.log"]}
+```
+
+Note: Please make sure the HTTP directives passed are valid, as this role
+won't check for the validity of the directives. See the nginx documentation
+for details.
+
+3) Install nginx and add a site to the configuration.
+
+```yaml
+- hosts: all
+
+  roles:
+  - role: nginx
+    nginx_http_params:
+      - sendfile "on"
+      - access_log "/var/log/nginx/access.log"
+    nginx_sites:
+      bar:
+        - listen 8080
+        - location / { try_files $uri $uri/ /index.html; }
+        - location /images/ { try_files $uri $uri/ /index.html; }
+    nginx_configs:
+      proxy:
+        - proxy_set_header X-Real-IP  $remote_addr
+        - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
+```
+
+Note: Each site added is represented by list of hashes, and the configurations
+generated are populated in /etc/nginx/site-available/, a link is from /etc/nginx/site-enable/ to /etc/nginx/site-available
+
+The file name for the specific site configurtaion is specified in the hash
+with the key "file_name", any valid server directives can be added to hash.
+Additional configuration are created in /etc/nginx/conf.d/
+
+4) Install Nginx , add 2 sites (different method) and add additional configuration
+
+```yaml
+---
+- hosts: all
+  roles:
+    - role: nginx
+      nginx_http_params:
+        - sendfile on
+        - access_log /var/log/nginx/access.log
+      nginx_sites:
+         foo:
+           - listen 8080
+           - server_name localhost
+           - root /tmp/site1
+           - location / { try_files $uri $uri/ /index.html; }
+           - location /images/ { try_files $uri $uri/ /index.html; }
+         bar:
+           - listen 9090
+           - server_name ansible
+           - root /tmp/site2
+           - location / { try_files $uri $uri/ /index.html; }
+           - location /images/ { try_files $uri $uri/ /index.html; }
+      nginx_configs:
+         proxy:
+            - proxy_set_header X-Real-IP  $remote_addr
+            - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
+```
+
+5) Install Nginx , add 2 sites, add additional configuration and an upstream configuration block
+
+```yaml
+---
+- hosts: all
+  roles:
+    - role: nginx
+      nginx_http_params:
+        - sendfile on
+        - access_log /var/log/nginx/access.log
+      nginx_sites:
+        foo:
+           - listen 8080
+           - server_name localhost
+           - root /tmp/site1
+           - location / { try_files $uri $uri/ /index.html; }
+           - location /images/ { try_files $uri $uri/ /index.html; }
+        bar:
+           - listen 9090
+           - server_name ansible
+           - root /tmp/site2
+           - if ( $host = example.com ) { rewrite ^(.*)$ http://www.example.com$1 permanent; }
+           - location / { try_files $uri $uri/ /index.html; }
+           - location /images/ { try_files $uri $uri/ /index.html; }
+           - auth_basic            "Restricted"
+           - auth_basic_user_file  auth_basic/demo
+      nginx_configs:
+        proxy:
+            - proxy_set_header X-Real-IP  $remote_addr
+            - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
+        upstream:
+            # Results in:
+            # upstream foo_backend {
+            #   server 127.0.0.1:8080 weight=10;
+            # }
+            - upstream foo_backend { server 127.0.0.1:8080 weight=10; }
+      nginx_auth_basic_files:
+        demo:
+           - foo:$apr1$mEJqnFmy$zioG2q1iDWvRxbHuNepIh0 # foo:demo , generated by : htpasswd -nb foo demo
+           - bar:$apr1$H2GihkSo$PwBeV8cVWFFQlnAJtvVCQ. # bar:demo , generated by : htpasswd -nb bar demo
+```
+
+6) Example to use this role with my ssl-certs role to generate or copie ssl certificate ( https://galaxy.ansible.com/list#/roles/3115 )
+```yaml
+ - hosts: all
+   roles: 
+     - jdauphant.ssl-certs
+     - role: jdauphant.nginx
+       nginx_configs: 
+          ssl:
+               - ssl_certificate_key {{ssl_certs_privkey_path}}
+               - ssl_certificate     {{ssl_certs_cert_path}}
+       nginx_sites:
+          default:
+               - listen 443 ssl
+               - server_name _
+               - root "/usr/share/nginx/html"
+               - index index.html
+```
+
+Dependencies
+------------
+
+None
+
+License
+-------
+BSD
+
+Author Information
+------------------
+
+- Original : Benno Joy
+- Modified by : DAUPHANT Julien
+

+ 19 - 0
roles/external/jdauphant.nginx/Vagrantfile

@@ -0,0 +1,19 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
+VAGRANTFILE_API_VERSION = "2"
+
+Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+  # All Vagrant configuration is done here. The most common configuration
+  # options are documented and commented below. For a complete reference,
+  # please see the online documentation at vagrantup.com.
+
+  # Every Vagrant virtual environment requires a box to build off of.
+  config.vm.box = "ubuntu/trusty64"
+
+  config.vm.provision :ansible do |ansible|
+       ansible.playbook = "test.yml"
+       ansible.sudo = true
+  end
+end

+ 2 - 0
roles/external/jdauphant.nginx/ansible.cfg

@@ -0,0 +1,2 @@
+[defaults]
+roles_path = ../

+ 63 - 0
roles/external/jdauphant.nginx/defaults/main.yml

@@ -0,0 +1,63 @@
+---
+nginx_redhat_pkg:
+  - nginx
+
+nginx_ubuntu_pkg:
+  - python-selinux
+  - nginx
+
+nginx_freebsd_pkg:
+  - nginx
+
+nginx_suse_pkg:
+  - nginx
+
+yum_epel_repo: epel
+yum_base_repo: base
+
+nginx_official_repo: False
+
+keep_only_specified: False
+
+nginx_installation_type: "packages"
+nginx_binary_name: "nginx"
+nginx_service_name: "{{nginx_binary_name}}"
+nginx_conf_dir: "{% if ansible_os_family == 'FreeBSD' %}/usr/local/etc/nginx{% else %}/etc/nginx{% endif %}"
+
+nginx_user: "{% if ansible_os_family == 'RedHat' or ansible_os_family == 'Suse' %}nginx{% elif ansible_os_family == 'Debian' %}www-data{% elif ansible_os_family == 'FreeBSD' %}www{% endif %}"
+nginx_group: "{{nginx_user}}"
+
+nginx_pid_file: '/var/run/{{nginx_service_name}}.pid'
+
+nginx_worker_processes: "{{ ansible_processor_vcpus }}"
+nginx_worker_rlimit_nofile: 1024
+nginx_log_dir: "/var/log/nginx"
+
+nginx_events_params:
+  - worker_connections {% if nginx_max_clients is defined %}{{nginx_max_clients}}{% else %}512{% endif %}
+
+nginx_http_params:
+  - sendfile "on"
+  - tcp_nopush "on"
+  - tcp_nodelay "on"
+  - keepalive_timeout "65"
+  - access_log "{{nginx_log_dir}}/access.log"
+  - error_log "{{nginx_log_dir}}/error.log"
+  - server_tokens off
+  - types_hash_max_size 2048
+
+nginx_sites:
+  default:
+     - listen 80 default_server
+     - server_name _
+     - root "{% if ansible_os_family == 'FreeBSD' %}/usr/local/www/nginx-dist{% else %}/usr/share/nginx/html{% endif %}"
+     - index index.html
+nginx_remove_sites: []
+
+nginx_configs: {}
+nginx_remove_configs: []
+
+nginx_auth_basic_files: {}
+nginx_remove_auth_basic_files: []
+
+nginx_daemon_mode: "on"

+ 0 - 0
roles/external/jdauphant.nginx/example-vars.yml


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません