From e00a8f4847c2e5f379e50aa0bec40e87fc796959 Mon Sep 17 00:00:00 2001 From: xin Date: Wed, 6 Aug 2025 18:21:21 +0800 Subject: [PATCH] first commit --- .gitignore | 8 + ansible.cfg | 7 + commit.sh | 2 + compress_and_upload_files.sh | 74 +++++++ files_download.txt | 1 + init.sh | 3 + ota | 25 +++ playbooks/site.yml | 394 +++++++++++++++++++++++++++++++++++ sync.sh | 33 +++ upload_to_qiniu.sh | 104 +++++++++ 10 files changed, 651 insertions(+) create mode 100644 .gitignore create mode 100644 ansible.cfg create mode 100755 commit.sh create mode 100755 compress_and_upload_files.sh create mode 100644 files_download.txt create mode 100755 init.sh create mode 100755 ota create mode 100644 playbooks/site.yml create mode 100755 sync.sh create mode 100755 upload_to_qiniu.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d4ff72c --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +.vscode +output +libasound_module_pcm_cdsp.so +runtime.yml +wall +.envrc +*.tar.* +files \ No newline at end of file diff --git a/ansible.cfg b/ansible.cfg new file mode 100644 index 0000000..2b8491c --- /dev/null +++ b/ansible.cfg @@ -0,0 +1,7 @@ +[defaults] +host_key_checking = False +timeout = 30 +gathering = smart +fact_caching = memory + + diff --git a/commit.sh b/commit.sh new file mode 100755 index 0000000..3746544 --- /dev/null +++ b/commit.sh @@ -0,0 +1,2 @@ +./sync.sh +./compress_and_upload_files.sh \ No newline at end of file diff --git a/compress_and_upload_files.sh b/compress_and_upload_files.sh new file mode 100755 index 0000000..ae415ba --- /dev/null +++ b/compress_and_upload_files.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# 压缩并上传files目录到七牛云 +# 需要环境变量: QINIU_ACCESS_KEY, QINIU_SECRET_KEY + +set -e + +# 检查环境变量 +if [[ -z "$QINIU_ACCESS_KEY" ]] || [[ -z "$QINIU_SECRET_KEY" ]]; then + echo "错误: 请设置环境变量 QINIU_ACCESS_KEY 和 QINIU_SECRET_KEY" + exit 1 +fi + +# 检查files目录是否存在 +if [[ ! -d "files" ]]; then + echo "错误: files目录不存在" + exit 1 +fi + +# 生成带时间戳的文件名 +TIMESTAMP=$(date +"%Y%m%d_%H%M%S") +ARCHIVE_NAME="files_${TIMESTAMP}.tar.xz" + +echo "正在压缩files目录(使用xz最高压缩)..." + +# 使用tar进行最大压缩 +# -cJf: 创建xz压缩文件(最高压缩率) +# --exclude: 排除不需要的文件 +tar -cJf "$ARCHIVE_NAME" \ + --exclude='._*' \ + files/ + +# 获取压缩后的文件大小 +FILE_SIZE=$(ls -lh "$ARCHIVE_NAME" | awk '{print $5}') +echo "压缩完成: $ARCHIVE_NAME (大小: $FILE_SIZE)" + +# 文件已经使用xz压缩,无需额外处理 + +echo "" +echo "正在上传到七牛云..." + +# 调用上传脚本 +if [[ -f "./upload_to_qiniu.sh" ]]; then + ./upload_to_qiniu.sh "$ARCHIVE_NAME" + + # 从临时文件读取下载地址 + if [[ -f "/tmp/qiniu_upload_url.txt" ]]; then + DOWNLOAD_URL=$(cat /tmp/qiniu_upload_url.txt) + + # 写入下载地址到files_download.txt + echo "$DOWNLOAD_URL" > files_download.txt + + echo "" + echo "==================================" + echo "上传成功!" + echo "文件名: $ARCHIVE_NAME" + echo "下载地址已保存到: files_download.txt" + echo "下载地址: $DOWNLOAD_URL" + echo "==================================" + + # 清理临时文件 + rm -f /tmp/qiniu_upload_url.txt + else + echo "警告: 无法获取下载地址" + fi +else + echo "错误: upload_to_qiniu.sh 脚本不存在" + exit 1 +fi + +# 询问是否删除本地压缩文件 +echo "remove $ARCHIVE_NAME" +rm "$ARCHIVE_NAME" +exit 0 \ No newline at end of file diff --git a/files_download.txt b/files_download.txt new file mode 100644 index 0000000..99de630 --- /dev/null +++ b/files_download.txt @@ -0,0 +1 @@ +http://xplayer-ota.pureroad.cn/files_20250806_175127.tar.xz diff --git a/init.sh b/init.sh new file mode 100755 index 0000000..27e74a8 --- /dev/null +++ b/init.sh @@ -0,0 +1,3 @@ +apt-get update -y +apt-get install ansible-core -y +ansible-playbook playbooks/site.yml -e force_update=true \ No newline at end of file diff --git a/ota b/ota new file mode 100755 index 0000000..fff44d9 --- /dev/null +++ b/ota @@ -0,0 +1,25 @@ +#!/bin/bash +cd /root/xplayer-ota +git restore . +git pull + +# Download and extract files before running ansible-playbook +if [ -f "files_download.txt" ]; then + echo "Downloading files from files_download.txt..." + while IFS= read -r url; do + if [ -n "$url" ]; then + filename=$(basename "$url") + echo "Downloading $filename..." + wget -O "$filename" "$url" + if [ $? -eq 0 ]; then + echo "Extracting $filename..." + tar -xJf "$filename" + rm -f "$filename" + else + echo "Failed to download $url" + fi + fi + done < files_download.txt +fi + +ansible-playbook playbooks/site.yml diff --git a/playbooks/site.yml b/playbooks/site.yml new file mode 100644 index 0000000..e9863b8 --- /dev/null +++ b/playbooks/site.yml @@ -0,0 +1,394 @@ +- name: Configure Xplayer Server + hosts: localhost + become: yes + + tasks: + + - name: switch mirror + copy: + src: ../files/sources.list.d/ + dest: /etc/apt/sources.list.d/ + mode: '0644' + tags: apt + + - name: Update apt cache + apt: + update_cache: yes + cache_valid_time: 3600 + become: yes + tags: apt + + - name: install dependencies + apt: + name: + - bluez + - mpc + - libasound2-dev + - libudev-dev + - libfmt-dev + - libfmt9 + - libchromaprint1 + - libupnp17 + - libnfs14 + - libavutil58 + - libavformat60 + - libavcodec60 + - libcdio-paranoia2 + - libcdio-cdda2 + - libcdio19 + - libmms0 + - libsoxr0 + - libid3tag0 + - libiso9660-11 + - libzzip-0-13 + - libao4 + - libjack-jackd2-0 + - libpipewire-0.3-0 + - libpulse0 + - libshout3 + - libsndio7.0 + - libopenal1 + - libavahi-common3 + - libavahi-client3 + - libadplug-2.3.3-0 + - libflac12 + - libfluidsynth3 + - libaudiofile1 + - libfaad2 + - libgme0 + - libmad0 + - libmikmod3 + - libmodplug1 + - libmpcdec6 + - libmpg123-0 + - libopus0 + - libsndfile1 + - libogg0 + - libvorbis0a + - libwavpack1 + - libwildmidi2 + - libvorbisenc2 + - libmp3lame0 + - libtwolame0 + - libshine3 + - libmp3lame0 + - libtwolame0 + - net-tools + - libconfig9 + - avahi-daemon + # - upmpdcli + state: present + become: yes + tags: apt + + - name: Copy static files + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/modules + dest: /etc/modules + - src: ../files/login + dest: /srv/ + - src: ../files/sshd_config + dest: /etc/ssh/sshd_config + mode: '0600' + - src: ../files/authorized_keys + dest: /root/.ssh/authorized_keys + mode: '0600' + - src: ../files/asound.conf + dest: /etc/asound.conf + - src: ../files/start_service.sh + dest: /etc/custom_service/start_service.sh + mode: '0755' + - src: ../files/ota + dest: /usr/bin/ota + mode: '0755' + - src: ../files/snd-aloop.conf + dest: /etc/modprobe.d/snd-aloop.conf + mode: '0644' + - src: ../files/cpufrequtils + dest: /etc/default/cpufrequtils + mode: '0644' + + - name: Create directories + file: + path: "{{ item.path }}" + state: directory + mode: "{{ item.mode | default('0755') }}" + loop: + - path: /var/lib/mpd/playlists + - path: /var/lib/mpd/music + - path: /usr/local/lib/systemd/system + + - name: update mpd data + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/mpd.conf + dest: /etc/mpd.conf + - src: ../files/mpd.service + dest: /usr/local/lib/systemd/system/mpd.service + - src: ../files/mpd + dest: /usr/local/bin/mpd + mode: '0755' + - src: ../files/mpd.socket + dest: /usr/local/lib/systemd/system/mpd.socket + tags: mpd + notify: + - reload_systemd + - enable_mpd + - restart_mpd + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + + + - name: update bluetooth + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/bluetooth.service + dest: /usr/lib/systemd/system/bluetooth.service + - src: ../files/main.conf + dest: /etc/bluetooth/main.conf + - src: ../files/input.conf + dest: /etc/bluetooth/input.conf + tags: bluetooth + notify: + - reload_systemd + - enable_bluetooth + - stop_bluetooth + - start_bluetooth + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + + - name: update camilladsp + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/camilladsp.service + dest: /etc/systemd/system/camilladsp.service + - src: ../files/camilladsp-conf + dest: /root/ + - src: ../files/camilladsp + dest: /usr/local/bin/camilladsp + mode: '0755' + notify: + - reload_systemd + - enable_camilladsp + - restart_camilladsp + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + tags: camilladsp + + # - name: update upmpdcli + # copy: + # src: "{{ item.src }}" + # dest: "{{ item.dest }}" + # mode: "{{ item.mode | default('0644') }}" + # loop: + # - src: ../files/upmpdcli.conf + # dest: /etc/upmpdcli.conf + + - name: update usb-mount + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/usb-mount.sh + dest: /usr/local/bin/usb-mount.sh + mode: '0755' + - src: ../files/99-usb-auto-mount.rules + dest: /etc/udev/rules.d/99-usb-auto-mount.rules + mode: '0644' + tags: usb + notify: + - reload_udev + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + + - name: update network-tools + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/sing-box + dest: /usr/bin/sing-box + mode: '0755' + - src: ../files/sing-box.service + dest: /etc/systemd/system/sing-box.service + mode: '0644' + tags: network-tools + notify: + - reload_systemd + - enable_sing-box + - start_sing-box + - restart_sing-box + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + + - name: update shairport-sync + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/shairport-sync.conf + dest: /etc/shairport-sync.conf + - src: ../files/shairport-sync + dest: /usr/local/bin/shairport-sync + mode: '0755' + - src: ../files/shairport-sync.service + dest: /usr/lib/systemd/system/shairport-sync.service + - src: ../files/shairport_monitor.sh + dest: /usr/bin/shairport_monitor.sh + mode: '0755' + notify: + - reload_systemd + - enable_shairport_sync + - start_shairport_sync + + - name: update xplayer-server + copy: + src: "{{ item.src }}" + dest: "{{ item.dest }}" + mode: "{{ item.mode | default('0644') }}" + loop: + - src: ../files/xplayer-server.service + dest: /etc/systemd/system/xplayer-server.service + mode: '0644' + - src: ../files/server + dest: /usr/local/bin/server + mode: '0755' + notify: + - reload_systemd + - enable_xplayer_server + - start_xplayer_server + - restart_xplayer_server + register: copy_result + changed_when: copy_result.changed or (force_update | default(false) | bool) + + - name: Update firmware + copy: + src: /lib/firmware/ap6276p/ + dest: /lib/firmware/ap6275p/ + remote_src: yes + + handlers: + - name: cleanup_packages + apt: + autoremove: yes + autoclean: yes + + - name: restart_ssh + shell: + cmd: systemctl restart ssh + + - name: reload_systemd + shell: + cmd: systemctl daemon-reload + + - name: enable_bluetooth + shell: + cmd: systemctl enable bluetooth + - name: stop_bluetooth + shell: + cmd: systemctl stop bluetooth + + - name: start_bluetooth + shell: + cmd: systemctl start bluetooth + + - name: enable_mpd + shell: + cmd: systemctl enable mpd + + - name: stop_mpd + shell: + cmd: systemctl stop mpd + + - name: start_mpd + shell: + cmd: systemctl start mpd + + - name: restart_mpd + shell: + cmd: systemctl restart mpd + - name: enable_camilladsp + shell: + cmd: systemctl enable camilladsp + + - name: stop_camilladsp + shell: + cmd: systemctl stop camilladsp + + + - name: start_camilladsp + shell: + cmd: systemctl start camilladsp + + + - name: restart_camilladsp + shell: + cmd: systemctl restart camilladsp + + - name: restart_upmpdcli + shell: + cmd: systemctl restart upmpdcli + + - name: reload_udev + shell: + cmd: udevadm control --reload-rules && udevadm trigger + + - name: enable_shairport_sync + shell: + cmd: systemctl enable shairport-sync + + - name: stop_shairport_sync + shell: + cmd: systemctl stop shairport-sync + + - name: start_shairport_sync + shell: + cmd: systemctl start shairport-sync + + - name: restart_shairport_sync + shell: + cmd: systemctl restart shairport-sync + + - name: enable_xplayer_server + shell: + cmd: systemctl enable xplayer-server + + - name: start_xplayer_server + shell: + cmd: systemctl start xplayer-server + + - name: restart_xplayer_server + shell: + cmd: systemctl restart xplayer-server + + - name: reboot_required + shell: + cmd: echo "need reboot" + + - name: enable_sing-box + shell: + cmd: systemctl enable sing-box + + - name: start_sing-box + shell: + cmd: systemctl start sing-box + + - name: restart_sing-box + shell: + cmd: systemctl restart sing-box diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..98cf618 --- /dev/null +++ b/sync.sh @@ -0,0 +1,33 @@ +mkdir -p files +rsync am60:/etc/ssh/sshd_config files/sshd_config +rsync am60:/root/.ssh/authorized_keys files/authorized_keys +rsync am60:/etc/asound.conf files/asound.conf +rsync am60:/usr/local/bin/camilladsp files/camilladsp +rsync -avz am60:/root/camilladsp-conf files/ +rsync am60:/usr/local/lib/systemd/system/mpd.socket files/mpd.socket +rsync am60:/usr/local/lib/systemd/system/mpd.service files/mpd.service +rsync am60:/usr/local/bin/mpd files/mpd +rsync am60:/etc/mpd.conf files/mpd.conf +rsync am60:/etc/systemd/system/xplayer-server.service files/xplayer-server.service +rsync am60:/usr/local/bin/server files/server +rsync am60:/usr/bin/ota files/ota +rsync -avz am60:/etc/apt/sources.list.d ./files/ +rsync am60:/etc/modules files/modules +rsync am60:/etc/modprobe.d/snd-aloop.conf files/snd-aloop.conf +rsync am60:/etc/systemd/system/camilladsp.service files/camilladsp.service +rsync am60:/usr/lib/systemd/system/bluetooth.service files/bluetooth.service +rsync am60:/etc/udev/rules.d/99-usb-auto-mount.rules files/99-usb-auto-mount.rules +rsync am60:/usr/local/bin/usb-mount.sh files/usb-mount.sh +rsync am60:/etc/custom_service/start_service.sh files/start_service.sh +rsync am60:/etc/bluetooth/input.conf files/input.conf +rsync am60:/etc/bluetooth/main.conf files/main.conf +rsync am60:/etc/default/cpufrequtils files/cpufrequtils +rsync am60:/usr/lib/systemd/system/shairport-sync.service files/shairport-sync.service +rsync am60:/usr/local/bin/shairport-sync files/shairport-sync +rsync am60:/etc/shairport-sync.conf files/shairport-sync.conf +rsync am60:/usr/bin/shairport_monitor.sh files/shairport_monitor.sh +rsync am60:/etc/upmpdcli.conf files/upmpdcli.conf +rsync am60:/usr/bin/sing-box files/sing-box +rsync am60:/etc/systemd/system/sing-box.service files/sing-box.service +rsync -avz am60:/srv/login files/login +echo "done" \ No newline at end of file diff --git a/upload_to_qiniu.sh b/upload_to_qiniu.sh new file mode 100755 index 0000000..77984e9 --- /dev/null +++ b/upload_to_qiniu.sh @@ -0,0 +1,104 @@ +#!/bin/bash + +# 七牛云上传脚本 +# 需要环境变量: QINIU_ACCESS_KEY, QINIU_SECRET_KEY + +# 检查环境变量 +if [[ -z "$QINIU_ACCESS_KEY" ]] || [[ -z "$QINIU_SECRET_KEY" ]]; then + echo "错误: 请设置环境变量 QINIU_ACCESS_KEY 和 QINIU_SECRET_KEY" + exit 1 +fi + +# 硬编码存储空间和域名 +BUCKET="$QINIU_BUCKET" +QINIU_DOMAIN="$QINIU_DOMAIN" + +# 参数检查 +if [[ $# -lt 1 ]]; then + echo "使用方法: $0 <文件路径> [文件名(可选,默认使用原文件名)]" + echo "示例: $0 ./image.jpg" + echo " $0 ./image.jpg newname.jpg" + exit 1 +fi + +FILE_PATH="$1" +KEY="${2:-$(basename "$FILE_PATH")}" + +# 检查文件是否存在 +if [[ ! -f "$FILE_PATH" ]]; then + echo "错误: 文件不存在: $FILE_PATH" + exit 1 +fi + +# 七牛云API配置 - 华南广东区域 +QINIU_UPLOAD_URL="https://up-z2.qiniup.com" + +# 生成上传凭证的函数 +generate_upload_token() { + local bucket="$1" + local key="$2" + local deadline=$(($(date +%s) + 3600)) # 凭证1小时后过期(仅影响上传,不影响文件存储) + + # 构建上传策略 - 只使用bucket作为scope(允许上传到任意文件名) + local scope="${bucket}" + local put_policy="{\"scope\":\"${scope}\",\"deadline\":${deadline}}" + + # Base64编码上传策略(按照七牛云官方文档:先base64,再替换+/为-_,policy需要去掉=) + local encoded_put_policy=$(echo -n "$put_policy" | base64 | tr '+/' '-_' | tr -d '=') + + # 使用HMAC-SHA1签名(对编码后的策略进行签名) + # 注意:签名的base64编码不去掉=号! + local sign=$(echo -n "$encoded_put_policy" | openssl dgst -sha1 -hmac "$QINIU_SECRET_KEY" -binary | base64 | tr '+/' '-_') + + # 生成上传凭证 + echo "${QINIU_ACCESS_KEY}:${sign}:${encoded_put_policy}" +} + +# 生成上传凭证 +echo "正在生成上传凭证..." +UPLOAD_TOKEN=$(generate_upload_token "$BUCKET" "$KEY") + +# 上传文件 +echo "正在上传文件: $FILE_PATH 到 $QINIU_BUCKET/$KEY" +RESPONSE=$(curl -s -X POST \ + -F "token=${UPLOAD_TOKEN}" \ + -F "key=${KEY}" \ + -F "file=@${FILE_PATH}" \ + "${QINIU_UPLOAD_URL}") + +# 检查响应 +if [[ $? -eq 0 ]]; then + # 检查是否包含错误 + if echo "$RESPONSE" | grep -q "error"; then + echo "上传失败:" + echo "$RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$RESPONSE" + exit 1 + else + echo "上传成功!" + + # 尝试解析并显示文件信息 + if command -v python3 &> /dev/null; then + echo "$RESPONSE" | python3 -c " +import json, sys +try: + data = json.load(sys.stdin) + print(f\"文件名: {data.get('key', 'N/A')}\") + print(f\"Hash: {data.get('hash', 'N/A')}\") +except: + pass +" 2>/dev/null + fi + + # 显示下载地址 + DOWNLOAD_URL="${QINIU_DOMAIN}/${KEY}" + echo "" + echo "下载地址: ${DOWNLOAD_URL}" + echo "" + + # 返回下载地址给调用者 + echo "${DOWNLOAD_URL}" > /tmp/qiniu_upload_url.txt + fi +else + echo "上传失败: 网络请求错误" + exit 1 +fi \ No newline at end of file