first commit

This commit is contained in:
xin 2025-08-06 18:21:21 +08:00
commit e00a8f4847
10 changed files with 651 additions and 0 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
.vscode
output
libasound_module_pcm_cdsp.so
runtime.yml
wall
.envrc
*.tar.*
files

7
ansible.cfg Normal file
View File

@ -0,0 +1,7 @@
[defaults]
host_key_checking = False
timeout = 30
gathering = smart
fact_caching = memory

2
commit.sh Executable file
View File

@ -0,0 +1,2 @@
./sync.sh
./compress_and_upload_files.sh

74
compress_and_upload_files.sh Executable file
View File

@ -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

1
files_download.txt Normal file
View File

@ -0,0 +1 @@
http://xplayer-ota.pureroad.cn/files_20250806_175127.tar.xz

3
init.sh Executable file
View File

@ -0,0 +1,3 @@
apt-get update -y
apt-get install ansible-core -y
ansible-playbook playbooks/site.yml -e force_update=true

25
ota Executable file
View File

@ -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

394
playbooks/site.yml Normal file
View File

@ -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

33
sync.sh Executable file
View File

@ -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"

104
upload_to_qiniu.sh Executable file
View File

@ -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