Вывести уровни сигнала соединений:
1 |
/interface wireless registration-table> print |
Включить сервис API:
1 |
/ip service> enable 5 |
Вывести уровни сигнала соединений:
1 |
/interface wireless registration-table> print |
Включить сервис API:
1 |
/ip service> enable 5 |
Чтобы получилось примерно такое:
Нужно выполнить довольно много телодвижений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
// кнопка фильтров var listBoxItems = ['111', '222'] .map(function(title) { return new ymaps.control.ListBoxItem({ data: { content: title }, state: { selected: false } }) }), // Список listBoxControl = new ymaps.control.ListBox({ data: { content: 'Фильтр', title: 'Фильтр' }, items: listBoxItems, state: { // Признак, развернут ли список. expanded: false, filters: listBoxItems.reduce(function(filters, filter) { filters[filter.data.get('content')] = filter.isSelected(); return filters; }, {}) } }); myMap.controls.add(listBoxControl); listBoxControl.events.add(['select', 'deselect'], function(e) { var listBoxItem = e.get('target'); console.log(e); var filters = ymaps.util.extend({}, listBoxControl.state.get('filters')); filters[listBoxItem.data.get('content')] = listBoxItem.isSelected(); console.log(filters); listBoxControl.state.set('filters', filters); }); |
Задача: отобразить на карте ОЧЕНЬ большого количества обьектов на карте:
Решение: для отображения используем ObjectManager с включенной кластеризаций, кроме того, обекты загружаем через JSON с типом «Feature» — т.е. метки загружаются ни как обьекты, а как «теневой массив», который не умеет отображать контент,хинты и имеет еще ряд ограничений. Этот момент мы обходим следующим образом: при наведении курсора мышки на метку, мы переносим её в «обьекты».
javascript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
var myMap; latitude=55.76; longitude=37.64; navigator.geolocation.getCurrentPosition( function(location) { latitude=location.coords.latitude; longitude=location.coords.longitude; accuracy=location.coords.accuracy; ymaps.ready(init); }, function(error){ ymaps.ready(init); } ); function init () { console.log("-инициируем карту в "+latitude+" и "+longitude); myMap = new ymaps.Map('map', { center: [latitude, longitude], controls: ['trafficControl','zoomControl','routeButtonControl','routeEditor'], zoom: 15 }, { searchControlProvider: 'yandex#search' }); if (isMobile.any()) { console.log("-открыто на мобильнике - отключаем мультитач"); //myMap.behaviors.disable('drag'); myMap.behaviors.disable('multiTouch'); } LoadEVCByCar(<?=$Users->defaultcar?>); } function LoadEVCByCar(carcode){ //очищаем холст myMap.geoObjects.removeAll(); NormalCollection = new ymaps.GeoObjectCollection(); //теневые не полноценные обьекты загружаем скопом objectManager = new ymaps.ObjectManager({clusterize: true}); myMap.geoObjects.add(objectManager); $.post("csdcsdcs", { carcode:carcode, latitude:latitude, longitude:longitude }).done(function(data) { jsond=JSON.parse(data); objectManager.add(jsond); }); // по событию "попадание мышкой" теневой обьект удаляем и создаем "настоящий" полноценный, с которым далее и работаем.. objectManager.objects.events.add(['mouseenter', 'mouseleave'], Shadow2Normal); }; function Shadow2Normal (e) { aa=e; console.log(e); if (e.get('type') == 'mouseenter') { objectIdcur = e.get('objectId'); newob=objectManager.objects.getById(objectIdcur); myMap.geoObjects.remove([objectIdcur]); objectManager.remove([objectIdcur]); newob.options["draggable"]=false; newob.options["id"]=newob.id; NormalObject = new ymaps.GeoObject( { id: newob.id, geometry : newob.geometry, properties: newob.properties }, newob.options ); NormalCollection.add(NormalObject); //добавляем в коллекцию myMap.geoObjects.add(NormalCollection); // добавляем на холст }; } |
PHP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $JsonEVCS=array(); $JsonEVCS["type"]="FeatureCollection"; $longitude= _POST("longitude"); $latitude= _POST("latitude"); $carcode= _POST("carcode"); for ($i = 1; $i <= 10000; $i++) { $evcs_info=array(); $evcs_info["type"]="Feature"; $evcs_info["id"]=$i; $evcs_info["geometry"]["type"]="Point"; $m1=rand(0,1);if ($m1==0){$m1=-1;}; $m2=rand(0,1);if ($m2==0){$m2=-1;}; $evcs_info["geometry"]["coordinates"]=array($latitude+$m1*rand(1,200)/100,$longitude+$m2*rand(1,200)/100); $evcs_info["properties"]["balloonContent"]="html код"; $evcs_info["properties"]["hintContent"]="Подсказка"; $evcs_info["properties"]["data"]["ip"]="32у23"; $evcs_info["options"]["preset"]="islands#redDotIcon"; $evcs_info["properties"]["iconContent"]="Имя"; $evcs_info["options"]["draggable"]=false; $evcs_info["options"]["hideIconOnBalloonOpen"]=false; $JsonEVCS["features"][]=$evcs_info; }; echo json_encode($JsonEVCS); |
Руководство от Гугла для ознакомления. Делано собственно по нему.
1) Включаем в своем аккаунте доступ к Google Sheets API. Сделать это можно прямо на странице «Руководство от Гугла«:
Получаем ID, секрет и файл credentials.json который сохраняем туда, где будет лежать основной скрипт
2) При помощи composer добавляем необходимые библиотеки
1 2 |
composer require google/apiclient:^2.0 composer update |
3) Создаем таблицу в гуглодокументах и узнаем её ID — можно взять прямо из URL. Так-же даем доступ «всем вподряд по ссылке»
4) Создаем следующего вида файл:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
<?php require 'vendor/autoload.php'; if (php_sapi_name() != 'cli') { throw new Exception('This application must be run on the command line.'); } /** * Returns an authorized API client. * @return Google_Client the authorized client object */ function getClient(){ $client = new Google_Client(); $client->setApplicationName('Google Sheets API PHP Quickstart'); $client->setScopes(Google_Service_Sheets::SPREADSHEETS); $client->setAuthConfig('credentials.json'); $client->setAccessType('offline'); $client->setPrompt('select_account consent'); // Load previously authorized token from a file, if it exists. // The file token.json stores the user's access and refresh tokens, and is // created automatically when the authorization flow completes for the first // time. $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // If there is no previous token or it's expired. if ($client->isAccessTokenExpired()) { // Refresh the token if possible, else fetch a new one. if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // Request authorization from the user. $authUrl = $client->createAuthUrl(); printf("Open the following link in your browser:\n%s\n", $authUrl); print 'Enter verification code: '; $authCode = trim(fgets(STDIN)); // Exchange authorization code for an access token. $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // Check to see if there was an error. if (array_key_exists('error', $accessToken)) { throw new Exception(join(', ', $accessToken)); } } // Save the token to a file. if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } return $client; } // Get the API client and construct the service object. $client = getClient(); $service = new Google_Service_Sheets($client); // Prints the names and majors of students in a sample spreadsheet: // https://docs.google.com/spreadsheets/d/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms/edit $spreadsheetId = 'аыукаыука-HW95_v_xwJ-U_L2Xc'; $range = 'Sheets1!A2:A'; $response = $service->spreadsheets_values->get($spreadsheetId, $range); $values = $response->getValues(); var_dump($values); if (empty($values)) { print "No data found.\n"; } else { print "Name, Major:\n"; foreach ($values as $row) { // Print columns A and E, which correspond to indices 0 and 4. printf("%s\n", $row[0]); } }; $values = [ ["2016-02-12", "5453 543543", "=C2+C3"], ["2017-02-12", "5453 543543", "=C2+C3"], ["2018-02-12", "5453 543543", "=C2+C3"], ]; $body = new Google_Service_Sheets_ValueRange( [ 'values' => $values ] ); // valueInputOption - определяет способ интерпретации входных данных // https://developers.google.com/sheets/api/reference/rest/v4/ValueInputOption // RAW | USER_ENTERED $options = array( 'valueInputOption' => 'RAW' ); $service->spreadsheets_values->update( $spreadsheetId, 'Sheets1!A13', $body, $options ); |
,где в переменной $spreadsheetId указываем id таблицы.
5) Запустим скрипт из командной строки. Он предложит открыть ссылку которую выведет на экран. По переходу по ссылке будет показан стандарный диалог «Бал-бла- Разрешить?». Разрешаем. На экран выведется токен. Его нужно будет скопировать в консоль.
После чего снова запускаем скрипт, и в таблице в конец последних заполненных ячеек добавятся данные.
Жил был скрипт, который использовал вот таакой запрос к БД Zabbix:
select sendto from media where userid in (select userid from (select users_groups.userid from operations inner join opmessage_grp on opmessage_grp.operationid=operations.operationid inner join users_groups on opmessage_grp.usrgrpid=users_groups.usrgrpid where operations.actionid in (select actionid from conditions where conditiontype=2 and value=%s union all select actionid from conditions where conditiontype=0 and value in (SELECT groups.groupid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE triggers.triggerid=%s) union all select actionid from conditions where conditiontype=1 and value in (SELECT hosts.hostid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE triggers.triggerid=%s)) union all select opmessage_usr.userid from operations inner join opmessage_usr on opmessage_usr.operationid=operations.operationid where operations.actionid in (select actionid from conditions where conditiontype=2 and value in (select triggers.triggerid from triggers where triggers.triggerid = %s union all select triggers.templateid from triggers where triggers.triggerid = %s) union all select actionid from conditions where conditiontype=0 and value in (SELECT groups.groupid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE triggers.triggerid=%s) union all select actionid from conditions where conditiontype=1 and value in (SELECT hosts.hostid FROM triggers INNER JOIN functions ON triggers.triggerid=functions.triggerid INNER JOIN items ON items.itemid=functions.itemid INNER JOIN hosts ON hosts.hostid=items.hostid INNER JOIN hosts_groups ON hosts_groups.hostid=hosts.hostid INNER JOIN groups ON groups.groupid=hosts_groups.groupid WHERE triggers.triggerid=%s))) as us group by userid union all select userid from users_groups where usrgrpid=18) and mediatypeid=5
Единственной функцией котого было дать список телефонов пользователей по id триггера. И работал бы этот скрипт еще долго, если бы не случилось обновление Zabbix с 3.4 до 4.4 Структура БД изменилась. Запрос работать перестал. Посмотрел я на него, посмотрел.. И понял, я наверное был не в себе когда его писал, и повторить такой подвиг больше не смогу. Решил переписать его использую API Zabbix. Вышло много понятнее 😉
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
echo "-получаем api-key\n"; $res=$zab->Auth($login, $password); $triggerid=$options["t"]; $txt=$options["s"]; $users_id_for_sms=array(); echo "-действия по триггеру\n"; $res=$zab->Execute("action.get", ["triggerids"=>$triggerid,"output"=>'extend','selectOperations'=>'extend','selectRecoveryOperations'=>'extend','selectFilter'=>'extend']); ParseRes($res); echo "-получаем хост\n"; $hosts=$zab->Execute("host.get", ["triggerids"=>$triggerid]); foreach ($hosts->result as $host) { $hostid=$host->hostid; $hostname=$host->name; echo "--действия по хосту $hostid $hostname\n"; $res=$zab->Execute("action.get", ["hostids"=>$hostid,"output"=>'extend','selectOperations'=>'extend','selectRecoveryOperations'=>'extend','selectFilter'=>'extend']); ParseRes($res); $hostsg=$zab->Execute("hostgroup.get", ["hostids"=>$hostid]); foreach ($hostsg->result as $hostg) { $groupid=$hostg->groupid; echo "--- действия по группе хоста $groupid\n"; $res=$zab->Execute("action.get", ["groupids"=>$groupid,"output"=>'extend','selectOperations'=>'extend','selectRecoveryOperations'=>'extend','selectFilter'=>'extend']); ParseRes($res); } }; echo "- пользователи ZABBIX\n"; var_dump($users_id_for_sms); $sms=array(); foreach ($users_id_for_sms as $userid) { $res=$zab->Execute("user.get", ["userids"=>$userid,"output"=>'extend','status'=>0,"selectMedias"=>"extend"]); foreach ($res->result as $usersinfo) { foreach ($usersinfo->medias as $md) { if ($md->mediatypeid==5){ $sms[]=$md->sendto; }; }; } } var_dump($sms); function ParseRes($res){ global $zab,$users_id_for_sms; if (count($res->result)!=0){ foreach ($res->result as $oper) { foreach ($oper->operations as $vl) { echo "---получаю пользователей группы\n"; foreach ($vl->opmessage_grp as $usergroups) { $usrgrpid= $usergroups->usrgrpid; echo "----$usrgrpid\n"; $res=$zab->Execute("user.get", ["usrgrpids"=>$usrgrpid,"output"=>'extend','status'=>0]); foreach ($res->result as $user) { $users_id_for_sms[]=$user->userid; }; // $res=$zab->Execute("user.get", ["usrgrpids"=>15,"output"=>'extend','status'=>0]); // foreach ($res->result as $user) { // $users_id_for_sms[]=$user->userid; // }; }; echo "---добавляю просто пользователей\n"; //var_dump($vl->opmessage_usr); foreach ($vl->opmessage_usr as $userslist) { $users_id_for_sms[]= $userslist->userid; }; }; } }; }; |