גיבוי המערכת שלכם במחשב האישי בלחיצת כפתור!!!
-
@isi
טוב.
אז בבעיה של הסריקה של שלוחות 00 ומעלה טיפלתי וגם בקובץ ההגדרות בשלוחה הראשית.
הבעיה בקבצי הini היא שבימות לא מוגדר שיסרוק את כל הקבצים בסיומת הזו חוץ מקובץ ההגדרות.
הברירה היחידה היא ליצור מאגר של קבצי הini במערכות של ימות ולהריץ על כולם סריקה.
אני אנסה להכניס כמה שיותר אבל אצטרך לעזרה.
אז כל מי שיכלו לעדכן כמה שיותר קבצי ini שהוא זוכר שאוכל לעדכן כמה שיותר. -
אני רוצה לשפר את האפשרות הזו של גיבוי המערכת למשהו גדול יותר שיעזור לבעלי המערכות.
לצורך כך אני מעוניין להשתמש גם בסקריפט מסויים.
אך העניין הוא שאני משתמש בנטפרי והם חוסמים את הסקריפטים ולא פותחים ללא צורך אמיתי.
אשמח אם יש מי שיוכל לעזור לי בבחינת הסקריפט ובהרצה שלו או לחילופין (וכך עדיף) לשלוח לנטפרי בקשה לפתוח את הסקריפט.
אשמח לעזרה מכל מי שיוכל. -
@אA כתב בגיבוי המערכת שלכם במחשב האישי בלחיצת כפתור!!!:
@isi
טוב.
אז בבעיה של הסריקה של שלוחות 00 ומעלה טיפלתי וגם בקובץ ההגדרות בשלוחה הראשית.
הבעיה בקבצי הini היא שבימות לא מוגדר שיסרוק את כל הקבצים בסיומת הזו חוץ מקובץ ההגדרות.
הברירה היחידה היא ליצור מאגר של קבצי הini במערכות של ימות ולהריץ על כולם סריקה.
אני אנסה להכניס כמה שיותר אבל אצטרך לעזרה.
אז כל מי שיכלו לעדכן כמה שיותר קבצי ini שהוא זוכר שאוכל לעדכן כמה שיותר.אני משתמש ב:
EnterIDValName
WhitelList
BlackListאז בבעיה של הסריקה של שלוחות 00 ומעלה טיפלתי וגם בקובץ ההגדרות בשלוחה הראשית.
האם תוכל להעלות את התוכנה המותקנת. ממש תודה מכל הלב!
-
@isi
אני ממש עכשיו עושה הרצה אחרונה ומקווה שכל הבאגים סודרו. -
גירסא חדשה
תוקן הבאג שלא קרא גם את שלוחות 00-09 וכן ניתן להוסיף קבצי ini לסריקה בשורה 65 בסוגרים, עושים , 'שם הקובץ' וזהו!יש שדרוג שאני רוצה להוסיף, ואשמח אם יש מישהו שיוכל לעזור לי בהרצה של סקריפט לבדיקות או בשליחת בקשה לנטפרי לפתיחת סקריפט לציבור לצורך גיבוי מערכות בימות המשיח.
הקוד
<!DOCTYPE html> <html lang="he" dir="rtl"> <head> <meta charset="UTF-8"> <title>גיבוי מערכות בימות המשיח INI</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script> <style> body { font-family: 'Segoe UI', Tahoma, sans-serif; margin: 20px; background-color: #f4f7f6; text-align: right; direction: rtl; } .container { max-width: 1100px; margin: auto; background: white; padding: 25px; border-radius: 12px; box-shadow: 0 4px 15px rgba(0,0,0,0.1); } .section { border: 1px solid #e0e0e0; padding: 15px; margin-bottom: 15px; border-radius: 8px; background: #fafafa; } #logArea { background: #1e1e1e; color: #d4d4d4; padding: 15px; border-radius: 5px; height: 250px; overflow-y: auto; font-family: 'Consolas', monospace; font-size: 13px; margin-top: 10px; } .log-info { color: #4fc3f7; } .log-success { color: #00ff00; font-weight: bold; } .log-error { color: #ff5252; } button { padding: 10px 20px; background: #3498db; color: white; border: none; cursor: pointer; border-radius: 5px; font-weight: bold; } button:disabled { background: #bdc3c7; } input { padding: 10px; margin: 5px; border: 1px solid #ccc; border-radius: 4px; } .progress-container { background: #e0e0e0; border-radius: 20px; height: 25px; margin: 15px 0; overflow: hidden; display: none; } .progress-bar { width: 0%; height: 100%; background: linear-gradient(90deg, #3498db, #2ecc71); transition: width 0.1s; color: white; text-align: center; line-height: 25px; font-weight: bold; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { border: 1px solid #ddd; padding: 10px; text-align: right; } </style> </head> <body> <div class="container"> <h2>גיבוי מערכות בימות המשיח</h2> <div class="section"> <strong>⚙️ הגדרות:</strong> כמות ספרות מקסימלית: <input type="number" id="digitCount" style="width:50px;" value="2"> שם קובץ ZIP: <input type="text" id="fileNameInput" value="full_system_backup"> </div> <div class="section"> <strong>1. סריקה</strong><br> טוקן: <input type="text" id="srcToken" style="width:300px;" placeholder="הכנס טוקן כאן..."> נתיב התחלה: <input type="text" id="srcPath" style="width:100px;" value="/"> <button onclick="loadInitialList()">טען רשימת קבצים</button> </div> <div class="section"> <strong>2. הורדת הקבצים</strong><br> <div id="statsBar" style="font-weight:bold; margin-bottom:5px;">ממתין לפעולה...</div> <div class="progress-container" id="progContainer"> <div id="progBar" class="progress-bar">0%</div> </div> <button id="downloadBtn" onclick="startDeepDownload()" disabled style="background:#27ae60;">בחר מיקום והורד גיבוי</button> <div id="logArea">מוכן לסריקה...</div> </div> <div id="fileArea" style="display:none;"> <table> <thead> <tr style="background:#eee"> <th style="width: 40px;"><input type="checkbox" id="masterCheck" checked onclick="toggleAll(this)"></th> <th>סוג</th> <th>שם</th> </tr> </thead> <tbody id="fileTableBody"></tbody> </table> </div> </div> <script> const INI_FILES = ['ext', 'ivr', 'EnterIDValName', 'EnterIDBlock', 'WhitelList', 'BlackList']; let totalBytes = 0; let startTime = 0; function addLog(msg, type = '') { const logArea = document.getElementById('logArea'); const div = document.createElement('div'); div.className = `log-${type}`; div.innerHTML = `[${new Date().toLocaleTimeString()}] ${msg}`; logArea.appendChild(div); logArea.scrollTop = logArea.scrollHeight; } function updateProgress(percent, text) { const container = document.getElementById('progContainer'); const bar = document.getElementById('progBar'); container.style.display = 'block'; bar.style.width = percent + '%'; bar.innerText = text ? `${text} (${percent}%)` : `${percent}%`; } async function checkItemExists(token, path, name) { const fullPath = (path + '/' + name).replace(/\/+/g, '/'); try { const dRes = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${fullPath}`); const dData = await dRes.json(); if (dData.responseStatus === "OK") return { name, type: "DIR" }; const fRes = await fetch(`https://www.call2all.co.il/ym/api/GetTextFile?token=${token}&what=ivr2:${fullPath}.ini`); const fData = await fRes.json(); if (fData.contents !== undefined) return { name: name + ".ini", type: "FILE" }; } catch (e) {} return null; } async function loadInitialList() { const token = document.getElementById('srcToken').value.trim(); const path = document.getElementById('srcPath').value.trim(); const digits = parseInt(document.getElementById('digitCount').value) || 2; if (!token) { alert("נא להזין טוקן"); return; } addLog(`מתחיל סריקה: ${path}`, "info"); const tbody = document.getElementById('fileTableBody'); tbody.innerHTML = ''; const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${path}`); const data = await res.json(); let foundMap = new Map(); if (data.files) data.files.forEach(f => foundMap.set(f.name, f)); // 1. סריקת קבצי INI בתיקיית השורש שנבחרה (חדש!) for (let ini of INI_FILES) { let iniName = ini + ".ini"; if (!foundMap.has(iniName)) { let found = await checkItemExists(token, path, ini); if (found) foundMap.set(found.name, { name: found.name, fileType: found.type }); } } // 2. ניחוש שלוחות חבויות const max = Math.pow(10, digits); for (let i = 0; i < max; i++) { let n = i.toString(); let candidates = new Set([n]); for (let d = 1; d <= digits; d++) candidates.add(n.padStart(d, '0')); for (let cand of candidates) { if (!foundMap.has(cand) && !foundMap.has(cand + ".ini")) { let found = await checkItemExists(token, path, cand); if (found) foundMap.set(found.name, { name: found.name, fileType: found.type }); } } if (i % 10 === 0) updateProgress(Math.round((i/max)*100), "סורק:"); } const sorted = Array.from(foundMap.values()).sort((a,b) => a.name.localeCompare(b.name, undefined, {numeric: true})); sorted.forEach(f => { tbody.insertAdjacentHTML('beforeend', `<tr><td><input type="checkbox" class="file-check" data-name="${f.name}" data-type="${f.fileType}" checked></td><td>${f.fileType === "DIR" ? "שלוחה" : "קובץ"}</td><td>${f.name}</td></tr>`); }); document.getElementById('fileArea').style.display = 'block'; document.getElementById('downloadBtn').disabled = false; updateProgress(100, "סריקה הושלמה"); } async function processDeep(token, path, name, type, zipFolder) { const fullPath = (path + '/' + name).replace(/\/+/g, '/'); const digits = parseInt(document.getElementById('digitCount').value) || 2; if (type === "DIR") { addLog(`סורק שלוחה: ${fullPath}`, "info"); const currentFolder = zipFolder.folder(name); const res = await fetch(`https://www.call2all.co.il/ym/api/GetIVR2Dir?token=${token}&path=${fullPath}`); const data = await res.json(); let children = data.files || []; let namesSet = new Set(children.map(c => c.name)); // ניחוש חבויים בתוך השלוחה for (let i = 0; i < Math.pow(10, digits); i++) { let n = i.toString(); let candidates = new Set([n]); for (let d = 1; d <= digits; d++) candidates.add(n.padStart(d, '0')); for (let cand of candidates) { if (!namesSet.has(cand) && !namesSet.has(cand + ".ini")) { let found = await checkItemExists(token, fullPath, cand); if (found) { children.push({ name: found.name, fileType: found.type }); namesSet.add(found.name); } } } } // בדיקת קבצי INI בתוך השלוחה for (let ini of INI_FILES) { let iniName = ini + ".ini"; if (!namesSet.has(iniName)) { let found = await checkItemExists(token, fullPath, ini); if (found) children.push({ name: found.name, fileType: found.type }); } } for (let child of children) { await processDeep(token, fullPath, child.name, child.fileType, currentFolder); } } else { try { const res = await fetch(`https://www.call2all.co.il/ym/api/DownloadFile?token=${token}&path=ivr2:${fullPath}`); const blob = await res.blob(); totalBytes += blob.size; const elapsed = (Date.now() - startTime) / 1000 || 1; const speed = (totalBytes / 1024 / elapsed).toFixed(2); document.getElementById('statsBar').innerText = `מהירות: ${speed} KB/s | סה"כ: ${(totalBytes/1024/1024).toFixed(2)} MB`; zipFolder.file(name.endsWith('.ini') ? name + ".txt" : name, blob); } catch (e) { addLog(`שגיאה בהורדת ${fullPath}`, "error"); } } } async function startDeepDownload() { const token = document.getElementById('srcToken').value.trim(); const basePath = document.getElementById('srcPath').value.trim(); const selected = Array.from(document.querySelectorAll('.file-check:checked')); if (selected.length === 0) return; let fileHandle; try { fileHandle = await window.showSaveFilePicker({ suggestedName: document.getElementById('fileNameInput').value + ".zip", types: [{ description: 'ZIP file', accept: {'application/zip': ['.zip']} }] }); } catch (e) { return; } const zip = new JSZip(); document.getElementById('downloadBtn').disabled = true; totalBytes = 0; startTime = Date.now(); for (let i = 0; i < selected.length; i++) { updateProgress(Math.round((i / selected.length) * 100), "מוריד קבצים..."); const currentBasePath = basePath === '/' ? '' : basePath; await processDeep(token, currentBasePath, selected[i].dataset.name, selected[i].dataset.type, zip); } addLog("סוגר קובץ ZIP...", "success"); const content = await zip.generateAsync({ type: "blob" }); const writable = await fileHandle.createWritable(); await writable.write(content); await writable.close(); updateProgress(100, "הושלם!"); addLog("✅ הגיבוי הסתיים בהצלחה!", "success"); document.getElementById('downloadBtn').disabled = false; } function toggleAll(source) { document.querySelectorAll('.file-check').forEach(cb => cb.checked = source.checked); } </script> </body> </html> -
@ivrפון
העלתי גירסא חדשה ומתוקנת -
@אA
מה חדש ונוסף בזה? -
@R.E.T-מערכות
הוספתי פירוט מעל הקוד. -
אני מעלה תוכנה שיוצרת תוכנות מקבצי html.
אפשר לקחת את כל קבצי הhtml שבפורום להכניס לתוכנה והיא אורזת אותם לתוכנה ניידת.
בהצלחה!
בונה_התוכנות.zip -
@אA נראה שזה עובד מצוין.
תודה רבה גדולה!!!רק אציין שאת כל קבצי ה INI הוא לא מוריד כקובץ INI אלא כקובץ TXT.
למשל את הקובץ EnterIDValName.ini הוא יוריד כשם מלא ויוסיף לו סיומת txt ואז שם הקובץ יראה: EnterIDValName.ini.txt
לא נורא, כי אחרי הכל זה לגיבוי.
אבל אם זה דבר שניתן לסידור בקלות, אז יכול להיות שכדאי לסדר לעתיד.ושוב, תודה רבה!!!