diff --git a/Artian-Apps/.github/ISSUE_TEMPLATE/app-submission.yml b/Artian-Apps/.github/ISSUE_TEMPLATE/app-submission.yml new file mode 100644 index 0000000..4e5e119 --- /dev/null +++ b/Artian-Apps/.github/ISSUE_TEMPLATE/app-submission.yml @@ -0,0 +1,51 @@ +name: App Submission +title: EDIT ME Include the app name and if it is a Package app or an Install based App +description: Submit/Upload an app to be added Pi-Apps. For apps with a completed ZIP, install files, deb, or PR ONLY. +labels: ["App Request","Zip/PR included"] +body: + - type: input + id: app-name + attributes: + label: What is the name of the app? + placeholder: Ex - Zoom, AndroidBuddy + validations: + required: true + + - type: textarea + id: host + attributes: + label: (Optional) Where is the app hosted? + placeholder: Ex - Github link, Gitlab link, Sourceforge link + validations: + required: false + + - type: textarea + id: about + attributes: + label: About the app + description: What is its main purpose? How does it work? + placeholder: Tell us about the app here! + validations: + required: true + + - type: textarea + id: zip + attributes: + label: Upload file or Add PR Link + description: "Upload your deb of the app, or a zip file for this app, or link an already opened PR or github repo/branch for your app, or if you have any other relevant files, upload or link them here." + placeholder: "Tips: You can upload files here by clicking to expand the regular text-box" + validations: + required: true + + - type: checkboxes + id: confirmations + attributes: + label: Confirmations + description: All of the following MUST be met. If you can NOT check one of these boxes. Then do NOT create a GitHub Issue. We will close it. The checkboxes are made a requirement on purpose. + options: + - label: I have confirmed that this app is legal and not piracy. + required: true + - label: I have confirmed that this app has never been discussed in https://github.com/Botspot/pi-apps/issues and https://github.com/Botspot/pi-apps/pulls, and it is not in the Pi-Apps app list. + required: true + - label: I have confirmed that this app can run on Raspberry Pi. + required: true diff --git a/Artian-Apps/.github/ISSUE_TEMPLATE/app-suggestion.yml b/Artian-Apps/.github/ISSUE_TEMPLATE/app-suggestion.yml new file mode 100644 index 0000000..acbc88e --- /dev/null +++ b/Artian-Apps/.github/ISSUE_TEMPLATE/app-suggestion.yml @@ -0,0 +1,44 @@ +name: App suggestion +title: EDIT ME Include the app name +description: Suggest an app to be added Pi-Apps. pi-apps developers may choose to assist in adding your app suggestion. +labels: App Request +body: + - type: input + id: app-name + attributes: + label: What is the name of the app? + placeholder: Ex - Zoom, AndroidBuddy + validations: + required: true + + - type: textarea + id: host + attributes: + label: (Optional) Where is the app hosted? + placeholder: Ex - Github link, Gitlab link, Sourceforge link + validations: + required: false + + - type: textarea + id: about + attributes: + label: About the app + description: What is its main purpose? How does it work? + placeholder: Tell us about the app here! + validations: + required: true + + - type: checkboxes + id: confirmations + attributes: + label: Confirmations + description: All of the following MUST be met. If you can NOT check one of these boxes. Then do NOT create a GitHub Issue. We will close it. The checkboxes are made a requirement on purpose. + options: + - label: I have confirmed that this app is legal and not piracy. + required: true + - label: I have read the app eligibilty rubric https://github.com/Botspot/pi-apps/issues/185 and confirmed this app is suitable for addition in Pi-Apps. + required: true + - label: I have confirmed that this app has never been discussed in https://github.com/Botspot/pi-apps/issues and https://github.com/Botspot/pi-apps/pulls, and it is not in the Pi-Apps app list. + required: true + - label: I have confirmed that this app can run on Raspberry Pi. + required: true diff --git a/Artian-Apps/.github/ISSUE_TEMPLATE/bug-report.yml b/Artian-Apps/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000..cc680fd --- /dev/null +++ b/Artian-Apps/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,59 @@ +name: Bug Report +description: App failing to install? Is it still around after uninstalling? Let us know! +labels: ["bug"] +body: + - type: checkboxes + attributes: + label: Confirmations + options: + - label: I searched for similar bug reports in https://github.com/Botspot/pi-apps/issues and found none were relevant. + required: true + - label: I tried updating Pi-Apps and the issue is still not fixed. [How to update Pi-Apps?](https://pi-apps.io/wiki/getting-started/updating-pi-apps/) + required: false + - label: 'IMPORTANT: I promise to respond to comments on this issue and write a good bug report https://www.softwaretestinghelp.com/how-to-write-good-bug-report/' + required: true + - type: input + id: desc + attributes: + label: What happened? + description: Briefly explain what happened. + placeholder: "Ex. 'App' won't install, 'App' unable to launch after update" + validations: + required: true + - type: textarea + id: desc-long + attributes: + label: Description + description: A clear and concise description of what the bug is and any personal attempts you made to fix it. + placeholder: Tell us more! + validations: + required: true + - type: textarea + id: os + attributes: + label: What are your system specs (run the following command in your terminal)? + description: ~/pi-apps/api get_device_info + placeholder: | + OS: Raspbian GNU/Linux 10 (buster) + OS architecture: 32-bit + Last updated Pi-Apps on: 11/04/2022 + Latest Pi-Apps version: 11/04/2022 + Kernel: armv7l 5.15.55-v7l+ + Device model: Raspberry Pi 4 Model B Rev 1.4 + Cpu name: Cortex-A72 + Ram size: 7.78 GB + Raspberry Pi OS image version: 2021-01-11 + Language: en_US.UTF-8 + render: bash + validations: + required: true + - type: textarea + id: log + attributes: + label: (Recommended) Error log? Terminal output? Debug messages? + description: Please provide error log or terminal output, if available. + placeholder: Paste your terminal output/error log here + render: bash + validations: + required: false + diff --git a/Artian-Apps/.github/ISSUE_TEMPLATE/suggestion.yml b/Artian-Apps/.github/ISSUE_TEMPLATE/suggestion.yml new file mode 100644 index 0000000..36c9eee --- /dev/null +++ b/Artian-Apps/.github/ISSUE_TEMPLATE/suggestion.yml @@ -0,0 +1,11 @@ +name: Suggestion +description: "Have an idea for Pi-Apps and it's not a bug or an app request?" +labels: suggestion +body: + - type: textarea + id: idea + attributes: + label: Cool ideas? + placeholder: Tell us about your idea here + validations: + required: true diff --git a/Artian-Apps/.github/workflows/check_PR.yml b/Artian-Apps/.github/workflows/check_PR.yml new file mode 100644 index 0000000..55a3963 --- /dev/null +++ b/Artian-Apps/.github/workflows/check_PR.yml @@ -0,0 +1,32 @@ +name: Check PR +on: + pull_request_target: + branches: + - master + +jobs: + check-pr: + # The type of runner that the job will run on + runs-on: ubuntu-latest + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.ref }} + # Runs a set of commands using the runners shell + - name: chmod all install/install-32/install-64/uninstall to 775 + run: | + cd $GITHUB_WORKSPACE + chmod 775 ./apps/*/install ./apps/*/install-32 ./apps/*/install-64 ./apps/*/uninstall + + + - name: Push changes to repo + uses: EndBug/add-and-commit@v9 # You can change this to use a specific version. + with: + default_author: github_actions + # The message for the commit. + # Default: 'Commit from GitHub Actions (name of the workflow)' + message: | + Correct file permissions for install and uninstall files \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/create_shlink_links.yml b/Artian-Apps/.github/workflows/create_shlink_links.yml new file mode 100644 index 0000000..9e6d8b9 --- /dev/null +++ b/Artian-Apps/.github/workflows/create_shlink_links.yml @@ -0,0 +1,69 @@ +name: Create_Shlink_Links + +on: + push: + branches: + - master + paths: + - 'apps/**' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +jobs: + create-links: + runs-on: ubuntu-latest + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + # Runs a set of commands using the runners shell + - name: Run a multi-line script + env: + SHLINK_KEY: ${{ secrets.SHLINK_KEY }} + run: | + # get all available URLs + online_shortcodes="$(curl -s -X 'GET' \ + 'https://pi-apps-analytics.linkpc.net/rest/v2/short-urls?itemsPerPage=0' \ + -H 'accept: application/json' \ + -H "X-Api-Key: $SHLINK_KEY" | jq -r '( .shortUrls | .data | .[] | .shortCode )')" + #create links + applist="$(ls $GITHUB_WORKSPACE/apps | grep .)" + # get local shortcodes + local_shortcodes="$(echo "$applist" | tr -d ' ' | sed 's/[^a-zA-Z0-9]//g' | awk '{print "pi-apps-install-"$0}')" + local_shortcodes+="$(echo ""; echo "$applist" | tr -d ' ' | sed 's/[^a-zA-Z0-9]//g' | awk '{print "pi-apps-uninstall-"$0}')" + local_shortcodes+="$(echo ""; echo "$applist" | tr -d ' ' | sed 's/[^a-zA-Z0-9]//g' | awk '{print "pi-apps-update-"$0}')" + + # add pi-apps function (this is all that is needed so don't source the whole api) + list_subtract() { #Outputs a list of apps from stdin, minus the ones that appear in $1 + # for example, the following two inputs will be a match + # Audacity + # Audacity + # while these two will NOT be a match + # Multimedia/Audacity + # .*/Audacity + comm -23 - <(echo "$1" | sort) + } + + # needed shortcodes + new_shortcodes="$(echo "$local_shortcodes" | sort | list_subtract "$online_shortcodes")" + IFS=$'\n' + for shortcode in $new_shortcodes ;do + echo "Creating missing shortcode: $shortcode" + curl -s -X 'POST' \ + 'https://pi-apps-analytics.linkpc.net/rest/v2/short-urls' \ + -H 'accept: application/json' \ + -H "X-Api-Key: $SHLINK_KEY" \ + -H 'Content-Type: application/json' \ + -d '{ + "longUrl": "https://github.com/Botspot/pi-apps", + "validateUrl": true, + "title": "You are not supposed to be here", + "crawlable": false, + "forwardQuery": true, + "customSlug": "'$shortcode'", + "findIfExists": true + }' + echo "" + done diff --git a/Artian-Apps/.github/workflows/pr-greeting.yml b/Artian-Apps/.github/workflows/pr-greeting.yml new file mode 100644 index 0000000..3875c76 --- /dev/null +++ b/Artian-Apps/.github/workflows/pr-greeting.yml @@ -0,0 +1,29 @@ +name: PR Greeting + +on: + pull_request: + types: opened + issues: + types: opened + +permissions: + issues: write + pull-requests: write + +jobs: + greeting: + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1.1.1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: | + Hello there 👋 + Thanks for submitting your first issue to the Pi-Apps project! We'll try to get back to you as soon as possible. + In the meantime, we encourage you join our [Discord server](https://discord.gg/RXSTvaUvuu), where you can ask any questions you might have. + + Please respond as soon as possible if a Pi-Apps maintainer requests more information from you. Stale issues will be closed after a lengthy period of time with no response. + pr-message: | + Hello there 👋 + Thanks for submitting your first pull request to the Pi-Apps project! We'll review your contributions soon. + In the meantime, we encourage you to read our [guide to creating an app](https://github.com/Botspot/pi-apps/wiki/Creating-an-app), and to join our [Discord server](https://discord.gg/RXSTvaUvuu), where you can ask us questions you might have. diff --git a/Artian-Apps/.github/workflows/sha1sum.yml b/Artian-Apps/.github/workflows/sha1sum.yml new file mode 100644 index 0000000..7da6db3 --- /dev/null +++ b/Artian-Apps/.github/workflows/sha1sum.yml @@ -0,0 +1,13 @@ +name: sha1sum +on: + workflow_dispatch: +jobs: + sha1sum: + runs-on: ubuntu-latest + steps: + - name: Checkout pi-apps repo + uses: actions/checkout@v3 + - name: hash all files + run: | + cd $GITHUB_WORKSPACE + find . -path ./.git -prune -o -type f -exec sha1sum "{}" + diff --git a/Artian-Apps/.github/workflows/shellcheck.yml b/Artian-Apps/.github/workflows/shellcheck.yml new file mode 100644 index 0000000..643194d --- /dev/null +++ b/Artian-Apps/.github/workflows/shellcheck.yml @@ -0,0 +1,30 @@ +name: Shellcheck +on: + pull_request_target: + branches: + - master + push: + branches: '**' + workflow_dispatch: +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + shellcheck: + runs-on: ubuntu-latest + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Checkout pi-apps repo + uses: actions/checkout@v3 + if: github.event_name != 'pull_request_target' + - name: Checkout pi-apps PR repo + uses: actions/checkout@v3 + if: github.event_name == 'pull_request_target' + with: + repository: ${{ github.event.pull_request.head.repo.full_name }} + ref: ${{ github.event.pull_request.head.sha }} + - name: Check vital scripts for errors + run: | + cd $GITHUB_WORKSPACE + sudo apt install shellcheck wget -y + if ! shellcheck api createapp gui install manage preload settings uninstall updater etc/preload-daemon etc/runonce-entries etc/terminal-run apps/*/install apps/*/install-32 apps/*/install-64 apps/*/uninstall --color=always | sed '0,/'$(echo -e "\033")'\[31m/!{q1}' ;then + exit 1 + fi diff --git a/Artian-Apps/.github/workflows/test_build.yml b/Artian-Apps/.github/workflows/test_build.yml new file mode 100644 index 0000000..300090e --- /dev/null +++ b/Artian-Apps/.github/workflows/test_build.yml @@ -0,0 +1,302 @@ +name: Test_Build + +# Controls when the workflow will run +on: + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + inputs: + name: + description: 'App Name, PR #, or zip URL' + required: true + default: '' + buster: + description: 'Build on PiOS Buster' + required: true + type: boolean + bullseye: + description: 'Build on PiOS Bullseye' + required: true + type: boolean + architecture: + type: choice + description: 'For Buster/Bullseye, test on 32bit, 64bit, or Both if available' + options: + - 32bit + - 64bit + - Both + bookworm_64: + description: 'Build on PiOS Bookworm Beta' + required: true + type: boolean + bionic_64: + description: 'Build on Switchroot Ubuntu 5.1.1 Bionic 64bit' + required: true + type: boolean + focal_64: + description: 'Build on Nvidia Jetpack 35.3.1 Focal 64bit' + required: true + type: boolean + jammy_64: + description: 'Build on RPI Ubuntu Jammy 64bit' + required: true + type: boolean + l4t_jammy_64: + description: 'Build on L4T Ubuntu Jammy 64bit' + required: true + type: boolean + lunar_64: + description: 'Build on RPI Ubuntu Lunar 64bit' + required: true + type: boolean + +run-name: Testing ${{ inputs.name }} + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + buster-32bit: + # The type of runner that the job will run on + runs-on: ubuntu-latest + if: ${{ inputs.buster && ( inputs.architecture == '32bit' || inputs.architecture == 'Both' ) }} + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + - name: Test installing app on buster armhf + uses: theofficialgman/arm-runner-action@v12 + with: + # this is a buster armhf image + base_image: https://downloads.raspberrypi.org/raspios_oldstable_armhf/images/raspios_oldstable_armhf-2023-05-03/2023-05-03-raspios-buster-armhf.img.xz + # bind mount the directory so any changes propogate to outside the chroot + bind_mount_repository: yes + + # give the image more space + image_additional_mb: 5000 + + # set CPUs to use + cpu: cortex-a7:cortex-a72 + + # use custom /proc/cpuinfo + cpu_info: cpuinfo/raspberrypi_4b + + # user runner name as default path + copy_repository_path: /home/runner/pi-apps + + # export github env back to outside the chroot + export_github_env: yes + + import_github_env: true + + # set shell to bash + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + bullseye-32bit: + runs-on: ubuntu-latest + if: ${{ inputs.bullseye && ( inputs.architecture == '32bit' || inputs.architecture == 'Both' ) }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on bullseye armhf + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf.img.xz + bind_mount_repository: yes + image_additional_mb: 5000 + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + buster-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.buster && ( inputs.architecture == '64bit' || inputs.architecture == 'Both' ) }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on buster arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zip + bind_mount_repository: yes + image_additional_mb: 5000 + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + bullseye-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.bullseye && ( inputs.architecture == '64bit' || inputs.architecture == 'Both' ) }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on bullseye arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64.img.xz + bind_mount_repository: yes + image_additional_mb: 5000 + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + bookworm-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.bookworm_64 }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on bookworm arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: ${{ secrets.RPIOS_BOOKWORM_URL }} + bind_mount_repository: yes + image_additional_mb: 5000 + # disable image caching to not leak the URL + enable_image_caching: no + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + bionic-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.bionic_64 }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on bionic arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://download.switchroot.org/ubuntu/switchroot-ubuntu-5.1.1-2023-06-12.7z + # add special arguments for switchroot image format + bootpartition: + rootpartition: 1 + bind_mount_repository: yes + image_additional_mb: 5000 + # use TX1 ARM CPU cores + cpu: cortex-a7:cortex-a57 + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + focal-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.focal_64 }} + steps: + - uses: actions/checkout@v3 + - name: Clear up some disk space + run: | + # Workaround to provide additional free space for testing. + # https://github.com/actions/virtual-environments/issues/2840 + sudo rm -rf /usr/share/dotnet + sudo rm -rf /opt/ghc + sudo rm -rf "/usr/local/share/boost" + sudo rm -rf "$AGENT_TOOLSDIRECTORY" + - name: Test installing app on focal arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://developer.nvidia.com/downloads/embedded/l4t/r35_release_v3.1/sd_card_b49/jp511-xnx-sd-card-image.zip + bootpartition: + rootpartition: 1 + bind_mount_repository: yes + image_additional_mb: 5000 + enable_image_caching: no + cpu: cortex-a7:cortex-a72 + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + jammy-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.jammy_64 }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on jammy arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://cdimage.ubuntu.com/releases/22.04.2/release/ubuntu-22.04.2-preinstalled-desktop-arm64+raspi.img.xz + bind_mount_repository: yes + image_additional_mb: 5000 + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + l4t-jammy-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.l4t_jammy_64 }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on L4T jammy arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://github.com/theofficialgman/testing/releases/download/gmans-releases/theofficialgman-ubuntu-jammy-5.1.1-2023-08-19.7z + # add special arguments for switchroot image format + bootpartition: + rootpartition: 1 + bind_mount_repository: yes + image_additional_mb: 5000 + # use TX1 ARM CPU cores + cpu: cortex-a7:cortex-a57 + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh + + lunar-64bit: + runs-on: ubuntu-latest + if: ${{ inputs.lunar_64 }} + steps: + - uses: actions/checkout@v3 + - name: Test installing app on lunar arm64 + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: https://cdimage.ubuntu.com/releases/23.04/release/ubuntu-23.04-preinstalled-desktop-arm64+raspi.img.xz + bind_mount_repository: yes + image_additional_mb: 5000 + cpu: cortex-a7:cortex-a72 + cpu_info: cpuinfo/raspberrypi_4b + copy_repository_path: /home/runner/pi-apps + export_github_env: yes + import_github_env: true + shell: /bin/bash + commands: | + export name="${{ inputs.name }}" + ./.github/workflows/test_build_commands.sh diff --git a/Artian-Apps/.github/workflows/test_build_commands.sh b/Artian-Apps/.github/workflows/test_build_commands.sh new file mode 100644 index 0000000..83f8107 --- /dev/null +++ b/Artian-Apps/.github/workflows/test_build_commands.sh @@ -0,0 +1,270 @@ +#!/bin/bash + +sudo chown runner:docker /home/runner +# print user info +echo $USER $USERNAME $(id) $(whoami) +sudo bash -c 'echo $USER $USERNAME $(id) $(whoami)' +echo "GITHUB_JOB: $GITHUB_JOB" + +# set DIRECTORY variable +DIRECTORY="$(pwd)" + +# print date +date + +#necessary functions +error() { #red text and exit 1 + echo -e "\e[91m$1\e[0m" 1>&2 + exit 1 +} + +warning() { #yellow text + echo -e "\e[93m\e[5m◢◣\e[25m WARNING: $1\e[0m" 1>&2 +} + +status() { #cyan text to indicate what is happening + + #detect if a flag was passed, and if so, pass it on to the echo command + if [[ "$1" == '-'* ]] && [ ! -z "$2" ];then + echo -e $1 "\e[96m$2\e[0m" 1>&2 + else + echo -e "\e[96m$1\e[0m" 1>&2 + fi +} + +status_green() { #announce the success of a major action + echo -e "\e[92m$1\e[0m" 1>&2 +} + +import_zip() { #given a zipfile, extract it to apps directory and return the name of the app + local import="$1" + [ -z "$import" ] || [ ! -f "$import" ] && error "import_zip(): invalid input: '$import'" + + #create a temporary directory to extract to + local tmpdir="$(mktemp -d)" || error "Failed to create a temporaty folder for some reason.\nErrors:\n$tmpdir" + #be sure to delete the temporary folder on exit + trap "rm -rf '$tmpdir'" EXIT + + #unzip to the temporary directory + local errors="$(unzip "$import" -d "$tmpdir" 2>&1)" || error "Failed to extract '$import' to '$tmpdir'.\nErrors: $errors" + + #some zip files have an inner directory that app-files are situated in; others don't. + if [ "$(find "$tmpdir" -maxdepth 1 -type d | tail +2 | wc -l)" == 1 ] && [ "$(find "$tmpdir" -maxdepth 1 -type f | tail +2 | wc -l)" == 0 ];then + #if the temporary directory contains exactly one folder and zero loose files + echo "$(basename "$import") contains exactly one folder and zero loose files" 1>&2 + + local app_name="$(basename "$(find "$tmpdir" -maxdepth 1 -type d | tail +2)")" + #return the name of the app + echo "$app_name" + [ -z "$app_name" ] && error "Failed to determine a name for the app, given this filename: '$import'" + #remove the app from pi-apps first + rm -rf "${DIRECTORY}/apps/${app_name}" + + #then move the folder straight to the pi-apps folder + mv -f "$(find "$tmpdir" -maxdepth 1 -type d | tail +2)" "${DIRECTORY}/apps" + + else #if extracted archive did not contain exactly one folder and zero loose files + echo "$(basename "$import") did not contain exactly one folder and zero loose files" 1>&2 + + #create a folder in the apps directory first + newfolder="${DIRECTORY}/apps/$(basename "$import" | awk -F'.' '{print $1}')" + [ "$newfolder" == "${DIRECTORY}/apps/" ] && error "Failed to determine a name for the app, given this filename: '$import'" + rm -rf "$newfolder" + mkdir -p "$newfolder" + + #return the name of the app + basename "$newfolder" + + #then move the extracted files over, into the app-folder + mv -f "$tmpdir"/* "$newfolder" + fi +} + +if [[ "$GITHUB_JOB" == "bionic-64bit" ]]; then + # fix nvidia jank + # update sources list for t210 + sudo sed -i "s//t210/" /etc/apt/sources.list.d/nvidia-l4t-apt-source.list +fi + +if [[ "$GITHUB_JOB" == "bionic-64bit" ]] || [[ "$GITHUB_JOB" == "l4t-jammy-64bit" ]]; then + # add ld conf files (normally handled by service on first launch) + echo "/usr/lib/aarch64-linux-gnu/tegra-egl" | sudo tee /etc/ld.so.conf.d/aarch64-linux-gnu_EGL.conf + echo "/usr/lib/aarch64-linux-gnu/tegra" | sudo tee /etc/ld.so.conf.d/aarch64-linux-gnu_GL.conf + # skip joycond postinst + sudo rm /var/lib/dpkg/info/joycond.postinst -f + sudo dpkg --configure joycond + # note that we are in a chroot to skip bootfile configuration + sudo mkdir -p /opt/switchroot + sudo touch /opt/switchroot/image_prep +fi + +if [[ "$GITHUB_JOB" == "focal-64bit" ]]; then + # fix nvidia jank + # update sources list for t194 + sudo sed -i "s//t194/" /etc/apt/sources.list.d/nvidia-l4t-apt-source.list +fi + +if [[ "$GITHUB_JOB" == "jammy-64bit" ]] || [[ "$GITHUB_JOB" == "lunar-64bit" ]]; then + # remove packages that won't work in the chroot + sudo apt remove -y linux-image-*-raspi linux-modules-*-raspi linux-image-raspi linux-raspi linux-headers-raspi +fi + +# install pi-apps dependencies +sudo apt update +if [[ "$GITHUB_JOB" == "bionic-64bit" ]]; then + # update certificate chain + sudo apt install -y ca-certificates +fi +sudo apt install -y yad curl wget aria2 lsb-release software-properties-common apt-utils imagemagick bc librsvg2-bin locales shellcheck git wmctrl xdotool x11-utils rsync + +#determine what type of input we received +if [ -z "$name" ]; then + error "No App Name, PR #, or zip URL input passed to script. Exiting now." +fi +import="$(echo "$name" | tr ';' '\n')" + +if ls apps | grep -q "$import" ;then + #pi-apps app name as input + imported_apps="$import" + +elif [[ "$import" == *'://'*'.zip' ]];then + + #given a download link to a zip file + + #create a temporary directory to extract to + tmpdir="$(mktemp -d)" || error "Failed to create a temporaty folder for some reason.\nErrors:\n$tmpdir" + #be sure to delete the temporary folder on exit + trap "rm -rf '$tmpdir'" EXIT + + filename="$tmpdir/$(basename "$import")" + + #download the zip file + wget "$import" -O "$filename" || error "Failed to download '$import' to '$filename'" + + #use the import_zip function to import the app, keeping a record of the app-name + imported_apps="$(import_zip "$filename")" + +elif [[ "$import" =~ ^[0-9]+$ ]] || [[ "$import" == *'://'*'/pull/'*[0-9] ]];then + #given a pull request for an app + + #if given a PR number, assume it's a PR on the pi-apps repo + if [[ "$import" =~ ^[0-9]+$ ]];then + PR="https://github.com/Botspot/pi-apps/pull/${import}" + else + #if given a url to a PR + PR="$import" + fi + + #repobranch='https://github.com/cycool29/pi-apps/tree/msteams' + repobranch="$(wget -qO- "$PR" | grep -x 'from' --after 2 | tr '<> ' '\n' | grep 'title="' | sed 's/title="//g' | sed 's/"$//g' | head -n1)" + + if [ -z "$repobranch" ];then + error "No PR was found that mentions a branch." + else + echo "repobranch: $repobranch" + fi + + #Take a combined repo/branch url and separate it. + #example value of repobranch: https://github.com/cycool29/pi-apps/tree/msteams + + repo="$(echo "$repobranch" | awk -F: '{print $1}')" #value: cycool29/pi-apps + branch="$(basename "$repobranch" | awk -F: '{print $2}')" #value: msteams + username="$(dirname "$repo" | sed 's+^/++g')" #value: cycool29 + + #make a temporary directory and enter it + cd "$(mktemp -d)" || error "Failed to create and enter a temporary directory." + #if script is killed prematurely, be sure to delete the temporary folder + trap "rm -rf '$(pwd)'" EXIT + + echo -e "\nrepo: $repo\nbranch: $branch\nusername: $username\ntmpdir: $(pwd)\n" + + echo -n "Downloading repository... " + errors="$(git clone "https://github.com/${repo}" -b $branch -q pi-apps 2>&1)" || error "Failed to clone repository: $repo\nErrors:\n$errors" + echo "Done" + + echo -n "Syncing fork with upstream repo... " + cd $(pwd)/pi-apps + git config user.email "user@example.com" #set email in this repo so that it can pull + git config user.name "user" #set username in this repo so that it can pull + errors="$(git pull https://github.com/Botspot/pi-apps --rebase -q 2>&1)" || error "Failed to sync upstream repo. \nErrors:\n$errors" + + cd .. #back to tmpdir + echo "Done" + + echo -n "Getting pi-apps repo for comparison... " + errors="$(git clone "https://github.com/Botspot/pi-apps" pi-apps-master -q 2>&1)" || error "Failed to clone Botspot pi-apps repository.\nErrors:\n$errors" + echo "Done" + + #get list of apps that are unique to this pi-apps folder. (not on main repo) + applist="$("$(pwd)/pi-apps/api" list_apps local_only)" + + #get apps that don't match the ones in main branch - find only new apps + imported_apps="$(diff -rq "$(pwd)/pi-apps/apps" "$(pwd)/pi-apps-master/apps" | grep "Only in $(pwd)/pi-apps/apps:" | sed 's+.*/pi-apps-master.++g' | sed 's+.*apps/++g' | sed 's+.*apps: ++g' | sed 's+/.*++g' | sort | uniq | grep .)" + + IFS=$'\n' + for app in $applist + do + echo -en "Scanning apps... $app\033[0K\r" 1>&2 + + if [ -d "$(pwd)/pi-apps/apps/${app}" ] && [ -d "$(pwd)/pi-apps-master/apps/${app}" ] && ! diff -r "$(pwd)/pi-apps/apps/${app}" "$(pwd)/pi-apps-master/apps/${app}" -q >/dev/null 2>&1; then + #if app hashes don't match, add to imported list + #find only changed apps + if [ -z "$imported_apps" ]; then + # imported apps is blank, do not add newline + imported_apps="${app}" + else + # imported apps is not blank, add newline + imported_apps="${imported_apps} +${app}" + fi + fi + done + + IFS=$'\n' + for app in $imported_apps ;do + #remove directory first and replace with copied version from PR + #this prevents orphaned files when moving from install-32/install-64 to install + rm -rf "${DIRECTORY}/apps/$app" + cp -af "$(pwd)/pi-apps/apps/$app" "${DIRECTORY}/apps" + echo "Copied '$(pwd)/pi-apps/apps/${app}' to ${DIRECTORY}/apps" + done + +else + #unrecognized input + error "Unrecognized input '$import'" +fi + +cd "$DIRECTORY" + +status "Testing app(s): $imported_apps" + +# create standard directories +mkdir -p $HOME/.local/share/applications $HOME/.local/bin $HOME/Desktop +sudo mkdir -p /usr/local/bin /usr/local/share/applications + +# clean out any app status files +rm -rf ./data/status + +# runonce-entries is run in the build tester, runonce requires that all api functions be available to subprocess (like is done in the gui script) +#for the will_reinstall() and list_intersect() functions +set -a #make all functions in the api available to subprocesses +source "${DIRECTORY}/api" || error "failed to source ${DIRECTORY}/api" +#Run runonce entries +"${DIRECTORY}/etc/runonce-entries" +set +a #stop exporting functions + +# upgrade cmake to 3.20+ from theofficialgman ppa to fix QEMU only issue https://gitlab.kitware.com/cmake/cmake/-/issues/20568 +package_is_new_enough cmake 3.20 || debian_ppa_installer "theofficialgman/cmake-bionic" "bionic" "0ACACB5D1E74E484" || exit 1 + +IFS=$'\n' +for app in $imported_apps ;do + cd "$DIRECTORY" + ./manage install "$app" || error "Failed to install $app on $GITHUB_JOB." + status_green "Successfully installed $app on $GITHUB_JOB." +done +IFS=$'\n' +for app in $imported_apps ;do + cd "$DIRECTORY" + ./manage uninstall "$app" || error "Failed to uninstall $app on $GITHUB_JOB." + status_green "Successfully uninstalled $app on $GITHUB_JOB." +done diff --git a/Artian-Apps/.github/workflows/update_apps.yml b/Artian-Apps/.github/workflows/update_apps.yml new file mode 100644 index 0000000..4489344 --- /dev/null +++ b/Artian-Apps/.github/workflows/update_apps.yml @@ -0,0 +1,401 @@ +name: Update_Apps + +# Controls when the workflow will run +on: + # run at 00:00 UTC every Wednesday + schedule: + - cron: "0 0 * * 3" + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +# this workflow contains 3 jobs that run sequentially: get-latest-app-versions, test-updated-apps, and create-pr +# get-latest-app-versions gets the latests app versions and modifies the working directory of the repository with those changes. then it uploads that working directory of the git repository as an artifact for use in later jobs +# test-updated-apps runs a matrix of testcases where all updated apps from the first job are tested for successful installation/uninstallation in the working directory of the git repoistory downloaded from the artifact +# create-pr then uses the output from get-latest-app-versions and test-updated-apps to finalize a PR where only apps that passed all testcases are updated and any that fail have a descriptive error written in the PR comment +jobs: + get-latest-app-versions: + name: Get Latest App Versions + # The type of runner that the job will run on + runs-on: ubuntu-latest + + outputs: + UPDATED_APPS: ${{ steps.updated.outputs.UPDATED_APPS }} + FAILED_APPS: ${{ steps.failed.outputs.FAILED_APPS }} + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + # Runs a set of commands using the runners shell + - name: Run app update scripts + env: + GH_PERSONAL_ACCESS_TOKEN: ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }} + run: | + # print user info + echo $USER $USERNAME $(id) $(whoami) + + #source pi-apps functions + + #export all functions and variables + set -a + #make DIRECTORY equal to GITHUB_WORKSPACE, for subscripts and api functions + DIRECTORY=$GITHUB_WORKSPACE + source $GITHUB_WORKSPACE/api + + #add special functions + get_release() { + curl -s --header "Authorization: token $GH_PERSONAL_ACCESS_TOKEN" "https://api.github.com/repos/$1/releases/latest" | jq -r '.tag_name' | sed s/^v//g + } + + get_release_raw() { + curl -s --header "Authorization: token $GH_PERSONAL_ACCESS_TOKEN" "https://api.github.com/repos/$1/releases/latest" | jq -r '.tag_name' + } + + get_prerelease() { + curl -s --header "Authorization: token $GH_PERSONAL_ACCESS_TOKEN" "https://api.github.com/repos/$1/releases" | jq -r 'map(select(.prerelease)) | first | .tag_name' | sed s/^v//g + } + + get_prerelease_raw() { + curl -s --header "Authorization: token $GH_PERSONAL_ACCESS_TOKEN" "https://api.github.com/repos/$1/releases" | jq -r 'map(select(.prerelease)) | first | .tag_name' + } + + function validate_url(){ + if command wget --timeout=5 -q --spider "$1"; then + return 0 + else + return 1 + fi + } + + #stop exporting functions + set +a + + #make sure all update scripts are executable + chmod +x $GITHUB_WORKSPACE/.github/workflows/updates/*.sh + cd $GITHUB_WORKSPACE + apps=( .github/workflows/updates/*.sh ) + for app_directory in "${apps[@]}"; do + echo + #make sure we are still in the main workspace (incase an update script left off elsewhere) + cd $GITHUB_WORKSPACE + export app_name="$(echo ${app_directory%.*} | sed 's:.*/::')" + echo "$app_name" + status "Checking $app_name for updates" + # move to app folder + cd "$GITHUB_WORKSPACE/apps/$app_name" + # run app update script + "$GITHUB_WORKSPACE/$app_directory" + done + cd + + - name: Output updated apps + id: updated + run: | + if test -f /tmp/updated_apps; then + sort -u /tmp/updated_apps > /tmp/updated_apps_sorted + echo "UPDATED_APPS<> $GITHUB_OUTPUT + cat /tmp/updated_apps_sorted >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + fi + - name: Output failed apps + id: failed + run: | + if test -f /tmp/failed_apps; then + echo "FAILED_APPS<> $GITHUB_OUTPUT + cat /tmp/failed_apps | sed '0~1 a\\' >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + fi + - name: Tar GITHUB_WORKSPACE + run: | + cd ${{ runner.temp }} + tar -C $GITHUB_WORKSPACE -cvf GITHUB_WORKSPACE.tar . + + - name: Upload GITHUB_WORKSPACE Artifact + uses: actions/upload-artifact@v3 + with: + name: GITHUB_WORKSPACE + path: ${{ runner.temp }}/GITHUB_WORKSPACE.tar + + test-updated-apps: + runs-on: ubuntu-latest + needs: get-latest-app-versions + strategy: + matrix: + include: + - os: buster + arch: armhf + image: https://downloads.raspberrypi.org/raspios_oldstable_armhf/images/raspios_oldstable_armhf-2023-05-03/2023-05-03-raspios-buster-armhf.img.xz + cache: yes + - os: buster + arch: arm64 + image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2021-05-28/2021-05-07-raspios-buster-arm64.zip + cache: yes + - os: bullseye + arch: armhf + image: https://downloads.raspberrypi.org/raspios_armhf/images/raspios_armhf-2023-05-03/2023-05-03-raspios-bullseye-armhf.img.xz + cache: yes + - os: bullseye + arch: arm64 + image: https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/2023-05-03-raspios-bullseye-arm64.img.xz + cache: yes + - os: bookworm + arch: arm64 + image: RPIOS_BOOKWORM_URL + cache: no + name: Testing on ${{ matrix.os }} - ${{ matrix.arch }} + outputs: + FAILED_UPDATE_APPS_buster_armhf: ${{ steps.failed.outputs.FAILED_UPDATE_APPS_buster_armhf || '' }} + FAILED_UPDATE_APPS_buster_arm64: ${{ steps.failed.outputs.FAILED_UPDATE_APPS_buster_arm64 || '' }} + FAILED_UPDATE_APPS_bullseye_armhf: ${{ steps.failed.outputs.FAILED_UPDATE_APPS_bullseye_armhf || '' }} + FAILED_UPDATE_APPS_bullseye_arm64: ${{ steps.failed.outputs.FAILED_UPDATE_APPS_bullseye_arm64 || '' }} + FAILED_UPDATE_APPS_bookworm_arm64: ${{ steps.failed.outputs.FAILED_UPDATE_APPS_bookworm_arm64 || '' }} + UPDATED_APPS_buster_armhf: ${{ steps.updated.outputs.UPDATED_APPS_buster_armhf || '' }} + UPDATED_APPS_buster_arm64: ${{ steps.updated.outputs.UPDATED_APPS_buster_arm64 || '' }} + UPDATED_APPS_bullseye_armhf: ${{ steps.updated.outputs.UPDATED_APPS_bullseye_armhf || '' }} + UPDATED_APPS_bullseye_arm64: ${{ steps.updated.outputs.UPDATED_APPS_bullseye_arm64 || '' }} + UPDATED_APPS_bookworm_arm64: ${{ steps.updated.outputs.UPDATED_APPS_bookworm_arm64 || '' }} + steps: + # restore GITHUB_WORKSPACE + - uses: actions/download-artifact@v3 + with: + name: GITHUB_WORKSPACE + path: ${{ runner.temp }} + - name: Extract GITHUB_WORKSPACE + run: | + cd ${{ runner.temp }} + tar xf GITHUB_WORKSPACE.tar -C $GITHUB_WORKSPACE + cd $GITHUB_WORKSPACE + + - name: Replace secret reference with contents + if: ${{ matrix.image == 'RPIOS_BOOKWORM_URL' }} + run: | + image_url=${{ secrets[matrix.image] }} + echo "::add-mask::$image_url" + echo "image_url=$image_url" >> "$GITHUB_ENV" + + - name: Replace non-secret reference with contents + if: ${{ matrix.image != 'RPIOS_BOOKWORM_URL' }} + run: | + image_url=${{ matrix.image }} + echo "image_url=$image_url" >> "$GITHUB_ENV" + + - name: Write UPDATED_APPS and FAILED_APPS from OUTPUT of get-latest-app-versions to ENV + run: | + echo "UPDATED_APPS<> $GITHUB_ENV + echo "${{needs.get-latest-app-versions.outputs.UPDATED_APPS}}" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + echo "FAILED_APPS<> $GITHUB_ENV + echo "${{needs.get-latest-app-versions.outputs.FAILED_APPS}}" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Test installing updated apps on ${{ matrix.os }} - ${{ matrix.arch }} + uses: theofficialgman/arm-runner-action@v12 + with: + base_image: ${{ env.image_url }} + # bind mount the directory so any changes propogate to outside the chroot + bind_mount_repository: yes + + # give the image more space + image_additional_mb: 5000 + + # disable image caching to not leak the URL on some systems + enable_image_caching: ${{ matrix.cache }} + + # set CPUs to use + cpu: cortex-a7:cortex-a72 + + # use custom /proc/cpuinfo + cpu_info: cpuinfo/raspberrypi_4b + + # user runner name as default path + copy_repository_path: /home/runner/pi-apps + + # export github env back to outside the chroot + export_github_env: yes + + import_github_env: true + + # set shell to bash + shell: /bin/bash + commands: | + sudo chown runner:docker /home/runner + # print user info + echo $USER $USERNAME $(id) $(whoami) + sudo bash -c 'echo $USER $USERNAME $(id) $(whoami)' + + # create standard directories + mkdir -p $HOME/.local/share/applications $HOME/.local/bin + sudo mkdir -p /usr/local/bin /usr/local/share/applications + + # install pi-apps dependencies + sudo apt update + sudo apt install -y yad curl wget aria2 lsb-release software-properties-common apt-utils imagemagick bc librsvg2-bin locales shellcheck git wmctrl xdotool x11-utils rsync + + # runonce-entries is run in the build tester, runonce requires that all api functions be available to subprocess (like is done in the gui script) + #for the will_reinstall() and list_intersect() functions + set -a #make all functions in the api available to subprocesses + #make DIRECTORY equal to GITHUB_WORKSPACE, for subscripts and api functions + DIRECTORY=$(pwd) + source "${DIRECTORY}/api" || error "failed to source ${DIRECTORY}/api" + #Run runonce entries + "${DIRECTORY}/etc/runonce-entries" + set +a #stop exporting functions + cd ${DIRECTORY} + + # upgrade cmake to 3.20+ from theofficialgman ppa to fix QEMU only issue https://gitlab.kitware.com/cmake/cmake/-/issues/20568 + package_is_new_enough cmake 3.20 || debian_ppa_installer "theofficialgman/cmake-bionic" "bionic" "0ACACB5D1E74E484" || exit 1 + + # store apps changed from last commit to working directory in variable + mapfile -t changed_apps < <(git diff --name-only | grep ^apps/ | awk -F '/' '{print $2}' | sort -u) + + # clean out any app status files + rm -rf ./data/status + + # attempt to install updated apps using manage script loop + # if any app fails, add it to the FAILED_INSTALL_APPS or FAILED_UNINSTALL_APPS variable + if [[ ${{ matrix.arch }} == armhf ]]; then + # skip checking DDNet (due to Rust) if on arm32 under QEMU: https://github.com/rust-lang/cargo/issues/8719 + # skip checking Microsoft PowerShell due to QEMU instability with .NET: https://github.com/Botspot/pi-apps/pull/2252#issuecomment-1403043945 + # skip WPS Office on 32bit as it requires "64bit" kernel to be detected. QEMU reports an armv7 kernel. WPS Office is still tested on arm64 (which will verify if the deb works and installs correctly) + skiplist="DDNet + Microsoft PowerShell + WPS Office" + else + # skip checking Microsoft PowerShell due to QEMU instability with .NET: https://github.com/Botspot/pi-apps/pull/2252#issuecomment-1403043945 + skiplist="Microsoft PowerShell" + fi + for app in "${changed_apps[@]}"; do + # only attempt install/uninstall if updated app is supported on this architecture + scriptname="$(script_name_cpu "$app")" #will be install, install-32, install-64, or package + if [ -z "$scriptname" ];then + continue + fi + # skip app if is in the skiplist + if echo "$skiplist" | grep -Fxq "$app"; then + continue + fi + ./manage install "$app" || { FAILED_INSTALL_APPS+="$app"$'\n'; UPDATED_APPS=$(echo "$UPDATED_APPS" | sed "/$app/d"); } + ./manage uninstall "$app" || { FAILED_UNINSTALL_APPS+="$app"$'\n'; UPDATED_APPS=$(echo "$UPDATED_APPS" | sed "/$app/d"); } + done + + if [ ! -z "$FAILED_INSTALL_APPS" ] || [ ! -z "$FAILED_UNINSTALL_APPS" ]; then + echo "FAILED_UPDATE_APPS<> $GITHUB_ENV + echo "$FAILED_INSTALL_APPS$FAILED_UNINSTALL_APPS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + echo "UPDATED_APPS<> $GITHUB_ENV + echo "$UPDATED_APPS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + fi + - name: Write FAILED_APPS to OUTPUT + id: failed + run: | + echo "FAILED_UPDATE_APPS_${{ matrix.os }}_${{ matrix.arch }}<> $GITHUB_OUTPUT + echo "${{env.FAILED_UPDATE_APPS}}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - name: Write UPDATED_APPS to OUTPUT + id: updated + run: | + echo "UPDATED_APPS_${{ matrix.os }}_${{ matrix.arch }}<> $GITHUB_OUTPUT + echo "${{env.UPDATED_APPS}}" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + + create-pr: + needs: [get-latest-app-versions,test-updated-apps] + runs-on: ubuntu-latest + steps: + # restore GITHUB_WORKSPACE + - uses: actions/download-artifact@v3 + with: + name: GITHUB_WORKSPACE + path: ${{ runner.temp }} + - name: Extract GITHUB_WORKSPACE + run: | + cd ${{ runner.temp }} + tar xf GITHUB_WORKSPACE.tar -C $GITHUB_WORKSPACE + cd $GITHUB_WORKSPACE + - name: Delete artifact + uses: geekyeggo/delete-artifact@v2 + with: + name: GITHUB_WORKSPACE + failOnError: false + + - name: Revert failed apps and generate list + run: | + ALL_FAILED_APPS="${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_armhf}}"$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_arm64}}"$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_armhf}}"$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_arm64}}"$'\n'"${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bookworm_arm64}}" + ALL_FAILED_APPS="$(echo "$ALL_FAILED_APPS" | sort -u | awk NF)" + echo "ALL_FAILED_APPS<> $GITHUB_ENV + echo "$ALL_FAILED_APPS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + error_string="" + IFS=$'\n' + for app in $ALL_FAILED_APPS; do + git checkout -- "apps/$app" + error_string+='![badge-error][badge-error]'" Failed to install $app on " + + if echo "${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_armhf}}" | grep -Fxq "$app"; then + error_string+="buster armhf, " + fi + if echo "${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_buster_arm64}}" | grep -Fxq "$app"; then + error_string+="buster arm64, " + fi + if echo "${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_armhf}}" | grep -Fxq "$app"; then + error_string+="bullseye armhf, " + fi + if echo "${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bullseye_arm64}}" | grep -Fxq "$app"; then + error_string+="bullseye arm64, " + fi + if echo "${{needs.test-updated-apps.outputs.FAILED_UPDATE_APPS_bookworm_arm64}}" | grep -Fxq "$app"; then + error_string+="bookworm arm64, " + fi + + error_string+="reverting to previous version."$'\n'$'\n' + done + true + echo "ALL_FAILED_APPS_ERROR_STRING<> $GITHUB_ENV + echo "$error_string" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Generate updated apps list + run: | + list_subtract() { #Outputs a list of apps from stdin, minus the ones that appear in $1 using the UPDATED_APP format + # for example, the following two inputs will be a match + # - BlockBench-arm64: 4.7.4 -> 4.8.0 + # BlockBench + # change \n to -\n | change '^' to '- ' + grep -ve "$(echo "$1" | sed -z 's/\n/\-\n/g' | sed 's/^/- /g')" + true + } + ALL_UPDATED_APPS="${{needs.test-updated-apps.outputs.UPDATED_APPS_buster_armhf}}"$'\n'"${{needs.test-updated-apps.outputs.UPDATED_APPS_buster_arm64}}"$'\n'"${{needs.test-updated-apps.outputs.UPDATED_APPS_bullseye_armhf}}"$'\n'"${{needs.test-updated-apps.outputs.UPDATED_APPS_bullseye_arm64}}"$'\n'"${{needs.test-updated-apps.outputs.UPDATED_APPS_bookworm_arm64}}" + ALL_UPDATED_APPS="$(echo "$ALL_UPDATED_APPS" | sort -u | awk NF)" + [ ! -z "$ALL_UPDATED_APPS" ] && ALL_UPDATED_APPS="$(echo "$ALL_UPDATED_APPS" | list_subtract "$ALL_FAILED_APPS")" + echo "ALL_UPDATED_APPS<> $GITHUB_ENV + echo "$ALL_UPDATED_APPS" >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v4 + with: + author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> + commit-message: | + Update App Versions, run by GitHub Actions - Apps updated: + + ${{ env.ALL_UPDATED_APPS }} + branch: "auto-app-updates-NOT-FOR-USERS" + title: "[AUTO] Update App Versions" + body: | + [badge-error]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/error.svg?raw=true 'Error' + [badge-warning]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/warning.svg?raw=true 'Warning' + [badge-issue]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/issue.svg?raw=true 'Issue' + [badge-check]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/check.svg?raw=true 'Check' + [badge-info]: https://github.com/Pi-Apps-Coders/GitHub-Markdown/blob/main/blockquotes/badge/dark-theme/info.svg?raw=true 'Info' + Automated changes by [create-pull-request](https://github.com/peter-evans/create-pull-request) GitHub action. + Workflow run: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} + Apps updated: + ``` + ${{ env.ALL_UPDATED_APPS }} + ``` + ${{needs.get-latest-app-versions.outputs.FAILED_APPS}} + ${{ env.ALL_FAILED_APPS_ERROR_STRING }} diff --git a/Artian-Apps/.github/workflows/update_apps_raspbian_addons.yml.disabled b/Artian-Apps/.github/workflows/update_apps_raspbian_addons.yml.disabled new file mode 100644 index 0000000..3d68025 --- /dev/null +++ b/Artian-Apps/.github/workflows/update_apps_raspbian_addons.yml.disabled @@ -0,0 +1,94 @@ +name: Update_Raspbian_Addons_apps + +# Controls when the workflow will run +on: + # run every hour + schedule: + - cron: 5 * * * * + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + update-raspbian-addons: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v3 + + # Runs a set of commands using the runners shell + - name: Run app update scripts + run: | + #source pi-apps functions + + #export all functions and variables + set -a + #make DIRECTORY equal to GITHUB_WORKSPACE, for subscripts and api functions + DIRECTORY=$GITHUB_WORKSPACE + source $GITHUB_WORKSPACE/api + + #add special functions + get_release() { + curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases/latest" | jq -r '.tag_name' | sed s/v//g + } + + get_prerelease() { + curl -s --header "Authorization: token ${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" "https://api.github.com/repos/$1/releases" | jq -r 'map(select(.prerelease)) | first | .tag_name' | sed s/v//g + } + + function validate_url(){ + if command wget --timeout=5 --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36" -q --spider "$1"; then + return 0 + else + return 1 + fi + } + + #stop exporting functions + set +a + + #make sure all update scripts are executable + chmod +x $GITHUB_WORKSPACE/.github/workflows/updates/*.sh + cd $GITHUB_WORKSPACE + apps=( .github/workflows/updates/*.sh ) + for app_directory in "${apps[@]}"; do + # make sure we are still in the main workspace (incase an update script left off elsewhere) + cd $GITHUB_WORKSPACE + # check if this is a raspbian addons application by checking for string https://apt.raspbian-addons.org + if grep -q "https://apt.raspbian-addons.org" "$app_directory"; then + export app_name="$(echo ${app_directory%.*} | sed 's:.*/::')" + echo "$app_name" + status "Checking $app_name for updates from apt.raspbian-addons.org" + # move to app folder + cd "$GITHUB_WORKSPACE/apps/$app_name" + + # run app update script + "$GITHUB_WORKSPACE/$app_directory" + fi + done + cd + if test -f /tmp/updated_apps; then + sort -u /tmp/updated_apps > /tmp/updated_apps_sorted + echo "UPDATED_APPS<> $GITHUB_ENV + cat /tmp/updated_apps_sorted >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + fi + + if test -f /tmp/failed_apps; then + echo "FAILED_APPS<> $GITHUB_ENV + cat /tmp/failed_apps | sed '0~1 a\\' >> $GITHUB_ENV + echo "EOF" >> $GITHUB_ENV + fi + + - name: Push any changes to repo + uses: EndBug/add-and-commit@v9 + with: + default_author: github_actions + message: | + Update App Versions, run by GitHub Actions - Apps updated: + + ${{ env.UPDATED_APPS }} + diff --git a/Artian-Apps/.github/workflows/update_debian_repo_script.sh b/Artian-Apps/.github/workflows/update_debian_repo_script.sh new file mode 100644 index 0000000..c64286e --- /dev/null +++ b/Artian-Apps/.github/workflows/update_debian_repo_script.sh @@ -0,0 +1,157 @@ +#!/bin/bash + +# to run this script as part of other update scripts, source the directory like below +# source $GITHUB_WORKSPACE/.github/workflows/update_debian_repo_script.sh + +# you must have already set corresponding values for armhf_webPackages, arm64_webPackages, or all_webPackages +# The corresponding appname in pi-apps will have its corresponding filepath= variable update +# the filepath variable will contain the full filepath of the debian package with the version included + +# make sure required variable(s) is(are) supplied by the sourcing script +if [ -n "$armhf_webPackages" ] || [ -n "$arm64_webPackages" ] || [ -n "$all_webPackages" ]; then +#iterate through all variables supplied if an array +# get longest arrary of passed variables +num=$(echo -e "${#armhf_webPackages[@]}\n${#arm64_webPackages[@]}\n${#all_webPackages[@]}" | sort -n -r | head -1) + +for (( iter=0; iter<$num; iter++ )); do +#make array appear as one variable inside for loop +armhf_webPackages=${armhf_webPackages[$iter]} +arm64_webPackages=${arm64_webPackages[$iter]} +all_webPackages=${all_webPackages[$iter]} +armhf_packagename=${armhf_packagename[$iter]} +arm64_packagename=${arm64_packagename[$iter]} +all_packagename=${all_packagename[$iter]} +if [[ $iter == "0" ]]; then + version_number="" +else + version_number=$((iter + 1)) +fi + +#set pi_apps_filepath variables +if [ -n "$armhf_webPackages" ] && [ -f install-32 ]; then + pi_apps_filepath_32="$(cat 'install-32' | grep -m 1 "filepath${version_number}=" | sed "s/filepath${version_number}=//" | xargs)" +fi + +if [ -n "$arm64_webPackages" ] && [ -f install-64 ]; then + pi_apps_filepath_64="$(cat 'install-64' | grep -m 1 "filepath${version_number}=" | sed "s/filepath${version_number}=//" | xargs)" +fi + +if [ -n "$all_webPackages" ] && [ -f install ]; then + pi_apps_filepath="$(cat 'install' | grep -m 1 "filepath${version_number}=" | sed "s/filepath${version_number}=//" | xargs)" +fi + +# check for armhf and arm64 URL with a single install script using the same version +if [ -z "$pi_apps_filepath_32" ] && [ -z "$pi_apps_filepath_64" ] && [ -n "$armhf_webPackages" ] && [ -n "$arm64_webPackages" ] && [ -f install ]; then + pi_apps_filepath_32="$(cat 'install' | grep -m 1 "filepath_32${version_number}=" | sed "s/filepath_32${version_number}=//" | xargs)" + pi_apps_filepath_64="$(cat 'install' | grep -m 1 "filepath_64${version_number}=" | sed "s/filepath_64${version_number}=//" | xargs)" +fi + +# install-32 exists +if [ -n "$pi_apps_filepath_32" ] && [ -a "$DIRECTORY/apps/$app_name/install-32" ]; then + status "The current version in Pi-Apps install-32 is: $pi_apps_filepath_32" + armhf_webVer="$(wget -qO- "$armhf_webPackages" | awk "/Package: $armhf_packagename\n/" RS= | grep "Version:" | awk '{print $2}' | sort -V | tail -n1)" + armhf_package_path="$(wget -qO- "$armhf_webPackages" | awk "/Package: $armhf_packagename\n/" RS= | sed -n -e "/Version: ${armhf_webVer}/,/Filename:/ p" | grep "Filename:" | awk '{print $2}')" + repo_url="$(echo "$armhf_webPackages" | sed 's/dists.*//')" + if [[ "$pi_apps_filepath_32" = "${repo_url}${armhf_package_path}" ]]; then + #If the version is current do: + status "Pi-Apps install-32 version for $app_name is current!" + else + #If version is not current do: + if validate_url "${repo_url}${armhf_package_path}"; then + status_green "Updating pi-apps $app_name install-32 to: ${repo_url}${armhf_package_path}" + sed -i "0,/filepath${version_number}=.*/s;;filepath${version_number}=\"${repo_url}${armhf_package_path}\";g" install-32 + echo "- $app_name-armhf: $pi_apps_filepath_32 -> ${repo_url}${armhf_package_path} " >> /tmp/updated_apps + else + warning "Updating $app_name install-32 had been skipped, the upstream file ${repo_url}${armhf_package_path} does NOT exist." + echo "**Updating $app_name install-32 had been skipped, the upstream file ${repo_url}${armhf_package_path} does NOT exist.**" >> /tmp/failed_apps + fi + fi +fi + +# install-64 exists +if [ -n "$pi_apps_filepath_64" ] && [ -a "$DIRECTORY/apps/$app_name/install-64" ]; then + status "The current version in Pi-Apps install-64 is: $pi_apps_filepath_64" + arm64_webVer="$(wget -qO- "$arm64_webPackages" | awk "/Package: $arm64_packagename\n/" RS= | grep "Version:" | awk '{print $2}' | sort -V | tail -n1)" + arm64_package_path="$(wget -qO- "$arm64_webPackages" | awk "/Package: $arm64_packagename\n/" RS= | sed -n -e "/Version: ${arm64_webVer}/,/Filename:/ p" | grep "Filename:" | awk '{print $2}')" + repo_url="$(echo "$arm64_webPackages" | sed 's/dists.*//')" + if [[ "$pi_apps_filepath_64" = "${repo_url}${arm64_package_path}" ]]; then + #If the version is current do: + status "Pi-Apps install-64 version for $app_name is current!" + else + #If version is not current do: + if validate_url "${repo_url}${arm64_package_path}"; then + status_green "Updating pi-apps $app_name install-64 to: ${repo_url}${arm64_package_path}" + sed -i "0,/filepath${version_number}=.*/s;;filepath${version_number}=\"${repo_url}${arm64_package_path}\";g" install-64 + echo "- $app_name-arm64: $pi_apps_filepath_64 -> ${repo_url}${arm64_package_path} " >> /tmp/updated_apps + else + warning "Updating $app_name install-64 had been skipped, the upstream file ${repo_url}${arm64_package_path} does NOT exist." + echo "**Updating $app_name install-64 had been skipped, the upstream file ${repo_url}${arm64_package_path} does NOT exist.**" >> /tmp/failed_apps + fi + fi +fi + +# install exists and all_webPackages is used +if [ -n "$pi_apps_filepath" ] && [ -n "$all_webPackages" ] && [ -a "$DIRECTORY/apps/$app_name/install" ]; then + status "The current version in Pi-Apps install is: $pi_apps_filepath" + all_webVer="$(wget -qO- "$all_webPackages" | awk "/Package: $all_packagename\n/" RS= | grep "Version:" | awk '{print $2}' | sort -V | tail -n1)" + all_package_path="$(wget -qO- "$all_webPackages" | awk "/Package: $all_packagename\n/" RS= | sed -n -e "/Version: ${all_webVer}/,/Filename:/ p" | grep "Filename:" | awk '{print $2}')" + repo_url="$(echo "$all_webPackages" | sed 's/dists.*//')" + if [[ "$pi_apps_filepath" = "${repo_url}${all_package_path}" ]]; then + #If the version is current do: + status "Pi-Apps install version for $app_name is current!" + else + #If version is not current do: + if validate_url "${repo_url}${all_package_path}"; then + status_green "Updating pi-apps $app_name install to: ${repo_url}${all_package_path}" + sed -i "0,/filepath${version_number}=.*/s;;filepath${version_number}=\"${repo_url}${all_package_path}\";g" install + echo "- $app_name-all: $pi_apps_filepath -> ${repo_url}${all_package_path} " >> /tmp/updated_apps + else + warning "Updating $app_name install had been skipped, the upstream file ${repo_url}${all_package_path} does NOT exist." + echo "**Updating $app_name install had been skipped, the upstream file ${repo_url}${all_package_path} does NOT exist.**" >> /tmp/failed_apps + fi + fi +fi + +# install exists and individual armhf_webPackages and arm64_webPackages are supplied +if [ -n "$pi_apps_filepath_32" ] && [ -n "$pi_apps_filepath_64" ] && [ -n "$armhf_webPackages" ] && [ -n "$arm64_webPackages" ] && [ -a "$DIRECTORY/apps/$app_name/install" ]; then + status "The current version in Pi-Apps install is: $pi_apps_filepath_32 $pi_apps_filepath_64" + armhf_webVer="$(wget -qO- "$armhf_webPackages" | awk "/Package: $armhf_packagename\n/" RS= | grep "Version:" | awk '{print $2}' | sort -V | tail -n1)" + armhf_package_path="$(wget -qO- "$armhf_webPackages" | awk "/Package: $armhf_packagename\n/" RS= | sed -n -e "/Version: ${armhf_webVer}/,/Filename:/ p" | grep "Filename:" | awk '{print $2}')" + arm64_webVer="$(wget -qO- "$arm64_webPackages" | awk "/Package: $arm64_packagename\n/" RS= | grep "Version:" | awk '{print $2}' | sort -V | tail -n1)" + arm64_package_path="$(wget -qO- "$arm64_webPackages" | awk "/Package: $arm64_packagename\n/" RS= | sed -n -e "/Version: ${arm64_webVer}/,/Filename:/ p" | grep "Filename:" | awk '{print $2}')" + repo_url_armhf="$(echo "$armhf_webPackages" | sed 's/dists.*//')" + repo_url_arm64="$(echo "$arm64_webPackages" | sed 's/dists.*//')" + if [[ "$pi_apps_filepath_64" = "${repo_url_arm64}${arm64_package_path}" ]] && [[ "$pi_apps_filepath_32" = "${repo_url_armhf}${armhf_package_path}" ]]; then + #If the version is current do: + status "Pi-Apps install version for $app_name is current!" + else + if validate_url "${repo_url_armhf}${armhf_package_path}" && validate_url "${repo_url_arm64}${arm64_package_path}"; then + status_green "Updating pi-apps $app_name install to: ${repo_url_armhf}${armhf_package_path} ${repo_url_arm64}${arm64_package_path}" + sed -i "0,/filepath_32${version_number}=.*/s;;filepath_32${version_number}=\"${repo_url_armhf}${armhf_package_path}\";g" install + sed -i "0,/filepath_64${version_number}=.*/s;;filepath_64${version_number}=\"${repo_url_arm64}${arm64_package_path}\";g" install + echo "- $app_name-all: $pi_apps_filepath_32 -> ${repo_url_armhf}${armhf_package_path} " >> /tmp/updated_apps + echo "- $app_name-all: $pi_apps_filepath_64 -> ${repo_url_arm64}${arm64_package_path} " >> /tmp/updated_apps + else + warning "Updating $app_name install had been skipped, the upstream file ${repo_url_armhf}${armhf_package_path} or ${repo_url_arm64}${arm64_package_path} does NOT exist." + echo "**Updating $app_name install had been skipped, the upstream file ${repo_url_armhf}${armhf_package_path} or ${repo_url_arm64}${arm64_package_path} does NOT exist.**" >> /tmp/failed_apps + fi + fi +fi + +done +else + +warning "armhf_webPackages, arm64_webPackages, or all_webPackages variable is missing for $app_name update script, please fix this script, skipping update check." +echo "**armhf_webPackages, arm64_webPackages, or all_webPackages variable is missing for $app_name update script, please fix this script, skipping update check.**" >> /tmp/failed_apps + +fi + +unset armhf_webPackages +unset arm64_webPackages +unset all_webPackages +unset armhf_packagename +unset arm64_packagename +unset all_packagename +unset pi_apps_filepath_32 +unset pi_apps_filepath_64 +unset pi_apps_filepath \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/update_github_script.sh b/Artian-Apps/.github/workflows/update_github_script.sh new file mode 100644 index 0000000..3823686 --- /dev/null +++ b/Artian-Apps/.github/workflows/update_github_script.sh @@ -0,0 +1,170 @@ +#!/bin/bash + +# to run this script as part of other update scripts, source the directory like below +# source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh + + +# for apps with an install-32 file, make sure that you supply the following variables before sourcing this script (examples for webcord shown below) +# the ${webVer} variable within the url is important +# it is assumed that your install script will contain a version variable with the version of the app you would like to keep updated automatically + +# webVer=$(get_release SpacingBat3/WebCord) +# armhf_url="https://github.com/SpacingBat3/WebCord/releases/download/v${webVer}/webcord_${webVer}_armhf.deb" + +# for apps with an install-64 file, make sure that you supply the following variables before sourcing this script (examples for webcord shown below) +# if a variable is already set, no need to duplicate it + +# webVer=$(get_release SpacingBat3/WebCord) +# arm64_url="https://github.com/SpacingBat3/WebCord/releases/download/v${webVer}/webcord_${webVer}_arm64.deb" + +# for apps with a unified install file, make sure to supply the following variables before sourcing this script + +# webVer=$(get_release subhra74/xdm) +# all_url="https://github.com/subhra74/xdm/releases/download/${webVer}/xdm-setup-${webVer}.tar.xz" + +# make sure webVer variable is supplied by the sourcing script +if [ -n "$webVer" ]; then +#iterate through all webVer supplied if an array +for (( iter=0; iter<${#webVer[@]}; iter++ )); do +#make array appear as one variable inside for loop +webVer=${webVer[$iter]} +pi_apps_ver_32=${pi_apps_ver_32[$iter]} +pi_apps_ver_64=${pi_apps_ver_64[$iter]} +pi_apps_ver=${pi_apps_ver[$iter]} +armhf_url=${armhf_url[$iter]} +arm64_url=${arm64_url[$iter]} +all_url=${all_url[$iter]} +if [[ $iter == "0" ]]; then + version_number="" +else + version_number=$((iter + 1)) +fi +# echo the versions +status "The latest online version is: $webVer" + +#set defaults for pi_app_ver if not supplied +if [ -z "$pi_apps_ver_32" ] && [ -n "$armhf_url" ] && [ -f install-32 ]; then + pi_apps_ver_32="$(cat 'install-32' | grep -m 1 "version${version_number}=" | sed "s/version${version_number}=//" | xargs)" +fi + +if [ -z "$pi_apps_ver_64" ] && [ -n "$arm64_url" ] && [ -f install-64 ]; then + pi_apps_ver_64="$(cat 'install-64' | grep -m 1 "version${version_number}=" | sed "s/version${version_number}=//" | xargs)" +fi + +if [ -z "$pi_apps_ver" ] && [ -n "$all_url" ] && [ -f install ]; then + pi_apps_ver="$(cat 'install' | grep -m 1 "version${version_number}=" | sed "s/version${version_number}=//" | xargs)" +fi + +# check for armhf and arm64 URL with a single install script using the same version +if [ -z "$pi_apps_ver" ] && [ -z "$pi_apps_ver_32" ] && [ -z "$pi_apps_ver_64" ] && [ -n "$armhf_url" ] && [ -n "$arm64_url" ] && [ -f install ]; then + pi_apps_ver="$(cat 'install' | grep -m 1 "version${version_number}=" | sed "s/version${version_number}=//" | xargs)" +fi + +# install-32 exists +if [ -n "$pi_apps_ver_32" ] && [ -a "$DIRECTORY/apps/$app_name/install-32" ]; then + status "The current version in Pi-Apps install-32 is: $pi_apps_ver_32" + if [[ "$pi_apps_ver_32" = "$webVer" ]]; then + #If the version is current do: + status "Pi-Apps install-32 version for $app_name is current!" + if ! validate_url "$armhf_url"; then + warning "Current $app_name install-32 may be broken, the upstream file $armhf_url does NOT exist." + echo '![badge-warning][badge-warning]'" Current $app_name install-32 may be broken, the upstream file $armhf_url does NOT exist." >> /tmp/failed_apps + fi + else + #If version is not current do: + if validate_url "$armhf_url"; then + status_green "Updating pi-apps $app_name install-32 to: $armhf_url" + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" install-32 + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" uninstall + echo "- $app_name-armhf: $pi_apps_ver_32 -> ${webVer} " >> /tmp/updated_apps + else + warning "Updating $app_name install-32 had been skipped, the upstream file $armhf_url does NOT exist." + echo '![badge-warning][badge-warning]'" Updating $app_name install-32 had been skipped, the upstream file $armhf_url does NOT exist." >> /tmp/failed_apps + fi + fi +fi + +# install-64 exists +if [ -n "$pi_apps_ver_64" ] && [ -a "$DIRECTORY/apps/$app_name/install-64" ]; then + status "The current version in Pi-Apps install-64 is: $pi_apps_ver_64" + if [[ "$pi_apps_ver_64" = "$webVer" ]]; then + #If the version is current do: + status "Pi-Apps install-64 version for $app_name is current!" + if ! validate_url "$arm64_url"; then + warning "Current $app_name install-64 may be broken, the upstream file $arm64_url does NOT exist." + echo '![badge-warning][badge-warning]'" Current $app_name install-64 may be broken, the upstream file $arm64_url does NOT exist." >> /tmp/failed_apps + fi + else + if validate_url "$arm64_url"; then + status_green "Updating pi-apps $app_name install-64 to: $arm64_url" + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" install-64 + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" uninstall + echo "- $app_name-arm64: $pi_apps_ver_64 -> ${webVer} " >> /tmp/updated_apps + else + warning "Updating $app_name install-64 had been skipped, the upstream file $arm64_url does NOT exist." + echo '![badge-warning][badge-warning]'" Updating $app_name install-64 had been skipped, the upstream file $arm64_url does NOT exist." >> /tmp/failed_apps + fi + fi +fi + +# install exists and all_url is used +if [ -n "$pi_apps_ver" ] && [ -n "$all_url" ] && [ -a "$DIRECTORY/apps/$app_name/install" ]; then + status "The current version in Pi-Apps install is: $pi_apps_ver" + if [[ "$pi_apps_ver" = "$webVer" ]]; then + #If the version is current do: + status "Pi-Apps install version for $app_name is current!" + if ! validate_url "$all_url"; then + warning "Current $app_name install may be broken, the upstream file $all_url does NOT exist." + echo '![badge-warning][badge-warning]'" Current $app_name install may be broken, the upstream file $all_url does NOT exist." >> /tmp/failed_apps + fi + else + if validate_url "$all_url"; then + status_green "Updating pi-apps $app_name install to: $all_url" + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" install + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" uninstall + echo "- $app_name-all: $pi_apps_ver -> ${webVer} " >> /tmp/updated_apps + else + warning "Updating $app_name install had been skipped, the upstream file $all_url does NOT exist." + echo '![badge-warning][badge-warning]'" Updating $app_name install had been skipped, the upstream file $all_url does NOT exist." >> /tmp/failed_apps + fi + fi +fi + +# install exists and individual armhf_url and arm64_url are supplied +if [ -n "$pi_apps_ver" ] && [ -n "$armhf_url" ] && [ -n "$arm64_url" ] && [ -a "$DIRECTORY/apps/$app_name/install" ]; then + status "The current version in Pi-Apps install is: $pi_apps_ver" + if [[ "$pi_apps_ver" = "$webVer" ]]; then + #If the version is current do: + status "Pi-Apps install version for $app_name is current!" + if ! ( validate_url "$armhf_url" && validate_url "$arm64_url" ); then + warning "Current $app_name install may be broken, the upstream file $armhf_url or $arm64_url does NOT exist." + echo '![badge-warning][badge-warning]'" Current $app_name install may be broken, the upstream file $armhf_url or $arm64_url does NOT exist." >> /tmp/failed_apps + fi + else + if validate_url "$armhf_url" && validate_url "$arm64_url"; then + status_green "Updating pi-apps $app_name install to: $armhf_url $arm64_url" + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" install + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" uninstall + echo "- $app_name-all: $pi_apps_ver -> ${webVer} " >> /tmp/updated_apps + else + warning "Updating $app_name install had been skipped, the upstream file $armhf_url or $arm64_url does NOT exist." + echo '![badge-warning][badge-warning]'" Updating $app_name install had been skipped, the upstream file $armhf_url or $arm64_url does NOT exist." >> /tmp/failed_apps + fi + fi +fi + +done +else + +warning "webVer variable is missing for $app_name update script, please fix this script, skipping update check." +echo '![badge-issue][badge-issue]'" webVer variable is missing for $app_name update script, please fix this script, skipping update check." >> /tmp/failed_apps + +fi + +unset webVer +unset pi_apps_ver_32 +unset pi_apps_ver_64 +unset pi_apps_ver +unset armhf_url +unset arm64_url +unset all_url diff --git a/Artian-Apps/.github/workflows/update_wiki.yml b/Artian-Apps/.github/workflows/update_wiki.yml new file mode 100644 index 0000000..5e63391 --- /dev/null +++ b/Artian-Apps/.github/workflows/update_wiki.yml @@ -0,0 +1,44 @@ +# This is a basic workflow to help you get started with Actions + +name: Update_Wiki_Scripts + +# Controls when the workflow will run +on: + # triggers the action when megascript_apps.txt file is updated + push: + branches: + - master + paths: + - 'etc/categories' + - 'apps/**/install' + - 'apps/**/install-32' + - 'apps/**/install-64' + - 'apps/**/description' + - 'apps/**/credits' + - 'apps/**/website' + - '.github/workflows/update-wiki.sh' + - '.github/workflows/update_wiki.yml' + # run at 4:00 UTC every day + schedule: + - cron: '0 4 * * *' + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # This workflow contains a single job called "build" + update-wiki: + # The type of runner that the job will run on + runs-on: ubuntu-latest + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: "Trigger analytics repo actions" + run: | + curl -XPOST -u "Botspot:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/Botspot/pi-apps-analytics/dispatches --data '{"event_type": "update analytics"}' + + - name: "Trigger website repo actions" + run: | + curl -XPOST -u "Botspot:${{ secrets.GH_PERSONAL_ACCESS_TOKEN }}" -H "Accept: application/vnd.github.everest-preview+json" -H "Content-Type: application/json" https://api.github.com/repos/Pi-Apps-Coders/website/dispatches --data '{"event_type": "update applist"}' + diff --git a/Artian-Apps/.github/workflows/updates/Angry IP scanner.sh b/Artian-Apps/.github/workflows/updates/Angry IP scanner.sh new file mode 100644 index 0000000..72ed413 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Angry IP scanner.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(get_release angryip/ipscan) +arm64_url="https://github.com/angryip/ipscan/releases/download/${webVer}/ipscan_${webVer}_all.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/AnyDesk.sh b/Artian-Apps/.github/workflows/updates/AnyDesk.sh new file mode 100644 index 0000000..11e78fa --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/AnyDesk.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(wget -qO- https://download.anydesk.com/rpi/ | grep '.deb
$' | tail -n 1 | sed 's+.*anydesk_.*_armhf.deb
++g') +armhf_url="https://download.anydesk.com/rpi/anydesk_${webVer}_armhf.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Arduino.sh b/Artian-Apps/.github/workflows/updates/Arduino.sh new file mode 100644 index 0000000..85de176 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Arduino.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer="$(wget -qO- https://www.arduino.cc/en/software | grep md5sum.txt | sed s/.md5sum.txt.*//g | sed 's+.*href="//downloads.arduino.cc/arduino-++g')" +armhf_url="https://downloads.arduino.cc/arduino-${webVer}-linuxarm.tar.xz" +arm64_url="https://downloads.arduino.cc/arduino-${webVer}-linuxaarch64.tar.xz" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/ArmCord.sh b/Artian-Apps/.github/workflows/updates/ArmCord.sh new file mode 100644 index 0000000..a554e96 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/ArmCord.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer=$(get_release ArmCord/ArmCord) +armhf_url="https://github.com/ArmCord/ArmCord/releases/download/v${webVer}/ArmCord_${webVer}_armv7l.deb" +arm64_url="https://github.com/ArmCord/ArmCord/releases/download/v${webVer}/ArmCord_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/updates/BleachBit.sh b/Artian-Apps/.github/workflows/updates/BleachBit.sh new file mode 100644 index 0000000..6d11e20 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/BleachBit.sh @@ -0,0 +1,7 @@ +#!/bin/bash + + +webVer="$(wget -qO- https://www.bleachbit.org/download/linux | grep "Debian 11 (Bullseye)" | sed 's+.*/download/file/t?file=bleachbit_++g; s/_all.*//g')" +all_url="https://download.bleachbit.org/bleachbit_${webVer}_all_debian11.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/BlockBench.sh b/Artian-Apps/.github/workflows/updates/BlockBench.sh new file mode 100644 index 0000000..28fa448 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/BlockBench.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer=$(get_release JannisX11/blockbench) +armhf_url="https://github.com/ryanfortner/blockbench-arm/raw/master/blockbench_${webVer}_armhf.deb" +arm64_url="https://github.com/ryanfortner/blockbench-arm/raw/master/blockbench_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Boxy SVG.sh b/Artian-Apps/.github/workflows/updates/Boxy SVG.sh new file mode 100644 index 0000000..8c4bcce --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Boxy SVG.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +webVer=$(wget -qO- https://raw.githubusercontent.com/flathub/com.boxy_svg.BoxySVG/master/com.boxy_svg.BoxySVG.yaml | grep 'url: https://firebasestorage.googleapis.com' | sed 's/.*url: //g' | tr '?-' '\n' | grep '\.zip$') +all_url="https://firebasestorage.googleapis.com/v0/b/boxy-svg.appspot.com/o/linux%2Fapp-${webVer}?alt=media" + +# use custom updater due to firebasestorage.googleapis.com not allowing URL verification +# if the URL is not valid, this will updating this app will fail testing the install script in the github actions updater + +# make sure webVer variable is supplied by the sourcing script +if [ -n "$webVer" ]; then + version_number="" + # echo the versions + status "The latest online version is: $webVer" + + if [ -z "$pi_apps_ver" ] && [ -n "$all_url" ] && [ -f install ]; then + pi_apps_ver="$(cat 'install' | grep -m 1 "version${version_number}=" | sed "s/version${version_number}=//" | xargs)" + fi + + # install exists and all_url is used + if [ -n "$pi_apps_ver" ] && [ -n "$all_url" ] && [ -a "$DIRECTORY/apps/$app_name/install" ]; then + status "The current version in Pi-Apps install is: $pi_apps_ver" + if [[ "$pi_apps_ver" = "$webVer" ]]; then + #If the version is current do: + status "Pi-Apps install version for $app_name is current!" + else + status_green "Updating pi-apps $app_name install to: $all_url" + sed -i "0,/version${version_number}=.*/s;;version${version_number}=${webVer};g" install + echo "- $app_name-all: $pi_apps_ver -> ${webVer} " >> /tmp/updated_apps + fi + fi + +else + warning "webVer variable is missing for $app_name update script, please fix this script, skipping update check." + echo '![badge-issue][badge-issue]'" webVer variable is missing for $app_name update script, please fix this script, skipping update check." >> /tmp/failed_apps +fi + +unset webVer +unset pi_apps_ver +unset all_url diff --git a/Artian-Apps/.github/workflows/updates/Browsh.sh b/Artian-Apps/.github/workflows/updates/Browsh.sh new file mode 100644 index 0000000..9d026b8 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Browsh.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(get_release browsh-org/browsh) +armhf_url="https://github.com/browsh-org/browsh/releases/download/v${webVer}/browsh_${webVer}_linux_armv7.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Caskaydia Cove NF.sh b/Artian-Apps/.github/workflows/updates/Caskaydia Cove NF.sh new file mode 100644 index 0000000..154fcaa --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Caskaydia Cove NF.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(get_release_raw ryanoasis/nerd-fonts) +all_url="https://github.com/ryanoasis/nerd-fonts/releases/download/${webVer}/CascadiaCode.zip" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Clam Antivirus.sh b/Artian-Apps/.github/workflows/updates/Clam Antivirus.sh new file mode 100644 index 0000000..0d83363 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Clam Antivirus.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +webVer[0]=$(get_release dave-theunsub/clamtk) +webVer[1]=$(get_release dave-theunsub/thunar-sendto-clamtk) +all_url[0]="https://github.com/dave-theunsub/clamtk/releases/download/v${webVer[0]}/clamtk_${webVer[0]}-1_all.deb" +all_url[1]="https://github.com/dave-theunsub/thunar-sendto-clamtk/releases/download/v${webVer[1]}/thunar-sendto-clamtk_${webVer[1]}-1_all.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/updates/Cura.sh b/Artian-Apps/.github/workflows/updates/Cura.sh new file mode 100644 index 0000000..0d2417f --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Cura.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +webVer[0]=$(get_release smartavionics/Cura) +webVer[1]=$(get_release unlimitedbacon/stl-thumb) +armhf_url[0]="https://github.com/smartavionics/Cura/releases/download/${webVer[0]}/Cura-${webVer[0]}-mb-armhf.AppImage" +armhf_url[1]="https://github.com/unlimitedbacon/stl-thumb/releases/download/v${webVer[1]}/stl-thumb_${webVer[1]}_armhf.deb" +arm64_url[0]="https://github.com/smartavionics/Cura/releases/download/${webVer[0]}/Cura-${webVer[0]}-mb-aarch64.AppImage" +arm64_url[1]="https://github.com/unlimitedbacon/stl-thumb/releases/download/v${webVer[1]}/stl-thumb_${webVer[1]}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/DDNet.sh.disabled b/Artian-Apps/.github/workflows/updates/DDNet.sh.disabled new file mode 100644 index 0000000..263d43a --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/DDNet.sh.disabled @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(wget -qO- https://info2.ddnet.tw/info | jq -r '.version') +all_url="https://github.com/ddnet/ddnet/tree/$webVer" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Discord.sh.disabled b/Artian-Apps/.github/workflows/updates/Discord.sh.disabled new file mode 100644 index 0000000..ca7dd90 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Discord.sh.disabled @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer=$(get_release SpacingBat3/WebCord) +armhf_url="https://github.com/SpacingBat3/WebCord/releases/download/v${webVer}/webcord_${webVer}_armhf.deb" +arm64_url="https://github.com/SpacingBat3/WebCord/releases/download/v${webVer}/webcord_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Drawing.sh b/Artian-Apps/.github/workflows/updates/Drawing.sh new file mode 100644 index 0000000..1e74484 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Drawing.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +# note, this webVer is potentially unstable and may not always work in the future depending on the package name (like what happened on 27 Mar 2022) +# find a better way to do this in the future + +webVer="$(wget -qO- https://launchpad.net/~cartes/+archive/ubuntu/drawing | grep ~focal | xargs)" +armhf_url="https://launchpad.net/~cartes/+archive/ubuntu/drawing/+files/drawing_${webVer}_armhf.deb" +arm64_url="https://launchpad.net/~cartes/+archive/ubuntu/drawing/+files/drawing_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Ducopanel.sh b/Artian-Apps/.github/workflows/updates/Ducopanel.sh new file mode 100644 index 0000000..e67b5bd --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Ducopanel.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +webVer=$(get_release ponsato/ducopanel) +arm64_url="https://github.com/ponsato/ducopanel/releases/download/${webVer}/ducopanel_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/updates/Electron Fiddle.sh b/Artian-Apps/.github/workflows/updates/Electron Fiddle.sh new file mode 100644 index 0000000..12a7c23 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Electron Fiddle.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer=$(get_release electron/fiddle) +armhf_url="https://github.com/electron/fiddle/releases/download/v${webVer}/electron-fiddle_${webVer}_armhf.deb" +arm64_url="https://github.com/electron/fiddle/releases/download/v${webVer}/electron-fiddle_${webVer}_arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh diff --git a/Artian-Apps/.github/workflows/updates/Flameshot.sh b/Artian-Apps/.github/workflows/updates/Flameshot.sh new file mode 100644 index 0000000..f785ecc --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Flameshot.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +webVer=$(get_release flameshot-org/flameshot) +armhf_url="https://github.com/flameshot-org/flameshot/releases/download/v${webVer}/flameshot-${webVer}-1.debian-10.armhf.deb" +arm64_url="https://github.com/flameshot-org/flameshot/releases/download/v${webVer}/flameshot-${webVer}-1.debian-10.arm64.deb" + +source $GITHUB_WORKSPACE/.github/workflows/update_github_script.sh \ No newline at end of file diff --git a/Artian-Apps/.github/workflows/updates/Flow.sh b/Artian-Apps/.github/workflows/updates/Flow.sh new file mode 100644 index 0000000..89207c1 --- /dev/null +++ b/Artian-Apps/.github/workflows/updates/Flow.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +webVer="$(wget https://support.ekioh.com/download -qO- | grep '