{"id":21745190,"url":"https://github.com/zuazo/boxbilling-cookbook","last_synced_at":"2025-12-18T00:53:24.471Z","repository":{"id":20159179,"uuid":"23429773","full_name":"zuazo/boxbilling-cookbook","owner":"zuazo","description":"Chef cookbook to install and configure BoxBilling.","archived":false,"fork":false,"pushed_at":"2015-09-05T08:40:16.000Z","size":768,"stargazers_count":4,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-11-26T07:13:49.135Z","etag":null,"topics":["apache2","billing","boxbilling","chef","client-management","clients","cookbook","devops","invoices","nginx"],"latest_commit_sha":null,"homepage":"https://supermarket.chef.io/cookbooks/boxbilling","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zuazo.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-28T13:54:32.000Z","updated_at":"2024-08-07T06:13:38.000Z","dependencies_parsed_at":"2022-08-31T13:53:24.438Z","dependency_job_id":null,"html_url":"https://github.com/zuazo/boxbilling-cookbook","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zuazo%2Fboxbilling-cookbook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zuazo%2Fboxbilling-cookbook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zuazo%2Fboxbilling-cookbook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zuazo%2Fboxbilling-cookbook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zuazo","download_url":"https://codeload.github.com/zuazo/boxbilling-cookbook/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235639276,"owners_count":19022270,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache2","billing","boxbilling","chef","client-management","clients","cookbook","devops","invoices","nginx"],"created_at":"2024-11-26T07:13:53.260Z","updated_at":"2025-10-07T15:30:57.631Z","avatar_url":"https://github.com/zuazo.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"BoxBilling Cookbook\n===================\n[![Cookbook Version](https://img.shields.io/cookbook/v/boxbilling.svg?style=flat)](https://supermarket.chef.io/cookbooks/boxbilling)\n[![Dependency Status](http://img.shields.io/gemnasium/zuazo/boxbilling-cookbook.svg?style=flat)](https://gemnasium.com/zuazo/boxbilling-cookbook)\n[![Code Climate](http://img.shields.io/codeclimate/github/zuazo/boxbilling-cookbook.svg?style=flat)](https://codeclimate.com/github/zuazo/boxbilling-cookbook)\n[![Build Status](http://img.shields.io/travis/zuazo/boxbilling-cookbook.svg?style=flat)](https://travis-ci.org/zuazo/boxbilling-cookbook)\n\n[Chef](https://www.chef.io/) cookbook to install and configure [BoxBilling](http://www.boxbilling.com/), invoice and client management software.\n\nRequirements\n============\n\n## Supported Platforms\n\nThis cookbook has been tested on the following platforms:\n\n* Amazon Linux\n* CentOS `\u003e= 6.0`\n* Debian\n* Fedora\n* RedHat\n* Ubuntu\n\nPlease, [let us know](https://github.com/zuazo/boxbilling-cookbook/issues/new?title=I%20have%20used%20it%20successfully%20on%20...) if you use it successfully on any other platform.\n\n## Required Cookbooks\n\n* [apache2](https://supermarket.chef.io/cookbooks/apache2)\n* [cron](https://supermarket.chef.io/cookbooks/cron)\n* [database](https://supermarket.chef.io/cookbooks/database)\n* [encrypted_attributes (~\u003e 0.2)](https://supermarket.chef.io/cookbooks/encrypted_attributes)\n* [mysql (~\u003e 5.0)](https://supermarket.chef.io/cookbooks/mysql)\n* [openssl](https://supermarket.chef.io/cookbooks/openssl)\n* [php](https://supermarket.chef.io/cookbooks/php)\n* [ssl_certificate](https://supermarket.chef.io/cookbooks/ssl_certificate)\n* [yum-epel](https://supermarket.chef.io/cookbooks/yum-epel)\n\n## Required Applications\n\n* Ruby `1.9.3` or higher.\n\nAttributes\n==========\n\n| Attribute                                                    | Default                 | Description                    |\n|:-------------------------------------------------------------|:------------------------|:-------------------------------|\n| `node['boxbilling']['version']`                              | `'4.19.1'`              | BoxBilling version (See [below](#installing-boxbilling-3) for BoxBilling version `3` installation).\n| `node['boxbilling']['download_url']`                         | *calculated*            | BoxBilling download URL.\n| `node['boxbilling']['required_packages']`                    | `%w(unzip)`             | BoxBilling required packages.\n| `node['boxbilling']['php_packages']`                         | *calculated*            | BoxBilling required PHP packages.\n| `node['boxbilling']['dir']`                                  | `'/srv/www/boxbilling'` | BoxBilling installation directory.\n| `node['boxbilling']['server_name']`                          | `node['fqdn']`          | BoxBilling server name.\n| `node['boxbilling']['cron_enabled']`                         | `true`                  | Whether to enable BoxBilling cron job.\n| `node['boxbilling']['headers']`                              | `{}`                    | BoxBilling HTTP headers to set as hash.\n| `node['boxbilling']['ssl']`                                  | `true`                  | Whether to enable SSL in BoxBilling.\n| `node['boxbilling']['encrypt_attributes']`                   | `false`                 | Whether to encrypt BoxBilling attributes containing credential secrets.\n| `node['boxbilling']['web_server']`                           | `'apache'`              | Web server to use: `'apache'` or `'nginx'`\n| `node['boxbilling']['admin']['email']`                       | *calculated*            | BoxBilling admin email.\n| `node['boxbilling']['admin']['pass']`                        | *calculated*            | BoxBilling admin password.\n| `node['boxbilling']['config']['timezone']`                   | `'America/New_York'`    | BoxBilling timezone. See [PHP supported timezones](http://php.net/manual/en/timezones.php).\n| `node['boxbilling']['config']['db_host']`                    | `'localhost'`           | BoxBilling database host.\n| `node['boxbilling']['config']['db_name']`                    | `'boxbilling'`          | BoxBilling database name.\n| `node['boxbilling']['config']['db_user']`                    | `'boxbilling'`          | BoxBilling database user.\n| `node['boxbilling']['config']['db_password']`                | *calculated*            | BoxBilling database user password.\n| `node['boxbilling']['config']['url']`                        | *calculated*            | BoxBilling URL.\n| `node['boxbilling']['config']['license']`                    | `nil`                   | BoxBilling license key (**required**). Go to [BoxBilling order page](http://www.boxbilling.com/order) to get a new license.\n| `node['boxbilling']['config']['locale']`                     | `'en_US'`               | BoxBilling locale.\n| `node['boxbilling']['config']['sef_urls']`                   | `false`                 | Whether to enable BoxBilling *search engine friendly* URLs.\n| `node['boxbilling']['config']['debug']`                      | *calculated*            | Whether to enable BoxBilling debug mode.\n| `node['boxbilling']['api_config']['require_referer_header']` | `true`                  | Whether to enable *require referer header* in the API.\n| `node['boxbilling']['api_config']['allowed_ips']`            | `[]`                    | BoxBilling allowed IP addresses to access the API. Empty array will allow all IPs to access the API.\n| `node['boxbilling']['api_config']['rate_span']`              | `3600`                  | BoxBilling API time span for limit in seconds.\n| `node['boxbilling']['api_config']['rate_limit']`             | `1000`                  | BoxBilling API requests allowed per time span.\n| `node['boxbilling']['mysql']['server_root_password']`        | *calculated*            | BoxBilling MySQL *root* password.\n| `node['boxbilling']['mysql']['server_debian_password']`      | *calculated*            | BoxBilling MySQL *debian* user password.\n| `node['boxbilling']['mysql']['server_repl_password']`        | *calculated*            | BoxBilling MySQL *repl* user password.\n\n## The HTTPS Certificate\n\nThis cookbook uses the [`ssl_certificate`](https://supermarket.chef.io/cookbooks/ssl_certificate) cookbook to create the HTTPS certificate. The namespace used is `node['boxbilling']`. For example:\n\n```ruby\nnode.default['boxbilling']['common_name'] = 'boxbilling.example.com'\nnode.default['boxbilling']['config']['license'] = '...' # BB_LICENSE key\ninclude_recipe 'boxbilling'\n```\n\nSee the [`ssl_certificate` namespace documentation](https://supermarket.chef.io/cookbooks/ssl_certificate#namespaces) for more information.\n\n## Encrypted Attributes\n\nThis cookbook can use the [encrypted_attributes](https://supermarket.chef.io/cookbooks/encrypted_attributes) cookbook to encrypt the secrets generated during the *Chef Run*. This feature is disabled by default, but can be enabled setting the `node['boxbilling']['encrypt_attributes']` attribute to `true`. For example:\n\n```ruby\ninclude_recipe 'encrypted_attributes::users_data_bag'\nnode.default['boxbilling']['encrypt_attributes'] = true\nnode.default['boxbilling']['config']['license'] = '...' # BB_LICENSE key\ninclure_recipe 'boxbilling'\n```\n\nThis will create the following encrypted attributes:\n\n* `node['boxbilling']['admin']['pass']`: BoxBilling admin password.\n* `node['boxbilling']['mysql']['root']`: MySQL *root* user password.\n* `node['boxbilling']['mysql']['debian']`: MySQL *debian* user password.\n* `node['boxbilling']['mysql']['repl']`: MySQL *repl* user password.\n* `node['boxbilling']['config']['db_password']`: MySQL BoxBilling user password.\n\nRead the [`chef-encrypted-attributes` gem documentation](http://onddo.github.io/chef-encrypted-attributes/) to learn how to read them.\n\nRecipes\n=======\n\n## boxbilling::default\n\nInstalls and configures BoxBilling. Including the MySQL server if set to localhost.\n\n## boxbilling::api\n\nInstalls the requirementes to use the `boxbilling_api` resource.\n\n## boxbilling::mysql\n\nInstalls MySQL server for BoxBilling.\n\nResources\n=========\n\n## boxbilling_api[path]\n\nThis resource uses the [BoxBilling v2 Admin API](http://www.boxbilling.com/docs/api-admin.html) with some modifications:\n\n* Some paths has been normalized, the action has been removed from the path and the resource action is issued instead.\n* The *update* action is simulated for some objects that do not support it, using *delete* and *create*.\n* All the action names has been simplified to *create*, *update* and *delete*.\n\n**Note:** Keep in mind that some API calls require self-generated/auto-incremented MySQL identifiers. So their use can become difficult sometimes.\n\n## boxbilling_api Actions\n\n* `request` (*default*): Sends a HTTP raw API request.\n* `create`: Sends a create action to the API object.\n* `update`: Sends an update action to the API object.\n* `delete`: Send a delete action to the API object.\n\n## boxbilling_api Parameters\n\n| Parameter      | Default      | Description                    |\n|:---------------|:-------------|:-------------------------------|\n| path           | *name*       | BoxBilling API relative path. For example: `'admin/product'`.\n| data           | `{}`         | Data to send as hash.\n| debug          | *calculated* | Whether to enable debug mode.\n| ignore_failure | `false`      | Ignore API HTTP errors.\n\nUsage\n=====\n\nYou need a valid BoxBilling license key to use this cookbook. You can get a new license in the [BoxBilling order page](http://www.boxbilling.com/order).\n\n## Including in a Cookbook Recipe\n\nYou can simply include it in a recipe:\n\n```ruby\n# in your recipe\nnode.default['boxbilling']['config']['license'] = '...' # BB_LICENSE key\ninclude_recipe 'boxbilling'\n```\n\nDon't forget to include the `boxbilling` cookbook as a dependency in the metadata:\n\n```ruby\n# metadata.rb\ndepends 'boxbilling'\n```\n\n## Including in the Run List\n\nAnother alternative is to include it in your *Run List*:\n\n```json\n{\n  \"name\": \"client.example.com\",\n  \"[...]\": \"[...]\",\n  \"normal\": {\n    \"boxbilling\": {\n      \"config\": {\n        \"license\": \"BB_LICENSE\"\n      }\n    }\n  },\n  \"run_list\": [\n    \"[...]\",\n    \"recipe[boxbilling]\"\n  ]\n}\n```\n\n## Installing BoxBilling 3\n\nTo install BoxBilling version `3`, you must change the `node['boxbilling']['download_url']` attribute.\n\nYou can use GitHub to download the release. For example:\n\n```ruby\nnode.default['boxbilling']['config']['license'] = '...' # BB_LICENSE key\nnode.default['boxbilling']['download_url'] = 'http://files.zuazo.org/boxbilling-3.6.11.zip'\n\ninclude_recipe 'boxbilling::default'\n```\n\n## *boxbilling::default* Recipe Usage Example\n\n```ruby\nnode.default['boxbilling']['config']['license'] = '...' # BB_LICENSE key\ninclude_recipe 'boxbilling::default'\n```\n\n## *boxbilling::api* Recipe Usage Example\n\n```ruby\ninclude_recipe 'boxbilling::api'\n```\n\n## *boxbilling::mysql* Recipe Usage Example\n\n```ruby\ninclude_recipe 'boxbilling::mysql'\n```\n\n## *boxbilling_api* Resource Usage Example\n\nBelow is a fairly complete real example:\n\n```ruby\n# =============================================================================\n# Products\n# =============================================================================\n\n# Disable \"Domains registration and transfer\" product\nboxbilling_api 'admin/product Domains registration and transfer' do\n  path 'admin/product'\n  data(\n    id: 1,\n    status: 'disabled'\n  )\n  action :update\nend\n\n# =============================================================================\n# News\n# =============================================================================\n\n# Delete some default blog news\n(1..3).each do |id|\n  boxbilling_api \"admin/news delete #{id}\" do\n    path 'admin/news'\n    data id: id\n    action :delete\n  end\nend\n\n# New blog post\n# boxbilling_api 'admin/news' do\n#   data(\n#     id: 4,\n#     content: 'Blog post content...',\n#     title: 'My first blog post',\n#     # image: 'http://www.yourdomain.com/image.jpg',\n#     status: 'active'\n#     # created_at: '2012-01-01',\n#     # updated_at: '2012-01-01'\n#   )\n#   action :create\n# end\n\n# =============================================================================\n# Knowledge Base\n# =============================================================================\n\n# Disable some default articles\n(1..3).each do |id|\n  boxbilling_api 'admin/kb/article #{id}' do\n    path 'admin/kb/article'\n    data(\n      id: id,\n      status: 'draft'\n    )\n    action :update\n  end\nend\n\n# Create some categories\n# boxbilling_api 'admin/kb/category 3' do\n#   path 'admin/kb/category'\n#   data(\n#     id: 3,\n#     title: 'New KB category',\n#     description: 'New KB category content description'\n#   )\n#   action :create\n# end\n\n# Add some articles\n# boxbilling_api 'admin/kb/article 4' do\n#   path 'admin/kb/article'\n#   data(\n#     id: 4,\n#     kb_article_category_id: 3,\n#     title: 'My New Article',\n#     status: 'active',\n#     content: 'My article content...'\n#   )\n#   action :create\n# end\n\n# =============================================================================\n# Configuration \u003e Settings \u003e Client\n# =============================================================================\n\nboxbilling_api 'admin/extension/config' do\n  data(\n    ext: 'mod_client',\n    allow_signup: 1,\n    require_email_confirmation: 1,\n    allow_change_email: 1,\n    required: %w(last_name country city state address_1 postcode phone)\n  )\n  action :update\nend\n\n# =============================================================================\n# Configuration \u003e Settings \u003e Currency settings\n# =============================================================================\n\nboxbilling_api 'admin/currency EUR' do\n  path 'admin/currency'\n  data(\n    code: 'EUR',\n    title: 'Euro',\n    format: \"{{price}} \\u20AC\"\n  )\n  action :create\nend\n\nboxbilling_api 'admin/currency GBP' do\n  path 'admin/currency'\n  data(\n    code: 'GBP',\n    title: 'Pound Sterling',\n    format: \"\\u00A3{{price}}\"\n  )\n  action :create\nend\n\nboxbilling_api 'admin/currency/set_default' do\n  data code: 'EUR'\nend\n\n# =============================================================================\n# Configuration \u003e Settings \u003e Email\n# =============================================================================\n\nboxbilling_api 'admin/email/batch_template_generate'\n\n# Reset a template\n# boxbilling_api 'admin/email/template_reset client_password_reset_approve' do\n#   path 'admin/email/template_reset'\n#   data code: 'mod_client_password_reset_approve'\n# end\n\n# Create a new template\n# boxbilling_api 'admin/email/template 1' do\n#   path 'admin/email/template'\n#   data(\n#     id: 1,\n#     enabled: 1,\n#     category: 'client',\n#     action_code: 'mod_client_password_reset_approve',\n#     subject: '[{{ guest.system_company.name }}] Password Changed',\n#     content: '...'\n#   )\n#   action :create\n# end\n\n# Update an existing template\n# boxbilling_api 'admin/email/template 1' do\n#   path 'admin/email/template'\n#   data(\n#     id: 1,\n#     enabled: 1,\n#     subject: '[{{ guest.system_company.name }}] Password Changed',\n#     content: \u003c\u003c-EOF\n# {% filter markdown %}\n# \n# Dear {{ c.first_name }} {{ c.last_name }},\n# \n# As you requested, your password for our client area has now been reset.\n# Your new login details are as follows:\n# \n# Login at: {{\"login\"|link}}?email={{ c.email }}\n# Email: {{ c.email }}\n# Password: {{ password }}\n# \n# To change your password to something more memorable, after logging in go to \n# Profile \u0026gt; Change Password.\n# \n# Edit your profile at {{ \"me\"|link }}\n# \n# {{ guest.system_company.signature }}\n# \n# {% endfilter %}\n#     EOF\n#   )\n#   action :update\n# end\n\n# Email settings\n# boxbilling_api 'admin/extension/config mod_email' do\n#   path 'admin/extension/config'\n#   data(\n#     ext: 'mod_email',\n#     log_enabled: 1,\n#     mailer: 'smtp', # sendmail | smtp\n#     smtp_host: smtp_host,\n#     smtp_port: 587,\n#     smtp_username: smtp_username,\n#     smtp_password: smtp_password,\n#     smtp_security: 'tls',\n#   )\n#   action :update\n# end\n\n# =============================================================================\n# Configuration \u003e Settings \u003e Invoice settings\n# =============================================================================\n\n# Set next invoice number\n# IMPORTANT: this must be run only once, will cause duplicated invoice numbers\nboxbilling_api 'admin/system/params invoice starting_number' do\n  path 'admin/system/params'\n  data invoice_starting_number: '1'\n  action :nothing\nend\n\nboxbilling_api 'admin/system/params invoice settings' do\n  path 'admin/system/params'\n  data(\n    invoice_issue_days_before_expire: 14,\n    invoice_due_days: 5,\n    invoice_auto_approval: 1,\n    remove_after_days: 0,\n    invoice_series: 'PRO-N',\n    invoice_series_paid: 'N',\n    # negative_invoice | credit_note | manual\n    invoice_refund_logic: 'credit_note',\n    funds_min_amount: 10,\n    funds_max_amount: 200\n  )\n  action :update\n  notifies :update, 'boxbilling_api[admin/system/params invoice starting_number]'\nend\n\n# =============================================================================\n# Configuration \u003e Settings \u003e Orders settings\n# =============================================================================\n\nboxbilling_api 'admin/extension/config mod_order' do\n  path 'admin/extension/config'\n  data(\n    ext: 'mod_order',\n    # from_expiration_date | from_today | from_greater\n    order_renewal_logic: 'from_expiration_date',\n    batch_suspend_reason: ''\n  )\n  action :update\nend\n\n# =============================================================================\n# Configuration \u003e Settings \u003e System settings\n# =============================================================================\n\nboxbilling_api 'admin/system/params system settings' do\n  path 'admin/system/params'\n  data(\n    company_name: 'Testing Labs, Ltd',\n    company_logo: '',\n    company_email: 'testing@testing.com',\n    company_tel: '1234567890',\n    company_address_1: 'Somewhere',\n    company_number: 'B12345678',\n    company_vat_number: 'EU12345678',\n    company_account_number: 'BANK-1234',\n    company_signature: 'Testing signature'\n  )\n  action :update\nend\n\n# =============================================================================\n# Configuration \u003e Domain registration/management\n# =============================================================================\n\n# Delete default domain TLD\nboxbilling_api 'admin/servicedomain/tld' do\n  data tld: '.com'\n  action :delete\nend\n\n# =============================================================================\n# Configuration \u003e Payment gateways\n# =============================================================================\n\nboxbilling_api 'admin/invoice/gateway Custom' do\n  path 'admin/invoice/gateway'\n  data(\n    id: 1,\n    enabled: 0,\n    test_mode: 0\n  )\n  action :update\nend\n\n# boxbilling_api 'admin/invoice/gateway PayPal' do\n#   path 'admin/invoice/gateway'\n#   data(\n#     id: 2,\n#     enabled: 1,\n#     config: {\n#       email: paypal_email\n#     },\n#     accepted_currencies: %w(EUR USD GBP),\n#     test_mode: 0\n#   )\n#   action :update\n# end\n\nboxbilling_api 'admin/invoice/gateway AlertPay' do\n  path 'admin/invoice/gateway'\n  data(\n    id: 3,\n    enabled: 0,\n    test_mode: test_mode\n  )\n  action :update\nend\n\n# =============================================================================\n# Configuration \u003e Tax\n# =============================================================================\n\n# Enable taxes\nboxbilling_api 'admin/system/params taxes' do\n  path 'admin/system/params'\n  data tax_enabled: 1\n  action :update\nend\n\n# It deletes all the taxes and regenerate them instead of checking if they\n# previously exists. Notified by boxbilling_api[admin/invoice/tax]\nboxbilling_api 'admin/invoice/tax_setup_eu' do\n  data(\n    name: 'VAT EU12345678',\n    taxrate: 21\n  )\n  action :nothing\nend\n\nboxbilling_api 'admin/invoice/tax' do\n  data(\n    id: 9, # important, must match tax id when usign auto generated/increment\n    name: 'EU12345678',\n    taxrate: 21,\n    country: 'ES'\n  )\n  action :create\n  notifies :request, 'boxbilling_api[admin/invoice/tax_setup_eu]'\nend\n```\n\nTesting\n=======\n\nSee [TESTING.md](https://github.com/zuazo/boxbilling-cookbook/blob/master/TESTING.md).\n\n## ChefSpec Matchers\n\n### boxbilling_api(path)\n\nHelper method for locating a `boxbilling_api` resource in the collection.\n\n```ruby\nresource = chef_run.boxbilling_api('admin/system/params')\nexpect(resource)\n  .to notify('boxbilling_api[admin/system/params invoice starting_number]')\n  .to(:update).delayed\n```\n\n### request_boxbilling_api(path)\n\nAssert that the *Chef Run* makes a `boxbilling_api` request.\n\n```ruby\nexpect(chef_run).to request_boxbilling_api(path)\n```\n\n### create_boxbilling_api(path)\n\nAssert that the *Chef Run* makes a `boxbilling_api` create request.\n\n```ruby\nexpect(chef_run).to create_boxbilling_api(path)\n```\n\n### update_boxbilling_api(path)\n\nAssert that the *Chef Run* makes a `boxbilling_api` update request.\n\n```ruby\nexpect(chef_run).to update_boxbilling_api(path)\n```\n\n### delete_boxbilling_api(path)\n\nAssert that the *Chef Run* makes a `boxbilling_api` delete request.\n\n```ruby\nexpect(chef_run).to delete_boxbilling_api(path)\n```\n\nContributing\n============\n\nPlease do not hesitate to [open an issue](https://github.com/zuazo/boxbilling-cookbook/issues/new) with any questions or problems.\n\nSee [CONTRIBUTING.md](https://github.com/zuazo/boxbilling-cookbook/blob/master/CONTRIBUTING.md).\n\nTODO\n====\n\nSee [TODO.md](https://github.com/zuazo/boxbilling-cookbook/blob/master/TODO.md).\n\n\nLicense and Author\n==================\n\n|                      |                                          |\n|:---------------------|:-----------------------------------------|\n| **Author:**          | [Raul Rodriguez](https://github.com/raulr) (\u003craul@onddo.com\u003e)\n| **Author:**          | [Xabier de Zuazo](https://github.com/zuazo) (\u003cxabier@zuazo.org\u003e)\n| **Copyright:**       | Copyright (c) 2015, Xabier de Zuazo\n| **Copyright:**       | Copyright (c) 2013-2015, Onddo Labs, SL.\n| **License:**         | Apache License, Version 2.0\n\n    Licensed under the Apache License, Version 2.0 (the \"License\");\n    you may not use this file except in compliance with the License.\n    You may obtain a copy of the License at\n    \n        http://www.apache.org/licenses/LICENSE-2.0\n    \n    Unless required by applicable law or agreed to in writing, software\n    distributed under the License is distributed on an \"AS IS\" BASIS,\n    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    See the License for the specific language governing permissions and\n    limitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzuazo%2Fboxbilling-cookbook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzuazo%2Fboxbilling-cookbook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzuazo%2Fboxbilling-cookbook/lists"}