Compare commits
15 Commits
b333742f9f
...
master
Author | SHA1 | Date | |
---|---|---|---|
bb5a5245c8 | |||
a9cce7b660 | |||
958a5aa658 | |||
797a54d2d9 | |||
ae474d490f | |||
be8b6c5cf0 | |||
ae13e50979 | |||
e8677f7618 | |||
2fc68b049d | |||
aa120fd4f6 | |||
5c2c49c639 | |||
1b87e10297 | |||
70caa69660 | |||
7b75b29500 | |||
8791a5d86d |
@ -10,7 +10,7 @@ BBFILE_PATTERN_meta-diya = "^${LAYERDIR}/"
|
||||
BBFILE_PRIORITY_meta-diya = "11"
|
||||
|
||||
LAYERDEPENDS_meta-diya = " core "
|
||||
LAYERSERIES_COMPAT_meta-diya = "scarthgap"
|
||||
LAYERSERIES_COMPAT_meta-diya = "walnascar"
|
||||
|
||||
PACKAGE_CLASSES = "package_ipk"
|
||||
|
||||
@ -20,9 +20,9 @@ INITRAMFS_MAXSIZE="200000"
|
||||
INHERIT += "rm_work"
|
||||
|
||||
EXTRA_IMAGE_FEATURES ?= " ssh-server-dropbear read-only-rootfs "
|
||||
DISTRO_FEATURES:append := " opengl "
|
||||
DISTRO_FEATURES:append := " opengl pam "
|
||||
DISTRO_FEATURES:remove = " x11 vulkan ptest "
|
||||
TOOLCHAIN_TARGET_TASK:append = " libgles3-mesa-dev "
|
||||
TOOLCHAIN_TARGET_TASK:append := " libgles3-mesa-dev "
|
||||
# DISTRO_FEATURES:append := " vc4-gfx opengl directfb "
|
||||
|
||||
WKS_FILE="image.wks.in"
|
||||
|
@ -3,5 +3,5 @@ SRC_URI += "file://default"
|
||||
|
||||
do_install:append () {
|
||||
rm -rf ${D}/etc/dropbear
|
||||
install -m 0644 ${WORKDIR}/default ${D}${sysconfdir}/default/dropbear
|
||||
install -m 0644 ${UNPACKDIR}/default ${D}${sysconfdir}/default/dropbear
|
||||
}
|
@ -8,7 +8,7 @@ EXTRA_USERS_PARAMS = "usermod -d /home/diya -p 2Pe/4xyFxsokE diya; \
|
||||
usermod -a -G audio diya; \
|
||||
usermod -a -G sudo diya; \
|
||||
"
|
||||
IMAGE_BOOT_FILES:append = " fs_resize config.txt recovery-${MACHINE}.cpio.gz Image "
|
||||
IMAGE_BOOT_FILES:append = " fs_resize diya-config.txt recovery-${MACHINE}.cpio.gz Image "
|
||||
|
||||
IMAGE_INSTALL:append = "kernel-modules \
|
||||
e2fsprogs \
|
||||
@ -20,6 +20,7 @@ IMAGE_INSTALL:append = "kernel-modules \
|
||||
libglapi \
|
||||
libudev \
|
||||
libinput \
|
||||
libpam \
|
||||
diya-overlay \
|
||||
seatd \
|
||||
libxkbcommon \
|
||||
|
@ -8,6 +8,8 @@ EXTRA_USERS_PARAMS:append = "useradd xdg; \
|
||||
usermod -a -G input xdg; \
|
||||
usermod -a -G tty xdg; \
|
||||
usermod -a -G avahi diya; \
|
||||
usermod -a -G seat diya; \
|
||||
usermod -a -G seat xdg; \
|
||||
usermod -a -G xdg diya;"
|
||||
IMAGE_INSTALL:append = "pango \
|
||||
seatd \
|
||||
@ -20,15 +22,15 @@ IMAGE_INSTALL:append = "pango \
|
||||
gdk-pixbuf \
|
||||
gtk4 \
|
||||
gtk4-layer-shell \
|
||||
libadwaita \
|
||||
gobject-introspection \
|
||||
wayland wayland-protocols \
|
||||
foot swaybg swayidle swaylock tofi wtype \
|
||||
wayland wayland-protocols wlroots-0.18 \
|
||||
foot \
|
||||
mc \
|
||||
gdbserver gdb \
|
||||
labwc \
|
||||
wlr-randr \
|
||||
diya-session-manager \
|
||||
"
|
||||
PACKAGE_EXCLUDE = " gtk+ gtk+3 adwaita-icon-theme "
|
||||
IMAGE_INSTALL:remove = " gtk+ gtk+3 adwaita-icon-theme "
|
||||
# wlr-randr l3afpad wlopm cairo-egl
|
||||
# wlr-randr l3afpad wlopm cairo-egl webkitgtk
|
@ -41,12 +41,6 @@ IMAGE_PREPROCESS_COMMAND += "image_patch;"
|
||||
image_patch () {
|
||||
# delete unused image
|
||||
rm -rf ${IMAGE_ROOTFS}/boot/*
|
||||
# create /etc/fstab
|
||||
cat << EOF > ${IMAGE_ROOTFS}/etc/fstab
|
||||
/dev/mmcblk1p1 /boot auto defaults 0 0
|
||||
/dev/mmcblk1p4 /home auto defaults 0 0
|
||||
|
||||
EOF
|
||||
cat << EOF > ${IMAGE_ROOTFS}/etc/hostname
|
||||
diya-recovery
|
||||
EOF
|
||||
|
@ -3,5 +3,5 @@ SRC_URI += " file://itf_diya "
|
||||
|
||||
do_install:append () {
|
||||
rm ${D}/etc/network/interfaces
|
||||
install -m 0644 ${WORKDIR}/itf_diya ${D}/etc/network/interfaces
|
||||
install -m 0644 ${UNPACKDIR}/itf_diya ${D}/etc/network/interfaces
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
DESCRIPTION = "Auto configuration deployment from media"
|
||||
DEPENDS = ""
|
||||
RDEPENDS:${PN} = "bash"
|
||||
LICENSE = "MIT"
|
||||
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
|
||||
|
||||
@ -7,9 +8,11 @@ SRC_URI += "file://confd \
|
||||
file://expandfs.sh \
|
||||
file://80_diya \
|
||||
file://fs_resize \
|
||||
file://boot-to-recovery"
|
||||
|
||||
file://boot-to-recovery \
|
||||
file://diya.pam \
|
||||
file://xdg-terminal-exec"
|
||||
|
||||
S = "${UNPACKDIR}"
|
||||
inherit update-rc.d useradd
|
||||
|
||||
USERADD_PACKAGES = "${PN}"
|
||||
@ -23,15 +26,18 @@ INITSCRIPT_PARAMS = "start 30 S ."
|
||||
do_install() {
|
||||
install -d ${D}/${sysconfdir}/init.d/
|
||||
install -d ${DEPLOY_DIR_IMAGE}
|
||||
install -m 0755 ${WORKDIR}/confd ${D}/${sysconfdir}/init.d/confd
|
||||
install -m 0755 ${UNPACKDIR}/confd ${D}/${sysconfdir}/init.d/confd
|
||||
install -d ${D}/sbin/
|
||||
install -d ${D}/etc/default/volatiles
|
||||
install -m 0644 ${WORKDIR}/80_diya ${D}${sysconfdir}/default/volatiles
|
||||
install -m 0755 ${WORKDIR}/expandfs.sh ${D}/sbin/expandfs.sh
|
||||
install -m 0755 ${WORKDIR}/boot-to-recovery ${D}/sbin/boot-to-recovery
|
||||
install -m 0755 ${WORKDIR}/fs_resize ${DEPLOY_DIR_IMAGE}/
|
||||
|
||||
cat << EOF > ${DEPLOY_DIR_IMAGE}/config.txt
|
||||
install -m 0644 ${UNPACKDIR}/80_diya ${D}${sysconfdir}/default/volatiles
|
||||
install -m 0755 ${UNPACKDIR}/expandfs.sh ${D}/sbin/expandfs.sh
|
||||
install -m 0755 ${UNPACKDIR}/boot-to-recovery ${D}/sbin/boot-to-recovery
|
||||
install -m 0755 ${UNPACKDIR}/fs_resize ${DEPLOY_DIR_IMAGE}/
|
||||
install -d ${D}/etc/pam.d
|
||||
install -m 0644 ${UNPACKDIR}/diya.pam ${D}${sysconfdir}/pam.d/diya
|
||||
install -d ${D}/usr/bin
|
||||
install -m 0755 ${UNPACKDIR}/xdg-terminal-exec ${D}/usr/bin
|
||||
cat << EOF > ${DEPLOY_DIR_IMAGE}/diya-config.txt
|
||||
recovery=false
|
||||
recovery_image=recovery-${MACHINE}.cpio.gz
|
||||
console=both
|
||||
|
@ -6,16 +6,17 @@ if [[ $(/usr/bin/id -u) -ne 0 ]]; then
|
||||
fi
|
||||
|
||||
. /etc/profile
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
if [ ! -e /boot/config.txt ]; then
|
||||
if [ ! -e /boot/diya-config.txt ]; then
|
||||
# prepare env for recovery boot
|
||||
cat << EOF > /boot/config.txt
|
||||
cat << EOF > /boot/diya-config.txt
|
||||
recovery=true
|
||||
recovery_image=recovery-${MACHINE}.cpio.gz
|
||||
EOF
|
||||
else
|
||||
sed -i 's/^.*recovery.*/recovery=true/g' /boot/config.txt || \
|
||||
echo "recovery=true" >> /boot/config.txt
|
||||
sed -i 's/^.*recovery.*/recovery=true/g' /boot/diya-config.txt || \
|
||||
echo "recovery=true" >> /boot/diya-config.txt
|
||||
fi
|
||||
echo "Rebooting to recovery mode"
|
||||
reboot
|
@ -1,10 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DESC="Auto deployment configuration from media"
|
||||
|
||||
. /etc/profile
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
if [ -z "$DISK" ]; then
|
||||
DISK="mmcblk1"
|
||||
DISK="mmcblk0"
|
||||
fi
|
||||
|
||||
case "$1" in
|
||||
|
5
recipes-diya/diya-overlay/files/diya.pam
Normal file
5
recipes-diya/diya-overlay/files/diya.pam
Normal file
@ -0,0 +1,5 @@
|
||||
#%PAM-1.0
|
||||
|
||||
auth include common-auth
|
||||
account include common-account
|
||||
session include common-session
|
@ -1,7 +1,9 @@
|
||||
#! /bin/sh
|
||||
. /etc/profile
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
if [ -z "$DISK" ]; then
|
||||
DISK="mmcblk1"
|
||||
DISK="mmcblk0"
|
||||
fi
|
||||
|
||||
if [ "$(/usr/bin/id -u)" -ne 0 ]; then
|
||||
|
2
recipes-diya/diya-overlay/files/xdg-terminal-exec
Normal file
2
recipes-diya/diya-overlay/files/xdg-terminal-exec
Normal file
@ -0,0 +1,2 @@
|
||||
#! /bin/bash
|
||||
foot "$@"
|
@ -10,8 +10,8 @@ SRC_URI += "git://git.iohub.dev/dany/diya-session-manager.git;protocol=https;bra
|
||||
file://diya-sessiond"
|
||||
|
||||
SRCREV = "${AUTOREV}"
|
||||
PV = "0.1.0+git${SRCPV}"
|
||||
S = "${WORKDIR}/git"
|
||||
PV = "0.1.1+git${SRCPV}"
|
||||
S = "${UNPACKDIR}/git"
|
||||
|
||||
inherit meson pkgconfig
|
||||
|
||||
@ -27,10 +27,10 @@ do_install:append() {
|
||||
install -d ${D}/etc/dbus-1/system.d
|
||||
install -d ${D}/etc/init.d
|
||||
install -m 0755 ${WORKDIR}/build/diya-session-manager ${D}/usr/bin/
|
||||
install -m 0755 ${WORKDIR}/diya-sessiond ${D}/etc/init.d/
|
||||
install -m 0755 ${WORKDIR}/diya-session-launch ${D}/usr/bin/
|
||||
install -m 0644 ${WORKDIR}/daemon.conf ${D}/etc/diya/
|
||||
install -m 0644 ${WORKDIR}/dbus-diya.conf ${D}/etc/dbus-1/system.d/
|
||||
install -m 0755 ${UNPACKDIR}/diya-sessiond ${D}/etc/init.d/
|
||||
install -m 0755 ${UNPACKDIR}/diya-session-launch ${D}/usr/bin/
|
||||
install -m 0644 ${UNPACKDIR}/daemon.conf ${D}/etc/diya/
|
||||
install -m 0644 ${UNPACKDIR}/dbus-diya.conf ${D}/etc/dbus-1/system.d/
|
||||
}
|
||||
|
||||
FILES:${PN} = "/etc/diya \
|
||||
|
@ -21,4 +21,7 @@ login_session_user = xdg
|
||||
# login session is successful
|
||||
# the logged in user will own this session
|
||||
|
||||
user_session_command = diya-session-launch diyac -x diya-shell
|
||||
user_session_command = diya-session-launch diyac -x diya-shell
|
||||
|
||||
# PAM service used by the daemon for authentication
|
||||
pam_service = diya
|
@ -1,14 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
DESC="Custom configuration"
|
||||
. /etc/profile
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
echo -n "Start $DESC: "
|
||||
sed -i 's/^.*recovery.*/recovery=false/g' /boot/config.txt || \
|
||||
echo "recovery=false" >> /boot/config.txt
|
||||
sed -i 's/^.*recovery.*/recovery=false/g' /boot/diya-config.txt || \
|
||||
echo "recovery=false" >> /boot/diya-config.txt
|
||||
;;
|
||||
|
||||
*)
|
||||
|
@ -1,16 +1,20 @@
|
||||
#! /bin/sh
|
||||
|
||||
. /etc/profile
|
||||
PATH=/sbin:/bin:/usr/sbin:/usr/bin
|
||||
|
||||
if [ -z "$DISK" ]; then
|
||||
DISK="mmcblk0"
|
||||
fi
|
||||
|
||||
DEFAULT_ROOTFS_NAME="rootfs-$MACHINE.tar.bz2"
|
||||
DEFAULT_KERNEL_NAME="Image-$MACHINE.bin"
|
||||
DEFAULT_INITRAMFS_NAME="recovery-$MACHINE.cpio.gz"
|
||||
UPDATE_SRC_PATH="/home/diya/.update"
|
||||
ROOTFS_DEV="/dev/mmcblk1p2"
|
||||
ROOTFS_DEV="/dev/${DISK}p2"
|
||||
SUPPORTED_COMMAND="rootfs kernel initramfs all"
|
||||
TMP_MOUNT="/tmp/rootfs"
|
||||
|
||||
|
||||
rootfs()
|
||||
{
|
||||
filename=$1
|
||||
@ -54,9 +58,9 @@ rootfs()
|
||||
echo "Patch /etc/fstab"
|
||||
cat << EOF >> $TMP_MOUNT/etc/fstab
|
||||
|
||||
/dev/mmcblk1p1 /boot vfat defaults 0 0
|
||||
/dev/mmcblk1p3 /var/etc ext4 defaults 0 0
|
||||
/dev/mmcblk1p4 /home ext4 defaults 0 0
|
||||
/dev/${DISK}p1 /boot vfat defaults 0 0
|
||||
/dev/${DISK}p3 /var/etc ext4 defaults 0 0
|
||||
/dev/${DISK}p4 /home ext4 defaults 0 0
|
||||
|
||||
EOF
|
||||
sync
|
||||
|
@ -15,7 +15,7 @@ SRC_URI = "file://init \
|
||||
file://diya-update \
|
||||
"
|
||||
|
||||
S = "${WORKDIR}"
|
||||
S = "${UNPACKDIR}"
|
||||
|
||||
INITSCRIPT_NAME = "confd"
|
||||
INITSCRIPT_PARAMS = "start 30 S ."
|
||||
@ -24,12 +24,12 @@ do_install() {
|
||||
install -d ${D}/etc/init.d
|
||||
install -d ${D}/sbin
|
||||
# base
|
||||
install -m 0755 ${WORKDIR}/init ${D}/init
|
||||
install -m 0755 ${WORKDIR}/confd ${D}/etc/init.d/confd
|
||||
install -m 0755 ${UNPACKDIR}/init ${D}/init
|
||||
install -m 0755 ${UNPACKDIR}/confd ${D}/etc/init.d/confd
|
||||
cat << EOF >> ${D}/etc/profile
|
||||
export MACHINE=${MACHINE}
|
||||
EOF
|
||||
install -m 0755 ${WORKDIR}/diya-update ${D}/sbin/
|
||||
install -m 0755 ${UNPACKDIR}/diya-update ${D}/sbin/
|
||||
|
||||
# create symlink
|
||||
ln -sf /sbin/diya-update ${D}/sbin/diya-update-rootfs
|
||||
|
@ -1,4 +1,4 @@
|
||||
PV = "1.1.0"
|
||||
SRCREV = "v1.1.0"
|
||||
PV = "1.1.1"
|
||||
SRCREV = "v1.1.1"
|
||||
|
||||
INSANE_SKIP:${PN}-dev += "dev-elf"
|
1
recipes-sato/webkit/webkitgtk_%.bbapend
Normal file
1
recipes-sato/webkit/webkitgtk_%.bbapend
Normal file
@ -0,0 +1 @@
|
||||
PACKAGECONFIG:remove = "x11 systemd"
|
@ -5,7 +5,7 @@ LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-3.0-only;md5=c79ff39f19dfec
|
||||
|
||||
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
|
||||
|
||||
S="${WORKDIR}"
|
||||
S = "${UNPACKDIR}"
|
||||
|
||||
DEPENDS = "gtk+3 pango cairo harfbuzz gdk-pixbuf intltool-native"
|
||||
|
||||
|
@ -12,7 +12,7 @@ SRCREV = "${AUTOREV}"
|
||||
SRC_URI = "git://github.com/LBCrion/sfwbar.git;protocol=https;branch=main"
|
||||
SRC_URI += " file://sfwbar.config "
|
||||
|
||||
S="${WORKDIR}/git"
|
||||
S="${UNPACKDIR}/git"
|
||||
|
||||
inherit meson pkgconfig
|
||||
|
||||
@ -21,7 +21,7 @@ EXTRA_OEMESON += "--buildtype release"
|
||||
do_install:append () {
|
||||
install -d ${D}/${sysconfdir}/xdg/
|
||||
install -d ${D}/${sysconfdir}/xdg/sfwbar/
|
||||
install -m 0755 ${WORKDIR}/sfwbar.config ${D}/${sysconfdir}/xdg/sfwbar/
|
||||
install -m 0755 ${UNPACKDIR}/sfwbar.config ${D}/${sysconfdir}/xdg/sfwbar/
|
||||
}
|
||||
|
||||
FILES:${PN} += "/usr/share/icons/*"
|
||||
|
@ -12,7 +12,7 @@ SRCREV = "${AUTOREV}"
|
||||
SRC_URI = "git://github.com/philj56/tofi.git;protocol=https;branch=master"
|
||||
SRC_URI += " file://config file://drun "
|
||||
|
||||
S="${WORKDIR}/git"
|
||||
S="${UNPACKDIR}/git"
|
||||
|
||||
inherit meson pkgconfig
|
||||
|
||||
@ -20,8 +20,8 @@ EXTRA_OEMESON += "--buildtype release"
|
||||
|
||||
do_install:append () {
|
||||
# replace the default config
|
||||
install -m 0755 ${WORKDIR}/drun ${D}/usr/bin/
|
||||
install -m 0755 ${WORKDIR}/config ${D}/${sysconfdir}/xdg/tofi/
|
||||
install -m 0755 ${UNPACKDIR}/drun ${D}/usr/bin/
|
||||
install -m 0755 ${UNPACKDIR}/config ${D}/${sysconfdir}/xdg/tofi/
|
||||
}
|
||||
|
||||
FILES:${PN} += "/usr/share/*"
|
||||
|
@ -10,7 +10,7 @@ SRCREV = "${AUTOREV}"
|
||||
|
||||
SRC_URI = "git://git.iohub.dev/dany/wlopm.git;protocol=https;branch=master"
|
||||
|
||||
S="${WORKDIR}/git"
|
||||
S="${UNPACKDIR}/git"
|
||||
|
||||
do_compile () {
|
||||
oe_runmake
|
||||
|
@ -10,7 +10,7 @@ SRCREV = "${AUTOREV}"
|
||||
|
||||
SRC_URI = "git://github.com/atx/wtype.git;protocol=https;branch=master"
|
||||
|
||||
S="${WORKDIR}/git"
|
||||
S="${UNPACKDIR}/git"
|
||||
|
||||
inherit meson pkgconfig
|
||||
|
||||
|
@ -13,13 +13,13 @@ do_install:append () {
|
||||
install -d ${D}/${sysconfdir}/xdg
|
||||
install -d ${D}/${sysconfdir}/init.d
|
||||
install -d ${D}/${sysconfdir}/xdg/labwc
|
||||
install -m 0755 ${WORKDIR}/init ${D}/${sysconfdir}/init.d/labwc
|
||||
install -m 0755 ${UNPACKDIR}/init ${D}/${sysconfdir}/init.d/labwc
|
||||
|
||||
install -m 0755 ${WORKDIR}/wpp.jpg ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${WORKDIR}/autostart ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${WORKDIR}/environment ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${WORKDIR}/menu.xml ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${WORKDIR}/rc.xml ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${UNPACKDIR}/wpp.jpg ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${UNPACKDIR}/autostart ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${UNPACKDIR}/environment ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${UNPACKDIR}/menu.xml ${D}/${sysconfdir}/xdg/labwc/
|
||||
install -m 0755 ${UNPACKDIR}/rc.xml ${D}/${sysconfdir}/xdg/labwc/
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,12 +0,0 @@
|
||||
# short-description: Create Raspberry Pi SD card image
|
||||
# long-description: Creates a partitioned SD card image for use with
|
||||
|
||||
part u-boot --source rawcopy --sourceparams="file=${SPL_BINARY}" --ondisk mmcblk1 --no-table --align 8
|
||||
part /boot --source bootimg-partition --ondisk mmcblk1 --fstype=vfat --label boot --active --align 4096 --size 32
|
||||
# read only roofs
|
||||
part / --source rootfs --ondisk mmcblk1 --fstype=ext4 --label root --align 4096 --size 150 --exclude-path home/ --exclude-path var/etc/ --exclude-path boot/
|
||||
# modifiable configurations stored in /var/etc
|
||||
part /var/etc --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/var/etc --ondisk mmcblk1 --fstype=ext4 --label diya --align 1024 --size 32
|
||||
# home partition
|
||||
part /home --source rootfs --rootfs-dir=${IMAGE_ROOTFS}/home --ondisk mmcblk1 --fstype=ext4 --label home --align 1024 --size 16
|
||||
# part /home --ondisk mmcblk1 --fstype=vfat --label music --active --align 1024 --size 16
|
Reference in New Issue
Block a user