diff --git a/docs/buckets/dnf.md b/docs/buckets/dnf.md
new file mode 100644
index 0000000..9d897a1
--- /dev/null
+++ b/docs/buckets/dnf.md
@@ -0,0 +1,20 @@
+# DNF
+
+Used by Fedora guests, will get configured under guest's `/var/cache/dnf`. It will
+also [make sure](lib/vagrant-cachier/bucket/dnf.rb#L20) that `keepcache` is set to
+`1` on guest's `/etc/dnf/dnf.conf`.
+
+To manually enable it:
+
+```ruby
+Vagrant.configure("2") do |config|
+ config.vm.box = 'some-fedora-box'
+ config.cache.enable :dnf
+end
+```
+
+### :warning: Notice about Windows hosts :warning:
+
+In case this bucket is enabled and a Windows host is in use, you might see an
+ugly stacktrace as described on [this comment](https://github.com/fgrehm/vagrant-cachier/issues/117#issuecomment-50548393)
+if some DNF repository is not available during provisioning.
diff --git a/docs/template.html b/docs/template.html
index 0bdbcd1..9679ad4 100644
--- a/docs/template.html
+++ b/docs/template.html
@@ -89,6 +89,7 @@
Chef
Chef Gems
Composer
+ DNF
Bower
Pacman
npm
diff --git a/lib/vagrant-cachier/bucket.rb b/lib/vagrant-cachier/bucket.rb
index 4d392a6..576b019 100644
--- a/lib/vagrant-cachier/bucket.rb
+++ b/lib/vagrant-cachier/bucket.rb
@@ -93,6 +93,7 @@ require_relative "bucket/gem"
require_relative "bucket/chef_gem"
require_relative "bucket/pacman"
require_relative "bucket/yum"
+require_relative "bucket/dnf"
require_relative "bucket/rvm"
require_relative "bucket/apt_cacher"
require_relative "bucket/apt_lists"
diff --git a/lib/vagrant-cachier/bucket/dnf.rb b/lib/vagrant-cachier/bucket/dnf.rb
new file mode 100644
index 0000000..93ca9c8
--- /dev/null
+++ b/lib/vagrant-cachier/bucket/dnf.rb
@@ -0,0 +1,27 @@
+module VagrantPlugins
+ module Cachier
+ class Bucket
+ class Dnf < Bucket
+ def self.capability
+ :dnf_cache_dir
+ end
+
+ def install
+ if guest.capability?(:dnf_cache_dir)
+ if guest_path = guest.capability(:dnf_cache_dir)
+ return if @env[:cache_dirs].include?(guest_path)
+
+ # Ensure caching is enabled
+ comm.sudo("sed -i '/keepcache=/d' /etc/dnf/dnf.conf")
+ comm.sudo("sed -i '/^[main]/a keepcache=1' /etc/dnf/dnf.conf")
+
+ symlink(guest_path)
+ end
+ else
+ @env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'DNF')
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vagrant-cachier/bucket/yum.rb b/lib/vagrant-cachier/bucket/yum.rb
index b58ce19..55a6f1f 100644
--- a/lib/vagrant-cachier/bucket/yum.rb
+++ b/lib/vagrant-cachier/bucket/yum.rb
@@ -8,13 +8,14 @@ module VagrantPlugins
def install
if guest.capability?(:yum_cache_dir)
- guest_path = guest.capability(:yum_cache_dir)
- return if @env[:cache_dirs].include?(guest_path)
+ if guest_path = guest.capability(:yum_cache_dir)
+ return if @env[:cache_dirs].include?(guest_path)
- # Ensure caching is enabled
- comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
+ # Ensure caching is enabled
+ comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
- symlink(guest_path)
+ symlink(guest_path)
+ end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum')
end
diff --git a/lib/vagrant-cachier/cap/redhat/dnf_cache_dir.rb b/lib/vagrant-cachier/cap/redhat/dnf_cache_dir.rb
new file mode 100644
index 0000000..e9e42d6
--- /dev/null
+++ b/lib/vagrant-cachier/cap/redhat/dnf_cache_dir.rb
@@ -0,0 +1,18 @@
+module VagrantPlugins
+ module Cachier
+ module Cap
+ module RedHat
+ module DnfCacheDir
+ def self.dnf_cache_dir(machine)
+ dnf_cache_dir = nil
+ machine.communicate.tap do |comm|
+ return unless comm.test('which dnf')
+ dnf_cache_dir = '/var/cache/dnf'
+ end
+ return dnf_cache_dir
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/vagrant-cachier/cap/redhat/yum_cache_dir.rb b/lib/vagrant-cachier/cap/redhat/yum_cache_dir.rb
index 2639ab0..0b5b0d9 100644
--- a/lib/vagrant-cachier/cap/redhat/yum_cache_dir.rb
+++ b/lib/vagrant-cachier/cap/redhat/yum_cache_dir.rb
@@ -4,7 +4,13 @@ module VagrantPlugins
module RedHat
module YumCacheDir
def self.yum_cache_dir(machine)
- '/var/cache/yum'
+ yum_cache_dir = nil
+ machine.communicate.tap do |comm|
+ # In case yum is only forwarding to dnf do not cache
+ return unless not comm.test('yum --version 2>&1 | grep /usr/bin/dnf')
+ yum_cache_dir = '/var/cache/yum'
+ end
+ return yum_cache_dir
end
end
end
diff --git a/lib/vagrant-cachier/capabilities.rb b/lib/vagrant-cachier/capabilities.rb
index fab48c2..ce73499 100644
--- a/lib/vagrant-cachier/capabilities.rb
+++ b/lib/vagrant-cachier/capabilities.rb
@@ -61,6 +61,11 @@ module VagrantPlugins
Cap::RedHat::YumCacheDir
end
+ guest_capability 'redhat', 'dnf_cache_dir' do
+ require_relative 'cap/redhat/dnf_cache_dir'
+ Cap::RedHat::DnfCacheDir
+ end
+
guest_capability 'suse', 'yum_cache_dir' do
# Disable Yum on suse guests
end