1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6unless (scalar @ARGV == 2) {
7    die "Please specify type and original binary file name: rpm fastnetmon-binary-git-0cfdfd5e2062ad94de24f2f383576ea48e6f3a07-debian-6.0.10-x86_64";
8}
9
10my $package_type = $ARGV[0];
11my $archive_name = $ARGV[1];
12
13if ($package_type eq 'rpm') {
14    build_rpm_package();
15} elsif ($package_type eq 'deb') {
16    build_deb_package();
17}
18
19sub build_rpm_package {
20    print "Install packages for crafting rpm packages\n";
21    `yum install -y rpmdevtools yum-utils`;
22
23    mkdir '/root/rpmbuild';
24    mkdir '/root/rpmbuild/SOURCES';
25
26    my $system_v_init_script = <<'DOC';
27#!/bin/bash
28#
29# fastnetmon        Startup script for FastNetMon
30#
31# chkconfig: - 85 15
32# description: FastNetMon - high performance DoS/DDoS analyzer with sflow/netflow/mirror support
33# processname: fastnemon
34# config: /etc/fastnetmon.conf
35# pidfile: /var/run/fastnetmon.pid
36#
37### BEGIN INIT INFO
38# Provides: fastnetmon
39# Required-Start: $local_fs $remote_fs $network
40# Required-Stop: $local_fs $remote_fs $network
41# Should-Start:
42# Short-Description: start and stop FastNetMon
43# Description:  high performance DoS/DDoS analyzer with sflow/netflow/mirror support
44### END INIT INFO
45
46# Source function library.
47. /etc/rc.d/init.d/functions
48
49# We do not use this configs
50#if [ -f /etc/sysconfig/fastnetmon ]; then
51#        . /etc/sysconfig/fastnetmon
52#fi
53
54
55FASTNETMON=/opt/fastnetmon/fastnetmon
56PROGNAME="fastnetmon"
57PIDFILE=/var/run/fastnetmon.pid
58RETVAL=0
59ARGS="--daemonize"
60
61start() {
62        echo -n $"Starting $PROGNAME: "
63        $FASTNETMON $ARGS > /dev/null 2>&1 && echo_success || echo_failure
64        RETVAL=$?
65        echo ""
66        return $RETVAL
67}
68
69stop() {
70        echo -n $"Stopping $PROGNAME: "
71        killproc -p $PIDFILE $FASTNETMON
72        RETVAL=$?
73        echo ""
74        rm -f $PIDFILE
75}
76reload() {
77    echo "Reloading is not supported now, sorry"
78    #echo -n $"Reloading $PROGNAME: "
79    #kill -HUP `cat $PIDFILE`
80}
81
82# See how we were called.
83case "$1" in
84  start)
85    start
86    ;;
87  stop)
88    stop
89    ;;
90  status)
91        status -p ${PIDFILE} $PROGNAME
92    RETVAL=$?
93    ;;
94  restart)
95    stop
96        sleep 1
97    start
98    ;;
99  reload)
100        reload
101    ;;
102  *)
103    echo $"Usage: $prog {start|stop|restart|reload|status}"
104    RETVAL=2
105esac
106
107exit $RETVAL
108DOC
109
110    my $systemd_init_script = <<'DOC';
111[Unit]
112Description=FastNetMon - DoS/DDoS analyzer with sflow/netflow/mirror support
113After=syslog.target network.target remote-fs.target
114
115[Service]
116Type=forking
117ExecStart=/opt/fastnetmon/fastnetmon --daemonize
118PIDFile=/run/fastnetmon.pid
119
120#ExecReload=/bin/kill -s HUP $MAINPID
121#ExecStop=/bin/kill -s QUIT $MAINPID
122
123[Install]
124WantedBy=multi-user.target
125DOC
126
127    my $rpm_sources_path = '/root/rpmbuild/SOURCES';
128
129    # Copy bundle to build tree
130    `cp $archive_name $rpm_sources_path/archive.tar.gz`;
131
132    `wget --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/fastnetmon/master/src/fastnetmon.conf -O$rpm_sources_path/fastnetmon.conf`;
133
134    open my $system_v_init_fl, ">", "$rpm_sources_path/system_v_init";
135    print {$system_v_init_fl} $system_v_init_script;
136    close $system_v_init_fl;
137
138    open my $systemd_init_fl, ">", "$rpm_sources_path/systemd_init";
139    print {$systemd_init_fl} $systemd_init_script;
140    close $systemd_init_fl;
141
142    # Create files list from archive
143    # ./luajit_2.0.4/
144    my @files_list = `tar -tf /root/rpmbuild/SOURCES/archive.tar.gz`;
145    chomp  @files_list;
146
147    # Replace path
148    @files_list = map { s#^\.#/opt#; $_ } @files_list;
149
150    # Filter out folders
151    @files_list = grep { ! m#/$# } @files_list;
152
153    my $systemd_spec_file = <<'DOC';
154#
155# Pre/post params: https://fedoraproject.org/wiki/Packaging:ScriptletSnippets
156#
157
158%global  fastnetmon_attackdir   %{_localstatedir}/log/fastnetmon_attacks
159%global  fastnetmon_user        root
160%global  fastnetmon_group       %{fastnetmon_user}
161%global  fastnetmon_config_path %{_sysconfdir}/fastnetmon.conf
162
163Name:              fastnetmon
164Version:           1.1.3
165Release:           1%{?dist}
166
167Summary:           A high performance DoS/DDoS load analyzer built on top of multiple packet capture engines (NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP).
168Group:             System Environment/Daemons
169License:           GPLv2
170URL:               https://fastnetmon.com
171
172# Top level fodler inside archive should be named as "fastnetmon-1.1.1"
173Source0:           http://178.62.227.110/fastnetmon_binary_repository/test_binary_builds/this_fake_path_do_not_check_it/archive.tar.gz
174
175# Disable any sort of dynamic dependency detection for our own custom bunch of binaries
176AutoReq:           no
177AutoProv:          no
178
179Requires:          libpcap, numactl, libicu
180Requires(pre):     shadow-utils
181Requires(post):    systemd
182Requires(preun):   systemd
183Requires(postun):  systemd
184Provides:          fastnetmon
185
186%description
187A high performance DoS/DDoS load analyzer built on top of multiple packet capture
188engines (NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP).
189
190%prep
191
192rm -rf fastnetmon-tree
193mkdir fastnetmon-tree
194mkdir fastnetmon-tree/opt
195tar -xvvf /root/rpmbuild/SOURCES/archive.tar.gz -C fastnetmon-tree/opt
196
197# Copy service scripts
198mkdir fastnetmon-tree/etc
199cp /root/rpmbuild/SOURCES/systemd_init fastnetmon-tree/etc
200cp /root/rpmbuild/SOURCES/fastnetmon.conf fastnetmon-tree/etc
201
202%build
203
204# We do not build anything
205exit 0
206
207%install
208
209mkdir %{buildroot}/opt
210cp -R fastnetmon-tree/opt/* %{buildroot}/opt
211chmod 755 %{buildroot}/opt/fastnetmon/fastnetmon
212chmod 755 %{buildroot}/opt/fastnetmon/fastnetmon_client
213
214# install init script
215install -p -D -m 0755 fastnetmon-tree/etc/systemd_init %{buildroot}%{_sysconfdir}/systemd/system/fastnetmon.service
216
217# install config
218install -p -D -m 0644 fastnetmon-tree/etc/fastnetmon.conf %{buildroot}%{fastnetmon_config_path}
219
220# Create log folder
221install -p -d -m 0700 %{buildroot}%{fastnetmon_attackdir}
222
223exit 0
224
225%pre
226
227exit 0
228
229%post
230
231%systemd_post fastnetmon.service
232
233if [ $1 -eq 1 ]; then
234    # It's install
235    # Enable autostart
236    /usr/bin/systemctl enable fastnetmon.service
237    /usr/bin/systemctl start fastnetmon.service
238fi
239
240
241#if [ $1 -eq 2 ]; then
242    # upgrade
243    #/sbin/service %{name} restart >/dev/null 2>&1
244#fi
245
246%preun
247
248%systemd_preun fastnetmon.service
249
250%postun
251
252%systemd_postun_with_restart fastnetmon.service
253
254%files
255#%doc LICENSE CHANGES README
256
257{files_list}
258
259%{_sysconfdir}/systemd/system
260%config(noreplace) %{_sysconfdir}/fastnetmon.conf
261%attr(700,%{fastnetmon_user},%{fastnetmon_group}) %dir %{fastnetmon_attackdir}
262
263%changelog
264* Mon Mar 23 2015 Pavel Odintsov <pavel.odintsov@gmail.com> - 1.1.1-1
265- First RPM package release
266DOC
267
268    my $spec_file = <<'DOC';
269#
270# Pre/post params: https://fedoraproject.org/wiki/Packaging:ScriptletSnippets
271#
272
273%global  fastnetmon_attackdir   %{_localstatedir}/log/fastnetmon_attacks
274%global  fastnetmon_user        root
275%global  fastnetmon_group       %{fastnetmon_user}
276%global  fastnetmon_config_path %{_sysconfdir}/fastnetmon.conf
277
278Name:              fastnetmon
279Version:           1.1.3
280Release:           1%{?dist}
281
282Summary:           A high performance DoS/DDoS load analyzer built on top of multiple packet capture engines (NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP).
283Group:             System Environment/Daemons
284License:           GPLv2
285URL:               https://fastnetmon.com
286
287# Top level fodler inside archive should be named as "fastnetmon-1.1.1"
288Source0:           http://178.62.227.110/fastnetmon_binary_repository/test_binary_builds/this_fake_path_do_not_check_it/archive.tar.gz
289
290# Disable any sort of dynamic dependency detection for our own custom bunch of binaries
291AutoReq:           no
292AutoProv:          no
293
294Requires:          libpcap, numactl, libicu
295Requires(pre):     shadow-utils
296Requires(post):    chkconfig
297Requires(preun):   chkconfig, initscripts
298Requires(postun):  initscripts
299Provides:          fastnetmon
300
301%description
302A high performance DoS/DDoS load analyzer built on top of multiple packet capture
303engines (NetFlow, IPFIX, sFLOW, netmap, PF_RING, PCAP).
304
305%prep
306
307rm -rf fastnetmon-tree
308mkdir fastnetmon-tree
309mkdir fastnetmon-tree/opt
310tar -xvvf /root/rpmbuild/SOURCES/archive.tar.gz -C fastnetmon-tree/opt
311
312# Copy service scripts
313mkdir fastnetmon-tree/etc
314cp /root/rpmbuild/SOURCES/system_v_init fastnetmon-tree/etc
315cp /root/rpmbuild/SOURCES/fastnetmon.conf fastnetmon-tree/etc
316
317%build
318
319# We do not build anything
320exit 0
321
322%install
323
324mkdir %{buildroot}/opt
325cp -R fastnetmon-tree/opt/* %{buildroot}/opt
326chmod 755 %{buildroot}/opt/fastnetmon/fastnetmon
327chmod 755 %{buildroot}/opt/fastnetmon/fastnetmon_client
328
329# install init script
330install -p -D -m 0755 fastnetmon-tree/etc/system_v_init %{buildroot}%{_initrddir}/fastnetmon
331
332# install config
333install -p -D -m 0644 fastnetmon-tree/etc/fastnetmon.conf %{buildroot}%{fastnetmon_config_path}
334
335# Create log folder
336install -p -d -m 0700 %{buildroot}%{fastnetmon_attackdir}
337
338exit 0
339
340%pre
341
342exit 0
343
344%post
345
346if [ $1 -eq 1 ]; then
347    # It's install
348    /sbin/chkconfig --add %{name}
349    /sbin/chkconfig %{name} on
350    /sbin/service %{name} start
351fi
352
353
354#if [ $1 -eq 2 ]; then
355    # upgrade
356    #/sbin/service %{name} restart >/dev/null 2>&1
357#fi
358
359%preun
360
361# Pre remove
362if [ $1 -eq 0 ]; then
363    # Uninstall
364    # Stops fastnetmon and disable it loading at startup
365    /sbin/service %{name} stop >/dev/null 2>&1
366    /sbin/chkconfig --del %{name}
367fi
368
369%postun
370# Post remove
371
372%files
373#%doc LICENSE CHANGES README
374
375{files_list}
376
377%{_initrddir}/fastnetmon
378%config(noreplace) %{_sysconfdir}/fastnetmon.conf
379%attr(700,%{fastnetmon_user},%{fastnetmon_group}) %dir %{fastnetmon_attackdir}
380
381%changelog
382* Mon Mar 23 2015 Pavel Odintsov <pavel.odintsov@gmail.com> - 1.1.1-1
383- First RPM package release
384DOC
385
386    my $selected_spec_file = $spec_file;
387
388    # For CentOS we use systemd
389    if ($archive_name =~ m/centos-7/) {
390        $selected_spec_file = $systemd_spec_file;
391    }
392
393    my $joined_file_list = join "\n", @files_list;
394    $selected_spec_file =~ s/\{files_list\}/$joined_file_list/;
395
396    open my $fl, ">", "generated_spec_file.spec" or die "Can't create spec file\n";
397    print {$fl} $selected_spec_file;
398    system("rpmbuild -bb generated_spec_file.spec");
399
400    mkdir "/tmp/result_data";
401    `cp /root/rpmbuild/RPMS/x86_64/* /tmp/result_data`;
402}
403
404sub build_deb_package {
405    print "We will build deb from $archive_name\n";
406
407    my $fastnetmon_systemd_unit = <<'DOC';
408[Unit]
409Description=FastNetMon - DoS/DDoS analyzer with sflow/netflow/mirror support
410After=network.target remote-fs.target
411
412[Service]
413Type=forking
414ExecStart=/opt/fastnetmon/fastnetmon --daemonize
415PIDFile=/run/fastnetmon.pid
416
417#ExecReload=/bin/kill -s HUP $MAINPID
418#ExecStop=/bin/kill -s QUIT $MAINPID
419
420[Install]
421WantedBy=multi-user.target
422DOC
423
424my $fastnetmon_systemv_init = <<'DOC';
425#!/bin/sh
426### BEGIN INIT INFO
427# Provides:          fastnetmon
428# Required-Start:    $local_fs $remote_fs $network $syslog
429# Required-Stop:     $local_fs $remote_fs $network $syslog
430# Default-Start:     2 3 4 5
431# Default-Stop:      0 1 6
432# Short-Description: Fast DDoS detection toolkit.
433# Description:       Fast DDoS detection toolkit with sFLOW/Netflow/netmap/pf_ring support.
434### END INIT INFO
435
436# test -r /etc/default/fastnetmon && . /etc/default/fastnetmon
437
438NAME="fastnetmon"
439
440. /lib/lsb/init-functions
441
442PIDFILE="/var/run/${NAME}.pid"
443DAEMON="/opt/fastnetmon/fastnetmon"
444
445DAEMON_OPTS="--daemonize"
446START_OPTS="--start --background --exec ${DAEMON} -- ${DAEMON_OPTS}"
447STOP_OPTS="--stop --pidfile ${PIDFILE}"
448STATUS_OPTS="--status --pidfile ${PIDFILE}"
449
450case "$1" in
451  start)
452        echo -n "Starting $NAME: "
453    start-stop-daemon $START_OPTS
454    echo "$NAME."
455        ;;
456  stop)
457        echo -n "Stopping $NAME: "
458    start-stop-daemon $STOP_OPTS
459        rm -f $PIDFILE
460    echo "$NAME."
461        ;;
462  restart)
463        $0 stop
464        sleep 2
465        $0 start
466        ;;
467  force-reload)
468        $0 restart
469        ;;
470# no support of status on Debian squeeze
471#  status)
472#   start-stop-daemon $STATUS_OPTS
473#   ;;
474  *)
475        N=/etc/init.d/$NAME
476        echo "Usage: $N {start|stop|restart}" >&2
477        exit 1
478        ;;
479esac
480
481exit 0
482DOC
483
484    # dpkg-deb: warning: '/tmp/tmp.gbd1VXGPQB/DEBIAN/control' contains user-defined field '#Standards-Version'
485my $fastnetmon_control_file = <<'DOC';
486Package: fastnetmon
487Maintainer: Pavel Odintsov <pavel.odintsov@gmail.com>
488Section: misc
489Priority: optional
490Architecture: amd64
491Version: 1.1.3
492Depends: libpcap0.8, libnuma1
493Description: Very fast DDoS analyzer with sflow/netflow/mirror support
494 FastNetMon - A high performance DoS/DDoS attack sensor.
495DOC
496
497    my $folder_for_build = `mktemp -d`;
498    chomp $folder_for_build;
499
500    unless (-e $folder_for_build) {
501        die "Can't create temp folder\n";
502    }
503
504    chdir $folder_for_build;
505
506    mkdir "$folder_for_build/DEBIAN";
507    put_text_to_file("$folder_for_build/DEBIAN/control", $fastnetmon_control_file);
508
509    # Create init files for different versions of Debian like OS
510    mkdir "$folder_for_build/etc";
511    mkdir "$folder_for_build/etc/init.d";
512
513    put_text_to_file("$folder_for_build/etc/init.d/fastnetmon", $fastnetmon_systemv_init);
514    chmod 0755, "$folder_for_build/etc/init.d/fastnetmon";
515
516    # systemd
517    mkdir "$folder_for_build/lib";
518    mkdir "$folder_for_build/lib/systemd";
519    mkdir "$folder_for_build/lib/systemd/system";
520
521    put_text_to_file("$folder_for_build/lib/systemd/system/fastnetmon.service", $fastnetmon_systemd_unit);
522
523    # Configuration file
524    put_text_to_file("$folder_for_build/DEBIAN/conffiles", "etc/fastnetmon.conf\n");
525
526    # Create folder for config
527    mkdir("$folder_for_build/etc");
528    print `wget --no-check-certificate https://raw.githubusercontent.com/pavel-odintsov/fastnetmon/master/src/fastnetmon.conf -O$folder_for_build/etc/fastnetmon.conf`;
529
530    `cp $archive_name $folder_for_build/archive.tar.gz`;
531
532    mkdir "$folder_for_build/opt";
533    print `tar -xf $folder_for_build/archive.tar.gz  -C $folder_for_build/opt`;
534    unlink("$folder_for_build/archive.tar.gz");
535
536    mkdir "/tmp/result_data";
537    system("dpkg-deb --build $folder_for_build /tmp/result_data/fastnetmon_package.deb");
538}
539
540sub put_text_to_file {
541    my ($path, $text) = @_;
542
543    open my $fl, ">", $path or die "Can't open $! for writing\n";
544    print {$fl} $text;
545    close $fl;
546}
547