On Thu, Aug 24, 2017 at 12:39:09AM +0200, Roland Hieber wrote: > If using systemd, CUPS can be started via socket activation or directly, > in any case it is run as user daemon, group lp. The default spool and > cache locations were moved to /tmp/cups so we don't need to set up a > tmpfs for /var/spool/cups and /var/cache/cups. > > sysvinit script is installed from upstream, but untested. > > Some config files are only created by cupsd on the first start and not > at install time, so we supply reasonable defaults in projectroot/ in > order to use $(call install_alternative...) on them. > > Signed-off-by: Roland Hieber <r.hie...@pengutronix.de> > --- > projectroot/etc/cups/classes.conf | 1 + > projectroot/etc/cups/client.conf | 2 + > projectroot/etc/cups/cups-files.conf | 22 +++ > projectroot/etc/cups/mailto.conf | 1 + > projectroot/etc/cups/ppd/.createdirectory | 0 > projectroot/etc/cups/printers.conf | 1 + > projectroot/etc/cups/ssl/.createdirectory | 0 > projectroot/etc/printcap | 3 + > projectroot/usr/lib/systemd/system/cups.service | 15 ++ > projectroot/usr/lib/systemd/system/cups.socket | 14 ++ > projectroot/usr/lib/tmpfiles.d/cups.conf | 6 + > rules/cups.in | 142 +++++++++++++++ > rules/cups.make | 227 > ++++++++++++++++++++++++ > 13 files changed, 434 insertions(+) > create mode 100644 projectroot/etc/cups/classes.conf > create mode 100644 projectroot/etc/cups/client.conf > create mode 100644 projectroot/etc/cups/cups-files.conf > create mode 100644 projectroot/etc/cups/mailto.conf > create mode 100644 projectroot/etc/cups/ppd/.createdirectory > create mode 100644 projectroot/etc/cups/printers.conf > create mode 100644 projectroot/etc/cups/ssl/.createdirectory > create mode 100644 projectroot/etc/printcap > create mode 100644 projectroot/usr/lib/systemd/system/cups.service > create mode 100644 projectroot/usr/lib/systemd/system/cups.socket > create mode 100644 projectroot/usr/lib/tmpfiles.d/cups.conf > create mode 100644 rules/cups.in > create mode 100644 rules/cups.make > > diff --git a/projectroot/etc/cups/classes.conf > b/projectroot/etc/cups/classes.conf > new file mode 100644 > index 000000000..dea737751 > --- /dev/null > +++ b/projectroot/etc/cups/classes.conf > @@ -0,0 +1 @@ > +# classes.conf - class configuration file for cups > diff --git a/projectroot/etc/cups/client.conf > b/projectroot/etc/cups/client.conf > new file mode 100644 > index 000000000..f8f0b6832 > --- /dev/null > +++ b/projectroot/etc/cups/client.conf > @@ -0,0 +1,2 @@ > +# CUPS client configuration > +ServerName localhost > diff --git a/projectroot/etc/cups/cups-files.conf > b/projectroot/etc/cups/cups-files.conf > new file mode 100644 > index 000000000..2cc2d5a5b > --- /dev/null > +++ b/projectroot/etc/cups/cups-files.conf > @@ -0,0 +1,22 @@ > +# File/directory/user/group configuration file for the CUPS scheduler. > +User daemon > +Group lp > +SystemGroup root > + > +AccessLog /var/log/cups/access_log > +ErrorLog /var/log/cups/error_log > +PageLog /var/log/cups/page_log > + > +CacheDir /tmp/cups/cache > +DataDir /usr/share/cups > +DocumentRoot /usr/share/doc/cups > +RequestRoot /tmp/cups/spool > +ServerBin /usr/lib/cups > +ServerRoot /etc/cups > +StateDir /var/run/cups > + > +Printcap /etc/printcap > +PrintcapFormat bsd > + > +# SSL/TLS keychain for the scheduler... > +#ServerKeychain ssl > diff --git a/projectroot/etc/cups/mailto.conf > b/projectroot/etc/cups/mailto.conf > new file mode 100644 > index 000000000..4502adaee > --- /dev/null > +++ b/projectroot/etc/cups/mailto.conf > @@ -0,0 +1 @@ > +# mailto.conf - configuration file for cups email notifier > diff --git a/projectroot/etc/cups/ppd/.createdirectory > b/projectroot/etc/cups/ppd/.createdirectory > new file mode 100644 > index 000000000..e69de29bb > diff --git a/projectroot/etc/cups/printers.conf > b/projectroot/etc/cups/printers.conf > new file mode 100644 > index 000000000..bf9879904 > --- /dev/null > +++ b/projectroot/etc/cups/printers.conf > @@ -0,0 +1 @@ > +# printers.conf - printer configuration file for cups > diff --git a/projectroot/etc/cups/ssl/.createdirectory > b/projectroot/etc/cups/ssl/.createdirectory > new file mode 100644 > index 000000000..e69de29bb > diff --git a/projectroot/etc/printcap b/projectroot/etc/printcap > new file mode 100644 > index 000000000..e74f358e1 > --- /dev/null > +++ b/projectroot/etc/printcap > @@ -0,0 +1,3 @@ > +# This file was automatically generated by cupsd(8) from the > +# /etc/cups/printers.conf file. All changes to this file > +# will be lost. > diff --git a/projectroot/usr/lib/systemd/system/cups.service > b/projectroot/usr/lib/systemd/system/cups.service > new file mode 100644 > index 000000000..ff94f69d2 > --- /dev/null > +++ b/projectroot/usr/lib/systemd/system/cups.service > @@ -0,0 +1,15 @@ > +[Unit] > +Description=CUPS Scheduler service > +Documentation=man:cupsd(8) > +Requires=systemd-tmpfiles-setup.service > +Requires=cups.socket > + > +[Service] > +User=daemon > +Group=lp > +ExecStart=/usr/sbin/cupsd -l -c /etc/cups/cupsd.conf -s > /etc/cups/cups-files.conf > +Type=simple > + > +[Install] > +Also=cups.socket > +WantedBy=printer.target > diff --git a/projectroot/usr/lib/systemd/system/cups.socket > b/projectroot/usr/lib/systemd/system/cups.socket > new file mode 100644 > index 000000000..de9f43b6b > --- /dev/null > +++ b/projectroot/usr/lib/systemd/system/cups.socket > @@ -0,0 +1,14 @@ > +[Unit] > +Description=CUPS Scheduler socket > +PartOf=cups.service > + > +[Socket] > +ListenStream=/run/cups.sock > +ListenStream=[::1]:631 > +ListenStream=127.0.0.1:631 > +BindIPv6Only=No > +SocketUser=daemon > +SocketGroup=lp > + > +[Install] > +WantedBy=sockets.target > diff --git a/projectroot/usr/lib/tmpfiles.d/cups.conf > b/projectroot/usr/lib/tmpfiles.d/cups.conf > new file mode 100644 > index 000000000..c000cf255 > --- /dev/null > +++ b/projectroot/usr/lib/tmpfiles.d/cups.conf > @@ -0,0 +1,6 @@ > +#Type Path Mode UID GID Age Argument > +d /var/log/cups 750 daemon lp - > +d /tmp/cups/cache/ 750 daemon lp - > +d /tmp/cups/spool/ 750 daemon lp - > +d /tmp/cups/spool/tmp/ 750 daemon lp - > +d /var/run/cups 750 daemon lp - > diff --git a/rules/cups.in b/rules/cups.in > new file mode 100644 > index 000000000..33c319752 > --- /dev/null > +++ b/rules/cups.in > @@ -0,0 +1,142 @@ > +## SECTION=applications > + > +menuconfig CUPS > + tristate > + prompt "cups " > + > + select ROOTFS_VAR_LOG > + select ROOTFS_VAR_RUN > + select LIBC_M > + select LIBC_CRYPT > + select ZLIB > + > + select LIBC_PTHREAD if CUPS_THREADING > + select SYSTEMD if CUPS_SYSTEMD_UNIT > + select LIBPAPER if CUPS_LIBPAPER > + select LIBUSB if CUPS_LIBUSB > + select DBUS if CUPS_DBUS > + select GNUTLS if CUPS_SSL > + select AVAHI if CUPS_AVAHI > + select AVAHI_LIBAVAHI_CLIENT if CUPS_AVAHI > + select ORACLE_JAVA7_JRE if CUPS_JAVA > + select PERL if CUPS_PERL > + select PHP5 if CUPS_PHP > + select PHP5_SAPI_CLI if CUPS_PHP > + select PYTHON if CUPS_PYTHON > + > + help > + CUPS is the standards-based, open source printing system. It uses the > + Internet Printing Protocol (IPP) to support printing to local and > + network printers. > + > +if CUPS > + > +comment "--- CUPS Features ---" > + > +config CUPS_THREADING > + bool "enable multithreading" > + default y > + help > + Enable multi-threading support > + > +config CUPS_WEBINTERFACE > + bool "enable web interface" > + help > + Enable CUPS printer management via HTTP(S). Only required for hosts > + which should act as a printing server. > + > + If you overwrite the config files for CUPS, be sure to have > + "WebInterface Yes" in your projectroot/etc/cups/cupsd.conf. > + > +config CUPS_SYSTEMD_UNIT > + bool "install systemd unit file" > + default y > + depends on INITMETHOD_SYSTEMD > + help > + Installs a systemd service file so that CUPS can be started as a > + systemd service. > + > +config CUPS_INITSCRIPT > + bool "install init.d script" > + depends on INITMETHOD_BBINIT > + help > + Install /etc/init.d/cups > + > +config CUPS_BBINIT_LINK > + string "link name" > + depends on CUPS_INITSCRIPT > + default "S90cups"
This option must be a separate file with SECTION=initmethod_bbinit > + > +config CUPS_TEST_TOOLS > + bool "install cupstest* tools" > + default n > + help > + Install cupstestdsc and cupstestppd on the target. > + > +comment "--- External Libraries ---" > + > +config CUPS_LIBPAPER > + bool "libpaper support" > + help > + Build with support for libpaper's collection of paper sizes > + > +config CUPS_LIBUSB > + bool "libusb support" > + help > + Build with libusb support. This is needed for the usb backend in order > + to use USB printers. > + > +config CUPS_DBUS > + bool "DBus support" > + help > + Builds CUPS with support for sending event notifications over DBUS > + > +config CUPS_SSL > + bool "enable TLS support" > + help > + Enables SSL support over IPP and HTTP, also for the web interface. > + > +config CUPS_AVAHI > + bool "enable Avahi support" > + help > + Enables support for discovery of network printers over Avahi/zeroconf. > + > +config CUPS_JAVA > + bool "enable Java support for web interface" > + depends on CUPS_WEBINTERFACE > + > +config CUPS_PERL > + bool "enable Perl support for web interface" > + depends on CUPS_WEBINTERFACE > + > +config CUPS_PHP > + bool "enable PHP support for web interface" > + depends on CUPS_WEBINTERFACE > + > +config CUPS_PYTHON > + bool "enable Python support for web interface" > + depends on CUPS_WEBINTERFACE > + > +comment "--- Debugging ---" > + > +config CUPS_DEBUG > + bool "enable debug build" > + default n > + help > + Pay attention: this will slow down CUPS drastically and increases the > + memory footprint. Don't enable this on a production system! > + > +config CUPS_DEBUG_PRINTF > + bool "enable debug output" > + help > + Enable much more debug messages. These messages are logged into a > + separate file, the output is controlled over the following environment > + variables: > + > + - CUPS_DEBUG_LOG: contains the file name to write the messages to > + - CUPS_DEBUG_LEVEL: defines the loglevel (0...9, with 9 very noisy) > + - CUPS_DEBUG_FILTER: defines a regular expression to filter out > + unwanted debug messages. > + > +endif > +# vim: ft=kconfig ts=8 noet tw=80 > diff --git a/rules/cups.make b/rules/cups.make > new file mode 100644 > index 000000000..058ad0bda > --- /dev/null > +++ b/rules/cups.make > @@ -0,0 +1,227 @@ > +# -*-makefile-*- > +# > +# Copyright (C) 2017 by Roland Hieber <r.hie...@pengutronix.de> > +# > +# See CREDITS for details about who has contributed to this project. > +# > +# For further information about the PTXdist project and license conditions > +# see the README file. > +# > + > +# > +# We provide this package > +# > +PACKAGES-$(PTXCONF_CUPS) += cups > + > +# > +# Paths and names > +# > +CUPS_VERSION := 2.2.4 > +CUPS := cups-$(CUPS_VERSION) > +CUPS_MD5 := d26e5a0a574a69fe1d01079b2931fc49 > +CUPS_SUFFIX := tar.gz > +CUPS_URL := > https://github.com/apple/cups/releases/download/v$(CUPS_VERSION)/$(CUPS)-source.$(CUPS_SUFFIX) > +CUPS_SOURCE := $(SRCDIR)/$(CUPS)-source.$(CUPS_SUFFIX) > +CUPS_DIR := $(BUILDDIR)/cups-$(CUPS_VERSION) > +CUPS_LICENSE := LGPLv2/GPLv2 LGPL-2.0 AND GPL-2.0 > + > +# > ---------------------------------------------------------------------------- > +# Prepare > +# > ---------------------------------------------------------------------------- > + > +CUPS_CONF_ENV := \ > + $(CROSS_ENV) \ > + DSTROOT=$(PKGDIR)/$(CUPS) > + > +# > +# autoconf > +# > +# The --with-* options are only used to specify strings, --without-* does > +# mostly nothing. So we're omitting them here. > +# > +# We have to set --exec-prefix and --libdir, otherwise the libs end up in > +# ${prefix}/lib64 due to broken autoconf magic, which is not what we want. > +# > +# --enable-mallinfo is currently broken, see > +# https://github.com/apple/cups/issues/5051 > +# > +# libtool support is unsupported upstream. Don't enable it, it will break > +# things, until https://github.com/apple/cups/pull/5062 is merged. > +# > +# --disable-dnssd only refers to Apple's mDNSResponder, not Avahi. > +# > +# Java, PHP, Perl and Python support for the webinterface is only a runtime > +# option, there are no real bindings for it except calling the interpreters. > +# > +CUPS_CONF_TOOL := autoconf > +CUPS_CONF_OPT := \ > + $(CROSS_AUTOCONF_USR) \ > + --exec-prefix=/usr/ \ > + --libdir=/usr/lib/ \ > + --disable-static \ > + --disable-mallinfo \ > + --$(call ptx/endis,PTXCONF_CUPS_LIBPAPER)-libpaper \ > + --$(call ptx/endis,PTXCONF_CUPS_LIBUSB)-libusb \ > + --disable-tcp-wrappers \ > + --disable-acl \ > + --$(call ptx/endis,PTXCONF_CUPS_DBUS)-dbus \ > + --enable-shared \ > + --disable-libtool-unsupported \ > + --$(call ptx/endis,PTXCONF_CUPS_DEBUG)-debug \ > + --$(call ptx/endis,PTXCONF_CUPS_DEBUG)-debug-guards \ > + --$(call ptx/endis,PTXCONF_CUPS_DEBUG_PRINTF)-debug-printfs \ > + --disable-unit-tests \ > + --$(call ptx/endis,PTXCONF_TARGET_HARDEN_RELRO)-relro \ > + --disable-gssapi \ > + --$(call ptx/endis,PTXCONF_CUPS_THREADING)-threads \ > + --$(call ptx/endis,PTXCONF_CUPS_SSL)-ssl \ > + --disable-cdsassl \ > + --$(call ptx/endis,PTXCONF_CUPS_SSL)-gnutls \ > + --disable-pam \ > + $(GLOBAL_LARGE_FILE_OPTION) \ > + --$(call ptx/endis,PTXCONF_CUPS_AVAHI)-avahi \ > + --disable-dnssd \ > + --disable-launchd \ > + --$(call ptx/endis,PTXCONF_CUPS_SYSTEMD_UNIT)-systemd \ > + --disable-upstart > + > +# Default config file settings (probably overwritten via projectroot > anyways...) > +CUPS_CONF_OPT += \ > + --disable-page-logging \ > + --disable-browsing \ > + --disable-default-shared \ > + --disable-raw-printing \ > + --$(call ptx/endis,PTXCONF_CUPS_WEBINTERFACE)-webif > + > +CUPS_CONF_OPT += \ > + --with-components=all \ > + --with-cachedir=/var/cache \ > + --with-logdir=/var/log \ > + --with-rundir=/run \ > + --with-rcdir=/etc \ > + --with-languages=none \ > + --with-cups-user=daemon \ > + --with-cups-group=lp \ > + $(call ptx/ifdef,PTXCONF_CUPS_JAVA,--with-java=/usr/bin/java,) \ > + $(call ptx/ifdef,PTXCONF_CUPS_PERL,--with-perl=/usr/bin/perl,) \ > + $(call ptx/ifdef,PTXCONF_CUPS_PHP,--with-php=/usr/bin/php5,) \ > + $(call ptx/ifdef,PTXCONF_CUPS_PYTHON,--with-python=/usr/bin/python,) Are these options only to set the executable path? If yes then always set those and remove the options and dependencies. Just add a comment to the webinterface option. > + > +# > ---------------------------------------------------------------------------- > +# Install > +# > ---------------------------------------------------------------------------- > + > +CUPS_MAKE_ENV := \ > + DSTROOT=$(PKGDIR)/$(CUPS) > + > +# > ---------------------------------------------------------------------------- > +# Target-Install > +# > ---------------------------------------------------------------------------- > + > +# CUPS drops many files into its PKGDIR, but instead of patching the build > +# system, be explicitly picky about what to install. > + > +$(STATEDIR)/cups.targetinstall: > + @$(call targetinfo) > + > + @$(call install_init, cups) > + @$(call install_fixup, cups,PRIORITY,optional) > + @$(call install_fixup, cups,SECTION,base) > + @$(call install_fixup, cups,AUTHOR,"Roland Hieber > <r.hie...@pengutronix.de>") > + @$(call install_fixup, cups,DESCRIPTION,missing) > + > +# ----- config files, install as daemon:lp You can use the user and group names below. > + @$(call install_alternative, cups, 1, 110, 0640, > /etc/cups/cups-files.conf) > + @$(call install_alternative, cups, 1, 110, 0640, /etc/cups/cupsd.conf) > + @$(call install_alternative, cups, 1, 110, 0600, /etc/cups/classes.conf) > + @$(call install_alternative, cups, 1, 110, 0600, /etc/cups/client.conf) > + @$(call install_alternative, cups, 1, 110, 0640, /etc/cups/mailto.conf) > + @$(call install_alternative_tree, cups, 1, 110, /etc/cups/ppd/) > + @$(call install_alternative, cups, 1, 110, 0600, > /etc/cups/printers.conf) > + @$(call install_alternative, cups, 1, 110, 0640, /etc/cups/snmp.conf) > + @$(call install_alternative, cups, 1, 110, 0640, /etc/printcap) > + @$(call install_alternative, cups, 1, 110, 0640, > /usr/share/cups/mime/mime.convs) > + @$(call install_alternative, cups, 1, 110, 0640, > /usr/share/cups/mime/mime.types) > + > +ifdef PTXCONF_CUPS_SSL > + @$(call install_alternative_tree, cups, 1, 110, /etc/cups/ssl/) > +endif > + > +ifdef PTXCONF_CUPS_DBUS > + @$(call install_alternative, cups, 0, 0, 0644, > /etc/dbus-1/system.d/cups.conf) > +endif > + > +# ----- libraries > + @$(call install_lib, cups, 0, 0, 0755, libcups) > + @$(call install_lib, cups, 0, 0, 0755, libcupsimage) > + @$(call install_lib, cups, 0, 0, 0755, libcupsmime) > + @$(call install_lib, cups, 0, 0, 0755, libcupsppdc) > + > +# ----- user and system binaries, with the correct access rights > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/cancel) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/cups-config) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/ipptool) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lp) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lpoptions) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lpq) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lpr) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lprm) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/lpstat) > + > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/accept) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsaccept) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsaddsmb) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsctl) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsd) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsdisable) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsenable) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsfilter) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/cupsreject) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/lpadmin) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/lpc) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/lpinfo) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/lpmove) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/sbin/reject) > + > +ifdef PTXCONF_CUPS_TEST_TOOLS > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/cupstestdsc) > + @$(call install_copy, cups, 0, 0, 0755, -, /usr/bin/cupstestppd) > +endif > + > +# ----- backends, filters, cgi-bin (if enabled), etc. > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/backend) > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/daemon) > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/filter) > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/monitor) > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/notifier) > + > +ifdef PTXCONF_CUPS_LIBUSB > + @$(call install_alternative, cups, 0, 0, 0644, \ /usr/share/cups/usb/org.cups.usb-quirks) break > +endif > + > +ifdef PTXCONF_CUPS_WEBINTERFACE > + @$(call install_lib, cups, 0, 0, 0755, libcupscgi) > + @$(call install_tree, cups, 0, 0, -, /usr/lib/cups/cgi-bin) > + @$(call install_tree, cups, 0, 0, -, /usr/share/cups/templates) > + @$(call install_tree, cups, 0, 0, -, /usr/share/doc/cups) Why docs? > +endif > + > +# ----- startup files > +ifdef PTXCONF_CUPS_SYSTEMD_UNIT > + @$(call install_alternative, cups, 0, 0, 0644, > /usr/lib/tmpfiles.d/cups.conf) > + @$(call install_alternative, cups, 0, 0, 0644, > /usr/lib/systemd/system/cups.service) > + @$(call install_alternative, cups, 0, 0, 0644, > /usr/lib/systemd/system/cups.socket) > + @$(call install_link, cups, ../cups.service, > /usr/lib/systemd/system/printer.target.wants/cups.service) > + @$(call install_link, cups, ../cups.socket, > /usr/lib/systemd/system/sockets.target.wants/cups.socket) break all lines here. > +endif > + > +ifdef PTXCONF_CUPS_INITSCRIPT > + @$(call install_alternative, cups, 0, 0, 0755, /etc/init.d/cups) > + @$(call install_link, cups, ../init.d/cups, \ /etc/rc.d/$(PTXCONF_CUPS_BBINIT_LINK)) break Michael > +endif > + > + @$(call install_finish, cups) > + > + @$(call touch) > + > +# vim: ft=make ts=8 tw=80 > -- > 2.11.0 > > > _______________________________________________ > ptxdist mailing list > ptxdist@pengutronix.de -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ ptxdist mailing list ptxdist@pengutronix.de