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