@עידו כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:
זה שרת שלו
אם זה שרת שלו אז זה שלו, אצלי זה על שרת שלי ולכן תקלות בשרת קשורות אלי
@עידו כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:
זה שרת שלו
אם זה שרת שלו אז זה שלו, אצלי זה על שרת שלי ולכן תקלות בשרת קשורות אלי
@לעזור-לכולם כתב באיך להודיע ללקוח באופן אוטומטי כשיש תקלה בשימוש בAPI:
@שמואל-ש
אפשר לקבל את הסקריפט?
בכייף
הרבה בעזרת GPT...
<?php
include 'functions.php';
function log_message($message)
{
$logFile = __DIR__ . '/server_monitor.log';
date_default_timezone_set('Asia/Jerusalem');
file_put_contents($logFile, date('Y-m-d H:i:s') . ' - ' . $message . PHP_EOL, FILE_APPEND);
}
function send_mail($subject, $body)
{
emailSend("aaaaa@gmail.com", "", "זהירות!!! השרת לא תקין!", "$subject\n\n$body", "");
}
// 1. זיכרון RAM
$meminfo = file_get_contents('/proc/meminfo');
preg_match('/MemTotal:\s+(\d+)/', $meminfo, $total);
preg_match('/MemAvailable:\s+(\d+)/', $meminfo, $available);
$ram_total = (int)$total[1];
$ram_available = (int)$available[1];
$ram_used = $ram_total - $ram_available;
// 2. שימוש במעבד
function get_cpu_usage_per_core()
{
$stat1 = file('/proc/stat');
sleep(1); // המתנה קצרה למדידה מדויקת
$stat2 = file('/proc/stat');
$cpus = [];
foreach ($stat1 as $i => $line) {
if (strpos($line, 'cpu') !== 0 || strpos($line, 'cpu ') === 0) continue;
$parts1 = preg_split('/\s+/', trim($line));
$parts2 = preg_split('/\s+/', trim($stat2[$i]));
$total1 = array_sum(array_slice($parts1, 1));
$idle1 = $parts1[4];
$total2 = array_sum(array_slice($parts2, 1));
$idle2 = $parts2[4];
$total_diff = $total2 - $total1;
$idle_diff = $idle2 - $idle1;
$usage = 100 * (1 - $idle_diff / $total_diff);
$cpus[] = round($usage, 2);
}
return $cpus;
}
$cpu_usages = get_cpu_usage_per_core();
$cpu_count = count($cpu_usages);
$cpu_average = array_sum($cpu_usages) / $cpu_count;
// 3. דיסק
$disk_total = disk_total_space("/");
$disk_free = disk_free_space("/");
$disk_used = $disk_total - $disk_free;
log_message("*************");
// 4. בדיקת MySQL
$mysql_ok = true;
try {
$dbname = 'sql';
$serverName = "localhost";
$username = "name";
$pw = "pass";
$pdo = new PDO("mysql:host=$serverName;charset=utf8;dbname=$dbname", "$username", "$pw");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->query('SELECT 1');
} catch (Exception $e) {
$mysql_ok = false;
log_message("שגיאת mysql: " . $e->getMessage());
send_mail("שגיאת חיבור לmysql", $e->getMessage());
}
// 5. בדיקה כללית
$ram_used_in_gb = round($ram_used / 1024 / 1024, 2);
$ram_total_in_gb = round($ram_total / 1024 / 1024, 2);
log_message("ראם בשימוש: {$ram_used_in_gb} GB / {$ram_total_in_gb} GB");
log_message("מעבדים בשימוש: " . implode('% | ', $cpu_usages) . '%');
log_message("ממוצע שימוש במעבדים: " . round($cpu_average, 2) . "%");
log_message("זיכרון דיסק בשימוש: " . formatBytes($disk_used) . " / " . formatBytes($disk_total));
log_message("mysql חיבור ל: " . ($mysql_ok ? "OK" : "FAILED"));
$start_con = time();
$conn = shell_exec("curl -s -o /dev/null -w \"%{http_code}\" 'https://****.co.il'");
$end_con = time();
$conn_time = ($end_con - $start_con);
log_message("חיבור לשרת : $conn TIME: $conn_time");
log_message("*************\n----------");
// 6. שליחת מייל אם משהו לא תקין
if ($ram_available < 200000) { // פחות מ-200MB
send_mail("אין מספיק ראם זמין", "Only " . round($ram_available / 1024, 2) . " MB RAM available");
}
if (min($cpu_usages) >= 90) { // אם כל המעבדים מעל 90%
send_mail("שימוש מעבדים גבוה", "All CPU cores are over 90% usage.\nPer core: " . implode('% | ', $cpu_usages));
}
if ($disk_free < 8 * 1024 * 1024 * 1024) { // פחות מ־8GB
send_mail("זיכרון דיסק מלא", "Only " . round(($disk_free / $disk_total) * 100, 2) . "% disk space free");
}
if ($conn != '200' || $conn_time > 7) {
send_mail("לא ניתן להתחבר לשרת", "PING ZAKENU: $conn TIME: $conn_time");
}
// פונקציה לעיצוב
function formatBytes($bytes, $precision = 2)
{
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
$bytes = max($bytes, 0);
$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
$pow = min($pow, count($units) - 1);
$bytes /= pow(1024, $pow);
return round($bytes, $precision) . ' ' . $units[$pow];
}
חלק מהקוד בפרוייקט היה צריך להתחבר לשרת חיצוני לכן את הקריאת chrl לבדיקת תקינות החיבור
אגב על קריסת השרת עצמו אין לי בדיקה, אבל בחברת שרתים רגילה (למעט קונטבו למשל) זה לא קורה
@עידו למה ליידע את הלקוח? מה יהיה לו מהידע הזה? תיידע ישירות את מי שאמור לטפל בזה...
אני עשיתי אצלי סקריפט שבודק כל דקה האם יש חיבור לשרת, ואת ניצול כל המשאבים (ראם/מעבדים/זיכרון וכו') וכן בודק את החיבור לmysql שזה בעצם מכסה את רוב רובם של סוגי השגיאות מצד השרת (לא מצד הקוד עצמו)
ואם יש שגיאה כלשהיא הוא שולח לי מייל עם השגיאה
הרי ללקוח אין מה לעשות עם הודעה שהחיבור למסד נכשל, לא?
@HTML זה נראה ממש טוב
שאלתי אותו על מודול API והוא ידע להסביר איך זה עובד (מה שרוב הAI נכשלו)
גם באקסס פילטר הוא הסתדר טוב מאוד!
@y6714453 אה, שכחתי לציין שזה גם לא עבד בשימוש עם מספר:סיסמה
אני מנסה להריץ את זה (טשטשתי את הטוקן)
https://www.call2all.co.il/ym/api/CheckIfFileExists?token=eW10YQ.apik_4-XQIEhZOt22nE2stfjT7g.UIiueYNJriEh6PT3O2k4U6Yh_qlhZeSk&path=ivr2:files/file.wav
אך זה מסתובב ומסתובב המון זמן, ורק אחרי כמה דקות אני מקבל
{
"yemotAPIVersion": 6,
"responseStatus": "EXCEPTION",
"message": "Invalid yALogs request"
}
מה זה?
@שמואל
@yankl כולו עובד עם הapi של העלאת והורדת קבצים/קבלת מידע על השלוחה וכו'?
יש לך אינטרנט די מהיר...
@יהודה-צ-כ כתב בחדש! ניתוב שיחה ליעד מוגדר מראש במודול ניתוביה - ללא עלות יחידות!:
מהיום ניתן לקבל את השיחה המזוהה היישר אל הטלפון באמצעות המודול הזה!!!
ולשמוע פרסומת מעניינת על הדרך...
@מתעניין כתב בחדש! מודול שיתוף מערכת בין מאזינים:
לכאורה זה פיתרון לשידור חי מהמחשב ע"י סיפ.
אשמח להסבר ודוגמאות מית זה בא לשימוש
תודה
@שמואל כתב באבטחה - באימות דו שלבי / דעתכם... 🪪
:
@CUBASE @מוטי-לוין קיבלתם:
אני לא מבטיח שזה ישאר ככה ויעלה באמת בכל המנוע, נראה. כרגע זה עובד על מה שזה עלה עליו.
אדיר!
תודה רבה!
אבל באמת חייבים למצוא פיתרון לכל מי שפתח מערכת באחד הריסיילרים ועכשיו אין לו שום אמצעי לאימות
מה עושים כל האנשים האלה?
@y6714453 תודה רבה, הוספת לי הרבה בהירות בנושא!
@מים-אחרונים שני הערות
1.בקובץ manifest בערך matches אפשר לשנות לhttps://www.call2all.co.il/ym/index.php?view=ivr2 כך שיוצג רק בלשונית מערכת תוכן
2.כרגע מה שיש בגיטהאב זה אובייקט ולא מערך אז החלפתי אצלי
const resp = await fetch(url);
const data = await resp.json();
ITEMS = data;
ל
const resp = await fetch(url);
const data = await resp.json();
const arrays = Object.values(data);
const merged = arrays.flatMap(group => {
return Object.keys(group)
.filter(key => key !== 'id')
.map(key => group[key]);
});
ITEMS = merged;
@עידו כתב באבטחה - באימות דו שלבי / דעתכם... 🪪
:
באדיבות GPT (לקח לי המון זמן לעשות את זה, להסביר במדויק הכל זה לא פשוט!) הוכן כלי לבדיקת קוים אם מכילים משהו שיכול להיות כמו סיסמא וטוקן, הוא בודק אם יש token, Token, TOKEN או משהו בפורמט מספר:סיסמה. ככה מנהלי קוים יכולים לבדוק יחסית בקלות אם יש שם משהו שיצטרך שינוי. כמובן זה לא מכסה את כל המקרים, אבל עוזר.
מוזמנים לבדוק ולעדכן איך עובד.
הכל עובד מהדפדפן ככה שהסיסמה והמספר לא עוברים לשום מקום (חוץ מימות המשיח כמובן), אין לי אחריות על כלום, כפשוטו ממש!
חשוב גם שיבדוק אם יש פרמטר pass או password כי יש הרבה שלוקחים את המספר שהתקשר ורק את הסיסמה לוקחים מהשלוחה
עכשיו מישהו שלח לי דוגמא
אפשר לראות שם דוגמא של הודעה רגילה ודוגמא של תמונה של הודעת פלאש שקפצה

בשליחת סמס יש אפשרות של הודעת פלאש
האפשרות אכן עובדת?
מישהו יכול לשלוח תמונה איך זה מתקבל במכשיר המקבל אם בחרו בהודעת פלאש?
@שמואל עשיתי אצלי אימות דו שלבי ונכתב לי למעלה

אך כשנכנסתי למערכת בפעם הבאה קיבלתי שוב

יש לי כבר שיטות אימות

מה זה?
@שמואל כתב באבטחה - באימות דו שלבי / דעתכם... 🪪
:
יש בעיה.. כי מי שמשתמש עם API הוא יפסיק לעבוד. האפשרות היחידה להשתמש עם הapi ״המסורתי״ אחרי תאריך האכיפה - יהיה לעשות אימות דו שלבי עם ״זכור אותי״, וזה יפתח את הip לחודש.
כתבתי את זה ל @פלוס שכתב שחייבים כזה דבר אז ציטטתי לו שכתבת שאכן הולך להיות אימות דו שלבי
@שמואל כתב באבטחה - באימות דו שלבי / דעתכם... 🪪
:
מאחרי התאריך, הAPI לא ממש יעבוד בצורה הנוכחית, כי כן, יהיה צריך אימות דו-שלבי גם בו.
אז מה הבעיה?