diff options
author | Philipp Storz <philipp.storz@bareos.com> | 2018-05-07 11:41:01 +0300 |
---|---|---|
committer | Philipp Storz <philipp.storz@bareos.com> | 2018-05-07 16:47:15 +0300 |
commit | ba80263255a45538320119a26af24926a6c5c5a3 (patch) | |
tree | 065b5fb01862bd6a78b65e0b408fe1540e076872 | |
parent | aea74c1c696abe60773d5390efd905a702f59229 (diff) |
This repository has been merged into https://github.com/bareos/bareos
The Bareos project consists of several sub projects. While these subprojects
have been kept in different git repositories until bareos <= 17.2, we decided
to merge them all into https://github.com/bareos/bareos
Subprojects:
* https://github.com/bareos/bareos (core, daemons) repository hasn't changed,
but its content has been moved to the core subdirectory
https://github.com/bareos/bareos/tree/master/core/
* https://github.com/bareos/bareos-doc (master) =>
https://github.com/bareos/bareos/tree/master/doc/
* https://github.com/bareos/bareos-regress (master) => https://github.com/bareos/bareos/tree/master/regress/
* https://github.com/bareos/bareos-vmware (master) => https://github.com/bareos/bareos/tree/master/vmware/
* https://github.com/bareos/bareos-webui (master) => https://github.com/bareos/bareos/tree/master/webui/
* https://github.com/bareos/python-bareos (master) => https://github.com/bareos/bareos/tree/master/python-bareos/
We only merged the master branches, so all those plus all future branches from
bareos-18.2 onwards can be found there. The old branches (bareos <= 17.2) will
be kept and maintained in the old repositories.
35 files changed, 23 insertions, 2167 deletions
diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 8f5bb1e..0000000 --- a/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -*.py[cod] - -# C extensions -*.so - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -var -sdist -develop-eggs -.installed.cfg -lib -lib64 -__pycache__ - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox -nosetests.xml - -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -*~ diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index dba13ed..0000000 --- a/LICENSE.txt +++ /dev/null @@ -1,661 +0,0 @@ - GNU AFFERO GENERAL PUBLIC LICENSE - Version 3, 19 November 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 Affero General Public License is a free, copyleft license for -software and other kinds of works, specifically designed to ensure -cooperation with the community in the case of network server software. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -our General Public Licenses are 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. - - 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. - - Developers that use our General Public Licenses protect your rights -with two steps: (1) assert copyright on the software, and (2) offer -you this License which gives you legal permission to copy, distribute -and/or modify the software. - - A secondary benefit of defending all users' freedom is that -improvements made in alternate versions of the program, if they -receive widespread use, become available for other developers to -incorporate. Many developers of free software are heartened and -encouraged by the resulting cooperation. However, in the case of -software used on network servers, this result may fail to come about. -The GNU General Public License permits making a modified version and -letting the public access it on a server without ever releasing its -source code to the public. - - The GNU Affero General Public License is designed specifically to -ensure that, in such cases, the modified source code becomes available -to the community. It requires the operator of a network server to -provide the source code of the modified version running there to the -users of that server. Therefore, public use of a modified version, on -a publicly accessible server, gives the public access to the source -code of the modified version. - - An older license, called the Affero General Public License and -published by Affero, was designed to accomplish similar goals. This is -a different license, not a version of the Affero GPL, but Affero has -released a new version of the Affero GPL which permits relicensing under -this license. - - 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. - - Notwithstanding any other provision of this License, if you modify the -Program, your modified version must prominently offer all users -interacting with it remotely through a computer network (if your version -supports such interaction) an opportunity to receive the Corresponding -Source of your version by providing access to the Corresponding Source -from a network server at no charge, through some standard or customary -means of facilitating copying of software. This Corresponding Source -shall include the Corresponding Source for any work covered by version 3 -of the GNU General Public License that is incorporated pursuant to the -following paragraph. - - 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 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 work with which it is combined will remain governed by version -3 of the GNU General Public License. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU Affero 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 Affero 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 Affero 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 Affero 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 Affero 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 Affero General Public License for more details. - - You should have received a copy of the GNU Affero 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 your software can interact with users remotely through a computer -network, you should also make sure that it provides a way for users to -get its source. For example, if your program is a web application, its -interface could display a "Source" link that leads users to an archive -of the code. There are many ways you could offer source, and different -solutions will be better for different programs; see section 13 for the -specific requirements. - - 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 AGPL, see -<http://www.gnu.org/licenses/>. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ba88b6a --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +This repository has been merged into https://github.com/bareos/bareos + +The Bareos project consists of several sub projects. While these subprojects +have been kept in different git repositories until bareos <= 17.2, we decided +to merge them all into https://github.com/bareos/bareos + +Subprojects: + * https://github.com/bareos/bareos (core, daemons) repository hasn't changed, + but its content has been moved to the core subdirectory + https://github.com/bareos/bareos/tree/master/core/ + * https://github.com/bareos/bareos-doc (master) => + https://github.com/bareos/bareos/tree/master/doc/ + * https://github.com/bareos/bareos-regress (master) => https://github.com/bareos/bareos/tree/master/regress/ + * https://github.com/bareos/bareos-vmware (master) => https://github.com/bareos/bareos/tree/master/vmware/ + * https://github.com/bareos/bareos-webui (master) => https://github.com/bareos/bareos/tree/master/webui/ + * https://github.com/bareos/python-bareos (master) => https://github.com/bareos/bareos/tree/master/python-bareos/ + +We only merged the master branches, so all those plus all future branches from +bareos-18.2 onwards can be found there. The old branches (bareos <= 17.2) will +be kept and maintained in the old repositories. + + + diff --git a/README.rst b/README.rst deleted file mode 100644 index afb46ae..0000000 --- a/README.rst +++ /dev/null @@ -1,44 +0,0 @@ -python-bareos -============= - -Python module to access a http://www.bareos.org backup system. - -`python-bareos` packages are included in the Bareos core distribution since bareos >= 17.2. - - -calling bareos-director user agent commands ------------------------------------------------ - -.. code:: python - - import bareos.bsock - - password=bareos.bsock.Password("secret") - directorconsole=bareos.bsock.DirectorConsole(address="localhost", port=9101, password=password) - print directorconsole.call("help") - ... - - -simple version of the bconsole in Python --------------------------------------------- - -.. code:: python - - import bareos.bsock - password=bareos.bsock.Password("secret") - directorconsole=bareos.bsock.DirectorConsole(address="localhost", port=9101, password=password) - directorconsole.interactive() - ... - -use JSON objects of API mode 2 ----------------------------------- - -Requires: bareos >= 15.2 - -.. code:: python - - import bareos.bsock - password=bareos.bsock.Password("secret") - directorconsole=bareos.bsock.DirectorConsoleJson(address="localhost", port=9101, password=password) - directorconsole.call("list pools") - ... diff --git a/TODO.txt b/TODO.txt deleted file mode 100644 index f7bc3b3..0000000 --- a/TODO.txt +++ /dev/null @@ -1,6 +0,0 @@ -TODO: - - * pyunit - -To test the Bareos Python module without installing, set PYTHONPATH accordingly, eg. -export PYTHONPATH=. diff --git a/bareos/__init__.py b/bareos/__init__.py deleted file mode 100644 index 6e6f32f..0000000 --- a/bareos/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#__all__ = [ "bconsole" ] -from bareos.exceptions import * -from bareos.util.password import Password -import bareos.util -import bareos.bsock diff --git a/bareos/bsock/__init__.py b/bareos/bsock/__init__.py deleted file mode 100644 index 8984d21..0000000 --- a/bareos/bsock/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -#__all__ = [ "bconsole" ] -from bareos.exceptions import * -from bareos.util.password import Password -from bareos.bsock.connectiontype import ConnectionType -from bareos.bsock.directorconsole import DirectorConsole -from bareos.bsock.directorconsolejson import DirectorConsoleJson -from bareos.bsock.filedaemon import FileDaemon -# compat -from bareos.bsock.bsock import BSock -from bareos.bsock.bsockjson import BSockJson diff --git a/bareos/bsock/bsock.py b/bareos/bsock/bsock.py deleted file mode 100644 index 51dd59d..0000000 --- a/bareos/bsock/bsock.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -Communicates with the bareos-director - -Legacy, use DirectorConsole instead. -""" - -from bareos.bsock.directorconsole import DirectorConsole - -class BSock(DirectorConsole): - - def __init__(self, *args, **kwargs): - super(BSock, self).__init__(*args, **kwargs) diff --git a/bareos/bsock/bsockjson.py b/bareos/bsock/bsockjson.py deleted file mode 100755 index 17b2934..0000000 --- a/bareos/bsock/bsockjson.py +++ /dev/null @@ -1,12 +0,0 @@ -""" -Communicates with the bareos-director using JSON results - -Legacy, use DirectorConsoleJson instead. -""" - -from bareos.bsock.directorconsolejson import DirectorConsoleJson - -class BSockJson(DirectorConsoleJson): - - def __init__(self, *args, **kwargs): - super(BSockJson, self).__init__(*args, **kwargs) diff --git a/bareos/bsock/connectiontype.py b/bareos/bsock/connectiontype.py deleted file mode 100644 index 027e12e..0000000 --- a/bareos/bsock/connectiontype.py +++ /dev/null @@ -1,6 +0,0 @@ -class ConnectionType: - """ - """ - DIRECTOR = 1001 - STORAGE = 1002 - FILEDAEMON = 1003 diff --git a/bareos/bsock/constants.py b/bareos/bsock/constants.py deleted file mode 100644 index b4c0ba4..0000000 --- a/bareos/bsock/constants.py +++ /dev/null @@ -1,77 +0,0 @@ -""" -Constants used by Bareos. -""" - -class Constants: - """ - translated enum from https://github.com/bareos/bareos/blob/master/src/lib/bsock.h - """ - BNET_EOD = -1 #, /* End of data stream, new data may follow */ - BNET_EOD_POLL = -2 #, /* End of data and poll all in one */ - BNET_STATUS = -3 #, /* Send full status */ - BNET_TERMINATE = -4 #, /* Conversation terminated, doing close() */ - BNET_POLL = -5 #, /* Poll request, I'm hanging on a read */ - BNET_HEARTBEAT = -6 #, /* Heartbeat Response requested */ - BNET_HB_RESPONSE = -7 #, /* Only response permited to HB */ - BNET_xxxxxxPROMPT = -8 #, /* No longer used -- Prompt for subcommand */ - BNET_BTIME = -9 #, /* Send UTC btime */ - BNET_BREAK = -10 #, /* Stop current command -- ctl-c */ - BNET_START_SELECT = -11 #, /* Start of a selection list */ - BNET_END_SELECT = -12 #, /* End of a select list */ - BNET_INVALID_CMD = -13 #, /* Invalid command sent */ - BNET_CMD_FAILED = -14 #, /* Command failed */ - BNET_CMD_OK = -15 #, /* Command succeeded */ - BNET_CMD_BEGIN = -16 #, /* Start command execution */ - BNET_MSGS_PENDING = -17 #, /* Messages pending */ - BNET_MAIN_PROMPT = -18 #, /* Server ready and waiting */ - BNET_SELECT_INPUT = -19 #, /* Return selection input */ - BNET_WARNING_MSG = -20 #, /* Warning message */ - BNET_ERROR_MSG = -21 #, /* Error message -- command failed */ - BNET_INFO_MSG = -22 #, /* Info message -- status line */ - BNET_RUN_CMD = -23 #, /* Run command follows */ - BNET_YESNO = -24 #, /* Request yes no response */ - BNET_START_RTREE = -25 #, /* Start restore tree mode */ - BNET_END_RTREE = -26 #, /* End restore tree mode */ - BNET_SUB_PROMPT = -27 #, /* Indicate we are at a subprompt */ - BNET_TEXT_INPUT = -28 # /* Get text input from user */ - - description = { - BNET_EOD: "End of data stream, new data may follow", - BNET_EOD_POLL: "End of data and poll all in one", - BNET_STATUS: "Send full status", - BNET_TERMINATE: "Conversation terminated", - BNET_POLL: "Poll request, I'm hanging on a read", - BNET_HEARTBEAT: "Heartbeat Response requested", - BNET_HB_RESPONSE: "Only response permited to HB", - BNET_xxxxxxPROMPT: "No longer used -- Prompt for subcommand", - BNET_BTIME: "Send UTC btime", - BNET_BREAK: "Stop current command -- ctl-c", - BNET_START_SELECT: "Start of a selection list", - BNET_END_SELECT: "End of a select list", - BNET_INVALID_CMD: "Invalid command sent", - BNET_CMD_FAILED: "Command failed", - BNET_CMD_OK: "Command succeeded", - BNET_CMD_BEGIN: "Start command execution", - BNET_MSGS_PENDING: "Messages pending", - BNET_MAIN_PROMPT: "Server ready and waiting", - BNET_SELECT_INPUT: "Return selection input", - BNET_WARNING_MSG: "Warning message", - BNET_ERROR_MSG: "Error message -- command failed", - BNET_INFO_MSG: "Info message -- status line", - BNET_RUN_CMD: "Run command follows", - BNET_YESNO: "Request yes no response", - BNET_START_RTREE: "Start restore tree mode", - BNET_END_RTREE: "End restore tree mode", - BNET_SUB_PROMPT: "Indicate we are at a subprompt", - BNET_TEXT_INPUT: "Get text input from user" - } - - @staticmethod - def get_description( code ): - try: - description = Constants.description[code] - except KeyError: - #self.logger.error( "unknown bsock code " + code ) - return - else: - return description diff --git a/bareos/bsock/directorconsole.py b/bareos/bsock/directorconsole.py deleted file mode 100644 index 81e4f6c..0000000 --- a/bareos/bsock/directorconsole.py +++ /dev/null @@ -1,29 +0,0 @@ -""" -Communicates with the bareos-dir console -""" - -from bareos.bsock.connectiontype import ConnectionType -from bareos.bsock.lowlevel import LowLevel - -class DirectorConsole(LowLevel): - '''use to send and receive the response to Bareos File Daemon''' - - def __init__(self, - address="localhost", - port=9101, - dirname=None, - name="*UserAgent*", - password=None): - super(DirectorConsole, self).__init__() - self.connect(address, port, dirname, ConnectionType.DIRECTOR) - self.auth(name=name, password=password, auth_success_regex=b'^1000 OK.*$') - self._init_connection() - - - def _init_connection(self): - self.call("autodisplay off") - - - def get_to_prompt(self): - self.send(b".") - return super(DirectorConsole, self).get_to_prompt() diff --git a/bareos/bsock/directorconsolejson.py b/bareos/bsock/directorconsolejson.py deleted file mode 100755 index 2dfa952..0000000 --- a/bareos/bsock/directorconsolejson.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -Reimplementation of the bconsole program in python. -""" - -from bareos.bsock.directorconsole import DirectorConsole -from pprint import pformat, pprint -import json - -class DirectorConsoleJson(DirectorConsole): - """ - use to send and receive the response from director - """ - - def __init__(self, *args, **kwargs): - super(DirectorConsoleJson, self).__init__(*args, **kwargs) - - def _init_connection(self): - # older version did not support compact mode, - # therfore first set api mode to json (which should always work in bareos >= 15.2.0) - # and then set api mode json compact (which should work with bareos >= 15.2.2) - self.logger.debug(self.call(".api json")) - self.logger.debug(self.call(".api json compact=yes")) - - - def call(self, command): - json = self.call_fullresult(command) - if json == None: - return - if 'result' in json: - result = json['result'] - else: - # TODO: or raise an exception? - result = json - return result - - - def call_fullresult(self, command): - resultstring = super(DirectorConsoleJson, self).call(command) - data = None - if resultstring: - try: - data = json.loads(resultstring.decode('utf-8')) - except ValueError as e: - # in case result is not valid json, - # create a JSON-RPC wrapper - data = { - 'error': { - 'code': 2, - 'message': str(e), - 'data': resultstring - }, - } - return data - - - def _show_result(self, msg): - pprint(msg) diff --git a/bareos/bsock/filedaemon.py b/bareos/bsock/filedaemon.py deleted file mode 100644 index 93a06e1..0000000 --- a/bareos/bsock/filedaemon.py +++ /dev/null @@ -1,36 +0,0 @@ -""" -Communicates with the bareos-fd -""" - -from bareos.bsock.connectiontype import ConnectionType -from bareos.bsock.lowlevel import LowLevel -import shlex - - -class FileDaemon(LowLevel): - '''use to send and receive the response to Bareos File Daemon''' - - def __init__(self, - address="localhost", - port=9102, - dirname=None, - name=None, - password=None): - super(FileDaemon, self).__init__() - self.connect(address, port, dirname, ConnectionType.FILEDAEMON) - self.auth(name=name, password=password, auth_success_regex=b'^2000 OK Hello.*$') - self._init_connection() - - def call(self, command): - ''' - Replace spaces by char(1) in quoted arguments - and then call the original function. - ''' - if isinstance(command, list): - cmdlist=command - else: - cmdlist=shlex.split(command) - command0 = [] - for arg in cmdlist: - command0.append(arg.replace(" ", "\x01")) - return super(FileDaemon, self).call(command0) diff --git a/bareos/bsock/lowlevel.py b/bareos/bsock/lowlevel.py deleted file mode 100644 index 5087e5e..0000000 --- a/bareos/bsock/lowlevel.py +++ /dev/null @@ -1,429 +0,0 @@ -""" -Low Level socket methods to communication with the bareos-director. -""" - -# Authentication code is taken from -# https://github.com/hanxiangduo/bacula-console-python - -from bareos.exceptions import * -from bareos.util.bareosbase64 import BareosBase64 -from bareos.util.password import Password -from bareos.bsock.constants import Constants -from bareos.bsock.connectiontype import ConnectionType -from bareos.bsock.protocolmessages import ProtocolMessages -import hmac -import logging -import random -import re -from select import select -import socket -import struct -import sys -import time - -class LowLevel(object): - """ - Low Level socket methods to communicate with the bareos-director. - """ - - def __init__(self): - self.logger = logging.getLogger() - self.logger.debug("init") - self.status = None - self.address = None - self.password = None - self.port = None - self.dirname = None - self.socket = None - self.auth_credentials_valid = False - self.connection_type = None - self.receive_buffer = b'' - - def connect(self, address, port, dirname, type): - self.address = address - self.port = port - if dirname: - self.dirname = dirname - else: - self.dirname = address - self.connection_type = type - return self.__connect() - - - def __connect(self): - try: - self.socket = socket.create_connection((self.address, self.port)) - except socket.gaierror as e: - self._handleSocketError(e) - raise ConnectionError( - "failed to connect to host " + str(self.address) + ", port " + str(self.port) + ": " + str(e)) - else: - self.logger.debug("connected to " + str(self.address) + ":" + str(self.port)) - return True - - - def auth(self, name, password, auth_success_regex): - ''' - login to the bareos-director - if the authenticate success return True else False - dir: the director location - name: own name. - ''' - if not isinstance(password, Password): - raise AuthenticationError("password must by of type bareos.Password() not %s" % (type(password))) - self.password = password - self.name = name - self.auth_success_regex = auth_success_regex - return self.__auth() - - - def __auth(self): - bashed_name = ProtocolMessages.hello(self.name, type=self.connection_type) - # send the bash to the director - self.send(bashed_name) - - (ssl, result_compatible, result) = self._cram_md5_respond(password=self.password.md5(), tls_remote_need=0) - if not result: - raise AuthenticationError("failed (in response)") - if not self._cram_md5_challenge(clientname=self.name, password=self.password.md5(), tls_local_need=0, compatible=True): - raise AuthenticationError("failed (in challenge)") - self.recv_msg(self.auth_success_regex) - self.auth_credentials_valid = True - return True - - - def _init_connection(self): - pass - - - def disconnect(self): - ''' disconnect ''' - # TODO - pass - - - def reconnect(self): - result = False - if self.auth_credentials_valid: - try: - if self.__connect() and self.__auth() and self._init_connection(): - result = True - except socket.error: - self.logger.warning("failed to reconnect") - return result - - - def call(self, command): - ''' - call a bareos-director user agent command - ''' - if isinstance(command, list): - command = " ".join(command) - return self.__call(command, 0) - - - def __call(self, command, count): - ''' - Send a command and receive the result. - If connection is lost, try to reconnect. - ''' - result = b'' - try: - self.send(bytearray(command, 'utf-8')) - result = self.recv_msg() - except (SocketEmptyHeader, ConnectionLostError) as e: - self.logger.error("connection problem (%s): %s" % (type(e).__name__, str(e))) - if count == 0: - if self.reconnect(): - return self.__call(command, count+1) - return result - - - def send_command(self, command): - return self.call(command) - - - def send(self, msg=None): - '''use socket to send request to director''' - self.__check_socket_connection() - msg_len = len(msg) # plus the msglen info - - try: - # convert to network flow - self.socket.sendall(struct.pack("!i", msg_len) + msg) - self.logger.debug("%s" %(msg)) - except socket.error as e: - self._handleSocketError(e) - - - def recv(self): - '''will receive data from director ''' - self.__check_socket_connection() - # get the message header - header = self.__get_header() - if header <= 0: - self.logger.debug("header: " + str(header)) - # get the message - length = header - msg = self.recv_submsg(length) - return msg - - - def recv_msg(self, regex = b'^\d\d\d\d OK.*$', timeout = None): - '''will receive data from director ''' - self.__check_socket_connection() - try: - timeouts = 0 - while True: - # get the message header - self.socket.settimeout(0.1) - try: - header = self.__get_header() - except socket.timeout: - # only log every 100 timeouts - if timeouts % 100 == 0: - self.logger.debug("timeout (%i) on receiving header" % (timeouts)) - timeouts+=1 - else: - if header <= 0: - # header is a signal - self.__set_status(header) - if self.is_end_of_message(header): - result = self.receive_buffer - self.receive_buffer = b'' - return result - else: - # header is the length of the next message - length = header - submsg = self.recv_submsg(length) - # check for regex in new submsg - # and last line in old message, - # which might have been incomplete without new submsg. - lastlineindex = self.receive_buffer.rfind(b'\n') + 1 - self.receive_buffer += submsg - match = re.search(regex, self.receive_buffer[lastlineindex:], re.MULTILINE) - # Bareos indicates end of command result by line starting with 4 digits - if match: - self.logger.debug("msg \"{0}\" matches regex \"{1}\"".format(self.receive_buffer.strip(), regex)) - result = self.receive_buffer[0:lastlineindex+match.end()] - self.receive_buffer = self.receive_buffer[lastlineindex+match.end()+1:] - return result - #elif re.search("^\d\d\d\d .*$", msg, re.MULTILINE): - #return msg - except socket.error as e: - self._handleSocketError(e) - - - def recv_submsg(self, length): - # get the message - msg = b'' - while length > 0: - self.logger.debug(" submsg len: " + str(length)) - # TODO - self.socket.settimeout(10) - submsg = self.socket.recv(length) - length -= len(submsg) - #self.logger.debug(submsg) - msg += submsg - if (type(msg) is str): - msg = bytearray(msg.decode('utf-8'), 'utf-8') - if (type(msg) is bytes): - msg = bytearray(msg) - #self.logger.debug(str(msg)) - return msg - - - def interactive(self): - """ - Enter the interactive mode. - Exit via typing "exit" or "quit". - """ - command = "" - while command != "exit" and command != "quit" and self.is_connected(): - command = self._get_input() - resultmsg = self.call(command) - self._show_result(resultmsg) - return True - - - def _get_input(self): - # Python2: raw_input, Python3: input - try: - myinput = raw_input - except NameError: - myinput = input - data = myinput(">>") - return data - - - def _show_result(self, msg): - #print(msg.decode('utf-8')) - sys.stdout.write(msg.decode('utf-8')) - # add a linefeed, if there isn't one already - if len(msg) >= 2: - if msg[-2] != ord(b'\n'): - sys.stdout.write(b'\n') - - - def __get_header(self): - header = b'' - header_length = 4 - while header_length > 0: - self.logger.debug(" remaining header len: {0}".format(header_length)) - self.__check_socket_connection() - # TODO - self.socket.settimeout(10) - submsg = self.socket.recv(header_length) - header_length -= len(submsg) - header += submsg - if len(header) == 0: - self.logger.debug("received empty header, assuming connection is closed") - raise SocketEmptyHeader() - else: - return self.__get_header_data(header) - - - def __get_header_data(self, header): - # struct.unpack: - # !: network (big/little endian conversion) - # i: integer (4 bytes) - data = struct.unpack("!i", header)[0] - return data - - - def is_end_of_message(self, data): - return ((not self.is_connected()) or - data == Constants.BNET_EOD or - data == Constants.BNET_TERMINATE or - data == Constants.BNET_MAIN_PROMPT or - data == Constants.BNET_SUB_PROMPT) - - - def is_connected(self): - return (self.status != Constants.BNET_TERMINATE) - - - def _cram_md5_challenge(self, clientname, password, tls_local_need=0, compatible=True): - ''' - client launch the challenge, - client confirm the dir is the correct director - ''' - - # get the timestamp - # here is the console - # to confirm the director so can do this on bconsole`way - rand = random.randint(1000000000, 9999999999) - #chal = "<%u.%u@%s>" %(rand, int(time.time()), self.dirname) - chal = '<%u.%u@%s>' %(rand, int(time.time()), clientname) - msg = bytearray('auth cram-md5 %s ssl=%d\n' %(chal, tls_local_need), 'utf-8') - # send the confirmation - self.send(msg) - # get the response - msg = self.recv() - if msg[-1] == 0: - del msg[-1] - self.logger.debug("received: " + str(msg)) - - # hash with password - hmac_md5 = hmac.new(bytes(bytearray(password, 'utf-8'))) - hmac_md5.update(bytes(bytearray(chal, 'utf-8'))) - bbase64compatible = BareosBase64().string_to_base64(bytearray(hmac_md5.digest()), True) - bbase64notcompatible = BareosBase64().string_to_base64(bytearray(hmac_md5.digest()), False) - self.logger.debug("string_to_base64, compatible: " + str(bbase64compatible)) - self.logger.debug("string_to_base64, not compatible: " + str(bbase64notcompatible)) - - is_correct = ((msg == bbase64compatible) or (msg == bbase64notcompatible)) - # check against compatible base64 and Bareos specific base64 - if is_correct: - self.send(ProtocolMessages.auth_ok()) - else: - self.logger.error("expected result: %s or %s, but get %s" %(bbase64compatible, bbase64notcompatible, msg)) - self.send(ProtocolMessages.auth_failed()) - - # check the response is equal to base64 - return is_correct - - - def _cram_md5_respond(self, password, tls_remote_need=0, compatible=True): - ''' - client connect to dir, - the dir confirm the password and the config is correct - ''' - # receive from the director - chal = "" - ssl = 0 - result = False - msg = "" - try: - msg = self.recv() - except RuntimeError: - self.logger.error("RuntimeError exception in recv") - return (0, True, False) - - # invalid username - if ProtocolMessages.is_not_authorized(msg): - self.logger.error("failed: " + str(msg)) - return (0, True, False) - - # check the receive message - self.logger.debug("(recv): " + str(msg)) - - msg_list = msg.split(b" ") - chal = msg_list[2] - # get th timestamp and the tle info from director response - ssl = int(msg_list[3][4]) - compatible = True - # hmac chal and the password - hmac_md5 = hmac.new(bytes(bytearray(password, 'utf-8'))) - hmac_md5.update(bytes(chal)) - - # base64 encoding - msg = BareosBase64().string_to_base64(bytearray(hmac_md5.digest())) - - # send the base64 encoding to director - self.send(msg) - received = self.recv() - if ProtocolMessages.is_auth_ok(received): - result = True - else: - self.logger.error("failed: " + str(received)) - return (ssl, compatible, result) - - - def __set_status(self, status): - self.status = status - status_text = Constants.get_description(status) - self.logger.debug(str(status_text) + " (" + str(status) + ")") - - - def has_data(self): - self.__check_socket_connection() - timeout = 0.1 - readable, writable, exceptional = select([self.socket], [], [], timeout) - return readable - - - def get_to_prompt(self): - time.sleep(0.1) - if self.has_data(): - msg = self.recv_msg() - self.logger.debug("received message: " + str(msg)) - # TODO: check prompt - return True - - - def __check_socket_connection(self): - result = True - if self.socket == None: - result = False - if self.auth_credentials_valid: - # connection have worked before, but now it is gone - raise ConnectionLostError("currently no network connection") - else: - raise RuntimeError("should connect to director first before send data") - return result - - - def _handleSocketError(self, exception): - self.logger.error("socket error:" + str(exception)) - self.socket = None diff --git a/bareos/bsock/protocolmessages.py b/bareos/bsock/protocolmessages.py deleted file mode 100644 index 0db3642..0000000 --- a/bareos/bsock/protocolmessages.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Protocol messages between bareos-director and user-agent. -""" - -from bareos.bsock.connectiontype import ConnectionType - -class ProtocolMessages(): - """ - strings defined by the protocol to talk to the Bareos Director. - """ - @staticmethod - def hello(name, type=ConnectionType.DIRECTOR): - if type == ConnectionType.FILEDAEMON: - return bytearray("Hello Director %s calling\n" % (name), 'utf-8') - else: - return bytearray("Hello %s calling\n" % (name), 'utf-8') - - #@staticmethod - #def ok(): - #return "1000 OK:" - - @staticmethod - def auth_ok(): - return b"1000 OK auth\n" - - @staticmethod - def auth_failed(): - return b"1999 Authorization failed.\n" - - @staticmethod - def not_authorized(): - return b"1999 You are not authorized.\n" - - @staticmethod - def is_auth_ok(msg): - return msg == ProtocolMessages.auth_ok() - - @staticmethod - def is_not_authorized(msg): - return msg == ProtocolMessages.not_authorized()
\ No newline at end of file diff --git a/bareos/exceptions.py b/bareos/exceptions.py deleted file mode 100644 index 2602a00..0000000 --- a/bareos/exceptions.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Bareos specific exceptions -""" - -class Error(Exception): - """ - general error exception - """ - pass - -class ConnectionError(Error): - """ - error with the Connection - """ - pass - -class ConnectionLostError(Error): - """ - error with the Connection - """ - pass - -class SocketEmptyHeader(Error): - """ - socket connection received an empty header. Connection lost? - """ - pass - -class AuthenticationError(Error): - """ - error during Authentication - """ - pass diff --git a/bareos/util/__init__.py b/bareos/util/__init__.py deleted file mode 100644 index 15c49ce..0000000 --- a/bareos/util/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -#__all__ = [ "bconsole" ] -from bareos.util.bareosbase64 import BareosBase64 -from bareos.util.password import Password -from bareos.util.path import Path
\ No newline at end of file diff --git a/bareos/util/bareosbase64.py b/bareos/util/bareosbase64.py deleted file mode 100644 index 21bae65..0000000 --- a/bareos/util/bareosbase64.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -Bacula and therefore Bareos specific implementation of a base64 decoder. -This class offers functions to handle this. -""" - -class BareosBase64(object): - ''' - Bacula and therefore Bareos specific implementation of a base64 decoder - ''' - - base64_digits = \ - ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'] - - def __init__(self): - ''' - Initialize the Base 64 conversion routines - ''' - self.base64_map = dict(list(zip(self.base64_digits, list(range(0, 64))))) - - @staticmethod - def twos_comp(val, bits): - """compute the 2's compliment of int value val""" - if (val&(1<<(bits-1))) != 0: - val = val - (1<<bits) - return val - - def base64_to_int(self, base64): - ''' - Convert the Base 64 characters in base64 to a value. - ''' - value = 0 - first = 0 - neg = False - - if base64[0] == '-': - neg = True - first = 1 - - for i in range(first, len(base64)): - value = value << 6 - try: - value += self.base64_map[base64[i]] - except KeyError: - print("KeyError:", i) - - return -value if neg else value - - def int_to_base64(self, value): - """ - Convert an integer to base 64 - """ - result = "" - if value < 0: - result = "-" - value = -value - - while value: - charnumber = value % 0x3F - result += self.base64_digits[charnumber] - value = value >> 6 - return result - - def string_to_base64(self, string, compatible=False): - """ - Convert a string to base64 - """ - buf = "" - reg = 0 - rem = 0 - char = 0 - i = 0 - while i < len(string): - if rem < 6: - reg <<= 8 - char = string[i] - if not compatible: - if char >= 128: - char = self.twos_comp(char, 8) - reg |= char - i += 1 - rem += 8 - - save = reg - reg >>= (rem - 6) - buf += self.base64_digits[reg & 0x3F] - reg = save - rem -= 6 - - if rem: - mask = (1 << rem) - 1 - if compatible: - buf += self.base64_digits[(reg & mask) << (6 - rem)] - else: - buf += self.base64_digits[reg & mask] - return bytearray(buf, 'utf-8') diff --git a/bareos/util/password.py b/bareos/util/password.py deleted file mode 100644 index b20f2a8..0000000 --- a/bareos/util/password.py +++ /dev/null @@ -1,33 +0,0 @@ -""" -Class to handle Bareos passwords. -""" - -import hashlib - -class Password(object): - - def __init__(self, password=None): - self.password_md5 = None - self.set_plaintext(password) - - def set_plaintext(self, password): - self.password_plaintext = bytearray(password, 'utf-8') - self.set_md5(self.__plaintext2md5(password)) - - def set_md5(self, password): - self.password_md5 = password - - def plaintext(self): - return self.password_plaintext - - def md5(self): - return self.password_md5 - - @staticmethod - def __plaintext2md5(password): - ''' - md5 the password and return the hex style - ''' - md5 = hashlib.md5() - md5.update(bytes(bytearray(password, 'utf-8'))) - return md5.hexdigest() diff --git a/bareos/util/path.py b/bareos/util/path.py deleted file mode 100644 index e47e2f5..0000000 --- a/bareos/util/path.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Class to handle file paths. -""" - -from copy import copy - -class Path(object): - - def __init__(self, path=None): - self.__set_defaults() - self.set_path(path) - - def __str__(self): - result = "" - if self.is_root(): - result += "/" - result += "/".join(self.path) - if (not self.is_root()) or self.len() > 0: - if self.is_directory(): - result += "/" - return result - - def __set_defaults(self): - self.path_orig = None - self.root = False - self.directory = False - self.path = None - - def set_path(self, path): - if path == None: - self.__set_defaults() - elif isinstance(path, str): - self.path_orig = path - components = self.path_orig.split('/') - self.path = [i for i in components if i != ''] - if path == "": - self.root = False - self.directory = True - else: - self.root = False - if self.path_orig[0] == '/': - self.root = True - self.directory = False - if components[-1] == '': - self.directory = True - else: - # exception - pass - - - def get(self, index=None): - if index == None: - return self.path - else: - return self.path[index] - - - #def lstrip(self, path=[]): - #""" - #Creates a new Path instance with lstrip components removed from left. - #""" - #result = copy(self) - #result.root = False - #for i in path: - #if result.get(0) == i: - #result.remove(0) - #else: - ## TODO: exception? - #pass - #return result - - def shift(self): - """ - Creates a new Path instance with lstrip components removed from left. - """ - result = self.get(0) - self.remove(0) - return result - - def is_directory(self): - return self.directory - - def is_root(self): - return self.root - - - def remove(self, index): - del(self.path[index]) - - def len(self): - return len(self.path) diff --git a/bin/bareos-fd-connect.py b/bin/bareos-fd-connect.py deleted file mode 100755 index 00a7fbb..0000000 --- a/bin/bareos-fd-connect.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/python - -import argparse -import bareos.bsock -from bareos.bsock.filedaemon import FileDaemon -import logging -import sys - -def getArguments(): - parser = argparse.ArgumentParser(description='Connect to Bareos File Daemon.' ) - parser.add_argument('-d', '--debug', action='store_true', help="enable debugging output") - parser.add_argument('--name', help="Name of the Director resource in the File Daemon", required=True) - parser.add_argument('-p', '--password', help="password to authenticate to a Bareos File Daemon", required=True) - parser.add_argument('--port', default=9102, help="Bareos File Daemon network port") - parser.add_argument('address', nargs='?', default="localhost", help="Bareos File Daemon network address") - parser.add_argument('command', nargs='*', help="Command to send to the Bareos File Daemon") - args = parser.parse_args() - return args - -if __name__ == '__main__': - logging.basicConfig(format='%(levelname)s %(module)s.%(funcName)s: %(message)s', level=logging.INFO) - logger = logging.getLogger() - - args=getArguments() - if args.debug: - logger.setLevel(logging.DEBUG) - - try: - options = [ 'address', 'port', 'name' ] - parameter = {} - for i in options: - if hasattr(args, i) and getattr(args,i) != None: - logger.debug( "%s: %s" %(i, getattr(args,i))) - parameter[i] = getattr(args,i) - else: - logger.debug( '%s: ""' %(i)) - logger.debug('options: %s' % (parameter)) - password = bareos.bsock.Password(args.password) - parameter['password']=password - bsock=FileDaemon(**parameter) - except RuntimeError as e: - print(str(e)) - sys.exit(1) - logger.debug( "authentication successful" ) - if args.command: - print(bsock.call(args.command)) - else: - bsock.interactive() diff --git a/bin/bareos-jsonrpc-server.py b/bin/bareos-jsonrpc-server.py deleted file mode 100755 index ffc1249..0000000 --- a/bin/bareos-jsonrpc-server.py +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/python - -import argparse -import bareos.bsock -import inspect -import logging -# pip install python-jsonrpc -import pyjsonrpc -import sys -from types import MethodType - -def add(a, b): - """Test function""" - return a + b - -class RequestHandler(pyjsonrpc.HttpRequestHandler): - # Register public JSON-RPC methods - methods = { - "add": add - } - -class BconsoleMethods: - def __init__(self, bconsole): - self.logger = logging.getLogger() - self.logger.debug("init") - self.conn = bconsole - - def execute(self, command): - """ - Generic function to call any bareos console command. - """ - self.logger.debug(command) - return self.conn.call(command) - - def execute_fullresult(self, command): - """ - Generic function to call any bareos console commands, - and return the full result (also the pseudo jsonrpc header, not required here). - """ - self.logger.debug(command) - return self.conn.call_fullresult(command) - - def list(self, command): - """ - Interface to the Bareos console list command. - """ - return self.execute("list " + command) - - def call(self, command): - """ - legacy function, as call is a suboptimal name. - It is used internally by python-jsonrpc. - Use execute() instead. - """ - return self.execute(command) - - - -def bconsole_methods_to_jsonrpc(bconsole_methods): - tuples = inspect.getmembers(bconsole_methods, predicate=inspect.ismethod) - methods = RequestHandler.methods - for i in tuples: - methods[i[0]] = getattr(bconsole_methods, i[0]) - print i[0] - print methods - RequestHandler.methods=methods - - -def getArguments(): - parser = argparse.ArgumentParser(description='Run Bareos Director JSON-RPC proxy.' ) - parser.add_argument('-d', '--debug', action='store_true', help="enable debugging output") - parser.add_argument('--name', default="*UserAgent*", help="use this to access a specific Bareos director named console. Otherwise it connects to the default console (\"*UserAgent*\")") - parser.add_argument('-p', '--password', help="password to authenticate to a Bareos Director console", required=True) - parser.add_argument('--port', default=9101, help="Bareos Director network port") - parser.add_argument('--dirname', help="Bareos Director name") - parser.add_argument('address', nargs='?', default="localhost", help="Bareos Director network address") - args = parser.parse_args() - return args - - -if __name__ == '__main__': - logging.basicConfig(format='%(levelname)s %(module)s.%(funcName)s: %(message)s', level=logging.INFO) - logger = logging.getLogger() - - args=getArguments() - if args.debug: - logger.setLevel(logging.DEBUG) - - try: - options = [ 'address', 'port', 'dirname', 'name' ] - parameter = {} - for i in options: - if hasattr(args, i) and getattr(args,i) != None: - logger.debug( "%s: %s" %(i, getattr(args,i))) - parameter[i] = getattr(args, i) - else: - logger.debug( '%s: ""' %(i)) - logger.debug('options: %s' % (parameter)) - password = bareos.bsock.Password(args.password) - parameter['password']=password - director = bareos.bsock.DirectorConsoleJson(**parameter) - except RuntimeError as e: - print(str(e)) - sys.exit(1) - logger.debug( "authentication successful" ) - - bconsole_methods = BconsoleMethods( director ) - - bconsole_methods_to_jsonrpc( bconsole_methods ) - - print bconsole_methods.call("list jobs last") - - # Threading HTTP-Server - http_server = pyjsonrpc.ThreadingHttpServer( - server_address = ('localhost', 8080), - RequestHandlerClass = RequestHandler - ) - print "Starting HTTP server ..." - print "URL: http://localhost:8080" - http_server.serve_forever() diff --git a/bin/bconsole-json.py b/bin/bconsole-json.py deleted file mode 100755 index d04c7ab..0000000 --- a/bin/bconsole-json.py +++ /dev/null @@ -1,45 +0,0 @@ -#!/usr/bin/python - -from __future__ import print_function -import argparse -import bareos.bsock -import logging -import sys - -def getArguments(): - parser = argparse.ArgumentParser(description='Console to Bareos Director.' ) - parser.add_argument('-d', '--debug', action='store_true', help="enable debugging output") - parser.add_argument('--name', default="*UserAgent*", help="use this to access a specific Bareos director named console. Otherwise it connects to the default console (\"*UserAgent*\")") - parser.add_argument('-p', '--password', help="password to authenticate to a Bareos Director console", required=True) - parser.add_argument('--port', default=9101, help="Bareos Director network port") - parser.add_argument('--dirname', help="Bareos Director name") - parser.add_argument('address', nargs='?', default="localhost", help="Bareos Director network address") - args = parser.parse_args() - return args - -if __name__ == '__main__': - logging.basicConfig(format='%(levelname)s %(module)s.%(funcName)s: %(message)s', level=logging.INFO) - logger = logging.getLogger() - - args=getArguments() - if args.debug: - logger.setLevel(logging.DEBUG) - - try: - options = [ 'address', 'port', 'dirname', 'name' ] - parameter = {} - for i in options: - if hasattr(args, i) and getattr(args,i) != None: - logger.debug( "%s: %s" %(i, getattr(args,i))) - parameter[i] = getattr(args, i) - else: - logger.debug( '%s: ""' %(i)) - logger.debug('options: %s' % (parameter)) - password = bareos.bsock.Password(args.password) - parameter['password']=password - director = bareos.bsock.DirectorConsoleJson(**parameter) - except RuntimeError as e: - print(str(e)) - sys.exit(1) - logger.debug( "authentication successful" ) - director.interactive() diff --git a/bin/bconsole.py b/bin/bconsole.py deleted file mode 100755 index 64afb48..0000000 --- a/bin/bconsole.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/python - -from __future__ import print_function -import argparse -#import bareos -import bareos.bsock -import logging -import sys - -def getArguments(): - parser = argparse.ArgumentParser(description='Console to Bareos Director.' ) - parser.add_argument('-d', '--debug', action='store_true', help="enable debugging output") - parser.add_argument('--name', default="*UserAgent*", help="use this to access a specific Bareos director named console. Otherwise it connects to the default console (\"*UserAgent*\")") - parser.add_argument('-p', '--password', help="password to authenticate to a Bareos Director console", required=True) - parser.add_argument('--port', default=9101, help="Bareos Director network port") - parser.add_argument('--dirname', help="Bareos Director name") - parser.add_argument('address', nargs='?', default="localhost", help="Bareos Director network address") - args = parser.parse_args() - return args - -if __name__ == '__main__': - logging.basicConfig(format='%(levelname)s %(module)s.%(funcName)s: %(message)s', level=logging.INFO) - logger = logging.getLogger() - - args=getArguments() - if args.debug: - logger.setLevel(logging.DEBUG) - - try: - options = [ 'address', 'port', 'dirname', 'name' ] - parameter = {} - for i in options: - if hasattr(args, i) and getattr(args,i) != None: - logger.debug( "%s: %s" %(i, getattr(args,i))) - parameter[i] = getattr(args,i) - else: - logger.debug( '%s: ""' %(i)) - logger.debug('options: %s' % (parameter)) - password = bareos.bsock.Password(args.password) - parameter['password']=password - director = bareos.bsock.DirectorConsole(**parameter) - except RuntimeError as e: - print(str(e)) - sys.exit(1) - logger.debug( "authentication successful" ) - director.interactive() diff --git a/bin/jsonrpc-test.py b/bin/jsonrpc-test.py deleted file mode 100755 index 9cd660b..0000000 --- a/bin/jsonrpc-test.py +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env python -# coding: utf-8 - -from pprint import pprint -import pyjsonrpc - -http_client = pyjsonrpc.HttpClient( - url = "http://localhost:8080", - #username = "Username", - #password = "Password" -) - -#try: - #print http_client.call("a2") - ## Result: 3 -#except: - #pass - -# It is also possible to use the *method* name as *attribute* name. -#print http_client.add(1, 2) - -# provoke an error -#print http_client.add(2,"abc") - - -result = http_client.execute_fullresult("list jobs last") -pprint(result) - -result = http_client.execute("list jobs last") -pprint(result) - -result = http_client.list("jobs last") -pprint(result) - - -#try: - #pprint(result['result']) -#except: - #pprint( result ) - diff --git a/debian/compat b/debian/compat deleted file mode 100644 index 7f8f011..0000000 --- a/debian/compat +++ /dev/null @@ -1 +0,0 @@ -7 diff --git a/debian/control b/debian/control deleted file mode 100644 index 7c296e7..0000000 --- a/debian/control +++ /dev/null @@ -1,13 +0,0 @@ -Source: python-bareos -Maintainer: Joerg Steffens <joerg.steffens@bareos.com> -Section: python -Priority: optional -Build-Depends: dh-python, debhelper (>= 7.4.3), python-all (>= 2.6.6-3), python-setuptools (>= 0.6b3) -Standards-Version: 3.9.1 - -Package: python-bareos -Architecture: all -Depends: ${misc:Depends}, ${python:Depends} -Description: Backup Archiving REcovery Open Sourced - Python module - This packages contains a python module to interact with a Bareos backup system. - It also includes some tools based on this module. diff --git a/debian/rules b/debian/rules deleted file mode 100755 index b4fa425..0000000 --- a/debian/rules +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/make -f - -export PYBUILD_NAME = bareos - -%: - dh $@ --with python2 --buildsystem=pybuild - diff --git a/debian/source/format b/debian/source/format deleted file mode 100644 index d3827e7..0000000 --- a/debian/source/format +++ /dev/null @@ -1 +0,0 @@ -1.0 diff --git a/packaging/debian.debtransform b/packaging/debian.debtransform deleted file mode 100644 index b90c561..0000000 --- a/packaging/debian.debtransform +++ /dev/null @@ -1 +0,0 @@ -# this file is only required to activate debtransform from Open Build Service (OBS) diff --git a/packaging/python-bareos.changes b/packaging/python-bareos.changes deleted file mode 100644 index 1620a26..0000000 --- a/packaging/python-bareos.changes +++ /dev/null @@ -1,12 +0,0 @@ -python-bareos (0.4.0-1) unstable; urgency=low - - * move python module bareos.fuse from python-bareos to bareos-fuse. - - -- Joerg Steffens <joerg.steffens@bareos.com> Tue, 26 Jun 2017 11:45:40 +0200 - -python-bareos (0.3.0-1) unstable; urgency=low - - * initial - - -- Joerg Steffens <joerg.steffens@bareos.com> Mon, 24 Aug 2015 11:45:40 +0200 - diff --git a/packaging/python-bareos.dsc b/packaging/python-bareos.dsc deleted file mode 100644 index 96cfc4a..0000000 --- a/packaging/python-bareos.dsc +++ /dev/null @@ -1,10 +0,0 @@ -Format: 1.0 -Source: python-bareos -Binary: python-bareos -Architecture: all -Version: 0.4-1 -Maintainer: Joerg Steffens <joerg.steffens@bareos.com> -Standards-Version: 3.9.1 -Build-Depends: dh-python, debhelper (>= 7.4.3), python-all (>= 2.6.6-3), python-setuptools (>= 0.6b3) -DEBTRANSFORM-RELEASE: 1 -Files: diff --git a/packaging/python-bareos.spec b/packaging/python-bareos.spec deleted file mode 100644 index 7403ff1..0000000 --- a/packaging/python-bareos.spec +++ /dev/null @@ -1,79 +0,0 @@ -%global srcname bareos - -#%%if 0%%{?rhel} || 0%%{?suse_version} == 1110 || 0%%{?suse_version} == 1315 -%bcond_without python2 -#%%else -#%%bcond_with python2 -#%%endif - -%if 0%{?with_python2} -%global PYVER 2 -%define noarch 0 -%else -%global PYVER 3 -%define noarch 1 -%endif - -%global pyXsuf %{PYVER} -%global pyXcmd python%{PYVER} - -Name: python-%{srcname} -Version: 0.4 -Release: 1%{?dist} -Summary: Backup Archiving REcovery Open Sourced - Python module -Group: Productivity/Archiving/Backup -License: AGPL-3.0 -URL: https://github.com/bareos/python-bareos/ -Vendor: The Bareos Team -#Source0: http://pypi.python.org/packages/source/e/%%{srcname}/%%{srcname}-%%{version}.tar.gz -Source: %{name}-%{version}.tar.gz -BuildRoot: %{_tmppath}/%{name}-root -%global debug_package %{nil} -%if %{with python2} -BuildRequires: python-devel -BuildRequires: python-setuptools -Requires: python-dateutil -%endif -%if %{with python3} -BuildRequires: python3-devel -BuildRequires: python3-setuptools -Requires: python3-dateutil -%endif -%if %noarch -BuildArch: noarch -%endif -%{?python_provide:%python_provide python-%{srcname}} - -%description -Bareos - Backup Archiving Recovery Open Sourced - Python module - -This packages contains a python module to interact with a Bareos backup system. -It also includes some tools based on this module. - -%define pyX_sitelib %(%{pyXcmd} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") - -%prep -%setup -q - -%build -%{pyXcmd} setup.py build - -%install -# Must do the python2 install first because the scripts in /usr/bin are -# overwritten with every setup.py install, and in general we want the -# python3 version to be the default. -%{pyXcmd} setup.py install --prefix=%{_prefix} --root=%{buildroot} - -%check -# does not work, as it tries to download other packages from pip -#%%{__python2} setup.py test -#%%{pyXcmd} setup.py -q test - -# Note that there is no %%files section for the unversioned python module if we are building for several python runtimes -%files -%defattr(-,root,root,-) -%doc README.rst -%{pyX_sitelib}/* -%{_bindir}/* - -%changelog diff --git a/setup.py b/setup.py deleted file mode 100644 index 0eb7883..0000000 --- a/setup.py +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/python - -from setuptools import find_packages, setup - -setup( - name='python-bareos', - version='0.3', - author='Joerg Steffens', - author_email='joerg.steffens@bareos.com', - packages=find_packages(), - scripts=['bin/bconsole.py', 'bin/bconsole-json.py', 'bin/bareos-fd-connect.py'], - url='https://github.com/bareos/python-bareos/', - # What does your project relate to? - keywords='bareos', - description='Network socket connection to the Bareos backup system.', - long_description=open('README.rst').read(), - install_requires=[ - #'hmac', - #'socket', - 'python-dateutil', - ] -) - |