diff --git a/.devcontainer/post-attach.sh b/.devcontainer/post-attach.sh index ae63051..db66bac 100755 --- a/.devcontainer/post-attach.sh +++ b/.devcontainer/post-attach.sh @@ -48,3 +48,4 @@ function azure-mount() { # Second arg: Name of Azure container azure-mount "azure-sstate-cache" "yocto-sstate-cache" azure-mount "azure-downloads-cache" "downloads" +azure-mount "azure-debian" "debian" diff --git a/.gitignore b/.gitignore index 7327afc..3ca20d2 100644 --- a/.gitignore +++ b/.gitignore @@ -55,6 +55,7 @@ poky/ # Remote sstate-cache on Azure Storage azure-sstate-cache/ azure-downloads-cache/ +azure-*/ bitbake/ # BitBake Hash Equivalence Server database @@ -82,3 +83,5 @@ resources/docker-snapshot/dockerfiles/leda-tests/log.html resources/docker-snapshot/dockerfiles/leda-tests/output.xml resources/docker-snapshot/dockerfiles/leda-tests/report.html +resources/debian/repo-root +resources/debian/private.pgp diff --git a/desiredstate.json b/desiredstate.json new file mode 100644 index 0000000..13ebe3a --- /dev/null +++ b/desiredstate.json @@ -0,0 +1,121 @@ +{ + "name": "mike_test3", + "specification": { + "baselines": [], + "domains": [ + { + "id": "containers", + "components": [ + { + "id": "wiper-app", + "version": "edge", + "config": [ + { + "key": "image", + "value": "ghcr.io/softwaredefinedvehicle/wiperpoc/wiperpoc:latest" + }, + { + "key": "env", + "value": "SDV_MIDDLEWARE_TYPE=native" + }, + { + "key": "env", + "value": "SDV_VEHICLEDATABROKER_ADDRESS=127.0.0.1:55555" + }, + { + "key": "env", + "value": "SDV_MQTT_ADDRESS=mqtt://127.0.0.1:1883" + }, + { + "key": "env", + "value": "SDV_SEATSERVICE_ADDRESS=127.0.0.1:30051" + }, + { + "key": "network", + "value": "host" + } + ] + }, + { + "id": "ota-client", + "version": "v0.0.2", + "config": [ + { + "key": "image", + "value": "ghcr.io/softwaredefinedvehicle/sdv-ota-client/ota-client:v0.0.2" + }, + { + "key": "mount", + "value": "/etc/ota-client:/app/config" + }, + { + "key": "mount", + "value": "/data/var/certificates:/app/config/certs" + }, + { + "key": "mount", + "value": "/etc/ssl/certs:/app/config/ca-certs/" + }, + { + "key": "mount", + "value": "/tmp:/tmp" + }, + { + "key": "host", + "value": "mosquitto:host_ip" + } + ] + }, + { + "id": "vehicledatabroker", + "version": "v0.0.2", + "config": [ + { + "key": "image", + "value": "ghcr.io/boschglobal/kuksa.val/databroker:0.0.2" + }, + { + "key": "port", + "value": "55555:55555" + } + ] + }, + { + "id": "someip-feeder", + "version": "sha-3c4811b", + "config": [ + { + "key": "image", + "value": "ghcr.io/softwaredefinedvehicle/kuksa.val.feeders.fork/someip-feeder:sha-3c4811b" + }, + { + "key": "network", + "value": "host" + }, + { + "key": "env", + "value": "BROKER_ADDR=127.0.0.1:55555" + } + ] + } + ], + "config": [] + }, + { + "id": "safetyApp", + "components": [], + "config": [] + }, + { + "id": "safetyEcu", + "components": [], + "config": [] + }, + { + "id": "selfUpdate", + "components": [], + "config": [] + } + ] + } + } \ No newline at end of file diff --git a/kas/common-kirkstone.yaml b/kas/common-kirkstone.yaml index 095c01f..b6547ac 100644 --- a/kas/common-kirkstone.yaml +++ b/kas/common-kirkstone.yaml @@ -22,6 +22,7 @@ target: sdv-image-all local_conf_header: meta-leda: | INHERIT += "rm_work" + PACKAGE_CLASSES += " package_deb" INHERIT:remove = " archiver" INHERIT:remove = " cve-check" INHIBIT_PACKAGE_DEBUG_SPLIT = "1" diff --git a/resources/README.md b/resources/README.md index 00bb0b3..de6ac2a 100644 --- a/resources/README.md +++ b/resources/README.md @@ -2,6 +2,8 @@ This folder containers additional resources for building and running Leda quickstart images using QEMU and Docker. +- `apertis`- For Leda develoeprs: Documentation how to install Leda stack onto an Apertis IoT Fixed Function image +- `debian`- For Leda develoeprs: Experiment to install Yocto-built Debian packages of Leda components into plain Debian docker images. - `docker`- For users: Documentation explains how to start the Leda Quickstart Docker container - `docker-compose` - For users: Documentation and docker compose setup, which starts multiple Leda containers including an update bundle webserver - `docker-release` - For Leda developers: Building Leda docker container based on the latest public release of Leda (requires public release) diff --git a/resources/apertis/Dockerfile.apertis b/resources/apertis/Dockerfile.apertis new file mode 100644 index 0000000..d8a38d1 --- /dev/null +++ b/resources/apertis/Dockerfile.apertis @@ -0,0 +1,84 @@ +# syntax=docker/dockerfile:1 +# +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# + +FROM debian:bullseye AS build + +ARG DEBIAN_FRONTEND=noninteractive +ARG TZ=Etc/UTC + +LABEL name="leda-apertis-x86" + +RUN echo "deb http://deb.debian.org/debian bullseye-backports main" > /etc/apt/sources.list.d/debian-bullseye-backports.list +RUN apt-get update +RUN apt-get install -y --no-install-recommends ca-certificates curl +RUN apt-get install -y -t bullseye-backports qemu-system-x86 + +RUN curl -o apertis.img.gz https://images.apertis.org/release/v2023/v2023.0/amd64/iot/apertis_v2023-iot-amd64-uefi_v2023.0.img.gz +RUN gunzip apertis.img.gz +RUN ls -al +RUN qemu-img convert -f raw -O qcow2 apertis.img apertis.qcow2 + +FROM debian:bullseye AS runtime + +RUN apt-get update +RUN apt-get install -y --no-install-recommends \ + bind9-utils \ + ca-certificates \ + curl \ + dnsmasq \ + dnsutils \ + iproute2 \ + iptables \ + iputils-ping \ + isc-dhcp-server \ + net-tools \ + ssh \ + sudo \ + uml-utilities \ + xz-utils \ + sshpass + +# Debian Bullseye contains QEMU 5.2 +# RUN apt-get install -y --no-install-recommends qemu-system-x86 + +# Debian Bullseye-Backports contains QEMU 7.2 +RUN echo "deb http://deb.debian.org/debian bullseye-backports main" > /etc/apt/sources.list.d/debian-bullseye-backports.list +RUN apt-get update +RUN apt-get install -y -t bullseye-backports qemu-system-x86 + +WORKDIR /root + +COPY --from=build apertis.qcow2 /root/apertis.qcow2 +COPY build/tmp/deploy/images/qemux86-64/ovmf.qcow2 /root/ovmf.qcow2 + +# Original runner and a temporary modified one ("...-x86.sh") +RUN mkdir -p /docker +COPY resources/apertis/dockerfiles/leda-apertis-docker-entrypoint-x86.sh /docker/ +COPY resources/apertis/dockerfiles/leda-apertis-bootstrapper.sh /docker/ +COPY resources/apertis/dockerfiles/leda-apertis-install-sdv.sh /docker/ +RUN chmod a+x /docker/leda-apertis-docker-entrypoint-x86.sh +RUN chmod a+x /docker/leda-apertis-bootstrapper.sh +RUN chmod a+x /docker/leda-apertis-install-sdv.sh +ENTRYPOINT [ "/docker/leda-apertis-docker-entrypoint-x86.sh" ] + +# Expose SSH access +EXPOSE 2222 + +# Expose MQTT broker: Eclipse Mosquitto +EXPOSE 1883 + +# Expose Eclipse Kuksa Databroker +EXPOSE 30555 diff --git a/resources/apertis/README.md b/resources/apertis/README.md new file mode 100644 index 0000000..f7b4c55 --- /dev/null +++ b/resources/apertis/README.md @@ -0,0 +1,223 @@ +# Running Leda Stack on Apertis + + +## Preparation of the image + +1. Download the latest Apertis IoT image + +```shell +wget https://images.apertis.org/release/v2023/v2023.0/amd64/iot/apertis_v2023-iot-amd64-uefi_v2023.0.img.gz +``` + +2. Run the image, e.g. in QEMU: + +```shell +qemu-system-x86_64 \ + -net nic,model=virtio \ + -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::1880-:1880,hostfwd=tcp::1883-:1883,hostfwd=tcp::8888-:8888,hostfwd=tcp::30555-:30555 \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -device virtio-rng-pci,rng=rng0 \ + -hda apertis_v2023-iot-amd64-uefi_v2023.0.img \ + -serial mon:stdio \ + -serial null \ + -serial mon:vc \ + -boot order=cd \ + -nographic \ + -enable-kvm \ + -object can-bus,id=canbus0 \ + -device kvaser_pci,canbus=canbus0 \ + -cpu IvyBridge \ + -drive if=pflash,format=qcow2,file=ovmf.qcow2 \ + -machine q35 \ + -smp 4 \ + -m 2G +``` + +3. Login as `user` with password `user` + +4. Install the dependencies by following the *Eclipse Kanto - [Getting Started Guide](https://websites.eclipseprojects.io/kanto/docs/getting-started/install/)* + + > Note: Some tools are not available on Apertis out of the box, hence the following steps will describe the differences to the Kanto guide. + +7. Add the `development` Apertis repository and install `containerd` Debian package: + +```shell +sudo $SHELL +echo "deb https://repositories.apertis.org/apertis/ v2023 development" >> /etc/apt/sources.list.d/apertis-development.list +apt update +apt-get install -y curl ca-certificates containerd +``` + +8. Install Kanto + +```shell +# Still in sudo shell +curl -fsSL -o kanto.deb https://github.com/eclipse-kanto/kanto/releases/download/v0.1.0-M2/kanto_0.1.0-M2_linux_x86_64.deb +apt -o Dpkg::Options::="--force-overwrite" install ./kanto.deb +``` + +9. Verify Kanto Container Management is running: + +```shell +systemctl status container-management +sudo kanto-cm list +``` + +10. Edit the network configuration file `/etc/connman/main.conf` + Add `veth` to the following line: + +```shell +echo "NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,veth" >> /etc/connman/main.conf +systemctl restart connman +``` + +``` +# Before +# NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb- + +# After +NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,veth +``` + +11. Configure IP Rules to allow network traffic in `/etc/iptables/rules.v4` + > Note: Add these lines before the `REJECT` statements. +``` +-A INPUT -i kanto-cm0 -j ACCEPT +-A FORWARD -i kanto-cm0 -j ACCEPT +-A FORWARD -o kanto-cm0 -j ACCEPT +``` + +12. Add the cgroup for systemd by creating a new file `/usr/lib/systemd/user/cgroup-systemd.service` + +``` +[Unit] +Description=Create cgroup mount for systemd +DefaultDependencies=no +#Before=sysinit.target +#After=local-fs.target + +[Service] +Type=oneshot +ExecStartPre=/usr/bin/mkdir /sys/fs/cgroup/systemd +ExecStart=/usr/bin/mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd + +[Install] +WantedBy=sysinit.target +``` + +13. Install the Eclipse Leda SDV core containers + +> Note: Leda is using a newer version of Kanto Container Management and kanto-auto-deployer to deploy containers using descriptor files. + This feature is not yet available on Apertis v2023, hence the containers will be created manually. + +14. Install Kuksa Databroker + +```shell +sudo kanto-cm create --name databroker \ + --ports=30555:55555/tcp \ + ghcr.io/eclipse/kuksa.val/databroker:0.3.0 + +sudo kanto-cm start --name databroker + +# Verify the container is up and running: +sudo kanto-cm list +``` + +15. Install Vehicle Update Manager from Leda Incubator + +```shell +sudo kanto-cm create --name vum \ + --e=SELF_UPDATE_TIMEOUT=30m \ + --e=SELF_UPDATE_ENABLE_REBOOT=true \ + --e=THINGS_CONN_BROKER=tcp://mosquitto:1883 \ + --e=THINGS_FEATURES=ContainerOrchestrator \ + --mp="/proc:/proc:shared" \ + --hosts="mosquitto:host_ip" \ + ghcr.io/eclipse-leda/leda-contrib-vehicle-update-manager/vehicleupdatemanager:main-1d8dca55a755c4b3c7bc06eabfa06ad49e068a48 + +sudo kanto-cm start --name vum +``` + +16. Install Self Update Agent from Leda Incubator + +```shell +sudo mkdir -p /data/selfupdates + +sudo kanto-cm create --name sua \ + --mp="/var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:shared" \ + --mp="/data/selfupdates:/RaucUpdate:rprivate" \ + --mp="/etc/os-release:/etc/os-release:rprivate" \ + --ports=30052:50052/tcp \ + --hosts="mosquitto:host_ip" \ + ghcr.io/eclipse-leda/leda-contrib-self-update-agent/self-update-agent:build-66 + +sudo kanto-cm start --name sua +``` + +17. Install the Cloud Connector from Leda Incubator + +```shell +sudo mkdir -p /data/var/certificates + +# Replace with your device certificates +sudo touch /data/var/certificates/device.crt +sudo touch /data/var/certificates/device.key + +sudo kanto-cm create --name cloudconnector \ + --mp="/data/var/certificates/device.crt:/device.crt" \ + --mp="/data/var/certificates/device.key:/device.key" \ + --e=CERT_FILE=/device.crt \ + --e=KEY_FILE=/device.key \ + --e=LOCAL_ADDRESS=tcp://mosquitto:1883 \ + --e="LOG_FILE=" \ + --e=LOG_LEVEL=INFO \ + --e=CA_CERT_PATH=/app/iothub.crt \ + --e=MESSAGE_MAPPER_CONFIG=/app/message-mapper-config.json \ + --e=ALLOWED_LOCAL_TOPICS_LIST=cloudConnector/# \ + ghcr.io/eclipse-leda/leda-contrib-cloud-connector/cloudconnector:main-47c01227a620a3dbd85b66e177205c06c0f7a52e + +sudo kanto-cm start --name cloudconnector +``` + +18. Install examples: Seat Service + +```shell +sudo kanto-cm create --name seatservice \ + --e=BROKER_ADDR=databroker-host:30555 \ + --e=RUST_LOG=info \ + --e=vehicle_data_broker=info \ + --ports="30051:50051/tcp" \ + --hosts="databroker-host:host_ip" \ + ghcr.io/boschglobal/kuksa.val.services/seat_service:v0.3.0 + +sudo kanto-cm start --name seatservice +``` + +19. Install example: Kuksa DBC Feeder + +```shell +sudo kanto-cm create --name feedercan \ + --e=VEHICLEDATABROKER_DAPR_APP_ID=databroker \ + --e=VDB_ADDRESS=databroker-host:30555 \ + --e=USECASE=databroker \ + --e=LOG_LEVEL=info \ + --e=databroker=info \ + --e=broker_client=info \ + --e=dbcfeeder=info \ + --hosts="databroker-host:host_ip" \ + ghcr.io/eclipse/kuksa.val.feeders/dbc2val:v0.1.1 + +sudo kanto-cm start --name feedercan +``` + +20. Install example: Kuksa HVAC Example + +```shell +sudo kanto-cm create --name hvac \ + --e=VEHICLEDATABROKER_DAPR_APP_ID=databroker \ + --e=VDB_ADDRESS=databroker-host:30555 \ + --hosts="databroker-host:host_ip" \ + ghcr.io/eclipse/kuksa.val.services/hvac_service:v0.1.0 + +sudo kanto-cm start --name hvac +``` diff --git a/resources/apertis/build-docker.sh b/resources/apertis/build-docker.sh new file mode 100755 index 0000000..cbcb81a --- /dev/null +++ b/resources/apertis/build-docker.sh @@ -0,0 +1,27 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Build and Run the Leda SDV Core components stack on Apertis IoT (QEMU X86) +# +#set -e + +if ! command -v docker &> /dev/null +then + echo "Error: Docker could not be found, please install Docker." + exit 1 +fi + +# Set the build context to "../.." to allow to access the Yocto build workspace +# for copying the ovmf.qcow2 file +docker build --tag ghcr.io/eclipse-leda/leda-distro/leda-apertis-x86 --file Dockerfile.apertis ../.. diff --git a/resources/apertis/dockerfiles/leda-apertis-bootstrapper.sh b/resources/apertis/dockerfiles/leda-apertis-bootstrapper.sh new file mode 100644 index 0000000..97055b9 --- /dev/null +++ b/resources/apertis/dockerfiles/leda-apertis-bootstrapper.sh @@ -0,0 +1,42 @@ +#!/bin/sh +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Install SDV Components on Apertis +# +#set -e + +# Wait for Apertis to boot and SSH to come up + +mkdir -p ~/.ssh/ +until ssh-keyscan -t ecdsa -p 2222 -H localhost >> ~/.ssh/known_hosts 2> /dev/null +do + echo "Bootstrapper: Apertis not up yet (SSH), trying again..." + sleep 1 +done + +echo "Bootstrapper: SSH Keyscan successfull" + +echo "Bootstrapper: Generating SSH Keys" +ssh-keygen -t rsa -b 2048 -N '' -f /root/.ssh/id_rsa + +echo "Bootstrapper: Installing SSH Keys" +sshpass -p user ssh-copy-id -i /root/.ssh/id_rsa.pub -o StrictHostKeyChecking=no -p 2222 user@localhost + +echo "Bootstrapper: Checking remote Apertis version" +ssh -o StrictHostKeyChecking=no -o ConnectionAttempts=30 -p 2222 user@localhost "cat /etc/os-release" + +echo "Bootstrapper: Executing SDV Installer script (sudo)" +ssh -o StrictHostKeyChecking=no -o ConnectionAttempts=30 -p 2222 user@localhost "sudo -n -s \$SHELL" < /docker/leda-apertis-install-sdv.sh + +echo "Bootstrapper: Done, exiting." diff --git a/resources/apertis/dockerfiles/leda-apertis-docker-entrypoint-x86.sh b/resources/apertis/dockerfiles/leda-apertis-docker-entrypoint-x86.sh new file mode 100755 index 0000000..ba1afc9 --- /dev/null +++ b/resources/apertis/dockerfiles/leda-apertis-docker-entrypoint-x86.sh @@ -0,0 +1,148 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Run qemu with TAP network +# +# set -x + +DISK_IMAGE_FILE="apertis.qcow2" + +echo "Entry: Setup..." + +USERID="-u $(id -u)" +GROUP="-g $(id -g)" +TUNCTL="sudo tunctl" +IFCONFIG="sudo ip" +IPTABLES="sudo iptables" +TAP= + +function setupTap() { + TAP=`$TUNCTL -b $GROUP 2>&1` + n=1 + $IFCONFIG addr add 192.168.7.$n/32 broadcast 192.168.7.255 dev $TAP + $IFCONFIG link set dev $TAP up + dest=2 + $IFCONFIG route add to 192.168.7.$dest dev $TAP + $IPTABLES -A POSTROUTING -t nat -j MASQUERADE -s 192.168.7.1/32 + $IPTABLES -A POSTROUTING -t nat -j MASQUERADE -s 192.168.7.2/32 + sudo bash -c "echo 1 > /proc/sys/net/ipv4/ip_forward" + sudo bash -c "echo 1 > /proc/sys/net/ipv4/conf/$TAP/proxy_arp" + $IPTABLES -P FORWARD ACCEPT + echo "Entry: Set up TAP network interface: $TAP" +} + +function teardownTap() { + echo "Entry: Tearing down TAP network interface: $TAP" + $TUNCTL -d $TAP + $IFCONFIG link del $TAP + $IPTABLES -D POSTROUTING -t nat -j MASQUERADE -s 192.168.7.1/32 + $IPTABLES -D POSTROUTING -t nat -j MASQUERADE -s 192.168.7.2/32 +} + +startQemuUnprivileged() { + echo "Entry: Starting QEMU in unprivileged mode" + + qemu-system-x86_64 \ + -net nic,model=virtio \ + -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::1880-:1880,hostfwd=tcp::1883-:1883,hostfwd=tcp::8888-:8888,hostfwd=tcp::30555-:30555 \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -device virtio-rng-pci,rng=rng0 \ + -drive id=hd,file=${DISK_IMAGE_FILE},if=virtio,format=qcow2 \ + -serial mon:stdio \ + -serial null \ + -serial mon:vc \ + -nographic \ + -object can-bus,id=canbus0 \ + -device kvaser_pci,canbus=canbus0 \ + -drive if=pflash,format=qcow2,file=ovmf.qcow2 \ + -cpu IvyBridge \ + -machine q35 \ + -smp 4 \ + -m 2G +} + +startQemuPrivileged() { + echo "Entry: Starting QEMU in privileged mode" + + trap teardownTap EXIT + + setupTap + + # Forward network traffic for SSH to the QEMU Guest + iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.7.2:22 + + # Forward network traffic for SSH to the QEMU Guest + # eth0 -> docker-internal network (172.x.x.x) + iptables -t nat -A PREROUTING -j DNAT -i eth0 -p tcp --to-destination 192.168.7.2 + # eth1 -> leda-network (192.168.8.x) + iptables -t nat -A PREROUTING -j DNAT -i eth1 -p tcp --to-destination 192.168.7.2 + + # Masquerade the IP Address of the sender, so that the packet will go back to the gateway + iptables -t nat -A POSTROUTING -j MASQUERADE + + # Run the DHCP server + mkdir -p /var/lib/dhcp/ + touch /var/lib/dhcp/dhcpd.leases + /usr/sbin/dhcpd + sudo /usr/sbin/dnsmasq + + printf -v macaddr "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) + + echo "Entry: Randomized MAC Address: ${macaddr}" + + sudo qemu-system-x86_64 \ + -device virtio-net-pci,netdev=net0,mac=$macaddr \ + -netdev tap,id=net0,ifname=$TAP,script=no,downscript=no \ + -object rng-random,filename=/dev/urandom,id=rng0 \ + -device virtio-rng-pci,rng=rng0 \ + -drive id=hd,file=${DISK_IMAGE_FILE},if=virtio,format=qcow2 \ + -boot order=d,strict=on,menu=on \ + -serial mon:stdio \ + -serial null \ + -serial mon:vc \ + -nographic \ + -object can-bus,id=canbus0 \ + -device kvaser_pci,canbus=canbus0 \ + -drive if=pflash,readonly=on,format=qcow2,file=ovmf.code.qcow2 \ + -drive if=pflash,format=qcow2,file=ovmf.vars.qcow2 \ + -cpu IvyBridge \ + -machine q35 \ + -smp 4 \ + -m 2G +} + +PRIVILEGED=1 + +if [ $(id -u) != 0 ]; then + echo "We're not uid 0, falling back to unprivileged mode." + PRIVILEGED=0 +fi + +if [ ! -w /proc/sys/net/ipv4/ip_forward ]; then + echo "/proc/sys/net/ipv4/ip_forward is not writable for us, falling back to unprivileged mode." + PRIVILEGED=0 +fi + +echo "Entry: Checking QEMU Version..." +qemu-system-x86_64 -version + +echo "Entry: Starting SDV Installer in background..." +/docker/leda-apertis-bootstrapper.sh & + +echo "Entry: Starting QEMU with Apertis image..." +if [ "$PRIVILEGED" == 0 ]; then + startQemuUnprivileged +else + startQemuPrivileged +fi \ No newline at end of file diff --git a/resources/apertis/dockerfiles/leda-apertis-install-sdv.sh b/resources/apertis/dockerfiles/leda-apertis-install-sdv.sh new file mode 100644 index 0000000..4021200 --- /dev/null +++ b/resources/apertis/dockerfiles/leda-apertis-install-sdv.sh @@ -0,0 +1,156 @@ +#!/bin/sh +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Install SDV Components on Apertis +# +#set -e + +if dpkg -l kanto; then + echo "SDV Installer: Kanto already installed, assuming SDV core components have been installed as well. Exiting." + exit 0 +fi + +# Add the `development` Apertis repository and install `containerd` Debian package +echo "deb https://repositories.apertis.org/apertis/ v2023 development" >> /etc/apt/sources.list.d/apertis-development.list +apt update +apt-get install -y curl ca-certificates git mosquitto-clients jq containerd protobuf-compiler + +# Install Kanto +curl -fsSL -o kanto.deb https://github.com/eclipse-kanto/kanto/releases/download/v0.1.0-M2/kanto_0.1.0-M2_linux_x86_64.deb +apt -o Dpkg::Options::="--force-overwrite" install ./kanto.deb + +# Blacklist Kanto network interfaces from Connection Manager +# so that virtual ethernet interfaces are not used for default routes +echo "NetworkInterfaceBlacklist = vmnet,vboxnet,virbr,ifb,ve-,vb-,veth" >> /etc/connman/main.conf +systemctl restart connman + +# For building kantui and kanto-auto-deployer, we need Rust +echo "Installing Rust" +curl https://sh.rustup.rs -sSf | sh +source "$HOME/.cargo/env" + +echo "Building kantui" +git clone https://github.com/eclipse-leda/leda-utils.git +pushd leda-utils/src/rust/kanto-tui +sudo apt-get install -y gcc +git submodule update +cargo build --release +strip ./target/release/kantui +mkdir -p /etc/kantui/ +cp ./kantui_conf.toml /etc/kantui/kantui_conf.toml +cp ./target/release/kantui /usr/bin + +popd + +until systemctl is-active container-management +do + echo "SDV Installer: Kanto Container Management not up yet, trying again..." + sleep 1 +done + +until [ -S /run/container-management/container-management.sock ] +do + echo "SDV Installer: Kanto Container Management not yet listening on unix domain socket, trying again..." + sleep 1 +done + +# Kuksa Databroker +echo "SDV Installer: Kuksa Databroker" +kanto-cm create --name databroker \ + --ports=30555:55555/tcp \ + ghcr.io/eclipse/kuksa.val/databroker:0.3.0 +kanto-cm start --name databroker + +# Leda Incubator: Vehicle Update Manager +echo "SDV Installer: Vehicle Update Manager" +kanto-cm create --name vum \ + --e=SELF_UPDATE_TIMEOUT=30m \ + --e=SELF_UPDATE_ENABLE_REBOOT=true \ + --e=THINGS_CONN_BROKER=tcp://mosquitto:1883 \ + --e=THINGS_FEATURES=ContainerOrchestrator \ + --mp="/proc:/proc:shared" \ + --hosts="mosquitto:host_ip" \ + ghcr.io/eclipse-leda/leda-contrib-vehicle-update-manager/vehicleupdatemanager:main-1d8dca55a755c4b3c7bc06eabfa06ad49e068a48 +kanto-cm start --name vum + +# Leda Incubator: Self Update Agent +echo "SDV Installer: Self Update Agent" +sudo mkdir -p /data/selfupdates +sudo kanto-cm create --name sua \ + --mp="/var/run/dbus/system_bus_socket:/var/run/dbus/system_bus_socket:shared" \ + --mp="/data/selfupdates:/RaucUpdate:rprivate" \ + --mp="/etc/os-release:/etc/os-release:rprivate" \ + --ports=30052:50052/tcp \ + --hosts="mosquitto:host_ip" \ + ghcr.io/eclipse-leda/leda-contrib-self-update-agent/self-update-agent:build-66 +sudo kanto-cm start --name sua + +# Leda Incubator: Cloud Connector +echo "SDV Installer: Cloud Connector (unconfigured)" +mkdir -p /data/var/certificates +# Replace with your device certificates +touch /data/var/certificates/device.crt +touch /data/var/certificates/device.key +kanto-cm create --name cloudconnector \ + --mp="/data/var/certificates/device.crt:/device.crt" \ + --mp="/data/var/certificates/device.key:/device.key" \ + --e=CERT_FILE=/device.crt \ + --e=KEY_FILE=/device.key \ + --e=LOCAL_ADDRESS=tcp://mosquitto:1883 \ + --e="LOG_FILE=" \ + --e=LOG_LEVEL=INFO \ + --e=CA_CERT_PATH=/app/iothub.crt \ + --e=MESSAGE_MAPPER_CONFIG=/app/message-mapper-config.json \ + --e=ALLOWED_LOCAL_TOPICS_LIST=cloudConnector/# \ + ghcr.io/eclipse-leda/leda-contrib-cloud-connector/cloudconnector:main-47c01227a620a3dbd85b66e177205c06c0f7a52e +kanto-cm start --name cloudconnector + +# Examples: Seat Service +echo "SDV Installer: Kuksa.VAL Seat Service Example" +kanto-cm create --name seatservice \ + --e=BROKER_ADDR=databroker-host:30555 \ + --e=RUST_LOG=info \ + --e=vehicle_data_broker=info \ + --ports="30051:50051/tcp" \ + --hosts="databroker-host:host_ip" \ + ghcr.io/boschglobal/kuksa.val.services/seat_service:v0.3.0 +kanto-cm start --name seatservice + +# Example: Kuksa DBC Feeder +echo "SDV Installer: Kuksa.VAL DBC CAN Feeder Example" +kanto-cm create --name feedercan \ + --e=VEHICLEDATABROKER_DAPR_APP_ID=databroker \ + --e=VDB_ADDRESS=databroker-host:30555 \ + --e=USECASE=databroker \ + --e=LOG_LEVEL=info \ + --e=databroker=info \ + --e=broker_client=info \ + --e=dbcfeeder=info \ + --hosts="databroker-host:host_ip" \ + ghcr.io/eclipse/kuksa.val.feeders/dbc2val:v0.1.1 +kanto-cm start --name feedercan + +# Example: Kuksa HVAC Example +echo "SDV Installer: Kuksa.VAL HVAC Example" +kanto-cm create --name hvac \ + --e=VEHICLEDATABROKER_DAPR_APP_ID=databroker \ + --e=VDB_ADDRESS=databroker-host:30555 \ + --hosts="databroker-host:host_ip" \ + ghcr.io/eclipse/kuksa.val.services/hvac_service:v0.1.0 +kanto-cm start --name hvac + +echo "SDV Installer done." +echo "" +echo "You may now login to Apertis as 'user' with password 'user'" +echo "" diff --git a/resources/apertis/publish-docker.sh b/resources/apertis/publish-docker.sh new file mode 100755 index 0000000..caf4e50 --- /dev/null +++ b/resources/apertis/publish-docker.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Publish Leda on Apertis on QEMU on Docker container image to container registry on ghcr.io +# +#set -e + +if ! command -v docker &> /dev/null +then + echo "Docker could not be found, please install Docker." + exit +fi + +docker push ghcr.io/eclipse-leda/leda-distro/leda-apertis-x86 diff --git a/resources/apertis/run-docker.sh b/resources/apertis/run-docker.sh new file mode 100755 index 0000000..9dec945 --- /dev/null +++ b/resources/apertis/run-docker.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# +# Build and Run Leda on X86 and ARM64 in Docker Containers +# +#set -e + +if ! command -v docker &> /dev/null +then + echo "Docker could not be found, please install Docker." + exit +fi + +docker rm --force leda-apertis-x86 +docker run --name leda-apertis-x86 --tty --interactive ghcr.io/eclipse-leda/leda-distro/leda-apertis-x86 + +# docker run --tty --interactive --entrypoint /bin/bash leda-apertis-x86 +# docker exec --tty --interactive leda-apertis-x86 /bin/bash +# docker push ghcr.io/eclipse-leda/leda-distro/leda-apertis-x86 \ No newline at end of file diff --git a/resources/debian/Dockerfile.debian b/resources/debian/Dockerfile.debian new file mode 100644 index 0000000..afb297d --- /dev/null +++ b/resources/debian/Dockerfile.debian @@ -0,0 +1,74 @@ +# syntax=docker/dockerfile:1 +# +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ +# + +ARG BASE_IMAGE=debian:bullseye +FROM ${BASE_IMAGE} AS build + +ARG DEBIAN_FRONTEND=noninteractive +ARG TZ=Etc/UTC + +COPY public.key.gpg /etc/apt/trusted.gpg.d/ + +RUN apt-get update +RUN apt-get install -y wget ca-certificates openssh-server rauc mosquitto mosquitto-clients + +RUN wget https://github.com/eclipse-kanto/kanto/releases/download/v0.1.0-M2/kanto_0.1.0-M2_linux_x86_64.deb && \ + apt-get install -y ./kanto_0.1.0-M2_linux_x86_64.deb +RUN apt show kanto + +RUN wget https://github.com/eclipse-leda/leda-utils/releases/download/v0.0.1/eclipse-leda-kanto-auto-deployer_0.0.1.0.7019_amd64.deb && \ + apt-get install -y ./eclipse-leda-kanto-auto-deployer_0.0.1.0.7019_amd64.deb +RUN apt show eclipse-leda-kanto-auto-deployer + +RUN wget https://github.com/eclipse-leda/leda-utils/releases/download/v0.0.1/eclipse-leda-kantui_0.0.1.0.7019_amd64.deb && \ + apt-get install -y ./eclipse-leda-kantui_0.0.1.0.7019_amd64.deb +RUN apt show eclipse-leda-kantui + +COPY ./repo-root /repo-root + +RUN echo "deb file:/repo-root dracon main" > /etc/apt/sources.list.d/sdv.list +RUN apt-get update + +RUN apt-get install -y leda-utils +RUN apt-get install -y sdv-container-cloudconnector +RUN apt-get install -y sdv-container-feedercan +RUN apt-get install -y sdv-container-hvacservice +RUN apt-get install -y sdv-container-seatservice +RUN apt-get install -y sdv-container-selfupdateagent +RUN apt-get install -y sdv-container-vehicleupdatemanager +RUN apt-get install -y sdv-kuksa-val-databroker +RUN apt-get install -y sdv-core-containers +RUN apt-get install -y sdv-example-containers + +RUN dpkg -L sdv-container-cloudconnector +RUN dpkg -L sdv-core-containers + +RUN wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz +RUN mkdir -p /usr/lib/cni +RUN tar Cxzvf /usr/lib/cni cni-plugins-linux-amd64-v1.1.1.tgz + +# These fail due to libc (and more) dependency conflicts. +# RUN apt-get install -y kantui +# RUN apt-get install -y databroker-cli +# RUN apt-get install -y container-management +# RUN apt-get install -y kanto-auto-deployer + +# For container: Self Update Agent needs DBUS +COPY dockerfiles/dbus-config.conf ./ +RUN apt-get install -y dbus + +COPY dockerfiles/leda-debian-test.sh ./ +CMD [ "./leda-debian-test.sh" ] diff --git a/resources/debian/README.txt b/resources/debian/README.txt new file mode 100644 index 0000000..aba4297 --- /dev/null +++ b/resources/debian/README.txt @@ -0,0 +1,36 @@ +Eclipse Leda - Debian packages + +Building Debian packages using BitBake to make packages installable on vanilla Debian distros (non-Poky based). + +1. Building the packages + + Add to kas configuration: + PACKAGE_CLASSES += " package_deb" + + Run a build + kas build kas/leda-qemux86-64.yaml + +2. Test the local repository + + Run install-local-repo.sh, which will add the ./repo-root/ to the apt sources.list + Use apt search or apt install to install packages. + Note: This will install on your host! + +3. Create an Apt repository + + Setup gpg using generate-gpg-key.sh or reuse existing + Run the repo-create.sh + + Ensure ${PROJET_ROOT}/azure-debian/ is mounted, or adapt upload-repo.sh + Run the script to upload the Apt repository to a remote webserver. + +4. Test with Docker + + Run the build-docker.sh which will build container images with predefined Apt remote repository. + The build will fail if it cannot install any of the SDV Core components. + + Run the test-docker.sh to build for multiple target OS distros and run a small test script. + The test script runs Mosquitto, DBUS, containerd and container-management and will then create + the SDV core containers. + + No functional testing is being done in this stage. diff --git a/resources/debian/build-docker.sh b/resources/debian/build-docker.sh new file mode 100755 index 0000000..6ec57c3 --- /dev/null +++ b/resources/debian/build-docker.sh @@ -0,0 +1,15 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ + +docker build --build-arg BASE_IMAGE=debian:bookworm --tag leda-debian -f Dockerfile.debian . diff --git a/resources/debian/dockerfiles/dbus-config.conf b/resources/debian/dockerfiles/dbus-config.conf new file mode 100644 index 0000000..f8b1c57 --- /dev/null +++ b/resources/debian/dockerfiles/dbus-config.conf @@ -0,0 +1,31 @@ + + + + + + + unix:path=/var/run/dbus/system_bus_socket + + + + + + + + + \ No newline at end of file diff --git a/resources/debian/dockerfiles/leda-debian-test.sh b/resources/debian/dockerfiles/leda-debian-test.sh new file mode 100755 index 0000000..0c62fb8 --- /dev/null +++ b/resources/debian/dockerfiles/leda-debian-test.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ + +function check() { + command -v $1 >/dev/null && return 0 + type -P $1 >/dev/null&& return 0 + [ -f /usr/bin/$1 ] && return 0 + echo "ERROR: $1 missing" + exit 1 +} + +echo "Eclipse Leda - Debian Package Installation Tester" + +echo "- Checking packages, binaries and tools" +check containerd +check container-management +check sdv-help +check sdv-health +check sdv-provision +check sdv-kanto-ctl +check sdv-ctr-exec +check kantui +check kanto-auto-deployer + +echo "- Starting containerd and container-management" +mosquitto & +sleep 1 +mkdir /var/lib/containerd +mount -t tmpfs none /var/lib/containerd +containerd config default | sed 's/snapshotter = "overlayfs"/snapshotter = "native"/g' | tee /etc/containerd/config.toml +containerd & +sleep 1 +container-management --cfg-file=/etc/container-management/config.json & +sleep 1 +kanto-cm sysinfo + +# Prepare container: cloud-connector +mkdir -p /data/var/certificates/ +touch /data/var/certificates/device.crt +touch /data/var/certificates/device.key +touch /data/var/certificates/ca.key + +# Prepare container: Fake folders and DBUS +mkdir -p /data/selfupdates +mkdir -p /var/run/dbus/ +dbus-daemon --config-file=dbus-config.conf --print-address & + +kanto-auto-deployer /var/containers/manifests/ || exit 1 +kanto-cm list +echo "All checks succeeded." diff --git a/resources/debian/fix-version.sh b/resources/debian/fix-version.sh new file mode 100755 index 0000000..aac4d96 --- /dev/null +++ b/resources/debian/fix-version.sh @@ -0,0 +1,25 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ + +TARGET="$1" + +if ! dpkg-deb --field ${TARGET} Version; then + echo "Trying to fix version number for ${TARGET}" + TMPDIR=$(mktemp --directory --tmpdir) + echo ${TMPDIR} + dpkg-deb -R ${TARGET} ${TMPDIR} + VERSION="0.0.1" + sed -i -e "s,^Version: .*,Version: $VERSION," ${TMPDIR}/DEBIAN/control + dpkg-deb -b ${TMPDIR} ${TARGET} +fi diff --git a/resources/debian/generate-gpg-key.sh b/resources/debian/generate-gpg-key.sh new file mode 100755 index 0000000..7b729ad --- /dev/null +++ b/resources/debian/generate-gpg-key.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +if [ ! -f gpg-unattended.conf ]; then + echo "Creating GPG Key - and forcing GPG to use SHA256" + echo "digest-algo sha256" >> ~/.gnupg/gpg.conf +cat >gpg-unattended.conf < /etc/apt/sources.list.d/sdv.list" +gpg --output public.key.gpg --export leda-dev@eclipse.org +# gpg --output private.pgp --armor --export-secret-key leda-dev@eclipse.org +# gpg --output public.pgp --armor --export leda-dev@eclipse.org +sudo cp public.key.gpg /etc/apt/trusted.gpg.d/ +sudo apt update +apt search leda \ No newline at end of file diff --git a/resources/debian/install-remote-repo.sh b/resources/debian/install-remote-repo.sh new file mode 100755 index 0000000..d16c96f --- /dev/null +++ b/resources/debian/install-remote-repo.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ + +sudo bash -c "echo \"deb https://sdvyocto.blob.core.windows.net/debian dracon main\" > /etc/apt/sources.list.d/sdv.list" +gpg --output public.key.gpg --export leda-dev@eclipse.org +# gpg --output private.pgp --armor --export-secret-key leda-dev@eclipse.org +# gpg --output public.pgp --armor --export leda-dev@eclipse.org +sudo cp public.key.gpg /etc/apt/trusted.gpg.d/ +sudo apt update +apt search leda \ No newline at end of file diff --git a/resources/debian/packagelist b/resources/debian/packagelist new file mode 100644 index 0000000..40ab587 --- /dev/null +++ b/resources/debian/packagelist @@ -0,0 +1,21 @@ +../../build/tmp/deploy/deb/all/packagegroup-sdv-additions_1.0-r0_all.deb +../../build/tmp/deploy/deb/all/packagegroup-sdv-airgap-containers_1.0-r0_all.deb +../../build/tmp/deploy/deb/all/packagegroup-sdv-core_1.0-r0_all.deb +../../build/tmp/deploy/deb/all/packagegroup-sdv-examples_1.0-r0_all.deb +../../build/tmp/deploy/deb/all/packagegroup-sdv-tools_1.0-r0_all.deb +../../build/tmp/deploy/deb/core2-64/container-management_0.1.0-git0+65e00358fa-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/databroker-cli_0.17.0.0+861b2ec674-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/kanto-auto-deployer_git.0+15ff12d9a7-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/kantui_git.0+5bcbef1054-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/kibi_0.2.2.0+2cc6bead72-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/leda-ota-client_git-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/leda-utils_git-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-cloudconnector_git-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-feedercan_0.1-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-hvacservice_0.1-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-seatservice_0.3-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-selfupdateagent_0.66-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-container-vehicleupdatemanager_git-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-kuksa-val-databroker_0.3-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-core-containers_1.0-r0_amd64.deb +../../build/tmp/deploy/deb/core2-64/sdv-example-containers_1.0-r0_amd64.deb diff --git a/resources/debian/public.key.gpg b/resources/debian/public.key.gpg new file mode 100644 index 0000000..5b6c366 Binary files /dev/null and b/resources/debian/public.key.gpg differ diff --git a/resources/debian/public.pgp b/resources/debian/public.pgp new file mode 100644 index 0000000..3d6f4c5 --- /dev/null +++ b/resources/debian/public.pgp @@ -0,0 +1,149 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +1yrYMw== +=mHhM +-----END PGP PUBLIC KEY BLOCK----- diff --git a/resources/debian/repo-create.sh b/resources/debian/repo-create.sh new file mode 100755 index 0000000..eb25934 --- /dev/null +++ b/resources/debian/repo-create.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# /******************************************************************************** +# * Copyright (c) 2023 Contributors to the Eclipse Foundation +# * +# * See the NOTICE file(s) distributed with this work for additional +# * information regarding copyright ownership. +# * +# * This program and the accompanying materials are made available under the +# * terms of the Apache License 2.0 which is available at +# * https://www.apache.org/licenses/LICENSE-2.0 +# * +# * SPDX-License-Identifier: Apache-2.0 +# ********************************************************************************/ + +# sudo apt install -y reprepro +# sudo apt install -y devscripts + +# Todo: Get this from the latest package automatically +OS_RELEASE="dracon" +BASE_DIR="repo-root" + +KEY_ID=`gpg --list-secret-key --with-subkey-fingerprint | tail -2 | xargs` + +echo "GPG Key ID is: ${KEY_ID}" + +# Create folder suppoed to be Apache httpd Document Root +# rm -rf ${BASE_DIR} + +mkdir -p ${BASE_DIR}/conf + +cat > ${BASE_DIR}/conf/distributions < ${BASE_DIR}/conf/options < ${BASE_DIR}/sdv.list <