]> git.pld-linux.org Git - packages/snort.git/blobdiff - snort.spec
- up to 2.9.18.1
[packages/snort.git] / snort.spec
index 5fd631d1e6cd0caf5dcfc13fbae18cca69ff9442..ddbdfaf3f3432340fc66ec0ef6dd2443a803c045 100644 (file)
@@ -1,59 +1,67 @@
 #
+# TODO: - snort rules - fix description
+#      - snort_inline - prepare separate sets of config-files, rules
+#        and startup script, adds some docs
+#
 # Conditional build:
-%bcond_without pgsql   # build without PostgreSQL storage support
-%bcond_without mysql   # build without MySQL storage support
-%bcond_without snmp    # build without SNMP support
-%bcond_with    inline  # build with inline support
+%bcond_with    registered      # build with rules available for registered users
 #
 Summary:       Network intrusion detection system (IDS/IPS)
-Summary(pl):   System wykrywania intruzów w sieciach (IDS/IPS)
-Summary(pt_BR):        Ferramenta de detecção de intrusos
-Summary(ru):   Snort - ÓÉÓÔÅÍÁ ÏÂÎÁÒÕÖÅÎÉÑ ÐÏÐÙÔÏË ×ÔÏÒÖÅÎÉÑ × ÓÅÔØ
-Summary(uk):   Snort - ÓÉÓÔÅÍÁ ×ÉÑ×ÌÅÎÎÑ ÓÐÒÏ ×ÔÏÒÇÎÅÎÎÑ × ÍÅÒÅÖÕ
+Summary(pl.UTF-8):     System wykrywania intruzów w sieciach (IDS/IPS)
+Summary(pt_BR.UTF-8):  Ferramenta de detecção de intrusos
+Summary(ru.UTF-8):     Snort - система обнаружения попыток вторжения в сеть
+Summary(uk.UTF-8):     Snort - система виявлення спроб вторгнення в мережу
 Name:          snort
-Version:       2.3.2
+Version:       2.9.18.1
 Release:       1
-License:       GPL
-Vendor:                Marty Roesch <roesch@sourcefire.com>
+License:       GPL v2 (vrt rules on VRT-License)
 Group:         Networking
-Source0:       http://www.snort.org/dl/current/%{name}-%{version}.tar.gz
-# Source0-md5: 692602827ce9d1a611630149f8e50ec8
-Source1:       http://www.snort.org/dl/rules/snortrules-snapshot-2_3.tar.gz
-# Source1-md5: d8bace8bd5210d1fbf4eb5c7ac460d70
-Source2:       %{name}.init
-Source3:       %{name}.logrotate
-Source4:       %{name}.conf
-Patch0:                %{name}-libnet1.patch
-Patch1:                %{name}-lib64.patch
+Source0:       http://www.snort.org/downloads/snort/%{name}-%{version}.tar.gz
+# Source0-md5: 2b4e30300ef6feca1f60c267e727c6c0
+Source1:       http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_pr/%{name}rules-pr-2.4.tar.gz
+# Source1-md5: 35d9a2486f8c0280bb493aa03c011927
+%if %{with registered}
+Source2:       http://www.snort.org/pub-bin/downloads.cgi/Download/vrt_os/%{name}rules-snapshot-2.6.tar.gz
+# NoSource2-md5:       0405ec828cf9ad85a03cbf670818f690
+NoSource:      2
+%endif
+Source3:       http://www.snort.org/pub-bin/downloads.cgi/Download/comm_rules/Community-Rules-2.4.tar.gz
+# Source3-md5: f236b8a4ac12e99d3e7bd81bf3b5a482
+Source4:       %{name}.init
+Source5:       %{name}.logrotate
+Patch0:                %{name}-link.patch
+Patch1:                %{name}-libdir.patch
 URL:           http://www.snort.org/
 BuildRequires: autoconf
 BuildRequires: automake
+BuildRequires: daq-static
+BuildRequires: libdnet-devel
+BuildRequires: libnetfilter_queue-devel
+BuildRequires: libnet-devel
 BuildRequires: libnet1-devel = 1.0.2a
 BuildRequires: libpcap-devel
-%{?with_mysql:BuildRequires:   mysql-devel}
-%{?with_snmp:BuildRequires:    net-snmp-devel >= 5.0.7}
+BuildRequires: libtirpc-devel
+BuildRequires: libtool
 BuildRequires: openssl-devel >= 0.9.7d
 BuildRequires: pcre-devel
-%{?with_pgsql:BuildRequires:   postgresql-devel}
-BuildRequires: rpmbuild(macros) >= 1.159
+BuildRequires: rpmbuild(macros) >= 1.202
+BuildRequires: rpmbuild(macros) >= 1.268
 BuildRequires: zlib-devel
-%{?with_inline:BuildRequires:  iptables-devel}
-PreReq:                rc-scripts >= 0.2.0
+Requires(post,preun):  /sbin/chkconfig
+Requires(postun):      /usr/sbin/groupdel
+Requires(postun):      /usr/sbin/userdel
 Requires(pre): /bin/id
 Requires(pre): /usr/bin/getgid
 Requires(pre): /usr/sbin/groupadd
 Requires(pre): /usr/sbin/useradd
-Requires(post,preun):  /sbin/chkconfig
-Requires(postun):      /usr/sbin/groupdel
-Requires(postun):      /usr/sbin/userdel
 Requires:      libnet1 = 1.0.2a
+Requires:      rc-scripts >= 0.2.0
 Provides:      group(snort)
-%{?with_mysql:Provides:        snort(mysql) = %{version}}
-%{?with_pgsql:Provides:        snort(pgsql) = %{version}}
 Provides:      user(snort)
+Obsoletes:     snort-rules
+Conflicts:     logrotate < 3.7-4
 BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
 
-%define                _sysconfdir     /etc/snort
 %define                _bindir         %{_sbindir}
 
 %description
@@ -72,136 +80,118 @@ or WinPopup messages to Windows clients using Samba's smbclient.
 Sourcefire VRT Certified Rules requires registration.
 https://www.snort.org/pub-bin/register.cgi
 
-%description -l pl
-Snort to bazuj±cy na open source NIDS (network intrusion detection
-systems) wykonuj±cy w czasie rzeczywistym analizê ruchu oraz logowanie
-pakietów w sieciach IP. Jego mo¿liwo¶ci to analiza protoko³u oraz
-zawarto¶ci w poszukiwaniu ró¿nego rodzaju ataków lub prób takich jak
-przepe³nienia bufora, skanowanie portów typu stealth, ataki CGI,
-próbkowanie SMB, OS fingerprinting i du¿o wiêcej. Snort u¿ywa
-elastycznego jêzyka regu³ek do opisu ruchu, który nale¿y
-przeanalizowaæ jak równie¿ silnika wykrywaj±cego, wykorzystuj±cego
-modu³ow± architekturê. Snort umo¿liwia alarmowanie w czasie
-rzeczywistym poprzez sysloga, osobny plik lub jako wiadomo¶æ WinPopup
+%description -l pl.UTF-8
+Snort to bazujący na open source NIDS (network intrusion detection
+systems) wykonujący w czasie rzeczywistym analizę ruchu oraz logowanie
+pakietów w sieciach IP. Jego możliwości to analiza protokołu oraz
+zawartości w poszukiwaniu różnego rodzaju ataków lub prób takich jak
+przepełnienia bufora, skanowanie portów typu stealth, ataki CGI,
+próbkowanie SMB, OS fingerprinting i dużo więcej. Snort używa
+elastycznego języka regułek do opisu ruchu, który należy
+przeanalizować jak również silnika wykrywającego, wykorzystującego
+modułową architekturę. Snort umożliwia alarmowanie w czasie
+rzeczywistym poprzez sysloga, osobny plik lub jako wiadomość WinPopup
 poprzez klienta Samby: smbclient.
 
-Regu³y certyfikowane poprzez Sourcefire wymagaj± rejestracji.
+Reguły certyfikowane poprzez Sourcefire wymagają rejestracji.
 https://www.snort.org/pub-bin/register.cgi
 
-%description -l pt_BR
-Snort é um sniffer baseado em libpcap que pode ser usado como um
-pequeno sistema de detecção de intrusos. Tem como característica o
-registro de pacotes baseado em regras e também pode executar uma
-análise do protocolo, pesquisa de padrões e detectar uma variedade de
+%description -l pt_BR.UTF-8
+Snort é um sniffer baseado em libpcap que pode ser usado como um
+pequeno sistema de detecção de intrusos. Tem como característica o
+registro de pacotes baseado em regras e também pode executar uma
+análise do protocolo, pesquisa de padrões e detectar uma variedade de
 assinaturas de ataques, como estouros de buffer, varreduras "stealth"
 de portas, ataques CGI, pesquisas SMB, tentativas de descobrir o
 sistema operacional e muito mais. Possui um sistema de alerta em tempo
 real, com alertas enviados para o syslog, um arquivo de alertas em
 separado ou como uma mensagem Winpopup.
 
-%description -l ru
-Snort - ÜÔÏ ÓÎÉÆÆÅÒ ÐÁËÅÔÏ×, ËÏÔÏÒÙÊ ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ËÁË ÓÉÓÔÅÍÁ
-ÏÂÎÁÒÕÖÅÎÉÑ ÐÏÐÙÔÏË ×ÔÏÒÖÅÎÉÑ × ÓÅÔØ. Snort ÐÏÄÄÅÒÖÉ×ÁÅÔ
ÒÏÔÏËÏÌÉÒÏ×ÁÎÉÅ ÐÁËÅÔÏ× ÎÁ ÏÓÎÏ×Å ÐÒÁ×ÉÌ, ÍÏÖÅÔ ×ÙÐÏÌÎÑÔØ ÁÎÁÌÉÚ
ÒÏÔÏËÏÌÏ×, ÐÏÉÓË × ÓÏÄÅÒÖÉÍÏÍ ÐÁËÅÔÏ×. íÏÖÅÔ ÔÁËÖÅ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÌÑ
-ÏÂÎÁÒÕÖÅÎÉÑ ÁÔÁË É "ÒÁÚ×ÅÄÏË", ÔÁËÉÈ ËÁË ÐÏÐÙÔËÉ ÁÔÁË ÔÉÐÁ
-"ÐÅÒÅÐÏÌÎÅÎÉÅ ÂÕÆÅÒÁ", ÓËÒÙÔÏÇÏ ÓËÁÎÉÒÏ×ÁÎÉÑ ÐÏÒÔÏ×, CGI ÁÔÁË, SMB
-ÒÁÚ×ÅÄÏË, ÐÏÐÙÔÏË ÏÂÎÁÒÕÖÅÎÉÑ ÔÉÐÁ ïó É ÍÎÏÇÏ ÄÒÕÇÏÇÏ. Snort ÍÏÖÅÔ
-ÉÎÆÏÒÍÉÒÏ×ÁÔØ Ï ÓÏÂÙÔÉÑÈ × ÒÅÁÌØÎÏÍ ×ÒÅÍÅÎÉ, ÐÏÓÙÌÁÑ ÓÏÏÂÝÅÎÉÑ ×
-syslog, ÏÔÄÅÌØÎÙÊ ÆÁÊÌ ÉÌÉ ËÁË WinPopup ÓÏÏÂÝÅÎÉÑ ÞÅÒÅÚ smbclient.
-
-%description -l uk
-Snort - ÃÅ ÓΦÆÅÒ ÐÁËÅÔ¦×, ÝÏ ÍÏÖÅ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉÓØ ÑË ÓÉÓÔÅÍÁ
-×ÉÑ×ÌÅÎÎÑ ÓÐÒÏ ×ÔÏÒÇÎÅÎØ × ÍÅÒÅÖÕ. Snort Ð¦ÄÔÒÉÍÕ¤ ÐÒÏÔÏËÏÌÀ×ÁÎÎÑ
ÁËÅԦנÎÁ ÏÓÎÏצ ÐÒÁ×ÉÌ, ÍÏÖÅ ×ÉËÏÎÕ×ÁÔÉ ÁÎÁ̦ڠÐÒÏÔÏËÏ̦×, ÐÏÛÕË Õ
-×ͦÓÔ¦ ÐÁËÅÔ¦×. íÏÖÅ ÔÁËÏÖ ×ÉËÏÒÉÓÔÏ×Õ×ÁÔÉÓØ ÄÌÑ ×ÉÑ×ÌÅÎÎÑ ÁÔÁË ÔÁ
-"ÒÏÚצÄÏË", ÔÁËÉÈ ÑË ÓÐÒÏÂÉ ÁÔÁË ÔÉÐÕ "ÐÅÒÅÐÏ×ÎÅÎÎÑ ÂÕÆÅÒÁ",
ÒÉÈÏ×ÁÎÏÇÏ ÓËÁÎÕ×ÁÎÎÑ ÐÏÒÔ¦×, CGI ÁÔÁË, SMB ÒÏÚצÄÏË, ÓÐÒÏ ×ÉÑ×ÌÅÎÎÑ
-ÔÉÐÕ ïó ÔÁ ÂÁÇÁÔÏ ¦ÎÛÏÇÏ. Snort ÍÏÖÅ ¦ÎÆÏÒÍÕ×ÁÔÉ ÐÒÏ ÐÏĦ§ × ÒÅÁÌØÎÏÍÕ
-ÞÁÓ¦, ÎÁÄÓÉÌÁÀÞÉ ÐÏצÄÏÍÌÅÎÎÑ ÄÏ syslog, ÏËÒÅÍÏÇÏ ÆÁÊÌÕ ÞÉ ÑË WinPopup
ÏצÄÏÍÌÅÎÎÑ ÞÅÒÅÚ smbclient.
+%description -l ru.UTF-8
+Snort - это сниффер пакетов, который может использоваться как система
+обнаружения попыток вторжения в сеть. Snort поддерживает
¿Ñ\80оÑ\82околиÑ\80ование Ð¿Ð°ÐºÐµÑ\82ов Ð½Ð° Ð¾Ñ\81нове Ð¿Ñ\80авил, Ð¼Ð¾Ð¶ÐµÑ\82 Ð²Ñ\8bполнÑ\8fÑ\82Ñ\8c Ð°Ð½Ð°Ð»Ð¸Ð·
¿Ñ\80оÑ\82околов, Ð¿Ð¾Ð¸Ñ\81к Ð² Ñ\81одеÑ\80жимом Ð¿Ð°ÐºÐµÑ\82ов. Ð\9cожеÑ\82 Ñ\82акже Ð¸Ñ\81полÑ\8cзоваÑ\82Ñ\8cÑ\81Ñ\8f Ð´Ð»Ñ\8f
+обнаружения атак и "разведок", таких как попытки атак типа
+"пеÑ\80еполнение Ð±Ñ\83Ñ\84еÑ\80а", Ñ\81кÑ\80Ñ\8bÑ\82ого Ñ\81каниÑ\80ованиÑ\8f Ð¿Ð¾Ñ\80Ñ\82ов, CGI Ð°Ñ\82ак, SMB
+разведок, попыток обнаружения типа ОС и много другого. Snort может
+информировать о событиях в реальном времени, посылая сообщения в
+syslog, отдельный файл или как WinPopup сообщения через smbclient.
+
+%description -l uk.UTF-8
+Snort - це сніфер пакетів, що може використовуватись як система
+виявлення спроб вторгнень в мережу. Snort підтримує протоколювання
¿Ð°ÐºÐµÑ\82Ñ\96в Ð½Ð° Ð¾Ñ\81новÑ\96 Ð¿Ñ\80авил, Ð¼Ð¾Ð¶Ðµ Ð²Ð¸ÐºÐ¾Ð½Ñ\83ваÑ\82и Ð°Ð½Ð°Ð»Ñ\96з Ð¿Ñ\80оÑ\82околÑ\96в, Ð¿Ð¾Ñ\88Ñ\83к Ñ\83
+вмісті пакетів. Може також використовуватись для виявлення атак та
+"розвідок", таких як спроби атак типу "переповнення буфера",
¿Ñ\80иÑ\85ованого Ñ\81канÑ\83ваннÑ\8f Ð¿Ð¾Ñ\80Ñ\82Ñ\96в, CGI Ð°Ñ\82ак, SMB Ñ\80озвÑ\96док, Ñ\81пÑ\80об Ð²Ð¸Ñ\8fвленнÑ\8f
+типу ОС та багато іншого. Snort може інформувати про події в реальному
+часі, надсилаючи повідомлення до syslog, окремого файлу чи як WinPopup
¿Ð¾Ð²Ñ\96домленнÑ\8f Ñ\87еÑ\80ез smbclient.
 
 %prep
-%setup -q -a1
+%setup -q %{!?with_registered:-a1} %{?with_registered:-a2} -a3
 %patch0 -p1
-%if "%{_libdir}" == "%{_prefix}/lib64"
-%patch1
-%endif
+%patch1 -p1
+
+sed -i "s#var\ RULE_PATH.*#var RULE_PATH /etc/snort/rules#g" rules/snort.conf
+_DIR=$(pwd)
+cd rules
+for I in community-*.rules; do
+       echo "include \$RULE_PATH/$I" >> snort.conf
+done
+cd $_DIR
 
 %build
-%{__aclocal}
+export CFLAGS="%{rpmcflags} -I/usr/include/tirpc"
+%{__libtoolize}
+%{__aclocal} -I m4
 %{__autoconf}
 %{__automake}
 # we don't need libnsl, so don't use it
 %configure \
        no_libnsl=yes \
-       --enable-smbalerts \
-       --enable-flexresp \
-       %{?with_inline:--enable-inline } \
-       %{?with_inline:--with-libipq-includes=/usr/include/libipq}  \
-       --with-libnet-includes=/usr/include/libnet1 \
-       --with%{!?with_snmp:out}-snmp \
-       --without-odbc \
-       --with%{!?with_pgsql:out}-postgresql \
-       --with%{!?with_mysql:out}-mysql
+       --enable-pthread \
+       --enable-so-with-static-lib \
+       --enable-control-socket \
+       --enable-side-channel \
+       --enable-build-dynamic-examples
 
 %{__make}
+%{__make} -C src/dynamic-plugins/sf_engine/examples
 
 %install
 rm -rf $RPM_BUILD_ROOT
-install -d $RPM_BUILD_ROOT/etc/{rc.d/init.d,%{name},cron.daily,logrotate.d} \
-       $RPM_BUILD_ROOT%{_var}/log/{%{name},archiv/%{name}} \
+install -d $RPM_BUILD_ROOT%{_initrddir} \
+       $RPM_BUILD_ROOT%{_sysconfdir}/{%{name},cron.daily,logrotate.d} \
+       $RPM_BUILD_ROOT%{_var}/log/{%{name},archive/%{name}} \
        $RPM_BUILD_ROOT%{_datadir}/mibs/site \
-       $RPM_BUILD_ROOT%{_sysconfdir}/rules
+       $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/rules
 
 %{__make} install \
        DESTDIR=$RPM_BUILD_ROOT
 
-install rules/*.config $RPM_BUILD_ROOT%{_sysconfdir}
-install etc/unicode.map        $RPM_BUILD_ROOT%{_sysconfdir}
-install rules/*.rules  $RPM_BUILD_ROOT%{_sysconfdir}/rules
-install %{SOURCE2}     $RPM_BUILD_ROOT/etc/rc.d/init.d/%{name}
-install %{SOURCE3}     $RPM_BUILD_ROOT/etc/logrotate.d/%{name}
-install %{SOURCE4}     $RPM_BUILD_ROOT%{_sysconfdir}
+install rules/*.config $RPM_BUILD_ROOT%{_sysconfdir}/%{name}
+install etc/unicode.map        $RPM_BUILD_ROOT%{_sysconfdir}/%{name}
+install rules/*.rules  $RPM_BUILD_ROOT%{_sysconfdir}/%{name}/rules
+install %{SOURCE4}     $RPM_BUILD_ROOT%{_initrddir}/%{name}
+install %{SOURCE5}     $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/%{name}
+install rules/snort.conf       $RPM_BUILD_ROOT%{_sysconfdir}/%{name}
 
 %clean
 rm -rf $RPM_BUILD_ROOT
 
 %pre
-if [ -n "`/usr/bin/getgid snort`" ]; then
-       if [ "`/usr/bin/getgid snort`" != "46" ]; then
-               echo "Error: group snort doesn't have gid=46. Correct this before installing %{name}." 1>&2
-               exit 1
-       fi
-else
-       /usr/sbin/groupadd -g 46 -r snort 1>&2
-fi
-if [ -n "`/bin/id -u snort 2>/dev/null`" ]; then
-       if [ "`/bin/id -u snort`" != "46" ]; then
-               echo "Error: user snort doesn't have uid=46. Correct this before installing %{name}." 1>&2
-               exit 1
-       fi
-else
-       /usr/sbin/useradd -u 46 -g snort -M -r -d %{_var}/log/snort \
-               -s /bin/false -c "SNORT" snort 1>&2
-fi
+%groupadd -g 46 -r snort
+%useradd -u 46 -g snort -M -r -d %{_var}/log/snort -s /bin/false -c "SNORT IDS/IPS" snort
 
 %post
-if [ "$1" = "1" ] ; then
-       /sbin/chkconfig --add snort
-fi
-if [ -f /var/lock/subsys/snort ]; then
-       /etc/rc.d/init.d/snort restart 1>&2
-else
-       echo "Run \"/etc/rc.d/init.d/snort start\" to start Snort daemon."
-fi
-
+/sbin/chkconfig --add snort
+%service snort restart
 
 %preun
 if [ "$1" = "0" ] ; then
-       if [ -f /var/lock/subsys/snort ]; then
-               /etc/rc.d/init.d/snort stop 1>&2
-       fi
+       %service snort stop
        /sbin/chkconfig --del snort
 fi
 
@@ -213,16 +203,22 @@ fi
 
 %files
 %defattr(644,root,root,755)
-%doc doc/{AUTHORS,BUGS,CREDITS,NEWS,PROBLEMS,README*,RULES.todo,TODO,USAGE,WISHLIST,*.pdf}
+%doc doc/{AUTHORS,BUGS,CREDITS,INSTALL,NEWS,PROBLEMS,README*,TODO,USAGE,WISHLIST,generators,*.pdf}
 %attr(755,root,root) %{_sbindir}/*
-%attr(770,root,snort) %dir %{_var}/log/snort
-%attr(770,root,snort) %dir %{_var}/log/archiv/%{name}
-%attr(750,root,snort) %dir %{_sysconfdir}
-%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/unicode.map
-%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/*.config
-%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/snort.conf
-%attr(750,root,snort) %dir %{_sysconfdir}/rules
-%attr(640,root,snort) %{_sysconfdir}/rules/*
-%attr(754,root,root) /etc/rc.d/init.d/%{name}
+%attr(770,root,snort) %dir %{_var}/log/%{name}
+%attr(770,root,snort) %dir %{_var}/log/archive/%{name}
+%attr(750,root,snort) %dir %{_sysconfdir}/%{name}
+%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/%{name}/unicode.map
+%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/%{name}/*.config
+%attr(640,root,snort) %config(noreplace) %verify(not md5 mtime size) %{_sysconfdir}/%{name}/%{name}.conf
+%attr(750,root,snort) %dir %{_sysconfdir}/%{name}/rules
+%attr(640,root,snort) %{_sysconfdir}/%{name}/rules/*
+%attr(754,root,root) %{_initrddir}/%{name}
 %attr(640,root,root) %config(noreplace) %verify(not md5 mtime size) /etc/logrotate.d/*
 %{_mandir}/man?/*
+%dir %{_libdir}/snort_dynamicengine
+%dir %{_libdir}/snort_dynamicpreprocessor
+%dir %{_libdir}/snort_dynamicrules
+%attr(755,root,root) %{_libdir}/snort_dynamicengine/libsf_engine.so*
+%attr(755,root,root) %{_libdir}/snort_dynamicpreprocessor/*.so*
+%attr(755,root,root) %{_libdir}/snort_dynamicrules/lib_sfdynamic_example_rule.so*
This page took 0.695894 seconds and 4 git commands to generate.