Compare commits
334 Commits
1.36.12_he
...
strftime_e
Author | SHA1 | Date |
---|---|---|
Steve Gilvarry | dcd2c16774 | |
Isaac Connor | 94c1b3445d | |
Isaac Connor | 03892796eb | |
Isaac Connor | 888d79706a | |
Isaac Connor | a99f9091fc | |
Isaac Connor | aae967e895 | |
Isaac Connor | 7748307c5a | |
Isaac Connor | d3cfd3c224 | |
Isaac Connor | 30fa641186 | |
Isaac Connor | 1cb9f98e9b | |
Isaac Connor | 160f775f91 | |
Isaac Connor | dd6adc08a8 | |
Isaac Connor | 4b1da156a0 | |
5472qaywsx | a7f13c82d5 | |
Andrea Vezzali | 2724a238e1 | |
Isaac Connor | fba7dba3d0 | |
Isaac Connor | 1700e2f919 | |
ColorfullyZhang | f5d8eaa2ad | |
ColorfullyZhang | 6009bba339 | |
Isaac Connor | e6f4cdb584 | |
Isaac Connor | 547fed2e22 | |
Mike Dussault | 3f97df72c8 | |
Isaac Connor | 1ee85caaae | |
Isaac Connor | d2cf89565e | |
Isaac Connor | 03f0762709 | |
Isaac Connor | bf5c0a8617 | |
Isaac Connor | 167dece604 | |
Isaac Connor | e140620900 | |
Isaac Connor | 7aa955abd2 | |
Isaac Connor | 503f0da9da | |
Andrea Vezzali | 3e5d377f7a | |
Andrea Vezzali | 966749ff86 | |
Isaac Connor | 58f933ba1e | |
Isaac Connor | a05560e797 | |
Isaac Connor | dd2a12675f | |
Andrea Vezzali | 97c10fc135 | |
Peter Keresztes Schmidt | 5fda85bf2e | |
Peter Keresztes Schmidt | ecf6cc80aa | |
Isaac Connor | 385d1602e0 | |
Isaac Connor | c2472894be | |
Isaac Connor | a9379e5813 | |
Isaac Connor | 009b3ceffc | |
Isaac Connor | e18f8019b0 | |
Isaac Connor | a44bbf8e34 | |
Isaac Connor | c5b097af0a | |
Isaac Connor | b2415643f6 | |
Isaac Connor | 68fc57ef7b | |
Isaac Connor | 4b8ac48590 | |
criadoperez | 4a717820b1 | |
criadoperez | 876fca188b | |
Isaac Connor | f576613c7d | |
Peter Keresztes Schmidt | 6e96cbe14a | |
Peter Keresztes Schmidt | 0ac060fb78 | |
Peter Keresztes Schmidt | 443b84270a | |
Peter Keresztes Schmidt | c9f162f70e | |
Peter Keresztes Schmidt | c83882a4c7 | |
Peter Keresztes Schmidt | 615e3dd76b | |
Peter Keresztes Schmidt | 5dc328e68b | |
Isaac Connor | 263a846251 | |
Isaac Connor | 440bb12a9a | |
Isaac Connor | 9d461203bd | |
Isaac Connor | 8c45739875 | |
Isaac Connor | fe6f71e1dc | |
Isaac Connor | 328bd15360 | |
Isaac Connor | 381fa0d08d | |
Isaac Connor | 8199554217 | |
Isaac Connor | 1a0d488457 | |
Isaac Connor | 6b481fa2b5 | |
Isaac Connor | d102732a7e | |
Isaac Connor | 048b8b13a3 | |
Isaac Connor | 6de8c71d2a | |
Isaac Connor | 4af979c842 | |
Isaac Connor | a52b9057ba | |
Isaac Connor | 11137f9b7a | |
gmanproxtreme | 84ccf10e65 | |
Isaac Connor | a4c079d1b3 | |
Isaac Connor | dbe16a9cb4 | |
Isaac Connor | 7c1c8482c6 | |
Isaac Connor | 2640791b89 | |
Isaac Connor | 848a537a0f | |
Isaac Connor | 4596f61250 | |
r01k | 79e041d0f0 | |
Isaac Connor | 4a5bc88882 | |
Isaac Connor | 68a7635d9b | |
Isaac Connor | 7a6c244aa7 | |
Isaac Connor | 89d7685b14 | |
Isaac Connor | 44823e0c94 | |
Isaac Connor | 8ddec91870 | |
Isaac Connor | 7127a944a1 | |
Isaac Connor | ba9a871daf | |
Isaac Connor | eb1124c406 | |
Isaac Connor | b9efe627f3 | |
Isaac Connor | e7e8996060 | |
Isaac Connor | c12d88d874 | |
Isaac Connor | 301d8fa5fa | |
Andrew Bauer | aa48133096 | |
Isaac Connor | 92a924044a | |
Isaac Connor | a311455526 | |
Isaac Connor | 248ca9a5f9 | |
Isaac Connor | cd3359c3eb | |
Isaac Connor | ccb4bb27dd | |
Isaac Connor | bae8d38301 | |
Isaac Connor | cb4e17e49a | |
Isaac Connor | 066bb891af | |
Isaac Connor | f0b2f75d91 | |
Isaac Connor | 672de6e84f | |
Isaac Connor | 500ced2dc5 | |
Isaac Connor | f2a1d06f64 | |
Isaac Connor | eecf568041 | |
Isaac Connor | 105851b70c | |
Isaac Connor | f236e25e22 | |
Isaac Connor | 1f1678064e | |
Isaac Connor | 222909feb3 | |
Isaac Connor | 7db25a5e1b | |
Isaac Connor | acdd8bb08b | |
Isaac Connor | a3a592d5e1 | |
Isaac Connor | 45bf28a104 | |
Isaac Connor | 7dc36f67db | |
Isaac Connor | 0bcbff5dd5 | |
Isaac Connor | bed41ca44b | |
Isaac Connor | 91903d2822 | |
Isaac Connor | 5bc9cfaa6a | |
Isaac Connor | 85d5dd806e | |
Isaac Connor | dffc7aa2fd | |
Peter Keresztes Schmidt | fb1849ff47 | |
Peter Keresztes Schmidt | cce4b0aac4 | |
Peter Keresztes Schmidt | 2c0cf7a5a7 | |
Peter Keresztes Schmidt | b5765b4535 | |
Peter Keresztes Schmidt | 7d84568b65 | |
Peter Keresztes Schmidt | 50b73cf3d2 | |
Peter Keresztes Schmidt | 4392198d14 | |
Isaac Connor | 9cb19005e5 | |
Steven Gilvarry | cb32630dc0 | |
anon8675309 | 47f171c75c | |
anon8675309 | 649b5585c4 | |
Isaac Connor | 75180f78e2 | |
Isaac Connor | 14047bc820 | |
Isaac Connor | 1766bbdfcd | |
Isaac Connor | b0cf3a4732 | |
Isaac Connor | 411a5181e6 | |
Peter Keresztes Schmidt | eaf2e51b0c | |
Peter Keresztes Schmidt | 80b08a2075 | |
Peter Keresztes Schmidt | 65656de6ce | |
Peter Keresztes Schmidt | c60b577aec | |
Peter Keresztes Schmidt | fc15afefcf | |
Peter Keresztes Schmidt | cf9c47149f | |
Isaac Connor | 2b6d54fd81 | |
Isaac Connor | 6373ef9be7 | |
Kendric Evans | 7e8a064725 | |
Isaac Connor | 415dce6548 | |
Pliable Pixels | 6c3f18a347 | |
Isaac Connor | e9845d96f4 | |
anon8675309 | c0875838af | |
anon8675309 | d927db1c0d | |
anon8675309 | f852f1716e | |
anon8675309 | 479385bac7 | |
anon8675309 | 1e834f6088 | |
anon8675309 | 1096fa3f87 | |
Andrew Bauer | 0edc91ffca | |
Andrew Bauer | ec861c5e2b | |
Andrew Bauer | db7c5df8c1 | |
Andrew Bauer | b59e911c43 | |
Isaac Connor | 9438445d74 | |
Isaac Connor | c3fb84bf88 | |
Isaac Connor | 29fb2d3885 | |
Peter Keresztes Schmidt | ea10939970 | |
Peter Keresztes Schmidt | 531694bf8d | |
Isaac Connor | cc2403924a | |
Isaac Connor | 94634f1ca7 | |
Isaac Connor | d221d6ab3b | |
Isaac Connor | da208457b8 | |
Isaac Connor | 0cbb132f08 | |
Isaac Connor | 9001327883 | |
Isaac Connor | 821031f10e | |
Isaac Connor | fa11c20bf8 | |
Peter Keresztes Schmidt | d69afc9672 | |
Peter Keresztes Schmidt | 6114d40593 | |
Peter Keresztes Schmidt | f675afc3f2 | |
Peter Keresztes Schmidt | 3e8b10d813 | |
Peter Keresztes Schmidt | c823b9c00e | |
Peter Keresztes Schmidt | 707975e567 | |
Peter Keresztes Schmidt | dff5452f11 | |
Peter Keresztes Schmidt | 335e950654 | |
Peter Keresztes Schmidt | 7c6a6ac309 | |
Peter Keresztes Schmidt | ce55ba5fb7 | |
Isaac Connor | c2f4d65860 | |
Isaac Connor | c56025beab | |
Isaac Connor | 9f8c8a2664 | |
Peter Keresztes Schmidt | f374b319e0 | |
Peter Keresztes Schmidt | 28d813b95a | |
Peter Keresztes Schmidt | ff8c9f67c1 | |
Peter Keresztes Schmidt | 1fe30c848d | |
Peter Keresztes Schmidt | b2ee71c96e | |
Peter Keresztes Schmidt | e1fe53338c | |
Peter Keresztes Schmidt | 8dae46bc75 | |
Peter Keresztes Schmidt | 95dd0c1491 | |
Isaac Connor | af46f8cad5 | |
Isaac Connor | 7878fbc878 | |
Isaac Connor | 786d0c553e | |
Isaac Connor | fd9bef228d | |
Peter Keresztes Schmidt | 07dbb75c56 | |
Isaac Connor | 46c730e27b | |
Isaac Connor | 268da411d9 | |
Isaac Connor | 4a40214f73 | |
Isaac Connor | 55f2a7f55e | |
Isaac Connor | 0301011f7e | |
Isaac Connor | afecd33879 | |
Isaac Connor | 91892c79b1 | |
Isaac Connor | 97d077d623 | |
Isaac Connor | dbb8019852 | |
Isaac Connor | 84035ef4f7 | |
Isaac Connor | 3d70e621b2 | |
Peter Keresztes Schmidt | b0b2f5fc16 | |
Peter Keresztes Schmidt | 44ace34593 | |
Peter Keresztes Schmidt | 48b1e8a055 | |
Peter Keresztes Schmidt | d8d27bcc92 | |
Peter Keresztes Schmidt | 6c68397249 | |
Peter Keresztes Schmidt | 46155942c1 | |
Peter Keresztes Schmidt | d64b57e63c | |
Peter Keresztes Schmidt | 7474294ac3 | |
Peter Keresztes Schmidt | 129bd3f907 | |
Peter Keresztes Schmidt | 154b17d5f3 | |
Peter Keresztes Schmidt | 2a32f75a24 | |
Steve Gilvarry | b29a785a7c | |
Peter Keresztes Schmidt | 07b81f446f | |
Peter Keresztes Schmidt | f1279a3ebf | |
Isaac Connor | dc6c00ba88 | |
Peter Keresztes Schmidt | 0d81199fc9 | |
Peter Keresztes Schmidt | 2d71743372 | |
Isaac Connor | f0e5eece18 | |
Isaac Connor | bbdf01880a | |
Peter Keresztes Schmidt | 73351f4387 | |
Peter Keresztes Schmidt | f9d859cad8 | |
Peter Keresztes Schmidt | 0625f6ca1c | |
Peter Keresztes Schmidt | 5c96eedac8 | |
Peter Keresztes Schmidt | 3d34e6f177 | |
Peter Keresztes Schmidt | 762476ec76 | |
Peter Keresztes Schmidt | a9ad5c5eee | |
Peter Keresztes Schmidt | 7d15396833 | |
Peter Keresztes Schmidt | 1a6904a297 | |
Peter Keresztes Schmidt | 70c626a30e | |
Peter Keresztes Schmidt | 0b7f9396b4 | |
Peter Keresztes Schmidt | 7d501a6585 | |
Isaac Connor | cca30661d7 | |
Isaac Connor | 9cce9744d2 | |
Isaac Connor | 9f685d6c2b | |
Peter Keresztes Schmidt | 32f139ef7f | |
Peter Keresztes Schmidt | db9b739562 | |
Isaac Connor | a78feb739e | |
Isaac Connor | b16eb510d0 | |
Isaac Connor | 205c488741 | |
Isaac Connor | d713770dea | |
Isaac Connor | 72d07d1428 | |
Isaac Connor | ad0e7a5c1a | |
Isaac Connor | fc6202d349 | |
Isaac Connor | 1b67074d35 | |
Xulunix | 2cbb24d7b9 | |
Isaac Connor | e4d3394888 | |
Isaac Connor | 9a03c2c16a | |
Isaac Connor | ed5262432f | |
Isaac Connor | 5529075fb3 | |
Peter Keresztes Schmidt | 0ea14317a4 | |
Peter Keresztes Schmidt | 7ec37405a6 | |
Peter Keresztes Schmidt | e724a93395 | |
Isaac Connor | bc3d1d161a | |
Peter Keresztes Schmidt | 81a1546a2b | |
Peter Keresztes Schmidt | f2bee0704a | |
Peter Keresztes Schmidt | ed7759897b | |
Isaac Connor | f8b779dc25 | |
Isaac Connor | cc3bce48b7 | |
Isaac Connor | c686fa5949 | |
Isaac Connor | d2941d6b87 | |
Isaac Connor | 50fe7100fa | |
Isaac Connor | 4825370a7f | |
Isaac Connor | 0bcb30b8a9 | |
Isaac Connor | fd21edb7a9 | |
Peter Keresztes Schmidt | f3cb14cc17 | |
Peter Keresztes Schmidt | 764f10bf82 | |
Isaac Connor | 4f2945bd57 | |
Peter Keresztes Schmidt | fead79185b | |
Isaac Connor | dab2792077 | |
Peter Keresztes Schmidt | 8129600a37 | |
Peter Keresztes Schmidt | 5d93555d9f | |
Peter Keresztes Schmidt | 9a983bb321 | |
Peter Keresztes Schmidt | 8b87830e3e | |
Peter Keresztes Schmidt | d2932b5d68 | |
Peter Keresztes Schmidt | 62f60b76d6 | |
Peter Keresztes Schmidt | 837b32ccff | |
Peter Keresztes Schmidt | 2bda413698 | |
Peter Keresztes Schmidt | a8b9d15d1b | |
Isaac Connor | 28a6a3e41e | |
Peter Keresztes Schmidt | e34b6500d9 | |
Peter Keresztes Schmidt | b8178dbb79 | |
Peter Keresztes Schmidt | 45654cb514 | |
Peter Keresztes Schmidt | caadc41bfd | |
Peter Keresztes Schmidt | b81689aa3f | |
Isaac Connor | 2e61ee4c95 | |
Peter Keresztes Schmidt | 339cfd49bc | |
Peter Keresztes Schmidt | e8adf5d331 | |
Isaac Connor | 09b0353592 | |
Isaac Connor | 855a81b975 | |
Isaac Connor | 096581b7f1 | |
Isaac Connor | 8511d814df | |
Isaac Connor | 195f9fc403 | |
Isaac Connor | 7417d32fbc | |
Isaac Connor | 16cc69ca2b | |
Isaac Connor | c590157431 | |
Peter Keresztes Schmidt | 8379ab70be | |
Isaac Connor | 824a6dc15b | |
Isaac Connor | 799a0ed7ba | |
Isaac Connor | 82c7474786 | |
Isaac Connor | a266388898 | |
Isaac Connor | 6e70eb5963 | |
Zoltan Gera | 714dd0aa9f | |
Isaac Connor | cf03bb9548 | |
Isaac Connor | 9e64b912a8 | |
Peter Keresztes Schmidt | 6b478484bd | |
Peter Keresztes Schmidt | d413f3c78f | |
Peter Keresztes Schmidt | 8a8dc48206 | |
Peter Keresztes Schmidt | 9f4e7178d4 | |
Peter Keresztes Schmidt | 0392828ef8 | |
Peter Keresztes Schmidt | e232b5d1a7 | |
Peter Keresztes Schmidt | 9900fc1273 | |
Peter Keresztes Schmidt | e5cac38521 | |
Peter Keresztes Schmidt | 93abbdf964 | |
Shao Yu-Lung (Allen) | 4a1d983ff1 | |
anon8675309 | b2391e952f | |
Isaac Connor | 317ce7692e | |
Isaac Connor | bc384d6fbe | |
Andrew Bauer | 2e12bc08cd | |
Andrew Bauer | 8d8b87743e | |
Peter Keresztes Schmidt | e881e97c06 | |
Andrew Bauer | eb387b5453 | |
Isaac Connor | f4ce2c1ea4 |
|
@ -1,17 +1,19 @@
|
|||
task:
|
||||
name: freebsd-build
|
||||
freebsd_instance:
|
||||
image_family: freebsd-12-2
|
||||
matrix:
|
||||
- image_family: freebsd-12-2
|
||||
- image_family: freebsd-13-0
|
||||
|
||||
prepare_script:
|
||||
- pkg install -yq git cmake jpeg-turbo mysql80-client ffmpeg libvncserver libjwt catch p5-DBI p5-DBD-mysql p5-Date-Manip p5-Test-LWP-UserAgent p5-Sys-Mmap
|
||||
- pkg install -yq git cmake pkgconf jpeg-turbo mysql80-client ffmpeg libvncserver libjwt catch p5-DBI p5-DBD-mysql p5-Date-Manip p5-Test-LWP-UserAgent p5-Sys-Mmap v4l_compat
|
||||
|
||||
configure_script:
|
||||
- git submodule update --init --recursive
|
||||
- mkdir build
|
||||
- cd build
|
||||
- cmake --version
|
||||
- cmake ../ -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1
|
||||
- cmake ../ -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DCMAKE_C_FLAGS="-Wno-deprecated-declarations" -DCMAKE_CXX_FLAGS="-Wno-deprecated-declarations"
|
||||
|
||||
build_script:
|
||||
- cd build
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
github: [connortechnology,pliablepixels] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: zoneminder # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
open_collective: zoneminder # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
|
|
|
@ -0,0 +1,51 @@
|
|||
name: CI Ubuntu Bionic (18.04)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
matrix:
|
||||
crypto_backend: [ openssl ]
|
||||
jwt_backend: [ libjwt, jwt_cpp ]
|
||||
include:
|
||||
- crypto_backend: openssl
|
||||
crypto_package: libssl-dev
|
||||
jwt_package: libjwt-dev
|
||||
runs-on: ubuntu-latest
|
||||
container: ubuntu:bionic
|
||||
|
||||
steps:
|
||||
- name: Update packages
|
||||
run: apt-get -qq update && apt-get -qq upgrade && apt-get -qq install software-properties-common
|
||||
- name: Install git
|
||||
run: |
|
||||
add-apt-repository ppa:git-core/ppa
|
||||
apt-get -qq update
|
||||
apt-get -qq install git
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: >
|
||||
apt-get -qq install make cmake g++
|
||||
default-libmysqlclient-dev
|
||||
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||
libpolkit-gobject-1-dev
|
||||
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,57 @@
|
|||
name: CI Debian Bullseye
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
matrix:
|
||||
crypto_backend: [ gnutls, openssl ]
|
||||
jwt_backend: [ libjwt, jwt_cpp ]
|
||||
include:
|
||||
- crypto_backend: gnutls
|
||||
crypto_package: libgnutls28-dev
|
||||
jwt_package: libjwt-gnutls-dev
|
||||
- crypto_backend: openssl
|
||||
crypto_package: libssl-dev
|
||||
jwt_package: libjwt-dev
|
||||
exclude:
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: jwt_cpp
|
||||
runs-on: ubuntu-latest
|
||||
container: debian:bullseye
|
||||
|
||||
steps:
|
||||
- name: Update packages
|
||||
run: apt-get -qq update && apt-get -qq upgrade
|
||||
- name: Install git
|
||||
run: apt-get -qq install git
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: >
|
||||
apt-get -qq install make cmake g++
|
||||
default-libmysqlclient-dev
|
||||
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||
libpolkit-gobject-1-dev
|
||||
catch2
|
||||
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
||||
- name: Run tests
|
||||
run: cd build/tests && ./tests "~[notCI]"
|
|
@ -0,0 +1,54 @@
|
|||
name: CI Debian Buster
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
strategy:
|
||||
matrix:
|
||||
crypto_backend: [ gnutls, openssl ]
|
||||
jwt_backend: [ libjwt, jwt_cpp ]
|
||||
include:
|
||||
- crypto_backend: gnutls
|
||||
crypto_package: libgnutls28-dev
|
||||
jwt_package: libjwt-gnutls-dev
|
||||
- crypto_backend: openssl
|
||||
crypto_package: libssl-dev
|
||||
jwt_package: libjwt-dev
|
||||
exclude:
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: jwt_cpp
|
||||
runs-on: ubuntu-latest
|
||||
container: debian:buster
|
||||
|
||||
steps:
|
||||
- name: Update packages
|
||||
run: apt-get -qq update && apt-get -qq upgrade
|
||||
- name: Install git
|
||||
run: apt-get -qq install git
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: >
|
||||
apt-get -qq install make cmake g++
|
||||
default-libmysqlclient-dev
|
||||
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||
libpolkit-gobject-1-dev
|
||||
${{ matrix.crypto_package }} ${{ matrix.jwt_package }}
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,39 @@
|
|||
name: CI CentOS 7
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
crypto_backend: [ gnutls, openssl ]
|
||||
jwt_backend: [ libjwt, jwt_cpp ]
|
||||
exclude:
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: jwt_cpp
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: libjwt
|
||||
runs-on: ubuntu-latest
|
||||
container: centos:7
|
||||
|
||||
steps:
|
||||
- name: Enable RPMFusion and EPEL
|
||||
run: yum -y install https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
|
||||
- name: Install git
|
||||
run: yum -y install https://repo.ius.io/ius-release-el7.rpm && yum -y install git224
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: yum -y update && yum -y install make cmake3 gcc-c++ mariadb-devel ffmpeg-devel libcurl-devel vlc-devel libvncserver-devel libjpeg-turbo-devel "perl(Date::Manip)" "perl(DBD::mysql)" "perl(ExtUtils::MakeMaker)" "perl(Sys::Mmap)" "perl(Sys::Syslog)" "perl(LWP::UserAgent)" polkit-devel libjwt-devel
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake3 --version && cmake3 .. -DBUILD_MAN=0 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -0,0 +1,41 @@
|
|||
name: CI CentOS 8
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
strategy:
|
||||
matrix:
|
||||
crypto_backend: [ gnutls, openssl ]
|
||||
jwt_backend: [ libjwt, jwt_cpp ]
|
||||
exclude:
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: jwt_cpp
|
||||
- crypto_backend: gnutls
|
||||
jwt_backend: libjwt
|
||||
runs-on: ubuntu-latest
|
||||
container: centos:8
|
||||
|
||||
steps:
|
||||
- name: Enable RPMFusion, EPEL and PowerTools
|
||||
run: yum -y install "dnf-command(config-manager)" https://mirrors.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm && yum config-manager --set-enabled powertools
|
||||
- name: Install git
|
||||
run: yum -y install git
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: yum -y update && yum -y install make cmake gcc-c++ catch-devel mariadb-devel ffmpeg-devel libcurl-devel vlc-devel libvncserver-devel libjpeg-turbo-devel "perl(Date::Manip)" "perl(DBD::mysql)" "perl(ExtUtils::MakeMaker)" "perl(Sys::Mmap)" "perl(Sys::Syslog)" "perl(LWP::UserAgent)" polkit-devel libjwt-devel
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DBUILD_TEST_SUITE=1 -DENABLE_WERROR=1 -DZM_CRYPTO_BACKEND=${{ matrix.crypto_backend }} -DZM_JWT_BACKEND=${{ matrix.jwt_backend }}
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
||||
- name: Run tests
|
||||
run: cd build/tests && ./tests "~[notCI]"
|
|
@ -0,0 +1,21 @@
|
|||
name: CI ESLint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
eslint:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install ESLint
|
||||
run: npm install eslint@5.12.0 eslint-config-google@0.11.0 eslint-plugin-html@5.0.0 eslint-plugin-php-markup@0.2.5
|
||||
- name: Run ESLint
|
||||
run: npx eslint --ext .php,.js .
|
|
@ -0,0 +1,40 @@
|
|||
name: CI Debian Stretch
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
runs-on: ubuntu-latest
|
||||
container: debian:stretch-backports
|
||||
|
||||
steps:
|
||||
- name: Update packages
|
||||
run: apt-get -qq update && apt-get -qq upgrade
|
||||
- name: Install git
|
||||
run: apt-get -qq install git/stretch-backports git-man/stretch-backports
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: >
|
||||
apt-get -qq install make cmake g++
|
||||
default-libmysqlclient-dev
|
||||
libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev
|
||||
libcurl4-gnutls-dev libvlc-dev libvncserver-dev
|
||||
libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libwww-perl
|
||||
libpolkit-gobject-1-dev
|
||||
libssl-dev
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -1,25 +0,0 @@
|
|||
name: CI Xenial
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-16.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Install dependencies
|
||||
run: sudo apt-get update && sudo apt-get install libavdevice-dev libcurl4-gnutls-dev libvlc-dev libvncserver-dev libdate-manip-perl libdbd-mysql-perl libsys-mmap-perl libpolkit-gobject-1-dev
|
||||
- name: Prepare
|
||||
run: mkdir build
|
||||
- name: Configure
|
||||
run: cd build && cmake --version && cmake .. -DBUILD_MAN=0 -DENABLE_WERROR=1
|
||||
- name: Build
|
||||
run: cd build && make -j3 | grep --line-buffered -Ev '^(cp lib\/|Installing.+\.pm)' && (exit ${PIPESTATUS[0]})
|
|
@ -52,8 +52,8 @@ jobs:
|
|||
git submodule init
|
||||
git submodule update --init --recursive
|
||||
sudo apt-get update
|
||||
sudo apt-get install libavdevice-dev libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libjwt-gnutls-dev
|
||||
sudo apt-get install libbz2-dev libgcrypt20-dev libcurl4-gnutls-dev libjpeg-turbo8-dev libturbojpeg0-dev
|
||||
sudo apt-get install libavcodec-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev libjwt-gnutls-dev
|
||||
sudo apt-get install libbz2-dev libcurl4-gnutls-dev libjpeg-turbo8-dev libturbojpeg0-dev
|
||||
sudo apt-get install default-libmysqlclient-dev libpcre3-dev libpolkit-gobject-1-dev libv4l-dev libvlc-dev
|
||||
sudo apt-get install libdate-manip-perl libdbd-mysql-perl libphp-serialization-perl libsys-mmap-perl
|
||||
sudo apt-get install libwww-perl libdata-uuid-perl libssl-dev libcrypt-eksblowfish-perl libdata-entropy-perl
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
name: Create packages
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '*'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
package:
|
||||
strategy:
|
||||
matrix:
|
||||
os_dist:
|
||||
- os: debian
|
||||
dist: buster
|
||||
- os: debian
|
||||
dist: bullseye
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Run packpack
|
||||
env:
|
||||
SMPFLAGS: -j4
|
||||
OS: ${{ matrix.os_dist.os }}
|
||||
DIST: ${{ matrix.os_dist.dist }}
|
||||
DOCKER_REPO: iconzm/packpack
|
||||
run: utils/packpack/startpackpack.sh
|
|
@ -124,6 +124,7 @@ src/zmc
|
|||
src/zmf
|
||||
src/zms
|
||||
src/zmu
|
||||
src/zm_rtsp_server
|
||||
src/zoneminder-zmc.8
|
||||
src/zoneminder-zmc.8.gz
|
||||
src/zoneminder-zmf.8
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
default:
|
||||
image:
|
||||
name: ubuntu:latest
|
||||
before_script:
|
||||
- apt-get update -yq
|
||||
- DEBIAN_FRONTEND=noninteractive apt-get install -yq devscripts sudo
|
||||
|
||||
deb:
|
||||
stage: build
|
||||
tags:
|
||||
- docker
|
||||
script:
|
||||
- yes "" | ./utils/do_debian_package.sh --snapshot=stable --type=binary --interactive=no --dput=no --debbuild-extra=--no-sign || true
|
||||
timeout: 2h
|
||||
artifacts:
|
||||
paths:
|
||||
- '*.deb'
|
||||
expire_in: 1 week
|
58
.travis.yml
58
.travis.yml
|
@ -1,58 +0,0 @@
|
|||
language: cpp
|
||||
sudo: required
|
||||
dist: bionic
|
||||
git:
|
||||
depth: 9999999
|
||||
notifications:
|
||||
irc: chat.freenode.net#zoneminder-dev
|
||||
branches:
|
||||
except:
|
||||
- modern
|
||||
cache: ccache
|
||||
addons:
|
||||
ssh_known_hosts: zmrepo.zoneminder.com
|
||||
apt:
|
||||
sources:
|
||||
- sourceline: ppa:iconnor/zoneminder-master
|
||||
- key_url: http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x4D0BF748776FFB04
|
||||
packages:
|
||||
- gdebi
|
||||
- yum-utils
|
||||
- patch
|
||||
- git
|
||||
- curl
|
||||
- sshfs
|
||||
- sed
|
||||
- binfmt-support
|
||||
- qemu
|
||||
- qemu-user-static
|
||||
- dnsutils
|
||||
- traceroute
|
||||
install:
|
||||
- update-binfmts --enable qemu-arm
|
||||
|
||||
env:
|
||||
- SMPFLAGS=-j4 OS=eslint DIST=eslint
|
||||
- SMPFLAGS=-j4 OS=ubuntu DIST=bionic DOCKER_REPO=iconzm/packpack
|
||||
|
||||
compiler:
|
||||
- gcc
|
||||
services:
|
||||
- mysql
|
||||
- docker
|
||||
|
||||
script:
|
||||
- utils/packpack/startpackpack.sh
|
||||
|
||||
before_deploy:
|
||||
- openssl aes-256-cbc -K $encrypted_62a62750aa73_key -iv $encrypted_62a62750aa73_iv -in ./utils/packpack/deploy_rsa.enc -out /tmp/deploy_rsa -d
|
||||
- eval "$(ssh-agent -s)"
|
||||
- chmod 600 /tmp/deploy_rsa
|
||||
- ssh-add /tmp/deploy_rsa
|
||||
|
||||
deploy:
|
||||
provider: script
|
||||
skip_cleanup: true
|
||||
script: utils/packpack/rsync_xfer.sh
|
||||
on:
|
||||
branch: master
|
271
CMakeLists.txt
271
CMakeLists.txt
|
@ -69,9 +69,7 @@ include(GNUInstallDirs)
|
|||
include(CheckIncludeFile)
|
||||
include(CheckIncludeFiles)
|
||||
include(CheckFunctionExists)
|
||||
include(CheckPrototypeDefinition_fixed)
|
||||
include(CheckTypeSize)
|
||||
include(CheckStructHasMember)
|
||||
include(CheckSendfile)
|
||||
|
||||
# Configuration options
|
||||
|
@ -192,6 +190,24 @@ set(ZM_MANPAGE_DEST_PREFIX "share/man" CACHE PATH
|
|||
set(ZM_CAKEPHP_CACHE "Apc" CACHE STRING
|
||||
"Set the CakePHP cache engine, default: Apc")
|
||||
|
||||
# Supported crypto backends. Using OpenSSL by default to be compatible with jwt-cpp.
|
||||
set(ZM_CRYPTO_BACKEND_OPTIONS gnutls openssl)
|
||||
set(ZM_CRYPTO_BACKEND openssl CACHE STRING "Determines which crypto backend should be used.")
|
||||
set_property(CACHE ZM_CRYPTO_BACKEND PROPERTY STRINGS ${ZM_CRYPTO_BACKEND_OPTIONS})
|
||||
|
||||
if(NOT ZM_CRYPTO_BACKEND IN_LIST ZM_CRYPTO_BACKEND_OPTIONS)
|
||||
message(FATAL_ERROR "Invalid value for ZM_CRYPTO_BACKEND. Possible options: ${ZM_CRYPTO_BACKEND_OPTIONS}")
|
||||
endif()
|
||||
|
||||
# Supported JWT backends. Using jwt-cpp as default.
|
||||
set(ZM_JWT_BACKEND_OPTIONS libjwt jwt_cpp)
|
||||
set(ZM_JWT_BACKEND jwt_cpp CACHE STRING "Determines which JWT backend should be used.")
|
||||
set_property(CACHE ZM_JWT_BACKEND PROPERTY STRINGS ${ZM_JWT_BACKEND_OPTIONS})
|
||||
|
||||
if(NOT ZM_JWT_BACKEND IN_LIST ZM_JWT_BACKEND_OPTIONS)
|
||||
message(FATAL_ERROR "Invalid value for ZM_JWT_BACKEND. Possible options: ${ZM_JWT_BACKEND_OPTIONS}")
|
||||
endif()
|
||||
|
||||
# Reassign some variables if a target distro has been specified
|
||||
if(ZM_TARGET_DISTRO MATCHES "^fc")
|
||||
set(ZM_CAKEPHP_CACHE "Memcached")
|
||||
|
@ -252,11 +268,6 @@ if(ZM_SYSTEMD OR (IS_DIRECTORY /usr/lib/systemd/system) OR (IS_DIRECTORY /lib/sy
|
|||
endif()
|
||||
|
||||
# System checks
|
||||
check_include_file("libv4l1-videodev.h" HAVE_LIBV4L1_VIDEODEV_H)
|
||||
if(NOT HAVE_LIBV4L1_VIDEODEV_H)
|
||||
check_include_file("linux/videodev.h" HAVE_LINUX_VIDEODEV_H)
|
||||
endif()
|
||||
check_include_file("linux/videodev2.h" HAVE_LINUX_VIDEODEV2_H)
|
||||
check_include_file("execinfo.h" HAVE_EXECINFO_H)
|
||||
if(HAVE_EXECINFO_H)
|
||||
check_function_exists("backtrace" HAVE_DECL_BACKTRACE)
|
||||
|
@ -336,19 +347,20 @@ else()
|
|||
"ZoneMinder requires jpeg but it was not found on your system")
|
||||
endif()
|
||||
|
||||
# LIBJWT
|
||||
find_package(LibJWT)
|
||||
if(LIBJWT_FOUND)
|
||||
set(HAVE_LIBJWT 1)
|
||||
set(optlibsfound "${optlibsfound} LIBJWT")
|
||||
list(APPEND ZM_BIN_LIBS "${LIBJWT_LIBRARY}")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} LIBJWT")
|
||||
# libjwt
|
||||
if (${ZM_JWT_BACKEND} STREQUAL "libjwt")
|
||||
find_package(LibJWT REQUIRED COMPONENTS ${ZM_CRYPTO_BACKEND})
|
||||
if(LIBJWT_FOUND)
|
||||
set(HAVE_LIBJWT 1)
|
||||
set(optlibsfound "${optlibsfound} LIBJWT")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} LIBJWT")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# gnutls (using find_library and find_path)
|
||||
if(HAVE_LIBJWT)
|
||||
find_library(GNUTLS_LIBRARIES gnutls)
|
||||
# GnuTLS
|
||||
if (${ZM_CRYPTO_BACKEND} STREQUAL "gnutls")
|
||||
find_library(GNUTLS_LIBRARIES gnutls REQUIRED)
|
||||
if(GNUTLS_LIBRARIES)
|
||||
set(HAVE_LIBGNUTLS 1)
|
||||
list(APPEND ZM_BIN_LIBS "${GNUTLS_LIBRARIES}")
|
||||
|
@ -358,23 +370,18 @@ if(HAVE_LIBJWT)
|
|||
set(CMAKE_REQUIRED_INCLUDES "${GNUTLS_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE GNUTLS_LIBRARIES GNUTLS_INCLUDE_DIR)
|
||||
check_include_file("gnutls/gnutls.h" HAVE_GNUTLS_GNUTLS_H)
|
||||
set(optlibsfound "${optlibsfound} GnuTLS")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} GnuTLS")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# OpenSSL
|
||||
if(NOT HAVE_LIBGNUTLS OR NOT HAVE_LIBJWT)
|
||||
find_package(OpenSSL)
|
||||
elseif (${ZM_CRYPTO_BACKEND} STREQUAL "openssl")
|
||||
find_package(OpenSSL REQUIRED)
|
||||
if(OPENSSL_FOUND)
|
||||
set(HAVE_LIBOPENSSL 1)
|
||||
set(HAVE_LIBCRYPTO 1)
|
||||
list(APPEND ZM_BIN_LIBS "${OPENSSL_LIBRARIES}")
|
||||
include_directories("${OPENSSL_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
||||
check_include_file("openssl/md5.h" HAVE_OPENSSL_MD5_H)
|
||||
set(optlibsfound "${optlibsfound} OpenSSL")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} OpenSSL")
|
||||
|
@ -417,23 +424,6 @@ else()
|
|||
set(optlibsnotfound "${optlibsnotfound} PCRE")
|
||||
endif()
|
||||
|
||||
# gcrypt (using find_library and find_path)
|
||||
find_library(GCRYPT_LIBRARIES gcrypt)
|
||||
if(GCRYPT_LIBRARIES)
|
||||
set(HAVE_LIBGCRYPT 1)
|
||||
list(APPEND ZM_BIN_LIBS "${GCRYPT_LIBRARIES}")
|
||||
find_path(GCRYPT_INCLUDE_DIR gcrypt.h)
|
||||
if(GCRYPT_INCLUDE_DIR)
|
||||
include_directories("${GCRYPT_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${GCRYPT_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE GCRYPT_LIBRARIES GCRYPT_INCLUDE_DIR)
|
||||
check_include_file("gcrypt.h" HAVE_GCRYPT_H)
|
||||
set(optlibsfound "${optlibsfound} GCrypt")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} GCrypt")
|
||||
endif()
|
||||
|
||||
# mysqlclient (using find_library and find_path)
|
||||
find_library(MYSQLCLIENT_LIBRARIES mysqlclient PATH_SUFFIXES mysql)
|
||||
if(MYSQLCLIENT_LIBRARIES)
|
||||
|
@ -453,129 +443,19 @@ else()
|
|||
message(FATAL_ERROR "ZoneMinder requires mysqlclient but it was not found on your system")
|
||||
endif()
|
||||
|
||||
find_package(FFMPEG 55.34.100 REQUIRED
|
||||
COMPONENTS
|
||||
avcodec
|
||||
avformat
|
||||
avutil
|
||||
swresample
|
||||
swscale)
|
||||
|
||||
set(CMAKE_REQUIRED_INCLUDES ${FFMPEG_avutil_INCLUDE_DIRS})
|
||||
check_include_file("libavutil/hwcontext.h" HAVE_LIBAVUTIL_HWCONTEXT_H)
|
||||
|
||||
set(PATH_FFMPEG "")
|
||||
set(OPT_FFMPEG "no")
|
||||
# avformat (using find_library and find_path)
|
||||
find_library(AVFORMAT_LIBRARIES avformat)
|
||||
if(AVFORMAT_LIBRARIES)
|
||||
set(HAVE_LIBAVFORMAT 1)
|
||||
list(APPEND ZM_BIN_LIBS "${AVFORMAT_LIBRARIES}")
|
||||
find_path(AVFORMAT_INCLUDE_DIR "libavformat/avformat.h" /usr/include/ffmpeg)
|
||||
if(AVFORMAT_INCLUDE_DIR)
|
||||
include_directories("${AVFORMAT_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${AVFORMAT_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE AVFORMAT_LIBRARIES AVFORMAT_INCLUDE_DIR)
|
||||
check_include_file("libavformat/avformat.h" HAVE_LIBAVFORMAT_AVFORMAT_H)
|
||||
set(optlibsfound "${optlibsfound} AVFormat")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} AVFormat")
|
||||
endif()
|
||||
|
||||
# avcodec (using find_library and find_path)
|
||||
find_library(AVCODEC_LIBRARIES avcodec)
|
||||
if(AVCODEC_LIBRARIES)
|
||||
set(HAVE_LIBAVCODEC 1)
|
||||
list(APPEND ZM_BIN_LIBS "${AVCODEC_LIBRARIES}")
|
||||
find_path(AVCODEC_INCLUDE_DIR "libavcodec/avcodec.h" /usr/include/ffmpeg)
|
||||
if(AVCODEC_INCLUDE_DIR)
|
||||
include_directories("${AVCODEC_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${AVCODEC_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE AVCODEC_LIBRARIES AVCODEC_INCLUDE_DIR)
|
||||
check_include_file("libavcodec/avcodec.h" HAVE_LIBAVCODEC_AVCODEC_H)
|
||||
set(optlibsfound "${optlibsfound} AVCodec")
|
||||
else()
|
||||
message(WARNING "\nWhile it should be possible to build ZM without AVCODEC the result will pretty useless.")
|
||||
set(optlibsnotfound "${optlibsnotfound} AVCodec")
|
||||
endif()
|
||||
|
||||
# avdevice (using find_library and find_path)
|
||||
find_library(AVDEVICE_LIBRARIES avdevice)
|
||||
if(AVDEVICE_LIBRARIES)
|
||||
set(HAVE_LIBAVDEVICE 1)
|
||||
list(APPEND ZM_BIN_LIBS "${AVDEVICE_LIBRARIES}")
|
||||
find_path(AVDEVICE_INCLUDE_DIR "libavdevice/avdevice.h" /usr/include/ffmpeg)
|
||||
if(AVDEVICE_INCLUDE_DIR)
|
||||
include_directories("${AVDEVICE_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${AVDEVICE_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE AVDEVICE_LIBRARIES AVDEVICE_INCLUDE_DIR)
|
||||
check_include_file("libavdevice/avdevice.h" HAVE_LIBAVDEVICE_AVDEVICE_H)
|
||||
set(optlibsfound "${optlibsfound} AVDevice")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} AVDevice")
|
||||
endif()
|
||||
|
||||
# avutil (using find_library and find_path)
|
||||
find_library(AVUTIL_LIBRARIES avutil)
|
||||
if(AVUTIL_LIBRARIES)
|
||||
set(HAVE_LIBAVUTIL 1)
|
||||
list(APPEND ZM_BIN_LIBS "${AVUTIL_LIBRARIES}")
|
||||
find_path(AVUTIL_INCLUDE_DIR "libavutil/avutil.h" /usr/include/ffmpeg)
|
||||
if(AVUTIL_INCLUDE_DIR)
|
||||
include_directories("${AVUTIL_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${AVUTIL_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE AVUTIL_LIBRARIES AVUTIL_INCLUDE_DIR)
|
||||
check_include_file("libavutil/avutil.h" HAVE_LIBAVUTIL_AVUTIL_H)
|
||||
check_include_file("libavutil/mathematics.h" HAVE_LIBAVUTIL_MATHEMATICS_H)
|
||||
check_include_file("libavutil/hwcontext.h" HAVE_LIBAVUTIL_HWCONTEXT_H)
|
||||
set(optlibsfound "${optlibsfound} AVUtil")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} AVUtil")
|
||||
endif()
|
||||
|
||||
# swscale (using find_library and find_path)
|
||||
find_library(SWSCALE_LIBRARIES swscale)
|
||||
if(SWSCALE_LIBRARIES)
|
||||
set(HAVE_LIBSWSCALE 1)
|
||||
list(APPEND ZM_BIN_LIBS "${SWSCALE_LIBRARIES}")
|
||||
find_path(SWSCALE_INCLUDE_DIR "libswscale/swscale.h" /usr/include/ffmpeg)
|
||||
if(SWSCALE_INCLUDE_DIR)
|
||||
include_directories("${SWSCALE_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${SWSCALE_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE SWSCALE_LIBRARIES SWSCALE_INCLUDE_DIR)
|
||||
check_include_file("libswscale/swscale.h" HAVE_LIBSWSCALE_SWSCALE_H)
|
||||
set(optlibsfound "${optlibsfound} SWScale")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} SWScale")
|
||||
endif()
|
||||
|
||||
# SWresample (using find_library and find_path)
|
||||
find_library(SWRESAMPLE_LIBRARIES swresample)
|
||||
if(SWRESAMPLE_LIBRARIES)
|
||||
set(HAVE_LIBSWRESAMPLE 1)
|
||||
list(APPEND ZM_BIN_LIBS "${SWRESAMPLE_LIBRARIES}")
|
||||
find_path(SWRESAMPLE_INCLUDE_DIR "libswresample/swresample.h" /usr/include/ffmpeg)
|
||||
if(SWRESAMPLE_INCLUDE_DIR)
|
||||
include_directories("${SWRESAMPLE_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${SWRESAMPLE_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE SWRESAMPLE_LIBRARIES SWRESAMPLE_INCLUDE_DIR)
|
||||
check_include_file("libswresample/swresample.h" HAVE_LIBSWRESAMPLE_SWRESAMPLE_H)
|
||||
set(optlibsfound "${optlibsfound} SWResample")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} SWResample")
|
||||
|
||||
# AVresample (using find_library and find_path)
|
||||
find_library(AVRESAMPLE_LIBRARIES avresample)
|
||||
if(AVRESAMPLE_LIBRARIES)
|
||||
set(HAVE_LIBAVRESAMPLE 1)
|
||||
list(APPEND ZM_BIN_LIBS "${AVRESAMPLE_LIBRARIES}")
|
||||
find_path(AVRESAMPLE_INCLUDE_DIR "libavresample/avresample.h" /usr/include/ffmpeg)
|
||||
if(AVRESAMPLE_INCLUDE_DIR)
|
||||
include_directories("${AVRESAMPLE_INCLUDE_DIR}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${AVRESAMPLE_INCLUDE_DIR}")
|
||||
endif()
|
||||
mark_as_advanced(FORCE AVRESAMPLE_LIBRARIES AVRESAMPLE_INCLUDE_DIR)
|
||||
check_include_file("libavresample/avresample.h" HAVE_LIBAVRESAMPLE_AVRESAMPLE_H)
|
||||
set(optlibsfound "${optlibsfound} AVResample")
|
||||
else()
|
||||
set(optlibsnotfound "${optlibsnotfound} AVResample")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Find the path to the ffmpeg executable
|
||||
find_program(FFMPEG_EXECUTABLE
|
||||
|
@ -642,29 +522,19 @@ endif()
|
|||
#
|
||||
# *** END OF LIBRARY CHECKS ***
|
||||
|
||||
# Check for gnutls or crypto
|
||||
if((NOT HAVE_LIBCRYPTO) AND (NOT HAVE_LIBGNUTLS))
|
||||
message(FATAL_ERROR "ZoneMinder requires crypto or gnutls but none were found on your system")
|
||||
# If libjwt is not present we fall back to jwt-cpp which requires OpenSSL
|
||||
if((NOT HAVE_LIBJWT) AND (NOT HAVE_LIBOPENSSL))
|
||||
message(FATAL_ERROR "Using the jwt-cpp backend requires OpenSSL as crypto backend.")
|
||||
endif()
|
||||
|
||||
# Check for V4L header files and enable ZM_HAS_V4L, ZM_HAS_V4L1, ZM_HAS_V4L2 accordingly
|
||||
# Setting to zeros first is required because ZM uses #define for these
|
||||
set(ZM_HAS_V4L 0)
|
||||
set(ZM_HAS_V4L1 0)
|
||||
set(ZM_HAS_V4L2 0)
|
||||
if(HAVE_LINUX_VIDEODEV_H OR HAVE_LIBV4L1_VIDEODEV_H)
|
||||
set(ZM_HAS_V4L 1)
|
||||
set(ZM_HAS_V4L1 1)
|
||||
endif()
|
||||
if(HAVE_LINUX_VIDEODEV2_H)
|
||||
set(ZM_HAS_V4L 1)
|
||||
find_package(V4L2)
|
||||
if(TARGET V4L2::videodev2)
|
||||
set(ZM_HAS_V4L2 1)
|
||||
endif()
|
||||
if((NOT HAVE_LINUX_VIDEODEV_H)
|
||||
AND (NOT HAVE_LIBV4L1_VIDEODEV_H)
|
||||
AND (NOT HAVE_LINUX_VIDEODEV2_H))
|
||||
else()
|
||||
set(ZM_HAS_V4L2 0)
|
||||
message(AUTHOR_WARNING "Video 4 Linux headers weren't found - Analog and USB camera support will not be available")
|
||||
endif()
|
||||
|
||||
# Check for PCRE and enable ZM_PCRE accordingly
|
||||
set(ZM_PCRE 0)
|
||||
if(HAVE_LIBPCRE AND HAVE_PCRE_H)
|
||||
|
@ -685,42 +555,6 @@ if(ZM_ONVIF)
|
|||
set(ZM_HAS_ONVIF 1)
|
||||
endif()
|
||||
|
||||
# Check for authentication functions
|
||||
if(HAVE_OPENSSL_MD5_H)
|
||||
set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}")
|
||||
check_prototype_definition(
|
||||
MD5
|
||||
"unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md)" "NULL" "openssl/md5.h"
|
||||
HAVE_MD5_OPENSSL)
|
||||
endif()
|
||||
|
||||
if(HAVE_GNUTLS_GNUTLS_H)
|
||||
set(CMAKE_REQUIRED_LIBRARIES "${GNUTLS_LIBRARIES}")
|
||||
set(CMAKE_REQUIRED_INCLUDES "${GNUTLS_INCLUDE_DIR}")
|
||||
check_prototype_definition(
|
||||
gnutls_fingerprint
|
||||
"int gnutls_fingerprint (gnutls_digest_algorithm_t algo, const gnutls_datum_t * data, void *result, size_t * result_size)" "0" "stdlib.h;gnutls/gnutls.h"
|
||||
HAVE_DECL_GNUTLS_FINGERPRINT)
|
||||
endif()
|
||||
|
||||
if(NOT HAVE_DECL_GNUTLS_FINGERPRINT AND HAVE_MD5_OPENSSL)
|
||||
set(HAVE_DECL_MD5 1)
|
||||
endif()
|
||||
|
||||
if((NOT HAVE_MD5_OPENSSL) AND (NOT HAVE_DECL_GNUTLS_FINGERPRINT))
|
||||
message(AUTHOR_WARNING
|
||||
"ZoneMinder requires a working MD5 function for hashed authentication but
|
||||
none were found - hashed authentication will not be available")
|
||||
endif()
|
||||
|
||||
# Dirty fix for zm_user only using openssl's md5 if gnutls and gcrypt are not available.
|
||||
# This needs to be fixed in zm_user.[h,cpp] but such fix will also require changes to configure.ac
|
||||
if(HAVE_LIBCRYPTO AND HAVE_OPENSSL_MD5_H AND HAVE_MD5_OPENSSL)
|
||||
set(HAVE_GCRYPT_H 0)
|
||||
set(HAVE_GNUTLS_OPENSSL_H 0)
|
||||
endif()
|
||||
|
||||
# Check for Perl
|
||||
find_package(Perl)
|
||||
if(NOT PERL_FOUND)
|
||||
|
@ -858,6 +692,9 @@ endif()
|
|||
message(STATUS "Optional libraries found:${optlibsfound}")
|
||||
message(STATUS "Optional libraries not found:${optlibsnotfound}")
|
||||
|
||||
message(STATUS "Enabled crypto backend: ${ZM_CRYPTO_BACKEND}")
|
||||
message(STATUS "Enabled JWT backend: ${ZM_JWT_BACKEND}")
|
||||
|
||||
# Run ZM configuration generator
|
||||
message(STATUS "Running ZoneMinder configuration generator")
|
||||
execute_process(COMMAND perl ${CMAKE_CURRENT_BINARY_DIR}/zmconfgen.pl RESULT_VARIABLE ZMCONFGEN_RESULT)
|
||||
|
|
|
@ -30,7 +30,7 @@ This is the recommended method to install ZoneMinder onto your system. ZoneMinde
|
|||
- Debian from their [default repository](https://packages.debian.org/search?searchon=names&keywords=zoneminder)
|
||||
- RHEL/CentOS and clones via [RPM Fusion](http://rpmfusion.org)
|
||||
- Fedora via [RPM Fusion](http://rpmfusion.org)
|
||||
- OpenSuse via [third party repository](http://www.zoneminder.com/wiki/index.php/Installing_using_ZoneMinder_RPMs_for_SuSE)
|
||||
- OpenSuse via [third party repository](https://wiki.zoneminder.com/Installing_using_ZoneMinder_RPMs_for_SuSE)
|
||||
- Mageia from their default repository
|
||||
- Arch via the [AUR](https://aur.archlinux.org/packages/zoneminder/)
|
||||
- Gentoo via [Portage Overlays](http://gpo.zugaina.org/www-misc/zoneminder)
|
||||
|
|
|
@ -1,29 +0,0 @@
|
|||
@CHECK_PROTOTYPE_DEFINITION_HEADER@
|
||||
|
||||
static void cmakeRequireSymbol(int dummy, ...) {
|
||||
(void) dummy;
|
||||
}
|
||||
|
||||
static void checkSymbol(void) {
|
||||
#ifndef @CHECK_PROTOTYPE_DEFINITION_SYMBOL@
|
||||
cmakeRequireSymbol(0, &@CHECK_PROTOTYPE_DEFINITION_SYMBOL@);
|
||||
#endif
|
||||
}
|
||||
|
||||
@CHECK_PROTOTYPE_DEFINITION_PROTO@ {
|
||||
return @CHECK_PROTOTYPE_DEFINITION_RETURN@;
|
||||
}
|
||||
|
||||
#ifdef __CLASSIC_C__
|
||||
int main() {
|
||||
int ac;
|
||||
char*av[];
|
||||
#else
|
||||
int main(int ac, char *av[]) {
|
||||
#endif
|
||||
checkSymbol();
|
||||
if (ac > 1000) {
|
||||
return *av[0];
|
||||
}
|
||||
return 0;
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
# - Check if the protoype we expect is correct.
|
||||
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
||||
# FUNCTION - The name of the function (used to check if prototype exists)
|
||||
# PROTOTYPE- The prototype to check.
|
||||
# RETURN - The return value of the function.
|
||||
# HEADER - The header files required.
|
||||
# VARIABLE - The variable to store the result.
|
||||
# Example:
|
||||
# check_prototype_definition(getpwent_r
|
||||
# "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
|
||||
# "NULL"
|
||||
# "unistd.h;pwd.h"
|
||||
# SOLARIS_GETPWENT_R)
|
||||
# The following variables may be set before calling this macro to
|
||||
# modify the way the check is run:
|
||||
#
|
||||
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
||||
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
||||
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
||||
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2005-2009 Kitware, Inc.
|
||||
# Copyright 2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
#
|
||||
|
||||
|
||||
get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||
|
||||
|
||||
function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
|
||||
|
||||
if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$")
|
||||
set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
|
||||
|
||||
set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||
if (CMAKE_REQUIRED_LIBRARIES)
|
||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS
|
||||
LINK_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
|
||||
else()
|
||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS)
|
||||
endif()
|
||||
if (CMAKE_REQUIRED_INCLUDES)
|
||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES
|
||||
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
||||
else()
|
||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES)
|
||||
endif()
|
||||
|
||||
foreach(_FILE ${_HEADER})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_HEADER
|
||||
"${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n")
|
||||
endforeach()
|
||||
|
||||
set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
|
||||
|
||||
configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in"
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY)
|
||||
|
||||
file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE)
|
||||
|
||||
try_compile(${_VARIABLE}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c
|
||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||
${CHECK_PROTOTYPE_DEFINITION_LIBS}
|
||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
|
||||
"${CMAKE_SYMBOL_EXISTS_INCLUDES}"
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
|
||||
if (${_VARIABLE})
|
||||
set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n"
|
||||
"${OUTPUT}\n\n")
|
||||
else ()
|
||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False")
|
||||
set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n"
|
||||
"${OUTPUT}\n\n${_SOURCE}\n\n")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
endfunction()
|
|
@ -1,98 +0,0 @@
|
|||
# - Check if the protoype we expect is correct.
|
||||
# check_prototype_definition(FUNCTION PROTOTYPE RETURN HEADER VARIABLE)
|
||||
# FUNCTION - The name of the function (used to check if prototype exists)
|
||||
# PROTOTYPE- The prototype to check.
|
||||
# RETURN - The return value of the function.
|
||||
# HEADER - The header files required.
|
||||
# VARIABLE - The variable to store the result.
|
||||
# Example:
|
||||
# check_prototype_definition(getpwent_r
|
||||
# "struct passwd *getpwent_r(struct passwd *src, char *buf, int buflen)"
|
||||
# "NULL"
|
||||
# "unistd.h;pwd.h"
|
||||
# SOLARIS_GETPWENT_R)
|
||||
# The following variables may be set before calling this macro to
|
||||
# modify the way the check is run:
|
||||
#
|
||||
# CMAKE_REQUIRED_FLAGS = string of compile command line flags
|
||||
# CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)
|
||||
# CMAKE_REQUIRED_INCLUDES = list of include directories
|
||||
# CMAKE_REQUIRED_LIBRARIES = list of libraries to link
|
||||
|
||||
#=============================================================================
|
||||
# Copyright 2005-2009 Kitware, Inc.
|
||||
# Copyright 2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
# see accompanying file Copyright.txt for details.
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
# (To distribute this file outside of CMake, substitute the full
|
||||
# License text for the above reference.)
|
||||
#
|
||||
|
||||
|
||||
get_filename_component(__check_proto_def_dir "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
||||
|
||||
|
||||
function(CHECK_PROTOTYPE_DEFINITION _FUNCTION _PROTOTYPE _RETURN _HEADER _VARIABLE)
|
||||
|
||||
if ("${_VARIABLE}" MATCHES "^${_VARIABLE}$")
|
||||
set(CHECK_PROTOTYPE_DEFINITION_CONTENT "/* */\n")
|
||||
|
||||
set(CHECK_PROTOTYPE_DEFINITION_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||
if (CMAKE_REQUIRED_LIBRARIES)
|
||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS
|
||||
${LINK_LIBRARIES} ${CMAKE_REQUIRED_LIBRARIES})
|
||||
else()
|
||||
set(CHECK_PROTOTYPE_DEFINITION_LIBS)
|
||||
endif()
|
||||
if (CMAKE_REQUIRED_INCLUDES)
|
||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES
|
||||
"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}")
|
||||
else()
|
||||
set(CMAKE_SYMBOL_EXISTS_INCLUDES)
|
||||
endif()
|
||||
|
||||
foreach(_FILE ${_HEADER})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_HEADER
|
||||
"${CHECK_PROTOTYPE_DEFINITION_HEADER}#include <${_FILE}>\n")
|
||||
endforeach()
|
||||
|
||||
set(CHECK_PROTOTYPE_DEFINITION_SYMBOL ${_FUNCTION})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_PROTO ${_PROTOTYPE})
|
||||
set(CHECK_PROTOTYPE_DEFINITION_RETURN ${_RETURN})
|
||||
|
||||
configure_file("${__check_proto_def_dir}/CheckPrototypeDefinition.c.in"
|
||||
"${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c" @ONLY)
|
||||
|
||||
file(READ ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c _SOURCE)
|
||||
|
||||
try_compile(${_VARIABLE}
|
||||
${CMAKE_BINARY_DIR}
|
||||
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckPrototypeDefinition.c
|
||||
COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}
|
||||
${CHECK_PROTOTYPE_DEFINITION_LIBS}
|
||||
CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${CHECK_PROTOTYPE_DEFINITION_FLAGS}
|
||||
"${CMAKE_SYMBOL_EXISTS_INCLUDES}"
|
||||
OUTPUT_VARIABLE OUTPUT)
|
||||
|
||||
if (${_VARIABLE})
|
||||
set(${_VARIABLE} 1 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - True")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
|
||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} passed with the following output:\n"
|
||||
"${OUTPUT}\n\n")
|
||||
else ()
|
||||
message(STATUS "Checking prototype ${_FUNCTION} for ${_VARIABLE} - False")
|
||||
set(${_VARIABLE} 0 CACHE INTERNAL "Have correct prototype for ${_FUNCTION}")
|
||||
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
|
||||
"Determining if the prototype ${_FUNCTION} exists for ${_VARIABLE} failed with the following output:\n"
|
||||
"${OUTPUT}\n\n${_SOURCE}\n\n")
|
||||
endif ()
|
||||
endif()
|
||||
|
||||
endfunction()
|
|
@ -0,0 +1,163 @@
|
|||
#[=======================================================================[.rst:
|
||||
FindFFMPEG
|
||||
----------
|
||||
|
||||
Find the FFmpeg and associated libraries.
|
||||
|
||||
|
||||
This module accepts following COMPONENTS::
|
||||
|
||||
avcodec
|
||||
avdevice
|
||||
avfilter
|
||||
avformat
|
||||
avutil
|
||||
swresample
|
||||
swscale
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This module defines the following :prop_tgt:`IMPORTED` targets:
|
||||
|
||||
``FFMPEG::<component>``
|
||||
The FFmpeg component.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``FFMPEG_INCLUDE_DIRS``
|
||||
Include directories necessary to use FFmpeg.
|
||||
``FFMPEG_LIBRARIES``
|
||||
Libraries necessary to use FFmpeg. Note that this only includes libraries for the components requested.
|
||||
``FFMPEG_VERSION``
|
||||
The version of FFMPEG found (avutil).
|
||||
|
||||
|
||||
For each component, the following are provided:
|
||||
|
||||
``FFMPEG_<component>_FOUND``
|
||||
FFmpeg component was found.
|
||||
``FFMPEG_<component>_INCLUDE_DIRS``
|
||||
Include directories for the component.
|
||||
``FFMPEG_<component>_LIBRARIES``
|
||||
Libraries for the component.
|
||||
|
||||
#]=======================================================================]
|
||||
|
||||
function(_ffmpeg_find component pkgconfig_name header)
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(PC_FFMPEG_${component} ${pkgconfig_name})
|
||||
|
||||
find_path(FFMPEG_${component}_INCLUDE_DIR
|
||||
NAMES "lib${component}/${header}"
|
||||
HINTS
|
||||
${PC_FFMPEG_${component}_INCLUDEDIR}
|
||||
${PC_FFMPEG_${component}_INCLUDE_DIRS}
|
||||
PATH_SUFFIXES
|
||||
ffmpeg)
|
||||
mark_as_advanced("FFMPEG_${component}_INCLUDE_DIR")
|
||||
|
||||
find_library(FFMPEG_${component}_LIBRARY
|
||||
NAMES
|
||||
${component}
|
||||
${PC_FFMPEG_${component}_LIBRARIES}
|
||||
HINTS
|
||||
${PC_FFMPEG_${component}_LIBDIR}
|
||||
${PC_FFMPEG_${component}_LIBRARY_DIRS})
|
||||
mark_as_advanced("${component}_LIBRARY")
|
||||
|
||||
if(FFMPEG_${component}_LIBRARY AND FFMPEG_${component}_INCLUDE_DIR)
|
||||
set(_deps_found TRUE)
|
||||
set(_deps_link)
|
||||
foreach(_ffmpeg_dep IN LISTS ARGN)
|
||||
if(TARGET "FFMPEG::${_ffmpeg_dep}")
|
||||
list(APPEND _deps_link "FFMPEG::${_ffmpeg_dep}")
|
||||
else()
|
||||
set(_deps_found FALSE)
|
||||
endif()
|
||||
endforeach()
|
||||
if(_deps_found)
|
||||
if(NOT TARGET "FFMPEG::${component}")
|
||||
add_library("FFMPEG::${component}" UNKNOWN IMPORTED)
|
||||
set_target_properties("FFMPEG::${component}" PROPERTIES
|
||||
IMPORTED_LOCATION "${FFMPEG_${component}_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${FFMPEG_${component}_INCLUDE_DIR}"
|
||||
IMPORTED_LINK_INTERFACE_LIBRARIES "${_deps_link}")
|
||||
endif()
|
||||
set(FFMPEG_${component}_FOUND 1 PARENT_SCOPE)
|
||||
set(FFMPEG_${component}_VERSION "${PC_FFMPEG_${component}_VERSION}" PARENT_SCOPE)
|
||||
else()
|
||||
set("FFMPEG_${component}_FOUND" 0 PARENT_SCOPE)
|
||||
set(what)
|
||||
if(NOT FFMPEG_${component}_LIBRARY)
|
||||
set(what "library")
|
||||
endif()
|
||||
if(NOT FFMPEG_${component}_INCLUDE_DIR)
|
||||
if(what)
|
||||
string(APPEND what " or headers")
|
||||
else()
|
||||
set(what "headers")
|
||||
endif()
|
||||
endif()
|
||||
set("FFMPEG_${component}_NOT_FOUND_MESSAGE"
|
||||
"Could not find the ${what} for ${component}."
|
||||
PARENT_SCOPE)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
_ffmpeg_find(avutil libavutil avutil.h)
|
||||
_ffmpeg_find(swresample libswresample swresample.h
|
||||
avutil)
|
||||
_ffmpeg_find(swscale libswscale swscale.h
|
||||
avutil)
|
||||
_ffmpeg_find(avcodec libavcodec avcodec.h
|
||||
avutil)
|
||||
_ffmpeg_find(avformat libavformat avformat.h
|
||||
avcodec avutil)
|
||||
_ffmpeg_find(avfilter libavfilter avfilter.h
|
||||
avutil)
|
||||
_ffmpeg_find(avdevice libavdevice avdevice.h
|
||||
avformat avutil)
|
||||
|
||||
if(TARGET FFMPEG::avutil)
|
||||
set(FFMPEG_VERSION "${FFMPEG_avutil_VERSION}")
|
||||
endif()
|
||||
|
||||
set(FFMPEG_INCLUDE_DIRS)
|
||||
set(FFMPEG_LIBRARIES)
|
||||
set(_ffmpeg_required_vars)
|
||||
foreach(_ffmpeg_component IN LISTS FFMPEG_FIND_COMPONENTS)
|
||||
if(TARGET "FFMPEG::${_ffmpeg_component}")
|
||||
set(FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS
|
||||
"${FFMPEG_${_ffmpeg_component}_INCLUDE_DIR}")
|
||||
set(FFMPEG_${_ffmpeg_component}_LIBRARIES
|
||||
"${FFMPEG_${_ffmpeg_component}_LIBRARY}")
|
||||
list(APPEND FFMPEG_INCLUDE_DIRS
|
||||
"${FFMPEG_${_ffmpeg_component}_INCLUDE_DIRS}")
|
||||
list(APPEND FFMPEG_LIBRARIES
|
||||
"${FFMPEG_${_ffmpeg_component}_LIBRARIES}")
|
||||
if(FFMEG_FIND_REQUIRED_${_ffmpeg_component})
|
||||
list(APPEND _ffmpeg_required_vars
|
||||
"FFMPEG_${_ffmpeg_required_vars}_INCLUDE_DIRS"
|
||||
"FFMPEG_${_ffmpeg_required_vars}_LIBRARIES")
|
||||
endif()
|
||||
endif()
|
||||
endforeach()
|
||||
unset(_ffmpeg_component)
|
||||
|
||||
if(FFMPEG_INCLUDE_DIRS)
|
||||
list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(FFMPEG
|
||||
REQUIRED_VARS
|
||||
FFMPEG_INCLUDE_DIRS
|
||||
FFMPEG_LIBRARIES
|
||||
${_ffmpeg_required_vars}
|
||||
VERSION_VAR
|
||||
FFMPEG_VERSION
|
||||
HANDLE_COMPONENTS)
|
||||
unset(_ffmpeg_required_vars)
|
|
@ -1,28 +1,89 @@
|
|||
include(FindPackageHandleStandardArgs)
|
||||
#[=======================================================================[.rst:
|
||||
FindLibJWT
|
||||
----------
|
||||
|
||||
Find the JWT C Library (libjwt)
|
||||
|
||||
|
||||
This module accepts optional COMPONENTS to select the crypto backend (these are mutually exclusive)::
|
||||
|
||||
openssl (default)
|
||||
gnutls
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This module defines the following :prop_tgt:`IMPORTED` targets:
|
||||
|
||||
``JWT::libjwt``
|
||||
The JWT library, if found with the specified crypto backend.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``LIBJWT_FOUND``
|
||||
System has libjwt
|
||||
``LIBJWT_INCLUDE_DIRS``
|
||||
The libjwt include directory
|
||||
``LIBJWT_LIBRARIES``
|
||||
The libraries needed to use libjwt
|
||||
#]=======================================================================]
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package(PkgConfig QUIET)
|
||||
|
||||
if(LibJWT_FIND_COMPONENTS)
|
||||
set(LIBJWT_CRYPTO_BACKEND "")
|
||||
foreach(component IN LISTS LibJWT_FIND_COMPONENTS)
|
||||
if(component MATCHES "^(openssl|gnutls)")
|
||||
if(LIBJWT_CRYPTO_BACKEND)
|
||||
message(FATAL_ERROR "LibJWT: Only one crypto library can be selected.")
|
||||
endif()
|
||||
set(LIBJWT_CRYPTO_BACKEND ${component})
|
||||
else()
|
||||
message(FATAL_ERROR "LibJWT: Wrong crypto backend specified.")
|
||||
endif()
|
||||
endforeach()
|
||||
else()
|
||||
set(LIBJWT_CRYPTO_BACKEND "openssl")
|
||||
endif()
|
||||
|
||||
set(LIBJWT_LIB_NAMES "")
|
||||
if(LIBJWT_CRYPTO_BACKEND STREQUAL "openssl")
|
||||
set(LIBJWT_LIB_NAMES "jwt" "libjwt")
|
||||
elseif(LIBJWT_CRYPTO_BACKEND STREQUAL "gnutls")
|
||||
set(LIBJWT_LIB_NAMES "jwt-gnutls" "libjwt-gnutls")
|
||||
endif()
|
||||
|
||||
pkg_check_modules(PC_LIBJWT QUIET libjwt)
|
||||
|
||||
find_path(LIBJWT_INCLUDE_DIR
|
||||
NAMES jwt.h
|
||||
HINTS ${PC_LIBJWT_INCLUDEDIR} ${PC_LIBJWT_INCLUDE_DIRS}
|
||||
)
|
||||
HINTS
|
||||
${PC_LIBJWT_INCLUDEDIR}
|
||||
${PC_LIBJWT_INCLUDE_DIRS})
|
||||
mark_as_advanced(LIBJWT_INCLUDE_DIR)
|
||||
|
||||
find_library(LIBJWT_LIBRARY
|
||||
NAMES jwt-gnutls libjwt-gnutls liblibjwt-gnutls
|
||||
HINTS ${PC_LIBJWT_LIBDIR} ${PC_LIBJWT_LIBRARY_DIR}
|
||||
)
|
||||
NAMES ${LIBJWT_LIB_NAMES}
|
||||
HINTS
|
||||
${PC_LIBJWT_LIBDIR}
|
||||
${PC_LIBJWT_LIBRARY_DIR})
|
||||
mark_as_advanced(LIBJWT_LIBRARY)
|
||||
|
||||
find_package_handle_standard_args(LibJWT
|
||||
REQUIRED_VARS LIBJWT_INCLUDE_DIR LIBJWT_LIBRARY
|
||||
)
|
||||
REQUIRED_VARS
|
||||
LIBJWT_INCLUDE_DIR
|
||||
LIBJWT_LIBRARY
|
||||
FAIL_MESSAGE
|
||||
"Could NOT find LibJWT with the crypto backend ${LIBJWT_CRYPTO_BACKEND}.")
|
||||
|
||||
if(LIBJWT_FOUND)
|
||||
add_library(libjwt STATIC IMPORTED GLOBAL)
|
||||
set_target_properties(libjwt PROPERTIES
|
||||
IMPORTED_LOCATION "${LIBJWT_LIBRARY}"
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBJWT_INCLUDE_DIR}"
|
||||
)
|
||||
endif()
|
||||
set(LIBJWT_LIBRARIES ${LIBJWT_LIBRARY})
|
||||
set(LIBJWT_INCLUDE_DIRS ${LIBJWT_INCLUDE_DIR})
|
||||
|
||||
mark_as_advanced(LIBJWT_INCLUDE_DIR LIBJWT_LIBRARY)
|
||||
add_library(JWT::libjwt UNKNOWN IMPORTED)
|
||||
set_target_properties(JWT::libjwt PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${LIBJWT_INCLUDE_DIRS}"
|
||||
IMPORTED_LOCATION "${LIBJWT_LIBRARY}")
|
||||
endif()
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
#[=======================================================================[.rst:
|
||||
FindV4L2
|
||||
----------
|
||||
|
||||
Find V4L2 headers and libv4l2
|
||||
|
||||
|
||||
This module accepts optional COMPONENTS:
|
||||
|
||||
videodev2 (default)
|
||||
libv4l2
|
||||
|
||||
IMPORTED Targets
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
This module defines the following :prop_tgt:`IMPORTED` targets::
|
||||
|
||||
``V4L2::videodev2``
|
||||
The Video for Linux Two header file, if found.
|
||||
``V4L2::libv4l2``
|
||||
A thin abstraction layer on top of video4linux2 devices, if found.
|
||||
|
||||
Result Variables
|
||||
^^^^^^^^^^^^^^^^
|
||||
|
||||
``V4L2_FOUND``
|
||||
System has v4l2 support. If no components are specified only the videodev2.h header has to be found.
|
||||
``V4L2_INCLUDE_DIRS``
|
||||
The v4l2 include directories.
|
||||
``V4L2_LIBRARIES``
|
||||
The libraries needed to have v4l2 support according to the specified components.
|
||||
#]=======================================================================]
|
||||
|
||||
find_path(V4L2_VIDEODEV2_INCLUDE_DIR
|
||||
NAMES linux/videodev2.h)
|
||||
mark_as_advanced(V4L2_VIDEODEV2_INCLUDE_DIR)
|
||||
|
||||
if(EXISTS "${V4L2_VIDEODEV2_INCLUDE_DIR}")
|
||||
set(V4L2_videodev2_FOUND TRUE)
|
||||
else()
|
||||
set(V4L2_videodev2_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
pkg_check_modules(PC_V4L2_LIBV4L2 QUIET libv4l2)
|
||||
|
||||
find_path(V4L2_LIBV4L2_INCLUDE_DIR
|
||||
NAMES libv4l2.h
|
||||
HINTS
|
||||
${PC_V4L2_LIBV4L2_INCLUDEDIR}
|
||||
${PC_V4L2_LIBV4L2_INCLUDE_DIRS})
|
||||
mark_as_advanced(V4L2_LIBV4L2_INCLUDE_DIR)
|
||||
|
||||
find_library(V4L2_LIBV4L2_LIBRARY
|
||||
NAMES ${PC_V4L2_LIBV4L2_LIBRARIES}
|
||||
HINTS
|
||||
${PC_V4L2_LIBV4L2_LIBDIR}
|
||||
${PC_V4L2_LIBV4L2_LIBRARY_DIR})
|
||||
mark_as_advanced(V4L2_LIBV4L2_LIBRARY)
|
||||
|
||||
if(EXISTS "${V4L2_LIBV4L2_INCLUDE_DIR}" AND
|
||||
EXISTS "${V4L2_LIBV4L2_LIBRARY}")
|
||||
set(V4L2_libv4l2_FOUND TRUE)
|
||||
else()
|
||||
set(V4L2_libv4l2_FOUND FALSE)
|
||||
endif()
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(V4L2
|
||||
REQUIRED_VARS
|
||||
V4L2_VIDEODEV2_INCLUDE_DIR
|
||||
HANDLE_COMPONENTS)
|
||||
|
||||
set(V4L2_INCLUDE_DIRS)
|
||||
set(V4L2_LIBRARIES)
|
||||
|
||||
if(V4L2_videodev2_FOUND)
|
||||
set(V4L2_VIDEODEV2_INCLUDE_DIRS ${V4L2_VIDEODEV2_INCLUDE_DIR})
|
||||
list(APPEND V4L2_INCLUDE2_DIRS
|
||||
"${V4L2_VIDEODEV2_INCLUDE_DIRS}")
|
||||
|
||||
add_library(V4L2::videodev2 INTERFACE IMPORTED)
|
||||
set_target_properties(V4L2::videodev2 PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${V4L2_VIDEODEV2_INCLUDE_DIRS}")
|
||||
endif()
|
||||
|
||||
if(V4L2_libv4l2_FOUND)
|
||||
set(V4L2_LIBV4L2_INCLUDE_DIRS ${V4L2_LIBV4L2_INCLUDE_DIR})
|
||||
set(V4L2_LIBV4L2_LIBRARIES ${V4L2_LIBV4L2_LIBRARY})
|
||||
|
||||
list(APPEND V4L2_INCLUDE_DIRS
|
||||
"${V4L2_LIBV4L2_INCLUDE_DIRS}")
|
||||
list(APPEND V4L2_LIBRARIES
|
||||
"${V4L2_LIBV4L2_LIBRARIES}")
|
||||
|
||||
add_library(V4L2::libv4l2 UNKNOWN IMPORTED)
|
||||
set_target_properties(V4L2::libv4l2 PROPERTIES
|
||||
INTERFACE_INCLUDE_DIRECTORIES "${V4L2_LIBV4L2_INCLUDE_DIRS}"
|
||||
IMPORTED_LOCATION "${V4L2_LIBV4L2_LIBRARY}")
|
||||
endif()
|
|
@ -6,6 +6,7 @@ target_compile_options(zm-warning-interface
|
|||
-Wformat-security
|
||||
-Wno-cast-function-type
|
||||
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,11>:-Wno-clobbered>
|
||||
$<$<VERSION_LESS:$<CXX_COMPILER_VERSION>,5.1>:-Wno-missing-field-initializers>
|
||||
-Wno-unused-parameter
|
||||
-Woverloaded-virtual
|
||||
-Wvla)
|
||||
|
@ -23,7 +24,8 @@ if(ASAN)
|
|||
-fno-omit-frame-pointer
|
||||
-fsanitize=address
|
||||
-fsanitize-recover=address
|
||||
-fsanitize-address-use-after-scope)
|
||||
-fsanitize-address-use-after-scope
|
||||
-Wno-stringop-truncation)
|
||||
|
||||
target_link_options(zm-compile-option-interface
|
||||
INTERFACE
|
||||
|
|
|
@ -1080,11 +1080,11 @@ CREATE TABLE MontageLayouts (
|
|||
PRIMARY KEY (`Id`)
|
||||
);
|
||||
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('Freeform', '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('2 Wide', '{ "default":{"float":"left", "width":"49%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('Freeform', '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px","width":"auto"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('2 Wide', '{ "default":{"float":"left", "width":"50%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('3 Wide', '{ "default":{"float":"left", "width":"33%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('4 Wide', '{ "default":{"float":"left", "width":"24.5%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('5 Wide', '{ "default":{"float":"left", "width":"19%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('4 Wide', '{ "default":{"float":"left", "width":"25%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
INSERT INTO MontageLayouts (`Name`,`Positions`) VALUES ('5 Wide', '{ "default":{"float":"left", "width":"20%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' );
|
||||
|
||||
CREATE TABLE Sessions (
|
||||
id char(32) not null,
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
ALTER TABLE `Monitors` MODIFY `Longitude` DECIMAL(11,8);
|
|
@ -0,0 +1,4 @@
|
|||
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left","left":"0px","right":"0px","top":"0px","bottom":"0px","width":"auto"} }' WHERE `Name`='Freeform';
|
||||
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"49%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='2 Wide';
|
||||
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"25%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='4 Wide';
|
||||
UPDATE MontageLayouts SET `Positions` = '{ "default":{"float":"left", "width":"20%","left":"0px","right":"0px","top":"0px","bottom":"0px"} }' WHERE `Name`='5 Wide';
|
|
@ -5,7 +5,6 @@ Maintainer: Isaac Connor <isaac@zoneminder.com>
|
|||
Uploaders: Isaac Connor <isaac@zoneminder.com>
|
||||
Build-Depends: debhelper, sphinx-doc, dh-linktree, dh-apache2
|
||||
,cmake
|
||||
,libavdevice-dev
|
||||
,libavcodec-dev
|
||||
,libavformat-dev
|
||||
,libavutil-dev
|
||||
|
@ -14,7 +13,6 @@ Build-Depends: debhelper, sphinx-doc, dh-linktree, dh-apache2
|
|||
,ffmpeg
|
||||
,net-tools
|
||||
,libbz2-dev
|
||||
,libgcrypt20-dev
|
||||
,libcurl4-gnutls-dev
|
||||
,libturbojpeg0-dev
|
||||
,default-libmysqlclient-dev | libmysqlclient-dev | libmariadbclient-dev-compat
|
||||
|
|
|
@ -41,7 +41,6 @@ Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org)
|
|||
License: Expat
|
||||
|
||||
Files:
|
||||
cmake/Modules/CheckPrototypeDefinition*.cmake
|
||||
cmake/Modules/FindGLIB2.cmake
|
||||
cmake/Modules/FindPolkit.cmake
|
||||
cmake/Modules/GNUInstallDirs.cmake
|
||||
|
|
|
@ -9,7 +9,6 @@ Build-Depends: debhelper (>= 9), cmake
|
|||
, libjpeg8-dev | libjpeg-dev
|
||||
, libpcre3-dev
|
||||
, libavcodec-dev, libavformat-dev (>= 3:0.svn20090204), libswscale-dev (>= 3:0.svn20090204), libavutil-dev
|
||||
, libavdevice-dev
|
||||
, libv4l-dev (>= 0.8.3)
|
||||
, libbz2-dev
|
||||
, ffmpeg | libav-tools
|
||||
|
@ -17,7 +16,7 @@ Build-Depends: debhelper (>= 9), cmake
|
|||
, libnetpbm10-dev
|
||||
, libvlccore-dev, libvlc-dev
|
||||
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
||||
, libgcrypt11-dev, libpolkit-gobject-1-dev
|
||||
, libpolkit-gobject-1-dev
|
||||
, libphp-serialization-perl
|
||||
, libdate-manip-perl, libmime-lite-perl, libmime-tools-perl, libdbd-mysql-perl
|
||||
, libwww-perl, libarchive-tar-perl, libarchive-zip-perl, libdevice-serialport-perl
|
||||
|
@ -47,7 +46,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
|||
,libnumber-bytes-human-perl
|
||||
,libfile-slurp-perl
|
||||
, libpcre3
|
||||
, ffmpeg | libav-tools, libavdevice53 | libavdevice55 | libavdevice57
|
||||
, ffmpeg | libav-tools
|
||||
, rsyslog | system-log-daemon
|
||||
, netpbm
|
||||
, zip
|
||||
|
|
|
@ -1 +1 @@
|
|||
../redhat/misc/redalert.wav
|
||||
../redhat/common/redalert.wav
|
|
@ -27,7 +27,7 @@ Source: ZoneMinder-%{version}.tar.gz
|
|||
|
||||
BuildRequires: cmake polkit-devel
|
||||
BuildRequires: perl-DBI perl-DBD-mysql perl-Date-Manip perl-Sys-Mmap
|
||||
BuildRequires: libjpeg62 libjpeg62-devel libmysqld-devel libSDL-devel libgcrypt-devel libgnutls-devel
|
||||
BuildRequires: libjpeg62 libjpeg62-devel libmysqld-devel libSDL-devel libgnutls-devel
|
||||
BuildRequires: libffmpeg-devel x264
|
||||
BuildRequires: pcre-devel w32codec-all
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
%global _hardened_build 1
|
||||
|
||||
Name: zoneminder
|
||||
Version: 1.36.5
|
||||
Version: 1.37.1
|
||||
Release: 1%{?dist}
|
||||
Summary: A camera monitoring and analysis tool
|
||||
Group: System Environment/Daemons
|
||||
|
@ -430,6 +430,9 @@ ln -sf %{_sysconfdir}/zm/www/zoneminder.nginx.conf %{_sysconfdir}/zm/www/zonemin
|
|||
%dir %attr(755,nginx,nginx) %{_localstatedir}/log/zoneminder
|
||||
|
||||
%changelog
|
||||
* Mon Jul 05 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.37.1-1
|
||||
- 1.37.x development build
|
||||
|
||||
* Tue Jun 22 2021 Andrew Bauer <zonexpertconsulting@outlook.com> - 1.36.5-1
|
||||
- 1.36.5 release
|
||||
|
||||
|
|
|
@ -8,14 +8,14 @@ Build-Depends: debhelper (>= 9), po-debconf (>= 1.0), autoconf, automake, libtoo
|
|||
, libdate-manip-perl, libwww-perl
|
||||
, libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev
|
||||
, libpcre3-dev
|
||||
, libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev, libavdevice-ffmpeg-dev
|
||||
, libavcodec-ffmpeg-dev, libavformat-ffmpeg-dev, libswscale-ffmpeg-dev, libavutil-ffmpeg-dev
|
||||
, libv4l-dev (>= 0.8.3)
|
||||
, libbz2-dev
|
||||
, libsys-mmap-perl
|
||||
, libdevice-serialport-perl, libarchive-zip-perl, libmime-lite-perl
|
||||
, libvlccore-dev, libvlc-dev
|
||||
, libcurl4-gnutls-dev | libcurl4-nss-dev | libcurl4-openssl-dev
|
||||
, libgcrypt11-dev | libgcrypt20-dev, libpolkit-gobject-1-dev
|
||||
, libpolkit-gobject-1-dev
|
||||
, libdbi-perl, libnet-sftp-foreign-perl, libexpect-perl, libmime-tools-perl
|
||||
Standards-Version: 3.9.6
|
||||
Homepage: http://www.zoneminder.com/
|
||||
|
|
|
@ -15,7 +15,6 @@ DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
|
|||
DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
|
||||
|
||||
CFLAGS = -Wall
|
||||
CXXFLAGS = -DHAVE_LIBCRYPTO
|
||||
|
||||
ifneq (,$(findstring debug,$(DEB_BUILD_OPTIONS)))
|
||||
DEBOPT = --enable-debug
|
||||
|
|
|
@ -1,10 +0,0 @@
|
|||
zoneminder (1.28.1-1) unstable; urgency=low
|
||||
|
||||
This version is no longer automatically initialize or upgrade database.
|
||||
See README.Debian for details.
|
||||
|
||||
Changed installation paths (please correct your web server configuration):
|
||||
/usr/share/zoneminder --> /usr/share/zoneminder/www
|
||||
/usr/lib/cgi-bin --> /usr/lib/zoneminder/cgi-bin
|
||||
|
||||
-- Dmitry Smirnov <onlyjob@debian.org> Tue, 31 Mar 2015 15:12:17 +1100
|
|
@ -1,130 +0,0 @@
|
|||
Zoneminder for Debian
|
||||
---------------------
|
||||
|
||||
Initializing database
|
||||
---------------------
|
||||
|
||||
pv /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf
|
||||
OR
|
||||
cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf
|
||||
|
||||
echo 'grant lock tables,alter,create,index,select,insert,update,delete on zm.* to 'zmuser'@localhost identified by "zmpass";'\
|
||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
||||
|
||||
Hint: generate secure password with `pwgen` and update "/etc/zm/zm.conf"
|
||||
accordingly.
|
||||
|
||||
The following command can help to ensure that zoneminder can read its
|
||||
configuration file:
|
||||
|
||||
chgrp -c www-data /etc/zm/zm.conf
|
||||
|
||||
|
||||
Upgrading database
|
||||
------------------
|
||||
|
||||
The database is updated automatically on installation. You should not need to take this step.
|
||||
|
||||
Assuming that database is on "localhost" then the following command can be
|
||||
used to upgrade "zm" database:
|
||||
|
||||
zmupdate.pl
|
||||
|
||||
Additional permissions may be required to perform upgrade:
|
||||
|
||||
echo 'grant lock tables, create, alter on zm.* to 'zmuser'@localhost identified by "zmpass";'\
|
||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
||||
|
||||
The following command prints the current version of zoneminder database:
|
||||
|
||||
echo 'select Value from Config where Name = "ZM_DYN_CURR_VERSION";' \
|
||||
| sudo mysql --defaults-file=/etc/mysql/debian.cnf --skip-column-names zm
|
||||
|
||||
|
||||
Enabling service
|
||||
----------------
|
||||
|
||||
By default Zoneminder service is not automatically started and needs to be
|
||||
manually enabled once database is configured:
|
||||
|
||||
sudo systemctl enable zoneminder.service
|
||||
|
||||
|
||||
Web server set-up
|
||||
-----------------
|
||||
|
||||
There are few manual steps to get the web interface working:
|
||||
|
||||
## Apache2
|
||||
|
||||
Apache can be configured as folder "/zm" using sample .conf:
|
||||
|
||||
sudo a2enconf zoneminder
|
||||
|
||||
Alternatively Apache web site configuration template can be used to setup
|
||||
zoneminder as "http://zoneminder":
|
||||
|
||||
sudo cp -v /usr/share/doc/zoneminder/examples/apache.conf /etc/apache2/sites-available/
|
||||
sudo a2ensite zoneminder.conf
|
||||
|
||||
Common configuration steps for Apache2:
|
||||
|
||||
sudo a2enmod cgi
|
||||
sudo service apache2 reload
|
||||
|
||||
|
||||
## nginx / fcgiwrap
|
||||
|
||||
Nginx needs "php-fpm" package to support PHP and "fcgiwrap" package
|
||||
for binary "cgi-bin" applications:
|
||||
|
||||
sudo apt-get install php-fpm fcgiwrap
|
||||
|
||||
To enable a URL alias that makes Zoneminder available from
|
||||
|
||||
http://yourserver/zm
|
||||
|
||||
the following line is to be added to "server" section of a web site
|
||||
configuration:
|
||||
|
||||
include /usr/share/doc/zoneminder/examples/nginx.conf;
|
||||
|
||||
For "default" web site it would be sufficient to include the above
|
||||
statement to the file
|
||||
|
||||
/etc/nginx/sites-enabled/default
|
||||
|
||||
To avoid problems with feeds from multiple cameras "fcgiwrap" should be
|
||||
configured to start at least as many processes as there are cameras.
|
||||
It can be done by adjusting DAEMON_OPTS in "/etc/default/fcgiwrap".
|
||||
Systemd users may be affected by the following bug:
|
||||
|
||||
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=792705
|
||||
|
||||
|
||||
## Note:
|
||||
|
||||
When Zoneminder web site is running it may be necessary to set
|
||||
Options/Paths/PATH_ZMS to "/zm/cgi-bin/nph-zms" or according to chosen web
|
||||
site configuration.
|
||||
|
||||
|
||||
Changing the location for images and events
|
||||
-------------------------------------------
|
||||
|
||||
ZoneMinder is now able to be configured to use an alternative location for storing
|
||||
events and images at compile time. This package makes use of that, so symlinks in
|
||||
/usr/share/zoneminder/www are no longer necessary.
|
||||
|
||||
Access to /dev/video*
|
||||
---------------------
|
||||
|
||||
For cameras which require access to /dev/video*, zoneminder may need the
|
||||
www-data user added to the video group in order to see those cameras:
|
||||
|
||||
adduser www-data video
|
||||
|
||||
Note that all web applications running on the zoneminder server will then have
|
||||
access to all video devices on the system.
|
||||
|
||||
-- Vagrant Cascadian <vagrant@debian.org> Sun, 27 Mar 2011 13:06:56 -0700
|
|
@ -1,12 +0,0 @@
|
|||
|
||||
## Separate substantial /usr/share into its own arch-all package.
|
||||
|
||||
## Decide how to handle database updates.
|
||||
|
||||
* Consider possibility that database may be on another machine (#469239).
|
||||
* Consider dbconfig-common? Probably not (what if database is not on localhost?).
|
||||
|
||||
### Run `zmupdate.pl` from service control scripts (init.d, service) on start?
|
||||
|
||||
Automatic upgrade will break "one DB, many zoneminders" setup (unimportant?).
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
zoneminder (1.35.6~20200825.27-xenial) xenial; urgency=low
|
||||
*
|
||||
-- Isaac Connor <isaac@zoneminder.com> Tue, 25 Aug 2020 09:28:18 -0400
|
|
@ -1,3 +0,0 @@
|
|||
.gitattributes
|
||||
web/api/.gitattributes
|
||||
web/api/.gitignore
|
|
@ -1 +0,0 @@
|
|||
9
|
|
@ -1,57 +0,0 @@
|
|||
# Remember to enable cgi mod (i.e. "a2enmod cgi").
|
||||
ScriptAlias /zm/cgi-bin "/usr/lib/zoneminder/cgi-bin"
|
||||
<Directory "/usr/lib/zoneminder/cgi-bin">
|
||||
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
|
||||
# Order matters. This alias must come first.
|
||||
Alias /zm/cache /var/cache/zoneminder/cache
|
||||
<Directory /var/cache/zoneminder/cache>
|
||||
Options -Indexes +FollowSymLinks
|
||||
AllowOverride None
|
||||
<IfModule mod_authz_core.c>
|
||||
# Apache 2.4
|
||||
Require all granted
|
||||
</IfModule>
|
||||
<IfModule !mod_authz_core.c>
|
||||
# Apache 2.2
|
||||
Order deny,allow
|
||||
Allow from all
|
||||
</IfModule>
|
||||
</Directory>
|
||||
|
||||
Alias /zm /usr/share/zoneminder/www
|
||||
<Directory /usr/share/zoneminder/www>
|
||||
Options -Indexes +FollowSymLinks
|
||||
<IfModule mod_dir.c>
|
||||
DirectoryIndex index.php
|
||||
</IfModule>
|
||||
</Directory>
|
||||
|
||||
# For better visibility, the following directives have been migrated from the
|
||||
# default .htaccess files included with the CakePHP project.
|
||||
# Parameters not set here are inherited from the parent directive above.
|
||||
<Directory "/usr/share/zoneminder/www/api">
|
||||
RewriteEngine on
|
||||
RewriteRule ^$ app/webroot/ [L]
|
||||
RewriteRule (.*) app/webroot/$1 [L]
|
||||
RewriteBase /zm/api
|
||||
</Directory>
|
||||
|
||||
<Directory "/usr/share/zoneminder/www/api/app">
|
||||
RewriteEngine on
|
||||
RewriteRule ^$ webroot/ [L]
|
||||
RewriteRule (.*) webroot/$1 [L]
|
||||
RewriteBase /zm/api
|
||||
</Directory>
|
||||
|
||||
<Directory "/usr/share/zoneminder/www/api/app/webroot">
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteRule ^ index.php [L]
|
||||
RewriteBase /zm/api
|
||||
</Directory>
|
|
@ -1,165 +0,0 @@
|
|||
Source: zoneminder
|
||||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Isaac Connor <isaac@zoneminder.com>
|
||||
Uploaders: Isaac Connor <isaac@zoneminder.com>
|
||||
Build-Depends: debhelper (>= 9), dh-systemd, python3-sphinx, apache2-dev, dh-linktree, dh-systemd, dh-apache2
|
||||
,cmake
|
||||
,libavdevice-dev (>= 6:10~)
|
||||
,libavcodec-dev (>= 6:10~)
|
||||
,libavformat-dev (>= 6:10~)
|
||||
,libavutil-dev (>= 6:10~)
|
||||
,libswresample-dev | libavresample-dev
|
||||
,libswscale-dev (>= 6:10~)
|
||||
,ffmpeg | libav-tools
|
||||
,net-tools
|
||||
,libbz2-dev
|
||||
,libgcrypt-dev | libgcrypt11-dev
|
||||
,libcurl4-gnutls-dev
|
||||
,libgnutls-openssl-dev
|
||||
,libjpeg8-dev | libjpeg9-dev | libjpeg62-turbo-dev
|
||||
,default-libmysqlclient-dev | libmysqlclient-dev | libmariadbclient-dev-compat
|
||||
,libpcre3-dev
|
||||
,libpolkit-gobject-1-dev
|
||||
,libv4l-dev (>= 0.8.3) [!hurd-any]
|
||||
,libvlc-dev
|
||||
,libdate-manip-perl
|
||||
,libdbd-mysql-perl
|
||||
,libphp-serialization-perl
|
||||
,libsys-mmap-perl [!hurd-any]
|
||||
,libwww-perl
|
||||
,libdata-uuid-perl
|
||||
,libssl-dev
|
||||
,libcrypt-eksblowfish-perl
|
||||
,libdata-entropy-perl
|
||||
,libvncserver-dev
|
||||
Standards-Version: 3.9.8
|
||||
Homepage: http://www.zoneminder.com/
|
||||
Vcs-Browser: http://anonscm.debian.org/cgit/collab-maint/zoneminder.git
|
||||
Vcs-Git: git://anonscm.debian.org/collab-maint/zoneminder.git
|
||||
|
||||
Package: zoneminder
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
||||
,javascript-common
|
||||
,libswscale-ffmpeg3|libswscale4|libswscale3|libswscale5
|
||||
,libswresample2|libswresample3|libswresample24|libswresample-ffmpeg1
|
||||
,ffmpeg | libav-tools
|
||||
,libdate-manip-perl, libmime-lite-perl, libmime-tools-perl
|
||||
,libdbd-mysql-perl
|
||||
,libphp-serialization-perl
|
||||
,libmodule-load-conditional-perl
|
||||
,libnet-sftp-foreign-perl
|
||||
,libarchive-zip-perl
|
||||
,libdbd-mysql-perl
|
||||
,libdevice-serialport-perl
|
||||
,libimage-info-perl
|
||||
,libjson-maybexs-perl
|
||||
,libsys-mmap-perl [!hurd-any]
|
||||
,liburi-encode-perl
|
||||
,libwww-perl, liburi-perl
|
||||
,libdata-dump-perl
|
||||
,libdatetime-perl
|
||||
,libclass-std-fast-perl
|
||||
,libsoap-wsdl-perl
|
||||
,libio-socket-multicast-perl
|
||||
,libdigest-sha-perl
|
||||
,libsys-cpu-perl, libsys-meminfo-perl
|
||||
,libdata-uuid-perl
|
||||
,libnumber-bytes-human-perl
|
||||
,libfile-slurp-perl
|
||||
,mysql-client | mariadb-client | virtual-mysql-client
|
||||
,perl-modules
|
||||
,php5-mysql | php-mysql, php5-gd | php-gd , php5-apcu | php-apcu , php-apc | php-apcu-bc, php-json | php5-json
|
||||
,policykit-1
|
||||
,rsyslog | system-log-daemon
|
||||
,zip
|
||||
,libpcre3
|
||||
,libssl | libssl1.0.0 | libssl1.1
|
||||
,libcrypt-eksblowfish-perl
|
||||
,libdata-entropy-perl
|
||||
,libvncclient1|libvncclient0
|
||||
Recommends: ${misc:Recommends}
|
||||
,libapache2-mod-php5 | libapache2-mod-php | php5-fpm | php-fpm
|
||||
,mysql-server | mariadb-server | virtual-mysql-server
|
||||
,zoneminder-doc (>= ${source:Version})
|
||||
,ffmpeg
|
||||
Suggests: fcgiwrap, logrotate
|
||||
Description: video camera security and surveillance solution
|
||||
ZoneMinder is intended for use in single or multi-camera video security
|
||||
applications, including commercial or home CCTV, theft prevention and child
|
||||
or family member or home monitoring and other care scenarios. It
|
||||
supports capture, analysis, recording, and monitoring of video data coming
|
||||
from one or more video or network cameras attached to a Linux system.
|
||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
||||
cameras using a variety of protocols. It is suitable for use as a home
|
||||
video security system and for commercial or professional video security
|
||||
and surveillance. It can also be integrated into a home automation system
|
||||
via X.10 or other protocols.
|
||||
|
||||
#Package: libzoneminder-perl
|
||||
#Section: perl
|
||||
#Architecture: all
|
||||
#Multi-Arch: foreign
|
||||
#Depends: ${misc:Depends}, ${perl:Depends}
|
||||
# ,libarchive-zip-perl
|
||||
# ,libdbd-mysql-perl
|
||||
# ,libdevice-serialport-perl
|
||||
# ,libimage-info-perl
|
||||
# ,libjson-maybexs-perl
|
||||
# ,libsys-mmap-perl [!hurd-any]
|
||||
# ,liburi-encode-perl
|
||||
# ,libwww-perl
|
||||
#Description: ZoneMinder Perl libraries
|
||||
# ZoneMinder is intended for use in single or multi-camera video security
|
||||
# applications, including commercial or home CCTV, theft prevention and child
|
||||
# or family member or home monitoring and other care scenarios. It
|
||||
# supports capture, analysis, recording, and monitoring of video data coming
|
||||
# from one or more video or network cameras attached to a Linux system.
|
||||
# ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
||||
# cameras using a variety of protocols. It is suitable for use as a home
|
||||
# video security system and for commercial or professional video security
|
||||
# and surveillance. It can also be integrated into a home automation system
|
||||
# via X.10 or other protocols.
|
||||
# .
|
||||
# This package provides ZoneMinder Perl libraries; it can be used to
|
||||
# write custom interfaces as well.
|
||||
|
||||
Package: zoneminder-doc
|
||||
Section: doc
|
||||
Architecture: all
|
||||
Multi-Arch: foreign
|
||||
Depends: ${misc:Depends}, ${sphinxdoc:Depends}, python3-sphinx-rtd-theme
|
||||
Suggests: www-browser
|
||||
Description: ZoneMinder documentation
|
||||
ZoneMinder is intended for use in single or multi-camera video security
|
||||
applications, including commercial or home CCTV, theft prevention and child
|
||||
or family member or home monitoring and other care scenarios. It
|
||||
supports capture, analysis, recording, and monitoring of video data coming
|
||||
from one or more video or network cameras attached to a Linux system.
|
||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
||||
cameras using a variety of protocols. It is suitable for use as a home
|
||||
video security system and for commercial or professional video security
|
||||
and surveillance. It can also be integrated into a home automation system
|
||||
via X.10 or other protocols.
|
||||
.
|
||||
This package provides ZoneMinder documentation in HTML format.
|
||||
|
||||
Package: zoneminder-dbg
|
||||
Section: debug
|
||||
Priority: extra
|
||||
Architecture: any
|
||||
Depends: zoneminder (= ${binary:Version}), ${misc:Depends}
|
||||
Description: Zoneminder -- debugging symbols
|
||||
ZoneMinder is intended for use in single or multi-camera video security
|
||||
applications, including commercial or home CCTV, theft prevention and child
|
||||
or family member or home monitoring and other care scenarios. It
|
||||
supports capture, analysis, recording, and monitoring of video data coming
|
||||
from one or more video or network cameras attached to a Linux system.
|
||||
ZoneMinder also support web and semi-automatic control of Pan/Tilt/Zoom
|
||||
cameras using a variety of protocols. It is suitable for use as a home
|
||||
video security system and for commercial or professional video security
|
||||
and surveillance. It can also be integrated into a home automation system
|
||||
via X.10 or other protocols.
|
||||
.
|
||||
This package provides debugging symbols
|
|
@ -1,168 +0,0 @@
|
|||
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: ZoneMinder
|
||||
Upstream-Contact: Philip Coombes <philip.coombes@zoneminder.com>
|
||||
Source: https://github.com/ZoneMinder/ZoneMinder
|
||||
Comment:
|
||||
This package was originally debianized by matrix <matrix@cecilia>
|
||||
on Mon, 7 Mar 2005 02:07:57 -0500.
|
||||
It was re-done for submission to the Debian project by Peter Howard
|
||||
<pjh@northern-ridge.com.au> on Fri, 8 Dec 2006 10:19:43 +1100
|
||||
Files-Excluded:
|
||||
web/skins/*/js/jquery-*
|
||||
|
||||
Files: *
|
||||
Copyright: 2001-2014 Philip Coombes <philip.coombes@zoneminder.com>
|
||||
2008 Brian Rudy <brudyNO@SPAMpraecogito.com>
|
||||
2014 Vincent Giovannone
|
||||
2013 Tim Craig <timcraigNO@SPAMsonic.net>
|
||||
2003-2008 Corey DeLasaux
|
||||
2001-2010 Chris Kistner
|
||||
License: GPL-2+
|
||||
|
||||
Files: distros/*
|
||||
Copyright: 2001-2008 Philip Coombes <philip.coombes@zoneminder.com>
|
||||
2014 Isaac Connor <iconnor@connortechnology.com>
|
||||
2005 Serg Oskin
|
||||
License: GPL-2+
|
||||
|
||||
Files: web/skins/*/js/jquery-*
|
||||
Copyright: 2010 John Resig
|
||||
2010 The Dojo Foundation
|
||||
License: GPL-2 or Expat
|
||||
Comment:
|
||||
Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
http://jquery.org/license
|
||||
.
|
||||
Includes Sizzle.js http://sizzlejs.com/
|
||||
Released under the MIT, BSD, and GPL Licenses.
|
||||
|
||||
Files: web/api/*
|
||||
Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||||
License: Expat
|
||||
|
||||
Files:
|
||||
cmake/Modules/CheckPrototypeDefinition*.cmake
|
||||
cmake/Modules/FindGLIB2.cmake
|
||||
cmake/Modules/FindPolkit.cmake
|
||||
cmake/Modules/GNUInstallDirs.cmake
|
||||
Copyright:
|
||||
2005-2011 Kitware, Inc.
|
||||
2010-2011 Andreas Schneider <asn@cryptomilk.org>
|
||||
2009 Dario Freddi <drf@kde.org>
|
||||
2008 Laurent Montel, <montel@kde.org>
|
||||
2011 Nikita Krupen'ko <krnekit@gmail.com>
|
||||
License: BSD-3-clause
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
.
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
.
|
||||
* Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
.
|
||||
* The names of Kitware, Inc., the Insight Consortium, or the names of
|
||||
any consortium members, or of any contributors, may not be used to
|
||||
endorse or promote products derived from this software without
|
||||
specific prior written permission.
|
||||
.
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS ``AS IS''
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
|
||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Files: cmake/Modules/FindPerlModules.cmake
|
||||
Copyright: 2012 Iowa State University
|
||||
License: Boost-1.0
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
.
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
.
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2015 Dmitry Smirnov <onlyjob@debian.org>
|
||||
2007-2014 Peter Howard <pjh@northern-ridge.com.au>
|
||||
2010-2012 Vagrant Cascadian <vagrant@debian.org>
|
||||
2001-2008 Philip Coombes <philip.coombes@zoneminder.com>
|
||||
License: GPL-2+
|
||||
|
||||
License: Expat
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
.
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
License: GPL-2+
|
||||
This package is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2 of the License, or (at your
|
||||
option) any later version.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this package; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
.
|
||||
The complete text of the GNU General Public License version 2
|
||||
can be found in "/usr/share/common-licenses/GPL-2".
|
||||
|
||||
License: GPL-2
|
||||
This package is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; version 2 of the License.
|
||||
.
|
||||
This package is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
.
|
||||
You should have received a copy of the GNU General Public
|
||||
License along with this package; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
.
|
||||
The complete text of the GNU General Public License version 2
|
||||
can be found in "/usr/share/common-licenses/GPL-2".
|
|
@ -1,32 +0,0 @@
|
|||
location /zm/cgi-bin {
|
||||
gzip off;
|
||||
alias /usr/lib/zoneminder/cgi-bin;
|
||||
|
||||
include /etc/nginx/fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||
fastcgi_pass unix:/var/run/fcgiwrap.socket;
|
||||
}
|
||||
|
||||
location /zm {
|
||||
# if ($scheme ~ ^http:){
|
||||
# rewrite ^(.*)$ https://$host$1 permanent;
|
||||
# }
|
||||
|
||||
gzip off;
|
||||
alias /usr/share/zoneminder/www;
|
||||
index index.php;
|
||||
|
||||
location ~ \.php$ {
|
||||
if (!-f $request_filename) { return 404; }
|
||||
expires epoch;
|
||||
include /etc/nginx/fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME $request_filename;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_pass unix:/var/run/php5-fpm.sock;
|
||||
}
|
||||
|
||||
location ~ \.(jpg|jpeg|gif|png|ico)$ {
|
||||
access_log off;
|
||||
expires 33d;
|
||||
}
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
|
||||
[dch]
|
||||
id-length = 0
|
||||
|
||||
[import-orig]
|
||||
pristine-tar = False
|
||||
merge = False
|
|
@ -1,2 +0,0 @@
|
|||
usr/share/man/man3
|
||||
usr/share/perl5
|
|
@ -1,96 +0,0 @@
|
|||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||
export DEB_LDFLAGS_MAINT_APPEND += -Wl,--as-needed
|
||||
|
||||
ifeq ($(DEB_BUILD_ARCH_OS),hurd)
|
||||
ARGS:= -DZM_NO_MMAP=ON
|
||||
endif
|
||||
|
||||
%:
|
||||
dh $@ --parallel --buildsystem=cmake --builddirectory=dbuild \
|
||||
--with systemd,sphinxdoc,apache2,linktree
|
||||
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- $(ARGS) \
|
||||
-DCMAKE_VERBOSE_MAKEFILE=ON \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DZM_CONFIG_DIR="/etc/zm" \
|
||||
-DZM_CONFIG_SUBDIR="/etc/zm/conf.d" \
|
||||
-DZM_RUNDIR="/run/zm" \
|
||||
-DZM_SOCKDIR="/run/zm" \
|
||||
-DZM_TMPDIR="/tmp/zm" \
|
||||
-DZM_CGIDIR="/usr/lib/zoneminder/cgi-bin" \
|
||||
-DZM_CACHEDIR="/var/cache/zoneminder/cache" \
|
||||
-DZM_DIR_EVENTS="/var/cache/zoneminder/events" \
|
||||
-DZM_PATH_SHUTDOWN="/sbin/shutdown" \
|
||||
-DZM_PATH_ZMS="/zm/cgi-bin/nph-zms"
|
||||
|
||||
override_dh_clean:
|
||||
dh_clean $(MANPAGES1)
|
||||
$(RM) -r docs/_build
|
||||
|
||||
build-indep:
|
||||
#$(MAKE) -C docs text
|
||||
$(MAKE) -C docs html
|
||||
|
||||
MANPAGES1 = dbuild/scripts/zmupdate.pl.1
|
||||
$(MANPAGES1):
|
||||
# generate man page(s):
|
||||
pod2man -s1 --stderr --utf8 $(patsubst %.1, %, $@) $@
|
||||
|
||||
## reproducible build:
|
||||
LAST_CHANGE=$(shell dpkg-parsechangelog -S Date)
|
||||
BUILD_DATE=$(shell LC_ALL=C date -u "+%B %d, %Y" -d "$(LAST_CHANGE)")
|
||||
override_dh_installman: $(MANPAGES1)
|
||||
$(MAKE) -C docs man SPHINXOPTS="-D today=\"$(BUILD_DATE)\""
|
||||
dh_installman --language=C $(MANPAGES1)
|
||||
|
||||
override_dh_auto_install:
|
||||
dh_auto_install --destdir=$(CURDIR)/debian/tmp
|
||||
# remove worthless files:
|
||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*/*/.packlist
|
||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/perl5/*/*.in
|
||||
# remove empty directories:
|
||||
find $(CURDIR)/debian/tmp/usr -type d -empty -delete -printf 'removed %p\n'
|
||||
# remove extra-license-file:
|
||||
$(RM) -v $(CURDIR)/debian/tmp/usr/share/zoneminder/www/api/lib/Cake/LICENSE.txt
|
||||
|
||||
override_dh_fixperms:
|
||||
dh_fixperms
|
||||
#
|
||||
# As requested by the Debian Webapps Policy Manual §3.2.1
|
||||
chown root:www-data $(CURDIR)/debian/zoneminder/etc/zm/zm.conf
|
||||
chmod 640 $(CURDIR)/debian/zoneminder/etc/zm/zm.conf
|
||||
|
||||
override_dh_systemd_start:
|
||||
dh_systemd_start --no-start
|
||||
|
||||
override_dh_systemd_enable:
|
||||
dh_systemd_enable --no-enable
|
||||
|
||||
override_dh_apache2:
|
||||
dh_apache2 --noenable
|
||||
|
||||
override_dh_strip:
|
||||
[ -d "$(CURDIR)/debian/zoneminder-dbg" ] \
|
||||
&& dh_strip --dbg-package=zoneminder-dbg \
|
||||
|| dh_strip
|
||||
|
||||
#%:
|
||||
# dh $@ --parallel --buildsystem=autoconf --with autoreconf
|
||||
#
|
||||
#override_dh_auto_configure:
|
||||
# dh_auto_configure -- \
|
||||
# --sysconfdir=/etc/zm \
|
||||
# --with-mysql=/usr \
|
||||
# --with-webdir=/usr/share/zoneminder \
|
||||
# --with-ffmpeg=/usr \
|
||||
# --with-cgidir=/usr/lib/cgi-bin \
|
||||
# --with-webuser=www-data \
|
||||
# --with-webgroup=www-data \
|
||||
# --enable-mmap=yes
|
|
@ -1 +0,0 @@
|
|||
3.0 (quilt)
|
|
@ -1,5 +0,0 @@
|
|||
## We're using "libjs-jquery" instead.
|
||||
source-is-missing web/skins/*/js/jquery-3.5.1.min.js
|
||||
|
||||
## Acknowledged, will repack eventually.
|
||||
source-contains-prebuilt-javascript-object web/skins/*/js/jquery-3.5.1.min.js
|
|
@ -1,8 +0,0 @@
|
|||
Document: zoneminder-doc
|
||||
Title: Zoneminder documentation
|
||||
Abstract: This document describes how to use Zoneminder.
|
||||
Section: System/Administration
|
||||
|
||||
Format: HTML
|
||||
Index: /usr/share/doc/zoneminder-doc/html/index.html
|
||||
Files: /usr/share/doc/zoneminder-doc/html/*
|
|
@ -1 +0,0 @@
|
|||
docs/_build/html usr/share/doc/zoneminder-doc/
|
|
@ -1,2 +0,0 @@
|
|||
## Convenience symlink:
|
||||
/usr/share/doc/zoneminder-doc/html /usr/share/doc/zoneminder/html
|
|
@ -1 +0,0 @@
|
|||
conf debian/conf/apache2/zoneminder.conf nginx
|
|
@ -1,5 +0,0 @@
|
|||
Unless bug is specific to Debian please consider reporting it directly to
|
||||
upstream developer(s):
|
||||
|
||||
https://github.com/ZoneMinder/ZoneMinder/issues
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
var/log/zm
|
||||
var/lib/zm
|
||||
var/cache/zoneminder/events
|
||||
var/cache/zoneminder/images
|
||||
var/cache/zoneminder/temp
|
||||
var/cache/zoneminder/cache
|
||||
usr/share/zoneminder/db
|
||||
usr/share/zoneminder/fonts
|
||||
etc/zm/
|
||||
etc/zm/conf.d
|
|
@ -1 +0,0 @@
|
|||
README.md
|
|
@ -1,2 +0,0 @@
|
|||
debian/examples/*
|
||||
dbuild/misc/apache.conf
|
|
@ -1,12 +0,0 @@
|
|||
etc/zm/zm.conf
|
||||
etc/zm/conf.d/*
|
||||
usr/bin
|
||||
usr/lib/zoneminder
|
||||
usr/share/polkit-1
|
||||
usr/share/zoneminder/db
|
||||
usr/share/zoneminder/www
|
||||
usr/share/zoneminder/fonts
|
||||
|
||||
# libzoneminder-perl files:
|
||||
usr/share/man/man3
|
||||
usr/share/perl5
|
|
@ -1 +0,0 @@
|
|||
/var/tmp /usr/share/zoneminder/www/api/app/tmp
|
|
@ -1,6 +0,0 @@
|
|||
## cakephp
|
||||
#replace /usr/share/php/Cake /usr/share/zoneminder/www/api/lib/Cake
|
||||
|
||||
## libjs-jquery
|
||||
#replace /usr/share/javascript/jquery/jquery.min.js /usr/share/zoneminder/www/skins/classic/js/jquery-3.5.1.min.js
|
||||
#replace /usr/share/javascript/jquery/jquery.min.js /usr/share/zoneminder/www/skins/flat/js/jquery-3.5.1.min.js
|
|
@ -1,14 +0,0 @@
|
|||
# Depends: policykit-1
|
||||
unusual-interpreter usr/bin/zmsystemctl.pl #!/usr/bin/pkexec
|
||||
|
||||
# Intentionally not others-readable, #637685.
|
||||
non-standard-file-perm etc/zm/zm.conf 0640 != 0644
|
||||
|
||||
# Bundled Cake PHP framework, not intended for direct execution:
|
||||
script-not-executable usr/share/zoneminder/www/api/*
|
||||
|
||||
# Annoying but seems to be too much troubles to fix; should be fixed upstream:
|
||||
script-with-language-extension usr/bin/*.pl
|
||||
|
||||
# dh-linktree:
|
||||
package-contains-broken-symlink usr/share/zoneminder/www/api/lib/Cake/*
|
|
@ -1,13 +0,0 @@
|
|||
/var/log/zm/*.log {
|
||||
missingok
|
||||
notifempty
|
||||
sharedscripts
|
||||
delaycompress
|
||||
compress
|
||||
postrotate
|
||||
/usr/bin/zmpkg.pl logrot >>/dev/null 2>&1 || :
|
||||
endscript
|
||||
daily
|
||||
rotate 7
|
||||
maxage 7
|
||||
}
|
|
@ -1 +0,0 @@
|
|||
rm_conffile /etc/zm/apache.conf 1.28.1-5~
|
|
@ -1 +0,0 @@
|
|||
docs/_build/man/*.1
|
|
@ -1,101 +0,0 @@
|
|||
#! /bin/sh
|
||||
|
||||
set +e
|
||||
|
||||
if [ "$1" = "configure" ]; then
|
||||
|
||||
. /etc/zm/zm.conf
|
||||
for CONFFILE in /etc/zm/conf.d/*.conf; do
|
||||
. "$CONFFILE"
|
||||
done
|
||||
|
||||
# The logs can contain passwords, etc... so by setting group root, only www-data can read them, not people in the www-data group
|
||||
chown www-data:root /var/log/zm
|
||||
chown www-data:www-data /var/lib/zm
|
||||
chown www-data:www-data /var/cache/zoneminder /var/cache/zoneminder/*
|
||||
if [ ! -e "/etc/apache2/mods-enabled/cgi.load" ] && [ "$(command -v a2enmod)" != "" ]; then
|
||||
echo "The cgi module is not enabled in apache2. I am enabling it using a2enmod cgi."
|
||||
a2enmod cgi
|
||||
fi
|
||||
if [ ! -e "/etc/apache2/mods-enabled/rewrite.load" ] && [ "$(command -v a2enmod)" != "" ]; then
|
||||
echo "The rewrite module is not enabled in apache2. I am enabling it using a2enmod rewrite."
|
||||
a2enmod rewrite
|
||||
fi
|
||||
|
||||
if [ "$ZM_DB_HOST" = "localhost" ]; then
|
||||
|
||||
if [ -e "/lib/systemd/system/mysql.service" ] || [ -e "/lib/systemd/system/mariadb.service" ] || [ -e "/etc/init.d/mysql" ]; then
|
||||
# Ensure zoneminder is stopped
|
||||
deb-systemd-invoke stop zoneminder.service || exit $?
|
||||
|
||||
#
|
||||
# Get mysql started if it isn't running
|
||||
#
|
||||
|
||||
if [ -e "/lib/systemd/system/mariadb.service" ]; then
|
||||
DBSERVICE="mariadb.service"
|
||||
else
|
||||
DBSERVICE="mysql.service"
|
||||
fi
|
||||
echo "Detected db service is $DBSERVICE"
|
||||
if systemctl is-failed --quiet $DBSERVICE; then
|
||||
echo "$DBSERVICE is in a failed state; it will not be started."
|
||||
echo "If you have already resolved the problem preventing $DBSERVICE from running,"
|
||||
echo "run sudo systemctl restart $DBSERVICE then run sudo dpkg-reconfigure zoneminder."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! systemctl is-active --quiet mysql.service mariadb.service; then
|
||||
# Due to /etc/init.d service autogeneration, mysql.service always returns the status of mariadb.service
|
||||
# However, mariadb.service will not return the status of mysql.service.
|
||||
deb-systemd-invoke start $DBSERVICE
|
||||
fi
|
||||
|
||||
# Make sure systemctl status exit code is 0; i.e. the DB is running
|
||||
if systemctl is-active --quiet "$DBSERVICE"; then
|
||||
mysqladmin --defaults-file=/etc/mysql/debian.cnf -f reload
|
||||
# test if database if already present...
|
||||
if ! $(echo quit | mysql --defaults-file=/etc/mysql/debian.cnf zm > /dev/null 2> /dev/null) ; then
|
||||
echo "Creating zm db"
|
||||
cat /usr/share/zoneminder/db/zm_create.sql | mysql --defaults-file=/etc/mysql/debian.cnf
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error creating db."
|
||||
exit 1;
|
||||
fi
|
||||
# This creates the user.
|
||||
echo "CREATE USER '${ZM_DB_USER}'@localhost IDENTIFIED BY '${ZM_DB_PASS}';" | mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
||||
fi
|
||||
echo "Updating permissions for user ${ZM_DB_USER}@localhost"
|
||||
echo "GRANT LOCK TABLES,ALTER,DROP,SELECT,INSERT,UPDATE,DELETE,CREATE,INDEX,ALTER ROUTINE,CREATE ROUTINE, TRIGGER,EXECUTE,REFERENCES ON ${ZM_DB_NAME}.* TO '${ZM_DB_USER}'@localhost;" | mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
||||
|
||||
zmupdate.pl -s --nointeractive
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error updating db."
|
||||
exit 1;
|
||||
fi
|
||||
zmupdate.pl --nointeractive -f
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error updating config."
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Add any new PTZ control configurations to the database (will not overwrite)
|
||||
zmcamtool.pl --import >/dev/null 2>&1
|
||||
echo "Done Updating; starting ZoneMinder."
|
||||
else
|
||||
echo 'NOTE: MySQL/MariaDB not running; please start mysql and run dpkg-reconfigure zoneminder when it is running.'
|
||||
fi
|
||||
else
|
||||
echo 'MySQL/MariaDB not found; assuming remote server.'
|
||||
fi
|
||||
|
||||
else
|
||||
echo "Not doing database upgrade due to remote db server ($ZM_DB_HOST)."
|
||||
fi
|
||||
|
||||
echo "Done Updating; starting ZoneMinder."
|
||||
deb-systemd-invoke restart zoneminder.service
|
||||
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
|
@ -1,14 +0,0 @@
|
|||
#! /bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
if [ "$1" = "purge" ]; then
|
||||
echo "
|
||||
Reminder: to completely remove \"zoneminder\" it may be necessary
|
||||
* to delete database using the following sample command:
|
||||
sudo mysqladmin --defaults-file=/etc/mysql/debian.cnf -f drop zm
|
||||
* to delete remaining data files in "/var/cache/zoneminder".
|
||||
"
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
## Remove obsolete symlink which is in the way of dh_apache2:
|
||||
ol="/etc/apache2/conf-available/zoneminder.conf"
|
||||
if [ -h "${ol}" ]; then
|
||||
[ "$(readlink ${ol})" = "/etc/zm/apache.conf" ] && rm -f "${ol}"
|
||||
fi
|
||||
|
||||
#DEBHELPER#
|
|
@ -1,23 +0,0 @@
|
|||
# ZoneMinder systemd unit file
|
||||
# This file is intended to work with Debian distributions
|
||||
|
||||
[Unit]
|
||||
Description=ZoneMinder CCTV recording and surveillance system
|
||||
After=network.target mysql.service
|
||||
# Remarked out so that it will start ZM on machines that don't have mysql installed
|
||||
#Requires=mysql.service
|
||||
|
||||
[Service]
|
||||
#User=www-data
|
||||
Type=forking
|
||||
ExecStart=/usr/bin/zmpkg.pl start
|
||||
ExecReload=/usr/bin/zmpkg.pl restart
|
||||
ExecStop=/usr/bin/zmpkg.pl stop
|
||||
PIDFile=/run/zm/zm.pid
|
||||
Restart=always
|
||||
RestartSec=10
|
||||
Environment=TZ=:/etc/localtime
|
||||
TimeoutSec=600
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
|
@ -1,4 +0,0 @@
|
|||
d /run/zm 0755 www-data www-data
|
||||
d /tmp/zm 0755 www-data www-data
|
||||
d /var/tmp/zm 0755 www-data www-data
|
||||
d /var/cache/zoneminder/cache 0755 www-data www-data
|
|
@ -2,9 +2,8 @@ Source: zoneminder
|
|||
Section: net
|
||||
Priority: optional
|
||||
Maintainer: Isaac Connor <isaac@zoneminder.com>
|
||||
Build-Depends: debhelper (>= 12), sphinx-doc, python3-sphinx, dh-linktree, dh-apache2
|
||||
Build-Depends: debhelper (>= 11), sphinx-doc, python3-sphinx, dh-linktree, dh-apache2
|
||||
,cmake
|
||||
,libavdevice-dev
|
||||
,libavcodec-dev
|
||||
,libavformat-dev
|
||||
,libavutil-dev
|
||||
|
@ -13,7 +12,6 @@ Build-Depends: debhelper (>= 12), sphinx-doc, python3-sphinx, dh-linktree, dh-ap
|
|||
,ffmpeg
|
||||
,net-tools
|
||||
,libbz2-dev
|
||||
,libgcrypt20-dev
|
||||
,libcurl4-gnutls-dev
|
||||
,libjpeg-turbo8-dev | libjpeg62-turbo-dev | libjpeg8-dev | libjpeg9-dev
|
||||
,libturbojpeg0-dev
|
||||
|
@ -39,9 +37,10 @@ Homepage: https://www.zoneminder.com/
|
|||
Package: zoneminder
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
||||
,sudo
|
||||
,javascript-common
|
||||
,libswscale5
|
||||
,libswresample3
|
||||
,libswscale5|libswscale4
|
||||
,libswresample3|libswresample2
|
||||
,ffmpeg
|
||||
,libdate-manip-perl, libmime-lite-perl, libmime-tools-perl
|
||||
,libdbd-mysql-perl
|
||||
|
@ -75,7 +74,7 @@ Depends: ${shlibs:Depends}, ${misc:Depends}, ${perl:Depends}
|
|||
,libcrypt-eksblowfish-perl
|
||||
,libdata-entropy-perl
|
||||
,libvncclient1|libvncclient0
|
||||
,libjwt-gnutls0
|
||||
,libjwt-gnutls0|libjwt0
|
||||
Recommends: ${misc:Recommends}
|
||||
,libapache2-mod-php | php-fpm
|
||||
,default-mysql-server | mariadb-server | virtual-mysql-server
|
||||
|
|
|
@ -41,7 +41,6 @@ Copyright: 2005-2013 Cake Software Foundation, Inc. (http://cakefoundation.org)
|
|||
License: Expat
|
||||
|
||||
Files:
|
||||
cmake/Modules/CheckPrototypeDefinition*.cmake
|
||||
cmake/Modules/FindGLIB2.cmake
|
||||
cmake/Modules/FindPolkit.cmake
|
||||
cmake/Modules/GNUInstallDirs.cmake
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
d /run/zm 0755 www-data www-data
|
||||
d /tmp/zm 0755 www-data www-data
|
||||
d /var/tmp/zm 0755 www-data www-data
|
||||
d /var/tmp/zm 0755 www-data www-data 7d
|
||||
d /var/cache/zoneminder/cache 0755 www-data www-data
|
||||
|
|
|
@ -56,13 +56,13 @@ Add the following to the /etc/apt/sources.list.d/zoneminder.list file
|
|||
::
|
||||
|
||||
# ZoneMinder repository
|
||||
deb https://zmrepo.zoneminder.com/debian/release-1.34 buster/
|
||||
deb https://zmrepo.zoneminder.com/debian/release-1.36 buster/
|
||||
|
||||
You can do this using:
|
||||
|
||||
.. code-block::
|
||||
|
||||
echo "deb https://zmrepo.zoneminder.com/debian/release-1.34 buster/" | sudo tee /etc/apt/sources.list.d/zoneminder.list
|
||||
echo "deb https://zmrepo.zoneminder.com/debian/release-1.36 buster/" | sudo tee /etc/apt/sources.list.d/zoneminder.list
|
||||
|
||||
Because ZoneMinder's package repository provides a secure connection through HTTPS, apt must be enabled for HTTPS.
|
||||
::
|
||||
|
@ -158,7 +158,7 @@ You are now ready to go with ZoneMinder. Open a browser and type either ``localh
|
|||
Easy Way: Debian Stretch
|
||||
------------------------
|
||||
|
||||
This procedure will guide you through the installation of ZoneMinder on Debian 9 (Stretch). This section has been tested with ZoneMinder 1.34 on Debian 9.8.
|
||||
This procedure will guide you through the installation of ZoneMinder on Debian 9 (Stretch). This section has been tested with ZoneMinder 1.36 on Debian 9.8.
|
||||
|
||||
**Step 1:** Make sure your system is up to date
|
||||
|
||||
|
@ -204,7 +204,7 @@ Add the following to the bottom of the file
|
|||
::
|
||||
|
||||
# ZoneMinder repository
|
||||
deb https://zmrepo.zoneminder.com/debian/release-1.34 stretch/
|
||||
deb https://zmrepo.zoneminder.com/debian/release-1.36 stretch/
|
||||
|
||||
CTRL+o and <Enter> to save
|
||||
CTRL+x to exit
|
||||
|
@ -293,175 +293,3 @@ Reload Apache to enable your changes and then start ZoneMinder.
|
|||
sudo systemctl start zoneminder
|
||||
|
||||
You are now ready to go with ZoneMinder. Open a browser and type either ``localhost/zm`` one the local machine or ``{IP-OF-ZM-SERVER}/zm`` if you connect from a remote computer.
|
||||
|
||||
|
||||
Easy Way: Debian Jessie
|
||||
-----------------------
|
||||
|
||||
**Step 1:** Setup Sudo
|
||||
|
||||
By default Debian does not come with sudo. Log in as root or use su command.
|
||||
N.B. The instructions below are for setting up sudo for your current account, you can
|
||||
do this as root if you prefer.
|
||||
|
||||
::
|
||||
|
||||
apt-get update
|
||||
apt-get install sudo
|
||||
usermod -a -G sudo <username>
|
||||
exit
|
||||
|
||||
Logout or try ``newgrp`` to reload user groups
|
||||
|
||||
**Step 2:** Run sudo and update
|
||||
|
||||
Now run session using sudo and ensure system is updated.
|
||||
::
|
||||
|
||||
sudo -i
|
||||
apt-get upgrade
|
||||
|
||||
**Step 3:** Install Apache and MySQL
|
||||
|
||||
These are not dependencies for the package as they could
|
||||
be installed elsewhere.
|
||||
|
||||
::
|
||||
|
||||
apt-get install apache2 mysql-server
|
||||
|
||||
**Step 4:** Edit sources.list to add jessie-backports
|
||||
|
||||
::
|
||||
|
||||
nano /etc/apt/sources.list
|
||||
|
||||
Add the following to the bottom of the file
|
||||
|
||||
::
|
||||
|
||||
# Backports repository
|
||||
deb http://archive.debian.org/debian/ jessie-backports main contrib non-free
|
||||
|
||||
CTRL+o and <Enter> to save
|
||||
CTRL+x to exit
|
||||
|
||||
Run the following
|
||||
|
||||
::
|
||||
|
||||
echo 'Acquire::Check-Valid-Until no;' > /etc/apt/apt.conf.d/99no-check-valid-until
|
||||
|
||||
**Step 5:** Install ZoneMinder
|
||||
|
||||
::
|
||||
|
||||
apt-get update
|
||||
apt-get install zoneminder
|
||||
|
||||
**Step 6:** Read the Readme
|
||||
|
||||
The rest of the install process is covered in the README.Debian, so feel free to have
|
||||
a read.
|
||||
|
||||
::
|
||||
|
||||
zcat /usr/share/doc/zoneminder/README.Debian.gz
|
||||
|
||||
**Step 7:** Setup Database
|
||||
|
||||
Install the zm database and setup the user account. Refer to Hints in Ubuntu install
|
||||
should you choose to change default database user and password.
|
||||
|
||||
::
|
||||
|
||||
cat /usr/share/zoneminder/db/zm_create.sql | sudo mysql --defaults-file=/etc/mysql/debian.cnf
|
||||
echo 'grant lock tables,alter,create,select,insert,update,delete,index on zm.* to 'zmuser'@localhost identified by "zmpass";' | sudo mysql --defaults-file=/etc/mysql/debian.cnf mysql
|
||||
|
||||
**Step 8:** zm.conf Permissions
|
||||
|
||||
Adjust permissions to the zm.conf file to allow web account to access it.
|
||||
|
||||
::
|
||||
|
||||
chgrp -c www-data /etc/zm/zm.conf
|
||||
|
||||
**Step 9:** Setup ZoneMinder service
|
||||
|
||||
::
|
||||
|
||||
systemctl enable zoneminder.service
|
||||
|
||||
**Step 10:** Configure Apache
|
||||
|
||||
The following commands will setup the default /zm virtual directory and configure
|
||||
required apache modules.
|
||||
|
||||
::
|
||||
|
||||
a2enconf zoneminder
|
||||
a2enmod cgi
|
||||
a2enmod rewrite
|
||||
|
||||
**Step 11:** Edit Timezone in PHP
|
||||
|
||||
::
|
||||
|
||||
nano /etc/php5/apache2/php.ini
|
||||
|
||||
Search for [Date] (Ctrl + w then type Date and press Enter) and change
|
||||
date.timezone for your time zone. **Don't forget to remove the ; from in front
|
||||
of date.timezone**
|
||||
|
||||
::
|
||||
|
||||
[Date]
|
||||
; Defines the default timezone used by the date functions
|
||||
; http://php.net/date.timezone
|
||||
date.timezone = America/New_York
|
||||
|
||||
CTRL+o then [Enter] to save
|
||||
|
||||
CTRL+x to exit
|
||||
|
||||
|
||||
**Step 12:** Please check the configuration
|
||||
|
||||
1. Check path of ZM_PATH in '/etc/zm/conf.d/zmcustom.conf' is ZM_PATH_ZMS=/zm/cgi-bin/nph-zms
|
||||
::
|
||||
cat /etc/zm/conf.d/zmcustom.conf
|
||||
|
||||
2. Check config of /etc/apache2/conf-enabled/zoneminder.conf has the same ScriptAlias /zm/cgi-bin that is configured
|
||||
in ZM_PATH. The part /nph-zms has to be left out of the ScriptAlias
|
||||
|
||||
ScriptAlias /zm/cgi-bin "/usr/lib/zoneminder/cgi-bin"
|
||||
<Directory "/usr/lib/zoneminder/cgi-bin">
|
||||
|
||||
::
|
||||
cat /etc/apache2/conf-enabled/zoneminder.conf
|
||||
|
||||
**Step 13:** Start ZoneMinder
|
||||
|
||||
Reload Apache to enable your changes and then start ZoneMinder.
|
||||
|
||||
::
|
||||
|
||||
systemctl reload apache2
|
||||
systemctl start zoneminder
|
||||
|
||||
**Step 14:** Making sure ZoneMinder works
|
||||
|
||||
1. Open up a browser and go to ``http://hostname_or_ip/zm`` - should bring up ZoneMinder Console
|
||||
|
||||
2. (Optional API Check)Open up a tab in the same browser and go to ``http://hostname_or_ip/zm/api/host/getVersion.json``
|
||||
|
||||
If it is working correctly you should get version information similar to the example below:
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
"version": "1.34.0",
|
||||
"apiversion": "1.34.0.1"
|
||||
}
|
||||
|
||||
**Congratulations** Your installation is complete
|
||||
|
|
|
@ -77,7 +77,7 @@ To start the build, simply execute the following command from the root folder of
|
|||
|
||||
OS=<distroname> DIST=<distrorel> utils/packpack/startpackpack.sh
|
||||
|
||||
Where <distroname> is the name of the distro you wish to build on, such as fedora, and <distrorev> is release name or number of the distro you wish to build on. Redhat distros expect a number for <distrorev> while Debian and Ubuntu distros expect a name. For example:
|
||||
Where <distroname> is the name of the distro you wish to build on, such as fedora, and <distrorel> is the release name or number of the distro you wish to build on. Redhat distros expect a number for <distrorel> while Debian and Ubuntu distros expect a name. For example:
|
||||
|
||||
::
|
||||
|
||||
|
@ -85,7 +85,7 @@ Where <distroname> is the name of the distro you wish to build on, such as fedor
|
|||
|
||||
::
|
||||
|
||||
OS=ubuntu DIST=xenial utils/packpack/startpackpack.sh
|
||||
OS=ubuntu DIST=hirsute utils/packpack/startpackpack.sh
|
||||
|
||||
Once you enter the appropriate command, go get a coffee while a ZoneMinder package is built. When the build finished, you can find the resulting packages under a subfolder called "build".
|
||||
|
||||
|
@ -93,13 +93,13 @@ Note that this will build packages with x86_64 architecture. This build method c
|
|||
|
||||
::
|
||||
|
||||
OS=ubuntu DIST=xenial ARCH=i386 utils/packpack/startpackpack.sh
|
||||
OS=ubuntu DIST=hirsute ARCH=i386 utils/packpack/startpackpack.sh
|
||||
|
||||
For advanced users who really want to go out into uncharted waters, it is theoretically possible to build arm packages as well, as long as the host architecture is compatible.
|
||||
|
||||
::
|
||||
|
||||
OS=ubuntu DIST=xenial ARCH=armhfp utils/packpack/startpackpack.sh
|
||||
OS=ubuntu DIST=hirsute ARCH=armhfp utils/packpack/startpackpack.sh
|
||||
|
||||
Building arm packages in this manner has not been tested by us, however.
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ guide you with a quick search.
|
|||
|
||||
::
|
||||
|
||||
add-apt-repository ppa:iconnor/zoneminder-1.34
|
||||
add-apt-repository ppa:iconnor/zoneminder-1.36
|
||||
|
||||
Update repo and upgrade.
|
||||
|
||||
|
@ -176,175 +176,6 @@ CTRL+x to exit
|
|||
|
||||
PPA install may need some tweaking of ZMS_PATH in ZoneMinder options. `Socket_sendto or no live streaming`_
|
||||
|
||||
Easy Way: Ubuntu 16.04 (Xenial)
|
||||
-------------------------------
|
||||
These instructions are for a brand new ubuntu 16.04 system which does not have ZM
|
||||
installed.
|
||||
|
||||
|
||||
It is recommended that you use an Ubuntu Server install and select the LAMP option
|
||||
during install to install Apache, MySQL and PHP. If you failed to do this you can
|
||||
achieve the same result by running:
|
||||
|
||||
::
|
||||
|
||||
sudo tasksel install lamp-server
|
||||
|
||||
During installation it will ask you to set up a master/root password for the MySQL.
|
||||
Installing LAMP is not ZoneMinder specific so you will find plenty of resources to
|
||||
guide you with a quick search.
|
||||
|
||||
**Step 1:** Either run commands in this install using sudo or use the below to become root
|
||||
::
|
||||
|
||||
sudo -i
|
||||
|
||||
**Step 2:** Update Repos
|
||||
|
||||
.. topic :: Latest Release
|
||||
|
||||
ZoneMinder is now part of the current standard Ubuntu repository, but
|
||||
sometimes the official repository can lag behind. To find out check our
|
||||
`releases page <https://github.com/ZoneMinder/zoneminder/releases>`_ for
|
||||
the latest release.
|
||||
|
||||
Alternatively, the ZoneMinder project team maintains a `PPA <https://askubuntu.com/questions/4983/what-are-ppas-and-how-do-i-use-them>`_, which is updated immediately
|
||||
following a new release of ZoneMinder. To use this repository instead of the
|
||||
official Ubuntu repository, enter the following from the command line:
|
||||
|
||||
::
|
||||
|
||||
add-apt-repository ppa:iconnor/zoneminder
|
||||
add-apt-repository ppa:iconnor/zoneminder-1.32
|
||||
|
||||
Update repo and upgrade.
|
||||
|
||||
::
|
||||
|
||||
apt-get update
|
||||
apt-get upgrade
|
||||
apt-get dist-upgrade
|
||||
|
||||
|
||||
**Step 3:** Configure MySQL
|
||||
|
||||
.. sidebar :: Note
|
||||
|
||||
The MySQL default configuration file (/etc/mysql/mysql.cnf)is read through
|
||||
several symbolic links beginning with /etc/mysql/my.cnf as follows:
|
||||
|
||||
| /etc/mysql/my.cnf -> /etc/alternatives/my.cnf
|
||||
| /etc/alternatives/my.cnf -> /etc/mysql/mysql.cnf
|
||||
| /etc/mysql/mysql.cnf is a basic file
|
||||
|
||||
Certain new defaults in MySQL 5.7 cause some issues with ZoneMinder < 1.32.0,
|
||||
the workaround is to modify the sql_mode setting of MySQL. Please note that these
|
||||
changes are NOT required for ZoneMinder 1.32.0 and some people have reported them
|
||||
causing problems in 1.32.0.
|
||||
|
||||
To better manage the MySQL server it is recommended to copy the sample config file and
|
||||
replace the default my.cnf symbolic link.
|
||||
|
||||
::
|
||||
|
||||
rm /etc/mysql/my.cnf (this removes the current symbolic link)
|
||||
cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/my.cnf
|
||||
|
||||
To change MySQL settings:
|
||||
|
||||
::
|
||||
|
||||
nano /etc/mysql/my.cnf
|
||||
|
||||
In the [mysqld] section add the following
|
||||
|
||||
::
|
||||
|
||||
sql_mode = NO_ENGINE_SUBSTITUTION
|
||||
|
||||
CTRL+o then [Enter] to save
|
||||
|
||||
CTRL+x to exit
|
||||
|
||||
Restart MySQL
|
||||
|
||||
::
|
||||
|
||||
systemctl restart mysql
|
||||
|
||||
|
||||
**Step 4:** Install ZoneMinder
|
||||
|
||||
::
|
||||
|
||||
apt-get install zoneminder
|
||||
|
||||
**Step 5:** Configure the ZoneMinder Database
|
||||
|
||||
This step should not be required on ZoneMinder 1.32.0.
|
||||
|
||||
::
|
||||
|
||||
mysql -uroot -p < /usr/share/zoneminder/db/zm_create.sql
|
||||
mysql -uroot -p -e "grant lock tables,alter,drop,select,insert,update,delete,create,index,alter routine,create routine, trigger,execute on zm.* to 'zmuser'@localhost identified by 'zmpass';"
|
||||
|
||||
|
||||
**Step 6:** Set permissions
|
||||
|
||||
Set /etc/zm/zm.conf to root:www-data 740 and www-data access to content
|
||||
|
||||
::
|
||||
|
||||
chmod 740 /etc/zm/zm.conf
|
||||
chown root:www-data /etc/zm/zm.conf
|
||||
chown -R www-data:www-data /usr/share/zoneminder/
|
||||
|
||||
**Step 7:** Configure Apache correctly:
|
||||
|
||||
::
|
||||
|
||||
a2enmod cgi
|
||||
a2enmod rewrite
|
||||
a2enconf zoneminder
|
||||
|
||||
You may also want to enable to following modules to improve caching performance
|
||||
|
||||
::
|
||||
|
||||
a2enmod expires
|
||||
a2enmod headers
|
||||
|
||||
**Step 8:** Enable and start Zoneminder
|
||||
|
||||
::
|
||||
|
||||
systemctl enable zoneminder
|
||||
systemctl start zoneminder
|
||||
|
||||
**Step 10:** Reload Apache service
|
||||
|
||||
::
|
||||
|
||||
systemctl reload apache2
|
||||
|
||||
**Step 11:** Making sure ZoneMinder works
|
||||
|
||||
1. Open up a browser and go to ``http://hostname_or_ip/zm`` - should bring up ZoneMinder Console
|
||||
|
||||
2. (Optional API Check)Open up a tab in the same browser and go to ``http://hostname_or_ip/zm/api/host/getVersion.json``
|
||||
|
||||
If it is working correctly you should get version information similar to the example below:
|
||||
|
||||
::
|
||||
|
||||
{
|
||||
"version": "1.34.0",
|
||||
"apiversion": "1.34.0.1"
|
||||
}
|
||||
|
||||
**Congratulations** Your installation is complete
|
||||
|
||||
PPA install may need some tweaking of ZMS_PATH in ZoneMinder options. `Socket_sendto or no live streaming`_
|
||||
|
||||
Harder Way: Build Package From Source
|
||||
-------------------------------------
|
||||
|
@ -382,7 +213,7 @@ To build the latest stable release:
|
|||
|
||||
|
||||
Note that the distribution will be guessed using ``lsb_release -a 2>/dev/null | grep Codename | awk '{print $2}'``
|
||||
which simply extracts your distribution name - like "xenial", "bionic" etc. You
|
||||
which simply extracts your distribution name - like "bionic", "hirsute" etc. You
|
||||
can always specify it using --distro=your distro name if you know it. As far as the script
|
||||
goes, it checks if your distro is "trusty" in which case it pulls in pre-systemd
|
||||
release configurations and if its not "trusty" it assumes its based on systemd
|
||||
|
|
|
@ -101,6 +101,6 @@ FROM_EMAIL - The emails or messages that will be sent to you informing you of ev
|
|||
|
||||
URL - The emails or messages that will be sent to you informing you of events can include a link to the events themselves for easy viewing. If you intend to use this feature then set this option to the url of your installation as it would appear from where you read your email, e.g. ``http://host.your.domain/zm/index.php``.
|
||||
|
||||
SSMTP_MAIL - SSMTP is a lightweight and efficient method to send email. The SSMTP application is not installed by default. NEW_MAIL_MODULES must also be enabled. Please visit the ZoneMinder `SSMTP Wiki page <http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder>`__ for setup and configuration help.
|
||||
SSMTP_MAIL - SSMTP is a lightweight and efficient method to send email. The SSMTP application is not installed by default. NEW_MAIL_MODULES must also be enabled. Please visit the ZoneMinder `SSMTP Wiki page <https://wiki.zoneminder.com/How_to_get_ssmtp_working_with_Zoneminder>`__ for setup and configuration help.
|
||||
|
||||
SSMTP_PATH - The path to the SSMTP application. If path is not defined. Zoneminder will try to determine the path via shell command. Example path: /usr/sbin/ssmtp.
|
||||
SSMTP_PATH - The path to the SSMTP application. If path is not defined. Zoneminder will try to determine the path via shell command. Example path: /usr/sbin/ssmtp.
|
||||
|
|
|
@ -5,10 +5,7 @@ This screen lets you customize several aspects of the web interface of ZoneMinde
|
|||
.. image:: images/Options_web.png
|
||||
|
||||
|
||||
WEB_TITLE -
|
||||
|
||||
.. todo ::
|
||||
not quite sure what this does. Seems to change the "target" name - not sure what effect it is supposed to have.
|
||||
WEB_TITLE - The actual text that is shown on the login screen. It is possible that it also appears in other areas.
|
||||
|
||||
WEB_TITLE_PREFIX - If you have more than one installation of ZoneMinder it can be helpful to display different titles for each one. Changing this option allows you to customise the window titles to include further information to aid identification.
|
||||
|
||||
|
@ -48,4 +45,4 @@ WEB_USE_OBJECT_TAGS - There are two methods of including media content in web pa
|
|||
|
||||
WEB_XFRAME_WARN - When creating a Web Site monitor, if the target web site has X-Frame-Options set to sameorigin in the header, the site will not display in ZoneMinder. This is a design feature in most modern browsers. When this condition occurs, ZoneMinder will write a warning to the log file. To get around this, one can install a browser plugin or extension to ignore X-Frame headers, and then the page will display properly. Once the plugin or extension has ben installed, the end user may choose to turn this warning off
|
||||
|
||||
WEB_FILTER_SOURCE - This option only affects monitors with a source type of Ffmpeg, Libvlc, or WebSite. This setting controls what information is displayed in the Source column on the console. Selecting 'None' will not filter anything. The entire source string will be displayed, which may contain sensitive information. Selecting 'NoCredentials' will strip out usernames and passwords from the string. If there are any port numbers in the string and they are common (80, 554, etc) then those will be removed as well. Selecting 'Hostname' will filter out all information except for the hostname or ip address. When in doubt, stay with the default 'Hostname'. This feature uses the php function 'url_parts' to identify the various pieces of the url. If the url in question is unusual or not standard in some way, then filtering may not produce the desired results.
|
||||
WEB_FILTER_SOURCE - This option only affects monitors with a source type of Ffmpeg, Libvlc, or WebSite. This setting controls what information is displayed in the Source column on the console. Selecting 'None' will not filter anything. The entire source string will be displayed, which may contain sensitive information. Selecting 'NoCredentials' will strip out usernames and passwords from the string. If there are any port numbers in the string and they are common (80, 554, etc) then those will be removed as well. Selecting 'Hostname' will filter out all information except for the hostname or ip address. When in doubt, stay with the default 'Hostname'. This feature uses the php function 'url_parts' to identify the various pieces of the url. If the url in question is unusual or not standard in some way, then filtering may not produce the desired results.
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
failregex = ^\s*web_php\[\d+\]\.ERR \[<HOST>\].*includes/auth.php
|
||||
datepattern = ^%%m/%%d/%%y %%H:%%M:%%S(?:\.%%f)
|
|
@ -308,7 +308,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_AUTH_HASH_IPS',
|
||||
default => 'yes',
|
||||
default => 'no',
|
||||
description => 'Include IP addresses in the authentication hash',
|
||||
help => q`
|
||||
When ZoneMinder is running in hashed authenticated mode it can
|
||||
|
@ -346,7 +346,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_AUTH_HASH_LOGINS',
|
||||
default => 'no',
|
||||
default => 'yes',
|
||||
description => 'Allow login by authentication hash',
|
||||
help => q`
|
||||
The normal process for logging into ZoneMinder is via the login
|
||||
|
@ -508,7 +508,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_SYSTEM_SHUTDOWN',
|
||||
default => 'yes',
|
||||
default => 'no',
|
||||
description => 'Allow Admin users to power off or restart the system from the ZoneMinder UI.',
|
||||
help => 'The system will need to have sudo installed and the following added to /etc/sudoers~~
|
||||
~~
|
||||
|
@ -1096,7 +1096,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_LOG_LEVEL_SYSLOG',
|
||||
default => '0',
|
||||
default => '-1',
|
||||
description => 'Save logging output to the system log',
|
||||
help => q`
|
||||
ZoneMinder logging is now more integrated between
|
||||
|
@ -1604,7 +1604,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_WEB_EVENT_DISK_SPACE',
|
||||
default => 'no',
|
||||
default => 'yes',
|
||||
description => 'Whether to show disk space used by each event.',
|
||||
help => q`
|
||||
Adds another column to the listing of events
|
||||
|
@ -1634,7 +1634,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_WEB_ID_ON_CONSOLE',
|
||||
default => 'no',
|
||||
default => 'yes',
|
||||
description => 'Should the console list the monitor id',
|
||||
help => q`
|
||||
Some find it useful to have the id always visible
|
||||
|
@ -2270,7 +2270,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_MAX_RESTART_DELAY',
|
||||
default => '600',
|
||||
default => '30',
|
||||
description => 'Maximum delay (in seconds) for daemon restart attempts.',
|
||||
help => q`
|
||||
The zmdc (zm daemon control) process controls when processeses
|
||||
|
@ -2855,7 +2855,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_WEB_H_REFRESH_MAIN',
|
||||
default => '60',
|
||||
default => '240',
|
||||
introduction => q`
|
||||
There are now a number of options that are grouped into
|
||||
bandwidth categories, this allows you to configure the
|
||||
|
@ -3113,7 +3113,7 @@ our @options = (
|
|||
},
|
||||
{
|
||||
name => 'ZM_WEB_H_AJAX_TIMEOUT',
|
||||
default => '3000',
|
||||
default => '10000',
|
||||
description => 'How long to wait for Ajax request responses (ms)',
|
||||
help => q`
|
||||
The newer versions of the live feed and event views use Ajax to
|
||||
|
@ -3766,7 +3766,7 @@ our @options = (
|
|||
SSMTP is a lightweight and efficient method to send email.
|
||||
The SSMTP application is not installed by default.
|
||||
NEW_MAIL_MODULES must also be enabled.
|
||||
Please visit the ZoneMinder [SSMTP Wiki page](http://www.zoneminder.com/wiki/index.php/How_to_get_ssmtp_working_with_Zoneminder)
|
||||
Please visit the ZoneMinder [SSMTP Wiki page](https://wiki.zoneminder.com/How_to_get_ssmtp_working_with_Zoneminder)
|
||||
for setup and configuration help.
|
||||
`,
|
||||
type => $types{boolean},
|
||||
|
|
|
@ -220,14 +220,14 @@ sub moveConUpRight {
|
|||
my $self = shift;
|
||||
Debug('Move Diagonally Up Right');
|
||||
$$self{Monitor}->suspendMotionDetection() if !$self->{Monitor}->{ModectDuringPTZ};
|
||||
$$self{LastCmd} = 'code=RightUp&channel=0&arg1=0&arg2=1&arg3=0';
|
||||
$$self{LastCmd} = 'code=RightUp&channel=0&arg1=1&arg2=1&arg3=0';
|
||||
$self->sendCmd('cgi-bin/ptz.cgi?action=start&'.$$self{LastCmd});
|
||||
}
|
||||
|
||||
sub moveConDownRight {
|
||||
my $self = shift;
|
||||
Debug('Move Diagonally Down Right');
|
||||
$$self{LastCmd} = 'code=RightDown&channel=0&arg1=0&arg2=1&arg3=0';
|
||||
$$self{LastCmd} = 'code=RightDown&channel=0&arg1=1&arg2=1&arg3=0';
|
||||
$$self{Monitor}->suspendMotionDetection() if !$self->{Monitor}->{ModectDuringPTZ};
|
||||
$self->sendCmd('cgi-bin/ptz.cgi?action=start&'.$$self{LastCmd});
|
||||
}
|
||||
|
@ -236,7 +236,7 @@ sub moveConUpLeft {
|
|||
my $self = shift;
|
||||
Debug('Move Diagonally Up Left');
|
||||
$$self{Monitor}->suspendMotionDetection() if !$self->{Monitor}->{ModectDuringPTZ};
|
||||
$$self{LastCmd} = 'code=LeftUp&channel=0&arg1=0&arg2=1&arg3=0';
|
||||
$$self{LastCmd} = 'code=LeftUp&channel=0&arg1=1&arg2=1&arg3=0';
|
||||
$self->sendCmd('cgi-bin/ptz.cgi?action=start&'.$$self{LastCmd});
|
||||
}
|
||||
|
||||
|
@ -244,7 +244,7 @@ sub moveConDownLeft {
|
|||
my $self = shift;
|
||||
Debug('Move Diagonally Down Left');
|
||||
$$self{Monitor}->suspendMotionDetection() if !$self->{Monitor}->{ModectDuringPTZ};
|
||||
$$self{LastCmd} = 'code=LeftDown&channel=0&arg1=0&arg2=1&arg3=0';
|
||||
$$self{LastCmd} = 'code=LeftDown&channel=0&arg1=1&arg2=1&arg3=0';
|
||||
$self->sendCmd('cgi-bin/ptz.cgi?action=start&'.$$self{LastCmd});
|
||||
}
|
||||
|
||||
|
|
|
@ -283,7 +283,7 @@ None by default.
|
|||
=head1 SEE ALSO
|
||||
|
||||
See if there are better instructions for the DCS-5020L at
|
||||
http://www.zoneminder.com/wiki/index.php/Dlink
|
||||
https://wiki.zoneminder.com/Dlink
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
|
|
|
@ -107,6 +107,7 @@ sub zmDbConnect {
|
|||
.$socket . $sslOptions . ($options?join(';', '', map { $_.'='.$$options{$_} } keys %{$options} ) : '')
|
||||
, $ZoneMinder::Config::Config{ZM_DB_USER}
|
||||
, $ZoneMinder::Config::Config{ZM_DB_PASS}
|
||||
, { mysql_enable_utf8 => 1, }
|
||||
);
|
||||
};
|
||||
if ( !$dbh or $@ ) {
|
||||
|
|
|
@ -127,9 +127,11 @@ sub Execute {
|
|||
foreach my $term ( @{$$self{PostSQLConditions}} ) {
|
||||
if ( $$term{attr} eq 'ExistsInFileSystem' ) {
|
||||
foreach my $row ( @results ) {
|
||||
my $event = new ZoneMinder::Event($row);
|
||||
my $event = new ZoneMinder::Event($$row{Id}, $row);
|
||||
if ( -e $event->Path() ) {
|
||||
push @filtered_events, $row;
|
||||
push @filtered_events, $row if $$term{val} eq 'true';
|
||||
} else {
|
||||
push @filtered_events, $row if $$term{val} eq 'false';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -164,138 +166,142 @@ sub Sql {
|
|||
if ( exists($term->{obr}) ) {
|
||||
$self->{Sql} .= str_repeat('(', $term->{obr}).' ';
|
||||
}
|
||||
if (!$term->{attr}) {
|
||||
Error("Invalid term in filter $$self{Id}. Empty attr");
|
||||
next;
|
||||
}
|
||||
|
||||
my $value = $term->{val};
|
||||
my @value_list;
|
||||
if ( $term->{attr} ) {
|
||||
if ( $term->{attr} eq 'AlarmedZoneId' ) {
|
||||
$term->{op} = 'EXISTS';
|
||||
} elsif ( $term->{attr} =~ /^Monitor/ ) {
|
||||
$sql = 'SELECT E.*, unix_timestamp(E.StartDateTime) as Time, M.Name as MonitorName
|
||||
FROM Events as E INNER JOIN Monitors as M on M.Id = E.MonitorId';
|
||||
my ( $temp_attr_name ) = $term->{attr} =~ /^Monitor(.+)$/;
|
||||
$self->{Sql} .= 'M.'.$temp_attr_name;
|
||||
} elsif ( $term->{attr} eq 'ServerId' or $term->{attr} eq 'MonitorServerId' ) {
|
||||
$sql = 'SELECT E.*, unix_timestamp(E.StartDateTime) as Time, M.Name as MonitorName
|
||||
FROM Events as E INNER JOIN Monitors as M on M.Id = E.MonitorId';
|
||||
$self->{Sql} .= 'M.ServerId';
|
||||
} elsif ( $term->{attr} eq 'StorageServerId' ) {
|
||||
$self->{Sql} .= '(SELECT Storage.ServerId FROM Storage WHERE Storage.Id=E.StorageId)';
|
||||
} elsif ( $term->{attr} eq 'FilterServerId' ) {
|
||||
$self->{Sql} .= $Config{ZM_SERVER_ID};
|
||||
# StartTime options
|
||||
} elsif ( $term->{attr} eq 'DateTime' ) {
|
||||
$self->{Sql} .= 'E.StartDateTime';
|
||||
} elsif ( $term->{attr} eq 'Date' ) {
|
||||
$self->{Sql} .= 'to_days( E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'StartDate' ) {
|
||||
$self->{Sql} .= 'to_days( E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'Time' or $term->{attr} eq 'StartTime' ) {
|
||||
$self->{Sql} .= 'extract( hour_second from E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'Weekday' or $term->{attr} eq 'StartWeekday' ) {
|
||||
$self->{Sql} .= 'weekday( E.StartDateTime )';
|
||||
|
||||
# EndTIme options
|
||||
} elsif ( $term->{attr} eq 'EndDateTime' ) {
|
||||
$self->{Sql} .= 'E.EndDateTime';
|
||||
} elsif ( $term->{attr} eq 'EndDate' ) {
|
||||
$self->{Sql} .= 'to_days( E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'EndTime' ) {
|
||||
$self->{Sql} .= 'extract( hour_second from E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'EndWeekday' ) {
|
||||
$self->{Sql} .= 'weekday( E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'ExistsInFileSystem' ) {
|
||||
push @{$self->{PostSQLConditions}}, $term;
|
||||
$self->{Sql} .= 'TRUE /* ExistsInFileSystem */';
|
||||
} elsif ( $term->{attr} eq 'DiskPercent' ) {
|
||||
$self->{Sql} .= 'zmDiskPercent';
|
||||
$self->{HasDiskPercent} = !undef;
|
||||
} elsif ( $term->{attr} eq 'DiskBlocks' ) {
|
||||
$self->{Sql} .= 'zmDiskBlocks';
|
||||
$self->{HasDiskBlocks} = !undef;
|
||||
} elsif ( $term->{attr} eq 'SystemLoad' ) {
|
||||
$self->{Sql} .= 'zmSystemLoad';
|
||||
$self->{HasSystemLoad} = !undef;
|
||||
} else {
|
||||
$self->{Sql} .= 'E.'.$term->{attr};
|
||||
}
|
||||
if ( $term->{attr} eq 'AlarmedZoneId' ) {
|
||||
$term->{op} = 'EXISTS';
|
||||
} elsif ( $term->{attr} =~ /^Monitor/ ) {
|
||||
$sql = 'SELECT E.*, unix_timestamp(E.StartDateTime) as Time, M.Name as MonitorName
|
||||
FROM Events as E INNER JOIN Monitors as M on M.Id = E.MonitorId';
|
||||
my ( $temp_attr_name ) = $term->{attr} =~ /^Monitor(.+)$/;
|
||||
$self->{Sql} .= 'M.'.$temp_attr_name;
|
||||
} elsif ( $term->{attr} eq 'ServerId' or $term->{attr} eq 'MonitorServerId' ) {
|
||||
$sql = 'SELECT E.*, unix_timestamp(E.StartDateTime) as Time, M.Name as MonitorName
|
||||
FROM Events as E INNER JOIN Monitors as M on M.Id = E.MonitorId';
|
||||
$self->{Sql} .= 'M.ServerId';
|
||||
} elsif ( $term->{attr} eq 'StorageServerId' ) {
|
||||
$self->{Sql} .= '(SELECT Storage.ServerId FROM Storage WHERE Storage.Id=E.StorageId)';
|
||||
} elsif ( $term->{attr} eq 'FilterServerId' ) {
|
||||
$self->{Sql} .= $Config{ZM_SERVER_ID};
|
||||
# StartTime options
|
||||
} elsif ( $term->{attr} eq 'DateTime' ) {
|
||||
$self->{Sql} .= 'E.StartDateTime';
|
||||
} elsif ( $term->{attr} eq 'Date' ) {
|
||||
$self->{Sql} .= 'to_days( E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'StartDate' ) {
|
||||
$self->{Sql} .= 'to_days( E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'Time' or $term->{attr} eq 'StartTime' ) {
|
||||
$self->{Sql} .= 'extract( hour_second from E.StartDateTime )';
|
||||
} elsif ( $term->{attr} eq 'Weekday' or $term->{attr} eq 'StartWeekday' ) {
|
||||
$self->{Sql} .= 'weekday( E.StartDateTime )';
|
||||
|
||||
if ( $term->{attr} eq 'ExistsInFileSystem' ) {
|
||||
# PostCondition, so no further SQL
|
||||
} else {
|
||||
( my $stripped_value = $value ) =~ s/^["\']+?(.+)["\']+?$/$1/;
|
||||
foreach my $temp_value ( split( /["'\s]*?,["'\s]*?/, $stripped_value ) ) {
|
||||
# EndTIme options
|
||||
} elsif ( $term->{attr} eq 'EndDateTime' ) {
|
||||
$self->{Sql} .= 'E.EndDateTime';
|
||||
} elsif ( $term->{attr} eq 'EndDate' ) {
|
||||
$self->{Sql} .= 'to_days( E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'EndTime' ) {
|
||||
$self->{Sql} .= 'extract( hour_second from E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'EndWeekday' ) {
|
||||
$self->{Sql} .= 'weekday( E.EndDateTime )';
|
||||
} elsif ( $term->{attr} eq 'ExistsInFileSystem' ) {
|
||||
push @{$self->{PostSQLConditions}}, $term;
|
||||
$self->{Sql} .= 'TRUE /* ExistsInFileSystem */';
|
||||
} elsif ( $term->{attr} eq 'DiskPercent' ) {
|
||||
$self->{Sql} .= 'zmDiskPercent';
|
||||
$self->{HasDiskPercent} = !undef;
|
||||
} elsif ( $term->{attr} eq 'DiskBlocks' ) {
|
||||
$self->{Sql} .= 'zmDiskBlocks';
|
||||
$self->{HasDiskBlocks} = !undef;
|
||||
} elsif ( $term->{attr} eq 'SystemLoad' ) {
|
||||
$self->{Sql} .= 'zmSystemLoad';
|
||||
$self->{HasSystemLoad} = !undef;
|
||||
} else {
|
||||
$self->{Sql} .= 'E.'.$term->{attr};
|
||||
}
|
||||
|
||||
if ( $term->{attr} eq 'AlarmedZoneId' ) {
|
||||
$value = '(SELECT * FROM Stats WHERE EventId=E.Id AND Score > 0 AND ZoneId='.$value.')';
|
||||
} elsif ( $term->{attr} =~ /^MonitorName/ ) {
|
||||
$value = "'$temp_value'";
|
||||
} elsif ( $term->{attr} =~ /ServerId/) {
|
||||
Debug("ServerId, temp_value is ($temp_value) ($ZoneMinder::Config::Config{ZM_SERVER_ID})");
|
||||
if ( $temp_value eq 'ZM_SERVER_ID' ) {
|
||||
$value = "'$ZoneMinder::Config::Config{ZM_SERVER_ID}'";
|
||||
# This gets used later, I forget for what
|
||||
$$self{Server} = new ZoneMinder::Server($ZoneMinder::Config::Config{ZM_SERVER_ID});
|
||||
} elsif ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = "'$temp_value'";
|
||||
# This gets used later, I forget for what
|
||||
$$self{Server} = new ZoneMinder::Server($temp_value);
|
||||
}
|
||||
} elsif ( $term->{attr} eq 'StorageId' ) {
|
||||
$value = "'$temp_value'";
|
||||
$$self{Storage} = new ZoneMinder::Storage($temp_value);
|
||||
} elsif ( $term->{attr} eq 'Name'
|
||||
|| $term->{attr} eq 'Cause'
|
||||
|| $term->{attr} eq 'Notes'
|
||||
) {
|
||||
if ( $term->{op} eq 'LIKE'
|
||||
|| $term->{op} eq 'NOT LIKE'
|
||||
) {
|
||||
$temp_value = '%'.$temp_value.'%' if $temp_value !~ /%/;
|
||||
}
|
||||
$value = "'$temp_value'";
|
||||
} elsif ( $term->{attr} eq 'DateTime' or $term->{attr} eq 'StartDateTime' or $term->{attr} eq 'EndDateTime' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "'$value'";
|
||||
}
|
||||
} elsif ( $term->{attr} eq 'Date' or $term->{attr} eq 'StartDate' or $term->{attr} eq 'EndDate' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} elsif ( $temp_value eq 'CURDATE()' or $temp_value eq 'NOW()' ) {
|
||||
$value = 'to_days('.$temp_value.')';
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "to_days( '$value' )";
|
||||
}
|
||||
} elsif ( $term->{attr} eq 'Time' or $term->{attr} eq 'StartTime' or $term->{attr} eq 'EndTime' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "extract( hour_second from '$value' )";
|
||||
}
|
||||
} else {
|
||||
if ( $term->{attr} eq 'ExistsInFileSystem' ) {
|
||||
# PostCondition, so no further SQL
|
||||
} else {
|
||||
( my $stripped_value = $value ) =~ s/^["\']+?(.+)["\']+?$/$1/;
|
||||
foreach my $temp_value ( split( /["'\s]*?,["'\s]*?/, $stripped_value ) ) {
|
||||
|
||||
if ( $term->{attr} eq 'AlarmedZoneId' ) {
|
||||
$value = '(SELECT * FROM Stats WHERE EventId=E.Id AND Score > 0 AND ZoneId='.$value.')';
|
||||
} elsif ( $term->{attr} =~ /^MonitorName/ ) {
|
||||
$value = "'$temp_value'";
|
||||
} elsif ( $term->{attr} =~ /ServerId/) {
|
||||
Debug("ServerId, temp_value is ($temp_value) ($ZoneMinder::Config::Config{ZM_SERVER_ID})");
|
||||
if ( $temp_value eq 'ZM_SERVER_ID' ) {
|
||||
$value = "'$ZoneMinder::Config::Config{ZM_SERVER_ID}'";
|
||||
# This gets used later, I forget for what
|
||||
$$self{Server} = new ZoneMinder::Server($ZoneMinder::Config::Config{ZM_SERVER_ID});
|
||||
} elsif ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = "'$temp_value'";
|
||||
# This gets used later, I forget for what
|
||||
$$self{Server} = new ZoneMinder::Server($temp_value);
|
||||
}
|
||||
push @value_list, $value;
|
||||
} # end foreach temp_value
|
||||
} # end if has an attr
|
||||
} elsif ( $term->{attr} eq 'StorageId' ) {
|
||||
$value = "'$temp_value'";
|
||||
$$self{Storage} = new ZoneMinder::Storage($temp_value);
|
||||
} elsif ( $term->{attr} eq 'Name'
|
||||
|| $term->{attr} eq 'Cause'
|
||||
|| $term->{attr} eq 'Notes'
|
||||
) {
|
||||
if ( $term->{op} eq 'LIKE'
|
||||
|| $term->{op} eq 'NOT LIKE'
|
||||
) {
|
||||
$temp_value = '%'.$temp_value.'%' if $temp_value !~ /%/;
|
||||
}
|
||||
$value = "'$temp_value'";
|
||||
} elsif ( $term->{attr} eq 'DateTime' or $term->{attr} eq 'StartDateTime' or $term->{attr} eq 'EndDateTime' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "'$value'";
|
||||
}
|
||||
} elsif ( $term->{attr} eq 'Date' or $term->{attr} eq 'StartDate' or $term->{attr} eq 'EndDate' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} elsif ( $temp_value eq 'CURDATE()' or $temp_value eq 'NOW()' ) {
|
||||
$value = 'to_days('.$temp_value.')';
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "to_days( '$value' )";
|
||||
}
|
||||
} elsif ( $term->{attr} eq 'Time' or $term->{attr} eq 'StartTime' or $term->{attr} eq 'EndTime' ) {
|
||||
if ( $temp_value eq 'NULL' ) {
|
||||
$value = $temp_value;
|
||||
} else {
|
||||
$value = DateTimeToSQL($temp_value);
|
||||
if ( !$value ) {
|
||||
Error("Error parsing date/time '$temp_value', skipping filter '$self->{Name}'");
|
||||
return;
|
||||
}
|
||||
$value = "extract( hour_second from '$value' )";
|
||||
}
|
||||
} else {
|
||||
$value = $temp_value;
|
||||
}
|
||||
push @value_list, $value;
|
||||
} # end foreach temp_value
|
||||
|
||||
if ( $term->{op} ) {
|
||||
if ( $term->{op} eq '=~' ) {
|
||||
|
|
|
@ -136,8 +136,8 @@ $serial = $primary_key = 'Id';
|
|||
%defaults = (
|
||||
ServerId => 0,
|
||||
StorageId => 0,
|
||||
Type => 'Ffmpeg',
|
||||
Function => 'Mocord',
|
||||
Type => q`'Ffmpeg'`,
|
||||
Function => q`'Mocord'`,
|
||||
Enabled => 1,
|
||||
LinkedMonitors => undef,
|
||||
Device => '',
|
||||
|
@ -166,15 +166,15 @@ $serial = $primary_key = 'Id';
|
|||
VideoWriter => 0,
|
||||
OutputCodec => undef,
|
||||
OutputContainer => undef,
|
||||
EncoderParameters => "# Lines beginning with # are a comment \n# For changing quality, use the crf option\n# 1 is best, 51 is worst quality\n#crf=23\n",
|
||||
EncoderParameters => '',
|
||||
RecordAudio=>0,
|
||||
RTSPDescribe=>0,
|
||||
Brightness => -1,
|
||||
Contrast => -1,
|
||||
Hue => -1,
|
||||
Colour => -1,
|
||||
EventPrefix => 'Event-',
|
||||
LabelFormat => '%N - %d/%m/%y %H:%M:%S',
|
||||
EventPrefix => q`'Event-'`,
|
||||
LabelFormat => '',
|
||||
LabelX => 0,
|
||||
LabelY => 0,
|
||||
LabelSize => 1,
|
||||
|
@ -208,13 +208,13 @@ $serial = $primary_key = 'Id';
|
|||
DefaultRate => 100,
|
||||
DefaultScale => 100,
|
||||
SignalCheckPoints => 0,
|
||||
SignalCheckColour => '#0000BE',
|
||||
WebColour => '#ff0000',
|
||||
SignalCheckColour => q`'#0000BE'`,
|
||||
WebColour => q`'#ff0000'`,
|
||||
Exif => 0,
|
||||
Sequence => undef,
|
||||
ZoneCount => 0,
|
||||
Refresh => undef,
|
||||
DefaultCodec => 'auto',
|
||||
DefaultCodec => q`'auto'`,
|
||||
Latitude => undef,
|
||||
Longitude => undef,
|
||||
);
|
||||
|
@ -279,21 +279,37 @@ sub disconnect {
|
|||
sub suspendMotionDetection {
|
||||
my $self = shift;
|
||||
return 0 if ! ZoneMinder::Memory::zmMemVerify($self);
|
||||
while (ZoneMinder::Memory::zmMemRead($self, 'shared_data:active', 1)) {
|
||||
return if $$self{Function} eq 'Nodect' or $$self{Function} eq 'Monitor' or $$self{Function} eq 'None';
|
||||
my $count = 50;
|
||||
while ($count and ZoneMinder::Memory::zmMemRead($self, 'shared_data:active', 1)) {
|
||||
ZoneMinder::Logger::Debug(1, 'Suspending motion detection');
|
||||
ZoneMinder::Memory::zmMonitorSuspend($self);
|
||||
usleep(100000);
|
||||
$count -= 1;
|
||||
}
|
||||
if (!$count) {
|
||||
ZoneMinder::Logger::Error('Unable to suspend motion detection after 5 seconds.');
|
||||
ZoneMinder::Memory::zmMemInvalidate($self); # Close our file handle to the zmc process we are about to end
|
||||
} else {
|
||||
ZoneMinder::Logger::Debug(1, 'shared_data:active='.ZoneMinder::Memory::zmMemRead($self, 'shared_data:active', 1));
|
||||
}
|
||||
ZoneMinder::Logger::Debug(1,ZoneMinder::Memory::zmMemRead($self, 'shared_data:active', 1));
|
||||
}
|
||||
|
||||
sub resumeMotionDetection {
|
||||
my $self = shift;
|
||||
return 0 if ! ZoneMinder::Memory::zmMemVerify($self);
|
||||
#while (zmMemRead($self, 'shared_data:active', 1)) {
|
||||
return if $$self{Function} eq 'Nodect' or $$self{Function} eq 'Monitor' or $$self{Function} eq 'None';
|
||||
my $count = 50;
|
||||
while ($count and !ZoneMinder::Memory::zmMemRead($self, 'shared_data:active', 1)) {
|
||||
ZoneMinder::Logger::Debug(1, 'Resuming motion detection');
|
||||
ZoneMinder::Memory::zmMonitorResume($self);
|
||||
#}
|
||||
ZoneMinder::Memory::zmMonitorResume($self);
|
||||
usleep(100000);
|
||||
$count -= 1;
|
||||
}
|
||||
if (!$count) {
|
||||
ZoneMinder::Logger::Error('Unable to resume motion detection after 5 seconds.');
|
||||
ZoneMinder::Memory::zmMemInvalidate($self); # Close our file handle to the zmc process we are about to end
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -40,6 +40,10 @@ $serial = $primary_key = 'Id';
|
|||
MonitorId
|
||||
Type
|
||||
Units
|
||||
NumCoords
|
||||
Coords
|
||||
Area
|
||||
AlarmRGB
|
||||
CheckMethod
|
||||
MinPixelThreshold
|
||||
MaxPixelThreshold
|
||||
|
@ -59,9 +63,13 @@ $serial = $primary_key = 'Id';
|
|||
|
||||
%defaults = (
|
||||
Name => '',
|
||||
Type => 'Active',
|
||||
Units => 'Pixels',
|
||||
CheckMethod => 'Blobs',
|
||||
Type => q`'Active'`,
|
||||
Units => q`'Pixels'`,
|
||||
NumCoords => 0,
|
||||
Coords => '',
|
||||
Area => 0,
|
||||
AlarmRGB => 0,
|
||||
CheckMethod => q`'Blobs'`,
|
||||
MinPixelThreshold => undef,
|
||||
MaxPixelThreshold => undef,
|
||||
MinAlarmPixels => undef,
|
||||
|
|
|
@ -61,12 +61,12 @@ GetOptions(
|
|||
'autostop' =>\$options{autostop},
|
||||
) or pod2usage(-exitstatus => -1);
|
||||
|
||||
if ( !$id ) {
|
||||
if (!$id) {
|
||||
print(STDERR "Please give a valid monitor id\n");
|
||||
pod2usage(-exitstatus => -1);
|
||||
}
|
||||
|
||||
( $id ) = $id =~ /^(\w+)$/;
|
||||
($id) = $id =~ /^(\w+)$/;
|
||||
logInit($id?(id=>'zmcontrol_'.$id):());
|
||||
|
||||
my $sock_file = $Config{ZM_PATH_SOCKS}.'/zmcontrol-'.$id.'.sock';
|
||||
|
@ -76,7 +76,7 @@ socket(CLIENT, PF_UNIX, SOCK_STREAM, 0) or Fatal("Can't open socket: $!");
|
|||
|
||||
my $saddr = sockaddr_un($sock_file);
|
||||
|
||||
if ( $options{command} ) {
|
||||
if ($options{command}) {
|
||||
# Have a command, so we are the client, connect to the server and send it.
|
||||
|
||||
my $tries = 10;
|
||||
|
@ -101,18 +101,16 @@ if ( $options{command} ) {
|
|||
Error("Unable to connect to zmcontrol server at $sock_file");
|
||||
}
|
||||
} else {
|
||||
|
||||
# The server isn't there
|
||||
my $monitor = zmDbGetMonitorAndControl($id);
|
||||
if ( !$monitor ) {
|
||||
Fatal("Unable to load control data for monitor $id");
|
||||
}
|
||||
Fatal("Unable to load control data for monitor $id") if !$monitor;
|
||||
|
||||
my $protocol = $monitor->{Protocol};
|
||||
if ( !$protocol ) {
|
||||
if (!$protocol) {
|
||||
Fatal('No protocol is set in monitor. Please edit the monitor, edit control type, select the control capability and fill in the Protocol field');
|
||||
}
|
||||
|
||||
if ( -x $protocol ) {
|
||||
if (-x $protocol) {
|
||||
# Protocol is actually a script!
|
||||
# Holdover from previous versions
|
||||
my $command .= $protocol.' '.$arg_string;
|
||||
|
@ -120,11 +118,11 @@ if ( $options{command} ) {
|
|||
|
||||
my $output = qx($command);
|
||||
my $status = $? >> 8;
|
||||
if ( $status || logDebugging() ) {
|
||||
if ($status || logDebugging()) {
|
||||
chomp($output);
|
||||
Debug("Output: $output");
|
||||
}
|
||||
if ( $status ) {
|
||||
if ($status) {
|
||||
Error("Command '$command' exited with status: $status");
|
||||
exit($status);
|
||||
}
|
||||
|
@ -134,7 +132,7 @@ if ( $options{command} ) {
|
|||
Info("Starting control server $id/$protocol");
|
||||
close(CLIENT);
|
||||
|
||||
if ( ! can_load( modules => { "ZoneMinder::Control::$protocol" => undef } ) ) {
|
||||
if (!can_load(modules => {'ZoneMinder::Control::'.$protocol => undef})) {
|
||||
Fatal("Can't load ZoneMinder::Control::$protocol\n$Module::Load::Conditional::ERROR");
|
||||
}
|
||||
|
||||
|
@ -159,7 +157,7 @@ if ( $options{command} ) {
|
|||
$control->open();
|
||||
|
||||
# If we have a command when starting up, then do it.
|
||||
if ( $options{command} ) {
|
||||
if ($options{command}) {
|
||||
my $command = $options{command};
|
||||
$control->$command(\%options);
|
||||
}
|
||||
|
|
|
@ -399,7 +399,6 @@ sub checkFilter {
|
|||
) {
|
||||
$Event->save();
|
||||
}
|
||||
$ZoneMinder::Database::dbh->commit() if !$$filter{LockRows};
|
||||
} # end if UpdateDiskSpace
|
||||
} # end foreach event
|
||||
ZoneMinder::Database::end_transaction($dbh, $in_transaction) if $$filter{LockRows};
|
||||
|
@ -843,7 +842,7 @@ sub sendEmail {
|
|||
return 0;
|
||||
}
|
||||
|
||||
Info('Creating notification email');
|
||||
Debug('Creating notification email');
|
||||
|
||||
my $subject = substituteTags($$filter{EmailSubject}, $filter, $Event);
|
||||
return 0 if !$subject;
|
||||
|
@ -851,7 +850,7 @@ sub sendEmail {
|
|||
my $body = substituteTags($$filter{EmailBody}, $filter, $Event, \@attachments);
|
||||
return 0 if !$body;
|
||||
|
||||
Info("Sending notification email '$subject'");
|
||||
Debug("Sending notification email '$subject'");
|
||||
|
||||
eval {
|
||||
if ( $Config{ZM_NEW_MAIL_MODULES} ) {
|
||||
|
@ -864,7 +863,7 @@ sub sendEmail {
|
|||
);
|
||||
### Add the text message part
|
||||
$mail->attach (
|
||||
Type => 'TEXT',
|
||||
Type => (($body=~/<html/)?'text/html':'text/plain'),
|
||||
Data => $body
|
||||
);
|
||||
### Add the attachments
|
||||
|
@ -886,9 +885,7 @@ sub sendEmail {
|
|||
if ( $Config{ZM_SSMTP_MAIL} ) {
|
||||
my $ssmtp_location = $Config{ZM_SSMTP_PATH};
|
||||
if ( !$ssmtp_location ) {
|
||||
if ( logDebugging() ) {
|
||||
Debug("which ssmtp: $ssmtp_location - set ssmtp path in options to suppress this message");
|
||||
}
|
||||
Debug("which ssmtp: $ssmtp_location - set ssmtp path in options to suppress this message");
|
||||
$ssmtp_location = qx('which ssmtp');
|
||||
}
|
||||
if ( !$ssmtp_location ) {
|
||||
|
@ -916,7 +913,7 @@ sub sendEmail {
|
|||
foreach my $attachment ( @attachments ) {
|
||||
my $size = -s $attachment->{path};
|
||||
$total_size += $size;
|
||||
Info("Attaching '$attachment->{path}' which is $size bytes");
|
||||
Debug("Attaching '$attachment->{path}' which is $size bytes");
|
||||
|
||||
$mail->attach(
|
||||
Path => $attachment->{path},
|
||||
|
@ -934,7 +931,7 @@ sub sendEmail {
|
|||
Error("Unable to send email: $@");
|
||||
return 0;
|
||||
} else {
|
||||
Info('Notification email sent');
|
||||
Info("Notification email sent to $$filter{EmailTo}");
|
||||
}
|
||||
my $sql = 'UPDATE `Events` SET `Emailed` = 1 WHERE `Id` = ?';
|
||||
my $sth = $dbh->prepare_cached($sql)
|
||||
|
|
|
@ -27,7 +27,7 @@ zmupdate.pl - check and upgrade ZoneMinder database
|
|||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
zmupdate.pl -c,--check | -f,--freshen | -v<version>,--version=<version> [-u<dbuser> -p<dbpass>]
|
||||
zmupdate.pl -c,--check | -f,--freshen | -v<version>,--version=<version> [-u <dbuser> -p <dbpass>]
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
|
|
|
@ -98,19 +98,19 @@ while (!$zm_terminate) {
|
|||
next if $monitor->{Type} eq 'WebSite';
|
||||
my $now = time();
|
||||
my $restart = 0;
|
||||
if ( zmMemVerify($monitor) ) {
|
||||
if (zmMemVerify($monitor)) {
|
||||
# Check we have got an image recently
|
||||
my $capture_time = zmGetLastWriteTime($monitor);
|
||||
if ( !defined($capture_time) ) {
|
||||
if (!defined($capture_time)) {
|
||||
# Can't read from shared data
|
||||
Debug('LastWriteTime is not defined.');
|
||||
zmMemInvalidate($monitor);
|
||||
next;
|
||||
}
|
||||
Debug("Monitor $$monitor{Id} LastWriteTime is $capture_time.");
|
||||
if ( !$capture_time ) {
|
||||
if (!$capture_time) {
|
||||
my $startup_time = zmGetStartupTime($monitor);
|
||||
if ( ( $now - $startup_time ) > $Config{ZM_WATCH_MAX_DELAY} ) {
|
||||
if (($now - $startup_time) > $Config{ZM_WATCH_MAX_DELAY}) {
|
||||
Warning(
|
||||
"Restarting capture daemon for $$monitor{Name}, no image since startup. ".
|
||||
"Startup time was $startup_time - now $now > $Config{ZM_WATCH_MAX_DELAY}"
|
||||
|
@ -122,7 +122,7 @@ while (!$zm_terminate) {
|
|||
next;
|
||||
}
|
||||
}
|
||||
if ( ! $restart ) {
|
||||
if (!$restart) {
|
||||
my $max_image_delay = (
|
||||
$monitor->{MaxFPS}
|
||||
&&($monitor->{MaxFPS}>0)
|
||||
|
@ -144,29 +144,28 @@ while (!$zm_terminate) {
|
|||
$restart = 1;
|
||||
}
|
||||
|
||||
if ( $restart ) {
|
||||
if ($restart) {
|
||||
my $command;
|
||||
if ( $monitor->{Type} eq 'Local' ) {
|
||||
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
|
||||
if ($monitor->{Type} eq 'Local') {
|
||||
$command = 'zmdc.pl restart zmc -d '.$monitor->{Device};
|
||||
} else {
|
||||
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
|
||||
$command = 'zmdc.pl restart zmc -m '.$monitor->{Id};
|
||||
}
|
||||
runCommand($command);
|
||||
} elsif ( $monitor->{Function} ne 'Monitor' ) {
|
||||
} elsif ($monitor->{Function} ne 'Monitor') {
|
||||
# Now check analysis daemon
|
||||
$restart = 0;
|
||||
# Check we have got an image recently
|
||||
my $image_time = zmGetLastReadTime($monitor);
|
||||
if ( !defined($image_time) ) {
|
||||
if (!defined($image_time)) {
|
||||
# Can't read from shared data
|
||||
$restart = 1;
|
||||
Error("Error reading shared data for $$monitor{Id} $$monitor{Name}");
|
||||
} elsif ( !$image_time ) {
|
||||
} elsif (!$image_time) {
|
||||
# We can't get the last capture time so can't be sure it's died.
|
||||
#$restart = 1;
|
||||
Error("Last analyse time for $$monitor{Id} $$monitor{Name} was zero.");
|
||||
} else {
|
||||
|
||||
my $max_image_delay = ( $monitor->{MaxFPS}
|
||||
&&($monitor->{MaxFPS}>0)
|
||||
&&($monitor->{MaxFPS}<1)
|
||||
|
@ -175,7 +174,7 @@ while (!$zm_terminate) {
|
|||
;
|
||||
my $image_delay = $now-$image_time;
|
||||
Debug("Monitor $monitor->{Id} last analysed $image_delay seconds ago, max is $max_image_delay");
|
||||
if ( $image_delay > $max_image_delay ) {
|
||||
if ($image_delay > $max_image_delay) {
|
||||
Warning("Analysis daemon for $$monitor{Id} $$monitor{Name} needs restarting,"
|
||||
." time since last analysis $image_delay seconds ($now-$image_time)"
|
||||
);
|
||||
|
@ -183,13 +182,13 @@ while (!$zm_terminate) {
|
|||
}
|
||||
}
|
||||
|
||||
if ( $restart ) {
|
||||
Info("Restarting analysis daemon for $$monitor{Id} $$monitor{Name}\n");
|
||||
if ($restart) {
|
||||
Info("Restarting analysis daemon for $$monitor{Id} $$monitor{Name}");
|
||||
my $command;
|
||||
if ( $monitor->{Type} eq 'Local' ) {
|
||||
$command = "zmdc.pl restart zmc -d $monitor->{Device}";
|
||||
$command = 'zmdc.pl restart zmc -d '.$monitor->{Device};
|
||||
} else {
|
||||
$command = "zmdc.pl restart zmc -m $monitor->{Id}";
|
||||
$command = 'zmdc.pl restart zmc -m '.$monitor->{Id};
|
||||
}
|
||||
runCommand($command);
|
||||
} # end if restart
|
||||
|
@ -201,7 +200,7 @@ while (!$zm_terminate) {
|
|||
sleep($Config{ZM_WATCH_CHECK_INTERVAL});
|
||||
} # end while (!$zm_terminate)
|
||||
|
||||
Info("Watchdog exiting");
|
||||
Info('Watchdog exiting');
|
||||
exit();
|
||||
|
||||
1;
|
||||
|
|
|
@ -60,7 +60,6 @@ set(ZM_BIN_SRC_FILES
|
|||
zm_signal.cpp
|
||||
zm_stream.cpp
|
||||
zm_swscale.cpp
|
||||
zm_time.cpp
|
||||
zm_user.cpp
|
||||
zm_utils.cpp
|
||||
zm_videostore.cpp
|
||||
|
@ -77,13 +76,34 @@ target_include_directories(zm
|
|||
|
||||
target_link_libraries(zm
|
||||
PUBLIC
|
||||
FFMPEG::avcodec
|
||||
FFMPEG::avformat
|
||||
FFMPEG::avutil
|
||||
FFMPEG::swresample
|
||||
FFMPEG::swscale
|
||||
libbcrypt::bcrypt
|
||||
jwt-cpp::jwt-cpp
|
||||
RtspServer::RtspServer
|
||||
martinmoene::span-lite
|
||||
${ZM_BIN_LIBS}
|
||||
PRIVATE
|
||||
zm-core-interface)
|
||||
|
||||
if(${ZM_JWT_BACKEND} STREQUAL "jwt_cpp")
|
||||
target_link_libraries(zm
|
||||
PUBLIC
|
||||
jwt-cpp::jwt-cpp)
|
||||
elseif(${ZM_JWT_BACKEND} STREQUAL "libjwt")
|
||||
target_link_libraries(zm
|
||||
PUBLIC
|
||||
JWT::libjwt)
|
||||
endif()
|
||||
|
||||
if(TARGET V4L2::videodev2)
|
||||
target_link_libraries(zm
|
||||
PRIVATE
|
||||
V4L2::videodev2)
|
||||
endif()
|
||||
|
||||
add_executable(zmc zmc.cpp)
|
||||
add_executable(zms zms.cpp)
|
||||
add_executable(zmu zmu.cpp)
|
||||
|
@ -93,7 +113,6 @@ target_link_libraries(zmc
|
|||
zm-core-interface
|
||||
zm
|
||||
${ZM_EXTRA_LIBS}
|
||||
${ZM_BIN_LIBS}
|
||||
${CMAKE_DL_LIBS})
|
||||
|
||||
target_link_libraries(zms
|
||||
|
@ -101,7 +120,6 @@ target_link_libraries(zms
|
|||
zm-core-interface
|
||||
zm
|
||||
${ZM_EXTRA_LIBS}
|
||||
${ZM_BIN_LIBS}
|
||||
${CMAKE_DL_LIBS})
|
||||
|
||||
target_link_libraries(zmu
|
||||
|
@ -109,9 +127,7 @@ target_link_libraries(zmu
|
|||
zm-core-interface
|
||||
zm
|
||||
${ZM_EXTRA_LIBS}
|
||||
${ZM_BIN_LIBS}
|
||||
${CMAKE_DL_LIBS}
|
||||
bcrypt)
|
||||
${CMAKE_DL_LIBS})
|
||||
|
||||
# Generate man files for the binaries destined for the bin folder
|
||||
if(BUILD_MAN)
|
||||
|
@ -132,8 +148,6 @@ if(HAVE_RTSP_SERVER)
|
|||
zm-core-interface
|
||||
zm
|
||||
${ZM_EXTRA_LIBS}
|
||||
${ZM_BIN_LIBS}
|
||||
${CMAKE_DL_LIBS}
|
||||
bcrypt)
|
||||
${CMAKE_DL_LIBS})
|
||||
install(TARGETS zm_rtsp_server RUNTIME DESTINATION "${CMAKE_INSTALL_FULL_BINDIR}" PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
||||
endif()
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
#include "zm_monitor.h"
|
||||
#include "zm_signal.h"
|
||||
#include "zm_utils.h"
|
||||
#include "zm_time.h"
|
||||
|
||||
AnalysisThread::AnalysisThread(Monitor *monitor) :
|
||||
monitor_(monitor), terminate_(false) {
|
||||
|
|
|
@ -74,11 +74,13 @@ int Buffer::read_into(int sd, unsigned int bytes) {
|
|||
return bytes_read;
|
||||
}
|
||||
|
||||
int Buffer::read_into(int sd, unsigned int bytes, struct timeval timeout) {
|
||||
int Buffer::read_into(int sd, unsigned int bytes, Microseconds timeout) {
|
||||
fd_set set;
|
||||
FD_ZERO(&set); /* clear the set */
|
||||
FD_SET(sd, &set); /* add our file descriptor to the set */
|
||||
int rv = select(sd + 1, &set, NULL, NULL, &timeout);
|
||||
timeval timeout_tv = zm::chrono::duration_cast<timeval>(timeout);
|
||||
|
||||
int rv = select(sd + 1, &set, nullptr, nullptr, &timeout_tv);
|
||||
if (rv == -1) {
|
||||
Error("Error %d %s from select", errno, strerror(errno));
|
||||
return rv;
|
||||
|
@ -86,5 +88,6 @@ int Buffer::read_into(int sd, unsigned int bytes, struct timeval timeout) {
|
|||
Debug(1, "timeout"); /* a timeout occured */
|
||||
return 0;
|
||||
}
|
||||
|
||||
return read_into(sd, bytes);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#define ZM_BUFFER_H
|
||||
|
||||
#include "zm_logger.h"
|
||||
#include "zm_time.h"
|
||||
#include <cstring>
|
||||
|
||||
class Buffer {
|
||||
|
@ -187,7 +188,7 @@ class Buffer {
|
|||
return static_cast<int>(mSize);
|
||||
}
|
||||
int read_into(int sd, unsigned int bytes);
|
||||
int read_into(int sd, unsigned int bytes, struct timeval timeout);
|
||||
int read_into(int sd, unsigned int bytes, Microseconds timeout);
|
||||
};
|
||||
|
||||
#endif // ZM_BUFFER_H
|
||||
|
|
|
@ -90,20 +90,12 @@ AVStream *Camera::getVideoStream() {
|
|||
mVideoStream = avformat_new_stream(mFormatContext, nullptr);
|
||||
if ( mVideoStream ) {
|
||||
mVideoStream->time_base = (AVRational){1, 1000000}; // microseconds as base frame rate
|
||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||
mVideoStream->codecpar->width = width;
|
||||
mVideoStream->codecpar->height = height;
|
||||
mVideoStream->codecpar->format = GetFFMPEGPixelFormat(colours, subpixelorder);
|
||||
mVideoStream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
mVideoStream->codecpar->codec_id = AV_CODEC_ID_NONE;
|
||||
Debug(1, "Allocating avstream %p %p %d", mVideoStream, mVideoStream->codecpar, mVideoStream->codecpar->codec_id);
|
||||
#else
|
||||
mVideoStream->codec->width = width;
|
||||
mVideoStream->codec->height = height;
|
||||
mVideoStream->codec->pix_fmt = GetFFMPEGPixelFormat(colours, subpixelorder);
|
||||
mVideoStream->codec->codec_type = AVMEDIA_TYPE_VIDEO;
|
||||
mVideoStream->codec->codec_id = AV_CODEC_ID_NONE;
|
||||
#endif
|
||||
Debug(1, "Allocating avstream %p %p %d", mVideoStream, mVideoStream->codecpar, mVideoStream->codecpar->codec_id);
|
||||
} else {
|
||||
Error("Can't create video stream");
|
||||
}
|
||||
|
|
|
@ -99,20 +99,8 @@ public:
|
|||
unsigned int Pixels() const { return pixels; }
|
||||
unsigned long long ImageSize() const { return imagesize; }
|
||||
unsigned int Bytes() const { return bytes; };
|
||||
int getFrequency() {
|
||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||
return mAudioStream ? mAudioStream->codecpar->sample_rate : -1;
|
||||
#else
|
||||
return mAudioStream ? mAudioStream->codec->sample_rate : -1;
|
||||
#endif
|
||||
}
|
||||
int getChannels() {
|
||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||
return mAudioStream ? mAudioStream->codecpar->channels : -1;
|
||||
#else
|
||||
return mAudioStream ? mAudioStream->codec->channels : -1;
|
||||
#endif
|
||||
}
|
||||
int getFrequency() { return mAudioStream ? mAudioStream->codecpar->sample_rate : -1; }
|
||||
int getChannels() { return mAudioStream ? mAudioStream->codecpar->channels : -1; }
|
||||
|
||||
virtual int Brightness( int/*p_brightness*/=-1 ) { return -1; }
|
||||
virtual int Hue( int/*p_hue*/=-1 ) { return -1; }
|
||||
|
|
115
src/zm_comms.cpp
115
src/zm_comms.cpp
|
@ -34,7 +34,7 @@
|
|||
#include <sys/filio.h> // define FIONREAD
|
||||
#endif
|
||||
|
||||
int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
|
||||
int zm::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
|
||||
va_list arg_ptr;
|
||||
std::vector<iovec> iov(iovcnt);
|
||||
|
||||
|
@ -52,7 +52,7 @@ int ZM::CommsBase::readV(int iovcnt, /* const void *, int, */ ...) {
|
|||
return nBytes;
|
||||
}
|
||||
|
||||
int ZM::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) {
|
||||
int zm::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) {
|
||||
va_list arg_ptr;
|
||||
std::vector<iovec> iov(iovcnt);
|
||||
|
||||
|
@ -70,7 +70,7 @@ int ZM::CommsBase::writeV(int iovcnt, /* const void *, int, */ ...) {
|
|||
return nBytes;
|
||||
}
|
||||
|
||||
bool ZM::Pipe::open() {
|
||||
bool zm::Pipe::open() {
|
||||
if (::pipe(mFd) < 0) {
|
||||
Error("pipe(), errno = %d, error = %s", errno, strerror(errno));
|
||||
return false;
|
||||
|
@ -79,7 +79,7 @@ bool ZM::Pipe::open() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Pipe::close() {
|
||||
bool zm::Pipe::close() {
|
||||
if (mFd[0] > -1) {
|
||||
::close(mFd[0]);
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ bool ZM::Pipe::close() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Pipe::setBlocking(bool blocking) {
|
||||
bool zm::Pipe::setBlocking(bool blocking) {
|
||||
int flags;
|
||||
|
||||
/* Now set it for non-blocking I/O */
|
||||
|
@ -112,7 +112,7 @@ bool ZM::Pipe::setBlocking(bool blocking) {
|
|||
return true;
|
||||
}
|
||||
|
||||
ZM::SockAddr *ZM::SockAddr::newSockAddr(const sockaddr &addr, socklen_t len) {
|
||||
zm::SockAddr *zm::SockAddr::newSockAddr(const sockaddr &addr, socklen_t len) {
|
||||
if ((addr.sa_family == AF_INET) && (len == SockAddrInet::addrSize())) {
|
||||
return new SockAddrInet((const sockaddr_in *) &addr);
|
||||
} else if ((addr.sa_family == AF_UNIX) && (len == SockAddrUnix::addrSize())) {
|
||||
|
@ -123,7 +123,7 @@ ZM::SockAddr *ZM::SockAddr::newSockAddr(const sockaddr &addr, socklen_t len) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
ZM::SockAddr *ZM::SockAddr::newSockAddr(const SockAddr *addr) {
|
||||
zm::SockAddr *zm::SockAddr::newSockAddr(const SockAddr *addr) {
|
||||
if (!addr) {
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -138,7 +138,7 @@ ZM::SockAddr *ZM::SockAddr::newSockAddr(const SockAddr *addr) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
bool ZM::SockAddrInet::resolve(const char *host, const char *serv, const char *proto) {
|
||||
bool zm::SockAddrInet::resolve(const char *host, const char *serv, const char *proto) {
|
||||
memset(&mAddrIn, 0, sizeof(mAddrIn));
|
||||
|
||||
hostent *hostent = nullptr;
|
||||
|
@ -160,7 +160,7 @@ bool ZM::SockAddrInet::resolve(const char *host, const char *serv, const char *p
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::SockAddrInet::resolve(const char *host, int port, const char *proto) {
|
||||
bool zm::SockAddrInet::resolve(const char *host, int port, const char *proto) {
|
||||
memset(&mAddrIn, 0, sizeof(mAddrIn));
|
||||
|
||||
hostent *hostent = nullptr;
|
||||
|
@ -175,7 +175,7 @@ bool ZM::SockAddrInet::resolve(const char *host, int port, const char *proto) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::SockAddrInet::resolve(const char *serv, const char *proto) {
|
||||
bool zm::SockAddrInet::resolve(const char *serv, const char *proto) {
|
||||
memset(&mAddrIn, 0, sizeof(mAddrIn));
|
||||
|
||||
servent *servent = nullptr;
|
||||
|
@ -191,7 +191,7 @@ bool ZM::SockAddrInet::resolve(const char *serv, const char *proto) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::SockAddrInet::resolve(int port, const char *proto) {
|
||||
bool zm::SockAddrInet::resolve(int port, const char *proto) {
|
||||
memset(&mAddrIn, 0, sizeof(mAddrIn));
|
||||
|
||||
mAddrIn.sin_port = htons(port);
|
||||
|
@ -201,16 +201,17 @@ bool ZM::SockAddrInet::resolve(int port, const char *proto) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::SockAddrUnix::resolve(const char *path, const char *proto) {
|
||||
bool zm::SockAddrUnix::resolve(const char *path, const char *proto) {
|
||||
memset(&mAddrUn, 0, sizeof(mAddrUn));
|
||||
|
||||
strncpy(mAddrUn.sun_path, path, sizeof(mAddrUn.sun_path));
|
||||
mAddrUn.sun_path[sizeof(mAddrUn.sun_path) - 1] = '\0';
|
||||
mAddrUn.sun_family = AF_UNIX;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::socket() {
|
||||
bool zm::Socket::socket() {
|
||||
if (mSd >= 0) {
|
||||
return true;
|
||||
}
|
||||
|
@ -229,7 +230,7 @@ bool ZM::Socket::socket() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::connect() {
|
||||
bool zm::Socket::connect() {
|
||||
if (!socket()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -244,7 +245,7 @@ bool ZM::Socket::connect() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::bind() {
|
||||
bool zm::Socket::bind() {
|
||||
if (!socket()) {
|
||||
return false;
|
||||
}
|
||||
|
@ -257,7 +258,7 @@ bool ZM::Socket::bind() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::listen() {
|
||||
bool zm::Socket::listen() {
|
||||
if (::listen(mSd, SOMAXCONN) == -1) {
|
||||
Error("listen(), errno = %d, error = %s", errno, strerror(errno));
|
||||
close();
|
||||
|
@ -268,7 +269,7 @@ bool ZM::Socket::listen() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::accept() {
|
||||
bool zm::Socket::accept() {
|
||||
sockaddr rem_addr = {};
|
||||
socklen_t rem_addr_size = getAddrSize();
|
||||
|
||||
|
@ -286,7 +287,7 @@ bool ZM::Socket::accept() {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::accept(int &newSd) {
|
||||
bool zm::Socket::accept(int &newSd) {
|
||||
sockaddr rem_addr = {};
|
||||
socklen_t rem_addr_size = getAddrSize();
|
||||
|
||||
|
@ -300,7 +301,7 @@ bool ZM::Socket::accept(int &newSd) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::close() {
|
||||
bool zm::Socket::close() {
|
||||
if (mSd > -1) {
|
||||
::close(mSd);
|
||||
}
|
||||
|
@ -310,7 +311,7 @@ bool ZM::Socket::close() {
|
|||
return true;
|
||||
}
|
||||
|
||||
int ZM::Socket::bytesToRead() const {
|
||||
int zm::Socket::bytesToRead() const {
|
||||
int bytes_to_read = 0;
|
||||
|
||||
if (ioctl(mSd, FIONREAD, &bytes_to_read) < 0) {
|
||||
|
@ -320,7 +321,7 @@ int ZM::Socket::bytesToRead() const {
|
|||
return bytes_to_read;
|
||||
}
|
||||
|
||||
bool ZM::Socket::getBlocking(bool &blocking) {
|
||||
bool zm::Socket::getBlocking(bool &blocking) {
|
||||
int flags;
|
||||
|
||||
if ((flags = fcntl(mSd, F_GETFL)) < 0) {
|
||||
|
@ -331,7 +332,7 @@ bool ZM::Socket::getBlocking(bool &blocking) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::setBlocking(bool blocking) {
|
||||
bool zm::Socket::setBlocking(bool blocking) {
|
||||
int flags;
|
||||
|
||||
/* Now set it for non-blocking I/O */
|
||||
|
@ -352,7 +353,7 @@ bool ZM::Socket::setBlocking(bool blocking) {
|
|||
return true;
|
||||
}
|
||||
|
||||
int ZM::Socket::getSendBufferSize(int &buffersize) const {
|
||||
int zm::Socket::getSendBufferSize(int &buffersize) const {
|
||||
socklen_t optlen = sizeof(buffersize);
|
||||
if (getsockopt(mSd, SOL_SOCKET, SO_SNDBUF, &buffersize, &optlen) < 0) {
|
||||
Error("getsockopt(), errno = %d, error = %s", errno, strerror(errno));
|
||||
|
@ -361,7 +362,7 @@ int ZM::Socket::getSendBufferSize(int &buffersize) const {
|
|||
return buffersize;
|
||||
}
|
||||
|
||||
int ZM::Socket::getRecvBufferSize(int &buffersize) const {
|
||||
int zm::Socket::getRecvBufferSize(int &buffersize) const {
|
||||
socklen_t optlen = sizeof(buffersize);
|
||||
if (getsockopt(mSd, SOL_SOCKET, SO_RCVBUF, &buffersize, &optlen) < 0) {
|
||||
Error("getsockopt(), errno = %d, error = %s", errno, strerror(errno));
|
||||
|
@ -370,7 +371,7 @@ int ZM::Socket::getRecvBufferSize(int &buffersize) const {
|
|||
return buffersize;
|
||||
}
|
||||
|
||||
bool ZM::Socket::setSendBufferSize(int buffersize) {
|
||||
bool zm::Socket::setSendBufferSize(int buffersize) {
|
||||
if (setsockopt(mSd, SOL_SOCKET, SO_SNDBUF, (char *) &buffersize, sizeof(buffersize)) < 0) {
|
||||
Error("setsockopt(), errno = %d, error = %s", errno, strerror(errno));
|
||||
return false;
|
||||
|
@ -378,7 +379,7 @@ bool ZM::Socket::setSendBufferSize(int buffersize) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::setRecvBufferSize(int buffersize) {
|
||||
bool zm::Socket::setRecvBufferSize(int buffersize) {
|
||||
if (setsockopt(mSd, SOL_SOCKET, SO_RCVBUF, (char *) &buffersize, sizeof(buffersize)) < 0) {
|
||||
Error("setsockopt(), errno = %d, error = %s", errno, strerror(errno));
|
||||
return false;
|
||||
|
@ -386,7 +387,7 @@ bool ZM::Socket::setRecvBufferSize(int buffersize) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::getRouting(bool &route) const {
|
||||
bool zm::Socket::getRouting(bool &route) const {
|
||||
int dontRoute;
|
||||
socklen_t optlen = sizeof(dontRoute);
|
||||
if (getsockopt(mSd, SOL_SOCKET, SO_DONTROUTE, &dontRoute, &optlen) < 0) {
|
||||
|
@ -397,7 +398,7 @@ bool ZM::Socket::getRouting(bool &route) const {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::setRouting(bool route) {
|
||||
bool zm::Socket::setRouting(bool route) {
|
||||
int dontRoute = !route;
|
||||
if (setsockopt(mSd, SOL_SOCKET, SO_DONTROUTE, (char *) &dontRoute, sizeof(dontRoute)) < 0) {
|
||||
Error("setsockopt(), errno = %d, error = %s", errno, strerror(errno));
|
||||
|
@ -406,7 +407,7 @@ bool ZM::Socket::setRouting(bool route) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::getNoDelay(bool &nodelay) const {
|
||||
bool zm::Socket::getNoDelay(bool &nodelay) const {
|
||||
int int_nodelay;
|
||||
socklen_t optlen = sizeof(int_nodelay);
|
||||
if (getsockopt(mSd, IPPROTO_TCP, TCP_NODELAY, &int_nodelay, &optlen) < 0) {
|
||||
|
@ -417,7 +418,7 @@ bool ZM::Socket::getNoDelay(bool &nodelay) const {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::Socket::setNoDelay(bool nodelay) {
|
||||
bool zm::Socket::setNoDelay(bool nodelay) {
|
||||
int int_nodelay = nodelay;
|
||||
|
||||
if (setsockopt(mSd, IPPROTO_TCP, TCP_NODELAY, (char *) &int_nodelay, sizeof(int_nodelay)) < 0) {
|
||||
|
@ -427,7 +428,7 @@ bool ZM::Socket::setNoDelay(bool nodelay) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::connect(const char *host, const char *serv) {
|
||||
bool zm::InetSocket::connect(const char *host, const char *serv) {
|
||||
addrinfo hints;
|
||||
addrinfo *result, *rp;
|
||||
int s;
|
||||
|
@ -499,14 +500,14 @@ bool ZM::InetSocket::connect(const char *host, const char *serv) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::connect(const char *host, int port) {
|
||||
bool zm::InetSocket::connect(const char *host, int port) {
|
||||
char serv[8];
|
||||
snprintf(serv, sizeof(serv), "%d", port);
|
||||
|
||||
return connect(host, serv);
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::bind(const char *host, const char *serv) {
|
||||
bool zm::InetSocket::bind(const char *host, const char *serv) {
|
||||
addrinfo hints;
|
||||
|
||||
memset(&hints, 0, sizeof(addrinfo));
|
||||
|
@ -564,33 +565,33 @@ bool ZM::InetSocket::bind(const char *host, const char *serv) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::bind(const char *serv) {
|
||||
bool zm::InetSocket::bind(const char *serv) {
|
||||
return bind(nullptr, serv);
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::bind(const char *host, int port) {
|
||||
bool zm::InetSocket::bind(const char *host, int port) {
|
||||
char serv[8];
|
||||
snprintf(serv, sizeof(serv), "%d", port);
|
||||
|
||||
return bind(host, serv);
|
||||
}
|
||||
|
||||
bool ZM::InetSocket::bind(int port) {
|
||||
bool zm::InetSocket::bind(int port) {
|
||||
char serv[8];
|
||||
snprintf(serv, sizeof(serv), "%d", port);
|
||||
|
||||
return bind(nullptr, serv);
|
||||
}
|
||||
|
||||
bool ZM::TcpInetServer::listen() {
|
||||
bool zm::TcpInetServer::listen() {
|
||||
return Socket::listen();
|
||||
}
|
||||
|
||||
bool ZM::TcpInetServer::accept() {
|
||||
bool zm::TcpInetServer::accept() {
|
||||
return Socket::accept();
|
||||
}
|
||||
|
||||
bool ZM::TcpInetServer::accept(TcpInetSocket *&newSocket) {
|
||||
bool zm::TcpInetServer::accept(TcpInetSocket *&newSocket) {
|
||||
int newSd = -1;
|
||||
newSocket = nullptr;
|
||||
|
||||
|
@ -602,7 +603,7 @@ bool ZM::TcpInetServer::accept(TcpInetSocket *&newSocket) {
|
|||
return true;
|
||||
}
|
||||
|
||||
bool ZM::TcpUnixServer::accept(TcpUnixSocket *&newSocket) {
|
||||
bool zm::TcpUnixServer::accept(TcpUnixSocket *&newSocket) {
|
||||
int newSd = -1;
|
||||
newSocket = nullptr;
|
||||
|
||||
|
@ -614,28 +615,16 @@ bool ZM::TcpUnixServer::accept(TcpUnixSocket *&newSocket) {
|
|||
return true;
|
||||
}
|
||||
|
||||
void ZM::Select::setTimeout(int timeout) {
|
||||
mTimeout.tv_sec = timeout;
|
||||
mTimeout.tv_usec = 0;
|
||||
mHasTimeout = true;
|
||||
}
|
||||
|
||||
void ZM::Select::setTimeout(double timeout) {
|
||||
mTimeout.tv_sec = int(timeout);
|
||||
mTimeout.tv_usec = suseconds_t((timeout - mTimeout.tv_sec) * 1000000.0);
|
||||
mHasTimeout = true;
|
||||
}
|
||||
|
||||
void ZM::Select::setTimeout(timeval timeout) {
|
||||
void zm::Select::setTimeout(Microseconds timeout) {
|
||||
mTimeout = timeout;
|
||||
mHasTimeout = true;
|
||||
}
|
||||
|
||||
void ZM::Select::clearTimeout() {
|
||||
void zm::Select::clearTimeout() {
|
||||
mHasTimeout = false;
|
||||
}
|
||||
|
||||
void ZM::Select::calcMaxFd() {
|
||||
void zm::Select::calcMaxFd() {
|
||||
mMaxFd = -1;
|
||||
for (CommsSet::iterator iter = mReaders.begin(); iter != mReaders.end(); ++iter) {
|
||||
if ((*iter)->getMaxDesc() > mMaxFd)
|
||||
|
@ -647,7 +636,7 @@ void ZM::Select::calcMaxFd() {
|
|||
}
|
||||
}
|
||||
|
||||
bool ZM::Select::addReader(CommsBase *comms) {
|
||||
bool zm::Select::addReader(CommsBase *comms) {
|
||||
if (!comms->isOpen()) {
|
||||
Error("Unable to add closed reader");
|
||||
return false;
|
||||
|
@ -661,7 +650,7 @@ bool ZM::Select::addReader(CommsBase *comms) {
|
|||
return result.second;
|
||||
}
|
||||
|
||||
bool ZM::Select::deleteReader(CommsBase *comms) {
|
||||
bool zm::Select::deleteReader(CommsBase *comms) {
|
||||
if (!comms->isOpen()) {
|
||||
Error("Unable to add closed reader");
|
||||
return false;
|
||||
|
@ -673,12 +662,12 @@ bool ZM::Select::deleteReader(CommsBase *comms) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void ZM::Select::clearReaders() {
|
||||
void zm::Select::clearReaders() {
|
||||
mReaders.clear();
|
||||
mMaxFd = -1;
|
||||
}
|
||||
|
||||
bool ZM::Select::addWriter(CommsBase *comms) {
|
||||
bool zm::Select::addWriter(CommsBase *comms) {
|
||||
std::pair<CommsSet::iterator, bool> result = mWriters.insert(comms);
|
||||
if (result.second) {
|
||||
if (comms->getMaxDesc() > mMaxFd) {
|
||||
|
@ -688,7 +677,7 @@ bool ZM::Select::addWriter(CommsBase *comms) {
|
|||
return result.second;
|
||||
}
|
||||
|
||||
bool ZM::Select::deleteWriter(CommsBase *comms) {
|
||||
bool zm::Select::deleteWriter(CommsBase *comms) {
|
||||
if (mWriters.erase(comms)) {
|
||||
calcMaxFd();
|
||||
return true;
|
||||
|
@ -696,13 +685,13 @@ bool ZM::Select::deleteWriter(CommsBase *comms) {
|
|||
return false;
|
||||
}
|
||||
|
||||
void ZM::Select::clearWriters() {
|
||||
void zm::Select::clearWriters() {
|
||||
mWriters.clear();
|
||||
mMaxFd = -1;
|
||||
}
|
||||
|
||||
int ZM::Select::wait() {
|
||||
timeval tempTimeout = mTimeout;
|
||||
int zm::Select::wait() {
|
||||
timeval tempTimeout = zm::chrono::duration_cast<timeval>(mTimeout);
|
||||
timeval *selectTimeout = mHasTimeout ? &tempTimeout : nullptr;
|
||||
|
||||
fd_set rfds;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
#include "zm_exception.h"
|
||||
#include "zm_logger.h"
|
||||
#include "zm_time.h"
|
||||
#include <cerrno>
|
||||
#include <netdb.h>
|
||||
#include <set>
|
||||
|
@ -35,7 +36,7 @@
|
|||
#include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
namespace ZM {
|
||||
namespace zm {
|
||||
|
||||
class CommsException : public Exception {
|
||||
public:
|
||||
|
@ -560,13 +561,9 @@ class Select {
|
|||
typedef std::vector<CommsBase *> CommsList;
|
||||
|
||||
Select() : mHasTimeout(false), mMaxFd(-1) {}
|
||||
explicit Select(timeval timeout) : mMaxFd(-1) { setTimeout(timeout); }
|
||||
explicit Select(int timeout) : mMaxFd(-1) { setTimeout(timeout); }
|
||||
explicit Select(double timeout) : mMaxFd(-1) { setTimeout(timeout); }
|
||||
explicit Select(Microseconds timeout) : mMaxFd(-1) { setTimeout(timeout); }
|
||||
|
||||
void setTimeout(int timeout);
|
||||
void setTimeout(double timeout);
|
||||
void setTimeout(timeval timeout);
|
||||
void setTimeout(Microseconds timeout);
|
||||
void clearTimeout();
|
||||
|
||||
void calcMaxFd();
|
||||
|
@ -590,7 +587,7 @@ class Select {
|
|||
CommsList mReadable;
|
||||
CommsList mWriteable;
|
||||
bool mHasTimeout;
|
||||
timeval mTimeout;
|
||||
Microseconds mTimeout;
|
||||
int mMaxFd;
|
||||
};
|
||||
|
||||
|
|
|
@ -39,16 +39,15 @@ void zmLoadStaticConfig() {
|
|||
// update the Config hash with those values
|
||||
DIR *configSubFolder = opendir(ZM_CONFIG_SUBDIR);
|
||||
if (configSubFolder) { // subfolder exists and is readable
|
||||
char glob_pattern[PATH_MAX] = "";
|
||||
snprintf(glob_pattern, sizeof(glob_pattern), "%s/*.conf", ZM_CONFIG_SUBDIR);
|
||||
std::string glob_pattern = stringtf("%s/*.conf", ZM_CONFIG_SUBDIR);
|
||||
|
||||
glob_t pglob;
|
||||
int glob_status = glob(glob_pattern, 0, nullptr, &pglob);
|
||||
int glob_status = glob(glob_pattern.c_str(), 0, nullptr, &pglob);
|
||||
if (glob_status != 0) {
|
||||
if (glob_status < 0) {
|
||||
Error("Can't glob '%s': %s", glob_pattern, strerror(errno));
|
||||
Error("Can't glob '%s': %s", glob_pattern.c_str(), strerror(errno));
|
||||
} else {
|
||||
Debug(1, "Can't glob '%s': %d", glob_pattern, glob_status);
|
||||
Debug(1, "Can't glob '%s': %d", glob_pattern.c_str(), glob_status);
|
||||
}
|
||||
} else {
|
||||
for (unsigned int i = 0; i < pglob.gl_pathc; i++) {
|
||||
|
@ -75,7 +74,7 @@ void zmLoadDBConfig() {
|
|||
std::string sql = stringtf("SELECT `Id` FROM `Servers` WHERE `Name`='%s'",
|
||||
staticConfig.SERVER_NAME.c_str());
|
||||
zmDbRow dbrow;
|
||||
if (dbrow.fetch(sql.c_str())) {
|
||||
if (dbrow.fetch(sql)) {
|
||||
staticConfig.SERVER_ID = atoi(dbrow[0]);
|
||||
} else {
|
||||
Fatal("Can't get ServerId for Server %s", staticConfig.SERVER_NAME.c_str());
|
||||
|
@ -87,7 +86,7 @@ void zmLoadDBConfig() {
|
|||
std::string sql = stringtf("SELECT `Name` FROM `Servers` WHERE `Id`='%d'", staticConfig.SERVER_ID);
|
||||
|
||||
zmDbRow dbrow;
|
||||
if (dbrow.fetch(sql.c_str())) {
|
||||
if (dbrow.fetch(sql)) {
|
||||
staticConfig.SERVER_NAME = std::string(dbrow[0]);
|
||||
} else {
|
||||
Fatal("Can't get ServerName for Server ID %d", staticConfig.SERVER_ID);
|
||||
|
@ -100,13 +99,10 @@ void zmLoadDBConfig() {
|
|||
}
|
||||
}
|
||||
|
||||
snprintf(staticConfig.capture_file_format, sizeof(staticConfig.capture_file_format), "%%s/%%0%dd-capture.jpg",
|
||||
config.event_image_digits);
|
||||
snprintf(staticConfig.analyse_file_format, sizeof(staticConfig.analyse_file_format), "%%s/%%0%dd-analyse.jpg",
|
||||
config.event_image_digits);
|
||||
snprintf(staticConfig.general_file_format, sizeof(staticConfig.general_file_format), "%%s/%%0%dd-%%s",
|
||||
config.event_image_digits);
|
||||
snprintf(staticConfig.video_file_format, sizeof(staticConfig.video_file_format), "%%s/%%s");
|
||||
staticConfig.capture_file_format = stringtf("%%s/%%0%dd-capture.jpg", config.event_image_digits);
|
||||
staticConfig.analyse_file_format = stringtf("%%s/%%0%dd-analyse.jpg", config.event_image_digits);
|
||||
staticConfig.general_file_format = stringtf("%%s/%%0%dd-%%s", config.event_image_digits);
|
||||
staticConfig.video_file_format = "%s/%s";
|
||||
}
|
||||
|
||||
void process_configfile(char const *configFile) {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue