mirror of
https://github.com/community-scripts/ProxmoxVE.git
synced 2026-02-03 20:03:25 +01:00
Compare commits
11 Commits
2026-02-02
...
github-act
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
30f2a6ea6d | ||
|
|
baabbc4d53 | ||
|
|
89e53f9245 | ||
|
|
7c0a812b3d | ||
|
|
6411ae1d37 | ||
|
|
6967029ae3 | ||
|
|
3621a4ef35 | ||
|
|
586a436f3d | ||
|
|
97e37cfb1f | ||
|
|
24b2a945d5 | ||
|
|
40780edbd2 |
79
.github/workflows/lock-issue.yaml
generated
vendored
79
.github/workflows/lock-issue.yaml
generated
vendored
@@ -18,7 +18,6 @@ jobs:
|
||||
with:
|
||||
script: |
|
||||
const daysBeforeLock = 3;
|
||||
const cutoffDate = new Date('2026-01-27T00:00:00Z');
|
||||
const lockDate = new Date();
|
||||
lockDate.setDate(lockDate.getDate() - daysBeforeLock);
|
||||
|
||||
@@ -29,48 +28,50 @@ jobs:
|
||||
/dependabot/i
|
||||
];
|
||||
|
||||
// Search for closed, unlocked issues older than 3 days
|
||||
const issues = await github.rest.search.issuesAndPullRequests({
|
||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
||||
per_page: 50
|
||||
});
|
||||
// Search for closed, unlocked issues older than 3 days (paginated, oldest first)
|
||||
let page = 1;
|
||||
let totalLocked = 0;
|
||||
|
||||
console.log(`Found ${issues.data.items.length} issues/PRs to process`);
|
||||
|
||||
for (const item of issues.data.items) {
|
||||
// Skip excluded items
|
||||
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||
if (shouldExclude) {
|
||||
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||
continue;
|
||||
}
|
||||
while (true) {
|
||||
const issues = await github.rest.search.issuesAndPullRequests({
|
||||
q: `repo:${context.repo.owner}/${context.repo.repo} is:closed is:unlocked updated:<${lockDate.toISOString().split('T')[0]}`,
|
||||
sort: 'updated',
|
||||
order: 'asc',
|
||||
per_page: 100,
|
||||
page: page
|
||||
});
|
||||
|
||||
const createdAt = new Date(item.created_at);
|
||||
const isNew = createdAt >= cutoffDate;
|
||||
if (issues.data.items.length === 0) break;
|
||||
|
||||
try {
|
||||
// Add comment only for new issues (created after 2026-01-27)
|
||||
if (isNew) {
|
||||
const comment = item.pull_request
|
||||
? 'This pull request has been automatically locked. Please open a new issue for related bugs.'
|
||||
: 'This issue has been automatically locked. Please open a new issue for related bugs and reference this issue if needed.';
|
||||
|
||||
await github.rest.issues.createComment({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
body: comment
|
||||
});
|
||||
console.log(`Page ${page}: ${issues.data.items.length} items (total available: ${issues.data.total_count})`);
|
||||
|
||||
for (const item of issues.data.items) {
|
||||
// Skip excluded items
|
||||
const shouldExclude = excludePatterns.some(pattern => pattern.test(item.title));
|
||||
if (shouldExclude) {
|
||||
console.log(`Skipped #${item.number}: "${item.title}" (matches exclude pattern)`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Lock the issue/PR
|
||||
await github.rest.issues.lock({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
lock_reason: 'resolved'
|
||||
});
|
||||
|
||||
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||
} catch (error) {
|
||||
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
||||
try {
|
||||
// Lock the issue/PR silently
|
||||
await github.rest.issues.lock({
|
||||
...context.repo,
|
||||
issue_number: item.number,
|
||||
lock_reason: 'resolved'
|
||||
});
|
||||
|
||||
totalLocked++;
|
||||
console.log(`Locked #${item.number} (${item.pull_request ? 'PR' : 'Issue'})`);
|
||||
} catch (error) {
|
||||
console.log(`Failed to lock #${item.number}: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
page++;
|
||||
|
||||
// GitHub search API limit: max 10000 results (100 pages * 100) - temporarily increased
|
||||
if (page > 100) break;
|
||||
}
|
||||
|
||||
console.log(`Total locked: ${totalLocked} issues/PRs`);
|
||||
|
||||
16
CHANGELOG.md
16
CHANGELOG.md
@@ -774,6 +774,22 @@ Exercise vigilance regarding copycat or coat-tailing sites that seek to exploit
|
||||
|
||||
## 2026-02-03
|
||||
|
||||
### 🚀 Updated Scripts
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- [FIX] Shelfmark: unpin Chromium version [@vhsdream](https://github.com/vhsdream) ([#11505](https://github.com/community-scripts/ProxmoxVE/pull/11505))
|
||||
|
||||
- #### ✨ New Features
|
||||
|
||||
- [FEAT] Scanopy: automatically update integrated daemon [@vhsdream](https://github.com/vhsdream) ([#11506](https://github.com/community-scripts/ProxmoxVE/pull/11506))
|
||||
|
||||
### 🌐 Website
|
||||
|
||||
- #### 🐞 Bug Fixes
|
||||
|
||||
- fix(frontend): decouple table pagination from summary fetching [@ls-root](https://github.com/ls-root) ([#11495](https://github.com/community-scripts/ProxmoxVE/pull/11495))
|
||||
|
||||
## 2026-02-02
|
||||
|
||||
### 🆕 New Scripts
|
||||
|
||||
@@ -67,11 +67,18 @@ function update_script() {
|
||||
mv ./target/release/server /usr/bin/scanopy-server
|
||||
msg_ok "Built scanopy-server"
|
||||
|
||||
[[ -f /etc/systemd/system/scanopy-daemon.service ]] &&
|
||||
fetch_and_deploy_gh_release "scanopy" "scanopy/scanopy" "singlefile" "latest" "/usr/local/bin" "scanopy-daemon-linux-amd64" &&
|
||||
rm -f /usr/bin/scanopy-daemon ~/configure_daemon.sh &&
|
||||
sed -i -e 's|usr/bin|usr/local/bin|' \
|
||||
-e 's/push/daemon_poll/' \
|
||||
-e 's/pull/server_poll/' /etc/systemd/system/scanopy-daemon.service &&
|
||||
systemctl daemon-reload
|
||||
|
||||
msg_info "Starting services"
|
||||
systemctl start scanopy-server
|
||||
[[ -f /etc/systemd/system/scanopy-daemon.service ]] && systemctl start scanopy-daemon
|
||||
msg_ok "Updated successfully!"
|
||||
msg_warn "Update your integrated daemon via the UI"
|
||||
fi
|
||||
exit
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"generated": "2026-02-03T00:21:55Z",
|
||||
"generated": "2026-02-03T18:19:44Z",
|
||||
"versions": [
|
||||
{
|
||||
"slug": "2fauth",
|
||||
@@ -186,9 +186,9 @@
|
||||
{
|
||||
"slug": "comfyui",
|
||||
"repo": "comfyanonymous/ComfyUI",
|
||||
"version": "v0.11.1",
|
||||
"version": "v0.12.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-29T07:52:21Z"
|
||||
"date": "2026-02-03T08:54:29Z"
|
||||
},
|
||||
{
|
||||
"slug": "commafeed",
|
||||
@@ -543,9 +543,9 @@
|
||||
{
|
||||
"slug": "jackett",
|
||||
"repo": "Jackett/Jackett",
|
||||
"version": "v0.24.1012",
|
||||
"version": "v0.24.1019",
|
||||
"pinned": false,
|
||||
"date": "2026-02-02T11:05:14Z"
|
||||
"date": "2026-02-03T06:01:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "joplin-server",
|
||||
@@ -746,9 +746,9 @@
|
||||
{
|
||||
"slug": "mealie",
|
||||
"repo": "mealie-recipes/mealie",
|
||||
"version": "v3.10.0",
|
||||
"version": "v3.10.1",
|
||||
"pinned": false,
|
||||
"date": "2026-02-02T18:32:52Z"
|
||||
"date": "2026-02-03T01:04:38Z"
|
||||
},
|
||||
{
|
||||
"slug": "mediamanager",
|
||||
@@ -830,9 +830,9 @@
|
||||
{
|
||||
"slug": "netbox",
|
||||
"repo": "netbox-community/netbox",
|
||||
"version": "v4.5.1",
|
||||
"version": "v4.5.2",
|
||||
"pinned": false,
|
||||
"date": "2026-01-20T19:45:05Z"
|
||||
"date": "2026-02-03T13:54:26Z"
|
||||
},
|
||||
{
|
||||
"slug": "nocodb",
|
||||
@@ -879,9 +879,9 @@
|
||||
{
|
||||
"slug": "opengist",
|
||||
"repo": "thomiceli/opengist",
|
||||
"version": "v1.12.0",
|
||||
"version": "v1.12.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-27T15:31:57Z"
|
||||
"date": "2026-02-03T09:00:43Z"
|
||||
},
|
||||
{
|
||||
"slug": "ots",
|
||||
@@ -1201,9 +1201,9 @@
|
||||
{
|
||||
"slug": "scanopy",
|
||||
"repo": "scanopy/scanopy",
|
||||
"version": "v0.14.1",
|
||||
"version": "v0.14.2",
|
||||
"pinned": false,
|
||||
"date": "2026-02-02T04:15:19Z"
|
||||
"date": "2026-02-03T00:35:22Z"
|
||||
},
|
||||
{
|
||||
"slug": "scraparr",
|
||||
@@ -1355,9 +1355,9 @@
|
||||
{
|
||||
"slug": "thingsboard",
|
||||
"repo": "thingsboard/thingsboard",
|
||||
"version": "v4.3",
|
||||
"version": "v4.3.0.1",
|
||||
"pinned": false,
|
||||
"date": "2026-01-20T14:27:07Z"
|
||||
"date": "2026-02-03T12:39:14Z"
|
||||
},
|
||||
{
|
||||
"slug": "threadfin",
|
||||
@@ -1607,9 +1607,9 @@
|
||||
{
|
||||
"slug": "zwave-js-ui",
|
||||
"repo": "zwave-js/zwave-js-ui",
|
||||
"version": "v11.10.1",
|
||||
"version": "v11.11.0",
|
||||
"pinned": false,
|
||||
"date": "2026-01-15T15:58:06Z"
|
||||
"date": "2026-02-03T13:13:05Z"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -94,7 +94,8 @@ const chartConfigApps = {
|
||||
export default function DataPage() {
|
||||
const [data, setData] = useState<DataModel[]>([]);
|
||||
const [summary, setSummary] = useState<SummaryData | null>(null);
|
||||
const [loading, setLoading] = useState<boolean>(true);
|
||||
const [summaryLoading, setSummaryLoading] = useState<boolean>(true);
|
||||
const [dataLoading, setDataLoading] = useState<boolean>(true);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [currentPage, setCurrentPage] = useState(1);
|
||||
const [itemsPerPage, setItemsPerPage] = useState(25);
|
||||
@@ -105,35 +106,40 @@ export default function DataPage() {
|
||||
|
||||
const nf = new Intl.NumberFormat("en-US", { maximumFractionDigits: 0 });
|
||||
|
||||
// Fetch summary only once on mount
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
setLoading(true);
|
||||
const fetchSummary = async () => {
|
||||
try {
|
||||
const [summaryRes, dataRes] = await Promise.all([
|
||||
fetch("https://api.htl-braunau.at/data/summary"),
|
||||
fetch(
|
||||
`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${
|
||||
itemsPerPage === 0 ? "" : itemsPerPage
|
||||
}`,
|
||||
),
|
||||
]);
|
||||
|
||||
const summaryRes = await fetch("https://api.htl-braunau.at/data/summary");
|
||||
if (!summaryRes.ok) {
|
||||
throw new Error(`Failed to fetch summary: ${summaryRes.statusText}`);
|
||||
}
|
||||
const summaryData: SummaryData = await summaryRes.json();
|
||||
setSummary(summaryData);
|
||||
} catch (err) {
|
||||
setError((err as Error).message);
|
||||
} finally {
|
||||
setSummaryLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
fetchSummary();
|
||||
}, []);
|
||||
|
||||
useEffect(() => {
|
||||
const fetchData = async () => {
|
||||
setDataLoading(true);
|
||||
try {
|
||||
const dataRes = await fetch(`https://api.htl-braunau.at/data/paginated?page=${currentPage}&limit=${itemsPerPage}`);
|
||||
if (!dataRes.ok) {
|
||||
throw new Error(`Failed to fetch data: ${dataRes.statusText}`);
|
||||
}
|
||||
|
||||
const summaryData: SummaryData = await summaryRes.json();
|
||||
const pageData: DataModel[] = await dataRes.json();
|
||||
|
||||
setSummary(summaryData);
|
||||
setData(pageData);
|
||||
} catch (err) {
|
||||
setError((err as Error).message);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
setDataLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -306,7 +312,7 @@ export default function DataPage() {
|
||||
</CardHeader>
|
||||
<CardContent className="pl-2">
|
||||
<div className="h-[300px] w-full">
|
||||
{loading ? (
|
||||
{summaryLoading ? (
|
||||
<div className="flex h-full w-full items-center justify-center">
|
||||
<Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
|
||||
</div>
|
||||
@@ -411,7 +417,7 @@ export default function DataPage() {
|
||||
</TableRow>
|
||||
</TableHeader>
|
||||
<TableBody>
|
||||
{loading ? (
|
||||
{dataLoading ? (
|
||||
<TableRow>
|
||||
<TableCell colSpan={8} className="h-24 text-center">
|
||||
<div className="flex items-center justify-center gap-2">
|
||||
@@ -478,7 +484,7 @@ export default function DataPage() {
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => setCurrentPage((prev) => Math.max(prev - 1, 1))}
|
||||
disabled={currentPage === 1 || loading}
|
||||
disabled={currentPage === 1 || dataLoading}
|
||||
>
|
||||
<ChevronLeft className="mr-2 h-4 w-4" />
|
||||
Previous
|
||||
@@ -488,7 +494,7 @@ export default function DataPage() {
|
||||
variant="outline"
|
||||
size="sm"
|
||||
onClick={() => setCurrentPage((prev) => prev + 1)}
|
||||
disabled={loading || sortedData.length < itemsPerPage}
|
||||
disabled={dataLoading || sortedData.length < itemsPerPage}
|
||||
>
|
||||
Next
|
||||
<ChevronRight className="ml-2 h-4 w-4" />
|
||||
|
||||
@@ -105,14 +105,13 @@ elif [[ "$DEPLOYMENT_TYPE" == "4" ]]; then
|
||||
sed -i '/_BYPASS=/s/true/false/' /etc/shelfmark/.env
|
||||
else
|
||||
DEPLOYMENT_TYPE="1"
|
||||
CHROME_VERSION=$(curl -fsSL https://raw.githubusercontent.com/calibrain/shelfmark/refs/heads/main/Dockerfile | sed -n '/chromium=/s/[^=]*=//p' | awk '{print $1}')
|
||||
msg_info "Installing internal bypasser dependencies"
|
||||
$STD apt install -y --no-install-recommends \
|
||||
xvfb \
|
||||
ffmpeg \
|
||||
chromium-common=${CHROME_VERSION} \
|
||||
chromium=${CHROME_VERSION} \
|
||||
chromium-driver=${CHROME_VERSION} \
|
||||
chromium-common \
|
||||
chromium \
|
||||
chromium-driver \
|
||||
python3-tk
|
||||
msg_ok "Installed internal bypasser dependencies"
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user