summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app-admin/puppet/ChangeLog8
-rw-r--r--app-admin/puppet/Manifest31
-rw-r--r--app-admin/puppet/files/puppet-0.25.4-rrd.patch189
-rw-r--r--app-admin/puppet/puppet-0.25.4.ebuild122
4 files changed, 335 insertions, 15 deletions
diff --git a/app-admin/puppet/ChangeLog b/app-admin/puppet/ChangeLog
index 72f116d7d413..4e198434e788 100644
--- a/app-admin/puppet/ChangeLog
+++ b/app-admin/puppet/ChangeLog
@@ -1,6 +1,12 @@
# ChangeLog for app-admin/puppet
# Copyright 1999-2010 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/app-admin/puppet/ChangeLog,v 1.51 2010/01/26 15:58:13 matsuu Exp $
+# $Header: /var/cvsroot/gentoo-x86/app-admin/puppet/ChangeLog,v 1.52 2010/02/28 03:04:54 matsuu Exp $
+
+*puppet-0.25.4 (28 Feb 2010)
+
+ 28 Feb 2010; MATSUU Takuto <matsuu@gentoo.org> +puppet-0.25.4.ebuild,
+ +files/puppet-0.25.4-rrd.patch:
+ Version bumped. Fixed rrd issue, bug #294304.
*puppet-0.25.3 (26 Jan 2010)
diff --git a/app-admin/puppet/Manifest b/app-admin/puppet/Manifest
index 006c3a297471..499711d9b199 100644
--- a/app-admin/puppet/Manifest
+++ b/app-admin/puppet/Manifest
@@ -6,6 +6,7 @@ AUX puppet-0.24.6-eix.patch 2228 RMD160 a2465eba3775cacb54d9e20f97efd6cbb3e91627
AUX puppet-0.24.8-rc-update-show.patch 961 RMD160 2fed961a81b4e5b7659db3c587b17e81ea463bc5 SHA1 832b1a2bd32e6efc0764fa82bf4ef9f705348df3 SHA256 94a32f3d969d00de29564f895426f8c7c9cdbe6b8962d051a4f28b02efa17449
AUX puppet-0.25.0-cert-names.patch 3638 RMD160 88033cb249bcb1daa1c13dcf820d8aeeec9bcf4b SHA1 27b02cb25bd81785d427469b5e25deb878ebc27a SHA256 f068e491cbe613675e7538c531069ff7055ec16e2ee40a56388277f15e601c55
AUX puppet-0.25.1-eix-0.18.patch 5924 RMD160 4891ba568bc9a2e9aff88a1b480bb550cf00a47f SHA1 a2d42a8de3b187176a6fbdadec63bf21aa8ff6e6 SHA256 0a8e2d28c12107686641ec0f8e8f4d3117856c5e72f1717b84669b0309489419
+AUX puppet-0.25.4-rrd.patch 7226 RMD160 d5b0e7ebd3189e548c0a69efb79b503364e8ec08 SHA1 ae397b38bdf3dedc3db9e198032a431172ce858c SHA256 21edf7af0ae57458f8bdbc41f0303a3522c0c34c4b4ca8b2c20774e7fa03b3e7
AUX puppet-0.25.init 923 RMD160 2133414233baee5f12542618747a6ccc278e8df9 SHA1 a009d9d266a49ca8065dec62cb7828a5ae550a48 SHA256 e60dfe6639ef591b4e9795499b7abe872a4069212e8beac72a2b1e6541ca98df
AUX puppet.init 922 RMD160 428dca973054f771b829bc24781b75ba5ccf3ef1 SHA1 bea4c5e97c2749be6874516beb71f501d3fbb1d3 SHA256 c355dfb24bb73ff21a750a73513518620cde2c63f0969074d81c60bb4e315425
AUX puppetmaster-0.25.init 1006 RMD160 9b1878992fc0380cbacf7c1eada2e6a283749a26 SHA1 3dfa2be66706183518a03b7a7a52da66d4934d45 SHA256 6a2acb189cfe4541348fd16c4e48e6a2fd97f59cd36f314c32d9c7fd3fb00d2c
@@ -14,25 +15,27 @@ AUX puppetmaster.init 1005 RMD160 eca4418abb7b6de674e7580f949b27f73b3c9b59 SHA1
DIST puppet-0.24.8.tgz 1099188 RMD160 edb187da9225c9faee9839a5d644b5c9c91f3d5f SHA1 a871aef6f3e8e060f5109bb022967066e32875be SHA256 9e9dcfdd26f96e0b0b4ca9bcfe6f473c679ff082a0cd7226c2058ae652d4fdc8
DIST puppet-0.25.1.tar.gz 1388451 RMD160 2b2bb5b0def03ddeebe99df1ee29648b6bca794d SHA1 c791b8f06a5775c63aaa2b48bffaf0540c3d3f88 SHA256 b91975b7f6304fca416b0bc26606639fc838b75237c049b4b0419dfe7e689b0c
DIST puppet-0.25.3.tar.gz 1424590 RMD160 2c313e798f2f9e6db947ff5efd857af70d102581 SHA1 33cfbf9aa8d42191b06592b071a124001c7adbd7 SHA256 a187019264c2b2d1cad6e103765f616f6e0afa7cc3fbad37fec318ab00e859fe
+DIST puppet-0.25.4.tar.gz 1424240 RMD160 67610414d6e5c41e9541eb7f392f391b94f1802e SHA1 290dcc20eb670b5b8e26d50301430e1333a037ab SHA256 c2dd640a31d1e57ad09929001f90247cd83908485f1f737abca352eb1866fbf3
EBUILD puppet-0.24.8-r1.ebuild 3628 RMD160 0899d628f3bf08b6db4a386680902d236a48f956 SHA1 fd01ce2d33e9055e706ff4665e9d3d41be98a05b SHA256 09d71b16ce2506306b7a22bcd8f258a5e92772bd4c713108d473ac49d96961e9
EBUILD puppet-0.25.1-r1.ebuild 3379 RMD160 276fc57a4219ae540fd2f828d7832e848a66e78a SHA1 d18d53ab014e4a8e7d6a65db2bc6a18f74ea7bef SHA256 892942f7660601f65d39a87fe62e5e60f188c23d627ee28597bcff0104267b34
EBUILD puppet-0.25.3.ebuild 3447 RMD160 8ada01748048d5d00967d02b2ddd627ead8af731 SHA1 4140e5cc42c27ef65ddc14779604eeb319c05093 SHA256 ff8e460858111f2ea8c13b5ec69e08aa22eae4600126a087d42b81c820dcc4b2
-MISC ChangeLog 9777 RMD160 b843b983b309b1ae5e48db228b8754eca2ae15c1 SHA1 5040c3b29142a0a9100570de343dfad2acee65c9 SHA256 5fb22d10baa3a37b46f0d10ebf20409d74063f0c5433a0206ac76161c854e774
+EBUILD puppet-0.25.4.ebuild 3478 RMD160 49a0a1fdec2c31321ce0e2f83cb46df101ea1061 SHA1 a1bdef47a3847b773ba82bcc70d7590369449dbf SHA256 a0716467092fa5277188507986a266ca00461e49e59eae52243ece84fd098c6d
+MISC ChangeLog 9962 RMD160 4e62ab0587879d733b34037402866aa6938e7e4e SHA1 256645a66eee10c9cc15d3fd80d0f755c680414e SHA256 c774f88d8ba86993340be1fe4f36136ffe4390ae0d265a6b36c69a7518725590
MISC metadata.xml 1104 RMD160 c2e40f737c1f334d2d4e7a34e1dba61b53ebdfff SHA1 ab42f340e0d8add11e9c4cd6c6791f3cc5ec6484 SHA256 c228b29cc44ea8fe2545f43d05688bc6364395adf7cf2d86290d25e86207fefb
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (GNU/Linux)
-iQIcBAEBAgAGBQJLXxEXAAoJECaGw+YFKA1pEhsP+wcY30ew5Esb0MKrn/F9jTxw
-Y4WRE32hf95DxxdThcCeyDeqpHqg+cHmzIe4a4h4qrol4VEEEA1fZRivseFsEMj7
-JBA2b0TF1FgfjXaHQOnEsS6+MSg9DvH7TQeXM3YUGkNyOVGtmrPiYBLwSN/IcRVF
-rcU4QO7FToJkMOP12yEYq9KOeUbvZvM8rVGEtq9YPbfzlsk+dI1LrvECG2FzXgIC
-SOQqoZ/NN/vhwJxlXVLT3/ycNVpBryB/uxybx1Sxk+4mtojqXE/ZfL2lFkrAjZES
-TRmuzxG4CiE5O6IHnLx+Hx/5KbeD3I6gPxGQT04huj0CZe9/x1m2KetFunFTXRkx
-LxiQCKH1k2OrBukInjGAPWGiKMfQHKdg7yD/psSkIpJ945Fz/ayhKMCvVGBdZwAR
-uMPU8wctX3TvXRch4oOS3iEM4i4jkjsR0Dq7WAXR2V/nXSljedQFD3IN6AUdIUPJ
-B10w+qPRkeHlBseOUSwCW8yQhBOnb+NS2E8K/ZdXUZ4MSWKUjneNUa+WhnGRiWvD
-eu6uKljmgZ8K687pFcrclCPym350OFIorlDRGjcETG3mxpiWV2kdduIYrrdwLsi8
-3cIUaSdb+IxOLiGzhwH9OU6MxJz2QIjRMMz1Hi2H7zsDapz4yu8Fo7+BS8hXjVOl
-T3pFlqv9qeR5k7PMD5G5
-=tVjz
+iQIcBAEBAgAGBQJLid1oAAoJECaGw+YFKA1pXDgQAK0aNcSKVNhs2ZU7qfkUa7PA
+P4SuENDPqAVxjSwYKecj2Lmmv95GtnzzKOrvMqLfS4KHzdD2ElpIGLkFw32XJZHf
+R4DYUR8gq6+upwJXgMGtDWknoe8CLHmyQVqAuhkivknM4L3I7pE+V8tu4/jzkDjW
+NVlSh/sZiAOfHKRKx/nEd01Uy5j+OVdBt+puurCzTgWOqCEaCiisZESbV517SenP
+Wzn2MjVuJbN9gUjFIxVrXorq5Hw4pIP4vQ5DUOX37RupXs9tCEsL4RdEuaQHx/0r
+nywYs+zi2CVGpJDM/O8LZzyTaeLslspPKahOcdzTKs3UL+p3rjgtSzWM0l5pZa0T
+Japw41Qhg4Dln+AndJfSUuTN/twMSXQFZx88ZsuDzRhWkGmX/fzQ3H+5yJHrYgZl
+lhSeSYGesMnlB/q9vQm3+ZCTVglzKwqwn4LvEhVMyYOY07hYh7cSNk6nGazuDw5b
+Lu/OJH3TND1bTc8pd3ic1TUVhTUTHOAGdj/dSUJxPy02Dq4V3u+6JZWwnYjHwnP4
+0gh5GP3zzdSxztBWrEfIkmqjnE/Nd9zO/sHP+bFYdejLg6qg85N5L4HmJsokoPIs
+0hTFlVINUtjn8PYV6sTg8vCkkLk0mNB+TWExZzQZX+kc91Ti4zz8bM3Z4opyWsPv
+AP1g/IkE3LQZ/AagY26O
+=auwa
-----END PGP SIGNATURE-----
diff --git a/app-admin/puppet/files/puppet-0.25.4-rrd.patch b/app-admin/puppet/files/puppet-0.25.4-rrd.patch
new file mode 100644
index 000000000000..ef0de5ad5c00
--- /dev/null
+++ b/app-admin/puppet/files/puppet-0.25.4-rrd.patch
@@ -0,0 +1,189 @@
+diff -Naur puppet-0.25.4.orig//lib/puppet/feature/base.rb puppet-0.25.4//lib/puppet/feature/base.rb
+--- puppet-0.25.4.orig//lib/puppet/feature/base.rb 2010-01-28 12:48:33.000000000 +0900
++++ puppet-0.25.4//lib/puppet/feature/base.rb 2010-02-28 11:36:28.000000000 +0900
+@@ -27,7 +27,7 @@
+ Puppet.features.add(:augeas, :libs => ["augeas"])
+
+ # We have RRD available
+-Puppet.features.add(:rrd, :libs => ["RRDtool"])
++Puppet.features.add(:rrd, :libs => ["RRD"])
+
+ # We have OpenSSL
+ Puppet.features.add(:openssl, :libs => ["openssl"])
+diff -Naur puppet-0.25.4.orig//lib/puppet/reports/rrdgraph.rb puppet-0.25.4//lib/puppet/reports/rrdgraph.rb
+--- puppet-0.25.4.orig//lib/puppet/reports/rrdgraph.rb 2010-01-28 12:48:34.000000000 +0900
++++ puppet-0.25.4//lib/puppet/reports/rrdgraph.rb 2010-02-28 11:35:34.000000000 +0900
+@@ -1,12 +1,13 @@
+ Puppet::Reports.register_report(:rrdgraph) do
+ desc "Graph all available data about hosts using the RRD library. You
+ must have the Ruby RRDtool library installed to use this report, which
+- you can get from `the RubyRRDTool RubyForge page`_. This package may also
+- be available as ``ruby-rrd`` or ``rrdtool-ruby`` in your distribution's package
++ is bundled in RRDtool, which you can get from `the RRDTool homepage`_.
++ This package may also be available as ``librrd-ruby``, ``ruby-rrd`` or
++ ``rrdtool-ruby`` in your distribution's package
+ management system. The library and/or package will both require the binary
+ ``rrdtool`` package from your distribution to be installed.
+
+- .. _the RubyRRDTool RubyForge page: http://rubyforge.org/projects/rubyrrdtool/
++ .. _the RRDTool homepage: http://oss.oetiker.ch/rrdtool/download.en.html
+
+ This report will create, manage, and graph RRD database files for each
+ of the metrics generated during transactions, and it will create a
+diff -Naur puppet-0.25.4.orig//lib/puppet/util/metric.rb puppet-0.25.4//lib/puppet/util/metric.rb
+--- puppet-0.25.4.orig//lib/puppet/util/metric.rb 2010-01-28 12:48:34.000000000 +0900
++++ puppet-0.25.4//lib/puppet/util/metric.rb 2010-02-28 11:35:34.000000000 +0900
+@@ -1,5 +1,6 @@
+ # included so we can test object types
+ require 'puppet'
++require 'RRD'
+
+ # A class for handling metrics. This is currently ridiculously hackish.
+ class Puppet::Util::Metric
+@@ -31,7 +32,6 @@
+
+ start ||= Time.now.to_i - 5
+
+- @rrd = RRDtool.new(self.path)
+ args = []
+
+ values.each { |value|
+@@ -42,14 +42,17 @@
+ args.push "RRA:AVERAGE:0.5:1:300"
+
+ begin
+- @rrd.create( Puppet[:rrdinterval].to_i, start, args)
++ RRD.create(self.path,
++ "--start", start.to_s,
++ "--step", Puppet[:rrdinterval].to_i,
++ *args)
+ rescue => detail
+ raise "Could not create RRD file %s: %s" % [path,detail]
+ end
+ end
+
+ def dump
+- puts @rrd.info
++ puts RRD.info(self.path)
+ end
+
+ def graph(range = nil)
+@@ -84,12 +87,12 @@
+ if range
+ args.push("--start",range[0],"--end",range[1])
+ else
+- args.push("--start", Time.now.to_i - time, "--end", Time.now.to_i)
++ args.push("--start", (Time.now.to_i - time).to_s, "--end", Time.now.to_i.to_s)
+ end
+
+ begin
+- #Puppet.warning "args = #{args}"
+- RRDtool.graph( args )
++ #Puppet.warning "args = #{args.join("|")}"
++ RRD.graph( * args )
+ rescue => detail
+ Puppet.err "Failed to graph %s: %s" % [self.name,detail]
+ end
+@@ -122,7 +125,6 @@
+ self.create(time - 5)
+ end
+
+- @rrd ||= RRDtool.new(self.path)
+
+ # XXX this is not terribly error-resistant
+ args = [time]
+@@ -135,7 +137,9 @@
+ arg = args.join(":")
+ template = temps.join(":")
+ begin
+- @rrd.update( template, [ arg ] )
++ RRD.update(self.path,
++ "--template", template,
++ arg )
+ #system("rrdtool updatev %s '%s'" % [self.path, arg])
+ rescue => detail
+ raise Puppet::Error, "Failed to update %s: %s" % [self.name,detail]
+diff -Naur puppet-0.25.4.orig//spec/unit/util/metric.rb puppet-0.25.4//spec/unit/util/metric.rb
+--- puppet-0.25.4.orig//spec/unit/util/metric.rb 2010-01-28 12:48:34.000000000 +0900
++++ puppet-0.25.4//spec/unit/util/metric.rb 2010-02-28 11:35:34.000000000 +0900
+@@ -7,6 +7,13 @@
+ describe Puppet::Util::Metric do
+ before do
+ @metric = Puppet::Util::Metric.new("foo")
++ #if we don't retrive it before the test the :rrddir test will
++ #fail at after
++ @basedir = @metric.basedir
++ end
++
++ after do
++ FileUtils.rm_rf(@basedir) if File.directory?(@basedir)
+ end
+
+ it "should be aliased to Puppet::Metric" do
+@@ -84,12 +91,46 @@
+ @metric[:foo].should be_nil
+ end
+
+- # LAK: I'm not taking the time to develop these tests right now.
+- # I expect they should actually be extracted into a separate class
+- # anyway.
+- it "should be able to graph metrics using RRDTool"
+-
+- it "should be able to create a new RRDTool database"
+-
+- it "should be able to store metrics into an RRDTool database"
++ it "should be able to graph metrics using RRDTool" do
++ ensure_rrd_folder
++ populate_metric
++ @metric.graph
++ end
++
++ it "should be able to create a new RRDTool database" do
++ ensure_rrd_folder
++ add_random_values_to_metric
++ @metric.create
++ File.exist?(@metric.path).should == true
++ end
++
++ it "should be able to store metrics into an RRDTool database" do
++ ensure_rrd_folder
++ populate_metric
++ File.exist?(@metric.path).should == true
++ end
++
++ def ensure_rrd_folder()
++ #in normal runs puppet does this for us (not sure where)
++ FileUtils.mkdir_p(@basedir) unless File.directory?(@basedir)
++ end
++
++ def populate_metric()
++ time = Time.now.to_i
++ time -= 100 * 1800
++ 200.times {
++ @metric = Puppet::Util::Metric.new("foo")
++ add_random_values_to_metric
++ @metric.store(time)
++ time += 1800
++ }
++ end
++
++ def add_random_values_to_metric()
++ @metric.values.clear
++ random_params = { :data1 => 10, :data2 => 30, :data3 => 100 }
++ random_params.each { | label, maxvalue |
++ @metric.newvalue(label, rand(maxvalue))
++ }
++ end
+ end
+diff -Naur puppet-0.25.4.orig//test/util/metrics.rb puppet-0.25.4//test/util/metrics.rb
+--- puppet-0.25.4.orig//test/util/metrics.rb 2010-01-28 12:48:34.000000000 +0900
++++ puppet-0.25.4//test/util/metrics.rb 2010-02-28 11:35:34.000000000 +0900
+@@ -53,6 +53,8 @@
+ report = Puppet::Transaction::Report.new
+ time = Time.now.to_i
+ start = time
++ #in normal runs puppet does this for us (not sure where)
++ Dir.mkdir(Puppet[:rrddir]) unless File.directory?(Puppet[:rrddir])
+ 10.times {
+ rundata(report, time)
+ time += 300
diff --git a/app-admin/puppet/puppet-0.25.4.ebuild b/app-admin/puppet/puppet-0.25.4.ebuild
new file mode 100644
index 000000000000..4f1dfbefa884
--- /dev/null
+++ b/app-admin/puppet/puppet-0.25.4.ebuild
@@ -0,0 +1,122 @@
+# Copyright 1999-2010 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/app-admin/puppet/puppet-0.25.4.ebuild,v 1.1 2010/02/28 03:04:54 matsuu Exp $
+
+EAPI="2"
+inherit elisp-common eutils ruby
+
+DESCRIPTION="A system automation and configuration management software"
+HOMEPAGE="http://reductivelabs.com/projects/puppet"
+SRC_URI="http://reductivelabs.com/downloads/${PN}/${P}.tar.gz"
+
+LICENSE="GPL-2"
+SLOT="0"
+IUSE="augeas emacs ldap rrdtool shadow vim-syntax"
+KEYWORDS="~amd64 ~ppc ~sparc ~x86"
+
+DEPEND="dev-lang/ruby[ssl]
+ emacs? ( virtual/emacs )
+ >=dev-ruby/facter-1.5.0"
+RDEPEND="${DEPEND}
+ >=app-portage/eix-0.18.0
+ augeas? ( dev-ruby/ruby-augeas )
+ ldap? ( dev-ruby/ruby-ldap )
+ rrdtool? ( >=net-analyzer/rrdtool-1.2.23[ruby] )
+ shadow? ( dev-ruby/ruby-shadow )"
+
+USE_RUBY="ruby18"
+
+SITEFILE="50${PN}-mode-gentoo.el"
+
+pkg_setup() {
+ enewgroup puppet
+ enewuser puppet -1 -1 /var/lib/puppet puppet
+}
+
+src_prepare() {
+ # Bug #294304
+ epatch "${FILESDIR}/${P}-rrd.patch"
+}
+
+src_compile() {
+ if use emacs ; then
+ elisp-compile ext/emacs/puppet-mode.el || die "elisp-compile failed"
+ fi
+}
+
+src_install() {
+ DESTDIR="${D}" ruby_einstall "$@" || die
+ DESTDIR="${D}" erubydoc || die
+
+ newinitd "${FILESDIR}"/puppetmaster-0.25.init puppetmaster || die
+ doconfd conf/gentoo/conf.d/puppetmaster || die
+ newinitd "${FILESDIR}"/puppet-0.25.init puppet || die
+ doconfd conf/gentoo/conf.d/puppet || die
+
+ # Initial configuration files
+ keepdir /etc/puppet/manifests || die
+ insinto /etc/puppet
+ doins conf/gentoo/puppet/* || die
+ doins conf/auth.conf || die
+
+ # Location of log and data files
+ keepdir /var/run/puppet || die
+ keepdir /var/log/puppet || die
+ keepdir /var/lib/puppet/ssl || die
+ keepdir /var/lib/puppet/files || die
+ fowners -R puppet:puppet /var/{run,log,lib}/puppet || die
+
+ if use emacs ; then
+ elisp-install ${PN} ext/emacs/puppet-mode.el* || die "elisp-install failed"
+ elisp-site-file-install "${FILESDIR}/${SITEFILE}" || die
+ fi
+
+ if use ldap ; then
+ insinto /etc/openldap/schema; doins ext/ldap/puppet.schema || die
+ fi
+
+ if use vim-syntax ; then
+ insinto /usr/share/vim/vimfiles/syntax; doins ext/vim/syntax/puppet.vim || die
+ insinto /usr/share/vim/vimfiles/ftdetect; doins ext/vim/ftdetect/puppet.vim || die
+ fi
+
+ # ext and examples files
+ for f in $(find ext examples -type f) ; do
+ docinto "$(dirname ${f})"; dodoc "${f}" || die
+ done
+ docinto conf; dodoc conf/namespaceauth.conf || die
+}
+
+pkg_postinst() {
+ elog
+ elog "Please, *don't* include the --ask option in EMERGE_EXTRA_OPTS as this could"
+ elog "cause puppet to hang while installing packages."
+ elog
+ elog "Puppet uses eix to get information about currently installed packages,"
+ elog "so please keep the eix metadata cache updated so puppet is able to properly"
+ elog "handle package installations."
+ elog
+ elog "Currently puppet only supports adding and removing services to the default"
+ elog "runlevel, if you want to add/remove a service from another runlevel you may"
+ elog "do so using symlinking."
+ elog
+
+ if [ \
+ -f "${ROOT}/etc/puppet/puppetd.conf" -o \
+ -f "${ROOT}/etc/puppet/puppetmaster.conf" -o \
+ -f "${ROOT}/etc/puppet/puppetca.conf" \
+ ] ; then
+ elog
+ elog "Please remove deprecated config files."
+ elog " /etc/puppet/puppetca.conf"
+ elog " /etc/puppet/puppetd.conf"
+ elog " /etc/puppet/puppetmasterd.conf"
+ elog
+ fi
+
+ use emacs && elisp-site-regen
+}
+
+pkg_postrm() {
+ use emacs && elisp-site-regen
+}